mandelbulber1.21-1.orig/0000755000175000017500000000000012274512437016054 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/install0000755000175000017500000000134112274512437017447 0ustar krzysztofkrzysztof#!/bin/bash if [ -f makefiles/mandelbulber ] ; then sudo install makefiles/mandelbulber /usr/bin elif [ -f usr/bin/mandelbulber ] ; then sudo install usr/bin/mandelbulber /usr/bin else echo Binary file not found. Program not compilled. echo Do you want to compile program now? [y/n] read answer if [ "$answer" = "y" ] ; then cd makefiles/ make all rm src/*.o rm src/*.d cd .. mv makefiles/mandelbulber usr/bin/mandelbulber sudo install usr/bin/mandelbulber /usr/bin fi fi sudo mkdir /usr/share/mandelbulber sudo cp -ua usr/share/* /usr/share/mandelbulber sudo desktop-file-install mandelbulber.desktop echo mandelbulber installed successfully echo to run please type "mandelbulber" or select from system menu mandelbulber1.21-1.orig/COPYING0000644000175000017500000010451312274512437017113 0ustar krzysztofkrzysztof GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mandelbulber1.21-1.orig/usr/0000755000175000017500000000000012274512437016665 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/usr/share/0000755000175000017500000000000012274512437017767 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/usr/share/exampleKeyframes/0000755000175000017500000000000012274512437023271 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00005.fract0000644000175000017500000000620112274512437026501 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; angle_alfa 250.00000000000003; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_rot_gamma 0.3490658503988659; IFS_offsetY 0.5; IFS_offsetZ 0.5; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00007.fract0000644000175000017500000000635012274512437026510 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; view_point_x -1.450228934617996; view_point_y -0.69508466000828228; view_point_z -0.54740518413645178; angle_alfa 300; angle_beta 20; zoom 0.80000000000000004; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_rot_gamma -0.3490658503988659; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00004.fract0000644000175000017500000000607512274512437026511 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; angle_alfa 239.99999999999997; angle_beta 20; zoom 2; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00001.fract0000644000175000017500000000575712274512437026514 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 80; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447505; IFS_3_y 0.30901699437170937; IFS_3_z 0.50000000000276579; IFS_3_enabled 1; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; IFS_4_enabled 1; IFS_5_x 0.70710678118654757; IFS_5_y 0.70710678118654757; IFS_5_intensity 0; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00010.fract0000644000175000017500000000641112274512437026500 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; view_point_x -0.46948114480024777; view_point_y 0.24221989612181449; view_point_z 0.23313153736287309; angle_alfa 270.00000000000023; angle_beta -10; angle_gamma 40; zoom 0.017777777777777781; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_rot_gamma -0.3490658503988659; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00003.fract0000644000175000017500000000576612274512437026516 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 210.00000000000003; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x -0; IFS_3_y 0.70710678118654757; IFS_3_z 0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.099503719020998929; IFS_4_z 0.99503719020998926; IFS_4_enabled 1; IFS_5_x 0.70710678118654757; IFS_5_y 0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00009.fract0000644000175000017500000000641112274512437026510 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; view_point_x -0.64184269067964217; view_point_y 0.14733922912278211; view_point_z 0.19918109654819499; angle_alfa 270.00000000000023; angle_beta -10; angle_gamma 40; zoom 0.053333333333333337; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_rot_gamma -0.3490658503988659; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00000.fract0000644000175000017500000000561612274512437026505 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; IFS_offsetZ 1.6180330000000001; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447505; IFS_3_y 0.30901699437170937; IFS_3_z 0.50000000000276579; IFS_3_enabled 1; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; IFS_4_enabled 1; IFS_5_x 0.70710678118654757; IFS_5_y 0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00002.fract0000644000175000017500000000605112274512437026501 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 150; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x -0.80901699437447505; IFS_3_y 0.30901699437170937; IFS_3_z 0.50000000000276579; IFS_3_intensity 0; IFS_3_enabled 1; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; IFS_4_enabled 1; IFS_5_x 0.70710678118654757; IFS_5_y 0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00006.fract0000644000175000017500000000615712274512437026514 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; angle_alfa 260; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_rot_gamma -0.3490658503988659; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/exampleKeyframes/keyframe00008.fract0000644000175000017500000000635012274512437026511 0ustar krzysztofkrzysztofMandelbulber 1.04; image_height 800; view_point_x -1.062558721020904; view_point_y 0.061187711159643048; view_point_z 0.014777960467419639; angle_alfa 280.00000000000011; angle_beta 10; zoom 0.16; perspective 0.80000000000000004; formula 10; power 8; DE_factor 0.69999999999999996; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_visibility_front 20; IFS_rot_gamma -0.3490658503988659; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_intensity 0; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_intensity 0; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_intensity 0; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_background textures/background.jpg; file_envmap textures/envmap.jpg; file_lightmap textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; file_sound sounds/sound.wav; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/defaults0000644000175000017500000002347212274512437021531 0ustar krzysztofkrzysztofMandelbulber 1.1100000000000001; image_width 800; image_height 600; tiles 1; x_min -10; x_max 10; y_min -10; y_max 10; z_min -10; z_max 10; view_point_x 0; view_point_y 0; view_point_z 0; angle_alfa -20; angle_beta 30; angle_gamma 0; zoom 2.5; perspective 0.5; formula 2; power 9; N 250; minN 1; fractal_constant_factor 1; quality 1; smoothness 1; julia_mode 0; julia_a 0; julia_b 0; julia_c 0; tglad_folding_mode 0; folding_limit 1; folding_value 2; spherical_folding_mode 0; spherical_folding_fixed 1; spherical_folding_min 0.5; IFS_folding_mode 0; iteration_threshold_mode 0; analityc_DE_mode 1; DE_factor 1; brightness 1; gamma 1; ambient 0; reflect 0; shadows_intensity 0.69999999999999996; ambient_occlusion 1; ambient_occlusion_quality 4; ambient_occlusion_fast_tune 1; shading 1; specular 1; glow_intensity 1; glow_color_1_R 40984; glow_color_1_G 44713; glow_color_1_B 49490; glow_color_2_R 57192; glow_color_2_G 60888; glow_color_2_B 62408; background_color_1_R 0; background_color_1_G 38306; background_color_1_B 65535; background_color_2_R 65535; background_color_2_G 65535; background_color_2_B 65535; background_color_3_R 0; background_color_3_G 10000; background_color_3_B 500; fog_colour_1_R 0; fog_colour_1_G 0; fog_colour_1_B 0; fog_colour_2_R 0; fog_colour_2_G 30000; fog_colour_2_B 65535; fog_colour_3_R 65535; fog_colour_3_G 65535; fog_colour_3_B 65535; background_color_1_G 38306; background_color_1_B 65535; textured_background 0; shadows_enabled 1; ambient_occlusion_enabled 0; fast_ambient_occlusion_mode 0; fractal_color 1; coloring_random_seed 123456; coloring_saturation 1; coloring_speed 1; coloring_palette_offset 0; slow_shading 0; limits_enabled 0; post_fog_enabled 0; post_fog_visibility 20; post_fog_visibility_front 29; post_fog_color_R 59399; post_fog_color_G 61202; post_fog_color_B 65535; post_SSAO_enabled 1; post_SSAO_quality 20; post_DOF_enabled 0; post_DOF_focus 21.699999999999999; post_DOF_radius 10; main_light_intensity 1; main_light_alfa -0.78539816339744828; main_light_beta 0.78539816339744828; main_light_colour_R 65535; main_light_colour_G 65535; main_light_colour_B 65535; aux_light_intensity 1; aux_light_random_seed 1234; aux_light_number 0; aux_light_max_dist 0.10000000000000001; aux_light_distribution_radius 3; aux_light_predefined_1_x 3; aux_light_predefined_1_y -3; aux_light_predefined_1_z -3; aux_light_predefined_1_intensity 1.3; aux_light_predefined_2_x -3; aux_light_predefined_2_y -3; aux_light_predefined_2_z 0; aux_light_predefined_2_intensity 1; aux_light_predefined_3_x -3; aux_light_predefined_3_y 3; aux_light_predefined_3_z -1; aux_light_predefined_3_intensity 3; aux_light_predefined_4_x 0; aux_light_predefined_4_y -1; aux_light_predefined_4_z 3; aux_light_predefined_4_intensity 2; aux_light_predefined_1_enabled 0; aux_light_predefined_2_enabled 0; aux_light_predefined_3_enabled 0; aux_light_predefined_4_enabled 0; aux_light_predefined_1_colour_R 45761; aux_light_predefined_1_colour_G 53633; aux_light_predefined_1_colour_B 59498; aux_light_predefined_2_colour_R 62875; aux_light_predefined_2_colour_G 55818; aux_light_predefined_2_colour_B 50083; aux_light_predefined_3_colour_R 64884; aux_light_predefined_3_colour_G 64928; aux_light_predefined_3_colour_B 48848; aux_light_predefined_4_colour_R 52704; aux_light_predefined_4_colour_G 62492; aux_light_predefined_4_colour_B 45654; aux_light_visibility 1; aux_light_random_center_X 0; aux_light_random_center_Y 0; aux_light_random_center_Z 0; IFS_scale 2; IFS_rot_alfa 0; IFS_rot_beta 0; IFS_rot_gamma 0; IFS_offsetX 1; IFS_offsetY 0; IFS_offsetZ 0; IFS_edgeX 0; IFS_edgeY 0; IFS_edgeZ 0; IFS_absX 0; IFS_absY 0; IFS_absZ 0; IFS_menger_sponge_mode 0; IFS_0_x 1; IFS_0_y 0; IFS_0_z 0; IFS_0_alfa 0; IFS_0_beta 0; IFS_0_gamma 0; IFS_0_distance 0; IFS_0_intensity 1; IFS_0_enabled 0; IFS_1_x 1; IFS_1_y 0; IFS_1_z 0; IFS_1_alfa 0; IFS_1_beta 0; IFS_1_gamma 0; IFS_1_distance 0; IFS_1_intensity 1; IFS_1_enabled 0; IFS_2_x 1; IFS_2_y 0; IFS_2_z 0; IFS_2_alfa 0; IFS_2_beta 0; IFS_2_gamma 0; IFS_2_distance 0; IFS_2_intensity 1; IFS_2_enabled 0; IFS_3_x 1; IFS_3_y 0; IFS_3_z 0; IFS_3_alfa 0; IFS_3_beta 0; IFS_3_gamma 0; IFS_3_distance 0; IFS_3_intensity 1; IFS_3_enabled 0; IFS_4_x 1; IFS_4_y 0; IFS_4_z 0; IFS_4_alfa 0; IFS_4_beta 0; IFS_4_gamma 0; IFS_4_distance 0; IFS_4_intensity 1; IFS_4_enabled 0; IFS_5_x 1; IFS_5_y 0; IFS_5_z 0; IFS_5_alfa 0; IFS_5_beta 0; IFS_5_gamma 0; IFS_5_distance 0; IFS_5_intensity 1; IFS_5_enabled 0; IFS_6_x 1; IFS_6_y 0; IFS_6_z 0; IFS_6_alfa 0; IFS_6_beta 0; IFS_6_gamma 0; IFS_6_distance 0; IFS_6_intensity 1; IFS_6_enabled 0; IFS_7_x 1; IFS_7_y 0; IFS_7_z 0; IFS_7_alfa 0; IFS_7_beta 0; IFS_7_gamma 0; IFS_7_distance 0; IFS_7_intensity 1; IFS_7_enabled 0; IFS_8_x 1; IFS_8_y 0; IFS_8_z 0; IFS_8_alfa 0; IFS_8_beta 0; IFS_8_gamma 0; IFS_8_distance 0; IFS_8_intensity 1; IFS_8_enabled 0; start_frame 0; end_frame 1000; frames_per_keyframe 100; hybrid_formula_1 0; hybrid_formula_2 0; hybrid_formula_3 0; hybrid_formula_4 0; hybrid_formula_5 2; hybrid_iterations_1 1; hybrid_iterations_2 1; hybrid_iterations_3 1; hybrid_iterations_4 1; hybrid_iterations_5 1; hybrid_power_1 2; hybrid_power_2 2; hybrid_power_3 2; hybrid_power_4 2; hybrid_power_5 2; hybrid_cyclic 0; fish_eye 0; stereo_eye_distance 0.10000000000000001; stereo_enabled 0; mandelbox_scale 2; mandelbox_folding_limit 1; mandelbox_folding_value 2; mandelbox_folding_min_radius 0.5; mandelbox_folding_fixed_radius 1; mandelbox_sharpness 3; mandelbox_offset_X 0; mandelbox_offset_Y 0; mandelbox_offset_Z 0; mandelbox_rotation_main_alfa 0; mandelbox_rotation_main_beta 0; mandelbox_rotation_main_gamma 0; mandelbox_rotation_X1_alfa 0; mandelbox_rotation_X1_beta 0; mandelbox_rotation_X1_gamma 0; mandelbox_rotation_Y1_alfa 0; mandelbox_rotation_Y1_beta 0; mandelbox_rotation_Y1_gamma 0; mandelbox_rotation_Z1_alfa 0; mandelbox_rotation_Z1_beta 0; mandelbox_rotation_Z1_gamma 0; mandelbox_rotation_X2_alfa 0; mandelbox_rotation_X2_beta 0; mandelbox_rotation_X2_gamma 0; mandelbox_rotation_Y2_alfa 0; mandelbox_rotation_Y2_beta 0; mandelbox_rotation_Y2_gamma 0; mandelbox_rotation_Z2_alfa 0; mandelbox_rotation_Z2_beta 0; mandelbox_rotation_Z2_gamma 0; mandelbox_color_R 0; mandelbox_color_X 0.029999999999999999; mandelbox_color_Y 0.050000000000000003; mandelbox_color_Z 0.070000000000000007; mandelbox_color_Sp1 0.20000000000000001; mandelbox_color_Sp2 0.20000000000000001; mandelbox_rotation_enabled 0; mandelbox_fold_mode 1; mandelbox_solid 1; mandelbox_melt 0; view_distance_max 50; view_distance_min 1.0000000000000001e-15; interior_mode 0; FoldingIntPow_folding_factor 2; FoldingIntPow_z_factor 5; dynamic_DE_correction 0; linear_DE_mode 0; constant_DE_threshold 0; volumetric_light_intensity 1; volumetric_light_quality 5; volumetric_light_intensity_0 100; volumetric_light_enabled_0 0; volumetric_light_intensity_1 100; volumetric_light_enabled_1 0; volumetric_light_intensity_2 100; volumetric_light_enabled_2 0; volumetric_light_intensity_3 100; volumetric_light_enabled_3 0; volumetric_light_intensity_4 100; volumetric_light_enabled_4 0; penetrating_lights 1; raytraced_reflections 0; reflections_max 5; mandelbox_vary_scale_vary 0.10000000000000001; mandelbox_vary_fold 1; mandelbox_vary_minr 0.5; mandelbox_vary_rpower 1; mandelbox_vary_wadd 0; c_add -1.3; volumetric_fog_density 0; volumetric_fog_colour_1_distance 1; volumetric_fog_colour_2_distance 2; volumetric_fog_distance_factor 1; iteration_fog_enable 0; iteration_fog_opacity 1000; iteration_fog_opacity_trim 4; primitive_plane_enabled 0; primitive_plane_centre_X 0; primitive_plane_centre_Y 0; primitive_plane_centre_Z 0; primitive_plane_normal_X 0; primitive_plane_normal_Y 0; primitive_plane_normal_Z -1; primitive_plane_colour_R 20000; primitive_plane_colour_G 20000; primitive_plane_colour_B 20000; primitive_box_enabled 0; primitive_box_centre_X 0; primitive_box_centre_Y 0; primitive_box_centre_Z 0; primitive_box_size_X 2; primitive_box_size_Y 2; primitive_box_size_Z 2; primitive_box_colour_R 20000; primitive_box_colour_G 20000; primitive_box_colour_B 20000; primitive_invertedBox_enabled 0; primitive_invertedBox_centre_X 0; primitive_invertedBox_centre_Y 0; primitive_invertedBox_centre_Z 0; primitive_invertedBox_size_X 10; primitive_invertedBox_size_Y 10; primitive_invertedBox_size_Z 10; primitive_invertedBox_colour_R 20000; primitive_invertedBox_colour_G 20000; primitive_invertedBox_colour_B 20000; primitive_sphere_enabled 0; primitive_sphere_centre_X 0; primitive_sphere_centre_Y 0; primitive_sphere_centre_Z 0; primitive_sphere_radius 1.5; primitive_sphere_colour_R 20000; primitive_sphere_colour_G 20000; primitive_sphere_colour_B 20000; primitive_invertedSphere_enabled 0; primitive_invertedSphere_centre_X 0; primitive_invertedSphere_centre_Y 0; primitive_invertedSphere_centre_Z 0; primitive_invertedSphere_radius 5; primitive_invertedSphere_colour_R 20000; primitive_invertedSphere_colour_G 20000; primitive_invertedSphere_colour_B 20000; primitive_water_enabled 0; primitive_water_level 0; primitive_water_amplitude 0.02; primitive_water_length 0.20000000000000001; primitive_water_iterations 5; primitive_water_rotation 0; primitive_water_colour_R 0; primitive_water_colour_G 5000; primitive_water_colour_B 10000; file_destination images/image; file_background /usr/share/mandelbulber/textures/background.jpg; file_envmap /usr/share/mandelbulber/textures/envmap.jpg; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ; mandelbulber1.21-1.orig/usr/share/textures/0000755000175000017500000000000012274512437021652 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/usr/share/textures/background.jpg0000644000175000017500000162012512274512437024502 0ustar krzysztofkrzysztofJFIFHHC     C   " _!1AQ"aq2#BR$3bCr 4%SsD&5cETtvA!1AQ"aq2#BR3CSb$r4 ?z@yڍjl4+gui篂F"ğk =Cߔ) ~.:}\jـUֆgo'ԢD.ڎs$T?m|9_l$ ,]GajdO&Yml0VszږY=S i`hXQIbڕ:F8G[?&WC߼`[E=i6>]w͏|Tǻe&O%EB6?M|ԈLjzZgb't,7UVO$LS)/=+V7an鯫k] jِi=x$azv?0^ܠ-&?M@ʼnݷkm}Ne/9v]|,{st}ۨ.B<n<Mao'tvN|jc;P!9>2u NW"6?uЮ=뢆mEhC,GEjk__橯_-qUgjDѓޡ#ov_vx$W'urd?щmTDYGoE$.=U *9v^jT=Oi[,=>;3'Ƥ soJ^?zoOHzotJΟS1JH} O]3KDtBr]p]y~ߜS.?]Fl2c3:b7}UPz# J ;~D]ߔBt>NcJOԱأ,|˛*M/N?1j^u$ҥ¥Sߔ?ߜ "5ޠh?Vm;y7{ bz pCLŨ#H@?JA?܉nW)xݞm6'LЕɻV[hZjN~⽻^kadzvZ~ek-t =}4󑖸4yщyꬺU~RrYe(˦so7i O/ h> \m'Le$QjdDljnR?c]{܇buǛ)Wl'N]1/Sj}%r'ԝ;d$(?0P?Mtbj*:nyD"?M-M3OM|*C'S1ʊvbNyht@K%OMxb>\b[ T2H>imUIf'LF=L|:gyZ%:GGauԃ%: S*r4(:skSԊ3m$#PcY9PT7[ U6Ԝ=Cd^#7g)sq ?oeizsγŊh!]ws~~5ZHeA4^* BZ @tU*g HBhʌkL_棏Uv귙ʦѮv2A)lkVIԎIC",p5BNgےu“/!?{/dSݘ%v ;5ѼUq>Bjn2%걸2 qtQM3%AFO[r7ϻ˞sjU!>ը:lAM%N~Y9zJ;YSONI%UkEaۮJeWg{5v!΢5НR*-B ξ:#np۳}(G &Fhe|]*d?q!'j>̦-}!ahR2K}=~5>̝yIqEjʄ4R(-_üKfIE$VH8 2 R A<~84Ӳdģ>uRg5?\k0o@W寍\75|ڠʏpqޒ8 )ղF.;k8?`~cR~92I=O5zzgCj=_X YA?Uқ(?Ê3 \#>rEVadtpjo®u=F?qDޔ#ʼ+/2ڛѯc,?'Ny'U},tziH`RY6ݣu4tt͒lG:gt{T<:庺ߎ,0Kf_588tsW<A8K\޹ZFGZmRr!|>eߔq53]t<}6\`/PtEQmjqa1p@(?td У{tܰW=?h\UA2E\W@s^ )Z&4ڕp ?j"O4"o5q[GTzlC\*a_PVhG+^M#6k591%S_ЦS Vv(Z+q5Dk #_w!jXy-5iXq kvb1uJ Z#Pg81\P9ފ19k1sWz7XNl6CrQ4G}x/D(o!@.PyϭML֐3$q F@?W&9uP3"?:8("Lȹckd?֫IA -SO-})>GJta5K \qkSM$ B>Esnx!b6S0M]uV;c>e;ԫhyo+SЎrECߔ\0NeK]A*V0`?AL=ǜMZX ĀhA gIp J:.(GaQQ4~H2NK++l q4r't%uğ)A'Pڙ^P53e=2]F3 ۉUU Hpe+vdy?j#mD}ڢUjDVe:i~sT &xR%)ly37S'u ܇?CS8Y/~LMap#pHHv-T?5}5ܖz:HyH~JJ`ZJ*#\RtRnQ$4mEl}T`|jf"\2܀d+ _,Cnj^$.sH>|R=6(YFq*Pfxs5F`- )HK['lGR#bK #?Nyº*][A U;[$Ho4~:}0T$DH?hO]\w{ :WY,MRtlu H{Gոu30 >eqN%K1r#/#Yb_A%uэ:YXl,#2SϾ+"ۏ.Fer4IzUh,.|0?K/j1?Z`LFjGe!jjG"VzP<5Cm&/)ܝIa/q$%,iZjuE I=Un {?V|`"Z:[]T^v$ ~\j-u ,?04<4'?pJtLf =@\5gO|Ge*/t6PXnw %R>g>^:W>GoG#@W=+ 6i†zdH֝n5F8g(}^fRTU­dv\ꋉKcDѹQ?WR@b{:յbW쀌z7|'QFL|gC5ZG'UlawM 4(1ܳ~9LC<3I{uߦ$.diE弴LŔP*c8@%Fhd5ю>Yi'(YI>}FQ`bFK`Hq!SHAXM'?, T%,y:.n_譕S8> 5٩boF? w}E_"dr5N*t 2sh?2r[˩- 3 aW,O Zؠ[JPćJ0}]KUu5#88una=v`ib*!jV`CIMj{>X#M?+WN~ϷJ )4XBWx'+(ʦ}lݏM0>ZVT6^%)OR>Mxu@;Kg㞤;^=A //g٬F5.|'i8zk2յu1M܌rx 9~?DL-eӤƦ>X. m1G1 P~dT!bOTR¢ZP s|_|MeRXRC5:SIBsT{|kd0>rMaeQa}< e_ck}^便&D%u=LrycϿ( .{dw)C]C ~0TL7<}VoRGǟ#K6HUƃzDt#5ϲ13:U?M[WQT1J]H'zH-n q+![t Z3rsG=0ԹA>:4ZpkOCo8zjJ?:2\Ww7$rYUx*B$ojrߙ#$lYf8~?abOyMo6j+^]5r<3#gRY^|CrG :fXB? vbPNRò[?8w-βȅ1 A'/qSɳm4&qF;탁7aMMEſX]U&ڽBYp$γ.DGʑ\ '-`»,7a>iqMA*fu;3 q [d-t5vJ%5#W?B>29yjcBΠH1kCӨҨF0I~|dY9}<|gYQV#k.2}:QoHd#O,7;W w> zKGZP$ MC]1'R8=1ڼ1EN<?/uM @{PI9 kOTGu41#A$s~#׷D?<-HЪ7m' S=0aʑf%x3Ufϑ > s3|iO,`>QmVdy x'EK:0# a}b S|(VWNF<jjzX<*4n28wqJ^?&I  OA^bnks$L5ߑTgO'Q%d)3n'2E-o?]wQ_ Ҩgt<.'?,xTo~AQk>*şxո!IaH$'$XNON`,rN? VJ)_GվI֡OAMEӁ]@=:~Fc|!S'Ks< uuTpiHϩ%2Y pdd%x|2Oдqy.?-K< я^yR9X%^NLDJj !A`N '[OC9𼀣Cv=cBL`گtmOC[Oybc=;wEGU!#roŨat"Y%F] n#1MJ4CLtGr|܀cg?{2GL]'s,]XhP͵ `N?'G/?bȖO(Tow!+{n&EO&+R@v!h>;.*>g|Ȩ˸o)l%JE8J~8R Fl"!J{9$6=0Ԑx_QWGSZ#8sgվiGHMtθnd08'ݧ*n䊖4(7\X?rNq8qōI;,A Fg®.q9t5{&m9"-~zXhDF=>]AKko9CG%Y ID;+>I?Ui- 4lS 7*|m3c>a}.qdefa+#~M+C1'6rCChz5+̟ R_(X1<~cJ[(Iӄ8dAWmHC3рU@]?E#d)E !& 6^ޠMZ9Fؔ6w} 0hJwYP畢6^uvJyd ugԌYrh6Yf(=~kYsf:WER69sO*<:l VTcJDS_x™l䖊rr7gFKS"+H&Pz?%Z3 97j6`̤0HTSQ,{<Ɋ~ZR')_!r}zo"p}tc@L#$)>xO/9yUe=Y{~-PWR 29;c_aZ9Ye)0AuqVo+%$)4z?%"J?C*)V0?RI ڥ`3j#Q>dǎc@FNy5n3GZnXםvûmAc;"Ω:fhKS+&yPHﱪ&hV˂uJEĖsX imh a$R90Bx_-pڀvT$jga3AH⦄7S$ȎlkDTbVX/SӅ'Y#r<~/NuCL״E2Ưqh|#jX<**UI czO=;y>/C&}忘LrPAcI"$MZfy82/d8Dw$"2%P(;R4sK)-sV)FNab@_PB 9p@qKk 5vu1x-*ߏ("NT;`NR24W[mDC&}0G Z"?޼PE$VB}]v)'QOfS3)?kﴎML("|:N>E]~Kt,]<Ӎ"\?£:c)J>x^5R!|S#%x:2f6#&aE-~(M &Pu$0jבXryXZH$?jGCgUZmZQ%Qq"֑-U YC ?-|ne.?5З έbE$ysw`xkCM U d=W3gɄDø` $e т8˷?BQG~k2.Fv :*C2Zp"z_U^\jP޼|C&@̲"FI":/C/d3!Y@N?_b u(~aiiZLfSM$0? \XAs()4)> W>^> %go9rqauj0iՍ׌;JUQMNL0GuGM3qǐ~YLDgmti$X4SyjϦuF.ZYi6, Z-=VgeRM_͆u^%/"%qb9?=i'g_ӵ;ѭ!iZi#*öXa#H 3 NziEE@O*ϒ~:piAu[(kS4n?T]gB}? :-+SC }&|T ^ca BÌ챂]D 5x9w*:)-zĨo LpMvO\;%% 1*r8ǰ?=ptSx\+LL|2E=gL KUO4S!)B{ , ^+gIu!dt<58JhY MOew>zX|RK!˘O;XcFq(4ν*}0*UGKXUCGOFTN z>x+b5f %pn8?ũRt#$Ꝉ3U5([pSp jվ!)&<=Go fٖ^0UIpB|ALXG+M:gAm;!e}T* SBLU(Բ }rDT~Eemu[Q-l 5TeO ;?n+|j?fnݘ" !CxT"LnT풣hLnZ`=cYG+ .5<7Emy͊*v2F/8#`1̤L(K &]2 >kP_I,0=Vikm,Bi&T*5*y TwhKigu@GiVC$? Oѐ[*f,]qϖd8P5RnB0HAP G4p6ǚHXΟӍL.&Y"#"OP)jY"wU]gWEz6B~G?#j(6?hEf#I2G9)a{=Lf(`pYd#ujj&fi`1.@ട@N3/HG53QC^RDLkq}Mqa Us?ˆ A=Y2K/2&sF-S4$̥p2OjP,AVrcY-cS$G IVF͏"=qSˆfƹ9gT1!}ܷ6M~\tݫD#`}@0?ڨӯ(iǖ`rA{ H2"NF5'ک< _,tOLJ>XO3 6Bx)jOmS Eczw՟R3e1Q[AiU8?U GXӕ;LtN_VPY]y$Η DIH[?S@GoIR ]zkګ0*sp1kst X fDPs# 2y߷}gҞ ݐ5W(jlQ1tIRD+f'9(d c@?m'^<@sQW-@1 8>UU-V\+Y&?=Ob*Ŕw^ Igl#S԰htu\97#B3kmKw:m*9b^FZn,M1Zh+IV'Rº5kpM}=;涴=1OW׶QJ|dV**/)'Ks߂ ׾52"?Þ4q1J9ws]4pCFEN.lu}iծ82e?h1N1oksWJ!OfZWhdNv _cnZHnVTO1?, ^ jJ9Ϫ-X On-Pܒh<8&9(d$ s?jY祊Y3NNH$w|:T9G`M'PB E yɓ~?t6t(#0fP8oQ]&2ٵg㓡T;)^'W)?Ǵ;d0+7:w}U+J]~K;%hϮ:+Ex HP0ZB*9Ee?P{8j*2F&0Iչ y \"_! p`ǹмx]\oȒ9J#7jUI]̍G`M #kȵc%\I zs-%܃uf.ZIdA##Dm,UaB T?{%]SKL'{ ܏D`難 (ed>7}jJxja'ʩx|kb4#H |,=v@dU;ߘΧ?t@Z9"*f㠴W$Ȏ8m=Dw%G,w/?A,ƨ4ic-1NcyXßSeʀrnpp8\q՚kK2\'b0{hqhqGt"D $lpg;N>WOPSIGcWKqACݝgiY 1ދV]Cy1TOҏġaÌDP#ok9wjNi$Qt_Ej$n59+pMGzlsDhG#(Uf1/",g s/gobS ѱ=b ~Ʀӗ\@>b9}rW JEH`G_D>۱orhܣ9-\~Zz{JYZߴS90Dc8ϠuKuZJ͐%FS: zci1JOٛfp|r}MSu?S= l I 6^n殊YEyx aӑ5uYè+n%~Bg~рObqx-R~:-k}<6heE63K(ْ;3,f$6pz1v~5V[5Y^o0bI9 mJoT#l<9IkV۹iA\ƸS:2AWkgp]FCěVu ~DERI`jmHg%)br!M7|21$8noCj*HĞY؄{]P":ңpu׾'O|[u wI sz %-HVI(, PG}P0K Q[Τ[=(VQfPWIІ[.C[VR:3FS^) IjZҍOO;|zwF="=ky@If9\UI5Z;ΕSV9@!NyAT5\l}2phiv_lr3atlTΤ&˾}?鯴UWQQ* ,x?Óunl^eB8?w*hO%P=ʿfc5 X}}=G[c-ҭ \%\f0=sΜ %Cf #Vlw+ EG[gEYt*f ;s5 8CiBGXdmWMuR/$1mhR4k%8;p}7g ә*&W*998 }Ci3 *FEVΫTU̢9ȣ~Z:56rc99>|wFU4kAA4BI\1|6 R*#V\BMK0v1YtJG25|Rƛ 号|z2 Ђxx2qn6g|W bSA)qS),-:k-s4=C69|Q m }5bB)tS4sc|􊺘iH?9֋Ek׬pK(qK79#b:j>M1DNq)#C8]c&N-UO,\r5z;M( !~Z巘&*(H!v̡=2xk:aku+1|cU?mǤ;̪;eU;IZ$yٽ 'M?]zvӕ T) TV@q#%y!T}ƨ@‹4cvaPeiEznW,1}}*# X=GlsM Fݡe6˦@':LF#S o^#iCb>a&-EEE+Ʈ+IʲJ%^r#24)Zp3#tQW8"cVdA<#xE];g6["kH 3<|pJI LjO"HdXu5z7i uLxiӪ,NGS":7YxhCTbf/(.1C?5nSDZyi*UK㕬 {FPՌnܘ䑔: XvM36J7Ϡd~D:}wF)Jkw;φ7:b(km"c;\>GxUuʚRp;?*53eHP4Si.WQIdy bK|鮚#騚JsXKt6p=FHUCo O?lIuu 6o:p&SĆ~N)A&U }PeS?SVL vb'[[#uA4.5ثG]'#QZs$m$S8i ><]+[&QtE:+I 21y k}_oiBȣ]t(0}g5 $Z0Gd5RAJ?MH,H2rFܘZO:SԄmgAh)QAN&}@кw.?!I+,;`E77Д?ƫTyYkF|A*j+|ULQa&;gVP7'MDdI6S>K|${@>6aG ':Kf>>/A\VpӍ[_Rc$q"30ZAȑTԬLMsSOԁQl•$ʻE\Xi)/Ʈ #3,z~~wvsIpKrVc1#rd*KUwM*XU4aiå21Ė4LTA-|" u*uFS.HZ)('ϧ@yiuZ) q{}QJ*)X81{?]vU1\$j1 ڎFɝd?7]EE=~m*v1J $D$Uz Ls½3Pa ,y^}<Ddx"]K\1=!\t72rR9)ʛγ!$5bOO<ɜρr j=&?RtǏtg-}L ԭ 4>jzYZԸ ?!ƠiS>WlW+}\.ibi1¹s tf"b3QY4P#PܨOsXX`*FZa r;26Hkbѵ/G?𶟦\+c``K֗YkZUx~uL3OM#+kHNmmz0 @$!;e2W y!\5-x+Ƀӏ_z֍f3Iʽğåsco(AZzևq42${07*)L 9R2;tm皔{=r,Fmph$c}UKNrW3T5u#RCA=1>\y۴\"0 'Nt$KS73 OR8Jw~=Ɗu4oBlx(Qmw"y %|qBwQ` tkLJT䗪8OPɜv$[iT);@dijڝ%\.ryR~ Uźj11%vf2?}CJ]/}">c WY҉)i~һ?@5NS9?Âd)&r=:oE*zcVRj-y,. 娌ÇIv3ƣA9ƉZ &)dl8X:J-`ůl`םj=׶z:jJyiFOܳ6G8;5/Pk/pMM*!2 :?MzZ>a<$2}v}'k'XjcO*F1KtS*^RV<3hTMyCuVΟsɉ%Ok$UEE;j cBi#ݺ\ȿ4')v)FF'R#cL|4UC:6z=JT;E*w O\2Vh{?-hR{?TE$toeP]ӕtLZsgOCw)rsi*k*뼳粪JHki]L ف5F] آed{r8#οidW4΢fq{l1BܟQWܢg53X}e5$ 7V99$EϿ2A?Q  P]gZ2Pgxg<^ HPUy@ X3ƭµ&+BI{c@FkbW ai.sHK\*{-+czJ_=?P- ẑEi~%Alg+q^ goѽ^҅q쎤 @Fґ[}gbrwJ%:Bm|<_EA}TW&ve?mK"z_0JQҲ~!^|˳ -UI>GWY:vbcsdFP{zV'A?pR/M>08-0PfjU#QI{S?uejC- ==K\#O_VUƍ;ldziM:o/h:yii߅CYScǠ~-'LGYYx3֝i&"9 D3ms':Q'Cc88οu=槪[EGR2 nu7Mx2Apub0<q[T3eDҦ3;;G $/ ϯ:[)>-E,bM`W,8 @؞-BlWCEԝ7ntur@]sTǰUQխ[QȈ>=8UaiZ/[zB糫OUk6HE8U䌃$ g݂-z@^mTFso ު>ײK)]+=.>!F 9΂>+^K2|?ji<0Px?4PSʬFNu螞Z&8JK" Sy=e{TnDZk4y_pRI:p|N[׹3+\QauȤ%ަ?30HuAWH rl0]To8 mx-ߚQ !8 mѩ|EoS aah88M Jcd`ͻNw .vy`NJxdm"q@*2Zm*U WPy*%Au7YNSIzx)g^a:-I%45@Fi ϮXcC\S ?/w<$;A.{Ϊs meueXh>D2"" GqJ+uMb&V[γŷS夅<T赮jpQ uR '?#*cOnKEt2}`z#0st1:tǖ3ĉp04G.ɺ a@8S8>1KSt@=AC%}=Hu%Z~ { } Ԓ\`54wÐ=NtԤSQlk (~|o~4)t„{My+hMT^QũR7 r Ϲzݮ@z$' [ ưQϮccGTQ~Irm]rƤIHFsvKQKZ oE']6M1Pۊ61ٞ$*&ICG>羽E7ɨPߑ&:M IT,GQVREٚ *sG̽wEuXYƁ(eˀ@8=[j*Ψ1S^" #qVT{8ѧML:rtYO%ѶS~ZWӻy56 -jx-|̵6Id:f IA>ΐm5ASQ(ȱ`y\c?WT?uUťK9d']oIyJ1λ*DizC4G_r?]֧OBbZEyutU'xǿOеidTFX aC뮓l4HdV av89 u;`MN`h5ly. 7bI1r|C[+ TwkŽ,z* i]y&RE8I75xu]4vj`$q '`qiᬗ5B0AϿ L5`A^%@a(gUA{"I8ժ^Ԥ tHgp2~v'YWKCo0X)U WC>4I:Zn/*;F[JR?OsԔDOȇ9Q92K%=]$u"u "x0TqؼMgdFfdN$7l{bI*A@kU:ffR! T1dșUWOuY6nR xK[]-l1C$1q]W;WiE2EH5[=ʊjbS 0$L ~VzX⫐0a.=O?C bMETOkW.﷌}D#UuU*V+q;bNWUĆ&(;E)i`ŕl2dooX QB=O __TRUS\/y # U$lPXa X+* U@u2*gvm9ߎ:cY=)"8=]R_,6!㮖(:݁NQxmh6]nS`nXa  ~̯RҚ}3Vxvi'j-5ZVH%)wll&҄s0~QLT0O%3.Aoiozcm>r,\ >GYԩ&QIuH Ί6b}y$'Q5TjuEP*b$g-M Na zc!j{MM4ԷX xJ49䕁Gb ܤ|SP4i).9$4S*R@ؒs^ )rxB7NyiH@1{ 3n' `~GD PT>~=EW#nbWNz*x1TDF9Wi+FڈQio,g2]4&*#k] "<1Mh1 9]+CK'%vIU=9{A~o*:5Ҟ4}%T7fz}vJ*K|SR! @I=N5Q!RPHҽ1Z8. &dn;}5x}* M/=3KQm/LRL@ݡ`O|=zRjyݸ5Dj_&W.U d*͟B}t;Py1*A[xpk~JlãF?wțC)#,H#?rJm}5}UQJ`ʠm+8=QO EA fpO^E 6擖_==F br(6j]ˢ:jOzUJԝ %灴8<[i^'DVĤ2_vw"ZnزM+JQA2N>_`ĐˎO]uro{~5:˅:(I+sY(S~yvMM /5p)BHo~YW"wւZJ۞N?Lc۶>CR!YjH0vk}䌮&2.uxmt@d ~Y D[G:n/ ٞya ]4r)[\j՛Ҥ< %(H[Z "IfXcbT]VB)e9J3)m{#h,۪]GOȲ=5svH_(?:Ǐ6-UjƲ[ lcn]0AoIIQQyRs Y54t誦(Dw$p{:RW`8vʵ|fEO::s?NʴIDY*LIsTMƠ,5lbMW ET[_ -j{F- R4G$Nq@:WHi.~+*(tpOrMO=Bԁ_:o4U^])U]#hcrypf_-BUsu;TSe'I_uF\Zr󕓐WdX?gL-&VS\sc^!~՗gtMޜ0yi$pN;d El@OkӠ:|LCoSIy+#c;{n);G^~/P;%FH :]6*is!W_ f:yLrZ"37t{/&]ak@Pu @<{!\\^d[[ *"*c^(t%ꛫkU19U[7Q$37lt<rŻ'6:T ?U u3t`jr͹w6r <0:4ʠ?ÿ$sۢ9:hꞔF1ڭ|ǘA.%[]o%aESC7+ɻtNJ9auK "?D\kO8xCYL7lI$_Ļɦb>R:믵*Z`CAkjɫ*+ YnuEv@sjWGiWւiS0Y@Q?~#fx+re(U9I䧏*|+(Wf:Ij7s{8 8?p5]#X!$~Z10ȟgEW6}V镞5qR{][}D@!O< :$;LA+ &>ɳFb{>}=Q-;`ξGEQԐun%%iĞhP mŖT!)@PVH)L^okFy>7;yՂ)1ECannAZk褣+0"{y頽:nE * 5oILfYo+R[q'Ϯ|SF8g?^ 4#ZTA +3uYEoJ" fC.]}Doܿ 7=WYVPξ*GܙB_hG ~VϐG:cvz-E5)%dxEB3+1ZqBC2Ce7e5,M8<-~GTGF`ÑcQ2$aN@u0/fݴ=kSV9t'ox$IRuCEqSK_*9@9D0ȕb@_\%٣!8MQjf1R+c{A k˩l',`l1xRW!4UcI<~\j? 8V ~'jDXiE|D(8v!\lK"V"8*]ZOںo6Zp1/"ByF 5X[b3o;X( uLỳ~SZbWCYqr&Ll%5^L,uC0EuuPR 9٨2Φ>p?:G@gb4?Ntm:.6r_aߧ]Vsl$JlUŘ;.4ՀE#I?ruLԌix|:RTȥ.o~ZZ6e[%֥"2+-l> }Z}Rc*sq= d>\3g9tizJsQOqIWh)jK5igwEy5o.X6#}='}"d0߉Ң\KA Q࠵LB2NPc9䏞`G Ń kF*kNj&D]#Ȥ9?!؄Ex9Ry۠dG'.?79hT$5X9[i4&>aoA9xTs!UL \azKɪ VzxW\j@A+<UKBD@1pu^: ,pxmN|XU}1hm]EGyB}&H: Y%d]8Ԓ|_(*s),D<~:l۠;ʂ C<9aP_:.Ǯ#Xd_}@WeeM%3x!csg/P[54wZU MqΌt$n]nu#G9$u]9LtHReKM J> ݤz{ ࡠq ҟw\$h6S+-w(V5)ޗatwRWcqu Wg "lx0y>{u]?Q]jfiwHcDRGYvԽM]t>+Z9b8QcA.]z-Kti(jh؀r8# 5Je7c!R:U (+'vid0#y~jRIYD6~o;T2!8({+`>% <'ߞFِIײ\o 9ds=IkۊG-awRO9lٺCh QS M4 %%3CD;F1t-a]Ly"HvqFP GէSm'-c1ےY_$ԻR v9Ԕmybz*r>4DVR-uYg,3N{`g7"< GpV@7=:L3S/MGhP[)B*mjnYi\{$|oeaw;KL326xƓ:ߤ(7jyzg*z SO,Ty9{c8F/S7r cc=~~Ϩl=FBW2k8⇅vNkEF26HqS^ ?dcu"hC?\jP=}M{#fU;`$. _[~>xnW mvuq8q ܎@;p_ZDQxv1Zԩlfg A=)pHi- SA:KD7!y U;m8< #iB$룽?\nBIϠ):fUknY"2H}8l>d2xn;E5H,A/7vϨ)T筥=?5%~d{GQXA/>Gt8!c9{i+_ 1D q€Hn3hˍvʹv>=ƝMF7o|&}lEJZòNO)1yy^"\d}5Ω ۏݕv\x5X3)޺R@ HF⥸O-%e3B[O4I(kf}ߏMYU`I먍b%K6~V:,rc-܅*D0$5[:ˤꦖ)Ҹ-DA@c'X3LwOG78?aY_r:ͭ.:ğM UaiaGk:i *!PLªAYlI#{WmDͶZLBS0#?Q}ՅT u+m q62㨪3$S?=0eeV,Nec?5uu\B"w\TU)1uc}WOO&I|;I<T~ ȞX4FLਞ'd+&3! aXo<H]jY;p髂9XwA*9dVP1|@0hB]YI##p4k!\i*DjR{k$+8Y6'@09;~ܠC}VXT }֮4_6r1㯑B唌|F7H:hS{\ƒW~mEY첐AX mgw'ыM$P,{f'nGYn~,{8Jn8gљH&̨_NnmNsA9g3VTl4!x.}?,ALfg5Qm5R,h&p맨䒊 *!y 62XsxϦjd奆ԤD,π=gu-r,]$p2pA'߀tVj*im}$#6{T27=s[@uhzɚMmE9v$;zzO-J>&QQ:uۋ)89Q3SŘ=>=5k*Z*(35u5)D9orOd0o?-jO-N*)ކPQ+*6IdSx-2,a(K9ƆŒ]2e?-5$F_-i:fgpJ=,Fq)U;5qleR5YZh -KDNG+BeV##YzQG!A4V49N4pAJ:NWˮ"q#3ϾGXa`4?.u5%cc19E5/I<U_{ɏCjJ>(F ?MRQ/(H ׾y?!j9U*9 01R}eFBj@UTs_Q,!ctn:`Q^}t G۷Ͽo-3|KI|#,yp%0GYGv]73T~zwx]7x`.A2I 9RT4:#G͘'Ӑ3'Zշ욮8@ʍ;co`VB[1.[GU~VQIWh' i*-JqMƏ m&bQD3ʤ,سn@nsư_f|5Ip*=m|jXV㒸_'VZj¤. kC?}x}y?k{WQKGEzXK:w#c& Zeib}eZUj{}'zBA=T*e}JzJnH捔u~:u7IxU_ޜnP/]w%\lY@;׃qFhb-+XptkxS] Q9X =IU=h)j Y>8?.^7u‚9t_1'ƇSK:]8ԆHWnǍϯ`}1\=u݀,ؼ;}xYWuBIl|7iKmJ+NF2vi%ўE "`3Uv2H5SCS'KU4[nxpHN8p'83<<F T1|v灬O3sqkm$zsW,zoq@2j\}TSGҿ+ E}Iv2E3DǾBT|9;$pt#i4]YT=Ϊ)-l"a~yC_ 3IUUVeDH9(#ݴ88%wbC{Ɲ\&vA3:>rc/ fN6(?0>g?pUX(Fu\c]_;> .!?gj1Hoq<TKsps9jq,Jc:ZP5 Y"FdNf,3aB!*Q;Y"jg-4ONm8ϷQJC0 O}T^|Ɛ03a1ƨ**bi' s@Έ[F9z~^4:q2Z򁯅>OJzx+PIp4jέWOO!-T"!,b Vw̲a({ %Q,>rQSUr"gí0JptE"4,$P8 JGy_Xb|W,OWGt3IYg)P$hXc̘ 5UEǔ9('Q !wN[:wʐ(#@)i0wXP93$2cԚ ۻ:/^\-RGW#S Aco%.$_ȃ,v*ΦWhsejIJ u ˟p=Ei:־xȩJZ-Ub/׫_{*QLWl 7?1MVt_ .)uo}x6KtA@Ǫ?M[m SPXlc?=vq A#_+ ;Ƒlݓ:@azIa 1SU_K!)! qu"PfqJ-G8OӁ- ZLnPJN삿CB2d@J=R\))I7f__^:)bb*EN߹pݨLWY|g8${~\#PSDd>Q!i"mF}^ QB>-F"*1li[ɪFAuB49 ^vҽӺOMw ) $ qiA EgfD vڎ̌>_NVg,=uEj),RODbqg]C~OlkݦGtWWZ]ë)jHYGNqdv`>x:H/ d8dMrk"s8.PlM#K,KOY^a$-GLxArdM^X|vA=fqe3RcӜgRX,w{<o6o {;fΦ9kl@S6;[#颲G-:<vqfVAVV|tUf]r>SΓ^ \Nba=lNQrqYOo\k||Eۤ^zD@ʵұJP bc9^[=u]mҾ$]* p# >눯I?7Z tvQWsionԕM]lHnޚ[3:r͸D$9*Bl|$<*oP1 g׫b" o+h#R($£r0s]: V׎;[+Zhl94wkK){ܫY AVq<4 a $֬Ⱦ qfE;^˟Uue.x婤b(RF\r#~h(6Z2Z1,~'<'9׋OXw$vm'/uUm{_S5,m+Z@$k%%A=1Om$e`F}?}cq@ԕ1!EkTܙ;F9Og廯=.SUBB]9R|*ݕ$0}/0!q`x-" k+M%\ + dD26CֵA._m +O;p03gm->X0[L hJ9o-{*uS (Jvڬ#QpBGJP UD@]z.CSVl|?S2r23Mt+!'`~ Pi,r-:`zROUqet4Ju%[44 le9aN@΅=YAO%:He<D$F'J3QET[(ϦK)Ǹ?T,3f7!"@&*D{i}O4?Z]m7KJAZwd2G=2 *eD j2{ 8:A>A[1@;%eMpWԫ?$' ζ i/;}0T%G8c3n=xyK*,rFdDZ#VO G݊DI1)l/4vo+W//*B٪-*̓%DRIV,g  Zgǐ'> иtdrY$)[JWҢXO=6yt =J*0'b?d6gly=QcjE[̲D97r=XdW`FrrFʬ;{GCX<=1H =W^Q_J麄͓M*+!=IR/ttmLfJJ8Ds޿2Njjv?#4Daty~?oя),v)|QKɪnP$6r@lho!EOW./G3ڢ$j|jo|6 Mh|( ͋[gYZUu}+qJ[#,IG= io^t\yE9?#w?usWt'hk_gNT:*DrN%2Ưbq۞x~WZɔ"zi%뜢V'ytWDQ'$7rN5+b;rLg[;Ů4F%MNI<8#i D'd#:.qՋw0`YYI#Xo^{OR,WdYc$MuwKn&\Q|ؤLw/וּZW-QAS,ʬ({|$ɐx`ٮe~>et4 Yj$@f Ky麉q &hx%TH#dLC+(_S:izê9iz{jG"J:1] i# ټhQyH=JU|v0 N>PEY$c.llIJ? T Dy׾47_ Sf~MT 1*@Ֆb^ z% Zbmo8WAKMȖ~Y>tF3Ϧ2F=uB7n4) Y*뤩KXßT5RL,b] 2<~z[ slFD5%Zϔ,#s=@+*@2:l9go3v-u%TMy@wTyNv->MFbc|VSpy?3Y̋-=7i?;`t~K\)^{\Q76}堘Zu,0n>bk)d+o1$_r>؉ F+$y̟6[jxֹm[ ld( bF Nnʯ55u4T+0)$G-G1Ƣ&f*0OKP~ ZWP$>k@-FgFI24csMD둝J XnZ@GĀO'",DibMLT,gXˑIi:@=*zjk55Eʚj풛c8Cp )^wljKU44qR(k2C r8=bCHijFTc5bX|g|X\S. "Il}F8xѫ5oGWcq]ԭv*T2M$дɂXcK=G=%==Uw ssVZ/Et .LKXuYKVxcVBđ*qrā낫y%dӽIsù'Jwm7nC;XoK]ޞtBqH7w*ΥZ&B2?%ȹ%PF x=Kj ط=7 ͽiI ]-2-e 6w1eal#JW~oSήd ${k"^zo'˅cicqPr\gry p05OTlI>W֮jkuUF<+oOaFO(rKݛ}tϘ;߃5A g `uSXjc[u⮖ylA9cT?1GȗwFZi(檫TR|$mbrp>YIұ[Q6A"m~rr=0?M+t򈦪GURBe E}9n]/f6i4F^OB3>KYq#An1;ui9UwP0GPRu=nC.ШfRn.Gz 0?)Q .W;?<ٞJ8q s4Qc||D\td[mv:Z]W ߤ,Kl&H-I!#y>< zwJhnӜ'Z inuR+M q{;}~|9+ʹdf1m\|:N'&qEZcĚX+jUSr_aP@ 8֕RA}yF{KSq`sEji2«z*AIId2k1{Jű&r:q7󡣩\P\)&Y<9Z^Dpб1m.NyL'#YWKHc}U9s9FʊzQKw1wĒ=?N|;Tt/?4e |/=WEӖZmKlAaϸӀ }R/u5:ڮQMd8ͭ9:e%bQ\GSG8 3A猏:;|$>A=x;/P,2w9WLg^YXB'ۆݏվTm^2~#}uފpI)x˔뢏 %Ok9Ο Tp5f:Hpd;G:<꾰b57cHPlGpF8NSOݒ fb8]`}q3 @GÔ`#L8.;5E^f[3~2EFT$y \"LF5h!q ʟδ- -CX%nTH}>mMPnTAS"8v0<ƖX\X?Fak_){DUJ*aPdpJ m/S! #Ӝ{ olqiʮP.tM-@^b$nGӁj0Ȑ9_׍sUk!4Q]?VB`2fت#S(/V"MFTʨO11۱ϧy#xc\"LTek,AXJ&cypTb>5T23d&6 0P8έIjf:'88MM z EFP Ģ3I)s'zQ 8l ~ywZQhD!}9j͊eW]z}d`/~]`;eQΜ#*!d_(}@?׏Yjf(-B8&?<YqTjh `kԈ0)`ޙ,AlUښBIK2H5Am?͌isj&{)]͐"UoLu:d,v 3sG 6~cQL썱$jg (d9N}I@uJC+F]|l-N0v?izI#':&B91iq@~si$=Ju#+\z?\ W]@=9QKοLT>؋)1ƹ>v!2[!N!W:hccFށU8@ЍX՘&%\8K@'Šm΍qurV٣21@T-EbIN0 *s1UxHD2f;c^E;x :sFN%ILI0_tj7jO,TV >Z"0Q񖨦DEߒp9tTpg4j\y"E*dT d~ECV%ntL$hXU+)XY_?xp蘟azjx&t0_![i?VZd oj&2*0@į5=lS9UKr\1̙f#v95\yO{1y*ekNfz~e?1}26}[յ4p2<}5Zb`s"ᇿ#䮩[(tt9`}B HS#GTlXU.pGr0F}=uݮ*@'8AQ]4tH&q#ُЋb!>j$1]-YHi娣TFA9'zjfG']dԳ@XsC, n!Te_MMFSSN x:9Ll /|rُ;Gg$2cWWVoCKWNA3xVTğ-)݄%v5P@=+5) BvTf#vQʹS)S]P 8ϿS Q^<OʩpG:kmMD&|MUa$a_՘.o2? N:ژg` 0Z匃'8]Gum =" 0soфy|㶺:"6 ~YN:M60hps=t^8T$f#9ڪNcxBxPT8}\墺[M:F):HCFFOayN޺v +UlcY63q#sHH)# z|6_:^%NBIy|,/LIˈ5pur6Cz) ~jf`#=ttERTL!Ǧ=D0Dq2m?-yNlma-&Vc4O*5gOc6qz\@ N1U: H.&ƥq{ k+"mC=E Q"AJ.NQ}f=:{7P:*I&|طdf|yXqOq邒JrejzΨZaqD4 6"[x::{[lsE'WPY①i2Jy\`^3E:U<$PQX|Ze݀@϶4 [fe FasLtVM})$!(4h[#goRtV괯ud>Y$uyi Fs]Q[|~2{w#:Z%{P4YrZ"<ݧ=Vr? :_нGGP_+JI bF\?ufW jbN7۟}uJ5 H>@jWY q/Q[(TO$?Ssh1[y =}3g<{c{5[H`9pz0G'Em"Vf:ٱCb~8Zv$C?u]Lg{,rJ(O㏦I֯Z:jҮ_n6u Ġ<ƳW5qUD {?-wGuVYsGRՏoVA=*u2?-G055Vylx9<{yR ϿFix~=+?t;q+R7Ok썒TH?wX. >߬rxcWCHYah|&BsηJӦcQ1wG[0D `޼k/K,MMWTY0}Oo_׶{?=մ]Ww*+-OSRR}1HHZ#~UåqbS(?ǔ*Ws$<P:# js=^5ET1U dlk*#HtU9Z F>%Qq>wK|u42pK 02 qU_M$q030;<鄪 zTŴ<l9eGU-x!6Vha#Mw*JsΤKp'y$`-Ǎi֙ w.j.VHw%M}EI? ,(pH9VYSQUe as劗Œp]$T EI44%翫{K%ubG'(3n_7>A_dG=A2InfP+"+@[7'V/wF/>д#oՍ|qUUiۻAVEo4F6ܜ!e5Q쨊DvđL_$cԑTgf*9LgU3QS9FX:HAVSP_*ߪ\vG~-,2H-$t,cv:z|FB6Hm7*-Z z3#jOCGG,/[kZT\3YFL<3 I=5xlʠq*0i, bqm-bÑ {8-gzI=?L M؁T;[?gE,U6ڽK]Oi?h~ yV頍NєmӾ%r~cO^$MXluwЛ?*2ĂU@'= pI>g4q`mq}{xĥY. _8@Ա .g%BIDrC0tdoSa;^*}DY]0<]행-#A#qMИbiJZN%^,uGEOSԤT^;gB|5LVIF^H3[mƎr-Զ윚w!pF;i>jRh&hڠ܎F{~gLPQz_LE*n;F8PgB ?|.WEH?ܠ_]==$K(PHhEF¸9?LQܔֹ( pcr4i嫷LO$.8Hϸ"RM\L6erYsCͺ8INBQӈb ;lx3#\_T׹Ijs$`rN1]SZʣƺ*Ƅ('qmfr8=* GEtT񇪕 `sI_B%[h``umq#ڛMJȠPuUZeQl,SVՒ1h$}zݢzZ*LjI=//T-uHYi晡.>,W8'iy8ۂ޾iJb"wc>R7xsZ]bGUS}Ai|M]+8$峜]+ks$ʃ,^ "SGP5.8f]8Sr|qy %I|1lPq1ረCkp[2? `8Jtv).SQ%UFOlkS*2T+5XDK ;1dk ܒ u%s\~Up d_uЯu \rF$_z=QaFep3/Q+,gsԑ[lcS)ٸ)Cb9AKxSqH<$q(VbCԬFCO<`f1#_|%X{d>l1|[XmwVO2?LuD*CN#e1Ǔ"!e*˜e5װiݠ򚩖C4gxYq ΌM&)VH"q=@=Φ[LkI+(Ywc p)RG<4NUYp߬ }i|)8 ??]KGo>tFM`bsV?:Pq+l-LC 6ƣ3W>M\BZ>%Fsr~Zz56^үSS Ehydª;b805F 't;#Eil;uCN$Vg#G68>z$sW6wy\,ǹ9)): n"ѤJٌ!RA]Gvi߱,ǝwMA 2^F=sEP4ry2,]ErmLe uJv1UTs?0~3W\.:50D'|*jL-.g?-U)$cU`r[,GSLCȦR4np,ԔЈMoRIr]~b螁Ǥڭ6%¯2x CjHfs8RʫR̪5툷(93;%䣛|jwqQk,Gr^e(m4 HňߗtuW^䨫yŵB)NZ5Zԩ&1V\68&ezMCg9x=,[@u pCc4i֕"@.FX~,OY}tSTRf; - 0@2X4x`v(jv+0 !W'_W`C)hv«|(W/ǡ){rJ{\JyZ7&#?q̰tXF!+^.t7"RB!M%E;AȪO0x=w{2'm}FSNbUȮ}]zp,aeS)g̕VSU1īEWF 3#0HKgAHx+zFQH]n~*p F?]*npjElACks, Ҩvڛ ؁Ʀ{j8Ip r  RT}t^LP^8MP2;83Ѫk%0cMʿJC+\ ?S3V">kJF$/Q!+c8{ RIF9ڽߩn?b; X9Hb8}VUVx=$^S)=jǴT,p ڙcp#t9>E c=DpDI&Nu aƗleHc5KLɐ(Ͽlj峣j:--0ҵb$Q r4IX?#7{imk|OLhg2`qJ Lb o5Խ%z: tWV~c=Rjbv,hӟ Nąl䃍fCNaܟs vN$QK*jHNLk Y$$>0KKo)$apP[R2MJ7z鎑Ef:pTw0> >CԝelE:#Yoj-+`jJcJS`1w'lHZ;rK;lPxU3#}3 d>῔'L:k]RG>.J O>䴗 J#iPisLY3A NsZ)%Fx螶RIEYln3B*ԩ>m GS TѶTۃcؐpOj]@iFFWhP=Se:L ժ7/ B!϶y"*߈t*N)#Tv.yNAi""R@E}+ Fػ ?D y?̂!Ev,=\%L.)$Sh$C~R|DOY~3'ÍCU`JDHX O .%Z\9>\c L[cf]F[+ÖsB[L>ʑh7WM$ ?`o?Bx6Z\,K 䓷?=:HD@C@KkWPX-5%L!G +94+m"?s]IP3.Jz\ @vFǾFHݤa'kW1# fmM;` S-"Ct zRT4إ3x h1,<[p?]OOtʟUt* KE¥ETsH*X (4g ")Cr l/P~O>p"x$}?!ij:5嘇_T |믤3WvYL9}VPr !r9(S2:DA,)9Tyd`#tUԨFF;ʮ!O )_)pße(wHCz$Xmp?7ʜa בoYiHdYO?.ڣ5 d }9; FZ)|s#<][H+/y|!'jJBv£dFM=>Z*=IGU$"8=Յ퐨dzݠi<$I+DfqEjhc/!W1~ Jtew^)b*eQ-ETB&#8* kATB,͂z~zU2$2}$=5M=21Ϯ3NM6 c}~ӵVEb^u,:ʻѻ ﯕ6fJJG9λ*Y%nq:1Gd= GZqLF ӶGRPQ,in$xC67'Z'Ex֞ mYc\٩{O@^g{clitue`&6<4D3U9=8H {)+iP6N8u/r_t(PتNg-2'pƘj<=[oQڥ3%+Om}5hQjViQUBULe|M;UP?*VgyM2^ֺøY c8u>N}=u ӕֻgZ  AILMM@ *FYX'{i(6>u155 hDE;LIP7d{ă'X\5-}}h?xH.W< :< |%JQ,MRLSRnв1l DcZZ^'˧> _Q]jU ח+vV*_@] Zy]eOUkMgG3Is[1~G_:oaݤ[)꣙N9ڂ"lD[a]T;L|wwy@~GylviSFF~;.+VLo1F$y~K5%4~SD5%pc?^^kĻǍcOo"8靘˷ŌڧI3QR^CCɒ_N+]eH< }8#}Tdjoע͋/Pt5&qyԎU ffnNG`뛡4r[_]۷|Z1D1AS6r2T~MSH3 mPW6)89V):ibyVQ&3׶-REH r;:@6N9#R0]PsǨJ#.2*"Z^h_2>夔э0sUuIRO&aqTO ǍZTцlcQFp.e۰@}t8Ɉ, ۲_^Zb>9Ƿ5OOVwɆ6;8#>iz*ASEngZ7 |f(J"dGN{jgy`0#N]aZ℻ P18Ƃ;XV {z?¿m%}S**'rX: q;[kJn@%X9=9y׌W8$Wd߃39 ˼j5 *߸ӪT[ztYM5]M5mT|%#g1G؊-'Pdè'x^$U5dTR" v1>Y.TD2E~9s  Sڤs-Cb&{>jU5,_eW g!4[O@fnbE*8`=~ZF!sVb1!e?^[-t-"E$]oD"b;ٟ|<"t?XxCtv.O Edr~Zץ_?"9NFaվ7 Օt} D<ș=#|2BmBJ+fex=FuS)MS Fnwc8/7U$Jv*ABbdg 5]U-LUFR*%3>f(Ld~]q%UQ1[ǮT3{G֘RNI2ixf4dR/ζ= j ׻.>8,c B!dxyibte0<Sa r}34-=P5m&~_J" TC?AE$b4^_nz> adj`;?lj"J9Feh+~7 l{I~%^ڬ ]B[GqK\-0;x?&sıshtcZvٓg wœ jۃH)AqKU>0HZTDHs 5qy$1=M ? O5Vݤ{IAw Ry 8#込4>-Uk݄e[|Ǎ}9'Nvk*EJ҆@Ǚ7`F32:]m&v.:M1b2pUcB 1=@kX2WF;RĻ~=uZW`ׯ/tk:{,ih*~+̱';-xRܼ-"^4Swj8ku~)M#qטY"ßywjTJvtt+1A[5R񵭐ܩ"GNJϲ4'6)aاki[żJYa1Kyz?< >X1c%qtSIPnVFlg>^z>]Y[+㤃8WbګG=NKL9 '< :9|EByH\8%s28hbl4%2U)#~N}=-ZzD #܏twG5"t ontBOSKoIP<(czJ5Z=OOQKTs?_ggr]'RtҎe^>]5RVYV$2gmˤΦz7tfHښSYL@hTj:{#n_]:$5BU0*c8snS JX+C R[h@BN?H@4֨(1Ec5:Eo&'}i1t?Lee[_MYKtQtNUt}N|=6߾u^*{\Mj 4V8w<1ƑZ^  4`8ﮅ4j&NB3 z{ F$㈬p>^Uަ I pS(evIv9.dQt%֮TW0[L~~JjU Wv/LS$v4ezT@&Jg[MMk̾s2c՚[VxNv@{ }E3n3UX>]Ks[!/={ȖJl62PK[NOT$w;~xЩn*ܼo#-Fs>qW^ѴqGelNR17%'1[j άn;YqǦT]4PRBţ@gGqpǒOt]d%+nd|3q~-s ^0Pij2dA\!8d`ñV䟋keWpʠ* mBTj#H#ednDy}HTO`F5,b`wgR}}ZF%b~;J2 p;gݢX3ߑi: `2NJTZ(q`JԒAH%#lߖ $ӌTG}|DUB%O#_[ 8Eb AahSf @U`c.>#)8uȡ~^8ԭ#e[r#[8#Qı>Goq#Ҍ)@ImdGiD2ۃ3|+>9h([h댋c[Q§ĤqmO$*V ͖ `{T*ϙPp=q0%ƒ2wHӍX N/5yR2#ߨЉg}:dL6,%TPdFw Tw$5wm5 uq5$c9%J=?Y\MLɧdIpld颯(a q!p_\~K*4eeQ뷰PJQe)gM*,R-iE*ܪp5£cӃǷ8P9$S|1*tibkGGQ4r.\n:)O7qK$:@A]P=II+'&^*? 2.j >{DsM3ێAdFh7rRPvOc]IcuZ6 _W'ǀߞ`T.)$&ߌ)!r{wTX[?=ڤO#*y9@1uiQS/eL> \MXČbUF_*>@dSC}?멨E1Jf6A#:rQeTSAV}℞18FCWE8D$>Qrp!e Dl7nZRywB?~:( AB {vV9uSӅ\\@G dd|n!flG`;~0+$A3LιF@ XG:et$F $dUژ> ۟]4zj ?v3c99:ϖ(?mYIQ(Aǯ/ӧM3]U34V_)sʎp;i^ư^I|1-Jc~XՉ-8aR yD¯EW 7$T"Z 6#H@ M8'j P7?}5r_P=C5%t>ZMQ" =9["[)a f<+"mWZAO(esd;7wug ^ QW%O 9?%V?Ht2i@d'@yCJX~` Uid*R^*\#xϵR[g$ފ< ji|5֪Jehd_6;zIa%$-Zt(*#ȎD1!ah1G>c|P sT&X&qƴ:E'azۅȲ쪤a@' *zVG䝜/4ք15Y@`>_CSݘ綠 CA^vCe*Mg [q*MTFl2\`lh?ȧ .@^8ѣqM>aF>R4UnWoǧejg0@Zo̪Ȫh+}pA% >rA#qϾ? ԭU%d뽲@m lv/׼1YYջ;;Ɖ 3"o  GE/1T;HHϾ d@QnQBG]NZK7Ϗ6eRƶcQPʠ08NRJV),F[F1Wfw/cKZ/qa*NzbJѳw&POͦ+T\dnqZOB 1yjTJw\*ƍUjysI\Y~AuJNP-*$$9nZ4pՀ!nUt}Ag?"E:BH;3ʹQOEc#9j +rA3=@hV*>]J DdW\B8RA rV948F: ȶJC )^'z0+y% "G(8hC}N:fh(+aJEB}?ٌ)Ğʏ߯ tA쩝>J13RfY`P#BFf1,~뾫:Bn||&ak^*Leƿ^t_=G]9V/٪e%w #8A@&Z4)ʫv$g|^J: }M#P$, Y`9OS`¦%3qq `H#?i.qu4.HfijRo& ȡP9$ a6c{m]MiG4 R c-6EZ :;UQyV}2E$N9Nҵ]7RcX`?}lNכb=%J ;X)0Z3Wmڎz7H.]a^U;U4jpс0>ڢVnfZYeA,znOӏAyO,1jI3=uD Fu?I:vBl#//4 -j1FL0^Ǿ^#*ڽ]F.!AtP@6ZS4Ub;Jy5ͮ%4b,^>CgzֱL R6~^{zƗ9;Br. Ҟ"|$xId9$?|iz}Y;] zyg)$!q)]zMTZ|nw [/ڭQeVcvbn.D%J8j50{ʪʨ,ѾI'IϮI"׆ UѝjDţO vv$0* Ԙꠐ(k<9=@9=P;}V)9) ߀Tiޚtuݘvo*R(4w_\jJ+RG99,~#s-GxMhT2N΁iv4|)?_~(,ڳg{—;ZUZ؞<%w0n;nC{9#{j}*i p Ps s!ݕUKw~Z`pt/=1qztoX2@V>r}r mh תzn{iD3 0vqכjw][(RXjq]М:-@ibKl2dȊ˒q ;|C )^tiQ s>Zewm0$eڞQAt$mBkϽ{b2(*Ž@?ђIN~xsc)mWg/_, `OKwyşz:LmpnER1]w0ps08GN<|. S̡Mw_wt[_sno zy%$rB(Ѥ(:K;3in鋲KɜWF?m%O`Ҵ^ZڅīHp|X1+J7.'wt/PL:56댫Y%-j*v;)fP%3UCw0S'I}ʔ+  HVR{'9\nQY[A[-=1m( DNiC>Y;].BG'ٜ=,N 5|^&3D M^u8CyMPq>r0j8𞚁B/Ï"V۫P~ m$>Rۖ3M xtBf6# #M=UK,FQQOqd{,VnH-7AryoŝE&9w+yE;NM瓠o+p߻c c+/O2Lq-Q!B(?-=RMaLSOpJXNFv>N!ꉝUKw-I-pqA #wt*H2+?姮-v;WghsjeC xw`xqRvyPX08S(iU5< ʬKG)\GЍQVDUMy1ecHP9;mnQ^w1R*2D~c}Nj*"^5ʦ>Z[**:4(%~}sUP_ԡJt`GbF]v8U:'T8 W1j/4P$UWCS|?}Ϧi%1eU7sx%Ku$6Eikf!PB 7|RiT*IgG5wH9v'+Ӻκ&=c4i[< #)uT3 ~@Qocth=FHjo ii!+}Ò8=G֫Ub?i,W C%,9*T. nާJ -/MZWye1[*C`=ƴ5ZlYrX7%!|(W ( yAk-7F\ Ԡ ڑʟۻl;5Z刻agd8gqeu5oi9O23oIP@$d 3.M]4rBKJ˖9]N3|b5Esnq»z uAcX.tH.Fsd鯦h<6 oH#anڌI<8ҩєֳѸh_eä-7@9qV }t Ogj|I?'VPR%YF='qKUl)|s5}c %*E )#h#;y0EtSmYluҩ'(5W[UKF*\ۗuVDm q H*N=e'KZB:u-3UDzT\ #geܮjz_):\Ejr#䄀 'dۀAx? 4 T^Y)=M4{FBo-wԌ־,ߨ/5нhY}%\lJ]|he}@j9M  \BШvuah #0wAl —'/l@Cj YY4a5 …Vr?tX2#)}T`운䱱ltW rfp ,`xwqOsU*e $@ ;`ݫ df3`Hn{RZ5`YP;mS 7lM{o!4K  O:k !OA$:jԫSbx϶sH)B=w8Ϡ9G" 5/29M,-g(9{D=@$F1HSjM$hLܡc:tdxXҨzQcin `w zY=ޫ2^5 ygCnjhHMltNIdGcf>q4u}aI-0IܱL+.8K&wk@Cgh.9={R}R!#뺹dsysKNVDYFs& TT`*~قgXJr 9DOo^XD6mH{}u!k=MrI$\(UtBmjʕu#}xBT䣱{N8߀4vPMJti PC7>mVRP<ч!y[%]9JJDIg=Sc?ҭ]کeJq)Pxf'MkfzL\6Lf'pP8lrqΈyYF4vk ]bGYHUi7$g8k1/SI$(7n$z5F:-يԵ{|ψ۸uɥ Fp2;rN͓rg;@{Lu=DJeŹB}>j/JצQ/FTR^4f<~jz~Ve^IFM=-OIIk*ً~GoM-AdS/ $[ C4ZSHKݽ!FH;1x=y:Q8E$nF1ƙEQ{@tGwekl5rFVu,q{:Z yTpƻP(Gi9Q*X-{T.`lF [e5$уN 8WOU;$"S]ΈGW\JLј8ucBMHcğA~٣kbkkS“Ʈ1vǁԵuDGw qSX#FL,41')=-\!&KZ˩*fgq;|)tP꼀~ZIb(v輻fz8M`LF {|k.W'2?m%LT 9$u#g:~SQuT%[t$@qsAkhxxijׯ78[5L^hZ%w0>جpq|_@wAq,)bpX\7p;c^RēS2 ;U 9̳EC<5)%w EO$ec}^=KPPdyY}-n+ԘEZh0wn##`~ޤv\ED\q,tfʖ>&_@72Џ8:ONRKG ?(@#ZRQiP4"l2󑁟h$J$X3I uOQt^~\ UtF'#,˓#cӌzzJp1$RK?>s׋k2Ay|,N ?3:UQͩ F^YI'm.{c?뫱@JO1a;;ǯᮧOZLI02}UL1 $@"qՖ;[5HƶH,ɸ +YGqJgq>ڒ}u 47Rc3#ܙ-sƃT-qe/7nWQso[VՑ& f! .9r04oQ}#zMCdU1' RJ b c?kUN:{5-<*F2v8I8xtgV˭_YV;Rܓ۾=}6Uzf#oa)Zy7Ӱ,;;iKҎJg9?QG)|i;~d0fP۾&9'#HTYuuq[)BI" cxu X`v 4j婎4{EIRNLiDSIyNEnAcJ _#u_ʎ*sPs⿺ l9R̪(*v; ELER2`rF}33&seUePqv8?fF7<'jaHF s~AKUt3S:T $`}4i-RK L2FF }8)z*'V'~\6(MmYRYA#9 YL2Iiǩ*t -.} IhɈ1<2;gAGq(|pBG=۷[UCBjta ~B39̽>yAԔWKgP[$اQ-td}F|̄߈H`uI]-lKEHݐ1Aofr2 ''xw=j=Щa!'S2>Uԝw =m-Um5o >w.Ab13_ᘮ z-nYH k'"5FcJT1Ǟsz AUn=;F%"D!$?΋=/ROj@$p^S=’F[5EDf{#;^uӽ ZY<$|97cd?V r Sjh1QFʦ Z+DCAp@/lnZW $ TO AΩCD^ZK-R-2G'U_zz?zܫr=ݶ~A^p==' 5Z:wP2G}OgKkEY;%T8 75 bni-eULHYLr ]erXfZf0ÿ9 5ۦ)/8~,~5 FeߔH'?f&oG^xXjM-$QVDII6w܁v|+Lo=èYhvMES}Al#$ ^4𛥿ښ!RpO}I֙݃4*\dV8t;iGc HM\io*J<2\7y\aDqqb;dk*x3bkUe("r#\[2p2xI'"evr2=᣶W POog*#I³ 'Oѧj)m| 2EYdްYjprrTUe>j\ϨΫ}-WנR T' N3{ܺ5}Meu`@`N˸^C]y1*F$f$ >[3QpVP6:dkqtn8( bVZK̞DNY]0Uq:`sIsGp#jmߕx:CWSD1.%XNh=uE6۠~J2=I+*/qۏvԬUl2Oqǧc·Ts.O54&XޥvD!!4y%c8֓uSaOjё\8y8 />FTO b HI x$4:TxB2f=UDT\A.# 2Nt^moJ9 $ rƇDE8 lo3"F8J2جz(z–c؎9 cA8'CԾDjX|k|rchW~U֨JֆCp)$ F.._UЋPFU䯜822ӎUJ"ה|?x+- [ / eUhD)TjJ))$\ ؎9Ua(wU=Lrc,8n] :yRj9g,eEcd ru[DEF=ZMqO+,ʘS=]b"Y#s< +.\kekt*j<8ѺX0$z["Iw!X`=PBΔ2̄=s,[ rvsどS;ASFyN663 ޲ZJczsn}4OXtOW\zU5ϵ[zC~x*ݭ 2^-nt5rb1Hd1;vڤq'=]3UJ B;W=wn1Ϯ5׈O 7gHG(<2O< (=ml F'ljT{;@Bծv;$Jx Cgc[QđCSKSQhzɱP wyg(>Ȅ :w9OKIy#ú828=3E՗CIJpTA/$O`3I&52f9+ 3n2  x,9 t_cPFrk\ZXijĐ`?#9ѻ}?OTW(L>͉"_-J_؏](CWpa4bI>߼~ {v{m -I]zU@APq@'8<I͆Fbĝ{Li1ur-NHcxv„2DAf v8?НC?MWk(8dB.[{MdZƮ[|jNG_`NKEjTj]AlV[e+gIQ -v9 z֧Tm%O@2`G|珨Ъ^c[-%$5I# hQqWy'<~%ҡc9' IǠ?}[Lem +J d1Gˣd=8ҵUl?JK"GKo=@$pͮP0UHsMwp5vhA,<1" 6Q9QVأb#;gz`EPUYH;UQG=$)H$"F = y+o}k!j)aXVJdj0de5ŗު-"h՞h+BсܲŎG8ԫ drnf?PlƆR+>I,#`1$9KꆮjӪyadgIT> X*@63Sr?;/GRC6MM(~:$% v+Tdp,bH)n=LTʹ#kNi†$@Q?םE~{)2E!,H݅Ӗ*Tz2E>!Ĉ='\k\= [tUǺ&,c"x4`HC qah2.ozSP_buXaJk* p.K7 z09WۿVXmw͢O28G%}pxֻղAq<IY]_ gtBPtoLI7:Szj̵ 8@ sp[bvlՕ_}ᒣmeeçjE,-&̨Kʪ{qME$ 1mȤn B0 5螣hMe\'5.ȕ3\*$V8ElA Nk5\=5piiEvSivFtmX_.!OT?N)Z' (ۏ#ӖY mkQ=)f!g3 (c Փ4"Kc]T4zErkE^$LP̡we}<,^h>[ Nu\&K#(y xSW#8 b;.MRVX#p 1qUM&M7@] li]u@>_2yApkR2>ʡ ՛UyXy%3|*;M*9>:jRaui,MT͂J:SGg ΡɫӖVjnc둟}:39D M<ukM w/e#CՂDݒW_fwsλ[K0[ǰk66 cTFȒ@\)ml ~9qsikN``1qU] |=u0r=IQI`}5e "uOPb۟!#L3[jV19Zӱ!9?K(4RY)JE*IcE =k"~4rĜ'i ȑ7++wTg8sjWOJs~C_np5,NO6wD 6/PŽ6u4S*awv^6Ux#֬f`X,~Ns_`V0rAuIN2*By)F]CVRd+;r99LkQ!T5J'ǦV;uC -Tߟ̫sXa$t;"E{4_ezٱ֫Hھt+u ;#!T*@ 2\HѢ辢$EVȒ8 nBrT>DiS񁅽"/go8|C U4䂱RDaA@=Y:(5|;iԢo22o{vPԗ!;AC=V<Ŕ!*ۥRMq1DcXMVX뤭ls=?H)Ǿ9P8d,3yx'UKdqbE?iV<Wj5sp=žhk^*U ] F .NH}99лWQ[1D܌{ziSd|C$>7{_߽'ꗪPkex9 $ZMD#`_vQWۤ0I$U4#wA>@\zz$Tg0ya ŏ':GYHwo PYD@,k1d} T(U]OtE Cpo 9TRKHԂv+A7d9,gj)l;h=C>)e#yy+U<%+≐.NRTMCS@)-;35}`Q3qaʑs}m59)ABJzX~?8G O렷 `ToE#%m*KI:g{djie$X.PKD1vc @۱4ːC)T O~=zSP$pqq_*Tj8ϡ@z"L)Emh*DSIӟнII(z޾jm*0;ƕLw.?LzQܩd4TD>Fȵut BOC<2KzU9 20$Ci$L|?8tfr5 O$&8Q~C4DBuOAH'f _]9Mt[EAP"˄p=ySHSVK ,eqﮠD< #k3LGx4q]VM_j?ȭ٣IOnO}\!6H CsA*(*F~}]|VڟT\E2cLhK͔F/>OrBsk~iiwn[ۘYH{jlh ;V{*C3`Fv']0ںvҞ+|* P*0Nu:43[,ce'[qǹ摍8XJQh':sGR{y2|hk\?i!6P0GcmIhIMPRlW*A=,u\S9j9%UQ{xONrj$VF#FV,/ۧ|N"QOU#!z:<@#QTH%;ǚQNp^z"9X|:wڛu_X#/,q.>Zw ǝR"Q|#Sv2H-z<6`.m )LÌ*ifAb>1Vm[({36@Zo+jEl~z`%N2x<KwEzzm]Cݒp~f:\r%+'OB13/U0[mTj#i">jG^G2{$kӾ4t-] EI)$J6s' x(:PC^BG,h% *Z񅥕s^`7Es {QHV ycR5DX1-8z*zѽJz95rdO" ȧٟ]?bY,(vΪh\ OxFMĻyrtQ3$䃃qtT#Pޛi/ܝ"Hyf~z!)7ya =`?K-Afÿv1~'TlB;X|w`S뢶Y)@A-F:+ rLZWp>c$cƁWL C%m۬V<{grϯq[FW3WJKZ'HHE8(p,`=%`]<;(vG!p=qƫ!Tٷm|x""_݀OotCHZ78DV"#w xՖަSoiCUTdjv. 3lsoUuwSY ]'y A>IQ@=΀z˭)ڵiEJ~ۤOS$ @I@<cݱ\l/1+5Ed1!FIj2z=zAkH W -P^]j~8ǯ9ntjӾnt5Uɷ!efϦy8ƴ_.LaMD.8}הl(_2d1Jrg>b-0P/ƾrn#8z˦>]5䮺TЩ6` 33=l U5B5ŕ~0S !CmiZeG/#Sw91I<[ꅜ\,AOI0~~nuqT*%tSm۞UI8*YP6e {>Z'wSSS6ZUV~=v#C۬*+==+2~:o1nDmg &!P>Պx]2U6B?-ӭ"65Q$,*P^? "AoZHq8}}SUAAKA602Z'!?L"::9>z\*iEb?]ObZji1ɺB1Όk#/V3G.'OsGhH&]3)+0R3f>I=@Rd ŇȝםsmfA[AhC< #H%`H8c Uv207V+&EX*r?W:Zv5*+KLC)3 S/uՓ{{cTH0pYq}5T\TI*k%lݏ}I:_ 89ޑZEƺ#_aVSјy%2ƀ6A p2F3Β7;͡ikAX]hn:mxE-Ie)i)iʨ:V1!ܑn]]=\~K:Rd{G:I~#]+0XqƬt-Ԯ*' y`8 {m QPhlOwj}Y)QTd#''~#Nd 0O97־$j;O#8١[Tgq=Ha S8ng urmOPZ:"N@#Y I L Ծl4FUcOQkfRFG wth#i2'0;rLrS#V6#䜑hx@65;R(j^O0Qr瑎{jMCS+5|hу 84Zhz)0ȝsD9 =AᏅrhzh׺Y?5$i`Gtw],4,tFB(b"v'fOU ˪DtWhnjzt[|Q0BG 'E^k𪪊_mU\(NAD$6  g|hZ`Nk|1u*ayXT;֪Iiwp8-;F=;g|`G\`kp+lM(ziIY68`#\u/}Akx4jH90N܎OFR;{MJ瞞yH|֙3xԭ)w$lЇV@iD#>qe&֭qP9 N35ټ3'NyKMAfZY(0Yvc]"E6+[ <7C0*@`>\VhֺaOQ.౲M 0p:pޜ/ʛcm-E´pG G q'^5r>Ja^=YTpnVYImRGg)g^`l.ڕɂ`gU={WiEt502q34[+l"k]eE.SG8)$Fácpy ='B_4Ů%(`VgN`.>YL*PbWRd }ʮ75pq,QQds R f c$ƴ:M nG@* x6_mۢ%E XX;G ;{^F1VH?F}R lC˧;9' Ɩ*zgn,L'a|\`=<^.Ԕ6ᩁ|ŊeFU`'WkE)q5 ω}O-4W:jA$,IXUǸ+'#KV]+VU$K322sx]M%[QU5Sy)դasq-V <60OO4A"mWk+5X[gh6=E-PlڠR=U8$Ҿ}i[<%u_nr Sg# oaW8H8EePHq,' 1-=IO% o)$Q$ăg##Y\YiPR-i!sq 9'?{$%[r;R^kNZ"] -O TN{瓪\eޠ۬ =]=i T0)5Ž|!d p'޾[|X [#z΃~-(NdTF n55*eE$䓢=?F-Y+/uM^1D:Gt2\7Bf*S]4kTu hw* |#$;֝eMbMMYVc-Euuy#%#IRaK\u\V*ʐT wpxtG\*:jꫫ2)c8L ԪXo5 A)fap:ԯ n';u4U^qf9 SkT=Ok?/DS($mJXxqœad%ڎj ɪ%+VYqvS};,G٭Jz֩%lK* g r9$ kUWOȬZ5y<#Ru^Ȩ%rJ 8#'_zm1]r jMHQi@w;pZH(=6;#Dn6|0IK&qAGqq{=Β]h,;IޛNP2J6c:;U/Z-U:sEғ̑$[2X|J~OZS_ŵ`EhǖH89-vg%:LkԲ _#l"3|ΤZIY 9 ]YAO}[$Rw18Z*8IƮ\+o/x}Iߠ<"*YHXXw$|#ߝ[bkF+urҌz dƪ%⥉%+،4Nm\>UVBYf{ZYǔeRtKjNfk;SK=L2!FI!@`{gWMOq-Jm 8: PIJ%_8?8uT\ ߽1q|j 5*:* niY7J-d5;1Ic`xh}SKX%+)#gַcj{6)($ Aڧ>{ԗ_=Uhд^\3A8\~*dt۶4̭c<xvzAUlݓp]Q\h&D</8֥6MִPV(M: V@ve꺶7٩/_'~PSPLEڀv tBhKR$돧IUQCR}f۴G]Fj,*w{vutVL?-|<Mu 4b1qƶi( ŝHȚ#9=!t²yZe$X i4aHaS£FAARǭ+˓TSiwjFJuN c+; ye<}pG}B|vK^Ю >C|24b}}?g2 jwNGv)q3R m}=UwwK!ʷ'Y"VCϹ Q*cI-;|2d]}sRD_,}'dS?d W+ YpcȲQ} Yi*,avlK 'E]P$rv8l}W룞|"dEXTH?'B6*G/4j2DX-UD݌F39ΨXQJ))0@V鏯奨ּ՗YIf6qS’MH=Ka`3M,OotȁsFT$(#:AQǝ"81#8zꡤamg'U!:-Yg܎ZrP.߀gyS$5sB!=A_|UQ\Q\%ib19'wͱZI{3dsju'Iwy*ނ5f|?%ıa76Whr=h=,.r*f} eIt Iaݳz38e#H1ePJl`0Gf 2;TS&TS2O-eANA38f1HPOY͂jZ5L2]XWEa* >_8'5nԵXi)"REPp `I~ _6$ G` 5 i!g 7EsC$ }\~'H]Q"dDfMGc~cJPOPYGcs7Q}W iKyOC۰ΨCX&Hs۟A=!mlR'9 ۊܭWV6 V=l;D Yv۰DQKsGQ*F q¤AS T$YBszs㯋ZcHg_ԟLz,WiWo Q KTߺi%7SyRpAVwJ iprJgᠢI¼WIWoxC-y'cB5΢x\C9)nImV)[pXUbr0 l/"OlGx+ u5-TjG 2ǝ[5T%G?OQ Nkp@5nËϙm"Pda롷k|\ҵYA);͟q娣 bwM$1۶WjL񬁢uNX"_U/ ;_}5f"ҼKK .#9ε3^ tyf 68p/&5ϹmXZqӓIt麥~GK 0%ڭl=N;..#gp.>cTVI<.j҆i(Z+|6g܌C&@ F}4[S}wksoN3@-(̲33(eV~2F%vT^.F),C*pzEX:#d ~۔W`Q~U z}5j)bg>==EhbFm,6j2y 5t'l}⪖ ]M8i!MG`w`s$֏TSĨ܍?'1>'gQZj0fv # g:Tj]+-\1*chd䟠^񺊀?HS$ga0 e`viwzU)QT;M'5OM〰^ę&R,i$a=NTjXEA@I i5MGNLs} Ӫz99C~Ѿ$AŃqw%G }ߊ\Jzh5]C$*'4M2꼜gh\џ? UO's_} ;[(eD` {Oc«_8U$"Hp9b~ jUtuc}*,NUKkj>[%vBQX2;2;b?Jo;[4i2[~'m᥻\K (d0aR2pyT^]%_\hVIB5P@K);AN}O={YGPO-ɞHۣ#&?wzPzaVZ:BhPd pz*u#qk&s|G-;kf\iJAQSAFX}5W}G''k3h" S)Z8$#h,:⹍j+Dx2z/9}rnRJfޙr2]Vk:x~Ʋ}0COH[϶3o k|~1~["UCPRsESAIGG%Hrze껽zF*.U!p#fd3۶.cM^,e;K3M=Ʒ*|=*rabс:!ʛMSľedkV,c>,TV0ZwX?# \-i.A_s GWOˌnğ]|~9]h]m\6Uy ^ ՟ZumGv۴lM4 mT{S5,&--VI'S BnĆ<`\۸Ƙ\&̔:R9^ei*/q?\jdXr1NmRРًz<[c NR Qb/HdO]@>i}~>|1n"~RSKdTcx =u[sqhY7HuQƫ9A $mǷ~MI0,aqAPC O\X 3)bk@FCxƧS<2G׍gqV-򑑀>8kct)c$)gPn#.nNZ%? Kp26$>Z%n@>zk"/8EcqU pQ=< }Xɚhb29CWM2D`'y0jݾpDX#wۃj !7xAL) vҦbG>)݉[ SQ5$$e g]ePR29S!d׿88ƿ__DzCDJ O0 zg^b(!?mDY71a"n );dG ?w*lHV,;#pRIT'a#1%ޮT*(jrU[(r麿%{Z{ <$mW6Yr@#~)X Ő9+VYmlD[nC ^+*a^QM#]⩵]}FmS˾౓;A(TNYw{Ϊ2O(yWB!r.235EJTȎ@qLFFӖZK7T^GFTRX #4}YGm*TYE ihs` ۚ[TEH-p234!JڤeKў,QU!:.V6ټPB%18{}Okۧ6u4~) ?ݸ,X1o$YҕqeG2E-OXܐyHf;xmmNuequHxjfڊQvRc~+:+Wu= 1FҨovd,Ònu/D=Y։U\*#ea Gu eA %"MYRA AEI#i]=>De\)?v5=!V~b6 oꮅLDrF܇8 kIxx&c}bFJw y=NXhgHSS7 E|*sr8?thyXq+o)囕EZK9몴Bw/g'N=g75]wU4 >B^_,-Q4uL"3I pdjKCxW|뺳C1?wyb;zkS?7N\hz8U[ z:W 4}!QV\ &j`|K#.x -_5Ek- V#iړ h#㶤Rf'X%iOC*gOQIiif # "eA݂p:Ej{Mu#$J̑Ɯ=NkW5,KPfJS8IIAr+ 4J nbU[Ɨ͜WF'HՔwdGf QV]XI-reJ H(X4 }Ԙ_ę#Ol^詣:orq&8$$>M}_vʒl< 16rE% ;Y:w̬k5S3? Ua}F[B+omU,N 3skiѽV 5ut4TEjFejUrv{L~RըRS2MMb * \nqsk9Q/5ًzm5T-U $r 6;D:du\44 5=9 pɝPw귄6ޘVt֊Ry c)XBI@Hw4[t_>i疖TFdl$n_,q'$;<dXcyqiueQӾ%ESUH :keMBoRԲ}tu5q $p[v ;n5yN3t8^YkjK26.&AܥAp aV|"蚟ܖKQcS ;E'+$;Ues7"L#j~1B%@X }F/^X rN7$ml_&oTU]w3#QE)?|̴`e^2Ӽt8X$oS~Eb7*tDlZ|CGZ5!/3vRFX뼙541V ʼnRTzcGLzS*tXZ BWFN;`Y\29Ml+@u-pgee Fa;t*R ]q>?փV޷ISQnH(XAڧv14xڑvu m;B &-Zw)^OjdI_O:_urddNOm UzD}™cG,eVaX-yᢰkRiaH"ZJiZyei6,k_dYK[mpd}9'΅)Rv 5< +>B $ӝY؂RMAM“Qߏ8ʀ$@?/UcEv l{u%e Q I.>Fuڅ 1 8k\晒0rroqTԓILXPC>CD.^Y)kHU;cc_))Q,>| ʥ9?9SRTSLx>gifhc*ZYg[Ʊ&#0?U{=$ѹOͻpA?צyA!*pՆQ9F@zL2. )iY,dgw {}JUJŜa}NI,ŷcd5n*uPmFͼ 7]o(̋$`?T]]fHiO4 A;NaIg9 dn?ۛe*Gje'iR.E_R O/Pƫ+J)/ùNG~OER9-81}H<\ u2,pL#~x2Ldll@_|c~jFnBA=em$zxj@$qKU/,\qHjI:e8 Ե`9g? C @|jTF\2_O}E%sO,]z;im-P7HR F$ƆUc2~=G5 !J}Q[&$RSF##h=FsUF>a?-!Gvu~puVEQ (98S[`HZ6hU10=s>z( < 7T}!|aa#=5%M .Fx3z?CeSI) l o8\Z67i5 U:T jɩ-9fn*{|6ZjrH@Tco?i)ئ wV&pKu#KU.c\*%$qm#:TL#7WT4$>jx TL`C}yչd~*K$Ne$ vϿ9 J6C1Ih 8(R@p~CΟlI?d·4VZ7~d$v>޿jN,Sɹޡן49MUnQ3T%@&FH!Ē8 .;zU(38fYP4,g㷱uIejqJI2NT+h|n2"JoNEG$έ4~)BcXsK_Ao}*=3h̜t4m'8ήz3OMK&.v!O²FNvP|]YV8ArZj\5}irVhS >os䞞}Qvb?B<~;@4E8>Ѣ6jwEI„r$B`:i'rFāܑ 'dE9??GZ稚SNbfL= -Q!!epf@IoL|T@$C'/b'_MC \SD01S%8Ͼ\dQ#E4Dhf-;Fpp@#N2q7X"@62$wI+'EQߎŨ6՘%J=41p2r=1#X!+m8'9О~4핫|N&PeXRxS+RJ8Lop ='CR(R*]w;z]MO |,j?L HQamđh&B?,=svH|F@"T ? ͧjtoHb `;P0Պa -=0\ K`O??dž5ohcꊈ*ei@9 W%FqTw4usTY  jzqH0]D|VZTMqӀ,Xla,8 gSQQ*FጡRO>Qb1G/,XEZq-:pob#Zxl%,5M/o2{^f̣QnU(U2'>]]N:(DpKj\~Jd{MMT` 'i*\`v|e<M^)xY +G S q asք)9SaL| :w|䎖j Ddc3΄Kn\KOK$;688t2xF{g_|2::kMhLiꚈV씲EPnW *r he,%/&R!TDo>'wqgd^/\UX8I=]%(+-ieVJJ@~\Vo0)n4J8+"(jڥF-$@5lxCw*:b-ִ˰N N Ct{sKA'q N 'XhbRSZT>& IE z-tQյLQXX–uVdvxNV!sZMJlbsu(b$?ĨKe+WR7$;$:sfbq*sjCR]`[7/gy=@)J`GιJ&u#&GłgUt,e֨"8'Z*-dAXp# 5`iUXO*xu*#G*p F*ͼ`wƇMr 6Ņ))]@pIEvsQո:* L]ԵM9 Y*@ތ0'89VzJ tMu蕡ԉfJ 䃐yiJyaBsM*1Uܪ~T67cw$`z' OYb#Rc? II'uH "UVmmQۏR}Uʓ08GD$ƎG9O"ƁȂQ鯷Z߄-GRDqG85B![Zz iݱg 8?,Q%y XSp8>x 䐁AǧsƫMrq,RaIZRS"YkLw50IdÜ~:J !R'"8c;sS 7z Dev9ԍ bP)y$.7]rd,yi0?,PtTŧp%DmDU)>iBī4{U>Ӎ@qx HLex}Af]i)He %O9@AyiNY-lr5,VLņU#i}f4Ԑ)ƐTHˠv+gD74kZYo;v 't;x2>?l׃ iᨉ'X9z f$!|zjkEyݘӀ$lp8}±Ԟ5]+_W#j$8U%?1 2!0͊Tf#=GLJikryVu,pc룍V԰-D,h[q;qq3[%TQ;ov_aӝ*ZHeB3>^V[Hr-3'k~ }tYiiqӣ8d%*k'cvlsqvt ’@?0=~zWZбB~?%]rԅ}`mQy"9(?,̕APJAG$]^J=tQ51;tZhiDX 1Ǧ{P[i? }q稤O*-Pރ \}5|e=E@t 'hwi7G!8`02 +ckUV!ypoΪOO+O<2G!:mt5V+C)N-5Rb@?3hD8c'8O}hja+2+")PG~d?&2MmTG;Պ7WPmUYKhtnۖ,J%1|d{ZQHHB {Lq֕6Z2>l9g/XԦ:EL!UwEUUeWIG.ӿNJd5!J%W`r\r.XGC]k5Mv<6qu [*  W:]m1^5V7W$-^Ƅ%J\^'Ti+QoݺIdUZo Oj،m< YNQwF!%qN=Qõ0EɅ{αA*wK]]eѝ5R_D2FNG9{QukTB>ݻc; 4ں_im_K¬.wGN .aK%dqII(bqDeNI>]4h8PU}X(kv>h9fP0GwЇB#“F+1mR<*H>ߞ<wS\)m'c˹OBGtՆe,xPj꣊)T 0NI$&4 Zc꫇T$j*;ʷۜ фll-0P!u-7/mˬoSYCwUK($` AK\;}Md8u[i&߁er$1h(^!t[Pܨ+R)3,20 #i2|*̠̣ yfS}Op[j h*O_XN'puu/xE[2̴1fBw+@'+Q˽Sū䣤fY|hx<IkJTٮ"/JG[[pw*&2Cw5:+)~I # 8>mxC%V"f%TU8j,Q Db7)w 'xo]?OYb%;1%HB\ cam-ׇ4Ǝ7S X =xᓦj0GZ4Hnl+y#-j1 [ikia-B[c)w݄ [ 8މw_詯c13e+ȲDvS8L ur 7SBݢ^suZ|>b\9$k:5\) L''Þ~kNۨ[k"TLCv9S9J+8TUp"PVŰyTxpX'm pt| DL)L6^6J OECd;ϠF%HWMD#*H9g޺"UcCx(Lv0Q)2W='$Fp~`izZn[NV.U?Hc~NG982Umօn0E,02+4!3 3n_c wƄW1Lb:%-VA+)a4l$Qߏ]?<:*֡M<$0kHt5<6[}!$RȎ%H0γ%Xj}ۺtcB8ػJPZ˳]#'iOQR JU HFc;nnI--:V^ph k4LC!pU?})0G5UGpMePT#`ذq v~ Y)n{m]\tGʺ¥XNWwܱծt[zk6jhQ^74Hv 2 }5}I/GUɚG*>2ryZT幼\p9Q+Z+#B_O$ah:m(;뤗Iǣ2Y@I;C\g3yѢ*`v㿯83r~XtC4px,>\z󫮽/}$]452nQFS6@ z#9٢SESҝCK\%Q*)2Wh#cZ_S~~<Ҙ -SBI+ =3|(:/kb3<1ǡS𯬺~} Ž RJ/ͱntKSq5}RL0̪'8#Q557kw`uNغ)iԱTλgn@$`W80?=.lCYn?5d%2CcNtq~v&NpaGaG\YQfLsШ`*+H+z:̤ ˵}uM#K!@=&>@1mNrB%%w}5j9Ɇ$۔O[`/E5F(jPJ@g,{0$rTaOF猂HtJUQ#?-3sthZjY { T$ssW#'<}559)U8$`^NvKqjU\8_OGJ @[74TpTUy4ȦV8Un5BV*nܭ gVCQA**$jL/MPd(XDCd2OG$FXxut7aJh8 OޕEa**Y( ,~$d m0:-xfL> y8vjha}u3tPf9/c: j:R)Vُ||AWp``2vzNcs89禨 i@K% O#66Unڤdq9ίaR F$)0cƮn50DJ#W*{ד8xFG=#V~o1I~ؕ;cU@'XcF]pnϾծ/~Q*V ݢ,eU\eБs;Km4i4t:?t2ۥe|Z?ow,b5T];5֠Vk-.e9U_m}TQX'V+j@dJ0÷:;OkR/hʾrboڵo55ABPyHם ps0z rF8YlR7rqRjK, ]i[wurl}u']~ +};t.*MQ $^x͹SpnrM {N#0q閘R}RI#*، ~C页l4#EO^ssZj5 fE L3C}蹧i|Nsi)I4em:Qo~$5V '蠐=AD2s߷5GiaFGӾ'%avb~7 eK FjDŽ4xʷ+!amw(?ݜ|52$Z;4 %;CGV(Ġ#(?05r絽_ELBb8sT󌌑9ۓVkO{>z?R7HCWGk}9x/wx'yH\f8ftWazqyzzJyfXFB!WӷBl m-e< v.qgKa'TDPJȧѾ~ʏ]SPJ S"G*3}~.}4Ա'N-LFVL>D`c(nǟ~_fE.~zuI %7$ʒs}(4Ӧ?e}T+A)ϩڄ߇A>5em\Eo-)*[-1|5YԕWHS̑q}puVM,V\mztȔѧBNq5-a L?G@ie 憊acC 3߾*mB#=zK+ tvȒvLp;H;8#][]]Vi:ueVOu]-,2 XmVۙ'F='QT]5+VS-AI(CH2NX6B9Ձ[yt;vRyd0 :{7H%!J79:Ӟ]j[)IZi/ YJ* 5|Ằ^HHԁִӼǨzgjݎe 24aB%ݎ h4mwSUnIp4A`ݴ9\'a*-Hʰ`Gb>c:fĮ;#ڠNy ~߿RlB:m!v\s:˕ WL>Z OI-a"`Ig5 oQ 2T3O*FT^;WVSݭQAiq9•E:u=$XժE RX#n5Rjխb>#h89ӾE}UtLxgS%`^8?E[9? h*#4CA<|}D K|ybG';6OڻKIUQye"M)ڨ4{88:6SmwOOIT֯e~/~ŶHCԾ%5FΜU!zd#td7 G$3u=yTwjoIi*m2\=@״z[ƾ$"SĚV WԜ]ow݊P}A,5|*#K<~].Ǐ(_P:Seq^H$YH9G뛻UԶc(>f|{y>'%Z4($a,W*ݿބhݚu+De~'֑[43S8iATI-aOcCꈬJG C 8#8GP=Qp+M]zzt4;ՊhBI\ؽ@S P$^qom|U36LT)% TzsNZ%FuzT)+uj`R.r*]Liwz`zFJ .12ې8=~jt9VӇA`݁o|dD"tI.#_H4FdGI3 `C):4N)yGϓџa7؎ꗷT2HRE f'u̿xS*0Ua#<5F&LTF@xa D9IJj֑ϖ<`!#:xtGHbV_PFҴL2[0#mcZ-CCENGL6w3dLM"V$4HSW2O<Xs NR]+;c&WHOno_A&˖V\p 3ß.Uw:~䯨Uhi?̯HׁƽK՝ gv{OL_.Tn MUH,獹 rG<#z,H5^}^<&%KuΧ osɋ/4yR͑N p@ kfIez$R+GeWK%IɝDY#VFyr<{7 PRE] #= 2#q'CZ#[mEA=XI$ VM,n`yquQ\TF~S<b~ߎ5**4b1 | w|-4ӳnVs|U=_zDڦ^VQ5LNPAϷmW@Xդߎ4ut*`]O-ZV+`LvkE栖Ix:dZ$ҁIa۞ڧ]e]&ډ!\! r{KV*.ƒ8g+PV z}}i 9FG,PG o2PTά_n6ޡQGG4k1 s'#UϹuYҪV8VAt**\pQW5I)W8V F9:&HI1# SDЂ}UE~Wwc&O$gU)(8隚*~}@;e]b"ӛE+Ҽ arI^a Rv׍F$hBXU\yy??Lo^1)rw+ssq5j-@urC;Yx6.\>jD Tl!;vk[Z&Y*xw0$綤*5Nx穫׽$JfVXښc6mBߏ\jk`b䑷I\ 5-3+di%W5%杧X *ǡduﭥtWU?:Bgy""uW@vD0Oa顷8"zg I\~ryOOQRX?98 wztz @K-¸xEްQw<1ΩW]jrq# MsӗZC1yOv. g_Me9$'A`3l&%zrt >6nNNqћMW_==[)nw9M$}vR"ZuEAl_]>4]4[u<塚>|Zo\XA:+5bpX`YwR\xuRՃF$cp@ᇾPĵjjB 8/acOV`⊱=hEǰǜ}]O>_,{-3fдP*g24Pd(bI9{zSQJ)z/0c9: Ȇ[&=>]Y36URv &Ü8Ɣ)^R#+4p1CK( 5`YQ#.b <#1:HɏB1wf0r.07WXE8RVd Ϩx P,7|#e(v1R{ǡu0d?uĈ..F={pby- \nY۵G{PƘݒ; kiR5 `>E#T\@9{μ# Q2GwcV֫uQ[>8=Nyu6vQeRA d)BFxdH:̎@}447!UioԯXo;Gu,doQǿ_Lz8v#<z$[XxՐM*]4bJ˽qu?U<6)2GG-TU VEf'qC竳%ZWG\asN');Lrwz}/צ 5],U*;;Xq03&i)ऊI \㬊x[7욕(dY0j&V*K 9 DzF?TˆL ZFGv1jk(/kCyt]*YR&}upwZ55,lji(i-B |9#X$^#1"bp|u[kMTLZTA N8yyo&Zh@>>7b6$EON0ߍ+` lÜuΜtd?Ki{mUM$fI eL/b ?Zu_Ec5<0[xFH,3ǰqKSt %sǨ9jTސ5.luM⃵[ 9ByUHzDu7gc~K_vyynČ.04rƒek{jVNF e. F@mQb`*bVNO?f < _Hq4\$‚IiZ0%eUǷmeM!rxնBrPXfdJMDw:]J!QP\|/](!ҽB@͸#0Vʞ蚋%- swa]#i9#]2X,vYF`D|"55I3+Si;dn5q$Q2'Ft4bv8;<QtSijiFO_>r%I y[ Z*D̎<q?Ԗ*zǰƾIL&N9V`ȸ$-6X&zi#+RDm#$X4~uNd 2S3.GgQbIPTvom`%Vur|#h'1SAvR _,U BQ89qEH+}3irǔ8KKN禛4kS 9 É69$l}r5̽U "SA/ښPuZ039cFYCbpJ؋Ek;Sq'4f UE4:L<V Y{z^S *Rw܌sGz.MQQWtҘ%D҄*Fr{qV3 A#wD%v\ptf"S=D;⫍IA{t^j{]zՒ9Bclche5H`c AQtJQR8wZ9:YKD #$QxfQ VǯY9@HdhGu%=-j#@<䀫q$e}8{jԌŤ"Td9'4(cNúK).54MSN+`A0|g89$cYEmQ(g n#ƢzuZ֡ه9Sm. aHLe98v\1Wjq6q|ճIfw(aC^"BS<ø{?AKGt3@ݵDl \$~hrEŻ<|xC S_oT裞I* DX վx*RG*i/gwCz.Yjb  9:}[ʡrxrO>z? 0ĉ*=sߝ 褒r6tQ^mWsm` d}?g7XbmXqS L>aݧS랩,]bniE]rITn#vF>ݴv GMvs:AIT^%teEMcdx̑, v>Jst\c| 99]k]YqeHv),X +*r8HMt.1:#\0b اBln"*0,}SL_dHH%Er)pF{sc # - Il *.Hi2Ġ;s{_ z JVجXE &)e8 =H}j(-v= TvΟ HMYC5 ݞX:Ԡ(lta%&PA񙯌*)h)㒎 HPvgr{0CrnMj%ia*pY@Up8>^v.*>KnzEⱫ\rz.vMRE&?!?MU9$jpKú)r+d̶bf{䁡RT6T,jdOHbTk﹒@j;V~tk6M'e %$mY㠫HTѓ kOUUrĿy#<$kԶ7h46*'grgc1 Ns 빲v9Obf] M Ayy9##8'^أL[j C #hKވ 0^>d };_Sx_t%}ZSkڈ!/,򿚿Sn<,Hm?Wb~VjXVŚ( 䏽FY~z-˽l:tҧͷSZpr^~/*lg)Wst GxI*Zhic;~ TTdj`zn ~-cVhw܃8HKaǰs:Vޏ^CUI.T GK#UBXb7d2=~~ϴAsUpRԟ̷"ebx}V7``1ZIyr!'RTY-AWӐSS[H6em6$1^0fx[lKN:ϣ-W jfʘjayܟ =u'pޯv8, RT,Q ɵ{#*~vmCj Zy\! }p[J'9|ld <=mo~uV iiHڒHݕ>ҌFx]h*AT_x TFOUi" ~&ݝx]E5eBQj }7fCs϶oVE鮓^\n5Sgf1tq d vg3Pt6~ ǫzlVw;`d4T*JT@`5uM#Oo{E!kt;)ba+Igs)ǣ:?0YzyMI<*# &CXɌg?B]e*E3dcU*Ք7(i劢6Ѻ@cZoQtIXim3V\"4 #I\ |@FXq iy1s\{ڊi:) gxk-3TN"7wbQ9,I}tv櫳\mK hϖf'ˎT959m8ҰhzvJ 8h+#m.Npx'# JMU5sz*Ĩr8&x.K(W.I|# QrJJ"RFO DZQxwa{Uɐ"BqUt,wI $ݑA= gU ئX>q*pH)l|PQ}:]7id1a $+IcHZ9$zpq<dcDn3 1Bndr~|uάڒVKO4U@e̟d$ 8'5^\%<q"8Tg?m0r<-T89-dX 3UXx*8sA,0 dUm䁜|mk'id( \#r0={d% Hm^e2A\?;h]c$;irOڣp}=tU3C-`&b_^YYs:Z SRa4(a FRNt;IQP,fyUScg<жUO?%a@<`}tNvHn%a2RLL'܍ݾ |ӳ\GQ粕Aʰ8=PR~fJy+#SFW Mn< cۃηozYJMچIP"+2Yf݂A_F hh)#2RNvlYn~6$6塷>K=wiB$ Ps c|9ũ~ÿL5>9h?~#xY5Rlq紓+ QadIPIXdHdVdb0T#V#R#ؙ>[z YjjG=MTk!'jY>IY+*D1aʖ'wK>VCMvinON-n,Hl/$"o u+7]i6huf*pC#`q;g if̄OmnvR{5bwޤ{֢{B4v @HWbߖM\ ]&OHTQŐ11j/%뀕v:2h|K%yeQ!CL߼n4~lՒpD[ +ij~6]4M3(9`0Qc$RSG HcJG<qNaC:asG==﯀tgZǾn~F͍h X5;h_y Ϳ1ޮ/ҔGM@B&qªMښSZ5QPEF y=x7JOz%EQ۝Gڿ,kCV çMW5BlG~脔TYW'` .=?ĤtQ-A}VZdYUb1w?5!r1Щ; J U[,S'ARX'+I,Trxr;{jOU*XF_B' *K;i.np=qe؁"ȟ]v;#mO멚Gpi$ n9h5o.d@b3ί1%m c-0p\N8<}Jc;mpO϶k! }#VRR\"l22#KԪG*e6}k.2KI(Kcmj E ;pTz.3;͝۰'P{_NbOKח]kbdMb:; :yŤO;rע9}eE!X'S*IOQJĮFG'kzi^GO, lIfHr,pXFF.bM H >8]Jȭ8b~zp5P{~X 306{r{cF7P!3u㏙-^+8C;3ߍ1G Me}MRXDw9? GuX(bc8$q\kΞ;aآ-$TTERHbIp@QU3iOƭ-A4CI"d.~Ǔ~ZΗ;cS>qJu1Z AK x%.$;}+2c^y?4J ^a0Ko5rKT (gb1,')k_(@i 05vSPيbVhcoG%bZv16FugRҚi$ Dcn=S_)Q`L[Ϯ9EV߉ N*(|D|E{:j;<"HLSu3Q[ :~wVD@D*=I Sז4e*`ED(9''o~Lta)d;]?TU $gp^AhP*@ G7z?]ab|:2jXfd-\0EDG0}9#Եc_0xTl@\zGu9WKTIpnVGXd4脕rDJ%2<ܞ4 Crm=*ъ^4a8RHmTd=r'ēb]_]KqB"Y=c k z2f0{2wI']Akt>tvD$sZtż"u2`Fo奔\J4ȄrOnB P9'F)+UQsGR_ m$֡6G&)hk $m!pmE\LFm=uRZ*R`#wQ7e8Kn>I =c~:RT[ jSkn![_TVX('ԘD p<wxAN2C|qƈ])(B#)9 ?sl#; K/ 5C7|{{h%e+m\HJ(#??}wOvX! heNX7OON5:uQ |N@I%haNkxsq}iϘRd1۵OFPC|uD2q@<<" I7gh ߆^aXj&mRUoUȭME>24i، ;mTZ3F8=5Ɔi^YPd9 MVcI*3k 94zr>EQH@#3 Wsg雦UTD`o,# #80mU%r/YEOedɀiZ9clsn߳-چڕ* i: Eq"T gi't u~~i$`iCEڱ;qGLM/h%>Cf V8RŎ}28j*RL#O=e)Sl=^*d2EW17ˬW_3/)ӶR#GI#2}b8'#2 5T!T'erfK8dh&:Zcq=Fq>!w4O*'wcDJј\ps{6C0hBZUZjdE4AzZ}cipYIQj8W(YG6ڕqluu$!@u n\ [w \驪-iriB~DЋOj$+ |qΙNhjdPf*!R07c3Zkk%w4sS.KgJO${ꉉInN@kDN%Pv'R㐤 hI;E…mILr)LtM ;H n0;h]]ԉ9_VAºkz^,BPȾ[GV<Î{cB} G$i$fb6I'<*"X* YcW2Aĩ=P\[^\VĎmlL>6|8`_eE)T0_ IDdGGuDgm'PÌ-rmr1Ǿۄ[O}|T@Ig*+=%lH$*wa:BfMTCƳ5;I>Uե~E5]J\P3n7%2E>1ߏ+TpSc̐q>==9dwcji/hEġJZx.$}CsƫHs)ڇLRF?K9 ǁ~X#hd4Jw旅 A20G2ƣ&9p/jSV|8;c)(78'_#%Xh <r1 mxƒzJ2VUÓ8_UXmKQII'I8bY|a`Lę yHuFYTqZP@i;Jv>YFGc@2mK*8%p}qGoKUGXcfXF(XR-e[ Lw!IYq'>.bmTvGـ0BV9 P$j'cj L}?&" EYHU<?fWd;o_DɮfaxGPo<ɱyݹTxd@m9Xyο[7j$rz>o?G 'ztFi#T68/$%Q6&5V&OTȐ#p@tY햆%e:tGaRO=34i|F@v4ՑY,dA`5B o|+=>#T>~S ӭ)sq&%Jr3+< L4}B| XIi'%CWH rwd睧=AbuJuTO3@E@C`dNqW%^ }{|,U(.(#^GNVuRU 1FDC#9  a2M7F@͔:+mY" YȋSnTەή15<ǂI֩Eqije:>@=mC~T[-?!UU>͆1 dr#WW-h^(:N#ZfO'ӭ?%e-Zv%HCw~qZYtCR$E j9C#%mL~іnZ_vKZ$/Io2+C_!Kp@9"eT~ozfv;=΂ό͎\@aWfΙU>IOvpN>^: b(~|d뉺{GMhT$PmmyasVЕMs|:N[n$ Mm3D>g%@DcU^IvWWI|a+99m޾6'7h%ݴd1MdAAz ոKK_M)ueGr$,#h5PpzzC^#c˷| psQ~@@ϼ6:ϪfVy"{&g,},8x=R<{'ː'eAׯ~QC!H 93>%27whR+VGc7ĻgN|?Seqa,`1>Y3ĤPAT|m~mQ|o5u@w8MY(@8?-JтW$9>  nq{/[[:g7zR*ܰK(sFYyNv^gVUЭ jLSmXS|X]FpIih?nhg\qʹ}@$|BZkuH^52,ѷ"'b ˞8&f!2khg.Kz.ç?gzdb^:v@F8ζ;]oE7aIM[-,$*B?R(s+g ih+RꎺZrQiHdھ[Hp3%ZKz}SYR¶K|²p[|υC_1a< |p➮gJE@VF@ BU@;H9σsU<*[x(W^FWGrK nNwUUGGPYkֺz+Q#̇1;"`!X5uWUݺ ΪpS#Q=`iNK΢m=k{@بOIn~7gtH2r~31 ?E]bꚿ:Һ2!)?Î8 bLTrל4q. *{sGtStA$iyPڥJXe)%5/~[y 0X%8v$O1[(y%Ky+7v_XU’v>dv`9wN/MYjd1斞G;6(o2@W$_ZgIyz;wjWb(iQHDD+s j>Y:O(me,0rAq2f2%'#0oxC:'שl%Wl\U3Xu!X0Rw7max›I>5j-w \I!+e;~[sfMTAbfP].u L+FJ\) X Be۶;4\Lm]l9Z:،w-X h$Xv,o ikkYQ=[Ѝ__X55 BWMzXԐ!b''Ą:Y7ŘA)O&TU10wpTn\ t0 knWȭֈTiBne& mA >u - uҲLMAc,s4AicB|(x &u:IgR$LUKLWν? nh.TM%&3-(4I30I.>UT&+Rnh~%YY{?DTZ.\ug%TʩZEepB.Jo[YU\ew[bQshP ;<\4mӕV_b9)`e1Dʻ8`$cK4+RT%- "9p 2a( LTc,B'Ze>7YtUApYjy%YhA19 ,4yZwYf) ">оuUp+,'RDk1SelNeBE( ޤE[QW)wĄc Ry*JٲKd\9}hx'+mFy Hq $P=Ю7 +wZVt -FK4iAă.Gsn0:|ZcwCMSS%w:a,{𗏀q*rKep^'uMӶ*"7qmWv%2U ,n_ԔSMѵ=)] ʑ VPrAwxj$Mɠzm2tc$D;] H`[9L11 0ueķ y4l!6 qkT;XT,̒FNB` Q')~skU0}SFI9I''Mnꞽgk}%p; )(FyrdG\T,tmuvSꢢSIr`AE 1`A$z حHSAE F)j`)iZ.`'֪`zɓ|&ry92tU~{FelnHbGe'rO Po}n_EZ dv#9-]Yeamy=韫ikD4rqǡΕwf2yq!7|r -:)W0%ѣZXѿՊ;J@J+iۼs1<0_-TUjQS j$H-ZCp8ٓ끟e0 H9nZEА$n28/RZf][$Q+U9r=c]m`|F^q$z>r0etf3ǧ [h5sSLZWm##ӟ[8% =TBQdgi,C7bO,}qV\2rÀ1o:+%HB H,1~'~}[W'p+qۻr1=:~Et*枡3$c?mdQFRiN 8s`=%yCcc=}=uQ $ M[6HO jUh%}4hYd(nc^VIWX<X;0h5]"B>N}=NYJI5Y̓JKrry'][[VܪO2P=s~ݶO^&i:,ϸdeFF-2NQh_6RV/`a$`{F ֤btac;VZ=)U [0{㐙R:Ȣ׾QҲ WVL$BW| 42;er`7E(^hd>~}>Zv<$x}~gFKur}`UG@')}"~,vfNE&j|{.HeO4|,H Q 1 ъzdg1p;w suwCf]Cc:4=u-CJpKgpuv>WKTO8,!1Ľu6GMtѴd8 vFT+{ oo mvYDE[CP|FLY;=Tv%RPʦ_ + 5o췇zզ9jy4^q<N'*r[kZIW[K?s̽=t=U Uӣ66IϦ Kt K-Őj1۰Gc 4_kzfX@EpIU$s馿zÊovxj!ڮx>^%[]cS51mn஛1!O]:5i<~U,@8M:ZZMQ«?#;@wi2Jd1ڥ q WIQƞh]41Z핔4=`H<AeD!/ƍQzU3<qGkO ebƀ fJwSK#t1՞F%{8'Ig# G֕?V3ӎ̶ր4nsE5ʖ *}-*8VMx+2 kq\(PN2N;E+~b>.}uR;,2Q@ 'D~ʱP=IIH, ?VU It🲤\H8V)N4A,X=Iq}".AzQ_Oᥞ m3!$yW 2ˀ{`g?ڂo{i:>jI-X A}Mi'+LH[_BeObE6iMD)l0\.I#sSVΫkJTt0_CȎh,uO8C\An H.D(S1s2:ԏz6"Ɓ\qn~xnnF{zZʎ fnsӸӸN0lb/QJ/woRf\bC-K6Q;xc26 |q͆ӝFhsRVCk#h'aBV?LurbbpiMk`3g',H휜5Z Uj@'ս5Io$2u WOdiFNuj}?|UiAMW4#=bH,$$ՒMW]Lsa[1m\t,6xQdzzMŷ[9Q}5MUSGZdIlV\pRs"AG@idiJsZZCK =!*p?]/HsЩN xR!۵yuc $*@$'\\}3dr_Xѣ=Aut`dޅ%ip#A!b})d-,zEM }dSdU(/K`Y2T]V~m OU[Z'x$og(vovV-e (0tuQ!8 ;i^(ӥO-StT_%³*x o̳D.NZ_HCEcwM#AK+ERq<}8ի=O&#CGPFFT~}FLV?҂*5)Q-30}w=IurYs5` 3;a芧c~fvE0ypD)^:X<,cj2 g?>}uNnD~oWIFeU*! l3،~:Y.%e Zs!Wێ,"194̑pT ShV'54'_Q_u?dM$#TAF=ljz) cp<iOK+`Iݴ?ӷehZP*eܪ~/O86 JP8@l?S4Ja #M,%/tLǩdLT7}1:j/^[#o}B@49;yAaYD~KH݁0jun$ g|w]OS̥U5Ae j5k˗B4TK*TnpgRPΪ :G_Ut;!-Ǿq)/[ &e|9_AzW ח1o-7IPZy@<KDh2ǔ@`׹u)Lb|JۓWML5DkU6'?LZm==UK,"3#ceQmRmP mnVj@$Z#=3Pq$l+6C\q uu'PU{ΐ B*w''k(`qγkԫ;cP~"m Iөh~VC=:mswf# 9Ixz)){@/PrIM:O WM(L7QWDxVUeK {?zS^8`b9<1Q_.0ЭzU  b l;rFN1λp>^BR6T< @qU)ۍWntL+810 "8>hHy s2µյbt]Tu2nƭ, vx@ڪU  A%`N*M˓Sm]T1S a|^N%UYɳ '4vISAI=a1@i8Q: G X I7mCLpT#=K y!]ܑE\Yb0N=NNY4_<>4@mQ:ejvXV*c8$Fx~:] tv`vK`gq5h3B# h_CϨN뺆1/>I;Jq y1`elζS#^GC`3[hMSy&*v qsJ/V-44$&eg*˹w('h8gMzΝHZId{{gUtw:+4rZ*, mO22 0=g sj4Bmgl==fb3>c߿[G;m7$c8A02AwntRZ,vϿo5sIkS 0Sm$z8Ez~3S#"o Kmgib+4S+L5K1DHK8T_UdW[hV(n;&R%!%RRbN~-yw<] 8 uXeʣa!2[H3PSF ߏotdFJUYC0̖}l97щ)}3xVcrL TE;A`9n8>ߗY IH1HfSB \C6MLTI NϷef@ 8G:jt<ш'GDޞ?dNW:,uyvg쉻toZ-P˼MKD|ȤYAqFyαxL,7}T[jc#wmޠd}8*. ۲`NVa<7I/#&JO@b>){d`:zjtܻD>}}ꞟ ;]:j8I4`JL oCpF=K:o}7VOX.Wv UnsJt?5%]NG k緬1Czpӟ['Ct o[nD;Iϓ%R]ш)X9*2um_(-4{iȏcG;NnUlzI_2*HK9\':."";MwҢM we[sTfI* (B\*u[V5-|SEm @}r ŇbKL.%d 'aC IhK. ʏϪ'y9(@):iZɌPYUV-,莵I +,KhvDBEI=ZFUFH sr1xCv]M̩Oma DAw"t>l:#i~-RNZ5I b ]_pHd2Ov۰bs֎gJb ʜ  1T4cV\0QԔR:&I'Rw48vRr8sӃZuǚ^icѰ9v7$q:;⵪`GT#,m吤+яntt@2Tc(%-8vY]y0^i6jV}]f]Unܩ# ա :|%AR]g7;p=5%ZZ8&'' AcGH =}{k{LL'6S;t^-i%Efب)P廎0;3SY?gꊫSY#T/kԔBv~01"/g[Vk cvݪ/7K%}1PMySs*FV9@% V9ƿٖ[ߤ~Km]].wAs$ѠfU cay{(fnVg~jњ+%<ٗ\H2ԣ)}YWM뎾tNVײMUr AXU(* '=CZ._ QXk+I%KyUW F3D 8^IU*=%߄K:!;Q-šaxZ!BbY'?@MLQu-"n Ƞ6d|BsWـsF =c9E89l$kbΈu\}/ki&눦fK,3SA2HBHV9RI#q<Uzl434U8UJThv@瑥~1PS ZdoĻóN5x$K},zs+;yG.yYɑF9~ag oP=2﫴Q0`N\YFaL ([܇iϾ3Q;+hXY ̡U9 8$c5#FUwWԕˠT/.#V5+6폲p=Wu:]:ioNM`4AO (rQ \F P>Q^(+u̞TT$g8cWoJ zhkaRe&ʆsPF;s 4-I|^@c]dƅS[N1|5=Cngo4ޢcL6vv) +rqz|9w־𢎰=dPVOݓ`v,.XO.k!kZx)&\u 9 kxfkuXI16o!s>#w\Ì!aro9-Ev.L-_iGZ+LlO6GNG K>#Qx _MX&/®8c@"(w60]+zs&VOgjZeVWmͅa LdELhA;|+ݽ0>GGkE#3m#׆IU 5fZV1T`{NPZۨT|rte(xښHJH`nx`#q."oO'DO*Ys`2YQQ~K tS5:%L1TJelnALrKQGAAKR=S-,4Tw۫HdMIJ8҇'AfWE@Iqk [lG8e2<_gZܦ{gNKv-HRE94f$ s'XrQOPE$2?Ob;uo_y=KhpT 2Nwk(la (L7R#-KUҶiSs$#'/HT !P鯢ԳK_Tu}ێ w:UфSiOIqML\jЗ@3A3i22G)Rݏ3'D U#=Y`_=Ϯ⧞(J$*=E dUŢ |2G5~Pέ"L@p??)z)#./}1+t6V`jLx'#Wviz(mXަ,4.L :b;vqҊh*%mJG*1hB&~2v|Hhih'eʟ˖iRc'r1HZuDWoDV0nrgװ D-3tt7)z}feIBV%7`x&6$8*cAOq~*y4dW"THˠaF9ծ/Pkc3+&e%@;;rW 'EcfAj:(aȫ(L5@ ~|zk6%]U+v8{r228ծEՑ.(r"W>T ڷԒ\ 7*ΜS TpAnxKvrYn< r9(}Ihue4XJiXBEB|'@Ⴃ@?bI>)m]uhi  ѡ;C9wg$8'@O۪n-uV5؋UVJy#)Q Ƞ3qp24^[PcTΛYT4QhBX$JW9E;Dp0vhg`htHVuKޔ\SZ+i=6+@N5z+'zzF`40 ["f9#HgN׶&x5ͅK_Ip1u'H_o<ǰ%unyN)R;)tGAMzhk~WBkCLtZI+'UCRB"eR3U8)GW]*RR p!1*b ;N\pFXWr\غgŭU7:,@QNv _HGF!L0]7+ʧSN("npA!yqH.䥨Q@K3w9‘ 7z( Zh',&1Jᝤ vFOaJ猿ºWw̕uT&'s}:ycS2,i>G. ‚2A'δ ek頖O"V"e+*~ddijޞs1Zq&?C u2\!UtZo9D%SldRp=:P۫:Fde,@Fd>Gs.tGʂi ;#;r0ZBR}#l=>kj笭>Z FUFR #%qm.WZe2t%[)uX*]7`O8NU*3=TU汩$e%Ur#$iPNQqiێw7#E3[,uDr3lh82l~[~*(cBM+X eyn2Ei$""n|NnwHzEҴŖNKRd]Q{ gV%[N^q_KO47}ifl3W_:V4Kuqc;o)BqVyz ʪn q}Gm͓qM;֭> ky: KVմGRHTDp6oL:F,IKSf i^Օ*w{9'^I;{Pttb /edf1m\o&Pm4tl}58UP@m!CJLj>KP};NRj L"7}x8#aqV_Uw*+/RRW!`'9wqSt_7ZkU-j0JpcV8XWۭ:jԖwXvqx;@ r{gN|ZpInO 5}Q;oۿ)5cQTF9#<BL]USoY:Sh k_*-[1+1L$@Fˁ|C?{Ќ H0$y(pص M0R+bv;vʔDw.[-fqhQQ$iR2iMLt~-5} cƀ`t68_/(дȾdx 44,{ŀ:ConL(`H8ߡե5qMU%2d]<LV Q[i(_- r?'Ӎ Wh~BM_#c zu TžfX  xW7U WzcF~Wn 0 s>oPX)9$r}@MқoQFjǾdHh蔙} Yl|}mEo1Iʎ=p˅-ƾΠTNSuioDaN´k=sBR%IixX86/ޕ&y#9Q%_(ln=G*%G$yIr0I$z/I"B8(Csij<4jvNQQ$%i9/H{| k) q#tE\$2ޠ_{I_!Zi^hf%.⊠w׶5f&KmrL*;gS(OnUs^ڧizzVzZ,N {|> ("8 m]d"HLMyo' s1Q/J4Ա,9*IP@۞÷JշLO-jIbXjrC9j,Zhfk%Df Sl?OpG_)1Eba4'8 v-N1dVĊ?v\Sy9b@ `.98ךּ4ZFOĥOlOΔu2X?3ZMU$=9^$4ϖ~ۏQp7&2@>*q߇(>}"9P$ 8֓|xL((ʋUؘLTce%$1FWie%OqaX.Ƣ TUܓ}8 *RJˮ=& eIB! FixISh-֪Ϙ\VmsO9?:,4A&/T:nw{?ꄉј+`rdnJWE\c> ֪*6v!(  N2'9oY~,?^#YOU ㍇uN21]da1it$5341W`^cgCdoc?LSAjjډ*"_,(*Fޒ>wN21UYIcs"#wl֫ڙ$TdVE|%3׾Q+uJN4CKgxIg )cF2v$q.f*;49T N~YtFVykaj1dzwbPGmFUSDrd>q fgv- ouPxO/QkIM@e (j'Ԓ}t*T+ ;hA0>pw) tֽGҝuu Ut;㦬Xϛqy!y db׹"TpIU;(]ܞTrOs|TRw $P2F3м;zX):"6cr>'ES陼#2nĔ<*BPpy#x'M0\9ۖ~&AfyCO \mI 9ӏFæ/0\˓D.u'p0J23馟d٘6(nFpppFFHBU%%|-'89TbG-D,29V,7!@?>uB9CE\ EOfI ds~`z\{ TRM M "?d}3=lrCX0=\jI])Q.*Uˌd0hX#-!f}e4駓 ˵2IjGo ˆِO+`YJnOk;=Rcޫ|5v.h鼹 R|㾪i-\U7an^*jujp3 c?]QSMO)?>16MRo9L:S}sH><$8ISs?Y.,r#1vxιh!<.6#psDTú&ě8=N=5UZCc 㶠 9SyXԢ!+VdZ9৘"b8>߯jC⪉QԞa 3T:[<:men{iTw:@7D]w43WSZa- H>!㿧o^ U7pn|[IPcx@ b)rj Q8zhFj]PT32`'}u~+ EC@4ad {~\!WF?(E*O88u5-uG5cCF83hU2XBR('.o%,Ͱr9?/m/GԶM:ZV 4{$ ùJY9j=2 *z~*+ f AfzaS+4?#m-L33|89}I[MK>b)Jyd㜫έ)N.tQ}!ff2(} JE$)S=XiӬn^s߈8R}C PxΆi*xY etsCdg8gSIZiFɂ(#9 k=,ă"6lNGLZ(S 2 iL1J|X9i0zGNO=kEV^֦'4 g^n9TZ mVN*y*(UEz%N2ԁ([=:Z5 edv(i,dDptF`6F+|He:.(7tMuEFf'sJ;\  D%|;6N O~A?JGF^' SG[Km`*j܆KYrp(ozM3&Tj䩊e"um:}S̬cocϱJ*XA5e!A92㒄n?_mӬ{8`i |-I%l1 ϧ9t7/. p')RE,((k;o=ƅě&1I傑u[kE$ ǀnpҼ[I;v}C%UՉDoqÎ~}hA}C'U=sUK# /z?v\z@[#Jo4uJ&%x#g}lt$y'1E(ӽOE88ԣp t[F2ǹgU2Tıf?EizW:ALZH({r4y $5PEO ι`e ~QvSfb_%K+>zfO2Ǿܺ&)SȞ98diB#zZ;L%==.|,rIb2ܒy'18 !b6ܖI&X jMV7ZI QK,MR7¡%r~gqlB`RD7<'Yz,)FFe(}F?-Y8ee#/G^:ΗXc6B;}Fu |v]:fz}D:$1qC }ǔzzKնKMHU{ZfXi"7V+#8\d෮q`Cu[o5颲2K"^ȇT.8 ;< bSURMR XFuV_2amêP=2x:/CtGwm Rrjj@bPl'#v}hf* 75}de]*dX`A`sZ?Kx%ZFrz%DYxWIγ[ tjp\gنA=]h݇k# QD_^.ccrry} O-)"@~VAxƋet5.*W]M4jV&22 Jp pFxR4kS$v-H}H~(JYMtm}IGbb,q|pHs"dlT=h* >P$8 ?rxs5BV# 8кK-?&R9ٱLKva29Q z%jgOYɈZ%a9nOUh"$07b Gq3^~g %8IbDV]V^p&?d\=AJ\ ÖFɤk >o˖dGa9#^o#7)^DG"ʒ 'nRFF@#?-砺v % eDJ*k}ǔR}xrt}=ڪ(dQ%ws ʁH Ua wa):9K4G 4PӒ cىͲ~gZm>?OMM ՓW$@lhFZ*,3%3%Y?xOQS;QQ7?g߲Z<Hfk[бA~3 hU;,1MԞ3s%0uRTCQV3+0B3F>tCCY"t5'Om΂J+ D<"6U' bMkZE/ZSMΕcKDq+:*%;*n|J ۝UC=}.3mQX|Sj.VNKGczSo.Ն6gXg!=Fej [[lZQt/]Kth'* A,wpv[ =BCWB ;S1U2;H%'$$Ī gV#zR:@A.x#hAg}-m匿)d{e1 Ղ<'/71gEiv^mXL[+$ܡ gk !HSܥr3ĕ0,ЕXӲ09xbfuȦ-?&t)Ajm ?k/ :K}){:BY'crͽ°E1@lQ6g79߬١z%<0#!r sN讗Ah[/RC* m,jP *[x$hEߣ.bIg S2]Y+09>gW RaެUm$LeQn 'f}Ѧ]LkSqϔz< 鈬W}y51Ӂ$Gw( *R&S7ݺ,=KбSWZ )8G j IA5b#PXAŀxs𲓂8sO z:U ]G,u4IIjgR0ȼ#-9F;O-- o-߆0t-EI?ʉ$ Fv [9$]Eо %<Ii91@[#;F},\(a{Ybvdm ) @ }mxqIICHPuXZ|ec9hL~/lQ*`hgh[dwMFBH%! Ǩ`jڋ/PDt 2ES*?N n1*U,u T~_-8t5UwMtMEpؘQID̸ iǩO]mu`E I#M~儫!%qzZg$uG&n wj!RRH}JQ]@ϟ1AaqUPÞ1퓩:5!v HPsW,ޞGсoǥAG d"}ϊ}Ap,VP*jZ6UX|z"A[Co@cؼX@?=WB;Ӽ3$tBw qvS$q -6oY|*ݨ*"X!YdV'+ n9'5hd ?OJ3"Fd$la #zVk~O1mϙTP՛;W[f(PɍrY )߾K 6`EᾡRD+h!y# Xn88-mR-ʒ2,)u *rozn:1Ri|Q6`=;vzzHZIP1IiNn>&A?w2YLetFԕ-DRSDHxʻgTTWJZ-Hqd41ppClڣ=o.ce? yYQW#I BUdmW<.~CfDe\}WE=Vt0.gw*BK;pgo]Ξ()2#YTvʑ,F{`\'xL'ߞA: k-KxCn 5 OYI ƞJ[t2̆31~ps@ ֬:FT)vNܜZ7 ywPB;:=Yg5?XtϦh+()1mq r25,,ehq]^S2IU3H8 +dXL#d+F'z߽|?<*f?9'?$4kcGrJ,| Ff[N4VYK+%DQc/GIkCn}SS,I+E!d3CG GbŃ@4pb8HHă)^rU \==ƞqRiܬ>=땨\%+=1g/OٮvU{W[WTsc!umCpu,`,I9kLQm**ƻ]yq *d6rO*6g$`*?]3;Ǘ֩Un/MKU]Bԭ6xyT=WjKլ5# *8ڡ$H?>=hf&u\`܏^|7pQecc!]9;NG4PUX Ve&g-j)LU )$::&'b_16O=Mve"E7s?zj)e)e2 H销ld@\G +-wYuL0I^U0GoBƤڱ eo1]UCܖmKmdK-űp1`v?}0VTOדK:I=4*͵#HbG`x'Tzd"U$ J}U5]?tx ȸsD?"ʟ>jO_]K4%!pqۿ+8Kj^e$kO8ؿ=Qv=:,fBC )sxEӶ 2.R:jw9pP8GYᬩEz:ll8c=9Ƭ[kod4Up0݂a{p;i{2z!54;]Pm3Qoa}p xzj-c.uhytOrs0}=~;?kUTH5w]W=IS<ᣎZ"4Ϩ8ʑ&WIوq>Z Ⱥv_3kK%ƏZ}œnn޽dUU [1? HiIxqsҥ5Ֆ9b]i[uU}5eTp3sùǨ+thU62ᎹxL&4 psUة"Apˌ$ҿ#~eS53_j$>bFR8V0ªs hUR]-0R[VI?hbn`9%~>8^peUFSC: ۗ)SM{#]dq[y5$av2V.Zyvj:"U4Ecp#Ulmr Td.H<$kKuw-#n>d,~"-1If8p}t;q&|J0@ds*J D>0FI륄<+2C{9_`UӔ)c3 ح{D!*B~>].nԴ f ,p=b+iH Ǹ.NAZ[")!%CF?=Fct U-HTYdrFRq BQQqf?]2B #Xau%e;Yw@P- d΅88TձC:ш6b>M\JZAb̟x=Mtϙ[gcd>Y՛%}de$8e"iEB*;H?L8,F)/Nsjt:>@>ܓ:; n2_0˃>da[}}DO)$LA=W.LU&" \ |X>}Jv䨜9`NNsqX9e9%ᷯ#씪z VZ,4.2B'tq[:h*DrGuʫI(h#i==I%RVX5HXFy8Gq:IAduS*!8ÀpG}5^3)gv\_tEпHs_F~Dqw DՉ?׾O kCvZ%fBvHC va_k:Ǩo-Y[xr <07dƿtwI7XݣHmX @Ir9>5r2U5;gMTSû sSR;5Eq2zv#3ΆAPjDSNbޗᅣ\Rd?LYE%K%֡ Rw5  A?׾tS7g+$nNP0b ȍ `6՗h$gQ4\{jYRپE M#OSX+e/E bd g:/ThdFVD aP} EHZy6ǿd 4@v=EsM`%SRąvOA]"*Xd箒 C;c;Ed~gZ7  l}_Mgph43I׭]E׏TK^JZYu“m<.׊!Pa}4^RzXXχ0b,uf"8NwJ^ڦfi5̕$BrH UY9ءN_UdD1?<=L{ 8V jI@P,OT* sۃϮtusQaz(}3Μf&ݙ]cXcoaHϱ9γ>n8ai1re:⚑a+d{Jg <̘%X|J ]Gr{갛4%eeorrz4Rz1S ܸ9Oz,FT1襥i}zjXOMV9i3 cGkc;TBem*сWMma게E1'm(zk*a5D KcRDŽi:&}"-0c{hgƵ(\`TgM}΄ZiyႡㄸ rvC&##qR 2==2ե#AHoGTZ@cO:elouTS[)&F,˼)c@LE=Dm4LA#;dϾF3Kgc#4'Bf6ZKuǧ:zjƕEvdyUUlٌI4T*G[v<ϮӕKCTʒ6։+d{|9>h ;\ gG<\ X(MD*#WV;{9KMJц1>_k9*Fr?zgN#gTL0uֲR?F>Y՚nt5Ie}!lƠF1Nn+6| ~!8 jjZb:LdoԀ_(m ʹԁ i$m&1߂si]G@Un}AU;C-Ѻ tJ#e>r H#hۡTuPߖFh0( AGT[[@$f挒><`OMgiT7n?2(hh* Z<7 [s)!ws cKtSVG"RfrǑzdi^e.`l:ma{C*9#w=mEziYmKGoF_9ǰ?_:V{;O=0YaS'#e--s S8mN@$g ᱞx6hЬm.Y;8}{iMQSQg:{u%,%H:HT>FGpuRVUځc%1U:~i\pm9P}'Ψ,D QT@" 3.vɡYzL_3GO&wΣpLdgoUilhoVGyu]9.N}WU xaFAy6qu:dQ30`jfC)Q)U#8=Jy6(BXiXVrqG:rlHT,Npl?[h LO{߷cur]IPԎ,e8<=Xt m T\ nYbF| cu?R=41L~. ܁={T62YBt`߇=鮫:Z(چ(YK}Cg \勱$qy髕 }HIs7 ᗞuS Z]#1JU[vƗ:fՍSarZ9k&I,ɲIvy!HH iB\QR/{"MUVPoj۩*"w?>{ZQtBuMEk[ˆ=VRiem(FcdU U٫㷹VϜ}Aw;JZJx-a3G4Ҕʲ7pN1gV0Gp%65寿}wU%rWTY @aA?]*4ETo]z)T\-2#GY4b7}Sp)'p$6G?t,OZ Җ_r#;q${g2ԘpgR̚4)Qr!܎9i4Yᩎ*dc`; EnuyVa}&gٜqAiڷ)bJa,~3'GwP]iѫL\IB<ՓƐRU۶sJ\eSR˻o-{zhݣj.Lک=N15Z?gG]j[jMUZevnO'>G5=Q{-@5:EgQo:bDrT:&=,OcxߪgM?a"4DZ2-ĨeRq]A ue2v9&g,Au5Ѿtւ]rDfCګ9Q>IkT qzs+!WWŽPQ99u cHL<΍QBr)b~;G R:/fntY5QAo1 7;H u1Wu^nJyH# )I; y35c WLrY#ûiT5(ÜH[MJZ : 嚑~)(4D2Fq!Qe=3Nk@SoHʚV)H y]'Q).gjW eqZ:)f4Q!TSr˖$`'^dٚ5c,-K^qY])Y^l X$Fr~9>uթhf}jܢFوYy98qD^gHdhfsTH>[ik,vs1bOn莀6ַwnR);2XU%BN0*(i嬽%CUE/NAsĜe8]h#O;Lѡ )b0Ot%-]EBSt$19޸s46KƣOĻ(^ b6HXd{|xkj'o.|eםNw)sIc f)#6C6`ٹ.}QI+_OAUb$lO(|#9UW76HPriuw.BO?@++|AqFy:^Q}\#|c|/afȰDW "F;AH=Dъ)`8>2 >.e|X1,uhY```dq=涯j(.pUoHi bjl?2[+Aw>_*"|a՘sr5]ZDzy$-R?Q3/ s]@YykUHco߹`4t(ROp7(9ߍZ'M(o8*r# L8'd䑥N/5]]G}r#-(œA< g*v1!+8^{iaD'Gq2w~<9kkܺfUicQnQ#{pBjY*U~닗Nw{WUDƔ-+P"DI&xVg vn7L^$z:juC]ߚUtUhIu(ڭevijlr~YZIBh' Hc"6P] )%QRC9Sߌӝ5ueep$(jKFJYH!H m%K$w ~!@se<" \d<@K[Zq D}rAiiLUvv$1\Uq~d\x9S=KS-kGMO==Fm %6W㓟G@JB<{QhQQE+SRTMdRy _;HT~}~Za<M:&#WBl#t{r$LrI4l"I a=u_H0GZz|%2JBǔx+e~8:n(Y$Ұj@9b8?*9%:{JQ-檺-Q]+5& SA%1M$t#-=^>8pG?wOBݟSҨam Nֵޣp<85 |+@WB+&V2i)a^gO)XYpvrB?=g=S꺺7⎙} ;q4,5ZƭFyG4ȭ֊f(܄\W)5 dڣI vr|5hT \=.L/%EY?ťa;;[H8 zGx\nU5Kތ8`@XuʜsnP`~w֧i) I1 ޲+ k!+WW5Uo} &[ǮB2>~{SAisyI GGھ;.35x/Uʶ_t=pGIF[NI綎A~|^`OF;Kmnh#JhkE!E$0ZF7x{iWa莙XV&Snٿ~߱:uOtWަ7zjWfn2p; A~̽]tGl:yQ NQAm!N9232hAPS՘__,=_M:\xU˧:"Mw*)c1I y^ |O8PS}aqx"*Ŷ)n~\hR{y?{UVH"۳ \/=CNe4=,G8{_Guo7WTtzc] H!,h%Xl60Qdmf:mfSb7S1 L7&F];_zn7QQ]:z+ofIY`h$ae@ЎrImwka)9rf3Tu@CP_ips]i}-^Z Qoݴpy"8 @Z7̬ps]ISckBꢢ.c nx:j#lK0( sVr2jٚ58ʬ32a5;'$ݐI}{qKu"XrviF eɏ,8gT\p[s>^LBiݽ:г* dpv;o ҫYq<4g,PUZ"vTA8F{h<-ޙP"Gp]*5;fdեѱ^3 xZbbm2 nе3H8sǷpr; M*GfRg۷׵xQLE+vz``Ae#_{Ee(ǼyOž5^vC 2]wN=?܌꒨Q ;׸)-7߳ tJƫ].FV:8v x Օ*Xm zdRwgqmP7m,PȪp*;q5VBmN)(9uv$3)C#/;A֣YV"`Tׄf7iBaVVGd0>MX0Cg 2Ԗw-IίWRELzgi M04DŽOlUz8L20"p <{w/P{497#'<^j0VB8΢dL bHS$b} {rO:95 Z)Y iZUa[0OW2(1jXT*s f v ɸsӍYfj?9$#:YWmiyI!oYH >Dh}!9c^jژmPS^I̅cWf31A|MWURW:I/x! TS/t}ԴՒT3:#Ź%bWr4vvZJ ̂yR]k20q=;i5E) /V78Ҥo4ɱPT'84QWR‚X2.NF9{$UP[h>Q7m'vy=u-n*0s"J&X-ۄ/H a!ki̍V\z۸ǾG,Fb !;W|zGRwXOɱ~硏OmQĮLg#}o m%`FL`rDd?}t`Fa Dsj7UlߏOZ;GM6ٺRӴb+]c5cL0tI 6 p:^B OmX]a,RxѩSAZLDO|zddSµC1#eAQfR,Sa@ |E V.LP9m8 >kM0:HcN?_hi*&zdX5IP~}4}.LH(AŞazVvAN1s5oLժBYGpRB\XFA+X@U wQ^衲OXB)#sDɎRitmKU@UfMxvLE~(<ʯU;$0AjzRUQOnku 521i'35 x~E%U le1 Y;f 2DjVvvu+`=Ԗ蠎ws" \$LxW==Ƈu%;1$? zJqc%w(`8ijɁ^NH矄sJdZ4H 6T0x݃{&D@;+=Zn/pT<0,H[f{횫QWHE`pAUl^v1 ƎjndE$u5P4Dg4iq `p$* <ͫ֫¢I#qO57Yx+:*Fu{oVlVZDbH|Gv18dclio5 ' d$}4}zF 7 (छUNAN:hᚶڢP 6K6:_h .]o-ę-4[JU9U8B ;ǜ 9:BNKwic)UXNH`=ן:S*`:K )PBē{o=E}Ttt54TpN뵚a0,H1TP5S"cUm=5=9YOVzR;ӰUR~-$ *5ת"@{2pNofj 51:x> -⎂h,UPRT+2E.1\8 ؁뮰i/T0I ,7NH^M4T9 W T N?깅dӭA0d>򒯖+R-W[vS+crGjdR2 k{;p@MQ䣆sZ蒖I`UkcHwIŷrObE4MtQT%=}e1R\ u#U[ҖJ*}g*Z$\1'vlzSQAxMMע1MCBG5SC$uQD.܄\[J n* JXS犈z3&?qOߨK%dj( WU⪯T[wtGFՕWRh=5MlELCƬJF? 6(QHJ4"jyZ=;%e5%OST!,$I~(Ld-)_tD>^U7M\ʯ!G0.%,bۆ6+gU9.uLEP"˄@?-Gp4-m&) ԋ%ebA-0@;,CEL ZZ׊3۬tFUM:[-u+%Du2==S9UfbPf"w=ߥFhjjdy4J#u|z9iE_|)0<`Ϊ2\"I&urxYi=NKCf$U;ъ<}7#hQu7Ԧ7"ks"4[1G,NFv%m x(.]8'hoCKFłd09az3^=ggi*嫐#oxܬ䑌l6zĸAD ʘ$UӠY20@;@`rbAϩI5zzXX.2GWZs%JCJ9zJc_WZgtFѕA?!]ZJIiQB86 c@8SKuxz$.F9Ƕ;*Yj$S / >xt֑Zګ@ZQU*a+#8=/MN)QS WxW1uN:1iX.Ѩ%1F8ۍޥ2)P>l͒;wƴE̗g^ eN@ PDDMFUA|jȹ;X{[3)ʎ5R' {gz=eGjYW;Xc8 hdCte*(*t=MkSf)u_uX>#E)bHU 1;*4 wjOGA=SU].KӍdꩩy`Tq(i 5+)p~NiWOz;n[ZuL`"ʫCCKvy7!ٹpe琤r??iޫk,ʸdLYQ29vMH^ m'::n*N %KS!h˫vpT)v?#+n3W̻cWta S&$.ewF~_:ԗ-[Co& dYlɉ@<֯ITZE;I[SV~c6Zc$~b$G3i w@, 2YV~a]}WpT%J(ZX)4sI>UpIt {}oKpuJAiV;v$P"* M8U:ߢ>^J>)5spcR Pt-`膴KM T~d@1 e +aAK1[h5 um_\RӷhdqHJbai>8 xc[:NΕZX C+=4v(uVF$3ŀp]hKlY|G_n4C9~YjJO_!AviXzߢKuKGfH1)Ш>nr0ҕBu EX_5UtyeUAgP31ov!y9md}eu2-㎚F:%8`w* L?٪7aU5$fsU-@EbwTq:.k-f5 HbFI;P8㾯PqQEk1cH2Vg16UXCmTYdvrf[®G&iԆZzu=GD!zo9~uuUG-=<J19ʿ29k>La8!yCջEKmY¦P;c?^x7ӛtl\(mu;$oo2"~$gzHqbvO@Q4G%B4Pw'> v8:Ϯ\tByN%52ch;oa?Ja_h5Z:(Pٍ?lf*$ p|ā&}E-gRWN0FAƢYn+Rӓ<YXgF8_yVdZzdJ˔NrOI#[y @M%5oK$pDX|V 8'ЖE USJBvݔ<--P#EҶuyk%Ï, NmJ}?I `(sυ}RC[}WH+LRjE'?9xNp~V5!E%夈5 T:ZX nDAY ''8:8zɇ;[;I矮U8qH6OE?%c-qַNغoMduR exM̖e, Gdz ޽gBXnH:`*JO.)ޢ 7DTd#%TJݷn<7C;I 2{|ao(y {U茉E ȰIy=[}[}EO:[T`T .G篝M454j3z*ĸ*9:a\Sm*.uJbjrb.~]mQNj5(8'?<5('ullcwN> \J^x" O jᬯ$b~0}8<~GY+/Ć*5bĈ18}4ZJ#+PC|$)3\XHqrIv֋TUZnOOTFbu b !v lus؜<\bk;y+C?mf52XkEY'x_v}T/rO:d*콵mE1Gܹz~Ü*S)]-m|n'ҩ(&kp[53vA#@ v,iL YWh Ү*jŢ,x N@+%5C)5OC5HuΣAy=}5b6je ?:`}Z J cV>;c!2Gmzr*J*S0#$$c9p3(񂤧v6ZΤ{h6_.t6JkU-O3 aRw qYn FG:+f.iǖ zhfs Uծ8"Bn[eh2`=F9S*nUotpp~>~ h5jhUlYgwv᳂q~/D@ɧڅFvb2q8N( [;X]Z$M)hWSKf J)Iu T-ζ߱os_L=@!J,54- Σ-%(]47;=)]nM?MrH⧓uA2=&("?/?W%-\U!ԬhRBܐ;ƆjEX!A,qĪZ:*JhYԒLn|/}3Z;El~.%+2:iY]x thᔻlb{ @.l427c  s騞܍JcjZid]qNԣFG3n5jVXF`xdãk[VU/ecOt :+PCmxj8; q#*~Ol(z8ȡ X9`ԫYM_? T=HxqpIROOGH٪}uwΡI$?xgM~u6jk|Ɗgoxw -dԭZAְ+JZX.^Sl"S8.~%p@cԖuxSR Y kRGuc!E[C[!e1þ1Az m-;U7<@8agjyձӴiS`/h.nSRFt$QI<`r{L]WEn5,Qjuq'QE!nܩjhʆ3EV!I{ !QT%x$f-.Hr2I9'ATkteߣRq+R g8$p;~ײ(3Rm<-kn)Ӌ4-U YCwc3BoSA[,T v!kB4tPbXFI>X ïk=CS`x{4]S܎2̫<?jƭɵ~6;CM$q W:3ᗉpeYd*WE"=MG b"f ()3b2؝곁Du1>w 1;mS\^5tiEҜkiXi@ěXFƕ^gVJWUb̹ : ~ˎV)Z#HC@(P qHԭ#H6|g 5zgEqM4J' khg,#ݩ*k^-5)Yݔ.䅍9jիSŚe3..X)4 2|coYt=IK$(5B'_r[luSE j:QD`:%.)c,,Gő5ӧa딏yE=e \ U~6{%GQma٧VeUU*^i*i ]>ڣjIZ._-K;INќ0miƤ5d8ۿq-;p4(jc%3ti uI 9 ۿnߟUā뉐c;*P3(wDAIx%Lryqdla'r b5IbC>C '?Ӷdj`:D,SJQla#?GEQ憦}\ xOGQT\)͊ !y2Pp99eAϠ[V}: ^RB99sȪ2vD \ )6!*GЍHՂXYXdgwzL$uR.1{8NSR 2R 9 Jș KQ6R$A{=.zXRUtJhÆˑOa#Qd'~{{j\enE U21Gs4˾*]>d뤷Hހg]GYy?6}t1,B|X]bmHl~Z*ᨧ#;o髫K0Gtt! <マ9:7[R5PTr.unE;H&'| P @8; Q6mfIT61Pݨ$4F(qlǠbQSKW2pxx:9 9_CV@xAbQv5GEuKk1i=_7ZsG4E}??HfVc™&FRۏ8Yt8jlHc=GD,.c9T֮VK-ƚ بiJmQ@b;Hモwn],UET4lݢ$|9*Ð` }T .SGY:@E, m#tϯ[=S=3[>l+c@>@o=AIh[kdji*UR!J܎y-G7EwFLL3ُto(a?2K2PO]cWR;|>Oս{T ʪJr2#F*6\k][\] -DQPI}}sʯ6ue 7 ߡP~5CHV5{'5 „IaݬxiM'Oΰ&R\JB"] -0OY=kmWA)7M6V.˻#nrܙR@CFi" jSU?ٕ"4aOcШw1O.t8͆Ksz:.0ռp c$Vo:^7LԻUMC4H 8ؙSV<65uY A|I ɉ < 4_]U*"S̓$Q);XB2@L{no}UWH7Vru=Sg0`jcCI sև)Y3K+F2Tتx%xSŹl׼žMITMq\pO-tY@"]O $|;0x}3Ar!.6'|uSZ*zjԙ&. ׷]iZ+IVDVhUݼJ$8mslER7;B6Ved v9[&M,Gܓ'9 ;qo~Vknk%lQOW4aw9۟qB0N6:JMӑI Fi禥kEJ_P#G,ThޱjpIU۩IಠaU~"EQ ='QAHԛT]1<`{SuAϤ+:-çԼvzly)ihbપز k|-C|SǂX[mWb̂T3Cٻ~1?]a6hCP`{$pUBv c^zYnz:K2<ƀH#3@HMq*@^'۪j!STKRIUK"*ǟ:Zxx^1G%QW'U) 26? /\i5KS]!U>2~,V^&_!E9q\WK +o*H52.mq=0[1"Ro)(Gc.W8y#*{<HwQL3RDd\`XW |f\Qi@Ж8O#bG8WzfWa\ 2)& Ĩ`V!k GiVyC#p;r{q~tGd~:W5$G,dcq4.t aiJ\R=G2fH"008 hx kEX厪2E*|@Fq)<- 5P] 8QU%4SȒ7ON-ZF@ꎫ-nb1$bùsi- s3xHxVAQj=%DVi*uB1ʱ33,c{>q3JH/U5\bWxxF'U^Fh#rG@FPS/j-@=^ZV&F9$]=~Jb\uV~cE'T9iM pғ0 z^A6-A&]F9!Oo*m=5e-gJiI*s؆R<=$Dɾs$v0tNyM2(&\-S)eۏlBu0!t1ϰ>yL@b-yb rSNF;~:u؅ǨLadf G9?=cTUӴȱB?tʞ+8JCX\u98$(W=zEZnj4\*B% dm'׌:c#ügp8## {麋R)XZ1brS `{WeڍWza.^bʰIiu5vUY[Qo"‚c%  $]'>znt7˂u(ô, X#&q {0AuubGTo3=ySALVg \}q֐ !(7GnLu[IU,;d #Xښ&;2ƒ c}̮џ/ 1Ć|M3Gۜvj#S7A=GMM=6i hgp3W/hcWqXbacņ(|*`43U`FP5XfUO|wlT0[d#X1`-&\jҨPRZ8_xE?nꥫXi.FBHt4VyeXc˜."753 M ZF$0c!8yDU5a-܄# W>P.d41GdHF*orqiYđIC@s?B{Kԩ7bX)-XGccNG C뛝B)#';mCo&:[h25(2jnjnn)ڥmrQJE?/AVsuRTZxEG$uaӰY#ghDvC# BA:hmkEmLV*IYw<MC;fi@'VԑRd-#5' #,Qr Klx-TIVlgpqsCqgr:~T.. tyPuL ,Emʲ1eb3yy (|eWޭkdxJ>?,kݽ͓?bnRlRڨ_)l4 E Lc,p3rzB$t6cMMK}"[\ c_(2G継x˛5bV$ɒ=&"psuJs^PAg ʦ rǴ*N; |=2UDV.s(A#dDf!$?,jz[]4TO,,8#H%k䊞ʘTAH=>ҭ UL9)<=ҋYيf("-%y <viy{ 6(luԕS,tB@E>MZ^V%F`qk7adyZ%J16͘9sgA֪ʼnI@w ECf,c;Il={eNtG̊V%&GBmxVInRɎTpG DQ?1`JOLسY{ͣ\h8R̪c1 lcYι6$kOuuξ#z'T\!u,+U EUhO= T$NxbX͎[':w,U4K,sU0PH:8_A\Iki鷜hb)]&q 'WJ5VYg\cF`)/Te L՞Xh+#JzhɵdsZzgK5do'j́69n^ SSf5ut x>+{O|E~"q`ja@sODjazǶdDJU3< 1T2 4S%5}=-O"Pf;vS \([%H,R)F;DaQDY'_idS~H>Ag:z\jz~vi(k띫^:qBx\3gh8!\6 2 "ei3 Z~iVʯNța?8g.00N`OC+IL\/G$aX܍g5(û0=ML!}OLM|࡚MBvːep2AOmu'O¨KLI*WHasCxME}>SQnBm$*rs;}Nu\(Snѷ~Z]F& +6H$AK?ưJt:ێ8k+8Uҧզ9v<4Fۅ;G,EfDrSb'DlW$ȩ]Yeb)S2Aevu?c;\Uu?QICUp3!%L['TtoBS]y-HZԝi5]9ֈ2Xl{NE V19>gj:[} p~#< xūmDqMo^ !'$qZ/:]%RZ+)e kTa+IPXڤ3Y-U;5mqORѓN~ p BZؾC驀Reٗ MP#-]=>?01e%pW8龤 ڦq J0x `2ʝ:j:RIyTӧ Lunql{^ e|3Le~IϮ>ӧϛ5@_%d*XXN.{S\렄RWb®Y (qu 5CmeA ߹$g+4W}Ƭ"Y[U#o^h "OrEdPpu^Hx"-%Q 'rxj{ 14UaqYhu]sڢq]s2 Up#˒x<J| K{޷HRE94#R9'ÞY+u%3P?߾1m>]d/4>kIuIvg`9:]Sc}O8U2ΞzDd2;`'+4*]ޞ)AM Ipb9#T)-:{^Yb\#^'@]^bB[$nɰYptU,T Jt3G#M-=4 ڊ=N99z-!gYFNX]|F!}u:b%S7djҚ̙ϔ#q*S )L}7 HJwc1$e~v <ұJ@dܭ TrF=t:RZKnz[4جZZ1FX3gkֵ2}K\mW^(fYC0L0Ac@xl9zTknؓG7+d}˖Z-{}y֞ާuWOu$52-b-!d,$Vm8'qIףmMOܣEtZ F 2$sg_u" 8:6&bk[C0+)A 3w1Χ##G<H՚Kb@d]{-eK#-h݂Sjl6͞Aw6?O4E"6&Pq# " K^/ΫzN{wMRJ*).8!˱NOG5nWZx$z}: #*ܯ+=㾍VAӔ2YH9TS͊}:.w8inAMKTiv Ny2DM%nXzS xkcyp@p`@"YɔZ<җA OnVTQр8bñ#rJu%m >-St9=iAH & 䶣c;k3CXgd==G?кD?24Y!i"VEb60quAdu5Opyy0XAIbs9;ԑ1w r i99ueDT*Ȍq\C@g&6(pzH]8g :*Xy Le3u#LQ+Lr5$J%JprݓDO aI;On3n闧 =ahp>c/#i•,aI*Uk !Z|0»'YKԐQS֒$'j}#-¶|TZhLѶ7HL܀=WJUW$5 dU,?76S qUZg2bpg7X.q,do!1p>>Fm'ħ=ъ;ie£.vX x@aerd nsϳs:Ż*W)w ;wZxҎI*h, r1\1zc#BH#9OET]VCs53vjJ}&uFI`;ĠIvkDh] fwf į9⒫˨|xs.Vmj'iL͝I{"yp-ߟhk+eRWǴ1.V<"SGuEmCfA7-A?0[ꞧwb0O2`~4K#Q&b$sMOY:fhfci$=ʟAeb3?u3ӌm%?*jB\d V"TM2It&hFYxT.²>L| فOu;v$HDKHSƚkm% &i;g?=uVӔK7 XF ;y@pzy9ΨQxSE(D6{IX,Z3?M[i+-!2)P<'KgFTiڄ$ξY*[~ϵf9q[qVe|=ymhjZ.5YHi86|)9o7Jx eC13l``nuC8VBJ6F1>V-vU:]@W9 F0~:ӥ|=QmG/f,ݺ~ݢIa$m*IܪGl~Zw<9GBB)0v:t-Y+:#R*xe*2dgi䃷GqMJRS$YWꣲ g#qG)]IV-D mT@`iDG) r8Ϧ1huaKA]Mȍ&2wR34e螞^ZdSǽUw2~`FsFntTEzuPr Ip9t-~{:Tjҷn~pu*)j/"jE&Ictw<yКҮF<ۃVM^nI٢@T?x>zkiovx+鷷G#ҵhZR*C#DPFQ!EǯjeJ (yulT@E:S:n\D7zL@, aԶ G$2Ff<ҕ(rrާD:C YQS# JWKGn9T[.IO_O$lFᕇ v?]hNM{?:/WUUԋuʀ; 3h=à5}C5Z򀠄#\`YXc UM -Cnjʣ Q#Ğj_!JʁWzkVnޢsvjgJt HQ9* sjZ`P=i r ֬},U*|Ԗ:*%v|+Ɣ*(8c4R>|χA'羓BH5{CS.W79Fsh4)Ċ{y珮H_IiH#F:~ \sKX9V FpFF=242!=.!]At1$j! %Y%$ex,r[ӏUs9_-W8Nx:lw,z}3e:)awS@- л22IMr:@Ze}b롕4B51x6yΫfK~eBz鯔N O<tFҷ)k!2kY0pOd@ ׶:Y ނ=7% F =5:vZd-5䎢y 0(#3: ETpT6|GvMmtS Fa-W'J_S3TR՚7J4GYVY Gj]% !"XмUXੑ!aޖ}dm9 qⱊ&DxcrgCs]CRWBx-m}5\^$GX$R @$lFUtOVoSR$Lu I>C% SMs05;]tg5};uzTejUHn*%`:I?ڇ:[4vhE K,,\d#nT/$`5‘avZj]cukaP@(h%HhdJ ͂ RK}Lc +)1(| ;r@YVPU\-l4W.\,|,7|Ћ_2E'L[MAR`Tm=PF> kTJ( jk<󎄺av8Rc?}C%T*ʹR` NJ9$pOw:IUtޑWIAc[1**d2o WGw z]RO*Gk4WIbTY& Bl 'hڑwcn >+VSWQZ:PpCc x}KUuG= a (+{!N$1Zg^CSFSKTFdαͶl%Damߧol PjI6,YӣG*:r9#6=j*#[M$䏋hy\(' q>階f5F&\0Tb~y.OIkx(kR"a)p3 y''媬4*VIECC]Ao20; $gv{dw+MOuVT)fUBHxRGqs usm"19nĜGuOYXoTB4W< 989Z/S )" mI< 1D 5#QKTuP&ibD܍A黫k:y#gܪi.>5o$K>̬"T*w%H?PTTD噈SΖz%􁈎ӮA'Yso0qcXOKQlZ譕BpN=>r?/QzGlJѱjmB=7[-*\t ?8de!(pACPS[EZEjp&hhajԈ }U9H d{뤇15MDZx8A D_=Kt<4&2RD-]*%[Ñ\\gJBڦG:b[zzQ# 9,-lr:it5}5wl}ԢAQH@Br0#* 6Ku-E]#( dKYnm: TS X#?N0@ҵqB?T*zzr(k% @H݌|Y<$Oң*C5= QK,x4OOTkiAVuF>`Wcu^zŠ(:uifZ*U(,sseX|*`\2C4[rU,\'#4Z^KW]E==-/NXDQI#UK`LB:)m֪ح_g1D2|-Ou] _ot5T*ȱoFf To8n\\en0mQV]zS0,jmG$rğ7HSWG<y2 |@ xjo4CMwRĢ*fYNHeDC|@PܝA/N =KM쨳TVy2|`VV>BeTU,@iޝnR>]=%'epli*ywp_rԪYMUZV2 Axnvˍ:V m$m.cC:N .SWZ}rm*wd7M|-GXHykW&*h C'!rxp\@~W 0eSUv-Go3$0U2ܟMl&UB FPQpc'П鯠jW .Z9܅ʠ$ o~4 ¾ŝʹ |CMWY*) IYG&ǣXT`N~l=="@Ƹx td ;I>׷uTn0AQwptC [B|:1ߓ$6^o3mWv]GqH6*bP4ͤa. GzKPi3 dqpH XUW[M]ڞ状q ◁.89=3xhTpE,e2vAUjqI! |,5UUI'' irs5:`Jwd.FxqIyE+L_&)&.;9jÜ}xgUm鎛]R,"@;<F\*{A]\ 4c$q@$glZKr3=F vxZApn:6&MK!hӪ#kd :^b kTK⩂:Uh]+w– mJPTZǛ%@"!-N2H2@h;d:+ַ1A4+ WsJ;K%EQNS @0RER?yuv~V_N, BƘ1Dzjo[hV⨴4GRF=;u}8zii LK!烞>~NbYE-C䜩PyƓ%9$!wd`/R)(ckql;}\EKƌ"{bA{E:kK(K*8-럁>p1ܤ)+2Ơ/y#Ԝ~CܤWj 8{jBNK5,>kD,,"7}, 9S،TEIJcUtR]Uӵ2T%]M7!Z@π|FW0]wMs?UȒmӐ$d۞ IÒGGc"OSV#o&JC+ö?̓q_Inz ycel)M۝!o~*YCp΍ :Xakf:j֎a8RY$lz[\4_H!ʎTyG$rz鯶ԎM6A'9ǰ JOZU;rt[xmsf+@ACoc<FL X22X>֕Q hJHGőf(z;躎0ݮ5 s/ON~ϒAi tEZr 8i>: F39q_S=(-JX 29wM 4ïHB]+6ʃCE[rtH -g-͐Fpq綾KzwoFIK J1'$Ok!! Z=lCr:-K2ļs#1ZEݮۙT)u68 lzh h~eG#xU B8TQ]n2GMƣT_E;9'^du^}Zcfzg^<> |,tMY9BNH_5 Uc08g^Ï2Do+oskx:鞅eSxW:Z<$m]Jck GRO{te: q܃|8`aG :R,t~e"j&I$eJ*@o\pF&Hč5k|Kx[rmvÇ{K芋-.k$S L#Ԍy_{דh:HdT"J݁ų9PK7+uut+-=cU]VuUwŒ;h$羓/:UMi18IB|1pԯYw9k9z:EY.R"E;c{Ƣ3i_bSEUiV|~ZIZDD+qK%@FK2 #kFS"ܼ7{Atgh0Y@*́w$k2 DG W#KYR51$!q)U"W8sEMS<,F~4EWP c³{ZmPj$*"V6?w46l31 UJZ|+l`s~:h(%U\n*/voeY9i\ss=-eDSO2mD hW s}9O3jax a}zzHfuHLܪ ?LiV]sԶĪ!,H'XY[] U 82CZ)W>nuu2'W ,~5,{>߿k;yVJ$]2C&8~,8DK{}#KQgGaV%zK _(QӴω7c;`ԕR62,/]{~C#bYJA_ZzTA9 r@H)d O~tZ)(L T_C,vCW[ Ȋ b7؝Rw'aN0M* qƨGzi49Ie.1!a"82=^-:ĭnYYagB 2)2Fq~яMjJzjXQP2}{u)f/~CSv/ SS-:ZINK`+eGr9ƭ_lE\NҿLnd W9NU6r [[4zzdw?"P${9?CxִV 5`BcQUT{˄4pQrOc4RN"}=2{{j%TjiP`d;J/^t}&h_2gF3 1T0\M KF!N}p SP^[ŚaJjjyf M [G=yy}z6qPxRC&ζ&6[_UZ֫M 0ޭPƣ#8aVPQiժvcܹʣMd└ D7"pXIǹ>'\}'_PO׬ʓLKJDŽ\ -u/|^ZJީ+6*kn,rrr\Yz 5**?$eĀ988#qi bRN?=٨a{ țFY\n9CAN'qSƯ *0Sk:zZ%Ù'< ?{#g5Vigd90s d|bSj6"Wo*32RT$r0I;r=5!bñ<~ZɷkfsEcbXˢ2=)fʪ(R\x<YXkj#҆}V#eVR >ObmpTUQb'gLjϱ⤝ύNs`?{wuo?4:Bm}.ѬSĨ:GnSybjrr̿9lpqkbZJ$|;\\%m%ҥ&R(H$VUoOD 佘!Pi42];QqöG& M304W1esΧ_.*Vm18UZ̔p5|^;vɺRh<*WBx~9̇2Tb5Vk-i"@ n G˿mKt7̥)!Q@§$hFgЃǾz(:^YmUAK:U Z6@%UPds89o}-Ƿ%3PݱvX @Ҵ2ȑ$3 9p{؏PZmt5(%\+sc5-*NMf w,HWU-Uu+9xA*AO#OUV}o6JX.{vxC?` L$ҹ2۝< Mս5u]s-| gI)QyvU鎭J+r=))GBaP#=HI4|ˣq4  $n 0;rAqQ~^ˬ**Pd>Ds:Wm7WˌqE$feIPʧNa^]klW+Ee;AV-"sղv`2ꋊ [_Ɠ8P>yC^GUVFVjHՁY%Vfd㜌;Mtwh+d 5Z:Ka$*Ϋ"Ĥ!9188;I[FtIJ'<ČҐߎsQtE8U;zG.>#\8cGY:vxN T.Hݜrv:z{E+,4UѴ4o݈Qj:Sۗ)!HBG8" x8kֱx[ӷP[cZyWrQu`m9 X1zIvJp΢UYYwU,>!GxD5)pL'9zϡ:bKcÆ4vLml$` {w,V)*`ɼ}䥦fD8#<~_z&ܔv=T#9>\R}V`BZ#Mr!JgvV̧(jۋJ ƲΨΛY[_ ,n*[wG 1y$$i›Wzikޞxm^fjHE ^ ek =5giJUrO*-&9]nHFQ{~ ]N(mFqq  BcDqu8OM^z#qWT(kuW. [ Uc*J̾Fp"?P]ںojOUBo:zWIu.мı ?ڦn֛wJRRG"EU;BބʌpQ܃qlVZt{2N@>voʚ([d$c}xiDAv7cVzzmKrSIQ-_G<_O]+m麺GT$̡(2Nr dg#̕-BIvkҝl*CMoH:j۬+ASr@lPdʼeiW3*u?Xu'I.4qtg;(`T8 W n;BX5u=|Q᧊"¥A]FFUX0'v*ۤ5Չ-&7)g9-= E۩W⾖MB2$˸0Pqq;y9 UiAۯtʲKFM]/ޡscmo w^WPݮt7:)?{U2p1x"J0Hm㍆mlY:"p$t nú/5Sc p77rrN2tѩStES2 @r)ˇt|:P\JKOSQG,`{A@uNuOMETUCխh8 `vQx"zLB p35tVDkE!%#3Uz&xzRx\nyۓFA g1uGF{-DV7c 3*mk}]ۗdg LtԝeRUtH-D8vU8<yzxOJd;Sт2JnR]SFMM917 ,IWt+PFD9(z󦋭Z5֊OP}N W=p{ަu}ȁ ckJ 6Q߯YQ0RYׇVZ)$WF!I6RA84~F%X"6pp{_Ͼu}R=?L)8,@#+9K-Hsr?9N8aq}#ie}1ݻj-7%yɨ?S˟ǟm%"X ?>?]IC!Y\ I%MEOviLV'Ej (8rp-8ECU!DG;ۂ Qδzނo& ؕO y{ktW#SS_qUI$DT0 R1pN3Ƒ|B )px!pXpvbQ~_+'GT*m8b/%<(eYX>KJy#z (UWm Wgx;bÌ]nxoGo[LD5THsLg*yo' n@8iSݧߙlGo> !v=NVg6q8B瞞))kR2oP5tur",\0T C5]A1SEY<(e.Sv q'1֋LUˑ!I`)3rF=5榎Lb;=\Ij70T,?8c1*ձ.[PLTU7j" d4F4EC8Md{oRMwH֛ҘĎ0 {`c5GRA$qMvCY< !Rc$puIs=Y1eðۭvΣhTTtɨJR7.h@_N苽nY LѲ 7;x/sۚVur0N+=y~˙ʸ,q¨ j\/ pZzL-퉊@`XlGMu*STڤH(p>yi~E$CB|cg9h ȓB\H*ÐA:ո7ʮvMvQ+C7NHDaեbyjrsAj=QY!ZmKU`ΰ(_r@InR-U=mJkL epOr~Zǂ=.W ΜZ,1xL%Uaq&Ns;7Qxos|v].; TȽUܠ$9u%NUխh7%\A33PJ9zJeSIEgjʪ*V32M$vrʹ[U=4}k ,sFx331lnaPmr"ĊgSaWZ LJ"X e*FI]q7pOoBEtpPec&HK4jXnS@݊wj:ii뤹Oĥ.HXW)qfKsKK7PKJxﶺѵeWe13.]'{Û4QҔx^A c`1ˌpsuz~P(M?$jybpcqQ$[QoϦ0DsK;Nц#t(׮7k\:5B -FwmuƢک%;}254V}kҎt{堛͹$H ,UTUwmZ&rxR(bӮY 9xj^HZ%YdP$8 %_!wUCy[u57S:ƞi*Fpc8-@SlAu&[!WIMpje|,9|gN:9$Sm b "q.KsL/Kݺ2a{#pǮ} 0/ 饕1".v˱ڊW94hH Y+Zy&F3F4S O,*99#p8V=c61۬UyVcRQch P~H;;x[[sfhcNPH=7߿@K:z+̠rHփKnUEWDKNv[>=nG}f>~ʂ{gD@@ɝqtWSJPTo4KRoW #'2da =_ټOO+*m#1N.7(ުGHݾ68sݳ+!e-y" |YS+a1FJZK3 eœO O-,Fr ,vνO#o cT1KO#' 9 68h1k߳[CV\d 2-0m}71`ek'0cbmocRh=KE8`V&S A#>j|yEC cq^CjtUu$UO80+#':Sֺ{|\!N ۽Rx-c%i,OXیmTSPSKp(aH?={OznsGO:qJ8)pCw:FswkEKUG9IG%D4q_pp8z#S#=SF&`In zs/3L;e~"i)L(m7?/HB6>=IIO(ZF%lq@+ paI85~񫩢r G$ Wc0UTr80 #9.nBk݇c<郧 omeKA_#2B#Yt.%vIRQ@Tqێ{3[z925srnϯ=>f}yeugP`)Ó!a,IT P)h,a(*@O':Щğz<۔RMidy88c:dZz]3?ϧp@϶WA,8<8Rp"nb8˷sι)浵ceIc̀>3 {^?zg8 M<|I-9t~Kj䀚̰&d` ԙ\t<".#irZ-On!U3IFbN{W]GjW*ӸDeI|  (ų+tp63@O zc}jB%,GQ~kTtL̦gs$<CSn<|9vHjm*z+MUSN!ökjҢDR?s݇魃<5LWӂSdd':*;S"8YcFs=46hGxtŮXi#c̪;N 9ՏqZVg0&ƄA .~+.,S3Sgٜ)UK :>D6\zkjJCu7]0 $}5? j._eh* v}rwdg^Zh`(ng=~Xu/پZgO SiiVDeF~ FFr9Mttݬ`{בֿSMWQ^yGJtFBH&7zʂ\nRcFv$ gǕ_*FiWk`Gv>tKxi%Ӧzmʖ%UL]B:a$u=RYdٺ -00Em t?JAif3y,ǀr~N4VHVꠑ[; {8-(g5DĨ +G+\d_EqQq 1ժdȿQ%|6sN}yǯ|m0rAnAޛu$y2 G{[d2JL.H|1#*LL!UBn|馛GY٭"kO.QZLAqp wFdD=p2ݻ.x *D nQ2j%RPXKA7^SPi`c$tPO`rNVS$`O.Hcaf{z.?c:j+,"u*.kX2Y9"!ۃj/K2-A Υ/*idF 2w C|씡v'lҡ/KSR"j=% w'nI;3]UY#s)(gGp#n|4nG`9?-&` fˤ̂6E cpIl{:K{`|HsGk#ZX@W`EUP>s遯W0h̥ hc#m-R`4?lxo9#L<};k<b*Ig'MCd@\>qTqTRfvnx'=ePo~Y/ig`%d2b?ˌa.D-F)*J?OO ގt!BXf q϶=4tmCY$2(myū<=OnJ6EOӔn;>"ttK%: iזjۋ-wȖR 81Tszx$jꄒGJesF}5dF,.Yk5YF߳zB( =<``;/aHjMC5\ &V`?O`31iU\I8ܪI9XǰjOw2_g3Ų9W9LKyWW @?yFp=~L>M({sk+<8O\ ] EOY ~Tbx?1ӟTԞ$7JM~azmC9ʒ0{i/TrRIVN#.LGϓm̼0r~'25%7Sq}<@ FQ)WUM=mZir ۼRKlP{9=<@GKdWxCႭܛz/PiT !P]s…'F9#,xm7GO%U;%53g #Hn!C>Y<Tt7(C #̃۳MNQ ƒŵi-+AhIN&< UL9zMZ|yiǶ5RT%5>1 qzmEu|-MA($̲2ǧ_TN {FIޮY~|Nxjz䬈A鯡&#߄OPXc ~/oI lF$Չ::΋i@Fllur_6,R=ۀ3u/chDi&c@W~>ڶ4B .0~G0|-e﷌ՈW&95C$[?Mpq0q,/$ ٹHm?5EXvO3ێ [EQUOJ3Ir,0'45F%nM#t)d>ESÚ*̞5%[QD &mFIre8hZz5|Ɛ) A#]QR @&䒣9=OWzE6S9[2~*J;d zpƘz~lSGc\#׹m]‘hϞ3MM_DBH9z]-qO5E֙5)h|*ije]ns'ʐG1oW+8WQ$M*FJ1.xxUm K;A9 {^PSu&=l"t_lO IHD-"J%JXR>wA'ZH9Bp1H"4^Lԍ=S   "@xs).TE%PɂAϩ,Y nc&ጏI/3 Db95z E2APyA:rd6X)եx!_l~QH2[5!eE%!}1MM4Ut QG>Ďb+Lᔀ~RF$lu6!,|4Y9*V9 ie9'8=ϠԯSqS=%=4&:KdHSΑBi 3|ii祿YjcGK<-F=˙a\>A^(yOBS@9KSLPER񺟸p}q$TK=EoU)jpjrC>sWj:_4LtiB>X`nT#L^y9}^褧TS c]ErđH0rɜ: Ϩ HBUoٴVϖǴ~R.MooVC")B%@;^ =NTT[ah#<2A1 aBj+%x#2a,IK{6ۇJmKRԅH&19lgK *Nc+A8^*ڪXG6 Tlp3XѾmoP+AR^8ZK^URxDBo9&6`\`UHWor99lԐ)eU; ۉr2O x61HPyjw1@; $pTZzJ a_RxE&-uMjĴ!w2*%W;F2O8zEkmԕb $}ȥ.Kgj q68Ƙ(:Ҧ$[%\9[oC=qJ#Ha ut؟/D@Ai8+WÛ%uAZ"2!B6qUW~/NPz+T$zەBSwm8~=$OU =e-6aFi{4y'Odsuy-Nn (X0P 8TJ}7tb)r㶓 ZʙR~>%CdF#;C 8rAm7 ^/4En r^6f FO#h'I׊* 'W 7un+}QpeTf i!őm 9 ʟq3Й԰M(9ۻbkC{_pJάRG!$p uF:ނR2 GU=S-[dt i$89#FF{RVީjmC{|٩"`f  @v#Nq,N#~.]:ľUKIn8䦅aq/Af/Ch>#*O pXmr^z MHdEiʴ|GnJHc7@4UGB' ,2r#2yhV\?KHp4(I-Ǩ/mMZ%#Ɇ!xF>1\v'UZ/OfjH G C08ctw|'"[h@, !5H؛APpuh-]CjmΑT34g833GuBYV&6<駇y⏉=U5U35e$*SRQD.pTeU}#z|Bnf'P,Z86nׯ.mwl3K ԟga`$$_$b8)miK0ˎ/!f˅_r0 AӨEiVzhsӷIx@9VSvfl}t0;!L=R3EAMv%[55EERKFo*!q* 6[89H޻dnVݓɖ5fY8QyWFOP>I$V&OhR*s: 닱=WGY]""zlgZE5=(g`F2y\e=!*NuQE[TяL]i'^u&(+Z-CՒ 6mvOSictuߌJ0sw+4Q012/`[UE%[D`I3祸RIPJ= 0{K s3 r]NL]WUPœ1𠜐mSiX@w}8Vi_f--CgQ8 Ojm}[ }GI8 p72%8־lrf[Wz[uҕe* aΕ(i&|S֣_7j 8[$H6*cƴnO֓)(㪪iJK䅐c%x*~&rl?Eêyg(_r'^*%jxKON8b. +ciqxμ%OvcT#df+cn ؏s~xNj C\k|J"=ÿh*t atzHlT;]C7guVP؀~ 蠒Sm$Gzj)iݓAx鿴_VR^|1mf\t Q6BAҰڠ d԰Z(/1q+KA,'(;FO<%F=IEG6#\SOE@箖YF$Ha܎FF/Y&-5u ofO"$2IN'1p/8l.Qzܾ%YʍFXB?SxuLlO/>':|ݲRc%wZĭ#h ]n? ohb2ZoDGYWy)bF;\q\Z$r?0Gp}ƴN>h òfmU540C#yJPt5JEԒX/_[+T5ONw1vt}^Xs՘< r6)v 's_AHuycGv%3p[,č!V9r:yX̻ItMWh.ZՎjצ9$`5߽nC #^Rƃ!fSA6R qrs_kЕAӴq{5G ٜBV 3"kϦkMKKCK=;tF!<(hz`j*OK[-3w' zèR kQC:o*f[栍D* B86x/Rݾy襟f-0%6~9!b.uBMKn,#O#:woWK=T-4S)DLA*x!8**ZH]NO KܡPLаufh.CMAQ+O$ϸ ƒ"-o v7_l^ )TwT*30!r S'Z#!Jw'#zN ݿo9"_< cМΆgTX郡'>|a3]Xƫ?OAE֞5JFe`SύnҮ<ʜ%,tTH$<#;`sI#@5%ӡ-Uzx|*̏#<{T9,S}g=Tu=$ )GyIMH6nΕu,׿jR]ַueU2eUr6fI-|DO5JȄFelF][z-tӭ:SH8ܲ)#q99fzu@+tHUYT|mX 2)Urw\ *mVy.#HL9 Y-ډА#<:dg;5 }gdX`H8 ܍/2kG)A'Ѓڤ 9OF):F]4:$wll_BGzy8($kb;ܬ08=ǷTbΣMXmc àiknfxY 2T3i { )giݻs$Jzd3bFiq"uo+{cK.卐E]`@gNtqPSӤԺ7fҟo#+諾W 1a{zīmg@zJ{\kkiUQPJeClb|rö|cmoIC<Ԋ=6lpu=Uʵmj<IǹϦƋ-U ^: G \{[xSO$l$H##M:fZ -J.˞GrNwb麹:j8tӉ%@ `F;Zd^U^SեUdDJ!PB9#9'^~uSck_n3"XeV{ ~8fNwG߆NKQt[JGݶpJIc@u7߳U*Z=*vy^k֠E_Dـ n$Of} =4|s;Ϥ+QM <{?^s)x~^-Y-eI y\$(rHҥ-a ylQ07?>5jԼ9?EZk:G 0bL ԙ'KTޯ5s\*:XP#|r@>莖54j0RhjH7cZO@P}(DBE&FǓk܅V\dsۭThi Bdx]bST,)}&JCPWiX {?LMy b308B-&J$$'5F=~u[(7n]vk}EUEDưAgs ^W9|鮣h+HL72r6<`o>Q#H؏,p[%{zk/NYl*+kh,dYܜM퐫gFıoM֍-ǜjδ:W{w2z3  |#,᱌|,םz-%P% 8$9ԕշD?/i9|OΝ:-Yr | eA9T.SY) }sI\zߨa'1,,NHr}>kiJ# "0-$c*3رݮ԰29u !rC|'RRMޢ~JXyH ckpi/wMEwq%TIJfLxd |TMg~^ZY^@ P~q#fSIvW\ P3x'gYo5жԕ=]R(Ʃ-Dk; QGs*'MPpOU~]Mxonz Nߌ=iW|oj)U` TtnSSMWSp"ŧ.+_ntfe"CM y8gR/iZEbDHc'U4UҊk^!^*4f仱>?R~yhBRf]}Xgm0AԶth p9%>AW 2>:rU_,ΰl sO}?xAmxH#erLjswwx9zPmTq٭ stXHpbi8(+8J8Lor|>&#~~J}Q>&Iue0Bsm==R+ԶW뷽TbۋU|R$8itL%ؓ8T#\1Eg (@.\gWުvp2t ;NШR8H"^VܿQ m0MLU{q¨f;wWbr`{rZUxְw鸌cKs+pB] $`YBFzVzAg~t_KuE֩Z{)M,R$ʳF0Ouϥ.MuZ9 SCI%jG4Q `HRrI*=s?["~qYmU #P<[1U6,r ?+5+N!*{ȩVRI^SWeg8=OUTъ% G[ih9{Hϝ2}ii'Z ?T9A 9wNN? -3u7M٫:VR#qE<!$d8Ϯ֢Xa<4~Zqjd3Lm8"6UmD%I_E(xc$x`A4/~#iNU@Ac*lDy 6Lv^"n3\1Sl~1$V1(Lm'qӥ\&HY;Q+f4g׾ha5a18|~:3Mʬ-})rrZ<+g$g:bMaia%%S崱6%AϮ9ueb+*?Imx3%;E,g{J`2j#]TZ:(Gb lN=$UOL3!16~cWPTkcM_G-}!c$wzv>ޚTq~v @VZyh具l{w*Z>r&X0dJrOΩUZe-颪E/JS=?k)_c:#HBGݴB'iu;l*Yo)YF >^n`8ASIIUTH#w` CTI< F9.y.D,vNn]ej*Y^$4,1% Oc(q9#(Hؒ2 z=-vh%?*"yp8 v N+c 2~t$xBetk~6eeW*Nryפh[_LI`nD [ v6 7{ >r̕[b3l }tTJRBjb'tY p82kU)=y5|VṞJx?sm4ŸT0d2 )#{nQ4(āiW?D6O 2i"(ɩ kRY8"K.d2dK}9uU)%G%x^S6N a1YT^-▚P$l>1)t,Jj`=L^SMh} uC [߄s֨|$4XX*TJ7?=CRGOJ$Uf1Fc+mV׻!"d`r\+);IAN Nu^K'və7Is v9@" )ЯB-=S#iD8u΅ZRS5LkN$c dgg Nе`_Ú| 4vr@2IaumEUNZ kcω*w&\ifrl"Q="_'ޙSQ}}-,QT `99|bЉR";{kҵ?Ek%U4SıTQ'k998H]c7۪cY!cdml3@ hűX6 @={|E|<s۝5M{F[(8>OVOXqZ-6;5D1;y 16u%jvG$^S;0Pnw'?0S#\h?L:9.GTbA MZVU T`8pꎚղ}AnZrj!W2/,I#T,:%E-j0fV2f*8N5bbt %{e]1EBURr b7k-CNiNW ں/WM ءƆȵJ J N;in]ymך)Q2LJ*HxoSt](:zs$aP`rƙzǧF~6h.7Ž\}&ܨ0[(CU|ڌn=忭V y(RJr#s)\mI:v;ź2}U U9XOnZ:nuQU1IRPar\LS_m** Hs Gڠ/I(C 飢I"bO-wќN;:}~N-=] G 3\Ao>}vvQEV#^OQ=iꝗii%p# 0[ cۏnZ ,N%,Mk4:YI%MMiANyFp=Lt KtëEVUcv)(U'}S?hja$R(vmcMe HSqVo-~[$d`\-KT xfaZ^fZTvfl3 BGqyG4YEM$mMB|l1=c< [̱[h/r2[ppv,UǮۚ43=9mIk,Jz'j'Z0 ɕ#GQʐ#>,iTn[R>ql:MVO.:|S '!ioItoSU#Dԓ0DlI<~T H'0-m{s'ZnUtkYQ #"1!I#xA5}Uit|9XVC@agq<g0Z%UUnZ[*e-m`>;eMQPKkcY|C1dMp|%2Vm0QQSXVJQHL"irY0N~r:7.41▎jZڗZvdV?{ޣ%ۯMTUSoY%Zi*8N:F~Œx51Mbr}ݾA ٵ]K=UOSAЍIRrig ,q\{N 7TO-G%NRc蜪pl!cStO\z~\ VZq\42R657TmSbCyUSJc n#m )PnFo> s3C,9=OQQH#W.)6Fp axooղ(k4qx,(pnă IӝCg͆GK1 ʫa>F{`骢ھp_]^Z 㑷)1>qR9Pͥ"[qn'TXwj:4um) PI0IǦ8^W=é*$ڑ#^ʨ 5 zk-"x Ś'Aے2'μ]-] \mf<0>r5zEch1*=,5;ǟ&A-EN2JAg _د/:ȨTM!4n$8~G0-$4A[M, I%W]Wk]*ge"7dn8FGr?綔o,Hp]-+,J`yY){ZU+z]"X_ l1O6 fTZ 9BAGG馿%ѡQd pGQ:wjri ڡ*Al'뛏CW4Zڊ+l Rx lklա)88 G#γFEWgd*@-qjWc T5?~. vSܮ)/%?TY8DZ(,`p#Y=/fIQin3F`W8*1Y߇4O|*u-$_<ܠEe֦C٢ݷ9㾼/bEw۔nVq߄Ҟ* |Zh!zZqRV_,0 8#;3$tW3ZwHv/9mR+yYdAFT3s*fJ#."HDќ֝'rۇtpvlrr1V շ *f-ڦ (~M+ /ѵ2MOM%睾*h1q=z:EYk*NN,NFAI^c[m j-͋>t-{LX+u3@7H3 ;;㶖/mxyUUK/JIIIG"!Y=h$ VbxrP_6q3C"|*c0Λi)nƢ()eJn žǜ53ѩҸQקѩ~ G5gYdRsp88%EOtMP#]*ʆrFhoMtUEޮeV ' gCzz+=Β-$͕Iq9%NO8\*m0HqP:*qAAҔThQFUvGa\?p2הV? lӒj$m qw`0FwNfY:}S CIG+ X|JfR09%N[/Rߺʘh)*e؍j}1ޘ[;=kK;Z939ۙ 28ʞuHI–qw9 KmR-d|O:kL^*h[aPr"*UQ2C$6H9$ DTK(eZCC*.J8uӹrA9kiVg Ul@Xxl_T\"*CI}!Xq}ZՑΒ£.PtYT%m-%{ 8K);1ie/$h~5K=e]- 2nxrē|wo': y "Λ [UMJڍG z9$lPq;<t=6*clDO:663?#iK}˭zlMҴ'b0 v1N(%+ V\[c֖j)CSg})VʹIƐ3>V]MGsEWIj;\3 q[*G LxuꞚJʩjm-V%tYUvO9'%tg^UϦnvJ*fj+9Il~b5h:_[*+ntղ5U%4[ %r Ш<1뚊Hujgv޿Nj*`!HC?ryp'#]nEDe2"x/l!Dӱkyk+}τ9dž s 7z*TyZ襣`iXC: >®^YYZ6<. ųIhR%-ΙDH$$+7HJ,Ns[-HՋ4GMTy07bDފpT]"𖒖 sDjE"Syjȓ`e9y/㹶Z|&**)'m(ILxܸ`Y$JXJk2K[]IS=M@ ؏TO'r <NiAsh |'qqœg$5[qZaVV ryH?/`,_>雏PӨ*}Jfj,!%G(ܣn_nѐ5W P׼m*/[=!Cfj[ 藣zT)bW-i X,xp9ΞwJ 330F Έ?wzznK$:/"x^- gVr>9ƨ/k]UUVlBDD")̂Z U/ }wgGcTJ|acojjYVR :^qq#kuJ,;Q_Rd8PD%j9{fc~KPs1Ϡ8x:J٭IwsqETFV]ȥ$1{sihbLb䑕sP7ZQG-;h8`^vTS,_yڮA=FV' Tx^k*VEl#Y1)#H;>k%41]HR z$Л֣Ce"HcGt?F~th?q1i(+0Cn< m9/[dWȒ=u=]UTɹUiI8FF9ƚm.U J_x(\ƒNsc(6V2 {?Mh>uuw)C s#N}0=ƒ;"ef0@G).JʔI3'>2 ^.je6 -!VIfM+$a!R n#5rCKZn*_*: Ipd#<2F; Xj+z9CnN&06dzZAWu鮠Bin T 1f# }L׶`VdyfHVѲO=3,B&I#}6&K%UgRӳLj/?-z^V:ڨޫ*GSܭr$\.c85 oO %孏sǕ(~'^[[/Eu bB.0Yz,hj4C>[LV(mvd5o%%r(XOI2O}˗٬-FHHqvIބw u⻪L=leEˬ1eAѲ:2NZJX(2A8$Nbu'{ue*c|t;tm]9= Z|9q|@j͑Ys"I6@-AVuPXT}8FWei矋WM%LAf<my0j.nP} ƮVFji<p~ {q^饵[晡ZA(H;"\C\oCnfb!p{1k/U &6<_/QV. 9Q8'8fuTS#Tnϱ |#㵫?a <^݆8; kٷ5 /J[)e X*D.֛cv䜞u`j*("Ff9r5TAT;u5 *y6k 8$c^鎆1p;*V*xo4~29c(rnN@cx,N+:8NWRuc^X+xO 䎣\PU(F@R.~.>yi._+muMḱRpNr0'yӮ%ʮw28lw?9?0׼V pT2:ﳄCm1ؼ#Y{J.Ӏv-f;c9Aery=DFo;d7 s5 mC8\Q('p}sC4PIA,OgEhnPA"M#`#ڜw|2MUIk-R$\m/lOlcYOj-S\c͗ =%4- X05Ar^:C) ]ZL|@q߾qTﳴ2,4ej\.N#mێ]$DuH<!|`*uim>V rM-Aa|R1\W\B"EW5$%J;! UCzn$sޭ^1 a,ܪprӧ*JzG<2Wʺ?N *'H礪jbjH-H;D_< V-M=]tq5:m7v;FXizSZWdT13|p>ze3N,U>0kMj1T@?>eप}pA31>rt~Z멿߲;׭bf8[Y$Fzn7(7(^{d֕᥶s^ @JQc,''8o!)0M,)ǧcDUsm5+8Ty頸\X?)ISΈ#a KΙZ⪊UXƲ9%w;nQ'l#YL]=QH4Vw NF6+6xgQ~%^62t՚k#C,ʛO|&N 3q8S؞]s='O$4ve iW*4:*l}YxH8롣C3΀/~Sv8SWpE\NV,xf9$\.ipvdbpyO\6 W[X)ήN^-Y]2QrtfsiK$\sHu0yy$n'55[A_=s$Ʋ8VG7~^R[&mo= T%cm׾rO4tKUCDPs"*F nY%d|G0#Uq/HTF^x}<׎J l*TW? 1:T y`"(uaꞸugsy$aL@f9?瓓̊G QE\7<8*X ;o+]K=Pw( ݰFRUvNBN$_鯗UCG1CiALĐ#)n+%Bcdu$ҏ)zO!Z:f/pE6pXͲ R9rbJDs(g]h@ N?=W{m/*[hLbU9߮v"]{,{8`먶Dg ܈ /QtxR$̬û%rq1uUl_ m`&؝[D'v}ǰ==],XKp8-WCmyBE=HԖY11 9?Ct*aSޒ!56ltʒN[:6;N;JUUFY\.yNrWP榢9>uRHDߞFy5\O:4zmE@gAeB[a\CL>f"q{QFq :JT0FMV~\j^X)ΐSib,["`2{NDh{~jgFp.MMwTZu` g#v94֙imAiq欒n݌c`|^Sr[㨮펎ITmj[̱%0#9R?_M-UM JjSi]UG$2;.vk-D0^A:V p}?CB bq殑Li!pcm G@Gp7 !H.o3s:ҪƒJUh\H$x*TJW4E6Hӟ_Ctny雅cs:-e[@ n@AiL ϑYf=v`9p4{P_fi9ۏEk#bFNu;VV,FBJRGF᷎NIsP#3G9݁\Z(ԻT ַHL򉂈!T;`Kn?-S2lq5uf2T-}[tu$J#0}AdNu]!Pw e[p&iI^t4C 4M3;lcTqoDI11W=eݰ>Gl?պk2p qTZm˄vT sOO]&TDmUHqxa{hU==rۯ1GLbDCz<ɮZ6`Ky,'*H2pp=gAf J=Zf1j]Q޿'8`mMޞ̌ny#D=9TbCOTĸUMA{58^ΫW2H@1n6"n8S5jUnSₐe# fFKJ^6륲X]Vx K01̛ ;a"CAsޭA*8 N8c[4U+>y8aMQ\Hn=ʅsd3 긡+HFuHW@%J:Y;cW#SSiYr A֣?\bQ[:9. rf<A2167Mz\51l4R&ʀ3탮p/gg㶞~T&~[r**#  xYU3RBc12==RHAG=>]&}!Ic9 5 P ;Q-jgqCeI{hiARxj[:OQdsT#G|37}N>exwij*ꘪnN9G##XOMheB3}F35-ު9H@"ԫ(7+]s"{F朴NX$vЪmEY`~Պ>8WPfV% K%,-Oru_F+=΋J=:mA^:Y*fG]C!^Yu@`pW|yV r"He?<?CGMJ$8F}5o'RMmmç-@qf'i珖4"JiAGbN0H,yGj =y*$sH#nݵjQC_F#XI:#9ooF6Ӆ +BO? 5x9B:ڻګ]$ZQ(XB(T38㚸ʤ7 Ե}s7jC:!y)A2ǹ71_eTq Ҏ[[r"8fRI/B0?}=,6y)5s;TD1+$nn-͇ؐšue PJT#HGF~ P*IX){|l[+,pe@*GqƮ\7~Hѵ4,XG$ިn3ET$q,w.6c9q{ǦEmRy,sIenjɒ8^ )ZK ׏2n ׉1uOT}lP9-O'$Ǹ!߄}MҞ)RUQNIͩRjsnp9|?k}^"Ӛ6jE31,=rǎNhY$u]i/*jc)EHF@z$B~,5.J %+/tWKW%z]ֹnI;sYTbj O*eOک5FVJhB>Q,//ڢUBQS_M -.v9HLU[RbNܕUvzտE5Q[)gXEnѸHtŏ~|Oo[ HbixB|22o׮ִ֡2Zo6ș0652"!_' lz|Ch7Z~q^rӽ#䔕[lv>{H i޳ԏwT f)!"5 Xx] # e.4MG~Wz#ZĊjO!bPっ]/EU-tԟSAos*.99U^ۢ_G\.H.Q2UIoVܒQp5 O tb գB\8#j=Z Gv$I|/莢Mpsj'( @8*q:Hznk"+Aȑc tx(zo0nw#] j)k0CUcI:u-\O=HմyUG%fb@| lElyo!Guu{e}' Qu(#~퓭3ԑUn9b2g hUcEc^i^YoVOuF)?2IH ʜwr~}SG,4E4m$3+ <c $q6oׇ)D:S˙.4qJΘRv!'l3]-;C+CO70&RE9?y`m $fwn:ڊ%7$[nNߟh=?=KNъjJUDgTZF0fă{on3~h׫Oқ2p1ī# ? dnH$hՔEQ%=,5E,MCv/RID;y 7( w9I~-QQV_lZE,АAg+3y8K; _r2I~d[uRLV$e>Ik%͚Gid=19?ӧ7ZJ+eESRT+-=]T&U؁R>6dizA%cxGݒ2a X:BĆퟮS՗'538~"ݜs΁9*#sn:Y}=|毦VJmɇo rkMZ i::GKџ`e)D%w'%ri~ 'fW.uil5u3#Ym ʙ*q2uwFUԶzz$CG+UGJUrA w$m'*PJ5^&#[KAvz*LRBQ e)GPyI!#r UWOX.T1Ʋ@!FL#ҙ՝Z:%E1&az1ГCm^ۤ@#cUnpWϙrC$F0A ꎺtP+mrXr3dBgVieTch8hO @E9ҧD]3TM5s>C*F^U#c3=1yGW+SMJb@Vp[OǿM7ΦIӽuث婐4n>#8Ͽ x*GG z??OCáA@L=UCLki 'UG*{rw瑁BVȈkp8L)pY`wVi n$.8ƇPUVQj@j/1]f } j[ G)rdPQa 0T:n?ٟp`ђs Rag=2?-zh^Nf.Ju1ٹ6Fq=_Os4-=-Zi ie"88ポb]s%R ҩ+v_KǝCscSj0KwXwqմk 0uꪂ}h')^H9p8#PSV\0q,q?| 2@pv`Ö9 U@Ĝ4T[@k=}O q\u=U]H!yJOž*sZ5:;x_zi,{UFtWQc>CE!iX)á  $r{qF*uv!u"5݅n}HsղumڦTm̾q8 5.9Kףe,c4}/-i-HG] bN30u^?UMP]Gk1 "uܥ;dXhf' (U1;pAa8Z̒<6i~UVEʨ* | vl\nb[~R*'i~,z*M#yVJ4ӓ Cq^랟f# _$$'nv]?Ja:Ζd)Ԇ_6J |J(;K"+J$e'^ft5m-\*:vSS`G&7!6*|$9ϧ΃ul~1UiջAA'$w`X|HȀ3[fSp wr{EQqHn~ԱCgKLVXM#v )ή*ˊSRigU؃%@O`Hxe_CckY$ޜd5?b1VQT5mXtq. @*]90xD؛eTdžg :ozソW5$UfDFq D1Aս[Su<S]&j`u>J:qa2=uC%ToC>~%; rX bIl1c˴7[43SthiHj3Of%O/X[|89D#`-!T&jxdr~dwыM(k$o ܂=~0Qk~Q-VWʕP }]Ttr+VvVǙ#4QUTrOܣ|ȪZwo 1UA?8vT %YQn+pv nB5՝AQeV2dQS Y&1&IR=T6A#.BVxN$`'9}?=zG!DvlRU::QX ŷ|M }jg6e!VefR2@|d::)g?NJ(^:۬[_+=)(ޮY+nO4W`b4$cؓi]6]M8w Fs(9jk`\mQKMYQ _#|mz~?rWL+* c va鬿hl=gĎUgs.X@~:SƂK "QďN9)QmO+N, sK#ڥB0߸: Nj(i߹֛jLmt$1f5{0mYǧvi}2g.A?=P3%F eV] L-" \EI8~{}5V ul1*P9۞ƧEm_.:2HX ;qPV7$FQ؂pBQcO#Y6ժ~P/mˍ ڿQP[ĉ a~#\%(R!=G=1۶umrJ9vANp9Ʋ v-Wfʸlb15d ;l15Q>6 -1H;gQw#R;hQ{/|[k YKg_B4 KHe =v:aN穠Js73]%'sOtζ EFg:z^[_,WNh 1>!0dYj2mxuO$@c S$sY*Uj&jT*CKh U 8'xb#4Bj4žf-3n|*'gsCj5sK 8x]Î#؍A5M=Ujv|лU;] Qְm]Q_gzX @kpɀ;;Et<408F{+`g$FI#<}[LPO+v/{kTte*yhi* 3G,ȓ!c's3:[(;JyDYK;E#[@3'#rG馩5O3|dcUםcA馺,u(FAMSBjf89tBUT5 #TD-;]$U"ߎ?A4M=HY |1'U4)i\Wh ~r*])Ah>9ueS^i,0ş-{>mgS+(/eufw{et ( L0u{K*lNGeucKuT(=u""iCc͈0}HjOB"Ϩ< HɤXַkijuu Oo~cҢs%.fvﴬM2 E2!0hWNւi 6 `{YϮݓS-MpGzD ~p/Lgևo(1j Tjdx'1M:; Bkxյf6?jZ7\zKX{nđP\n*sbb +! Fs՝KRȕp}威Zc>J/sÒ ϯm e]DUJ*`,HqT!ݵw(*2FCS1Nm!x?{x^Hejz4c F]S)SC`G$& 'QĞd r3婂ErN0YYF}J9d8Th* )d"+1j _ẅw}XWw >zV9Y9P 5-[B{tSK!-(Y`s%YCoo%KC5, 8VUʂbS 0r{*8m IXĒ;~[!I`NU]JS2l'C2IO >7)NypNR"PI_AP?3,0t^KP"5$>Y0#znAKoQ;SUvd"Th,A/(AշsyZ8JjBR4׏pxeh+!GPs@ w>7jR2H8En*XciR8̎4Ph'gJ@fr3V15έcޠsߏs/5r$AsDUР, f H?bs:y*bo;jFNcT(~۳N0 ǰ:}a.){h2\W8N7W8:rG6yXi$ {r$V8j%Zz|榿\N=^hr ̛O僜{{jNS#4hػwrI-I'殉֎nbbF댍RG7 lxu@)BaECQWU-[;ou)pWTB&Tt 9m<Ti+&v$=٣اo/f}T;8psTw akԝtMS/6ߴկH*a3C7F@KI-mmn&TDK"-Tssq-$2ݒSԦu=s>^Jd K*kllSk*2e@;m}Q$-swo dǴGT#0̺=E]KTLf(Xcs{8Px+tιSuT-`$Y"b*F{s#ގa^nr۫eyP S,wXD@'?69z(*[bM=t6d@-TJ}[k\2!֔5M֎TRטGGVbpOmZ5#QHǸ??\i0?2Ioto嘌=?/DyEA*RYk˜F %޸Vp'9o$63pI3#ooϏZʾLJjVIgm#wGak?mGٝYFp9mZ24% .c}u|Yo K,1+(#S=٦|W[)=1ܬ:pH=5/'yVʗ}BsA2b9$#y* `ԍeץaQ\Uf@˽2cj]V~EjP5m-u)RV1cg$ @I~}Z?uXfy$!ۤ0Hw*vx=) %:8S ˌކ*Txٚ*Ī驿Aj\,UmLr$9"cqγk2%$O,bec, |lyR 4v~Z˒\R*`bmNۊ`>/PM4mL8F$u!xBtva (E̦Qkui[̎uZ^sFL{Hxζk%?H٪麈J!)qCS2dg"O;^ 4nIktU so]*qNpuI|c&Dy*g/.)"Yl W#*Wnu!Wܐ5>K ̶~x{U-–gD)'J`p. I}V:+鮔SSL%Yah_[Ƴ⣑mqHTAD\ ;66B쁒}Λn_/QW@,,竷m0v|Ъ~%䫐}}5fYoX]KnXQMu#J,F7aI(I(dò%le[*Q\ڔ:E,aFZ\^Rii0A||rZJ\z=9.I'x߻,I ~ᱬv֪Tk(c}6gCymB]ys$C dV pc gk4`+)(ȭH]Frp]뺾.Z%EL2/etm eUǪ{hZ,]n6QUr5 $C;ٰ_K [8z°zCNZR 5,I1崲FwПRGog7A2;0_[R}{?EeHԦt, m5kM{1)3|D2sJ"T7;DOr)'V,Hr= HQ^$6j)B#|IM]qVO*r%A˲8RG9fjWjT@ 5c<@qQl6[qV71IULlU|nF5jfj4#hi $;A8oz-]GjOJiwymByp0_8F|{IoVHzyfJp#YAuP\0J3ɕ&rEƵEA hP\9F!eU|>^zt[}#*6}9Ϡb麋2^$]?躺 K"L[ 5bTr?NCptn'RRCESD&TOS 'DIf$HcN{ O #7如:ݺ7Tf%%`p~ _ |[ХHKOU$29"pxE}'e>_SaQOmWIsT&SȦ@-o*O_O^2>mIp)@bѪI$ PnUq>Mq It¸ ;lzjfKwOW[hTݰ~gdž!#( L=jr2qHfVzF]Yֲ.JY,-A)j5bw)Ѹ;aq3\zl5VI樎L0o \'ë7H%gTݙVE2yYΕ(*%̊W$7`Fуge:ТC~ՑKmJO-YBc@Bp=UF p*v#נRBX. T8hiUQ>Xe|y_QbZ$R4@vbDL@fd0=մbU+$Q ;@Fr|<%==QXVĦ`8a-NAN]YRJP)iLn,9K }gJ,PđΙ*Q q O)yb9vo'\(.tG0ٺ<%gvO].7NxjurSK"!Lam9۞u_hPWV*ĩ y@ף"MGkQEk\%f*䌱V? {1WXk=$]>/5iRwfv~lzn׎l6cQKU`5M#Aіr7=Eo< Kj*1AƀÂ! B9FT*xm4Mi\gw1O|v_nn\?붱YFkK=ϧ-&S;yGJ4ΰROS dtŽeW@ѣ*B ==j(*E~'ʒz$nv vIs|Ƿz05#m"ulW9=ǹq>gM>t_U[DJ!Q! ?~XoCLTEcۣV3`2v>87EMNcaȥlh tHW9FJZ:~cЛǒJjTyp$r~*8uQW^몞& ŎpO`8ֺWAEReD`Ԏk]/6͡BcK%CGYu[]?Z_Y&,31̋ ۞ΜO۠ MKRS q1=(ثŎhW ʠN=x$wè߽\4Yv(NOs:ZdI r/8j[\֕+n"^7m߶:n-3V1Ͷ2aogzw룽RA@;]1CFQH[|l3T&Tr=Ÿﯶd0!c we4Zeղ-mG2L6 0'MfiX#8zrN}U'{q,S8rS!WT,rQ}Ʒ(ruSjS%=u5z)0  cx;t{Mj(靾^uWO692ž3n?GXRJUbG@#^Bf*AnYmMHSb <='oIipXv_ ߰?WǴv gպ34,QH;`y[EIlIMS$^a8}544LlsrZr[QӘDop6\}q·BC 5>hb-8F{6CH!yjINw2=O*naO!+ saRK%-";|2xOqכE>+' Uccm Ѩ5r|-dCLVtMc=lsmn8j=\ԒKX2esWn 3H}*bkirFW[52b` C7s? $,ewsqۃ A ت0ȅP'x'ЁS-; | ͐0Gs驩[lA=KnNqpS8ϰGhX;OjŞ-β:x;]ڣԟmBb8;sUYSZRvw$_trQz0ΜcWq-Ξ{BۈB~0bF0s&ke}<"zS+2n9ܼ1 FH:x5,v.ݫ9'롧vKm=T(P1V+Ml!ReBY_,FCnh.I,tu SS$`\Ca!ٗsG'Y _2(\KNt'LU\ ]V1mA#=Z[k yhvJNCKYHX1j+,$V%,)@YfYHŪ]=ukgTu';d{{{ ,kŕ[D(@d`V?h~7J 7Ijj+c@X<5S5ZE7#krf"Dz<~Ej)asY[LTbW9w5OxUJ ",k='S)*=Z攴ʁY|)HW,H<O 8jO[؃wp*[!x`0Ы{voqӤmyϙm=sS X 7@0 P8]PY`Q@{ՈK57O#TC{B"@뤣RUlwS#,2c3Au0qi6D%w|ˎ]9CUz+}$;?硵4g vO3MMeb3j[Jj`0'i_g-\CQ_JPTғm;lh%/%X3t8&8$vGrF~{ꦕA0ۥS2r8ՋetUpAQv#:Q1 +n?Vcv?|czrԳ^K3 vSY'3vjUmGKOPb^PN7]Dm B1pn`EGƼ[rTR++$c#߸L̮ "`kD][t&GQmqch,]p[Ek] 5U3i4ҕ0<IbyC4jr@54(LdO]SCx, 4QC aRԩUٵvZًapO$Ql0+/#5SL @^>d*H rGq_ c|4 \P$8ށHme<~:Iю`ǖ2 =Ư%kyuQdN{vHb}Eջ:OTt/c~^qJ vV{hE }>&vϧ4sOSKl&3-E X];9^Frdg:\cxA+0[8V= [6K l=aZUO̔r c`7'b+ZoJ>]MOkP:Hbw=}0rx屢KKEU,U V;)q ~i'#Ey ;GG~zMD=gUt` Oo2̎(f,px:]K$H ۓt+f-9A룰?5Muu % YqKD5㍂蝹Və3cifÒrZ5:yzdt68Lmv6|X{4꾝C;''sG|$HQ x{vъ^U8doj14qojҨ,Ө峤KLyh>??SVPgETY(3G.~ 2OFqVz|tXa#Yճr4i\qZZ2La-*S$ЃtG#ܞ˸?\`E_,W755YCM4cV ,/ ^m*%<)B1Tdd`>})IJy|QicAP۔z},-Bys1kST/c5?WNDd;F~'h%m=\1<{|茷m< U\Nٮ LmtՔy*Y h!rp '8po<]4q>\jW>"p56풧S|jY6hvzh'@VV' A8$#Hqr;r $ mA\myjEQzcl|}3GngG6D7n9 ;Rի ,suO[&ksS$t#CWR2Y࡟ n#KT- "bc*]䄑 +'ܪ<Tg$m%Ib>ތ6:@GJ\ S7B2I݌nbH:L{껭֊hB"٘id*'8;NݤRxq[nS,u N*%B}cpO+YlIG--]y!>=zA=5P ÅL6z*[| Y32Fd,p#vqXs].ֻ?HRmKSSQid NPFOK];M% # wpJ\5$Va^\E_:Y,uV;3$fvr60kew~!Σ螨T[oXntGE\k8wa#IW(:Cp̸1%@$,}s(xʕ ʕh:zqx"oIǕ*]ra)9԰:WjC!ȎԶ%MNk*Zy\y|7Ƿ ^y n1v }ud3,,PGnA uiĺV֗5_Wdy]Q*`tKAt\玡& pj AHKn @"%˼.:$lKkFP15P;Ա$wƙf[UE!Vd5;ߌǍ Qju 9#Gde@%HQ*c^/tp[nU[xOڡ`QZv$`q9A{ Xf־̷dhX~FypGҀD̃#T-NOFW q|tS ]FiekxV@qH\98_Xtu]wS?wx`VB)|̣XO9ƖzJ^-H٩` ]G#$/LCt,+%!]hҭ*S9&pN`{g Iug8"[ʢOSAM ;"}ʯLz(%z7L-5m.6O]9EM3++RfBu]Q ]M\6H_ZhQ*; >TiM5JHj U$aJGc$0uuC OEѡys8H.=sBUHm(/9-μ ՟^fT\ֽEYS#\dKK#CNV\2Ƿr9[n٩$w.g1 ݅9>IW|T CbrKpw'U&έZƶGKITF&J@sx, 0zVEL35S%OA!N#)w.\v=L.WAMH}%7 cӷ*IUV( ))eeI""\q A鵱_:f$Z&qi:xԁ1* :ܼ/Ԭ)/-KѣZwLjQvDcpRP."ȣqpt#ƋP뭔+} }F%] (؄I'7n͂u2AfdHɂ3#3x,Wſsuu֊ZzҡhĮg $la3u3~*k^J~" Yuu+E0,6~珋VdZU==84W(iX`N2FҺ^}]«+:Kg2^Z @TT߅vSŪOfƪ =+%K:4K7 ;l_p:qJPXwŏ zo֫%=}Scb6(dž|zgVSqAQ$2QȓsI6nf¶{2q[ޖxֽ>9SmS 䬤YUʂI. m˯HG_RVPtuM HXN]H2PdCRL^6=_=Iҳ^z2 U@ZTp͗'An[oYҢ:+gWr=l)mPc w:|J~Z}u1zZ 4ʍ5#nIeutDu5!--+ReYսeD6[q jA^D`m"m3Tnq5&Q6 , 5Z/::b{ꮢVp(L{IE~I' 5R[*nu0Np␆ a n-P l-Zljd1%w(*p d쬦XL@<շnyT[gYP<3[4b˷ +xa%}u5qoiy$sc:QWQzjKOCs{hp29>P7lև[EMGO--:Zz8PᐉBUTi<IV`F&F{؞se.-cSWEI Ų7"`IxǮt6^D50Aع<'ν~Pu]0v뵺#P9'۶F䁞~ CuODhj$@Cc#A\=xiIj$yZ@$YjU$PH*x> g_TNSGxKUgL7g<.E~"}Hr9:O45F$dpu^dV)8DE5)[nylp $y^'TtB%EL%YZfGdvr@G#儫fC*nW4=fFo[9'g^IC:zҨWp܀μmERDoPg~ ®ysUZX#3y+U_KUosWg#9@cgHE)`׽MTԯuT\?/~וֹ:}YjXЄv%6r<,¾G:SEVIJ2.88iix %eQ)WQx׃q ljs!]/*I]/K!L I|p9;SU5QQ"A9?^4GExV(!U6'~O]mT?stIO=ք@@XH7G~#“ݏtMO LTv{K(ERUh1EY%n`o9VYzI:wQ"*p-p VUQ `1dS^+\竖JMML,*p]۞HƀURMӷ_ƝSB6;DQYii6+$lb2}5oZ:3zEqTc2Op1ڙl.\ -zkt@'~? .%kT; ,Y H~鏞h[y/O/:9k[}UT~bێO+#Dx3?S߶5MrFCEAz*#-,Ax]kVקY-4j꤂hs >xCvCmdRa-|Qx2^dgᨘ#K3F%%rr6chuT ORv8""OmJΝ'ENLBv>ZP2FyVo\<6_h^=< 6ia!$^9(K՞!=<)3[HDNr# 9= I~8!G=TB0"cI$`m?xzP8J:&?V zt'[xLB%]q-˦:uVP5[T  2T,3v=4]HXҝ֍J;9}8Tpq ;4dᜎij7PUq b0"Fݑh{TJ6/\a֙W4nN$-35$_{Z% A$x]pw+vy#NQJ6^D4o#He5FdcWv ~Zul iAA!B¨-< \hpljz)푭,W3 ? sҢ9"5ێq1:ww/G)Ig4"T+tȐ vd}xzkf4LwX.uM|ƪ #>z^*(cČ)0x#}*mQiq骜J RܑLW'.L1ȋA 1$5OreԐvw8<}4ui;H}y\PUDK$f98й UTQy4UFj8Z.gv rbi=YOI<3`p̤}?Re)ag$r:"PծMZ!$c :bcLt== *T*J9>޺'Osk- 4m,9Oqʑ;A訣L< IϞ+gx:j/La1pfUΠ6Xd=]O7 ӫ]ΦQU,[J'sݹ}4T隄 m~r+gXF}H 1@2TAkF*݇rMt3H(ZC`@ O ˲bnT(Lp3x =$I颒MBN3i&9vi"A-DuwEV!2A>i~5 Tmy8ծnxNP#u E{U^AMl&XHЯ-N8Ϛc*=ZTā~!%% "VNFPvm> }u,0 :F TY|ֱ=:3Dۑ6§c ֥DKFn>k#%ðpoU`ZGF2,l͂[v:*| zZHYA'KL]P8~ěHoUGxWVB!O~FGȒFTn[J-w;%tךZ}NW4Q4r.@al릋WHIc7n9TDy> vcK][yN:I-ᜪ~򭕙eASb.3eQ ژGt#0 %'gb"FFy_;f zW:nUeLn1mMjzc'uCGH};n,#F_:VQd;HY.w*i1ʽ9_iwHbfbp?%JF ߖ{~:9 2f3 #=v䟙3#=m|2?O:0[hJUh(`?$ۻ2="#2dy&fF!g8΀jTkYZ.\c# hN-B%]=DTLs9/q'H(,*m\{xƫU[sMk*|֥Yd qy6!eYy堫`W8om^jiQ~:DӔ3?KrY%(AՈb1iǾ5*9!tv=}itȫS7-o*C䟈£IsTd'Devg|>~~"Yی$&ya t`}Ye<|hx?\j0PA,p;KC1~CD rld7PxfZa8\,wԺtzO6 f&.m<gY!o-'cv5^JI㙾1&A{:]uaA}mNWSz;gBO'*S9Q3?( f6֖^DfZe%~\n>\6kLaC]d*X+l{%EZL #d$1ÑJ[={AQg|?.p k<]#J5+WX4 t(eɨMFH $m'Y_N"CSΪ pN ]M4%9 = T`={i kQq4 cm8ՊZi&6*Gyƙ!f4 a=9MWL*iU"`nIef\FR0)O?]iعjS#EM7UF d$m'cU7UJԬ?sSK]POP[Q#oX+A4ʋ y+ 0^;cꊵ`q'Ap{ `Nwyr1\w}tNkGXa O˞ڎ."_2 !>nJ.ZZ}⪧͇Έ}: i%y@B=0OEZwGTE;7Ȏ޺[ 톌GGk[] Kt&HїnxWtĝ̙zgK IJOmh]%0-}y2Gc;MYdwT0ʄ vgƸ3#3H_\^1+ Si '塂R@X|?ΎkOQ\a4ps۽_tG95 5<X*KxP=5%Ȩe6(3 }yQE .7y1^8PH'v:umSUԕ?d >0F~,msz:6]az5Zz=5.Plde?w=r8F⛐[kXP6*#͌?szR*Zz!` 2H ƮG^BO ,Ҡ۸g~Tz~z爑"G s[xNIaij^tf #g2'aˆfS9nruAVqkc '}%vhz-Utх,JPqۜjCu^L3IY4ѥ>EK|X$l 9۠=]1s-MTEEQIDhp=BHt؞ߺ$/"ȸ'5X?VB7I:aS,Ǽ$gL+' x<*@ԵQPK$$ۻFA#^©⺦[mD 2Ɇ* .s=T^(h:~k2{B> %v': ?M4 xek~<!~qtbF)1eqC)'#>{L\R TwRwT窦TR=(8Ɨ[u-J/.3S)O6啈f 12+ 3OPfJRQp1 6Y|{CwK|Ijwq$Ko8 .Y+qw!לּl9>y橝2F,qφ)YiJ+!b#xWEnx傲B)+,'!i.:XXJc# tOL^~/z8v,26@\nO'zD~-"L<.sqk@dZi[NU҈IG*0\Z3)#;pB5Q< 꺻EkeuOF6w 8 D:"‹Oue5îow!5QS)y*#z [;1~7Uղo u +umd"H'^{jV.;|1ĤDD}aƤAѕH QjضMmsPujAU4 ]E 5;ӪsYvO;P]Y/yq,;2{aH$py<>o j;fJQ.yO8OfhxՅ3eޞISMW-SV n'x>_$AI 9y H)f@9bm5TQWE*LIO2 Gˍ?īUڝ;Z4Ё 0/'+ `djԷۨғ Ln?]'t8zwU KS6 |A&uMMv0sĉ Xx3p72(v^1(MIZIϚvJ:? @zhM:rvsO~ٺo"ݖ)j)s ՏHU8'y*0}=5[ ȿߨc*y H~PcUIu+8*Swv+hDJ`73%T^9XFY~#gC৺:yd+F8#=;oMgn|nz+tKVEdήܠRJy3ܺj9Rn$HǨ@P;F\rHgZ )f5BFjY U?-(ҵ([،o[k&»]Wlc8k5 UE5Qр % Ҙ#Qn =B1<䏧[=Uuz ԥ#YdV7 i%&\ÑR"'&DDp}O-fTU,4ur%I,]1Q3/FEs5nv$XbeI#E:J]E^`%wmotղo^骊m 8%T6#r^wU(߲mMs Hk:j_ Q_~Gtm%A R?!6|Vǡ;[P'ڿgXLX TUS1 wQ+RX*f"V D μhMx*0Dbī CzC]dYڥ}=RG\܁Wjf) y1:4鼇IFGv)lH'ɍN9If~ʸN1%\!N3;QckEު3#i#8zꞴ\:gFmx#_,4}7~Э,!YaUUBlN |TH ry\P0xK=S=eӱPGU[TmϦ9 +Xih/2dUXA;<#@7¾څ !*ZEDQ"nb0a1($gHcq"M1<]v"f'ɟTҭEGPA(!qqޚHg5D m$qϡ}EM]=-tFU99 ǯ᥎<. zW29$x8xV^|B꫕+]1p=A8UP8p1ת_êaW SÉ&6ŵV^_'ASԲng"Y9p[${O~ZI}%ϧaQ) >#NUk2EC 7$`FH=}gZ2AS>װ,VA߾_S5a%0,Os@/uO78ilwNX#E|UH^X~WRj1Sģ$,p@>ܝnR zKzRtLZ8&WX,Dcnc?MZR5 Hǒx-M!T̍pH8cz|>Us‘!1 }ޚZ(.y0vڅ+O%LpHr}t޶m?{ִB/xh;gn2x*~ZVm"R#ʲ>X*F 0A'޿Sۣ% Ad>Ϯ55"V2$镲??tQa )i޹{Ӧi9xyBi1Υe,O.5t>ڪګ[CEh1Rn8 v-+mZA#*I mҁF OC}jj!"*7v=VT.V%.3)隡@Dcc{MWW=$mIfp8S= 0raτ/H sS&5b== _S,Tfb23I][`Pn19#MĪ ܈Zt=ݩeUpϗ?=4A.uW;R~/(?~UDS\qy;_2U9#UTȴ1D %' yc%ޡu۪>j}GbFSbO˿sd(dLg}->M6 c.3T Sc6#g:Ei>LOve~Њ歾>u*6T6`'F^ҖkNj0>͸"׹=6Vݭ,qV$S>0Qq>챴$NA$&HadF `e3ji{,bRM=9V F7d?FӶzMZ+BÅw]} ;-E-M4yPK ch?_u=#9mя} n2tQd*kNkIPEP uMˑTW!ݧJQ!:̪(*~^ȁ%~!iR9G }Ue>7E^ G_jm@UFQjB$q;R7?/rK B-s9_12ЄVWBxK_oW3v#_\?KH#eU<~ ku:y&HYAy?\ s䀹Se N[qpЬ3,'=y wxOpiJH̳:~j8Ѽ+c>E[|JZ栒i^5< |$pq{ƕeW'w2wi2RjL_h`dR>n9@<I-'*(O6qsZu ]\G-ή6P `[`WAj.T~)&kO JڸmwJ*U4Ѭ팺}9;N;cugOt^*)FJe]O uwz[ҕVB\H`rA~UyuԑWM[M WDc8ጨ-Oõ*j He)Fo؍ZcoY%pI E-$J;@Gr}5Zc @(5y|3`ƂG<wF :{*Wx H3Iu%]1=;OS-S\8up? =c ,="r `ђdZݲ-+~Mz5a w @gnΡ[x1IAc@j.):]ʃ2=׷NUsCcx~t4]ғzJ*ʠ('SؒsmoUy<4+${$dEW[e-Kq\J=m GhzHMw=HT%HG$0>ҨQQ6(rgG}cLT%$}~||E/DkҮI]Zx7LCz5ҐaT{q:E Um//2>EnpQsH(d27]Hk)uf6K+=4() 9\1JC GR X :sWh @jv#΄(lѱJzeUک1,w;==5W:Iud4[2b䖡5SIr若|)w&AyM][]R"@t7TVA_~3&zyLvR0FW1I#zj/NiXc۹p sWEQ(fXwT|!56}JV2FZ&`0~G>IGjd0}*yd6}W%㏦EPCJFHn3R $Ng0<;!Ü/-q"vY3"scgRX猎ѼP]Kv)wUM+IJ6_bA1W g6XьX[nxoQ-艶Gn,ӬS;r۵'Boѝk -ӮMcWLp;~m^}N2uN3t 5Z{]?|:eVY Nxz➊~-q&:IBLdי O?اXܫ>נ<7u]gg|dj"Br[Yui>V4$.hW?|8jަ*pF' "y6A8LJL$[u#"?e=49NH6J:ѝ=/M[)D8$ AH yjj!Y%j?iGf# { (H}MH Eum[eYm**G }Ubq$h 1O#FOAKSWT՚vܱD/P@$ؑZ5]=o9&+ 89lmۀ0:3u,BVv0>WrI$ XIMo[NгWH2hc}!G p=!Z+ 7)ψ=Y{]TS"lFT8-8ln_+)UGRji@q2d99<@8-Բ\a=MA}z 9C]cJe1Aau9Nន`5*EFMEUfzdy2~qdζ^z>-%EMZVJ d@2w#g9vUxEq;sC <pyƉ\<bՒ?JY}Kϒ*$p|< )ԧvZ޽e*@Z[O=."HOO+ DrW'N=4nj8Tp4adXci8;GzĠOwGT(_-…#ĵ5;Mnif8F?x 8%BH8:?T7442UMP$dݷUP6#8 NHMQ!:`0*#휀_zO]=c ȴD aP{#<Ban% b}ƙT7h{=[\*:TWt@b/ZM>hmsbvXʝB;`>Ю%pGĥzpyξVUMʎ"'$A'8Ϩ =? \ &mO\I,X &(1;Ov;Si:2\Zo!`5V7F0J2tL( (R%uXHɧeydd N0< U[L55UxIf傌W%FXsDIZ eKmGdHR)*}Hnm;Hln(,Ե2: I>W-* R1O .1;Ma\Ŷ&>+ ujq 6xTOKjƵF{2v'JbuUSTh oqz9w:4``v'g@JHi z8ΩTo& lR{Y't]vIo O : ѹuTM~O-HfP;WF=slETLq#>ƘHO>ƪ*Ӥ',Q#HIo<=i*x~Ԍvu#t TR -1ov#Q,O$h$zK\f,x!U~NrNxLlZꨧ%/\$)c'

|0l0:aћAt?<4bjA`OMOֶkتd"Les #?۞7p/48$EZozfh^+zdebUUvU ۟[߯6wOX $hTS:, ! 0p`Nm,=?yj)3)^Y!99u wFuR0¼`d@qϟ#U]80mz:%RaPj.g~銬mm3kPӳ6ȫ5dᔡB78,=zhʊk-%ƾұD;v9=1c'3'(Jc,$/qsJC߇v^nOqd RpC_c<Ĝ]쀞vuҞ߽g7`dg=bi}'F gU}=N'F?]ԗn(@! 8R p9XASG 7ߦy;oi5QmØ`$ԝ6l2M^$l!_9x*H=pxKMOJ;M5<,p|YRI,,~ߒtTKU^Í{E]hvt/eu_q>4{UjtĀoI xvs΀[i lă3HP9bp2Omn>tlK{Zyk)3%hf("VB O$}xb djmU6Ƣ^¹jj$+<12< PdKx#i-lEF9y:|z%eIIISI D#sY5Guf^Ij VO/&@I嚦@$҅WNr?CRCHx\3V$5 Uh8ܭxΦV¢P0y@8]{0hrPwF Fy붫U,v ePw=Ƭ4i TXQƫj!(*!Gx╬5,[kGQI=@Ϝ0Adj:%Gm1= 5AgSQQbO{z}4[zJ7a %%DI eHI,qhUK acOSJiܳ ぁClriaJ4>Dr^FA {'QRFSV1ˀm Zcy 1f%w KkaV:͚yWf6#FBBoݪ=BҲ"Fs|ꪊjKl HF2vQ9@>%`ꈬ(̿I^Z~#hCoq)Q+-JSk{[-4R~Z*`N??'5bIE nynwG9pT͌9#WD^sV5:JEf>7C^cOs̎V5\r0=JgI%V8eaxSUSKq!Hsjbd}4)RKL\s)fw f8?-3c U){j}fةk}Tac*@a -2HFg>~Ziye՘[ -EধTHdwaT\΂q^REj#XLΧ gޒO_[, &m݁ 30,pR! ջ=ަ*WzimѺx8{z!Xu6VikAbFI?{?oBhDBNO_BVw߷kfFhInɞ?zhIkZeܸ1(k=3H~=] wq R x ֝*-D#Sc Qǹ]SۼqܻҨta?y8VV,ʙ.^)~?=5x~fjN#}tUTpycm.? ?/M!|jIm'ax%fQh> L`?]7Ǿ;>%ƭQy/Gcmk} j8rNt`㟖J:xX qYCni_$}=W*ZYD2H:Y3?=Y)um?SUn^@:t+רi,ե,Hc5y}3a ke4w:R˻2sܓny#w>keBt}Z^%EeQRYb?{#sb'iې.1xlxmkmבQ̮T$1 .2vns,ާ\JZhO<2O?MMY5L ڹĆWp@/Lj|>vI% Vt~=A*x#G Y'37}{tK-M LsI5L~L(pƸ$#vǁ6֗cQ5ѮVQ>yv;IMMKF{ROQ@ bW,9kDutc[IM%ȟb%@ 0 瑑lF:arZ5DRŽ6)떥ﭨ$vOpFԕNVh*UUNHbYPJ7ȶӎQb8,vxDh;J m㌃h_EYk( 5M4w¨SaA#'5'JfːEZLn z+]ѝ68 {'^nBZCSؒpӶ[TN2XʠC<ssf0j֞p !6sʲFy $ϩFz'ŋt("X=sY%e4E$ ǻ_\I(J8׳iwåE1 03nt+$W QGaʔq$FQ##gVu~y “[̧zac|gz*iT2 x#<:9)fm2 #p{!`mFqu귤b6?ЇKJq+<:qU?C,.ܡ}$sö}mJ+"5Vud ЉW9V1﨨)i\)Y%}ѠG;r8ڥy骔@X-tF*YVVj] 9>b9Ѕ>4-yPȒ2=u?U$%[t[ֳS v03~zqKY1-?E@` r1HnwlQj)1%`q''x饋bv?4:e<aGlef$GHw•g[qƾnfYGGuu-A*U*aboUO9H+KG+G(6@pxtR}WI_}R:0OIJX '8۟v lÛ0Ti:>oTSH"FiRxc+jV',TQ"T`dguMUPM".lƝj |/1o,Iy}5R\9&dҦTunjL'\2>A.d܇k/)ufeHp7Q[Q"*NX=T2kr6 ze\ułאr29}t 3ܝUwָHꑌTsrw;NZ#m3$^q~ J8 |  N[SޒXXb'}mdάT>Ϥ( +G 9_oq.6+ +-d` OcA!rjٝi [Zut}E I5$F=Z$HFd@zYEJkSiel}z冊trXګ|}W;?k"e(09 @92Z(/vwr?x~^̕.YT ~z +)@lH#s(.mt$҂ %YC)vlqbuJiX ieqFLogZyڝ$aG cߜVL.|9*QVlŭx J5v##,HPs*?M0Z*C֦ÝOpRV"pXrOwSPޥl5ۺ)"c1s*S;o$Mu`F@t]C4W\t`v?ws?_mA NL{zgJךf prq_Ul )~o^4taqZg)&iB1]7_N*Q`619)dFxI܏<9zV bˍ8qtN} v YRaI("L;Kcg*J+0]M쌒 :fZOc#,#U]4AX#'hlnϯC H1g}4<2Ȅ>cCezJ0:/H/)Ѹ;EۭD{HTEIINpvkRoL͝@ۓ4IWGx8I|v:z!A0D"On%b8(U<U9N{MgJSTDo~#: YԨUиz5zχRmʀ$9?-zVcWeDcB#H$*wP@,tݲ8ݞն 0y)A2@FzjqA9Nz}kəŦў=1Vjh* 4u]B7%Ndq00 }GPڼ?/uQQ,Ԕ:3uq2Qe6@NG wPWP堡N FO^jR_kmF=d?-TTOl3:hZ-tHk)SgiX }2Q/~!_{ުⲍMS3$2Ȥq@TzjpAA=8 +L1%Y }NnjQ(,Dzzە5%-5gHTdFɑF,~9ȘxO F<[mCiF#jE #FH-w H!Lw:\@ii\}`Yv{iE)6Zv.d!W#bƸsAӧL˾&u?OqZ*kR8F);.T}'S |Ԓo31x>_5ϯ uz*km;]е:(꫏حG&yLۖ#'GM?M]nV{lU_dj+AIp=+$}0}i- ΦӖS,Gb0Fq18ƙ?>4 b<֗Zm6 -P!q#;8<ޤ{- TS# #]nWH\Iscq{'L9īڭKO V7iA+=UZ4Z{X[3tNU=K0SDiS\6TTIFJ FFrqt+"ŔHlJy s;unפzËum;ͦ(f8&LI,NKs݅nE`YE-Ix@elpG=dq]m-Rr:xcf Luij@P (zaEk"7 @YBƤ88Ζe2$$aOT_Jp[*%E SjH:v#dq3Ǒ0m:hû{}IEF'F/u/AIQxǂ*!r>#r31,8-zQ:cd{lQMOQN&u95YG]h Kw$y9uƣTY&9qkd{GzZcZD.i&Bnt?jb5mo())C*9"9 *$ާ:xhW]B"&cC78nPhT 5<` [9ocC.S[Eewy!STb Q YfHߒrZ~Vդ$̴U m4ӾTteխz(SF7a7$0WO7 L69+8Z-IthH!K+6 `ےFTkFQdܝ[}":Zuh <|MqWoK.tlGvquP߬Y V]੔0v)9uUgzzc)")b2N02{qq:raLJ(FS|yAuLK2 @e8?0>y5iJ P y;s[?N]mVAq2Hs̤vF;|뙮\SQMzZtE;ɥJfi;}iJ:n7 u$cEUbb`Ìvu{px+j\i`󆚥v":nc>B\AByI89Mi:JJeȕ h!*WߐdpΫ[Yr̷y.U ,}HϦuWd>Yw*G㶁4$mq|*!SLIL7 #wߥ;/CHrhOvgTn dm ??>uRRSOP'eVE2$8㟞qҍ]tF1]p-U"Z|>Z =YVhICR [7'¸mXCAhHsY6VhR&-nqhmDrmwRRdʆ@8Ѱ}5֑ׯq'%${Ñn}uZk'k:A3Pݪ卒bUu'8r}tR#Rgo#?\ UlNn"GcWZq,eIQ s3CQ4biPn*nZ/Q^}ZMQ$SRcé'*H##h7 L/صZr#Ft.ѢT<{Xn7'0{gSYott $qΫ}}3*dMHLFcه@DkMO_vy%Fpv灀 dE f!uMc>cnr$syU?Sdxn5ZiSdx\97_YjnבUjX=tqfIB*CDGN[MfgC lccn.Vt5S>ڊUepLJ6i sxĂRSJX7]] wI 4iX@bPqxGrmmKU}#,ȏ 1bʠ}pʨ*%<}|%0TF~S=u}\^S;Hʮ s*=j?[u*$vQY<>雨IEp4 #l;URGT@%YF ??H#&fJe}Dn;ԧ11BԟB3R1,js9&jޟiV1ȏeNI$Xo"WQowG <xs4-KW@M0Tf>6m4Uke-\UDlQut֦j?,qob1Eg ;۩rVMLyP](\ IY-1:[ \7ً2TII6 dafaǩнd{TC+._+}8<4)i+$I}n]'99;ot )`8yqIJQ-Ɲ 鵣u|J뷝}k⎢ *T@d&^16}?\- -=ZK=]Zk aibD-:)+m)%5$EO*3 B-)=}.{9x2j2S?CoMl լLY} _^t? 0r4!5fRG FY֡=|KܪLN h$g@c1P~JnӥB'2ꡱ$y:ڣ;T)-%{|]{&#I" ܏Aή=#3GU ~LXbo!:;{NWU,-߽}cC%¾Ye-qw1~g]-:XܵI$u4Ybm1-hFu7RP4r~7[i K0G=3':N!*[zKf ;{{CɆT$u?okT,~6 )7JQ6 ۴aEԞnkJR"AGw:+N唌q1můᡇVQ5h枟q,Tp8'<9=5*)Daf\T [ϚUܒN}QkjLh]q>A~Hw,[;'O[N"HiB2[q?k-& O SLU OZ.ی$ Qed>ݿ_ <StV`kt2xznjQvGԲiL8cӥOAiaAO F>(A:MA[bOʤ)'X* {S==<+xif1&O{~:l%GLikR2bC`S-Ѫ4 a*QӪZ8QOp;eEeo  RF*Ww9}-]41Q`Dx.եH .1zg NM|[J~~NkM]\_k}IŔy ^Y+fm7pE4f(~>-AJˬa#]ppU<뭵V, 42JRM$rTP,yG'iKx!Hߧ]k]';3?/Ny(#!iR+^{Z%4e#ە!_?'RXis:"8M TLqA#oU5mOS ne(0Qs9!#ǶFB-~Cht@LQ89N9ʆS~RH$I!w3xtFY$M1Ew_9<ȡHr1܏\ʭҕ ut-uV?{ceu`tR*ja]ƩElVV~_i ij,@I' m!USFT@2$(S4P2?ơzTRwoL^!˳߶0RT2`i3?##v0]l9RJҤM LP;9[z,rti }XU#@#گT_nOD=dEo^q\vKMnVyFy4>ku;MHdxt~&=>z>#CaTuYU|3tti>8X cz1=VQHVN~`n>ZY,b 'ޤ~?]i#1SR3DVd|Bf2P Œ$)Pv_Rs/$AQhcJ3vv$y'D4hۘVAObǑ:o|ys}0IiVR#B‹3p{iz%":jVWs!;ޯ*YhDb-\@ xVwb;A Ȕ^6Y>F_ݝHI#qxA['?=uPjTfT:f%fJhPF׏}7Y'Vc3X 6уp=;s6{10"%; F34]+S׷lSQG8cs9\QRۘ:)υՖ+Q2c<9+'? ?N[GIxwu;}Xtm,nA}}Z%=-K؝ PƮ嘷B aurYa1*䏩\:XRНm=-]D*&}d)l`r UJM<ƧO4.թdgwlgylYk]i s↠ MMܑkF %ܠ H2jlHTg~}A gC(<I"$@3]iuEږj2$2a=qoi6\yz3r>`qĸ ֧~pr :ռ~#Gᨚ_1 @3"}N3mn?cD-žO]Di#p10 $x?#V!6Ͳ*(u"vbq+̪ҦLmA=&M쥱S[U8Σ,S {gp{Tȫ`h9 {ƾUT۝!9c ={vN;}r.ID)HƪjRա4HzC 'NwӔwQ@~ˊ gnYی(H~%Mfhfr38{tBT:hy{AԢP iP )CnQuZH><,N쏀Bm} (a:;"ɀ҄PH `y+PֳP\RO2͜@473mKD X rOPfm(F=`0?=L&PUl(;<4rTZWa-Xcj~yY+#!F;~޺OttcB#b#)zɍ"wJw x PܨyZ 9˜wMEWzI)b6 aV W],OSJELMTm#0oiHx 99-:IN `zh4*[\i z~QZ L >.n5UV۸޻Lg= \媆()\`].IIdǾ3箪Jaena8nBh6` S]^2 hbX#5{үO]TXsIN !H̏+1=|: 5jeS$PU19}߯Q\*lPw9BmWB22sƚ-@)%R13 G`3Nt4ax% w8@&VmCmڥpwe >M2OAO$ztL{?B3mv,b%a# 3`Ee?N/MD4mW l@p~sebxj%J@AejT-p~zh%1D8쑉OPeD; _le%B:3~_7iK0?`%Ip-" I2cp kzyTa!fe!Sib 1Qh56+j2*CDKO,rawʊd;+ULbfU*Ons˞BSIX!gۖ t-LYI=  EE2. [?NldN+E˩#dO" 4l `DӢ4U[h5$AQNs}yg/IwPܮ7;U(މeiV:)9#v85imԮŶ"z%~C1@`k|ZS˵u-7LX 4?y/KIT+ӳlWf Ge#:KW[)֑MqPqqM A4ȕ'V2SOKʬܤ$0W{5m R?{;~>ZT4<Ur*Ox1\*#^Qh޳N兘d^@͵jzivzj(^JڻG=%r4IS,/ sKg#Z_c*]uJXW4^TUx11?Bq085~^[Rk0 GEs>NJVi]p0][=}#㯇a\͑BKw2̤`ԽG Fo[mto"U;nI#e,r>~"ץ*Ms)>3g vc%E*kU!/ B |Li"C\㿷Zqy֗ӽ JI[5'.2?11Ǯ+J`fPVbm5Qu%,FbƋO&Er;}5A-ޢ)ʣUR#yxݏf(t]> \GoD)**xsPI $ g{fk[.nνq4:n6+mQ™%? B$g'$i.6J9F¯U4L® s q'we.hNF Dx-')gP/Դѵ Mok=Y(=A x Z'S'~gV…QЃݺF'Ē$vn>6x8jKU=hQ% jf\2F7r01w#WY7ȧ*TRC\38!3MLP¤0BwIG{cٍZgJ e;[ cRin,;18۹J03\dYN)E-*2SԵd^TȀ+) ?j5kMJ6Ũ{Ƨk%Vw=L1F>1w f\ھKvaX%VNagW(enCdj.P>=FZ%PTh*G!aK1ǰGw2)"yP>Drx9=13zR.oD5q#l aԷ>*Wƫ [&A#nF ڤr "^hVE]#䏁3p#Gлu9+cw*)*">7?٪ԑ.<9K7r긵(eeY&'=#G4wz$0"0F8)Cw~' KG%A_Ą1'ki1 bhNÃ{3S_4F0[ԗ ~|p4*nIH,BW*LFqEA ]%5ݫ# m1y"g1'\IҩV},ƒNGzwCN{_RYAW[MjjX n UME~ھ[s}!Itf@I8=Ǿdj e2GR[mh<+ "ᳵ :GHfբC,~_h墣ꛅm T!n'ݏ稺r"+hH%)̪,$gKCGFSRH"ʴ P*fTPJ;t+zw ,]?EH^ꑔHf,0d!ջ1 .M\VYE0'KuYNyPz$&xcL7..B4d@ 17yXe%MUI4,F΄k+|-@탳7(GAK$]hCM;,Ypg!d3MYu ` ,6|=nMlQQ3S1>|6}G:2Tb*@]Bm[޶*y{eC R)$7leFwcӝd5U6rfTMP-)Wt=tuu=eLp )g.eu Hp[7L c6=8 ..Se$<0S`6&X=A~WW$Z.Zdg)~#~= }%8K=c Xn|6f2&E$e2FA9IILYn4ԉ^Je[|%Gp6A8?Q^\):֒.H(ʩ@\c!hA:GOSGQ:6@JQF0H#ף, 1cR"88JZ_|Af|qqWE]Q* LW4jRYH PK\h; $h T_.P.{[ }™|xa+mBA;{8J]$%UGBN 6AB0O=_Cf֡s5mK`1 ܀#'pzJJs!y[z9(>/nEIߌU0j^7tg3ᭆ{o44+Bʡ<p0ZoG5e}Y2,;3_wϩ!.u%O%\"&% ep= ۤjiҒh$@ LLgpt,(BIn&u~m (C]OKD&>s$dZ辚VJ+#o51׸dOץ+Ml\F"A1~,8 [ Mtݾ[Ld;OC H{j(/8M:Iv]p:O'֡e&jO,Vbws$޼?NRIz X'ݞhEeQR$q3x[K=9RQg.ci$!Wn2 21K_޶Q\m~rZ a;8};uJFS]p̔1P;8'9O:5*b/Jl/ij Ume o 3!IH򠪐;r}<tBuE.T’Jh2⪉` m>kʕU]Ut:N9-K+D>* -uxG%'Qu? |vrt0C_z`w cS*{mnuKv𙸪XJթH|r_]t]G֕Il|+ $yʥ' (tOs" cB&1[ >T9f;jTQ4 9_9 #ae%u2.:'l֫[FѬD`C30ܞtrjKahf~'y8p;KlWv!Yݒ{<ZPgH*94i톳lmrO|@htU*8Xe|Jw?6ֺ7#) F~,@8HIU[Y,n3* {\=ƊQ"_/Nn4UN.f]G- m=b(LDBx5(QDH\ȵ<͈TC)g= ^rt׶٢ Ob{{knZ<6Dp.H` jˇU7I JHO<#NC* չL\;2;`|490w}n݇sۍGOI dp`˼x:%3+M! 09ϠgdJ)jG >hσ唍1(GGr{e$yxכDUw|e{Zi7STD㷚ܔan2j޴$y͝H3*:RC .#oՊZ֐ Lu]dNTƕ#=$?)fq{~uQJ[P!  θKc8SU2N6y:[$.0!3~ IQ>MVy#Y/U;Z#o8? @#]K%OQ@䁻,jEDZ4Ҍz>*}O9; zMdEs@TG汩+DV?o)5Xw9c֦[ 0Re #12y՚j:Ԉܐ Q3~_JDP;lچzx-48t32" cL(U~Fl}.5qG%`{+R8Wg򑷔QOlfrTXъ4G)v=?/o}3Hu7cyԱD1,v^__Z(D䴙? k%(;+=K)uV!RO8>kwNIl =>尸ƧvXǘ?3\Ost-*87s sF<*~Zꪆᩋ`6̍pHFVz:7 xs,*}XtQrms!0R8Xħ 7ߎ$]v`tn1NWvFNoM0QXI"ˌdsǮYtEDD FDڠ@롲RjF4U)%t)u~м0 V^h4o\'JZh\1r9c辤LMAbȩ-B`<:2w|}xCץg骊njՠxLmJ3dI(`~S?qðA71lyona|ʏ2J-C=ALiEPA<ANC-pIm%! ?msN0>^n̹d}71.Ɯ,TMI=KѿS zwZBL]` DrD 9'Nv˕Ӧ")>Ђ;ꯈO5 $J'xS΃\fCW<=9|Α6Ɓ4؋×K5WQ_K ,%Nslz6&)OQ߶GU/dQnܧ-EUEIAFl#4ޥl -:ֱPǘkSA* +>: }lcOv`1;~ #EDn#綴ҲXz-لwh%@Aﮨ)&iFgDRx$ ["}}GGm \SK9F WRpuGmhD!;cVV5432Kj#X*m59n1,@?aǧm,G6\ ʹoL鲴ԵY(r>cΒtzG2GhvRA ٤S\{岩?}?}MՀ?/Vu)sQI޿y8aqXg,n|$1"cv{")-/*W91 o9{N5nD-AZ,.]W,SQP%8eހ8=󟞙i.1Q!]ywLi1E 3vc?vU1"| =ZN$k:z QOQʢ tKiyT>xnbcWqǠ4NaZps9kCk'@QE) Wp ݲ=qxY44hH;fZYIkY%\pWlqoQ%R#a|:VPi)eKJCJj4l p RIJERwxޝXM7X`ޒ*MiJ1SUS6leOqqʨK?4Hy6Le{?-K2onA4?VRYLHyg}4T\B-,Iۤ`?Υ*<2?BcL!qMCѧ[$uf 䃃Ե ]62ꞡ\o%Sꦐ:^y='1iw9t8;r} 6 I?"HM?qAmWyp@:SkCy`hfpF$FSt:JIh&l룽9Orˤ6:վؠN 8 uƜxC)cibCvjHzfN;|>Jٞ9 V`N;}hfWUm֪8ig<@U9`8>KjmU!c審(N@:I14E7p 4(wr>uJHOhZh.=OxC4 *,3=>|->.vxX?_V\&*i)+ij!X107cj E)*]hվSB}avL腶njyEui>@'.Nr0rx:%2YH# ᳋&>u!u`iOMpUIPϸgДt/\Y{WYNYU<2v'lKW)(wQYnaCRU$4uU/x"$hc4vUqztny4R55-AזH;}>G]_|1TpVU-;WѻcЃe'Ѱ6jzQ$eiUKRWl<G1XWe%\u s=ae6 *5gq8QJ,{`_m? cj ]4׍88mUiԼEPm&W2l!)Ɠmj1E'r3vյC5Cĵ1i:q0FW<5U ,ʤQ\U"ŧ+t*AGMID*8<<{c;" \shEKFUO>jmS=PD}rF0~GcWFSg,n! r;dunq8l\#Oϱ-] ^<AR}򱞍 g[WzAԫ2kbXVTHMP*b~Wba `u #B$s=-Ȩ]FÀI]* T "9#v(mƖ]raoֵO7zۡ44}G9Q˱ /U@%\tK_XZZ{7Dg S;ơ{cUEb^Xe4v:*kUKWFO09>/}O.ceÛKPw[8$ ;„ :rfu&hg(_\kdzZ3 1U~` _od,>6"AX,0ʑW᧻7YY:wL=S) |_2s1e}I'RQu[Sid4 #<K ^+t\}V[f2FOp{QVoU׷ p?X7O]M,,p.s?|HSSFQ"i~02@esXBi $[U[>8t[Ď~s֊)if0CYUyk&A RreⰔ)ܝc/a Dt)1 jXt{Hgb9FFrIUo1T5s;m[7]uEXԈo5e2`qgXWjާ.&zm!c Wcs} j)^sRS\= Z4vWR,l]`2x!jsUʮCd&T4tkQlj+r=sn4v 5El@ϴ'؜MB4YxaW-h)$Pl4cp?@98GCWT~솲EK9\x>IPQ@B2G9 4> 5P 0@cKm pFNn,0;ղZޤ{vRRH$߸ЪfG8'oǯzPM(\26ݮ0)1}Ew–8hj8K>g< vҳ bwQДJe-Gזcn6^r|=+yo,Ԧ.ťKO~2[+%jJ"#2mF5֢ O8b\"`U}}ַ=W%hcZ##VH|0sc1]IO[GGpHLސGr= Hb( ^gWQ cz@.- P}ʱH!o;rN SB缘jxAqR ,Q2I}r8MEUDdXFJ!1ۑS=}s-]rne W%hdL_#կE[-;5 b @8;L~9^S_8Tp#bxEmvJ8ǩs`rT} gF-ONF?G\==*qFKn0 DQrs~tWu!xg 2{hci)Jʊ+ R{qϱRtw:f`Y#nӂ9֒iaQYjidgEؼM`SL*Hm~UqΏEdVRU8 8=}"w$qyŅfm I$hUH2+]JUhAA`D^( 0V,1KyfU$ 瑞8(51JC'&M[_GMj9)?hQ#l5ZՒ"m2n{~sxi7ĪɆ!pJ$gcn eK¥ W9 p}:hMCC6o&$#4{Qf8#Ƭ3G[=%Qd4 -'S3g2TRcPد].IY?.Ưr`3}e:xhR7a<0;bqqIijSj=1DwV Yk̘^squMʎA \s#Dq L)-pԙaJ1F}p=FAfRRLf#fB|<`dwR9VDZ^z? {ۦ$~UU-R#i]+   N)GjJ5e{=wKS\jRU$1Ny#kΊ` Ưq1#o>*}w֗QsGnG4)K#9fE WJkA)p s֕3Dr7u"U]gC)V%H--'vfe|*8 D 413NbJ*zy[茫F'!yuӄGFIeQǓ=Aé\c6z֋mQ0A0cTʝxr-w{޾:uOTWy3eɍsl~C-eUhVys`Q>!4Ouj4X*k.)}3<0r{j]ncÛKm:I/KE #x|nTmKE`HsNӵk}`ES 0..~&èj)' [ =GC"($4}Ǝ_-5e,¬Xݞ7۔ :VJq9ϝ9Mu⊺ji?ZWEc_|3~fj*bJrcG|V'-SXFmo ^NY(:^45ԴTr@|0P1b5qW,X^'QAKQ}tײ=iKNlI/* gc I[ԵO<8.ц\[8'}}1*TW*h)OUoilc`!{bhF]WHTb5,!Qe'Sוr*1Ss:-|h4ޞ[5;{yOFdzM%gcc'9΅~ټD辡bUTj NAрA*{ rGY+6TJv ¬Pp >Ϧu*:k(Y[Z `@e'=z*bꫥM'PQ=9>ZI*0~N ju\YIZ Z ?FpFxѥ$UTLάCp͝`N38gZ@K]4t$4#Q *A9P uCNe,y˾[4\/M13C)J2eq֫~z}xWKu$ޜu4oWyfRcWYNNpN]D`)nأ|ep8=} gwHRS,Βʒ=lםl:h4ԔۚQLTϻr۽jMUPԽ33lBjZ۬!ePIp61 8=:.EYUYqz٪&i2w1ǧ^ v,Be5<1\C:QN Iq*Ee!y@1pGc-}Ete`FQ(˜O[h]Z\O铟unj:nGDAg@`=imB tFv|dj3HZ4} qjOVFA4^`fYf$(!3yx"*8_3۝w5M<7r*;;xRE3)bec}EiR=cԨ62#{V#ڱvI$|4Ht'oP٠xj!Kz{>MA%ʦ8Ed\jaT#ic2ro}r宒qPQTyh`1r]5) SswwoL-m.2r zXhՉA*mT4rM!tv.(U-Bar=}qC~IinBU%Y†mb@_QbW.l&2GdrWwCҭ19cO0tiњR5c}>EpTQ$E`10?M -,+':KWӟ}JS'jGi> -T+Qڼ3g%O"V_9?t&t p=X?Qg|bz7 НgB)s!Q laF_jO!HB̩/"cqtdFp#OG||dh-\$d G=4Ovz9V&wi#0@6>J噋N0 5~D)u''b}FNTQT?IrN̎>-ɼw`tr1}:)sX W#%_}_A LBBpQaT8*Ic>_ijBix3:5EF#I*[=(@#Ytm-aI`B!88G?MP!o4]M,1'I)q ӌ51iLFFvƊY(D]+MlDiXv^qO5ԟfcQp2#g Cjz/%3ȆO-rp=L\vYn3Bk(έ[mJʵSOrHqC]6- HUówo8 FTrkg]/SkYeRi07:SM$DCoO׍9Wk}_JLbu_'v?Ν⦼N(J6$r3qy+lE'LMoiʉڬF9'뎦T^娒XcYr9Ҕ5R[.1TY98!# &ֵ2-s}-[:,H!ylϧϢO{EӤr3̕4lsS vۖ9~HYlR U٪ [»"!>娧HPoQ]e<髤/[disTKPm_hf]9;yި̴cM5NKV઺K64FB@=Trh0 }~u oT.Ixֶ'1d/lJT֐0_ꝣZG9=3tMRY/c,njVlp5T& ;LRB#jͩ[}!Ios0d8$wuYΡS5LMFyP =5lW4+C% +ʣ*3>-"M6λh<둶+*ѕcDcE[W[!s+UD)dT\' q|kbVAʑN֧]3LJ^eanP DD,$AՏ6CYNvNKFr+ה `pG\Q.5X7ZYdi }2uUI G@ϯ-W;R`s*0e]-ٺzpB+C2U¦QooV<z22u6 iOMgW)a;vÛR j\w޸ R1O:icMoKJbH$;?՟EEdP\%. ul8hXLX öKѣRdǃ711U.Z'0^{O$Q (5RD"9yc=In_5-,43G=TdF^P?U0SQ$T## =P,2c/tW~[IUkSz: #Y#Cj*FGsSBd_IU]&OНJo&#V۫n"yLQoÒ@$q3Ҝ=)iI)Cȫwar}{X̕Zf~6n4-;<:lf9rO]m-'U?x(wC[ҽAo2I ?z g8:&I uHg!>z,D>z%TT?.e };EZ2Aګ@ *9qg-e5=Α" r@AU E\C Hڏƒ I]ha"T]24O㦗Pu4JD aY wdO, 0<{۝~y'Yi5K%X:ucBkmc+܌4o^u-2 e\&d9pO()Qu؁F~'!Uj4V~^**{w "QQC*Hg,P`~)~_%1 NEYOQ8#|A4A2u==:kѩ1 ŖD$BێAS5t8ښz[dZHeT2I}h nH3ZTGLzݻQ>ۤY[`d8;J9$m9z}%KG`%šQ>6'>/pjk2SO|I梫( $9##\PDkŴ[m{ >ZkQ"n6?EǪ-&0@TLʽaSCFB& 5Fcxܫ!9ZY9PƶQ z'Y.JjF{sF'Is"cN%|F@۟Zdz3FL AS]~:]v3F莩m;Gn>%*޼y44Vߗ*ɖ0D. dp8-g_O=3a$<7Wd0dC`I,#$;~(SISƱi#H%*Z@:v@}=AھB$ K.23G'lYŠUmek"ͦ5;\mmdbTpp簩uliu+M2 6Ppsz* YbeC4 V=Rw ~9MTtTԻTl*Bdᒙ>#eEUSNe<f{ߒ;jQP}Yda1;6wr@=~FR05c )&<9w#jtiIp#H"c'/<521j+j㩤cOPSnem09ـ w`bWּs˴Lb P˟nbq΂KEUY%5TP,SzyU`8RwF*8 pc*s -DOb#89#g־|ce~ʂ)#dg_6Pj؎L%ɏ9$s<給Jtd=x;=%ZzM409T3!mrrqn긦2iS5ZZέDBKni%߾UCG%e}3(\cG08Θ/ rt=o:+5Cǰ|-NOun[UpҸ/WQ3oLJPq);{ߟ8ZeM?Ut0EpeuHG= 㿶tYJɵ<ⓟ!O=xʝzjd_g* 9x ޘ$ZʶZiibA vJ*Rbdݐ>H ;Ѝ,\Vvm;8۬̀PҴC8ggrr8>wE=STWTJeTvdnJR0Ğ4=U]!GX{UT=\~%$s7Kizmҿ5Ĉd,Ae:F!kUZfØ: ]HHx|!3g')٥_|iRC)S:|!Hz.vZJq:H1lcH$)`u j~L)@o0!GpN9oSӡI0˔h9pըkYPm!$wv1[Xf`r=@=T(s4&rBʒshEo]۩#3}`a?/s%EICpxfq_9 2pHۖs:E-rs,[)fTWH)I@72 9ΫVYn+5$i7 ЈcF%BdM#dN]% np%ޏE$`0 vNi+ŻyMb)<JFH,6nq==ecH،j~Hƕ뚲/D]KYNbzGVESm'9z'=DeK_uza $0#of0H'uᓫz+jd֭LMWj 8Aϛ㟣{;cYZAߏ`?it%|5;QG1b$3n b@=Ξ:J-׆mZơ%:GÀt"$T]U-+R+Ĕwzk%S`}rG{tB6 G@Ӧ/{TzTw a) 1b8 ":#x^6}Q0⦨TQӸDn~{6#;gW31%yǿuXz=4_5=;L,MWg+Pm*MH&Иֆ!|Y%MΪA!A>Ii%r~.X}4af==5+sB4cƂSI<̓̐ci+u4FHJrz!…ja%CF{mV:-J43냬ť~;k %Gϑf544r~z2G"0VU'mvE}eb\αʃ{RʐcrSijң!쾝%L{aOƻ($՝b6Z69N} RX.+L&JYb|V~:"+!c*doA?ߎ5]Z!U*@nJ63)9<w߲k^)t$\m)4uy5aOøm=}Z{5Һ6h3)6{iz+}tz5Fܩ8|csMMEMhd3^]2p<>XZVZ˻X<ʁ{$tJ%_{@Lj\q6;w'G1X0w1<t2Uy rwd w9OHS6iZ"&a"p }4ZBoMWpR^Ti`ĉ08Ф>^RWiԅ址b>gkuR>۶2K33jеFR8eUR5b?R5@XUBI)m%WOƄf JN֓$*8֙?U >UCj,FFH<אuFVJ53Ƈ;c9_M׫eҨHt2[G#'?-J9)3?-mSSu'Q(kL'eƪtl9b{-Mb`8|(jaryn0M"бBS!f>N^i騪DkrZD-}I8? } ]hE2| y,6rL}?1`fܑ$[(`TRSnXGM,¶K d->uN[d!%}~0,g\; vyg_2\7/>w빑4PM,ԻU9%u A?<PgNΫC-}KZ~Q* /<Ƭ-X `2Ȕ+O@-6p]R򤌻zew)Usq x(WS$ ,rTw]Pd=<$2w- VQGG g@>m_HiFhyIU2Yh/HӨ w.ߟ~'V̬F1ʩ +~̪؅N~q(nX"Z^\mQW;WQlH=? |{==&$9flz 5e),XN`HQr2OHT9!Je 7OW"h^=T82Z#U秐H.U(/]ivZk৺*2cj{"(F>#9׈}AErȴT  p>#㷮k(A(k*2qx<.a΅]\Ry婒q{Sܦ FTrs0IVTU'!P ..8 qT-E #-OD܂ 0>ZrZ5|c9$dj$ 'V fڄw]R[;]܏at0v wqCQs*[1/.2Xh}]mUB\ 2-,K̓ n1y>@ 1 aJ6F:荬 ?LTnYj`#8']0c?NX'D-jVwW'>=0$ze;3)Hz>d>(_v4(,&ub;tө`2rI#'kd LuUGzP#T9˞_ލǯ(kMGEꪣMt" 009b. YfiA-y9\880qUկWUJxwy TjFܢ׮*4P,s)>8e48`Q2YHQG ; {G|Vmࡒ dҜg*F{.s@,-ҫvs~EXlg^- ux骒T1RA $~^B2> @kM #9r=X1Vws8CmUSN(mR!Xi a{Vi0zvNpG8: ׆tT)n2KIE,'+qq sI,Э=E l2{eOp5l)d1]wq~-Wf6*JfS|{HU'bBPs˖ in:%,JL*$F9$鷣t6aV,$UQQb1G+q\eק [U;f;(xGxa[]r{%=x~ʠ&=0uCfi;MwFG6d.؋6Tn ͒^`&7[m'͚Gy/cy<y9<5Ts\lk[(؍ AcaEGS;y%FYH9z{@1L^ Uphfq:a$zӼ2sBOn㕦 Կa ?}İ J!o|#>):4udWE"H{FFu֋VtUGTz]"v'O =>*kxZ֒R F ww'$ƫ[WI)mw(Z]O*Uހ SLj Jk1kI^,k]-v1GP@3$r/܍Y#ȻrW7Wݞ,H#+ncϘ}3NյRK_wT)H9'YhGPhc;|8{FKh~(伤RDŊ/\|e;)9 `CYOHM 8bsx=jVh2s$X*hsv,ߞFJd6is5Y,"$tV,*eV\*1HRq{u%]yqSB$np28@0Ja|ny (ʱYV`F7E+L/1uL_pZDb t WB`ELmFp^[顮Y osʮi(߳ :)|&jkQM^>fƬHtlU1zs,gM}>'p=8Ĩ'îͤls$SULH9]"=j`E8a"qn:*zrO-m]Tv$΄T(cghP*о{9,8-05:Kڲ=a͹aԐ8G~,=MҠ S.Ȏ u_WMXI)rfpo LMck?qFkkEg h%JGM;DΏJ"hqW D 9SsW=U'WbWӖOY]hu&*pċ*!`=8+k:Ҧem` OtK~Ju+-Ҋ'iWxgPJ>]Qm9 ttTdQ˷GPTy~DwhSZDpK( O~]_lej7<68 TLA'G+uYXB 9$1ʒ$dE=qE,=amp.e1d׶r|qtՔ_9#$>$!=I~ǦV]$ ]LOS=·l # rϨҍ_MI $P08${g^Ap5Uhֲe6Jy)aN5J+R;j@QEA;{G(uZ/gn챠#@JJDsQF,7!ddFrNߩ閖'߽HX=3s4}COxTld/Q6(>rw$|>_s(Lh5mL@*}^ ,TH .GYVҚvzE-.  ǧ=G,uYR9ᔫb;q8[,1}whiRL0dm F]ė #Bw([v1dSJ|eG'qO㫦9xN݂TB`d88A=kʷiGcê # yh=5q5j"峜g<ÊP uusSR$W$q`g ܁b,ـՅX⦫K&CPNye<~ңɾzzK>d՛@н,/(H_8$q%9ZCJw6F$Kqp 55s~Y_rn;9Ir$-{v--5KyB*kUu:aV%LL$!9-ݑ8Ex#PGHss.WanI))$f>Sry;C : %u(*E]iTZ+x$WRmZj fhMqj%)9uqӁ2fO3'?羬Yl]]XY`"Ydت got3E%t%;p`w*C}VGzZ"5x,{OOɎƒԒNv8`9'>C]Q781nHI1{n΢$KXCsZZy,üic``{ E7Z*R{g綒D}A5MAUѢYv7kL:ڵq:A%F1έa(꣬le#bc9?y#zku+m Ҙ1Ic`}}i[GY7O^ rUD7$.)shRGMKģdxqFܮlJ)%%zYzzVO  0 q!E[q3o{R݌3D5sTiW#lb%yP,,WyJʢ $C# 髪n~e{|h+#i;BO+U]&T3yDg݅_zs3t*yzԚqa/YuLk5:Ql oŜT#Iӷ+wIZGVbrFT*J8'VmD(a"i[Mq׭b30d@!wphgGTu=j[OP[ihbZjHDv` 27_zl/LSDTJy14G>{f,Sh$XgWݭPT?u'}ZNvk|aқ5t^_-[|KթGl %]mM‘3P<7t=k\詥WJLnb qo=;:0/LXi4ycm~"pxΔow(*kG'Ypܲ9׉|qi! zuV:iI}ꚻ51u3ɸ1sq ltýqvV Qԁ亰èy񬧭o)ice>S%yo]--<Π[|Ue/$<>nGB4 ^Dz7Z*iV\ú.]%c>o-X5d@9ovgb]ysV%})h@dzEw,ώ۳F2=׸(){蟥UGt̂'!ʰWPAPE*4B#-VG|v9YE =fZ f׷oc:AS =BC9R g^Cn\Pi M$0<`Ɨv{ ( HdsHe9UoF8|1QRWAr$O&fZ8%k 8%eqMsZ(5E==S5Me{OT(uT+@Smgٺ:\:x~ctcBgfppj:^[lV^dE[R]Js+9{c?c 5֒jkɞ( þNߑ]]Mj-4yZhxrbI45YiRQ (.ߟ9rWm풪#bP܁&/Sj(ᩙWیrF=0:ΩFx! ۶"rK~ts̀: |Zm ¤,HT xMu#nh,6TSϮs J`ql`1߿qXENN\*9Nau{cN8\ڭocE9 8YvBrd-詼-7a*wymxL(GַItq2aQIM$D#`FƅMU ʪ40`gqn5SC`JWj*!iE21E%'lˆoqZʳ~^ܑmMw0Hx*{{s4&T81oN 6kM)t%`#vqۏ:VnQ_I2>bb2jeVSDZwlp>" ynڽVTj(9c?oOMTKW4,c 2=f-_d s E6 B o[IjDtFh^;uT81ơF{gyOUV*'\ibw/AĖm<6JVF7p= ibTO`3Zc^psIŜeFC#𣏕D(K -nZ)cƭgchsǰ,8 }4X]!mǯM,ɮ4"sIx/J52K˜n#>j#Fm{ƂSJ}E qfq{^̃Yr*lm{c<|9ըdaر顴V Q9 '_-|r ycC~mKwJS=qH*g ##KURM!Pe2ǰ9]YEᤧtk?R+1NHJYN? rhLľL]OMx0TQQ4c y˿_E_8BazzĢj\r]c4A!i'nvk+HSOȜ|雗Bx9b;΢U#4yT E2{ V:( ܇1Jm IӭfS/|> dZ K$w&' |;~3v:ЬA<0lXjQtRLS]Y\& ҰTdO xbp{TVVDL@<=5{߬I5 ̱:F W<\*::KHmCDB {^>wꚁCF-qRXy?/MxeЖwwm[*Fh*<F1H<ΰkU3r`sd='5wl) 9:պho]UW]I;.%ݦz%x D9!Xʽ$.c;qpKPJ$ƞӪڴ4ƒ Y܃nJ + "4qFʹVd qR{&{4AM)O9l~Gn{F m1tK)u*nia#p7ϦWP!F< zhtn*[8r;?=E+ZIppQ`jX #8Jhgco ()e X1^(02RN0$6凩գN$RsA?\[SH $pA%rERKl<WzZҴ:j.TX%fYd}v{ Y9w*21Yi#ebC`װ\&!y?gޤz|]x>g,sk,o$ϧ?Vxi71eDaTYEd(Ok5,Jcnԕ Օ (d*( Jd]ՍrRdYx[lK.?qF dFHp \o5Ep5J+m̧ Tp J=4^Pa3~$tv4SE 8닥5Wv ,s.(sv*Q&>cN3'#K='\$gHc4sb΀ uRGE$lfM*F AH.!ȭѝL-mTH+ELs?uϯ>K569B5:l}:%d,; a#ӿo@b:Z$vWtZ iZZX ds+fvp}rp8pսP=;=Q bElK4jϨ:}U~h4RfA/b~PYvVN!b˜ʿF =8H!Ñ鯰OC_OQ4Y#bGVelS}nD[F TyNtdϙf}ȑ:{ØQC?Y#צAJhKMSu-DV@@N=j{!gJHŖPӆ~\ݧhj #SM7v9~z9*ԴgQn,wuWu6ǩzys՘Ht:jJjezw$=I=<е<ztz*cS {s:=d)HY:QVkiRFx{F˟y*AxU3 nn'a̵#2_}3jaOҥҷTI, rp|C3|LC,KI1&Jcq˯0s'VCXM5W5#qz}LEhCOS(U sÞ3QtOuTf; 7wPwTD6"Oi6wdi]Lqz@i|8+ ~y>tG]T!u_DtebGQu47GYL{#Nr}^鮘[FT@2'">!Oߞ:K}kRf]mVhY27)'U"|R#8ΣyB.ieByMI[dk=[GQE;gpRH;q骐Ԋ7Ŏ: JS" d9:,1*Sqt5Nj </j5c<`ą'*O望mfaQ=OjXdunu* |j]HI2puJ.vF0 <{@t# c {"?mXXclrΰm=ux?t]|*&]ފGثo2RW8>.@A} S^O^鋔2) kQKp3 df$>5I2gbXjjR\1`@j3fzFI[2G'IÌ IOZDI6%xϦMAQ.>9\Ē7.y5v|C`&?5I5MtZhbTT@+geZVgv2{vqA\3IևgEu dLVbv880NA)]UE7kci9! ƴ^٫ MT)'x8.^39ӋM@Eñ1R;U! #^)zi$zuvx&|ЪD|r9>9HךHIZAB5RCؐu' 1^uMp`H3 3cR*AuEv ~8Gr07//T;)v,J2n5rzJx[۪Ğ&Ed[s܃.鋌Zg F]OXޜ9==Wg)pd9<]!)H2-,G3P{GD[/UmBh㍰АUd*lnF{g״wR%E(Qp `q ΁-KJ EduNɊ`}9a2-*j委n0\Lm98{uT@Xn-h-D)P\{ꮟ^zflf+, %FNP_L`+:zh)pJmQP|fn dzmzUth&Z$@-*czLLUH%VD!+陲Nq1u硭uߍ/1pscL nzyi~t]@0H<#'0#9pt;W6fINSk[ٺ-?IUSWё"z18 o'9qY |Gp{jX3 lޓ\cL j1p V\x݌jpCw[j1yUH2MPGYN+`54dˏP|FedXi䨐b ,/m6 Wj/:bRX<㷯`owJg :V`(e8K(R9_y;yk/髲d20$}+q5˒ђҤ)j!Xv{ gS%BULW ;MQS0mhTZiVSJIW* u4T*}o(TL \J,0TA,<`wEU:1Uy'ӏtoLp\aTd-CuoyPG2="jdvU%7`pw!#=s}'N~~<7oGUSEг3yp0x?(La*zqfG2T9"Lsl?1ߧ)kƤFy{JSqzkbiypo@9ƙ HW s<-/}9_)VZX$vFpXܴ5[I[UM3)ӱ`ϦuҋQSPSSr9xcJec%Y9^|ghZcːΖZ,[G\m܃9U AU@y!g#m;xcCznQXv3>yrNwg '"jVk|҉ O+^UFo$-QTAVj ;#IP~=$r{ci㩊> b%@ `FpsFQTVmo2x IK($H s#OUWRLTt8}8#WY$k-te&7RxAApy^8;hT5\tb99S}\(TM!*LXwE-#*Cp}~zK2%1b[L-"WdZ6 rUߕc_t:z-Ы|YTIGwU+e릚i)pVe@$8ǰ?5qc  *ˌB6HFR HF0}#IW[@jVBXTbXT)k%H >+M٩f4M߱w+DH,8j^@9W*r܆G8:ʊAl"L]T ?܌kO#U 39ʫ_@{\am)*pq䏄~YκžقN1G"T3g>u=3_B#lTH4yľCn]kH'R'xAX"೵ݪ2 Q"O7z q5p"hL()&nVj))YKWvVr9 ߶vY sH;ri'(E)]'r6P'f"' Eێ$ҝg2I\-S# 3oy]"BĪ \<٣.Q"AHG9'aO4`#$l]$ixAxyZ[Vgma@l.A#Na#0R[ D߿mqTTi8I+. s {hm/-ڕ%`UFL7 )~dmdtֻe_ WGҡhA@'p9r9'WیR,x;]+v<Chjm ѣwHXʀ~zHF#ܣOtJS@u6f%=eL&UҪ8C>/5\m ]OG2F;$\i&ub?W?x߶s;UӒvY."E:m$ppx ~ Ə#ª+lڭ&GFȸUU9WmgqɄҒn_ܞP]'Ue/A"AQ T#0đzsORY꤫z6,L3=^JuL4D&B"q^^tyiIL`w:ͧ,F(S˗T0raI__i[ 0wRj&$s]TUDU!|0qNqow;MD&R eCzľ%GQT(nRuEϢ)QK،޳]շ ᙅT/4f"C%r20 W%8dzhj'3JN>!E`PֵCRJt(pNŀ'`_(_ {IsͣIrOm'T4Fq!Ex$&mQ]^Tާ;]v֧nVHe 1${'4jO.iTJȨgfař qAQ*~%nܷǶ)U3قgb`#]%-HS?j(ì8g$0 <\oiC/ H+taUD ?xWCiіm5Zyz_RO$A3AbBlVj Smz`%?.UUd!O, r.00p8%Db'ۇ=t_5VbZ&15NC#/HniR-SsYTuiPWhH30?K5}- RE*7'GLYfO=Q䨐98:E*HҶt̋iR'SO3(UTAGƝ:O/IDsGopj%Tva:cê>2$ڃ!~cZ%@TRTZb(v;H\`G'Tl} EmB(C紘M8''gWƊUEMk?Sާ,FlHGڼHux2t¢qpi((dJƒW9h-VKi~pAp\hh=+S&ߴIPI#*y<`FKS*J̫P͜qr{W]S 9 NdmSMS_%T<|lP>5 #MoeUmڦI57dy<";5'Jg_Ks~uvEI"u#׷#MΝE,V$hm)UŸ`NncQTN;s\kAE cDw;Jln s{v:{˭=ZUKL$i${UA3#vztSƠI [, ' 9>5U[jdh$ pP4T`2ײ{(&}H|ΦA)'Ns>nt5%M 4Wj&`%c9/a넎e>Jd`F@='HMb,[ad݀9]u"'> ]X4"L9gJV*\[̲%b`/_ !}Gyq`'?(T 4 yRR1j&R"*RRw[&rGI(ch2&8 Ax")QFm0Zx[{Kj#5yX͏馞. 5]gr".1h,WY&zV*h.N?-+I.aԮ7Xu7.W*[w1JY!Dp Tغ_T|&zOO$~4 K 1w$Ōsp1wV9Oo3NB; AF^ Ft0[1Rti<S3VH\Pp|qiOmgS`pt fl7k2JOث;(ilVH<)7O՝zUXi 5#3.$XF3 l.q%"\kbUZbW>{~ۺWĪk=X)_ –jnl88?ũUd l]Mڝv4T1W;9036l*; ~u)1[IGQ%:yFYf<|8 ;:_!zj1ogy*)iVUҡM*H/&Qɴڱ 76 r;|5F<#wN?OT LXZ@ ҩHB(5RHIpr<W(T3d7:Zq&xGu!..% lu)Ybrn†2<1c)iVvP 18#TX<Ӭq>GD?q{\yk* lVRyŸT楖(*5v*S(}U1:Ja0ʣLnm^Ts(vO{h=8W-c};jYlq #s?]pm3A\vhfc.I_V:M#Cqz| 6sCy2bI9Dl6x-<[)\Hpi{Np{`jC3j4^\:Z~ K "ONy{].s%Q|_pqNO# E}$Ex'e`'Wf/8_1bgm?C :HnMHG9=5[jmGikZWxjϥbc|wZSSHÆN؎.:LXHAVc/MTGGzY۴ȇv>1kDmP:{+_TCNRQ$Y 烧ޚKu5p ,sǖHϦ|[ڎI5vHeW֧`i<$|]Jڭ}CUU- ( lw7Nsg.6*`GF)'JZ uYI:sLMmɨ@dFOc#Vu3#7RDr6h"GVu]MLJ42[n@$ 3L]:5C=IiXI%*+ rHWdLks3M砺k/7 ,։c3Ely ds#K uJH$Vح(>OTuj)⧫w8;NAlru$ѷ٧rsFoO8)ZsnCE{Nҽ{{$ڥ%=biR'Tg< ~ֽqSKsm=!$=A%O#3Z+U]-5BAm dx c4 F$rƾ)i0:{t?pg/xt mtIK$3h0WrH9~1xqfV5T̴PT!iR'*{d^7J䣼P1-D$r}pMn>c45L]Q Gs:ȗ0^UAxe`e\v>RP-u;t\w,Hc'_g7ʞңm;dV}4vAQ]4 *LXW ΄drw_P3Mh,Wif%nju_nߋhrG$N\\u:x8ܹݍ8`9ק|BuMik^Lj \hIQO޸a {]"SSSJIbn$$sN?1 :yAh}ei<`QUH~a.u2Snzzp$0E>nИguc6Dg _.ڛ,QX!-#ϯpMukK74<ȦtcQrsP0_|.X]}1\Q2DkbY#ͱv9 qx1U1xb#=C 8RleCqI⭶^i; 628GFOmS$aLpȀߧW5TԲ el`O~XZ̵1 LU) 6fC(<|%ͮzd)QNlprOZa;H 6F s$irSB$w$J1ϯ@skch>$dF Fnq?LbzvmǶ zpC6mG{ 'ITTK=QcL.ҹhgWPR^6ڣ};_*['yxH'qlgUoTySsFT 䌞3zj\' Pːdldv2 i54A:#~ G'$SG+ʴQM 2nx >? bIU BVd8Fny?~[c쐫G4" pe[; F$NwdO4^r~v9 >A#j{\+,Ω9z }>ھI!8!2(h3IJHbosυO%jO;G 02{IZGު֢;<27ˏ?aQFjZp$$߀OK-v&sp1"zbc2Mc00==οTMJ)|"ȝ TQ wgJ-ؒ8gBa|N䐭!`B5I<5Bז09NGįYmRÿeG>#~wZ;:j$C=9~_4H )C9EwpI8 1΍I%@V6!c(T` qKu=2Di[$ zB2;;ՅZNBpDgoq'2? ̕ Spd&!^%÷|s* mHoFƬ͍]y0Ҵ5T(Zupш 9988 R LhqM1( ?DJwӺs&B}FQ)$P"M,Ix# xOo_*98XC{IϨYYutqc3;B%mk'Fܿ<{w#^zz:hᬖO.Bx<H⪬96łS;$+]|B$C/~yK8%xInh)ڨBpxT3[Ngy?5P)<x8]5DGO 6*mbKc80 ˫j;OH<1V Pufԍ4knfHbUP6 %>֔<2Ire2306oc `g#'I^u5AnxvRGc$CcaٯikOKtWuGMZۨo=𕨖JoBA[`r4=ƻίN١%v.3G*', qqƼcQ3En;z}t^D(B9?בvXFR|o7*ܺ{6T yғoLW~Px,Bi*|ڻHo.JhG! >O;8lfjHg*1Yw}'MPą\˪Gjpn8> "U%~zUx yٰc5u1S<5VM$D^c$ |!Xd PGZR!s.&U4Z/TEqjCdF02メ xw]7-W&8WdVW@Ava5GIGTeM-LʂO=Kݩ_΅Xj#8Fq8L9R@:v)M S%Y&s@#iW٩ i ݸw##uU$VyIW,UGjo&viSZҮد T;|g`|p@VΖj:B؋4II~{IעZCGwʛ5uX+Fdl$1; 0\{'xx]%k5h*dydOe,ˀ;`xt1->wF:eiLTUl#(F22>`)?𓦺DZj:yvE 93E(iPxqr3lҮ,P/E^'ȕHs5?d'#=-KW?2G茕QQy 9]vQsI8NBGƚVؘF@ܳ?-|#//'d?A$g/Ks?ܑ94KUKY?STm[Oj*X<@x,H0KGTZU4v aT$8-yWO!p?::(9#":"9SA~\j)ܲgEaG#Ɨ(Pe7L凖|#%Vl)KPʲ"J}qcV8H^B<3$ozۤTU1.[Oam(c:Kbfh ?MZdu̲7un`gP8cG v42}֒ LiF8D$&W]]Re\aFlu,*eY\)#t8$gWH)%8ZZ( Ĩc۟}` ړBS%fdUw3;3G+̘;n:Ң1z @OM/r6*h uہ#s#iSUo>$Ip3{8%5Tros1;cT\j`v|+x8הmx-m)D G{JS2d'>c@=|jD$ ȟ .#s#+O矦N%F:S,q5^UQVh$zp;j1u4Ҹ r2;w#DgNHCضh$4QO\GlOX8ոeb I-KMnQU!?g4A{yN mlag(`99熚L|hcIKd:0*o ޷z._e-m\ds4Lĉ`mx13JJYq jPW'NR? ؜uH:F5X_4̬ev8>B%~NG$x'ƱD(#} 1o3[Y.bDbmm U лKN_( zMl^U;E#gǮ{0RdhDJkkkvkw/1Tޚu:6*v5>U=toEO5LmSrQH a6{a#2?k*+ $IJFsFp3;5\ pK=1?-.ivc2Pl#mMzGH,o1"9\wfI=E=9F@i*O#9ktNZ*ܶ8$ GUOW_+M<=#ѹ'c:wGv7fgT'HnVm˃95j;MFwcT`~.c'WPW[&vg*Uϸ:|[,/)暦Ucdw }n-ֻE=9W5ECL k0ާRj6f,έ/&yk&-Xܴ'}]gtXD|.M:PQWx+ (Z-o}OӲXn,~F+* ,!qψ-ŞiEI[M$QRjF@'9>.Z櫝6><ʅݼ`vw4UBj1:kk`i吝m~[/D!W2U:f:k_^+A&#OJ̳4͟, 1 @IS3CYgsL#|{**,8vnHFz3[M:Rl.{ZR*1V.5Z ZuF6 OŌIN%JdႸ׃: QҠ1?VEA"ylѫH+Dt.d)1 >B>ȉQGr3MۗuR6Z/}6!͈ q*zIf8O,9|`!dusPNfq'~Z/SD(p=)1"BXPTC" %} 18SB?YZNb_7 v\56iB(Il}x΄&P/rڵ,Ro-j\V?#9$(SƪPн5N T.[t}=x# {s]Jۄi諜'lw)(7a 瑫SVR I/z. e֮SG8d+2?{d@Gt.jL $`xcV#>#vS lHWQm*!f>`_:dh2 r9ċ߶yL]"Cc-7*)^Ml1HIU TiQܜHdt` wNKETGU70F ?^UUkr?imZ͎)T/Zʨˬ|!xcUi*#Do9#`X)G<ך޿h61Ryqc7W[lkj5DJt6 $c頗[ږrNJS#"D4k.֚!񢯭^)-5,<2V.QJ )=+,Hc 瑏,h;" pu-Li(:*Laä#TI)o!OUIS %Tcɨ/1)$F9 nIE))gvfEǷ9QHܑLd2,ru==kM$xy}a6F 3**YN5nzz;|3VC% K54\^*}g5J("YU-w r@ c>ط:`D#F"5"W~{z0=r!sj[t'!y2P3Ľ3AcUM+v܌U}Ɇ\ x㑯Pj)IgcpOzk~{Sw@@\gx= 21zEPuOX';_Tdܛ*Yg$ab}b9퓬SoS[8%wqvޫ~ Q7(8 d y'J:4d݌2^~`MFmn !+6f#[%MKNYcd'=9x'(Xa.ǖ9Ej|efKuBfnso;HF=y?f𒚒FeJMO.W aʆ;ޞDT/?[ǪNmȴ3#}Fr@ ]e%EGJpxΕRN9We؃~\hTH눣j3]625-fӰ"e<Ϸ_6@F쌜zfh8ܻbU[hZZUU3.C*}r?:^JXHˌ|J9=VT?J0x<18=5JOpF%/O.v ]Fy(TCϚ]GpX1N{Z&ZsL!c2<t*)gB"G啲n^m1SGNIt4т0@d=U58GR˷bc>53D,b+><v!|{=x?LW_"U2wax?{m3MGQ> X0@ c_Ȏ'rsÊ bL};q+=,Q|] =~Ne03(@09s;cM6^֥Jy_s|4~WA4sĤXp$7H+/TuS9ml/=_Lu#1DL~9vU)I%ķxO~uԽ+GGS XːqmSIē/Q-D1:Tj2R! *j]x0I$+5~.ؤJUYP+c''w A[AneZJy*dLaK)l''(d6Π]hjVSP#@ҵUF6,F3'GV|8# 3dkL=[KJx9jd7ثSK-Y&s%fqgF"GIM VlpA;؎䏖-CNh\yQ`;yꤐ4UNKWDt: my|F=MTclHV~{U#BctXޢyK3cC#<}>4 Cj q5Fܺ#-D%-4723/H$sDcbvYUmCSO"!); ׹Ex.6_$g{ N8]* +AMjFv' AwK4[a+0U$܂Llb. fkJ5USNː s9d`hE(LI8OKOՂTk+3 쪭1c;hB0[gH=X.D}GsR"l8tݒԔ )dg=z4ԗH5bf-Q'04fa ۻ8F3KpeZ,>;PtEK9핪A4]UeE0cӁӒ-+.(^.4 ^P aI;r:Fd5 !?r'|Wm60vŶt ؏6ZI}pH|Hγ牕ngxGA0yX #לY+㍫ 2YAd`'4OlKq^`I8& NV)o 13‡$|G~y猎چM ȸ;>څ#D]1)uS#r 8}q ɒ ?ZB"jrgQ3$ s_h< 2rOvba™  4ӝS4-0"\4+ 23)=#/يCyʝH? |?s.gO&[XvTw$ Ω3/hUoXVVXڨiU^Te{,R$Gtb~Qk\( {]=Ov[f5L(qU+O̬m:`g"7ύUMyOaTDi) qxyx ,~z f FM[mL}y*{F4" `+LU[=]UM$qm2a2LkNUz3*@eaa،~zٯ*r-iѥ̱P ժ~3:?=8eKg7k$ԒO3Mx=]%4Wj$p$l'-r;X4m!i)_g]'0D;Vi,thO*+`-TS\sm@i6Id٨+$Sԫ!ǰʄGA]28bI'յx]o)ClqJ'Β%Yǽaibf>T9'ɕv~rsaXVZװjɘ ̐0ʡ<jppvn|< 7Q}E{ɕ7+*Y.ݶ;CY7j࣪b$wrCr#J lyңuBe:]9Vk ߟ,d 9HҤQM #۱(vmٺ2+8ɕy!8 C|_-o5٭Ui*iwU"P2gNt?cW] j9"S;,y s#:m_֎NK'REHT}MOOsJ1sW-ێu>-QR[]3.pϾG=Q2SoLT`UR[@$ {Şqeeb? qFJEADP89a5aޱ*4o-,}35*"0BYR^H&+lzV_kg)m\(soSWҚR.]rcUogcg33hbJ"`vM pA+Z `jǣ-ѫO L:WDU!z5c1R<{r\`p{}tqn+|# E&c˗~[5_"OI){qWz%^k=%PjƖKj7DR Sw:'q `})im,&2vx9#Q voP,}ITA/ 5GWA1fPw>1ú(OY'BbCXW.Qӊ᝸D\ ~Zi| 4[=D1GN)21(؜fv8*aR=BMM̤2>/Q]2_paW (6N΁Q23kh*6)51َwɜRKԷ}T06Qȅ}S$;jz-/!aS7K[m UT!Vj#1xGIIMyN0+$ۇQιKTO"/q¦ 0KĒ*?#S%ѬI V8&ltK%u? CHvx[]rH4 +@,8 :}T=29r's`q:%R$~qrFI9zؐ׫kd-//5]*MG*KцS7PW20 !@%׮* @4L8X19HЂ>^= 1 7EF=sNvH;+CIjv Hl@>j+VoZHD0p¹yl[b 'XuPM'D19s۾x|Up3[s5ifdzU@MuE1,ҏPr?>~* tEs:4Qi'IC7ESnt_;MTqBnH{sα/|cuW\+9!q_1NV@AO:{eXnlwLq$;nCsۍ,^X jrS,#v"Qu^gO&h H;Ԑ5)EYC8s mVbJc~5ht⺲)Kciu"-)F#>9#;X*NEkd!Un#mdX 2%dovwkɽIzK52T^*d2K3!ʼn=5u ;=>їXp iײ[ ]m*+j!߹t8$b➦9i(1D s[s=C6~NcC)h3-UUx#۰NP{;Pt4"'C7tv@ ~_M\YڥTӑҽZ"He=\+!#Z8jR1O9 t[ AgDbǿ 眙Q߬ ԧLea#90KMW4m?(ZDy9w'_l$!n"SQ[;Pa '끜H+'Ϭ\ig!\<,t ! [I#SY ʕVو'92Gzܦ˒pT`}4Iдt;@Cb5^l&? o}ZST2^rF)-|{k_ƊF~4S׳FV' GHܹ`łc7HRn4=#$KQIFg-;K]T`®8ĒWi~{ y;\p K$G8_VO=B[*ZwCf' Rxq=B1tM]@tR)x9khH }Z+k$T=UT,a 7momEUght!䩨JaXs 8TTU$##',;Iʗ0;iK-13ѱAO; ,}O~T}jHTǗPc>)Yp-$ IQί]M=MSv s꽳iժNC};ꘂ,e?GWa2cI *a3f>giTiO\.=6އ?=2U :*orQlx!'rĕudg pxXrp5*ʧ2pI'MS`bhw=CO,us3WhӁ壶dEAsjULqJ+04ʌ)fmܕS4AwiaxފE-!|om{kXNRI$c NO% a3EpJdcя e j*?.6 >ZH(RsM4oBü|K6TcHX9zvШUtCJXmch:M G@]yhVKkWsR y>#O:E_6+o#ϛSYS cא-q@*&)C0#0  ގo+.ыfKm[`GqL%QV.R;}uRz%<jTyr PXk|OoE\H( 2ʶp)F9#aNc?#׌VWV%nZ)lhqb{R47'Z8VH+jk$I6¸N9Wlm'5ihnjb8h2{zAkuᢙe ~~z.XiqvX|,cVB m+5F)Kn7Ѝzaٴ>kɺc޸AgSTv' ħ`،<'Mc3uԔtv$IfErLdHf2pnuI!Cx ioRu)IuD)j@ڇ^}1T|Fa5/~gapJ79 8mR=;j$1$*s@Jn?d*d)zg:X}"KK9j#Ӟu-ʜ"[`9-JDn2ʯ~CV=$jͰx?/ot7jkbf$Eq1v 2AFd鶖].0qGl{EƛiU!W=}4k~-F4k I b>cCWF wVJz&#'L5ly&NɴR[8:QY*f9m-jdZ%a6o`5+fmVXГ 1B~?;D!DC1*_mP hrKu{mƪ5sP7?\{i ȡ!&) *G~~ڍ74‘T.=O?-_?9\oD:㹺RPWH+Ɯ4dA#9\ss鏪좮X)rUNC|^|ZԲ:?m-&SM:C] &]6އ[RBX.UQJegA{@ %vfl?Gn;`i]s"Wcrc.)*2W'R:@^Qǯ23dǔ26f;uu$m2sX>-od; N qh5\XXקW=8 :)F0!ZMP[:ZǧeC?##} -w)=@lcmc}9qBXܼJ ĊGL;wU3R WsM#%OxiFBJF06X=O=hb\8lSLwֳwoV%lшoE@ps듃Zk}:;-S6ZJ{mV '2uq>Aƀuua{I(ⅧkD0/̾GnF1e2B \|$c=+iڪ7T,~8s fWpt@QdsF7#CCT,O#оmCsxEJrP#=Oj;)0Iяc,xeuP}S,n2nOΐM-M%i ͞I37WV]E@HedDy# GuN[:jTFdŘsܞ1߱ʐ'v(jKQn}2c?@ O Ɔ\:6J9de,:HI ;#?LqzNҦ6] rGfU9=PƮԒIf98Q9v/II:O,OK+ϗX>15rآHҪz``#LTp1C] HRYX%g<~>:"Nƒ"U8S騽 #='?Xh=;T1Nю3qA"(I X$t298Ǡ<5e,SURi 'p0׾uW"څ&  z8=03[o8M(eyˑ.-TC⤉Jnb=៟ZhDn_(c.ql z:()H#UY$s^{Q@vZm:${;>Dkij,UK#4h1G)V*XxmQUM޵`]#pDdQTc1LL 骗]eMbKY@>5AƪD,RoSTS\nO9jDS=M1\r<薴/=4ꧻHA8Պ\U< I$Cg` G{*ic]!߼{9<ꥸ+/*jH6>*|vR h!+z?UYrdhxv=i{m\mzȠ>\q,AL3TY۱ y!€' (;qPpw7sQ.Jy=4V3˺8Lq,O;gmK3"g:f%H咡]0 s6cmt#D)$l+z2u%%dhyWsHT`dÜ鷥RnlQIP썁U YQz(_ۣ# m*uhYI*$  #^/0D?qtj? eU=%A$#ȶU'Y$MW.ge1^ *=65*v?Q- GKGA%]$tCOE(N &>=V{-WWx6FAX"##n뾊~ۭ;q eteEv߳a(IbH>ED @}6]c>hތ-Ϊ>FV* "90s!LFaU^aVyTJnv}9 wծ⮺xjCs ,p~l{L|+ $Lr8OQݳ)h:&gbC]id|ɐ@@LL^ \gG]IOAsa}o_"PllBsc9R|1ΒQGaTs#O, G#sl͏sJN9V^J#` 'J}J j-ؐ5MtXBHR}}t5RNgW*h'=#'Zk+bV;%88 W+*a6I"Q$݁9dq5VXNKNQƒ}$iA[ 1,U3BډQj`NV9>1 Ҋ’9;IgdcԍgbTq!PNJ<ۑl=&FVN3wNtsUpO)i';Npy8J(`8#&x; py=,eMdcZLFqg8·[LYw3>zY05#mcT0 5솯}A-CMӵ~ ZC {dkRg 4w͐Ģr3 3߷sC5ey!J ol鮓ěGJs<2."&XWs1^.Mx-$So~5t]ނ+d΢.;Nz}jeBۉ*j*J'tk+SJIOY3O ={.Nsod' *@lFu6ܒZgD23; W~}OOnXCS> ۺWХ-%헂w`e?>uۧV-4 ϳԌ 0\b}/x&zygE@ ilC<I1ӷ ak7kSe-'QԲj*QQ`9.r:Lyc\;` h!c='{ (ԵRRK$`*1l vlE09n$ b@%ˑx^;dwǰb >FB84)d/aN1jEG›G:.B?9'K[TUAx7 W̎f 88hUu=Tl;p71U*c\31FބI=5/c>w`3e]!N.|4Y NzVsSCѷ&('d*kpǡWKuU$*!3U }s6N:yU* $) d\]L\#:@( s\ .?DIh:rCWQ-#$ 4maMjd 7z9O1Qޕ*Md=& 5je*(,W͘B;|U[-MK"!t NrW'h=FsKIW4@MĮc q#%H8)ߺ>ZJHj5[n=c'㓞ݵN >ԨIo6\n3{]O50Nc;H <Nu3ݠ=Q0c |}AeO>*y=9uxdr\YKDIڊy9$g'W9Qn ,DžOA*/QJYRN{a,?]nHgHlB}mO%Fͨe7>cz 5Y(M *s\V7#HɫE*5z_N䕕n (B3i#m"]o=U{,; !)Hwoib W)c&De@F՛'ǯ~r2GܪghOLLI_^4DQPTv;H[ c5D`{ITcj;mTUDM3E#Q$>K$23᷄ 3߷8EM,) 1vlon@~N.hQw2?u8\fwG^@G>52TT8D~q*p`kvf B܍Z-?YMUJܪ;\AAwmѐ@֪l1-2UV2T\ぜcoQKv,Hsi X~"9L&(G :PL~sGshάDJU).e ILrF5#N)qo@FUڑ$Pɷt|t>)#l翶$bbH<`wRML`y5o>C]lN=q rW%~>A}urH,%r>6VLNp>, }8Y䯫3]È; ?0;[W[C"`P*ڈ-RDjNx<{颚֭%⸼0Q< Uy?tu ON]U4N-=S=}T)M'Js` IuMgGu-8 G:GRYHHk~~NUYF$Pm&*Fʂ{d &xu/FU O5+IpsI߸PF_ 2;ǩe K;{Qz}sl}ZVUQr>%+0I(ZѕU&Z)]nNe\l@VDipWtK  ?2Է9n53Gq5UAe@@Pm?#Ypll{=8Z}8×%pttFH&c{ {HV.TG<{xGdQQEK{U;(Au7k`XY.ҁ {hqJ&;1Pa7Ou4TSo/7cS3GЀ܋3Nt%NscwӤu(r$>B,r7fgץŷӢSV+112g!>*@:sǹ:o:~NfIVȻ"TA* A0vKk}_Ol:w*8$qYOJҥ 9ijXzF5kn7j3e;4mGe@9`Anv$hMu㚚8L"<'Y=FAbDVIO0^>:zxZu6 =0Ў8E\*xE-4ۣ:Sz=˦%MV֦ %UarčZgU5K[G-SD#g IμjE}cn\0i!Yp]B˜-4NԵQ3Q1O \ htI9O~ L<}?OVTQ\"H_i9H>z ibfe,Gwܺ(zؕ?hJ,r_sw5BI i*;wPٽITt5YfO~Cק1G"+?uj0^Y'y=}uk SF(+qG @U&ִ4K3{svx;hALZ0?mIhfL u5mqIaH`zya#|{Uc{B2[WiL,4yvEH^d2ӦQ`>zZ,5ChPD/(ݿ=quBi ag{WF ۲ ߹W8kiKZH?zҀʃ;e]cG HSፓvj&2ݩ@~,|XwP7%Tu BpL8{Gzrhi**j ۔qx㾄-DJKleǠ~\KC[J &.{pqǧ-U!%P!gmc$I$l(fX*|iUF)#@pv {mE%4^b7#5 1J4MrT 'T PSnoCh1TFtI4#''> 3޺w=LtQKZII#$desh,:¨6zԗSC(/Ӱw\KSAUoKnVyHƷ F_.\E3j8MyjOKm9gZ*Ky'r#} 6V?#9M-x⯂t5)Ri _2,wC3ۜz)@^M]㡖Jaˊv<79sh7Ys'i:T]v[+5vYZJYWH2qWYZm-;DԐp@HsH ߍ~YR?\Ƙ9=%.FYyMWjG$lq{Py$6޿ 7O?<2;jM][ErASݗsI>r{gӟ]I~L6;)Wg XF{|YT$Ψ=:Ji\b;U 7p>`? /Qd[ a}8Ղe{=_:o3FFʙH9l8Z t7e)𠧧VN#ڧW9u*ߜ 'Sy%D^%N*Ik1EZF9p8?O]R\^"ocS*R#h sh[6@TYEƕw"<lrsTurK1*T:` /Ìq>G/%g6cu Ǿ}pRXpF<)Dh%q)>=cypK Uć }?C9 SӢ,g?FqQ+&tQqjg0NO~gTZK"t!0I$s$WRRU 8 磞:Q')ԅ c*$Բ־b#)h|=^jĤgo]#8#ZDx-^(tM?P#GOQBG&C6b' 4]zUvVG [<(A,{ zW j9Gohs¦]b<8Nw ccMU q5IjpEQY&>Ts+NYw ggkUbi+)F"'zs}GwI:zqfE$SQ0.pXas|)5, Id Y$| XuF\(MD.T}IŦI(Q0І|NzIgTdid"`bv'i =_Gwh;2`H^jf\dU\qAuqD.=k5‚iJ ZE}΂uXVr" ?yP#<']udU70n{{h6=GLTu,nC.ZBQ 1<` ghg ו;i #0, lp8qJ< GG3[O.)!bq`>O@.Ŏxv39fJA" _6jaHduCBk)8B΍^T0GR/itUe*$tA1^>SR,Ti# 9A]3UQuޡ,VJAcg.[}P@ Nt4nyY=V5~WL?x3ֶY_7 !%br#sxϥf;of#ot3F:8SFH95ky  竭~\Aö}9zMa$PK1J.#;w+7B}Tmt`Q]=IwMSVuTQS)kf đ(OP 1,D \͡:f1 RH< k\,MtpP"Fcpʖc8w:[^]>YbhaBtʶBڻp-W:I;nWJKK0rBC)Aiډ56+!Ji NrDPj ǖ=zbn*zGx&K*|@) $?k`Z2ָv򦪉K*SÝ.>xVOCS5&Zu1rpd$n߇e߻Σ+b+|Hٶ)r*kF9RO +)] ղHmzq:ۺJKlPZkCI+Ld̀9F9_LrxΓaeehTk=)4TMC;" eR8RU:!*=%DGccm$Q7JEU=[|:FsL?:J()LpP@/1DIUWw19e2p #<㚚4S ?AZzmQ(kWȧ7}і}0uUϯn n&@EAP1iv57ʊvk}"EAESSp3? Nx8xQa?nQZ9Z\] IHBs!WQ'T4EH==B $]$4tȜ}ɓ8?&_9=iV4D3rϕu6qT,{`$/(A77MWp#U2[:.[Kfޞګn5DTE6钘d ? o]Oku[¤"CCӔRQ rZ\opP߉fQQF,DC$4E3Lb,y"?A8uOY"J*} HJu&uh!_'YUf.rmw7rC,X`6)sThiEǿa-O+3z>:Kl;C ?u?%>[+Cv2b%@o_tz}ĴW$;ls7} :k-[oRj*iPQ)tneuM'?;^4uk͏]PLbJYᣞ"H9JdgF  z2o"eC1 jғE*翗&C)NI*|m:2 JteDy~Zy2G'v v:-P +w[JٺFw mK>$ : 7a#R5#{o'FLu+o~okj>? niQ*1F2~` |M@#G<1M.*GUkT;EАѫSr-Qګ 8?02֖m1CҞ+/j/>Uhm0̓TNOYcAla:Jw25?AǷ嫒[i˩+jn`А#„Lprq^hra 9w9F(,Gi+nJ<2ZFHȏa韦}& \c }r1>S鎞uff2LN\d|/#>þ%6i*o[igk BC|s߀S6W?(@sD@;堝H˅ZH?Di,8c֯#q#ⷡA ` ݴ9Jz')`8u-~c ?M\Wd{Son#|EU <ꋬ|`5cCO?2tݪ|S(yP4Co O?.9k]K8EA<(=sfV̷GQAR5ib9aA|=&Rϯ`922t-mbl2zEzހ]th)O a( *7#ܩk&V﹇#JeRbLGj$ZA(0 /ZOYEQ5A Lγ[S$Vܫ"20'HyEJ}SB;r0K;CLdd 2ǩm0꺖0uqXiת)AnتD"$8aQ1E*4G.=TA4^Y R*#YB=qǶSk:A[sTɚ@A)|`k6 VG{qۧ[W^c:PG{{NOi*'. Q0i/ѥB;$O D$+q RJgYFsshY ?}=ej9*^8Ƕ8:xEzME3G+cjdp94AeSՁqQoU~/ hU\V'FxvǸj5NIUXXE6S0965D(2PLJ7ȨzUoƤW 3A8quԖ+K$^a$bV?nHևzYJ#P SDI>^ {r@ <1j}bD1s=jW{!_R@o;jH(Жlcu]G? ̮r L蕓 KWqU ed^@Wj. "%*++I$ny%<dtCUQ10`ֈ$'"(sU`,s9U jcUFXNy>Ɗݦz-ԦdsI;@8 X ==Y0Hh_D c{z6 UJv?# %X>:už8i;]$AŒd yB⦎Gx=EuZji2}F gN7_#]&ы! IQ֦GmV 2d6zӖ{{y0@x0.7)[ǷnUk`΀jkRc c#d{?H^h/]5_-moS)u@鴰1Y,'Ip[)꺧 +!FvJ+gsI HtSmQSe?IO/@;GrO`'^JUQ_G:b2eI}9AŞꂾ-,֪QMQNm9RF :/}9{W4dY'00Bgnxzb9TRKUS,m"T, ,  0\I)f4-.!-: }I9"`Ϯ~@U?KA~mӭS!lOU^3%<Cqٱ s=tɭ=P2RuW:I{Ze)".BUߟd1J ꥠE r~c#Jk]=$yb &isAhaZ%NTī0ͯ+BT]}54vXF͜8xL^uY2ѫQ=JTFΜ,<{駦7 *5дp9f-;qMǟs_h?Ɂ)r1v( 5-g-E (`P^$ )jNBiR249Tf-ik]d ahHVU![9ڶXcwovrEn~;j+$hUuV|Һo׾3n.(vG 8ZFhT};:V KQ\JT"S?h_C_ \jC0 8DZ秮뎓J m v\Nvߔz5w̶i: sۿTtn=3DSrCl[ꩤ `u/E\-uRAq42O,8oMѯNC/Q5JRe%ڿ,>LU^Y!$>ZUv(<4XHT6{Wz+X) ^88S,qIŞh2I(h3Hm=rީ]"2Ns8Ѻ4P~%r`݀ڒ>󨩖bp͟A)"D6R(.Ws%{xH9naK%Na8Vl+`TӴm$S0A)8l竖;EPu׋9U i۞9X&1\Y7=#DEuUHY)=pwcpx8ŲURO*-U%@'8;OVsR}z*$0?CuXn5 S,2 + } zs !s=d $`wNġ#ێ?-Z*U*Wl[j}.އMX&UO%L,*0\{GԗHfd0̣kws~nkuE\$'#0`d G>]ڤ⬙phcIh8]ÂG|gB*/5ڍ x&eL ˖< 8u-Yy48;r'܁5]jiBqqeYWj $dqIiRk1%ꐚ <5RLC QK6~PuǠcVr-@q7AWok䢟h&20 ~zzۢ*憥XB#'s:﷩:z_T4jbT I1df#MgTP 7#UGG)JMgo0 j]Y`E8A`=}=u}T \lB;'19sn.ӽb~EgAbT2{vt{J`ZQ P=b$ISjazc=MsI;]?UԯIj0sg:Ѻ6̽V-|@:9C$8 py]BȖ32z1N='9mS~yO%Blv\N Ϡ-nR~+U]-VʺD¯1_PA\ Cݨ=WKEP- *0:Z6CjM4;>^3(t zkۡYec<*Oc~ޚbCYEO<5t10b2`0qߟۯLLr_nŠrywq pp?/R+: t5*vԱrs8?/fK/c.^+ž0cܜd{zv[YjY75;UevQIOOI!cšX mv6lSՙ"`Ig 3q}5Tv?HKTE_?G5]GqEGryO1 茐pX G(5ݰQ,aQ0Axw**JjZtI)f>{mm,R@+RjVFm6K 5 E-0jHVUK#H>6~Tܶ&n*'s\A#G u^dd19o}y}\ `lNMD>|IQl:Ekb@Bެ)>zz U%q(2KY@Nt)Siڑn&Y  &w*Ftz8On4*jVSbTIyqrs9vF-rE,Gp yذnp y5Zs⢢J4G\,-=tT׊Bm$ ́`p2M+T͐}.e&.UE433z*Ii#c8R HDuYd.P{~LUI>zZG 59YpuoZ0Peu v%$_FBiͤm;E,WJdi[+rFQqw ifHEuEY@I<22q[+Tc$ǨmTU+X*Q%##)Iٮ߈M-;tM?ĊX O#=Ά^oJEwڪH ѴJ6$-Ux RxbJkBa=z;?TKoZ2¢(<8b}F}zN͈sQEsci)#g`j֛%TS,+"Jr0qzeE=L6%T OVjJC1^Í]nuG{ (wL='?KmG?JĐNomF'÷q8B{^KwF>Y!UPU<{gKI\n:&Ob$='_W]:5;Xشt^l H>9=v!zS]-n ӂ VG3qa{(K~PSL>H}q[]38܏\{'|/u5k4WZK* vb1g xYS7+WQOO RmeT4*@b6㜷~q  Ҫ&|y.[ʤZrJy،=jk4$b~"̉Ϩ~-qy蛕.4:YII)' Dž{r}\g/eJ[%Zeb)T 0v7@3ΛS\O] P-e ? =bҖkd[xkˀ#-LM[`9=bi!ZMQt[N u=%mTK>1qq@iᡆ2-*)x06G@tEwڧrOsΫ6ZŢNSM~3Do4\BH*7>Pk7[QbV2EѺ/H#P22 <Pz *ꞡ ¨ v5nk'+Ex hI H}X]]mCX1F=i T#xiiL+/a@8<)X¡)Q|n 29=Hټ+-)mx"ᛨ1ղ}= 5b]H li!=x|8Xu>5L0t_ &31uWS^rZm֚T́BGB!8ck ԗPSU2VIOc'_:T٪bU?I8Fێ=b7_/=  %DyE9 >Tj(_jT 𶾺ct+] ͒yk8A,Q>'}f[CQ$KYToB=':F˭Ң:Z&  㝠?iNi丬v*ZhTn+f?c-59QoV%&A,\Wj?zUS`1m"$SȂ=>Ó颴~*͆:# HS~ֲMOL 9䳳`O=hlۍv'gqΦidJhڢX1QQJ1'cXvkX۝[xG4UMq Aޣ%017SqkŚ0:״ٺjIjR&!de,zuZ jWV_APT.@8#:߼Fwg˝=u,u1-_8;W' 9+7oBM"ˌ*giHd$R0BN"`lT-$͎>.k_5JXt*4(#v'n8UMG3覌-M |ҒJ !`#tEgX)cgZpT xS;°<361e(lz{߈ck X551 AHiso~zSqCA~KU'SET<8, *!Ac9m"ؼ,ն%D*V |Bl!$9f_,Wg)>:1Tp)~0 89bu͵8V E;c-FE}*$ =6 USwkeQ,fK Mp>euMU.רk&`Cyd8#nw{~^u::[EPzU'Po61Uܤ2& tM~tKM8q[pEr,Q p!'nv@w)[km5#ݪ0HvP0IȐ@{cϧ)t_T$I `"7(xY[5-!QQ'Ra,d>FS`B7ixzzZm㥪~V+[F*e*ݷi-2XQxw9h픰ѺabV0ʜF1+{ڋ/SCAT1UWܼ !pseՕ3TʉZܼz]WQbF y"O/o7j XB"pSGa-j+uZGlyɓ(46hϘ^u$d3']X㬈T QbA'IR,SJsI?#L2n3s~g\rOGiJ8<}1ruPSHHI۸ /轮j)eGyhpI|Y+O1*i} wgF0NpÃmUӱ?.`g:-v[7P4C>vӠx\}4>TnE<`<Ĩ6;s-ЙZҷ** ujji"IZTem8? 'cnTnfU#QǸ*ꎜ"E0 Xq'q8j+9|#: KZtr;Sa'*<ۄc?yIB Ӣ)`'5509z\~2"yYJ\?/rOX#0HYX$@?BRX({k=U1;{ל*WSAAxjO."%QU瑏@֧;]L4wK]cۚծ„I:m.qEOV3DW>k>wN^I'L2S6.+ª2NNt2:fݑlEJmL_KjԝejR=Ye (^Yq'T]=X▢.{g.=}/RݪV21!; Z\T>d{4sP߰_ao 9^uTxOP@wAS 1>j-vU\! 櫃`% emS)Y<`p92PUB$HCa ĕeӶ@DRRT2 nu1m5AwS%i*3>KOW[)(zW-QJe|cBNsیTQ~A,ۦpI* 0qN5pضQvtPB;,7+o˘Z;Kh, w롽ESY탪-uꖥ# Nskz˔hB&r~[ճi]pCv#5+M̑` lՖ&eMŖ %AI>+0]J%eYJÂ&_]evcT&tuF8?N=!5UZK+o8FZ |?cOO3~TI1:XGbK׶nuUCU; LMA^95_TuYpLcטkˍ}Cqh $FvZEαk-vkͦo0j#$eB8p'N4:-U!GPb1ҬU 8*S$j f6913rOt+**-\V!|q>JlRBШ+uh:i.E#iڠ1 7嫝 suP[ ke|!H,`|o^e4,ҒZOL5}PirQ5F6v6:Jμ;%!numHia@oUe}_Ѓr;zBZZ$I<$v$}@qj"YjY7JzZx@ܸe0utˣ h5T9G=gj}$7L :o*jTz=tR@ XAniֿDM_Mv $2y;Y|g#A=CEU >={w՛^zzZV] U'9 g'c \ YA5Tt!@хb3"PÆS8=Ƨt'JjJHy5N>&g98>;GPUGfc± OJ]yaZg:hG s2r{sG[*Uz~bSe v3xβ׈aԔiEWԷJEeq 0Fy>>>B4s됮N7ԣDiF*&CBx/?:+=Lj#90r4Ǭ4IVx%}4S?^5ao,PǮ}.S,VD]ڭ ή@IRà }xUTihI0F&)K2]%zke[JN#>{{ѪmO M<~tj+jR(#rdgR,:w:h%7U@<8c`ҖHr*$6I'h?` d- ?zȋ C~#Z$g+)\ #S{!.F^\5V,Ns.練#B0CgF&G8oHrGl= [w%h<ƨL>p>z5:c3;h C:W_Mʔ *H,};E'NWPuSZT4u/<2~`FSx|(JqS5E$TTY_#9p8}#G m}m.ԲhǗ!Tj17#n2ydJ2a QG??Y]P KIInK{`wV{R6@]K^~ +Pr}4Nꊧu ,I'ێڒ)2ۀ'>z!?O[1cg%&jst mJPI?U&+He1ӶtQ%*c߰{s]AV-+<1ϯƈI yB8$CVlo_-؂2;OunilPU?]v΋P+)&0UX0 IP =4Yfe4?4`gcD**NP&K'X@{.ȡKW+oV8q\c(%:$y  BOX\qD'y2KycP%BT`  `=9괗f L%24cu?#9-4h*NJ$cԐ , ~]o,E%[CMPI5U*$==qpDHSO U*$M<SLsfcB,a<`8# J1GjAQMm(S8R8'}*4sa&QSNW%s֎Jh~v cVv4up 5J/?l N㔎>TR-=SRC<_U\zۑt:)eki#cm=Oj63Ys{Ǒ 5; u2),1` qsQQQtrIW #a謹0f֩_:=O[Tҽ, hݱO'=qMh  xPDr 0%1܎GwZ+< NEǖ *Ж<:t!Ӂ,rosʏn5hO5¡ bDaF_d?;h*/PKUVd P1qq@tKOSf*K, v'c)U"hZ~*HRC,`=-L*+)*$_'FTQdq9NiB nYX卣LadqGw}ShV&S<}QG (%Ivg|fwr@KU;ESۀݹ'׸>GLՓHwc@'Nβ U1hd;rq U*i[9B>]՘5pl ma0̓;3ƬC F#eP\chV*LRX|A߁M F#8ӓPEjya a>6K|TN${pwzZvY?2(+eAj )Y t-0Hu)5]#UiIW (ry9?{F+E%Ul{| s8 i+*M% cU>q:qޗ aLBdǠ2^ 4vR<k`n~#N͊jEK.); w ~xΓI:8:H$U$P}E?M-S ddo0B0O~uV,RU9XȠ81=u~; REBpNqcWi-Rr"B@)N۹+5c/ap܁10 Zk+(7%R >>`ҝ{3ymDvp؞E_oUoq GSG0eV{gӿ5 puXҵC&Q.pijOlp}G[:VȒ٪aG*29lz]~Z ΢(fjoe$8iì:]<3ܫzhH}]Wʜ oxl2ާ6-JeS0xԓ¨ }~ SM4Jj١]"Nݸ 3M1n54i B숻#< y*~z>TJdTBn>ub̽VVV9+nupVA4u X68S`0wۭt],N0=GntQIE#(P@nsn[#/,dQ!{Wn}QrK-WG5Ŵyr7s85]:&+!u{|ʤw@Z(ꮞM?PQ. FÏ羖zj=\UhV]8!Ga.!3t  jҶRD x8`mdON^ ebGF#X]/4IKIEGl3S W'}Z>RF8S}m 3O+@\bH.QCk`iTcps^7P M%IsJKHIUm|¢[Kԑ*U%2oT UHp`޿'IKp\ms er02rd|ͽ䄓Ko ef5bj=8_*F$nyϮUqIKuYsRW9$ Oc=^~F];L\<|K\|`+ꛓ}$KF~  |';}՞^١rRRVd@^@ 8"A0MP=OuBѴ5˩*63G؜4[T1Ş%izO:[isJ%QUWW/JAIJwHUv (9I`3g HPJ:ޒ=[:-9VFr 8νGGo-M͍yTSPJ.'@+L q-SSZh%ta֙\U$ӱPp X{F$b5{& _x)ld[H>Ia8 <<ƚ 3$/U32#)F6i#uE^PdUD`e;ZP7l?da @O=YL6h['- -^{b84b]O~v-Ӯ*v Gm~%F9}4=e'@5 4qFr_ 6*8RD&86cm= =3vp5\c9F#o+%wvc4;}j 7xejz&w($fl 2t^\*! ܦUWTex q!VlTEd_:7I3ܹ+#[/I]OT7j3NjSb'_|a ,Uꤥ \Y|g'v1Gm%PVVۚ1H#gR2{nБ-ALi*)]Z*V| vF}3m|ig߶UDbGg[lRG5UO`eUIX\d@]8M$h(:R423yR I[9\=S)!䦪xS>p@c:zl PG$Ӊf#;f&0Npr^LUcBʼnYK.>ꔕV(J*|[gyFZH(\i/z_5Mn;M0zoη/AVIfxGf9#]uۄEhkd X4 =_/ab~WὒKT4sZڂ Fw*ZOA#1wqVS}yx[W=OUWNa*GێYesZn"VM*PF|\7a'tLjp<}yA3ur Jh>x~vʦbګ[ yH\zL7Ng-յҮg,9}a2)S3.i[Uzh|_0GIVA t럈$nD\$^7ڧΣVJʎP; XLRUKr\yFKί/Q]YOŅQ";2rm z[e\qgidd#.-ﻎ J ֺtIUW,_hcL37uG:\bbc4[ċ 1㷷n1^Zvh29ӓ\% W1F񳩺ZWgHTFbWEf{T {*WuSjRA_-%h*d#UkӴq1wuFu/"O78 Z0DXKYk\ILw4Lv{vsPAIOXy!,%z!8Jd45&;I!R5NFhV.s,5J;Xzy `q G IƑG?^ufuHap8o4`EHHH>pO塨a7tSI:Tu':| >`=Zm4fr$V *"9E.)ZXF0M Rz)њIO#?QsLIw3r}y'Gk 4”9P#iHʫXdtdaLZQ:E+5t@5Rœ3ͅ^}j<*3vR{ ʦA0sWf]/97(]I^g#nd;YmX(aT |CHwtti?PkOSAqwp=s϶/=g}Xr/,QGsq^ Q^zaܜ@v^$-uOKVURGrʼ19,<B5j@5qU?WH%4UB/?gc`P1OłuCOꮉ%mxwZcmscpFP^'vX`1r:^Y B'kT-^#T[Vt{SW;uAZEm/7ϮoW 3ςPTernp}fZ 驧2(w,#q羟 mVO -$| qG^J52 ?uã+% 8b,3FF0t=AsꫤWSn}NsKR]y508SP1q rr{zͯÊDZHei`d!9?=u4u΄K %\iTO=^ڱQ|jy"] rqGޤ8:bA=}g1",х݃rp~Zz˥+g؆@}0cqZEi%תHnb }k=(1M瓜}Af*L5>}2.r5>?MzB^RFw`x՛\[8;oL-jʳJߔB9xG84tEvb}/4㭎zq2Q[Q3˝b ׊)ZOVj=,A1}3ik7-Ӡ9S_?$VPSֵ>#-dӖʨ?zzkY7NOwUW_>798 U5TTK,rJK1?2uko MQ5<+vI䣍նj 1ƥTVG['1qw䨖ezKʬ{F=99ښ}4wh^Ό9 *;4,mb+6`MPK4#Pcch֞8Zd3$mAx \dxڞyA缮Ă*s|t[Ԭ4wi".q^/8 G3#w7T3uj9ly˴G;yǧ|dtZ,MTWP~eT`yӟA^3t==6 GTe; 98:$l7,}9=ΧW @-=4-WWZh]>/AE;?:q4WdIF9.8'זji/$g6=9bd p::}%>xm>(tՒbhs>aXQ3]#=eΤuLlo)JG h3ېGco%@#x J=e=vm PtE8FΌqΉQG$Pݓ輸jBӆ#F_vcۤP)no9urlƤ- F%Mk.3sԳ$ G*[o?ڱ E3o+/Yܺ).Z`'ZNN >C%} EB=I=aK6o2s:] X`?QOmZ>7) gqԭ<-ZQu2 ՚|jTUKM(,j_öH Tl'N2 p=Gc }-ByH``@H>vP6 ii+\ZecUV]r'[⥩Ibv1C{:%_@$|='шҢ.Q {|8'u%iJI#5M~ow3Z$\t:ԙ*mQf l?J)@)e[$Q! 3HMgORJ؍RzlVx#)0SB]2 NXm6U$я;GoI=GMQKg_)Thp{{-t@Ӭlby1 Iwq $7%J 6;/@^חd7w~gg@GP6$aΡIFfH 2Ov'ׁ]/U+-"HvX#qd%F &q$Q͑ː}9zXJOSY)5UY29$QJ+YHtm!Px8'@u],qި)(< cs}bSJ"q$Em"i0UZKiNQE2IY~"?#[O\1CDINbgW 9]V$SmZH+yў*M$ ls@pI eXiڪJz{l ,۷54`g9!Ys獧_gxi ?mQ:2RT{?~Zly:zS=uAkt_*Ri̚TV zw<\X*'5fO/!ª6pa?=AF޲uz e4ԒQlwҗOijz mMP ߱mJڧҚJD,X) c gJIӽ?eJ9m{}m!;K7]iG2a9nޣUazJOF=98ƚkXVL*"& H$ c97wS@͘#QV΂T8Dp+!T9f1'=ֽ+OGުAt^,8o1ȴy dRy$·W*z㥋2Np.4! ɍ{7 G%4 c Fw0#pB=项N QnrZ556sR2 |7p(F빑Grx~=SMKQRH7)"De9;|z-oI,0E$L2OmJU6j_ mD#,9gDziZ#̋ ` xkІoYw9$ Vݐ)v3uY h(,4nj#i;scЍs|A\PHAY=,V)r{<*kUHxݐ>7*O$vDSI$j=XI?=3VUHR8r1߱@xVY x'#ոnW|JeRGl}]:i[)GQԔyઘfG2嬮+QdF/'\|J5$) A1$D=N5‡eN$lPEOqhvjOM6v+7F~gڞLTq۪1jVG 9ٌ>+9bjvp޾譊TZs-M#JQplesb'|-2%T}$"GlP7el~^Z֪hj{'VJUYck،:x_mǧKHE[EQDB(eZ}֑AIp{\425**<`?Ãb(*}jfnOEΓ[RʥښmN{"676Ӟ,UUrRU1$d`0pv7O8*5J;̷zyH HRp p5t]GҖ۳d=;ub&I#ڤ* ˷k/d?UMS(7c[e\t"XM eu? 7(xe׉$O4-bX\J'[c^/c躳.d[R#9R*O~%b?fROdaFM_0u+w3ښ ]w7 TxY׮8̘yD@lv\O)ݺE>+hTnYe?>37>5Y!)M7L燷9? Dj^}'Te^sAEA\A?B>(m]+\fv($yרzgNWT|8zk #,jpA N1j rEBJsKO ~I$]!\㜀8y tu}'fJv3XI 0cթKڗFuE% sr^Tt|"Ivzϝ M@msc#ÞckJbXJe$Oc0Kz,񃥺-Ԃ]E@O}8$`G vljz挲Hd!6 Zj*I- yu%pT3yE.B1c~uo jݗzydEZmYKNs#+ *0=QۋtULt둹H*;)'g:oK;z#̒[8 9g|dVii~K`)43Q%OÓ2ʪ=/SYci:҆ʀPCc4m/;Z+}3]hb f?wY2YRHe e'xf۞;kN<#% \[4v6OC zqۣN~X:rlq)!蒦'c=ylc!]ld r\Yz~ĞdpY@]z_ҽY3^4>1299Nor-*m\,[bpC69϶H'TJʒEMpH>{@?#|-V߇ )^ :[-fJncÜǾWR’*~XXΐ ބ8 \.sb":IjO<b%G8N}T&8a{wfO/8#Wʰhp@.Z OlhfBG_c'M)&$˗$TZK|1S6>1aUU#IޢFRr=H<6W/y#P 3=qs LIhd$[mJlj)vJܣԐSJ$jd:-T) tR0x9U8:bo+6.4aTLh] d*b={{gh :+}m> `1''Sa>[zeT|ߪ)XcԮ"hl~zXt8u!TlP(9'vH ?PtJKD  1c2rH`* FJ bJ}ǜjW >P>e@פg<67ʏzI8Θ{RQV"A8D9ǮNF4_ѢXxZF$6<5%DkrDC翷}[PS"3KtUꋕwk O%]X}~3مrxٶR<`C>;/k0&Fo3녂sJ@SϨ9_+ѱUsJb'f$Ƞ7y:j!j  0eq:5*"[-ұ4,G~kI^5#`p~@r Svc=9P4ꤨ# 2~jF t[=&t%Hc6Yw!#*-__)F1EeIoPU+h~Yuפԁ Esd )I{ 04\ l.'v>-lZ0j )#'=7Қ+u 5¶c'YXʰ#TGn9fkYSP';di fcjP"Ir}lU<1Fۀhm4cRU@(,gk{2}Fik+q<Ov ѲuMmUlTVH᧥o O`#pF>Y2MKL,,d=uu_ёWHY&ڍQm F"ҫK$2Jdzv/d"0oǺ[#K-rrY kcO4_~nz(#)*$V1{E ZZiHe#%œ(߶9ƴ(LrD"ƬUCHCGrݏgM[.):]<#+8)}|hnvzrjzxBym0>/F sz랪Z a`MI~TcF7.QJP (YkaIL=RD˧:ƿ\( *0WH `dr;^"Ktu% EdGd zu9<:oY[Ut4nQ$;q]aYKA9 ]`=ZӔJ̩N9`KcR#epX\{RYnFǏ=1>;QZ叨+v*L*7?NN[ʶY*n_f'<٣B{v91YI-%K}di&RNNl;/i䣪jwyӕDܹ!I;HV:_SQ`?Kd7D>UTnڌL2~n4EzJcILJ+jZPldxqKWsU۹tXݪ\wA=7@:|g]: aghv%fN;K|B𢆒J{ %֪.Z]sYջy?~R/qpF)-=M oq$Soqq #p8 Eܛp4* <[zɭdRc!gV9'{>̝f]9S "y Y}εNکֳ(A@fC $Jט䩟)SkP&Qo,Z$Gn(eui-pw؏e }}d GN='G'Mih<3wadHZJ\m4~yFA!.B9nr}9H/U.U̦s##pq|h}*mp%QӥuRDZ0X$~hSCkv[dCKPCKuM}hhE I'aHnqEP2yOј^\37l"h:FTE;(+˧>g#uO 4ؚk4 P$Cc?{3ZΛꚸ:NDVs+鎭J'3TG bD739*>d rFضMїzji.{jŴrN+$:MXf ClLYF-h'O268b VirKrcuƇK˶%%7ʻA;s t5jA$"@ߎ'^ѷv7H豪cvymȵTrς9g<( "yc)FGx W:Dq=0^jqh.|ʹs)GD=CQr fYVH <@_92{N*iZY KP C5Pcϑ?\i=IhڶUd8*Vh w xkƬXed#@G\rprU}?qZ)(b8# $JdSPӱuTyi,Tq-l,r2Gd]} S%`yj/t*WvFdR}dY#=̎`~ϻ']1:~"o9?[1VBi0PČv;e8Rm G^:ų[% b{N g9Ƙ 'H/VD%N% c`X飬jeD r8{#EU%_YOAjQ4 s9ku޷BA4GӱP3͟_ }kpOU57o taQ=JRM"ȴe;CHۇoX8 Gg?h4/Ma]J E~9~Ƃ5amR0H|Jׄrqdēs4#vcI97e RUQTsSE&\}2t=Pw8{m/Tjm*_Q.miǛPOu rnU\jT duFG?N:Hh~MQydH*%B*0x>=ΧmGV~MtjqQr_I |$s(9$jom2xrԕ{Hf1cwTFGi#L'0M#6^{p~zbG _jO!hyԲH*WAU)q#Wg vV-!|ɔ/$.{tH^(k))By<1'NPWrE |3F?ATk[L[ DCR;`먩Yu]XghGYD%E/t`4kWYQ6%@F08~zV]eR3Xm>}9 n\3|ՁNWOWST"PF2Ϯ1ߎM=eiՙ J N{.Z1ޯ/dIyj6?X]CDi:X`@Ϸ-OD}yS|:e ZRO'Dj<99`~*OAzo\Nt4nLQ^%Ű 3ip֣ѷ'?`z]T7w*cov4c3 6'`1~ڌ^%'9j/KpXs)ظ?|}=*4l ߷׾cM s:5i-L"EWeqiJR53*< w[m2520C#FoUh5B,`-zFỸ.7z`=i >1rP\h{]4Jc5:y7q@׎vyci e <>ed *4Ja`q|q}5 7<^z J)!&N~rYO}*X : n!F nb*fۘNYsAi礐in#'2M$y܎_zi1`'bGRCyD(RRyO3Emt~~&YP`1vw_jc\]y`jqӿ,{R]STF 7W!YnڐW Һzo`?.GrV.*c-Ĥů/eDU%Yu2ZR\SɟW3վ^z~M]4u4Œ5u=|>~Z6dYz V殞ؒd}\gtJ]GIQp1"ȄGø)ߞX?G40X|o3Zm r>v"5݅hNpaQfwfEKZ˭iȠc OavkTJzɔ;!OԷ+S" -]F=jM%Cj&5*H7` B˥1L:Zw4TP8[:1nJM"svuk7Vܭhޟ rr}Ž8}KM*)*6Hܹb,jHqО޺&pq3mhҊƦuIq?4QhQTҼD |TT!m F}rNa3(j.TpCW1bwCc\^z46:y|cݔ=3UeT^:<dDuRPlٛA8Cu E5u嗐FGKd}9LQnIW1HǯW3ӟNkSC0> qT>6HZﹽF6qܷ+b z n>"- Tf3!xmߍܩczo>sQ6´zϯo뭃.ԷZX>Ӵ0\Ilx'y:Q8u!y6A} 06ұ\@ZıGzyRCE`VW$z~>gםG#?FR[lrc9#19c< v-ҦE3$u Gɔg:`Ԕ6#8Zt/ڜӀ;/QR-Ml/˘ATފg$+mC=4Rji*6 r2NsTU`zB{@SK+x'=^H:5\2ހ,+be8qu,0|:Hp?Nu-Q-E3-|X/]pY( TFQx]\lưϽP;OkL{3!s uZ}fD .Ìrp[i)V7Z8Skq02p3 _>8$G׍kLex&P `J8霁cCf:`==Tw'4AV!Yc=iSLZyT3,A\'E#k$ ûDhA npfWižbWWkNHeS[)ᖚ]^={iPAHҞxuh}]Guw櫠Z"'Sk2ɀ`vcʷij#Z'F6v׺?| \-=E)[O=K?ګnB. *zI+y fꮳj:Zi݄P  :U Ax:bHN,OCѰYmTH)()7F] i b ^KistKf{lf*di.ej`s8s8ב.F#cRS!<~uz:X%rM:2pv8>J:VlxҤ.gn|TAQCIUGIU r@6@!1q=-Yv*sIO*DS8e|s:F:=i}Qr꛵kL~md,^Q lγ n.U%nfԾ/tS/G%8fs\EWO5ZnM OO%>XSmZc+;u[/|֒DbAɐ;Q@'NجG?=dJ_ʐC %\ w娔߬JQPa މUlKX+s#8$ <3WF1jGA>#oUVoNYV'25+C/FÎy2M,F`H sg#xe:xE2\n:8[턳TNӀqQ&'I@K2'#:ig^PSuB7ndg;UJ:hWL޺&RUE_ rzV|;tEXvWg[z 􂊡F4_*4 ?tVSH!*,8ktY@E=?(% /6~Zw8OTr)?xR!~;8iqkkx6D;L-̵@Tn^h* E39RDgp zᾞl߳̐2?K'.ڠkJU؅՘ ޛц.g olOF.j6:^{O4lHO#:к鞗ҝCnn#7G2(#YEeL*h.4UJUFijqһ~νITFc,UN&}ptQb[=G$vYA}ϵtfR2d, =3o_55GQS2}y~P]hu$ /œ](ܼ#kmuM"^H \@e?C/;]u=zW${c"SiT< X56:y ARy?/F]S4☦mnOIMLNj!goO =S[zo7 MP!fx㚱hP¥`2y\EEXiiF^9s/ :X r)دHMu'i7%3934_Kk ),}x† ֢zhqSF;p Ү|JYi+EKAfCq5H %3ã&FFFC+0gI0@fpN$8vʻ~6prS#_sOhw0>SljUSE+D$օ֖C32/ \B9&3󯐴ȑR#?0 E$ ޑ31C*[[M$\WCؒhWPZ Gf urұeო?LjU[-f^$v] *‘k*.v'?:|.Wc#w'i:Hh*?5t1$Čd= wk'*zyD 9g=>֖Y棚{ܑp" ;NqqIWAھ%Ǩ-Q̊nW险cµrD= s"E( d/49n%Ec(%F;U-/܍zPC lT|q%r/i]C =PD²1l%qos z*Jk@`&HB2X9iilu7+k]u;Nȁ$avnI6HrÒW( e1Tm RA'TWjYsTԷ~3ӄFzcZZd1L6s'9Tn~dU7@v=߁Z{ۢ`G;~XC/JW_8'ݿ1S2"CIGӟOMn^tKJ^5ٵ}2@Wh-Ʊw3GukP@4N D/30Asy!vڔMH|_%9OLt {LF"eU&k$f.3,Oy]he՛Lh@MTcpG~%v;/`TM4My!}u@5 ZC-$Wo*Hfumލf;iZ#㫿aH[.{/[q|ť'BoXҕ[3\h`2>[Un; Sĵqλg<)=xzFi|K­QbCt\KVhxw%G#؏N(-UpR>r2 =c^z+gnZV9eE`24{99ϗzNJ~TSoods4݈z2FrKN&SCyq%I\nx[eESkU $ߟURB(.tuG%RN5,3 daiՊl 5ƪ;To QOsַʐ,I{#'ii*'a x|`{S%T}O65;]4s{v${#Ή1i}-r=WU2;$ 6ٜq^_ŎWti H\9Ƴ.9*oAB@hqYg5 q[M)8}t]V7Wv xMM<5 `g`眐NxԶzIek+B:Q]:oAdw5UnLG,*ݻ%pT2*AuG=k]UގDs"IQr%N?tZi@H-=Whl<r4tle%UTʠO@mcɑ,|70feOS4*eWb#{O% 5*KPVSR =䫨yxbv3vA}Jx4\h,jGsjRvg@6EZWpi!a*CNҍ TzEJʴO@2-W \J)Hdd:'K}Tl ZWvXg?lxNLnae0Vh)}=s4'tJkPsW0U*BXVJh"v<~'R[:L `N P7~CP)Ɍ]Haz*tCRl~ʹ{{]A.x+m"* \hX)TUݦ(֢%>\%m8Iv#k;FHX-SvBRP9ܼI0=TR$e[#?'W,ѱ8o5lƮW&C#5'L1=4 Kȡ?,QTڈJ\inԲ3l9l,sW[JjNR6N;0y)OEtDPv=EHz۟n&UKI٘{|J g1{`k\(mjh-EPz#{_yhm:*GpUVڈҁ+at(}]T3{`Ǯҝ˯=[yIUHDY{0j = -Z<Q@ˎ8''5f'[>ҍQMbiwv8Ѷec(9֐LߍG O窾⊪Hಭ3L3g-έ^nSSJueM-$AeX$A#<1oCB(& 9 c:[#ݥ8<ıÖ%ĕIG!UQR2O=to-%M]U[89XWr2p>=V[  m j_i^-b sV0M1;ru@I;Oޣhc飌N~xdL@ֈR'e1%jj=J ߟU&_byLIͩb,0}O4B^?A5Ս Eo)tNPxދw %"#ѷc T4cmEDL䁅c81}5=tTH'C6}:$ĸn}%o '޶&e8q|L֊iZ>;JjtNQ;q]A/{F,?#>N> bC%ھG-V$(%Y};@ ¥=`KT^!mIxl eڑ'PH`J+5&ʻfg8 6AC^v"]칦g;>~:qc2-oU!}9s\FHAS]U43S)UZ58!OH=0?yۡB$y'N[򒡥˞ert7u}:C9xF~'3:tV{0Qi1ZiYG`=ws2₮=(w^RW跇t-wS*h)\*w#:*"K+v ^+U VVn# }Nqf%LR|0tS^O:#辋 Ei#a2\Wl[tbBey~lH>!%mJ Mx6i3TP$1UAR$H ?Mgv:4WP%m­?OsNmuS5d2]a[r`{c[/U$7($ on1ϾLʷ>zY=!kU $DJ(x h상?MA/{Fw_S' 6y}HI]A} jh6ښzB7 *cԞrtC]d GK"AlE!1 5'}d 0T., #i+t$vy.;`1ܧRtmŠT^.EhDǪ猎N XTe6&PF,xtsP j[sI?-~~Fl/@ˌ8Zm3 u†3#UFPNm~騫uU֖l9[, rۋ20 ZjN7HuчiTS܏BmwdjH=@o^uN^ d{O/l_D 2/ap?u͓c bBbr=c<smȄg}u/|z;r[6UB`CBȥ:ץ`Ƣu4@j2}7d75ƒѽ*A$C#30=eN8hRMCnY\/MqQOS!xh:wi,u< 5~OXUʪN#H%cvT4q%}{k% 0!nL.yTAVIwY#Psc> u¨SUwmDX8f(ssuPLVJ2Ө< q,OSMϸV{鏘KjOgpjےKUM0"2{=j;힩EbIӳKIIVwp':e)2ݪ0|)`xejEY%#Mukyth7Q5{ 5?RpLuI;%H7yV-XM*H}sϦ*- c\Tx'8*;0=nH @2W |D4k^Vݓp 7J&6qيɜ`c@DBTGsicKlOFAC.XW8±ڽ5\2DSY,^ʩ kFrW!dTU=ƉєkՖ"b/I< 0&FL{5%ۥ9嫴25MHTgܸ=ƽ,TתA_P>ZѸd"$c9BmFeVCpMqOES{ .u U-0UV<1d~\u`!j^*$P~dCGHڂzaRi#c!Z@-dWucgTj0*m|i਍h5eejH œw@禈Tǚ~tdF+1'U |V#2= QHFPՋ%j_V2Uf榥8!e%O~2-\RZFEq~ hh@ze]˒p nN!0K p]`pLK 4P 5rSԛTj@&(/2~]Umd_gpZ"Y dq|RaΖl7po^|\%5xd9F׌m{Mj_ت)窤MqI*/ >>ewzNR.!pX$ݸ`>~xΨF:]jn+a4ɸ} `Wd8e)[UH3WgPiR%֩فxBX1Ē*gpi*ЏRpL!xg.!еgREW6"{ u84 /IYi9yb}݃(Aum",^iڙ)&J7>JIKsH2Bx{kHJZTSےG'sQ/=y)%{p43ߔW;` @PLsW+?Q=Cs2IsrNi{/ Q~xA[NJ&kt PO#v~JAJ 8mg]K=4UG>g}wzv]SM)Yf$'ñ^4Jb#DFYNLpvwD??@t:zzN߈:A' i.kSg=]xUO!\9 (H5m_ OR.!22ڿ :靿l_.6+B}NY:UӒ‹MmG4v zw9u7RQ(7R{9\i0yS`d5M` s ܲ?OrQ<5[3#157jQ#'M>8qJt=4?ug ~b;1!׽/oɵ<ϞT][>[.;|-'xa>ONK{"``1f]觾-'-}e3H_L{+״o(bw[24V "&8@$|Mqum]T5PDsjQ{as׾Y&jꚩNy.?ƌc$r>A?L*PԶcfJɪߚ7( ϱoUW)]eYp Y9,?t|FJ.=!e^BLTWc }n)M0[AxZ^JcK$ef2=rsQGQBҼK Wwtm5~2-ʶ K| ZubڊU%$x$h]:Z~M= Nr>j=(ȭ|t|j$fQF:AK+#S&%ʫ+r8$mdts=$! yk ? qZzf е@aP:r3%< 둦wb(E{a@R"׭L4ѷ#*T`u(7M$d!]8}3*\m_]hn"0ٺonyhbzt _l˰G4Nr>_Ʋpy%jUtMtRBjtSM](0_me 5+O±! %6p7'= ~:Җj% 2c`=9։ў&z*ZwΠE-V7s)q߾څz:bݚ~c0%;'DP{/@@'YT5;ISM(n԰: qCw0"N:k(kM\ng:ϙ(pq`fNjr@C3jH^UG\8=UDt1yqg  rsrO-Q"ݶ68{1٬ !K UmeNUsgo.bt =,Io=]d`GˑMl a2jTHdxہEaH-UE|yFSp1#Wg9Lʹ+?+FGԵeW1N?Io{:HʠCp+"s>2?PkesvuU SLc.$`r}1Ƙ]ozuRUP:yVUhWUXr;]=gJ$N8.U\C6exwᝏxeuA0;.In7ɮuumYeRBƪz0GRK`0;_ܨmAa#$#>~|Ue*utI8pI; 'DlqO?Rs4oGty]$e$Xw 4հZFI|NV\-SI$f+[~fhE-K#pn Tjǿ}=][ ,e޸*A̦C}݈ s+>G;Щc}e]'O]k|ۓTT,lE\\c>"B=a$7:yQ.dd*m}Tb5Ekb:Ƨ`}pO<4.ӝ_n2TQVWPn¤qx@@p;̥kA ͣu~IJт0w'?Nst餺E[n $C#1ل79XMXE?MRzy$9+ئQ٪w=TgBK5M#.XufmīS-ui$-xݜ?-x:OA i©\]+glDmt1[/Gj:zt;0!tG_׮$(%["G0vK;tMln'Tn]Oue$hI1O.6#غ(fܖ|SwQ⽑4!ʈ=K)RKtTfpTR2Lm˂xj?v^SA<-HqP _ڔHiu#ŀ/K ^U@Üd@Ԛ.Zy$[BYmWtZ.l% 3uU9;pupk}j.!?X<]tYt$t2B-k@~*_ ,rb7ζCFmhX;FP)ۨ#$>[6X ]ղ@+BUA):l]\ =m.I#-:oًT+u6TH*ߘ}ta~ -s3|OɧJwFy mE0Z٦ ܃ o,&_S1i>s/ݚI_[jbxŽS\JEl]\8>\ TЕ@IdkēKy>e(J eϾsv養8^K4X9ߩ_j7'~cOA' *n:JY3$r"N"@x98jYH mzΤdjjˊs~:1jXDfC4!nßwVŁGdΚTTfUצ+y>PUVّ{ps6TMQN[hr0O=u~`iaz3 ~21n44c 鏞^.9~g0_:n VIM g@*::R&YM܏vaQ>ڐo# _fQӽSFΑ =_E_jOZ/Q_ZpF1}:)XbGgSZW̦S]Xf,X(NSO*ET*c!Շe$S*SSZᚪ`XT&ݽ]SZ=j9jhmJQR0t/g%p;$uYRRTj6C4|gF$|#G%"ѻH$c_i餔5rF\ce;Z+usOI]I#KdqOY8ϯ5GG--\pY#b ##֜G N2RR/QG}?K\P#M)uwMWLD <{{krnPLD鮡hV^mǰ@#碖jyU!6N? |<a~/As뚪(몫楋⊞Gsc* 8=gnȏU77bLBWVM͟~_MIjYYR齳5Fi,V #/oC$Cc]#GM$kfE7;%:ɿMVy $'oubĬfFfy]0=0 cI]<k b;~:3@8U)'vkKYJf 7?2?\'Y9<3Ÿ=1ix^jiI?tF~e)̑"H\d 8f#9Y9~jmDU 5.vC8I$W9}KqGUN|q06~^Zzpg ?c;Cgˑ+JULUoczj %tPz1hpkl.Uܪjz1n$~O]~HSo΍ۼ0U PL7?!+RVp(zv9|8hlC@)Eڡ[(A#L6۪L(VZFCGBh%$F8|.?AVj 3'|^T;$pÒ5~j?Q)v;ij=}3P~31hs-z̳c +pa}ΆuOF(fIU+IԕAnPT'?5ƣ HbdI0 vmgw.~ e >%G<Q}|wxjR1P5QzP\b$+D]VB#qqxkVMēIjjE$J2wqFMhɧ'v1|HAt]UW5hFyOI]o.t`O^lTW]!t%1!'jOu-WNU%E?̾j),WPY'-N7QRȤ~j5,d*n:_/׎p|!dm#9-Aqw%W\#pcez>ir= cYpEhYH6i{b*hi _!xd= Lc ,iӵPRT>021# -6MXC[56B< ?X!|A=4NSpzRg_b^béj_Rf|ݑnqH680M_;?iIE̵1/?S)B.11aX<ՇR0T9"Yqt)6˷m>sSR3䨖MKIC ޤ{{jzN*F:"u3`DQ)]'B[zSۥ ABӔz8@h_5BP]voX?\׫oY*6ȇjH0*׶=<ԅ|&Ͽ+W"T,cY]Ԧub{eBۄ-PP8t,Jru=Ԣ Dƙ'R<몈YBдӐ 5̖KyfV9sjexB[U:VY*3:R2InO[^PRe!5nKByPqjsD$#,o)xTU_dYuMM3ogwYR EJNxS 9\~U(-ͳ)owA =1iڞ,\m>yk:oJ7$+-dklV LQU_?詃{keW4Vݧs:bmB7v^Eִ'VYc=i?VR>mR)cqݏ颊tE{YNy0@\sL~cEu|DD"!gh}l]n/ڎ/)**ww@O8gF PdyWhï\z#Ր($&{/ l6?]Cbӷ Ć@H !&὎IM]XF5<ƭ4673ZQaQF9:yγ^WMt1yAd%p8n*bTq+OrZ%LI]~\dj]sv~5 J*Г߾`*-{+S2@ M|f9=/I .97] }G^N$N 8 7|nJvygγ*rJ4{¹40uc5P C{ W^(+]R&X ~j*ޑ8l`mG_+E;dXjlBy kehlQFj+fr q}A^z.3$K:ܣ$]WV/P4JI0 8Bǫ/gGUJQs(1OtU/|yAmf'-% 픀0qƊ*sKxnZ檯zH`H u#kcxXwZj`0 H畿 ȁכ6y5q`ɷ Y$/e\D):^s}S@KI^15 W0q]yzg"z+jr$vb,G>BKmTw [%o=p)A"U<%+ cf$mлh}j1(0HT pSQ,G骦yVh; L':Gq4Ŭb=EH.d۝RQ1vp)~ZЖPjd=՚kp0ڭs9 ]6{gF3764%lB/cQSJpc1?[==eRGQTS89~~!zh-K+!8PϒpN?mS*/zyݾhWsөS ~Mb0KEP1bqQSmHǸ$߉$u_>bGʞ͢|ͫ5a ≦ /5WkI,㏯tWJݦ!*W%z@*c V)AtciP Z tO D_x^^xdjfZxZN.x,EN>k|M>>3#7u&+KyRUTG9#w<R8#Dk<0zZBwy*|A֩Yӌ?ƛ>~:$xgBmjů:* 䑨TҌ۰Ʒx:*#wK?ʞT24F'CC5Hf> q?~Q7 0ji5]L~5i0M,{s^Ris.oR ʨ)U ec߃hmǺ_#S5DxaO>bȿEov0KmnJD.r0};Fiw K j{u]ste)OTp#MgmeHYtw=?<5 f^_XO G|?ǵKOA_"q1PN{P55 "GYK>lʌ~uQB1δiv$iwZk Rۏ/b_կ'ٛ/bB~/cO%EfD#qt+Ƒ\}&NŀUzC--l^0h)AEw'Y&[.CbʺQ \vy֖<+%CTOm?%,+!F$叔rORνI*6 +ۨڥꖥ#?h d]8p?DsD}H鵄ҭP bG#Ɨ< W;ͭ:du2ktJpH=8O PPԤwIk%T¸U$=N:PO woQ-mS$?l񓃟Fz8HVM"GU['1j4WHW$6K0;65w{ҕfOTQ䈶0ȍI 뭊54oΩP2 g<Jn=% FN.dR#zwᏇT<.HU6ŏ%j'ߌE/*.77JxHڞ$:f|)ܲ+&~k-߬-ȑV-BhUuu|T' c |-j7139xӽ2Ăj'_+9#+}oQ ~*44gk MEi|vuY>OOQV\`e Mm|;Sa0Yu}עꋢ?þ*Am"Hz?p4"{x'm ¥CM,aTzο-Unc`e=>Fh)Sm;Œcgvy^#ѵ4y<+6ѻt ^j%yBhqC( -ƲQˍEQ\վS>jr.r}?P;ZijdG~:N> k69cc!OIPRȹFG Cu_\.rn~g?PQ̺Ԧ9/%mR7?ʮGqo_|4K$ v |P,v9bud{Rn?QēVߡ/Rʑe6Gw<~:KuZ.EZ+IL%.}CB~>*'f'j[ LI/Idy%>SRoȑ}F#g<8\z+ /5D$ bLį%ꋔ;!URG7Tz<+zT$-Uƹ" t3=|0~6}+[]ԝ13GU_SM#0e$\-, 5LЍ1ݦcRR%ZY 0Fs?Pk>9*Q(ب8?T}X`UF<0!P}2- d^u@c }5\u4d87j'\z?S]ʕyaˢ)63Ʈ-դ,0o}}u k?믏#r<C猸9rPeWA|}4?_O7U KAO=_v"K9m@c7 b/mfݡCSBYH<Ír²nP~Y#k&/Prcު:eQ=57zv?dMN G h5`4rכvn.>q;NsMGc Ltjgk=CwJ{*ҥˆrmIA?!_x~Q%ʷ&O ):mPT}ߜ?/Iu jv~5ub-ɩcaFzҼƙ ]6>z\8Σ_ L)#о4׸C?|L?1R?|t (@g@?]ԏЗ-YJ>ԙQS&u\SZUG} ~~>pEWI`Dkq5Y"lzn0ۏS~,m8Ï}bML?\ŌHT6["a  kUMǜw8xigNλaj y}2r?-Wsvrt@3|LWj4-ӅmU`3{^XZoyaHy(RIbY{tpZ&kM #~C]::'*@?X5W#cs|[1_*EɏX/=`Js>Qԟ7'Q@OoY ^J:,苩V䫪ںߓΚv C^Tw!tՖ2A(oLQ J6F??]ӞgpM~d s_v8i)ŸW4x{lQ4㜷S"%7@CϹԩR9s?inLaϧ\WӃr:A|'[JXX 9ZZ?PBb.[5=%yX֤XX(B0Ǐ -l2OmԾbGKTN1U?]GS:!Ϩ8./lS#']A/I-"h/ ]5NVJZ~u(j]ۆdZ~?k~@[Rj0N?#W[w4yqjkg]YCGlHzBOxFJx \fꆵ=HUUܟ~rղZwum%OO$B #8 iN+B]r u#/r7(~MWߜjX5лOi0PPŠej(d&<G&uqWzPfgZ$T G c~1v~zl=-A!i@ Fã-ʢy>_^p*9@Q6{\I4x:E,Ƣz%VTkxD Д~|Sj>a9脋c 1v W'[Hn(au_rtny"gSV+z ^G!Fg\$zcD[DܒjiNGf8iF`R?!ԉT?Qn^*kuNyaMv^e1Y^?nHQ2bw:3i6X"JבiA8kZ"}`YQ61t4f4Q[aWK1Qi+ۡgM#?S@ĭ=g[_)ߜJCa Xk(ۊ "s'I[BͧPjVz$ĝ7MV`<۳+zhf[hQi<OG6Ft9MG=\70H @w_-oJc'5 IAh)65,L?UгbR R5HCEa~ a\WtwPVL=T CC&񺺩zZtcxF7C^G:Z"ԥ]keG;D3WZ}nJ%:= |gc^w/TFCd~#U^VlԷ˓{F|Mp*eDHT~S3ܞKlUosRfN!*%1EכѬ _tU$PakUϨb-K*Cw^|JpC?k]+E3(#تé.,{\{Tj5*%i!$Ntus\r涙Ah'Uvs ?߻8ϝ'w$r1TlĚ jt m_Cv0mgΣX=X<)2F"&EZXR282PW I}u,kei$TFp _o񬩺fFEk麴V:?|_7Lں\Ӷ I^*VT.t+ӝdY*zijI15?jrVS檙G?; 6ZSZ;XFww*~쐷?u4:N8;ђͶB?_Ëi'@).z}\Uf]џLvw$]Z4Z?jء|PÀ.]eۊ_zb>ن=wDO?MiE r:LeADA~AF5xj!ڦTi5 ̏PҘjqmgWr}?J(@vzIXʟz{ z¸2EB'M7R$MwAS?7O9XtWQ!nHYf!dBiRp?uiŖ=:!Ѳө>kG=f/Mѿl r(,=P&6wFN1g׍bbkpjǰ\ =xtU?OROY TOkXbe:nߎ5a*AVO~u< ^ Tơts(@TG4Û@ǵK߿/ j8桿S=dt?mandelbulber1.21-1.orig/usr/share/textures/colour palette.jpg0000644000175000017500000004173712274512437025312 0ustar krzysztofkrzysztofJFIFHHCreated with GIMPC  !"$"$C" R !1AQa"q#2BRb3rCSc$6T%su4DFdtD!1AQ"aq#2B3Rb$rC%45 ?f|W濛q7˔u\L,EtN`|Znv*]#(V֭qMCQvt+W\]Mw=#{*bT^~FzE1o/79'5K̰\ʴjդn:}C{giksoQsTǾ^ٝr/ݨ6KVRێԗ og|'f1/õA+n[SOWu ogѵE%RᯭR)лf?Or-bNTK8U'㫜gݼ'jIqꞯeaP_=Gj(ZgCSP[QrKj[W;faK>[ӗ t)DZ^7V]:r%,&_ZZT 4ie9?u5^r7igRJW_Ex/k.7}]sݧTb k}q9.?uofi/eϑ:U.\!:.R$R&|$C#Dʑ#ԉ" "=DL=H`ɐ #TDڈQɔ#UDʨUɴ"DʨU "&UDJ%R-BMYG_Z>L}0b/DEl.\"d"U.er24K*"2C.EQD\82:JYT\"q)eQvSk'ʖb"=#TOpừf*.*Vk4c6\J/ӵ>ܫ|τS0[wV*r.q~G8k%fo(bKJVӭ8\WF[/& +Vq*QʤӔ~_֎tTFYmytCn0fRvKwq8Ҁ3㔰mnԻn?{Q/(QzՌw*S5,-9 lJEtԻkUwX*gKK$^֭uqR⤪ըͲ$p"Ҋ\Vp/gDCL6q0N&23 L"MH"HP H"M=Ha"\$B5HDR$HND"ԉ|. *µԓN+H/k6.]lÉ5~s%3vy}\/?b7eO5#`=ޒaI;p޷z:_/s+r^o0d,TK"n.e4ۥ˲P[҇^Un&RN]ъE0 Fȷ8nt+'ϴ~(׹$^yQ^aMK`2ދ(mw6ol;fN8 K]T84`u o50oZvԟ3v]^/[Y|;v5^m_rzxƦٮ1<¯p]#sBTܼVGvִ.洝*%xvFJfD~zupNHJ} ܵjvZMӗ <#iL77Q/IZ/ӎ[΃ieSROy=>Y"%BNieQll*"OUADp(l*TL XD1;|K kyo=Ui_&O%ƚk&Q8Fqq=MmF:[,;1PT\%pN|lln,^ZWBT'BKMrgTOi3pVt!%cuK>TWt3Iux_tC^Η09|B+?F<'"ZR)fRry"6?¬GOUJ}u5ZW.+ԫQ)>Nke. k+D)Jxƭ=cW?}/nlmSq&&#3 ML"H0 q#ԉ:q#ԉ"%Bd#ԉ:OY )w9پ19Qz^/8UJ9Em)# q ZZ֕.*j+W{|f,ܹ^~oMMz9|NaZFoIt{|damhz*iXg ~}_3-(RF HӧԑpI%5vy=<fO9S\:47SoM%hMl_3UR/uZkjj:i֕7ڰ=0İv kYm^W~|"u65W<#uiȮeǎ{̙+yOXڲ sXKZЫovJqeIό^kx|tU\8aEiU !"z4&J&"TieJIŬ:c;D7au(Q`.]|5]M7˸#c6ؾp][z\|Zq{:~tt[=)^ջS]S껞h]Gwr8FU_ۯw>\^4Pc)5mH8 bڡ__>gmy'ύVG~%G>q}rp&呑sq&Ŀ#2 `t` & ԁk𷷥*f"mNM]}Yc/5UnU_ގ\c53]Zk|q}/~ m^Ja{Ӽm*r^,T*p0^7eN\c SIF\WgN/4\VtfSmInkcG geH;rҝҏK^Q'^OG}[кmuFz`RHFqkF|}1durӫeu+`V==%tGEç:2ݽ>kվ/ iGnUr| VHL:U[#%q.ЧO'')7)6of)@:0J')<3[P1N@8d̅8gta љ~3 -^\u&K~FU*FI.-/am%+%WhU.uwSE7w~/EidG"ҍСXr5*%VNsyR!RBIFKTs*9n,yzLǗ7T"Y7}ܹhjJJB*p'(-hOk[on.NXbmП>ɿ{|Z]Zm*oY>}3hN;Ĭo%'ڽWnnr HܡL L0W@T1yZs:NRӌiM369r+VQӌ=;Cc,*Ԓ>b=7=;}jm"-jF"l[mo5R)ESOTS?[)nKJ=iwbyxDv1/B?|ߧ1IBK3{;&Pz̙rf˔\jtLP EɞmD#)+WW;#P/dp-h,'}me]B.LpJ*~rK}0l"g Z;ž--ZM@eK@ǰk#Z\r_>sOFF<FN J/&ԕ9)N+UٚN޲Z*ԛ{^\O{f0yVtle> yjmI/zGNtJHJqdii%F7A讐,fZĎ/hgKxUש=3KfⳗTE7yJdՄlܨ_IGH'8`V-_`)RqSWN|5OeM)EskckqD*햹9l"̪9}&ljx{:{nKX88~KY Vz[\|Zi/w׭Y;xtZeܷm5/Wt:˻85!swծuTqӒh{q5x5#Q3t,DzɤeR.R0R9E*2# U"HJI.Gʖ%hĭOi\_͗Pt#mkNyAh{̠UQ J1I%- 9ʧ,y5gFyKZ~\چ]Y"<`qRmJǦh8MMpi;bkxp;áSȵȱȵMUK܊6XZVEPV \a͖+hүg^z2RZp r-9)XM'bVr qRO$Lx-=eyKWDŽݚ@vwU-m{z*N!@<{ݣmlғܴ_WxҿiN(ӌ4owtxyp_򬟮f&\36T*EwW"P̤UHüUHTԏm &U_hOOy-i*Q^lp:qI.uj[/µW{䗩2fʀIqްJow%{CvZ.=Gf Sp\N zYY֒Ԗ=m{|MS{޾Yx>^kk/G"""#M29lQTSxxEP~Gc1 rncs rixS_:dMb$s/rj~x}̴? (րYZFuZB.OxK6 gkinkE1o6VWxV꫸:|~o3VuufU"|UC6R1o RT6oO M xy=]5`~hhόۗ_C7d>`nĠɱ )ԡop}SޞK{+:F9Sh׹l+/y:U~VQȿcqe]iVެM}趟㔖h]2k4d)cZ.~xǼSxT&apJhVj2M~uZuSJ[ENMj˼w/^#=0f'w~o4M/8Ƣ$ʏI~dREcZ|'ji3Zo >_C.1o zxo RTع %YK_Ṗ|\o>QpxD}VlVTa܀8CmVOfMq E7ʞъIoW(M[}#TG䎛e_^ڛ|ɼ7Z'HLxǼSxdyweZtzRצhuB:j~ B\M}L={UɛqSJ|ʗDce'Fy[}k FQ|בMcT2 M:Speog iq$| = e?Ȧm^_4gX wڦRYgۿFU.1o ?MLxż5˼uב{eؗ7W  u[eW gbqk8Q>}M;Ծ'>VnYZBRqv/p+#ݬ:Ǩ#Mb#Δɼ7[xT7NX\ßM{O*N}Д}k>>ƌ/BZ/ o]Tݬ5F{bu[RьҚ5KS_UhEvxoRWJfC.apMS%E~Goo*;ê.n*EQ4O2(Vt26f*ߋhNIkbW FZT}mYx*KdgSV)w5KR+EJS<~NئWѭ7_rgY0ߑטPѽ~89ڶ(~K/~#S8Pqvo湶)iUcÞMu>gX%­'M|ZO{~ {oԿxck:G"F7"GT/lFzFv/iwï'c[S:cQ. B+ЧZԊZg@.*[y?zBKz^n w%,byI*6eMunTޞ*2//,Ʃa9{*R֝xF ž Χػ^k&*󔔊5IxHH"e+bR*EP0¾].]7uPU7ޝt!8Wl/6Ukp]&!NO" ؊eYVuⵝX}l\J֝qeWW*rzrMi74[T8I=9FYj]ӸKd^+kmoSIeGQElв4GPȵȱȵȩ"Ө^n(*-jIЗqufr=DZ2sKJWZI\~Ѵ(~_\͇D5iB2}Y_\;I@SW|n^kݥOuI/ o1FcuJf[4uMI]RoVν rk-lSy*EGcq*S2] re9P̙U# eGC<oqVJԥ׃M=p:DO(/`u):w#V-qUkR~IRG>]Kb9d HһUþOukB)R R^Vnm{ we^ӎlgrI~MkK0a]huLoJ]=UևYxonE,r-lA/r-lȱR^]mqV U58Itz094EYwkRq_V\cMG}Q\OЯ[}zM/J>Եmú`l[޷>Z8.?6o綑2FH3F%cA4ըBV5ԻFԍ*k9I66͜ݞ!e[[|.*'N>_i|iR3 boR{}q;&ދtD5#Ҵ[_6绰:lΤ\HHʸP̤\He-P̙v[[pzKH+(F( h5g_ymU/gm=I'J{M֖bk jO)5yo/Fy:>`.ˊ4-[ւ*p_)E/&g&g8f<: [nGh[6۰=jzTsoї?iwxkïgGynGzG<.t?.=[seP$kҙV$\3-6eZսGN)Ӓ'gFe,n`*:FR[/x4sGنfngv+kʜ|6ľq7Ԟ?t/X]GUMGٷ\V\@-)dl*Ts_ z5ꦛJiGCyGm.r-J#"C IOJOOq\ԭVuNu*NNSr|o:]*jW[#ܻsb [:P,≓p;zI)Kuhy~32\2$Fp,:l>ky{q zSb -e =.;Is[9+_!<[6^g:jNqS'֤Zv'c*V/FBˋXW93sq8eOuKMK&>\285*\7܍KKpZ]xz>[>^^׏3LH][g ̦JDS<̢EJT e9sdY]GQF?oKbmVzuT: 4o]9ܪ FWoOqע+[U}e\ e׏o%ýzzp$3^=e{c7 ΛV}_Eɶ][Hs^[Х:*IF0Z6$N%ڥ]c ªT\ݼZqw58ZKQOMKcѭ]ke8.ρ 6{x g\Oh90ZӌnKXM>omCN8HZҧmJ4i,]9ZOk @8glf_RP&)D2#D Ʊ< hPJ<9=|vf\^-C.1YzOF'H1X>R{Ĺ^e]Y6UA²՝izU'M-C|q^YVmok3$@Y=I3-kTPDr˘Ӌ+j[Kki \l; WtJN/wSc7n5鮤vv{vwLyW}-%S;RR0T@0xF!wbU=SLLwugJjpy55&[<LJ*uM%^|`|_yNp*gJ7MuMuFy1(ӎ7{uj*?;<44NH íx۬o4jו.j:{H3p'N& FEp p0$("DfC R2Q)Bڵ+kj5+W5N:qrފ).-$^SIfE g,bJkypބZߟKRᮧX`X- [FʌhPQVxŚfm. cؖlFz5&[@N4f;ٴY[P[A0xM//~r\kAxu޸q{FwEҨ?N'ĭm]gz> v-K6>rsW7BmW5_^|ks; u]*\Ϝ" e5ǰH"@6*.%,#=ŝ;ZӣZބiQq2ZyRɣpdmv8c>Pi/9{c~},M53)[K5 իuV؛׏mER]X\ӯIs\d.k4uUaV tikj`zVǃ|"+#THxp.&?{ʕAHD\R.Er&ӁK&a8rl.Pk^ oh 41^mWmM7M8}EP`M`}^1{b8wV\э{zR3M b؎[*o2Oum'i^?a|Hî҅t5xMF*ѩ7{EfosF EM5;{Zu^ QZu&l&H2f]e)NJn3|4sv3N4Fֺ­erյ6jsi3:9{v\M淈ifgT;}wzn2U(7ʥZJNQɤhMg1HԳ0j*}E\tz&rշͲ-HVvMNK^|ܿҫ9-/R$z&ԉM0БL"M=H"d$BLHpq0N$8#"T$CM_mR/ZM+ueϲzi9;>#Q]]vy~z\%=y˽]^nam6maF5+m[omf^KGW/-ٰ1ʭU8u[am;[;jj4֑W$@ZRrnRyn e! :$ԣ%if vt[h?çkJw0՚|>76 kz}Uи*mN!P~>'}tճT[WmuFtkSzNZ4j唷s>rYgKs}5\"UEțN%,"Q"u8(>JYrXfhǰ#C(/UN彮On-'oQM,6wFޥ7>hFse5:.DSk[dE5I?U7Ug.1{BuGZZ/4J.\˫ HQy}ͯf%deMz8OOԖ.>6nm-jW֚D*A>\ohʽHI4vT~E2^öKMsVOi/JM>'ĶaI5a}Fo2t4z?9wl}o}ՇrsgvӍ!M-i#!Uq 당NG==Z.Q;Zx)v7q"DڈQH2lQ"mDFPdlR$j&ԉhLU"`eH*DKSq&N%\קooFjdN8JroD\[o"2IfpyGϜM^fq y~-J0wϯ({a48x 5S1sѿw뫊$%G a7|nF'[o26ae0:֕(RJ*1WD$NO7Id330[^Rݭ:8xxS삙B3YIl,\QV^'4e\S/nmjސܟ~i­9SMJ2Z<hյÝ 8U|]Ϳ|F6A?jRnz|{j⨓amӶoU}Y~)kp#G#VR:qޞƼ &SeEȡRu4RʢPM2e˙>)e˙TQ#!I2K%L"$zHz JEEu.dJQ"5DJ&d:Qs%DjMȕ%DzL"TDz%DzK"TF am)} 6νGR)?OStoT!t"_6t5o3nu,gx٨r>F9{=hZVѣW~Nle#э(+ZQҥXzKNg`O®$ITu>ezqFk"4i.!(Fu(/ro FY[ ';x=<箸]=Wi[%ow}sNE%ȼ'KfEܷ'oS"d1 |_ *Vizy#,7eW#5<Qi}JO˿H_s"jרХ:KWE:"P-4ލOS8F\bHZLC1okm[([k=҆ xa|g0Nu&i7X"U[lQlV0;j9O~vGq#ww5)TZr%fkm4# j57?k>1WfqY`?zQ7fHmandelbulber1.21-1.orig/usr/share/textures/lightmap.jpg0000644000175000017500000025107412274512437024172 0ustar krzysztofkrzysztofJFIFHHCreated with GIMPCC" C!1AQaq"2#B3RbSCcr$4s C!1AQa"q#2BR3brCSc$4 ?^&VsZW 6;_xbbW0Xu Me5sMF0Z9#::Qkq M*\@؃uYLyL&Re"^zJ&<|[9b @@󠧈]w*J Ik7%eȄ sN!ԉeg!F>[G3~%_K .yH` T )fB+ /Grl6.pD Rs]Z1A? 8'FĹKRl ҏb,!"= d6@bMo 0"q/ ֪/4b=GC4 PNEMsZ˪H΍ w" ?J`gnY[xsmC0GxBQR 6@OxDHjV,M\xO1xMOGHX+?(uBqm-G6(0>L0چtxGx4F.MI^?:3) ÿ)*4aJ/-Jg ʗ2w'Qp3Y(B(( |Lg]l֯Nc ?hjTjG҄8qR7ox E{5A )?,/{8w7*} $& T4R+Gm*(zI0rBǙxzPf+E|k 5AxQc9[}8U]B2IqX9eLXUHUFi`,<).HN[yɛHCᭇź S5h.VK!W,w|y !SjAEڰCi`^SZpQGV͈$ݏGP]'%/Ю p(0De*װZ My)G@<<ъŠ/w <U0IRIg؎05@-RRA֘pdk-%J*?\g *@Ovꐵ<ІA yo,0ِRװOCᭈVXNrl8_s,~t<*P4a-jr;_76TKQ^j(Z "ql\5!UyjÎQ%o82嗨0!rAXR% Q3FЄH"KiEޕP.uBVgI%tpIbEeOքG#} ,+{:KRT֊xWn[hʢv̈́ Ou0KZ>) \Vj6V[U, 8 ԆV ڵO}(}ۢr5Γ,8Jp'/&-D{P^I"V.Q oB0NQɌ?9RK)(&k)o훆!i: PaìDj S8 iFp,J|6TB`11 J̺Q,N/9zś8KF+_p镙NY(͑g9FE(jfQs$2T30 ԁ` z!i@ZAP-0{e7[|3,rdfG`?QULx0EBSR4 i)u,HB ꢱ{meu`؅hCx[{D Ymx_ecyD.iGWR EUw0vЗ+Cy.5*ӄ=b$jEB,MnWU8J~ۅAxT'ȃk-Gpg[-S"HPFBQ4C:|> aUDEH^&Q!2WҔknwyEk%Q*WYL,_Ĕ VIYW͟ WilBq i̩HogK{!$g)|UYuz\)|ٙKג?#q=G֎O,],D6= ¤>RLƹ eUN90<0ėqSi*xnzrLј,U ,j7 27}'T2'D4u}{!W-d$H!ՖYiEuI'VDb~)$[{xvBPnR/eBޑ ©)-Ex"&sy$u[Wr9y 'ERO xx{E~Ew2@Vq,ԋzo8VԽ8QPvªV'6i8"Z"wru+y MAR}yN]{)A JD!^M^π@~lږ",JGg^PM#3_hW?e1wWiޞJ蓁(ݹ.e|&5b9h<5, CJc Q'y[w)ЇTo8V!`/uL ̞.*-Y y'ݹn=S/ ٍp(RYզlEyYeΧ8Åaxe楜C3'A((ZuM漹}rn뺕2ld4ΏkLvS/gx1:ng2"n!kU}*K^Ox }ڬI*MJ:10wP+b4'|B y 6ChogI`[ P!_ 7Wwz˩f6* Ac:LQ; aUR_Q4[|ͦԾJLUf`65T1DVy`UsnWv gAHd*{~@dC\ n.^`TG#jn1@)n\AU(ȢrgD4.=kYsVH+եiX,/ÙpJI{B_@wQ"+`lB.7*ItvjDCŔ^EcbEC-l !:e- ^δL)?́)-"L6)Pa-0MZQtCƃ-pn"|Ja3SPVp2^T37Ԥ.R0Vk1Wy@dZv S$a=g /DHJ* #2NuPQrxD;5^ttZCh[2i2) 2Gք7*7MwcL 5!9!SV~ H.XANYߪ6 VJcTke\=;D3jV3$PA?ܥ D?U-5x",MBP zzаΰ xW (9NuC@U e t PaHO^Y>F$ ѿSl BL:PmV -&eajD"*Ec1m|L (Rʼ=E!yJ,m|/+8oBlˈշg-U!"hiu!R & m]??@/HG ;,jWRckM/u @T͡KmwZ-cMᔱ6?("Zkz:b/Q V4WB9gPSEX3]$AO%t ;KiρMRH!15ּPYTko=JSNA%y3h΀XO̯qܐ"heQvFWs+r` &OfM{~/$^y)7FvDD5O_#FΟ׊4H`d;qW?ke^vail3xT{w Ϙ{N2"br 3*/w{> v $z6<ӯ)SaeAHhk04 T)UMD%?1X3QQ|]I>ÛN~IuP&WT3$:?4ҽ )U$,ϲcHcݸIz3^kq6jSE/ҳhHLd"PgUSst"}ڨŢ k-[A|]!TN)'bG 0eQy^ |%HoeƩI4!kWwQWOǶ}s{SWẗs|M5LP;̊\R-eΧyIP6ձS`XR=[wxYlJJ: w*2 /'9$b \ju;Q_coz=X,ճ)<AȝM5}s&NE6?SGMq}}u\wLLT,3wƅėV &Ep%wB 0XkW{t"?Tt7)rnG)46. Z^XBp1c;͉@EP"*PZ:+  P*X6uZ5W_Pe4hlylp2ा¨C&9ay*F B. zlQ¯>hpVd]ڶuV_H2Ph E(~B(5M=HC$Tol3b9k3W(sײ-a fC`[ IqOf7sbW#j#/OK\UO+](%8*|TgΪOy+Xkc+fdɂktKLj~.AF-p0 yg36Uྷ?xưdR$'9%ĝ/mzrB@yAaG/yO2-Z<D5 _4c-p/fCC}ea^wۇ>װ{i;a|K$A+DOC|ὑ+FL* ْgLۙjD'%_mX0!RbP<#]}TבL92Osq RZ5UxȔW{A`'D!Vts7^cI$"Ke)fwr_e2L={ r13S"g-RHx-fՍ u_q`ĩc:MvlkdXxA :x(e 9C# H*&Jb̫`m^l@,+>U ڵ C&ylXhz`% hC9IyZ$?ǚ4@3UZ*I32'-/vIn L`IXx鎩  m$¾[|1r$N&,2s}U-ȩI*E"6K+L"6w1p䄈NOMJ?RA(02J&V n4Pr3+ubcɃgQ-4az}U FO2"hGx񊣽 U a?jbC5H[΅rz'(U P혱ʢ5<BJQ?Ib3dh1-QA Gw: bv̸cFd욌\a#xɈEr[C”KY@AVm3:XXyxs(̭+7y^)Ak;N'y904U_y7 `?^hx\#@ 1t]ytgJnClV Alo;$>a̢Q7~[S= ː/낰V>E^7(9!a6QiX @ٕb.` B:z=k=hDO?f}*} Ե^ &$ɤnK"{+4OYE~&=2i8~CB3rM䨟~S=S>adA?IĈ߽8W~PSv⮵"f~kDwsŠDN]22՛Wo.,կ'yԓGA6]U;X pJ6B a[ +ׄyG3a7&(<]˸"*Qi{@>삋 _yw@rdk4$ȬB@mpضVtWZ|$`uLQw]0^ F`Dz=Ez2;ī%R+UC*˚J뇮 '!*h嬯Ʀ; ꪆ/cc T1vzcۼXܟ`n[ 15zpȽXGzD/W'yE̪m6,5|wEˡh0rт5Uպ4d(c6y^!V*`RM)уWs섅XT+AwKx(@|@I*>?`L$2OO6JP>aZXg;>[;4@NG{7IJ/6X ͢Yh"$[QD1'OUMgYH}2aL.J=dP&w6wm89( 3HY 7@{Rnfc+3/];*ׇ:E9}p ~ϯV20ԩ% <%Uis~m(B Æmo8Z6-VOu Ii$B!CL<x8S_/1kyX"gH X(fnk-װlzƀgٷ*> ULRYP6%]cR ZeWm!#nf^qToNby{+YY~PeRY,e3Py/C;Lкҵ<|Fwb+\͊ Wf…-??&$Fϼ9fa?tip"'E/gx*h%ky = u^m&(pfG*'Yv^+& aC΃mn]Ef3El$Ij#ѶD6 MT/D Э{^͙;Қ dQ2"g\?X'Q5 es6*!A&"fVxzZ3ea%Z9EGZ؊7-76z+Y2w!zm$$XW:YP nf鮕 |H< lVngU,//uUTP:FƐ_|pgXa%<|r(k+]Dv9U)4tlix:& QV̼ f`Ȯlѐ#71,_n{Yp+&D ]W+WU&s$e%S 5F ,֗ƛ=ZKhe*idž{>g(/:* R 2jTk7 ӄ7P̛fxeՋr֯)@֣a[0ͽwx4Dz:Qr%EZ'U jg ٓb}<0ra(!f9{\,WaADr-s{{e.L K/f ӯ2mwU V|2]095^FH~9?ZJNiGOvmb:y"X<[ŨGw6rUp2KZEv Əu Zs&9Tkrk|NY[M)p2 ~ J/B۹bL6Gmk4*xb*a+* AUmk2J&-epVj=|K{PsXLpAl(n=Y!F!,Q(l7ok^{zT"7UT~,[ +'sGP5-H^́huvj?Ms55O;?̂͑7ZKR 6^OT1bRohf Y hoky)2BB{>pGf`ތ *A}ΤCß8GyUzͅ|ШQ '#30pY(W!ky ʀ/6gb<0heF[=D*3SR1IC?{yO*d o4\W5+1sgk6V3Ax2^f0͙ze<jyFpSg҄pYtɼ-ԗH<6=On&3IKk#5!#XIQ,)w2-ĩNeu,UA"R {H E6hUZ{VNSu5_!ޢo淌UOT Q6 |lk D6i)iNW ;)GÔ}l4LO;#,KBs['M(fV&u+C{4&;cŔ7J$ӯ:Ã)~9"`kbUdhm VaxO3a٭dhf)M؊Ex˔r?a$T8 .*G76BgS$rj!zXrnnyMbvkE{7[ zIT&Qh|9i1REL\ܲYe^P;@X#@#{|Pplv$L}>1??) lv5OT3E(k8ZyhQUL+sAA?ζRW7QPA-l}l"BP+@9v? ٱ 3(%EBz*[OSlJ]z/!l=PGzbЬ\a"]jO r%S$6 )3; єs_>ym6$s]O(cN|YZs!#>F$\ 7zKaXNrU4N߇HkwjA:F՝waLo[64lʛQ1"hb 6| pvBn蹡=H "JPȌK|N@Ή,Kp&x 戞JGލ$a,, .?+5Eh -MkT0(Ay3 ϘN<5f9܉-C9BZ.?P6afލ3P$R $tTx*pb8dK6tиHC@}]L E|qV-X,3QiܕG!!7}Z!TYe[!o^UY)<ȤBw\)EkzS JY0fKNTQw2ȶ-:PF B%^N$ ^aOXEK*Gfxon ^MϮb11HgZ*uG͙FÇP똟Sf1-U$V / qg f͵v9|M2LtWx/wy+2XPkxRP(0"w>KP'ufّ<5kUd=M4^ް=`x]#v (uԕ@)DbkrUbe '5KQP st[6.cJh1qd Bu s@cƢ"I^ms1"u_r|I 9WP{_T#tsg bT9SЕ^^oă5]Xm/NhLԍ4oĄNkDTd2􄕧ϜA.C/Fh+^<ђs|jew_Xz,+w2Ӫgzkgo1:ť Y:#PfZgڽ|a;'Onw˙"4ma͜m=՝ Z\?o .‹9's37r6nT,)a<<ʱ!mw3,Û*vj *=Rt9y0 Ò- fMiXUhXl#$"{+[]sϗ6~aْ͛,eBkp) Fve =өpmP:Pm>keFyϴ'@Ե<`f&]\{,<Ɋ+!%` ӯ@:/2DKz: !{{i]Jb }C\/y54:mԛwu6)$E~eK3]%BwAYv[j_ЊE®gɐJ^j(9񊺎 hy{8U0B|eQ΀KuwپŚu{e1y7Pŭ/Kvzrb` NgVYlÑVG4 Xht !v>[8\壊gQrk:F)g̾t,oT Я Ipؿ!G'A^]f} Mϸ疞W$ r0Ѵ*<;HwM)%JΦ hLs-V}A0=)a&Ϙ=s،3~)ӴႩNI(Џ*ʫ;5憬}8P%E@$ʉ91-,_u _?H歡0јG2k{**BbSZҩ3W] ^dWf)PPTY/~ɿ\7fP|.K&ײg;\-hO PTֻ{〉sX5A]׉ep.Ƅ"}xIŽB pՏfF)fI[{6L!UҊwk10A'=@k]#!5ώzļ*i-|h 3|kh[p ҘRUnETE6n ȥ:7Ÿdg5P;MhsNQ+d=<(Py:كo—B\HKQ]i3IV)w3*@LM{{DyQ ? 0lvW=܋n1Zi\)rp EL.,sz$T97ϑY''VtPlOZ*ΪT|~qvWt@kUe:d[¥/N`J%xKb Fo%(G,iR$\"}yGvdTVs2*$QT*H̭>_U<̔8zlr(%xPiq@.,zP3xd[re`g}tGbxQEq9Bva{6XydyP}ȃènСNbb?og[^Ljȑj+x-Ջ+ky?G$EZ [ٔOyxXskq<9O$HP0TJy;^Id?(M)aL<ʣ96-zek 8sg=UD3J ('3 _A6h^+-p|EZ ky:sg (6ΤS??6Uʣ}hpbb|ŰzLQ~p!Co6zD{ri9PmǕF]B) $eEYbtC `U'=guc=Ϭ9aje>ZmI=ߣCBUhWs0+I@K]T*||0&#ڬ7]SŞv|(kLh:đc|fd  vXMR"Xc0׊tlf8rCIuwܛ2A FQ1Q/Ү-MK7ںNga:*AY[?2*7x}RJLϥozeeqÀ< ɩ2oQP>o6wzx$^'s+$o7ۡ$:ЅKUzZi:}x25$$?)$ȿXtc=Я_ G=RvE/E2ЅH7Y7I9$TAg5DڵA5] [b_74/ Hajwu#y8rC+C]s!Ѝ wj"WқJ[?PU<rk`" eũPC?7 l˾2׫fF*p'OkogdFo@e÷$-:&t,AƠ]A}["y}w|1P& U?ci ڇ*|uKϠ{ƨZ,UҶPB,Le#9@XȤd*uTՄI&fhDRяwWߥ'#+1D5K<}Uzݫb7W"5Re\.%F9D\30X4QAKwSp{D}LˡS@VB`55_+%{}Lͦy8U_UaFMD|Z0I祋\Q2P]Rhaeg7u_ux!gC]gbl5 mL]tчyU]L dI4*+|(^ν0|_NdzG?|<%Z|= R D&%(U'/JջG5B9x?w&GFWBh/ נc|DP9Pa۟?{Pw>Ag$x~*P!eK ^K/3&+lhg:Gt}h8˰O1gf}{IDv~˜ g>g?F^c[Ur+L4u<3,liHz_Gx+;t8p*wIrC@F"@y<;=O8(؊ڱUd伺f,Yԫg1tvh^>F Y˥\?h៓Sv ρNn7[:twkYt#4U,E?d;-QiZ ?U󛡠>wENjQ)?LBGghvq9ë$dhUKF+cxvѪ1aCG ldQ(/d]!,cP%*H%E1_Mh= G*<=hx'") ƚwvgz?vHZ'KklXrloR3|`_bL_ 9N-Р j`㇫>/M9+%ZJ=¤4*K%{(tG q߉BwLad~/PMfmv y0a-j΋3*~"sIP8H!Q@ $Bofh'qҞTHvV1BB&(T"fO ~HOag[%Pxf KTz+5s3qeiş G/g>DwW&3oK;=SX:+< '糯AGڒVBb=v'"eNJ{^,2Tv HF 9t{Pw jXrODCqid}/Wh+h Ua0O(S4⍸ޫ Ҋ[^&xy"UI:Ig5.|(R=+0 ,BkHH 2R=%T  _K걼`RY&]xf ھM|'f&r݋(N>,p(԰?=V&֑@~obK/$@ދխC^lг)cfT%^<:Ə K.D}i yG;~~.9b[gy߿-d,;Kq.Z0t)w#sh&1V]BA>Nj\ 7O臕ێԋ@k'_.i8%T y=+a <Ea-kx F3S2M~;3" ڂoG2ͣH0#,)A T<ÙR.RnV7p!6_AYk=&#UҪsRAǚXSװ >-kxB5wGR{B&@bSg^mܿ/%0A'AVHt•Q#(ֽsEN0B)5%w$#kx.NA2öpm|ĚNU>Jx;!!ŀ{P&S򱇂hV;UotK|;kOHOF(.MP|<SFe@xY#/9x J9aD8ZPwzD'XP@|-^Qau\IvXѡ@[tԻ$5.KIx2N0x}!dBP{%"jMeFO.z -'qI#B ާ悒by#JL{%4ZY}C5k^˺A5gc{%0+$ 9N$jlěY+,fF0yEʩXCuj^nARik+arb얎AD$ʠ'(v@MƵ7%?"',!@+}.,S yk  z<xK }-#tg uWpx_PAxu4hJCe`D14 Womi":!4zַDVvZ^As5*A!.zzS?T^4,wu߼~AlWe "LqwaLF:J~*HQ| (\BkW.nJ(ov[hYqj FN,Q OvF[wr\Z MOh3џ. *Q#gP9,$ 2(P ;qQZ&w!"O=ԪKriZLߊou6kjfhаI)0,Ю'u k 31CΝwRC| JmM>b[8sPa o7f|FN@ѷ](O?d,;9 Qo 8؉NPhwB< ٚlqgQ !(BI --ϖ@S8b{P+zTqh_&1>f:^}l\nlup@9 1Εp{@CP#|8]m<?KAMx#J_]n *n[6r{'oؾ%TwޡYJ4㿼M<2:g֖<+f\pݠ g] BH2djt=bTKI.p|dz;+t@~ЦнtX"0"r\7zn v\SHa[;.)՟vS^/Z!)"d,׮!bgwvt%2( :o] uWE q\[j-P $M!o4@0}ثܮ+H%1PcVZ`Rj^%%ɽw xT*"( @㸶tႏujC ^,&̽>ވw Q TՂ: e\VhQ|lzF7a=bH%q١ 9TD){)U~?RTLy<_[AbmK rn sw8K!cU+?uٝd)^_/)& YN_DOSn _zoh֕&~ZlNi3.ἢ6Z/ZZ"l+'}smk >bCܶh%ŌpH/v i?!ɩ %Mϑkx0m ((-5%5U -k0MkgElZUmۗUGƔ񇂦s>VrVipo_7vT<0{ac>Z ѷrg EYn2FZjf1H\<-,6GQ(>Qov=Z1xMd:0Y<(t&$"7<"0%Z\ $CSbT_#Xqr EE4B? gFf ORtP[gM31X4>IO;~#3ɼp@(T`(D׮i" N7UH(^I8z`01ADDAR/4R+e?ӭ[bϑt,SXşS.| F },hNKB#.JxdE7{~[e_rk%qD& ".,0O,Iv`lrw#p[Ħ,r)ȣȪ`l ]!3 #15y"@1 1L; _݃%& "̢gj-LYuʄUB,p/_o'$$+ П_==֬\ "z'(L0r geXsd/\Rnp4g9h᝼N=}&M`h=D1P(Nk[+=ipswo1tpưl.^=`IN=|¤5:9eʚ' ?WX$2:%˿T"H 4 ׾<vukxW}xaF  B Mw>ƛr"$gM3ݍr3~rŔ!&ew]&R3_; 5ﺧJ< M_QY̺} rӮP͂D;1IZVrʈs%T2+],02RX B=s-(2yyg" 9RוΣ HQͳ͚W 8%)g%Nm{[8(L?+\,OQTAXr>ָOmfR}d@rIe2N)<%6`9 8n+` h=ZfY,CΤ<(0=}7y\B>WH@&yk&|Eқݸ&ˈ˒:PU¨Weנ3 ƂT<-%$%yυSªNJ2zֿo `q6v~`{5:#:mp\BU#:Aᖑ5MZG3-0 ky[ VT-|@T7I.m{~bzڕux_h]m{A꡾+͕=R\ZװRGZH^=ߓ^Bmop\*"fꄵ"ƒ,$~"6B[|/ [Oo.-{+|(x;?pb 7}J ž4B!XhhPs(@IX<9[]Qpoۖl@t<.*3UxRB7+OA_B{yetG'JAk2G_gYt[StL:kAVP |ҭIL;V2P8>ќO_&CU[y|) ,w+*yO֜j) %rp+8|˨%";HFHNO0@ߠ]PH5nhDrV/en+S:|}z[A**MtCK~'p)#',JRd=}_ݓP[8bm8Ñ@ y8g͗VX@= 'cͽ z/Õhﷀ'90e+DEA-FW⪎caӍlDA&O25΀AlĆGTwe&74`=UxMM%gqVӅlIcehxX\ӡ!UJnScW#t$x"oel mKHWXZrc^A-&T>TCeKLo /I8hn|+v(o! ke>QVS@t(@J.zG^AERT bz1BGTb?BqwmլGwqyU(\@ {? )=[u t7 pARc[BTXh!`2a ԽmvjUjҐhMм3% qf(/8;" yi:)."!4 AK3t Ou2*X:"1.`䟇|&7-ikFӊ\PM{ jR*JR3v[q˃A'L#2% ^3{Ļmx]K;FeQ"*l/8;I6f#1ZwI 2>Vgi9+úB+}+9(<3_<:>VW ,Ѱ]cb:PVNU (!!ٛe i$$!ï$`TtТXkC-Ro49t>Hkp>ểzFUb߱` VofFGo.o+E8|sZhfRc4p_ȧ5,YI/}V@(4Qέ_ {UnUXS};Ev;,:X0Of=9GkYu ]k,ᙔZsc,Oy;;@R9xgyvrPAӜtY' !RZq= ^pMcM?!^eefኄhjFkn*@c#QZ>)zs&b/ Y҉d`\HuV*ev܄Ӭ>vאee}UCP%YN^ wf%4-t6p}6[9!80H4#JjDn8]+SkM{ :l0?y*%vvU<"ocQkzAItWd< *Ť]"D8og6DZNâ2HN "J]3u H!S\-a(wb]R̜=4=, A!Er-0;pmCw̩c.ku9? (RQnᖪ=<F`@??;~:!ER~E8oFNbC ~E<#1-H]Hp]aVv{"Htm, a"e|0+1t$>D2{1+F9A z~zf5ld 7 p{od$\%IYAz}12&:4<%bJ8F)a9s*􍛟n<"U9trQܢ-888409Ps"ysE `RD\( Gл<:!SX5b6ajyf]|qP̧uZ)R&ш !#pKJE_jj(,<b[5{+{3pxSlB[ W~BC1E`+w3)ink$&JJbnL(* HUm5zg\Q|'s:䱤z؅#iҀi#挮@3/h%<"gǸ 82 KX C.F"$[6b 0Rx&e8fB6awH+ R"!džau"fEz<%Zpt`J@@(Zp[Qbt )piVRRss1 9wYԿg6>ѡt ptr.D`m+qȿ+Am7GuZ ֜{´ ("zggq!A_G=Qw"( `_jOq)8*M&d8^e\(Pəmxz°r#4wF$ !Iىhg걯EJn߇Ĥj"ZvGun%J idv#9z" xOGQ4nqn2$&Ω@4.Jh ekl44'\z@B69hwR,P !5Y)`R7ȯM`ATd3(ibwv&xYitwP=A#i)=!i!2,u鈞W 1(l[8m3+-I wԪeWO8k͒iy(&&b! 14W & CI;OnCE})fsdB0P OMlJ#wzQM}[4=|鹦e\x@cЋS Kw a?,|,*`'2)HY(`#/zn=X!׸5뺞 w @[{T-5l= Hj zZ"_jyR{YuN@c.\9qpc|CIE r c,r$]#tGfS ޺HLjIDΏe!IVePD]Ŭ{5M0:8=t"*ލ@jy=XGuge#u)-3-HQeK .irOªt"N?>;:ZsvMG $ޖZARJɐh0[t֧d DEW_z=034KͷqDh帯k;TWE$^Scyqlt?z݉x4fOn^#  _]%Os W=H q<^Z˛ ޜ_`GmBgWo %E} ^6lg{#ٲ0¼Lx!4kQah *15RA j(<罼^pmݛ?SH˕޵~1yS\LNk4=??ڂ /0CeQk;>I&iY;6T~]D>#jB-օyvbP-Oy&4ȧџ#Wy %.h %]ims7pAIw\;:vl H%$Zf.Y%0& xw nHt\KH(QjݜAɭSBG܉ f 8y Gဿٻ R p|gD oba:y Q/ߖ0Kh\YtD_M8}?p,7x'y 0=xrȠ;(&CD"#(}, ,z!ٚװ?LCjׇٲNbXf,JD(K"Ln Xs 8/GlL{O_ӢM}Xa<4UE=(:Rά>^@av\77x@2,Ø٭N"@R\ȠlKafl.CmX5R׮v|p4p@>#t<Fxl|Z bP;UG:AX- g@qd9``^rEhuPJ^ *(aѦ z%\=ܫ4[ʮD]g?} 93$L3baQK!C)8%ew4KCV}ɶ].xHxD _Dz؅cYC!Ω?X'o߬NCP5u xesu @6kg2/09%Q¹̒ዖnjٷ%'D -{fhCD ynhk̶NM>/BO,iċt'@󛁳W965IkFmJO&dD&*M`F'NF^ jJ=z9v[9~p?ƊHLŴРJ1.suȂ/Fӛu {ߗYCAgUN0 bV?=C X[9y.eJHJW?$Hb]wة0IYΜO)I,RzfaEdj[g;.o)8j!7^Cp-*#7>Iib* L~uěi Kge:`tEKU=0+XnL~x%"URFj .<&Xnf+,XZ耉֫m" R U.ȝY*{ "ةaHO u&ìRJhd x) TDU[TtJPLqNq`)tn&=OgYNqP$!MIP+3AO+0FØ{:PVH~AVذ?{,k?0)x]??J haX%9@.ǖ\&TU$PD+TF,$);! c gކOh,"Gu:jVu<.? OQZ]D*X {tfd/ RjKŶ2J  UM9 T ȝPҜ{-?rBQ!"WKy=U? ^$U-jdʍnsj Z3#H@C( k|⺧xE=!k,!Ne=ħ*pݗL{uLɹVU]W(JX?~,ZӮSWDB) EԖDݽZУgz-{gt ,֯{,̨8$/-Ojzzg JĊ㠞Ns9͟˸J4?۟̇@T+ԻۡfbA:C/tٛ- %<%f$-h'șiIL&'$I= a-7TrBu?а3{4dV$ 2x=?"$UM-q>% iވV#:#eo7& zQ^P6\NC/gt87ӔVG{ Z)v1KgUOA;كuJIwp`JL8tb2wvDS2@^`T_5v5+:)5輇L-ON<;OcwXb<YZP0B.DbTXk* sf9A֗Z굄224 HEc]mw[ `(St"4]ް'~\ZK "MhޯѬKS J{iW>!fe'y.'&_`Ve$m ETZc- +PA?eU,HAa]a&L5*2@~&Y~ -]mzT(Ed8oVNm{UJ31$:OM]Vy2#8cL/TmcHU3W^[nn1! q..UXcKV6*@zf+˵T`ɘv U9**ȆUc@UK#va QraUۭ]d ؃)\^߁mV)RBq~na^"%x Q+_˛蚙A@1u`._bmw-Փ _kvRN8r:z}VVVR|Ӥɪ$K]Zs]&?c_)Z<%8aZs- :m PŹB7 XQܤ%j}m*dG3>pІZUDe ܉NmQ7 )4BA ~w)qbwrbJ &@ V6CFdףED41S Z]XtR!QDG{G{D䘹PV2P~j򍣼25vsT p%M۱&fs<;ٕfYz-9œ{lĵ 3wjS&e| @*/!##inS.( 0f݋ 2>y֟kbtyD5Ta S1U\Q~Q?A'=  Hַ2d @\Qƹ>޵_hI ' x5Wˆ.řE C[G H /,!?.u*l*\T4.R@RnK>JUEAV2R([BDT}fBOb73 E E-087bh)hm2Pݏr 0' <*IB;[r/e3UaDVb$]%R3w}C pOiH za0.P;BC&l H(DN;WmBG,h&mQmX]?(a)Bb7n @\?Ѱ.-%so GX|aO-x՘fg[bwŸ5҈Ř~ 7EV m .^`06K=0LaI%k!pMnMU,U) M$ bm,eNEmuɧ@أhw90|+ E^J2rB(K}䖨!̏y)g1 5 N ޸2j,GGCר& mQjדi%o&[$4Fc?"g‘Éo@H7WtTqY2`áU'TR1 Z2/\< zuqbI,JsʿK TqPP5vZ/$"l N+jE }3~"Ox}=s_ b{ی@M&]IeT)ހs,X䬽:3t 0{C'.Ai",λ #ЊrڱaGqQQCU]-۶.Cf,uK? (g8uW Ƅd!f3DY`)fQ7.݂QC ]E>elmMgCQ|lLm@&,^ fCk\3hRgJGwsLq3PF3D]QT,9qdh8+x{|`T3$Y=~aZ{N3J}E"Y[S!7j7r8@PFrE-8]1"DZIOx⤢!Kzґ GuK'9Po"_7gXF賚*'*4..MJciY@W$dvWj$ ^~z7 zC}u*-t%̕JA dFK7,("B] Qa-`|=APv&)*xgIKx)/S_"5jkU$WWz]H-H%i0BNhaa<ң惘ηfyzs6MBQ|l*wcVI37/iz2ui.J68E:V]u)½f3(K)>f1@|M&B.yrervKAtt- =P$X@Tc3O>\#K`f5"?8mXv9"? 5,&Zq"4}Xb箺^F9 ejB0fb|[vXYa/;WO4^U $Qd^qBה'(REc80|dMeg[!|bb$Pu[`u_$(B)Ok ^2^$M,-z9təῌEVX٘P/B4+$9А`Bɂ1p=jIcjՆWm%)>0 &icv*2g2"=cQ(ERb ]ʐs ü2n3X" PQ#7V{LA-5ZAUd<3&/)FB*i ON:>ok?B^U7 f #1 *!T=ӕ$@=&]`rX_6_?JN߅pWt$u4VÊM^2k@?#8Yѡi.k?ŕ`"H'HQ8?2&--Ӑ?+XNɅ R]9"rZ뮋 Z'E]X`Rkw;AU *,$Aw{NBߢ " ,(4oQWa\V_D#8ϒYH t 'i4I Ɉhp<*IBP5x6avT]$U;havPcRϼ/w`T2D8t[]UW)Ҙ]oBD1I}>a R!w ͣnl?ÆU.x`CC+[ 9>ik:M]ӤEaD@RG"O?)ۅڃ(t"5k]!6@.ØT}s ʂYnYXӥ0Ip?zEbPO.\ "pxx s^ib 4#(!f.ө|PϼY0[%>̢>eW4mt>gL]x7`9sU%Ҟ Ƞ"Ō5vr{Km,.Ӗ?6s!Q9G: aB]׻Zhh9B79y/N% ܠ%>]oB&X<\ss$VZ6g]X#CPuBpd3֏0I,|koLhN-Bq:wi4n-l.@Iu/i Ô GF.!Z#N^J'YDbj\%"H&dP\ wA],\}9]׵W?{# *?dUy'ȡ6K8LF0G[&|BQnQ_mt3I$yjt>RwӡPuNhRƛPVSoDґ Ek6 jRWlEf V!PzIAEx AZ ڂH쒥@G{>oPU~R5<[:⛱;CV*Wh/@jA/RB=_؟ drє:?r,r&'ŝ]U´dS`Kz=P(,:tG%r3(\3P[b=#>-()!ގ \ͯ 7Qkfs0b 7ԩ6TP'Pz:u^\ڔ_̪bZQSi;OOT W?nmژ<-%AP{NJ~a3 & o$v2Lizs;QL_t[k$7ڋ"rӕ!= I!&pYb ;*\Qݐdn wMya곥KlڍEOZ23JCYߞYZ;I)VyL{ Ԫ~c"DI ̠Rǝ -]QdYBWpStcX!P'a%}(Vg<P/9-:k 2Je*k]$#1/B 2a×PEZ{RGZ+E|a$V\!0Av2 4:Aua+vw?OzQXM00 ĿI<͵p{NZ46mg{y*L6@ ,95:o ꟙ(wH`M0NF%#{oJυuB1)d'Qm,.]eBI!R'.J;P%G/=5JtiB/yd*r?˲ZiH2a.l+͕bL% m,>0?G;#2 *Gw(4>m )SGiA@*+D en|@q^?aAiG)9T8= 9Aa`R/SӑJ?bHnzq%Qʴ|PiBЯ#U|}Kà>Qww(f:^v1#ۨb˽Au PQSUYJ@X =Ʌ9tB3/5w`}m~ru­xPEJx)dJ 2sȩfu*ۢvo#2OQV_l2,u}>u[ցS-!yU?d3@_և)>-1mVD )rO(Q5\u,5Tj:IwZ_0q1Z=a q=ȝ5U9VQwU뿘XR-Mg7~!͕5PcygFtRjH*Z%LՠR"+d' Z4 QwQSX--5AHn]a*'i.j C(2VNՌIM"f;KtP(Bk>|Gۙ) YΫ1DP5#d&yJ* }p3 V l:ΒlP]tɫ;oP4q;GQ(xdBrQuʿx-9'ww"Om7~_9 ErLXP] wJ'zF ] GTbb#ڕO(O %r~Q 6v#\ǔ)י.H^R)rJdD  Lˣϓғ^*}HXޟ%b!d@26Θ ^XRzݛW8l֝K?0 nQ–i duOGX8RBngTuG"Zvtu}‘͘nYIl̜j-/ms{#s>P:;#DY{*#Ĥ^^;X^Bޝu5 QLߊnmӀƲ6y"w3)$[8C#zBmWB,aϒzYz$EEvG&cc;<ҫ}x6. s w7'B^HkGK6H-ɫMُ/"k>\nfӳ`TR e3ybnIr>ml뉶QVaꏡEVX!БbeHu,wy,g~/gճ)0Uj}dsA*@ڻ*irOٵwԵ{ȍ"FE8{Zt IʎVڀAoU^x2OsV/sovύMMA@ml'pw&FBpHHU iѷU3].^TQ#y{ATjuw7TwI{~w0x &NǖtRR0=L֝{Vw@36 V6j*.!rYA3aAvO?Sv#f) HB_ڰ$J wBǼu}2kh3ZϹet4mqǀ4"3.%$*2q7sw@wA_[V/E<jK,elØGݐId4mqgf$Ju ՃPĈ(X=pRIhqQSLA [0T xP -5]LԂb F!Q;=CgdPD%{*iAOwM jZҰ#$P6;7gyQЪU˝_$ xaovt(DB?Y]A`^?Sv?0ACUkOsA0"( A*۟0F'} !RRD+!Y춾 %AbO4" W{Eq 'yb՜f~开tЏ0,ncv@_UVAxiq)ΐm6m$UKҏ/ #0 }^X)BRC0|W5@/D;'nkjִ~&!K~ti)9=u~.` pAdo'Z“]kz)+]$:K&㋀npV*g H8Nn~Ƅ"ч: =LLC[C YPy*`|e'`#d Qr+@1;[e Uq; ^NBP]DYAUy头Džg$!ẀK#gbf\!05@P UDlɋt&hޟM.]CrYgR  I|0s/tT (i˄[ԁCZRÄ jY}A&@0V"m1׻̤ߚ>TۚR4fgލ^@-)Y%S ͖|@x@IS8!zP8`mJՇ8DJ׶$ #*32ٮF` *T"1# 2xޫi{*_zpyLu'0w/|쩼Υ}eJ3nUD:rNmXwVXy`-^E 4<7.<;(/8ccm{.+?i;fٳwDg Wi}{>IK6E_k.pwPoDNU{[պ;ۊ#?J9u:n۫[1 1jDOȎ8|Eb t(ΨoH:KM.԰Bn![1ҋվ8&g]ևո6R`$JNj7!!Df=\[-c 5`Y֜ёaD{M2=zKKwnj`-ّk|.勱rB P[ U^J')ӘQD$֑Be]jEJ748Q+_jq 8ޝ 7Oub'4r&̍+T{%(&{ t"k8N'0<.R Gn{aڋhu<ĺ+b$Y&1.pZ>4Dt*eñݖe@WeSI/u\كF̜7^RWURn~E!fUd|C5.G_J%OZvU``!͗}c<~kޘEbUk:VAC XwܣcnIRkx/&+] P<<zY&'ZB2 ΂ƫt ޙ(((xVʭcY;xISX%uwLMBUlq03MɉlR`bJ$d/R!hxԃ_Gr=KɂG*g_^W;H1[kZNWvP*I3[X=Ykc;>HI94  ߖu7|DHzzh#X&TYU(J*M&o0|,ZARkXU Ah*U,{eUμO.R5{u x3TFdĀ$ceN۞3"ĠQ\&RY m} ʩ5KP HOMӲ!J}(~sGk0 U1-ˌ t /9p3W#{[QqR+Dj~m<`Qy,*|sm| ߩyWTlT1 C@i]v:ꠞM:>p;Wp;D =~({#U6C`g`{PYM9!eHQݗYҽm+Dө&;BW 9p&S[BQK#Ga({6JYa{p\#oa7 RHUA(rڋ_YMv ?"$TVZ;E!d})G2*9ơƥ<`H0*W!'5P]ѳJ$4<]q:!P"Q XAm.\,"PY# 8i`ʹuxĨIȴJfaD[;A"/Qۅ+`,5 PXIajܰGb:+!uX0-1vjڑT²3m4@MZ,ׅea8Z@teÑԠ RJmP|JOv [T}&5HAl]P :bPID5ne!*2t d_Rqv;81AmҒX^-Uȴ;S\+ƿmVAP͑Z<2҉|U~wrڽ 6M*IHu 0ňb%Hr JȄDm18Lׄ}ݦiV6ʜHi<3vk|8]T9]JB*(bs ,/*)(D5*,ED{)%B 'ݫYC&a 撥GmjRrg)]) Q BŊ9`2^DFPA"!d",i h/7E~o#̈!D-72C1W=~B" ݕYk{8*Hػ u4~PDmMsr2e3:~6r!Ht 3:>&u 3f~N(KI I͏o2:k4$ JN٫]Kڍ9B_ʉC~& ֔?8QfPU,x xhzuԭS*dj FJpk΅xYx̑Bcky;1rcODD0"6hx6yspsPy͠ȩgnܗ >|)rMߩYs: @RW(RŁTiVx/,YZ<_̕H/A<|A@zn@w˼OOZ >GZ0{dϑP.-?B<TI)?5Pd_x+M%^_RqX˖AZ(6_m2qͨτ<)oʹpr"' ?Pa"-kFD"KAr 9r)AkA6׬VU*2puÿ1:;JyxtuT2xZ#T(JȈ@ p%UdAiLA6ע*dxBFE>iH/)'^ׅc4_B"qzf/]02F0 ivb&nQ(UӋ5t|TI.ɲ4⫕{U}䟴yj"1F TyZ>`Gdv,M"D3@1}56a;`Plvm;fUq;V#U8kD>"/_8]hY~IJ"hT,Eܤ,ĶU,?p/)vnkfMp-zߴ&D'/Wb0* }#r ULݫl>0QIq ;%}jyiqԂ_Ia-qJA8z{`zmzta{b!z{02D $r/"a3B<><-n`0Qa7]+s0wTGѵY0.efR&I!!Z_ߝ_@M2ʅW3L<[$K2<u˙xG"Fxy1-"`̿t{\̖ȿȸJ®ve菣) fB9G.{GX0iaf[}z`<SsA6(YYu\[wsE@4*^3ÔT`# yNڋ a!z)/SʹppHZej]B w"d,P +0#r),x9 L*?mz5sx:o𳁼H,f]khgeSYwݬ8rV S*fP92a2@Rh Π-|E0YI8UPE+]9P;HK T*ՙ[yhJXyxAۂ=^.gOFJ$ zT2DD:gAȆSp;4vW2xyAaH_@ &ni\Q]f ڏyj+pȺr)J(>蠳"rgXyEfFTyT=J!>ltH%LL/EU9#BTW|rq@[}vTxGbjA.DKO!bwU˜=Ao,֦@63dX$0[Ӄ8MAvb<5Ѳx=8Z/H]p~ 96E[Y*+^"Ah1Nޫkȫ'ʂC%xz6m 3pu%n,c4G0D=k*Q Uj&dP'vB\IHlx&YjgCA 哾>y|E|ѯ$/"Aq(+%r ˼R m\M?R5X ݧrT!*6Aѿ)" MmP+$J+)TeE"&,V?6^ճyD"3YQZac.J5>dxB_b[Lu*CN"J8KhقM+;% jP}|2Z.go01uzхe>Y^ʫ\*˼L @ۚBX`&u\h)ب.j0 a,c|ZwK=u&/E$3#QD8x%-@ N$KwHB/J2VV]R%v !ɻoodsAvךp)jZߜJJ,m&4 :R Wu%Ɉp8FGʳ;¿uVhD9_R(xJ?cTF"tB$Q"Gpe.翳( m<Vb LR3`-_X(" ȑWXѷ΍ U&E[V> 3Q&}jW_w"ŃRQHs/vf.>#1xSSlKfWb_hvo]z»<&bW)G;{#:>dD,W΃歭4) $U( fW޳mMѳ"?DVrZJMv/j7R "AʉLG1:AۗEcGƋ$\BeI ʽ6gR`RWrXBcrJ#F({JPٵYfp]$!2,G;]鸄%'+u@ 0`FgG(q+F= Ocٳf>fϘČY@tAbb[{N<( IJ->J<\OJ4!EZv?^Sz#%4\v+ozn?_pHXy@+khoN:&3VUf*$eS͋[E< :w \Z7GXg޿.:kn)9@yRdžqW#ֳ yc(@ DQkyLx;丬ֱ7dyJ~b*PxQ˛3n6YPaM 1 3':<@s㕾RUf˙YGnYWRÀlֱ2 )E(o̲=:Rn0qCã.i#5)$! -|!*,Uee|jCʒk#[;)~:#-kɜJ%9FAYƚ ?[B*?3O|đ-r-k;DyM+_STRDt[2PQRp=lϺ0wYKPN bOJt E|n P\b6}qG0r R,f 9?p&]ˎ5jYT8Mtm9raA#I4&vGQLZFvmB؏Z]Uɫ?>^iUzKW|µ? k$|_bT%O'h0bV_AR̟z6K͝A_%o[")xOy13'mH˔Hw!ƤDCnb|!#鵦*d$#0nz?hDZkn9ֽ d PI ؍&qnJsDGXR=x31Oߕ^hh[MwJ<)K\v4QR:F+b?Yw|A(CwiS-=†F2%9w0\m>Jn7->Dezz_ q .fH\@kw2Y( ʟhsH<^*Y}Uy9 hk>rnpJCH:C!ǗVru>t*,V*Ղ#ky!鸛BEfWx9u3Tk~u&Ճ0ʐ/}b[o0͐R.D2t]҈3.)@:OXRBExaTx[݉NE֑krq-Qung|SW`#tְܭ&x#5nʄaU*vTm=$" Swý݃r(rZD{ g:0.jImj桸p"f xʯe_h,@mbcO:@nLFV}!YKҐ޹lԼ>}|z;V gHoCkZo+5;]c9ȃ m9yԃiz/Gљ(S8̺U:-5#Ox+kzʲ_򊧥w T$D+eANV93F,-PRMT @"vi1 S# .Gv kzZ:hm ;Ʒq8nG- "MokE@Vm`B@!.LyOWD¤Gt =[nYEՑxEP!v ,o_֬ë$ ەxjR3l˳Hm| `|+TBK`0&h2 褛jk V \Ae.hk(;4ؚȑ˕m;R-Sb/Ne(h؛F̔B E [/?fȝvj;Nͽ%bU>vDb;M AL}%'hsuI*U9ދ9S\qCeAsfދ^'ܴ6C+{#|s."=x٬QF vgofji|^gjz.:+AS.Vjiߑz?! h,x#XCA8a%ֱBT7 GcnfY}Ƥ2F4;'窲D":ކF NAa gĝ՟x Y)|▒-S |c/Xc:ZCɗ 3D-K`T@5a 4T=%6:UC|/b*BHMk,ĽP cJokTL:y*ѽLcGGG(3hLcxJ5!ֳYn\żD-V% AP!Ja VewHuVO(jSQMQy@O*Js*}H;\cȠ S>CP(3veO@ȜA೫Sdf F*BHt)VJz5uR "(ƩGТ}lW iNU;A)n)) =F t`J q_RcÓCocJwD챱 u824#eH_=.NQs`^Z]^"1y)kL3Ex YX*Z OVa+ƶ!U?X3ʢ*mbeg*2.Rgԫ[ہi9vdlr +_N*GxUOW54'YW`[X*ya[?@~*R } cZ[uS= ȑHs==(]w7̜[>V]n1 ?q+Kw[*hiw<"daxSIX gQ#R32w{u!e.[n}4+*)&.=aC#̱–;KwP*XFeJ s|KZR / Z*Rlу.Y Z_m`Q_@U!#C˺'4K"PV{MwP_V$ M@" +B+m"0xOQD iWOF רz{r`K26k75(x1*84˱CU$+9\2Gl;GLD%TjͧQ)5!x$x%hm@!$QeFF@$f< Yo$N]kՑn ^K8u"}fFmL&B8 WF~QCK(Q_{e'@KBov߱6 VGʀk(` +3C^yB-2|$|E=z&d|JP7E}n Bmfދ~n*QCNV YCl5ko*P"4GKx-0R"TI(6mS!ha8A-!/01/3n:E=T&a4^OL/o^rgZ.a:A'HK6\\zR?)͑.%帀qI;MvyF d3%-~*&yhϵv"6nh T2 q/xO;( PLNz=k$8jyDigK8MSVZ~nD"-j!rAM7Z{()2+1uS@DB$[RbֱO`21ip#=Ug]o%¬UVRRkX/V iekX/pK $e.$  FwbE?E&ofw rJ,U,ax8k)TGOyP̽f^>d/"wԖS H1M 7MAFBgI%M!ϳQuLsJ՝_j*es8a``BMw>c8c![1cH'ω>28B9mArZ_V*R4H;Z[39'w}y]{{aw@b"!4 ϸt%`sGRů@lʪQ6 mJD _[RF'fJv5ݢ Mzx<+Y#1"ibdN%kIR⊇*=ũy>7}w01Woup!3: NIՖ4bI˾z[p)YK~I(@= O^:ZEL8*;5W! %I$i1AdяuT'h1$Tji.U8=!,b׹R9i( J[c/$ɹ۽[UNӜ>BJqZHy.F(iLL[̕/YD2]~6-f" #*։"?H#)g[^6'EOޮHU~Yr _[2z۰G:'?,uB4jt2H"fC1P UH=L|TbmGmlA "%_.e-Te.[$R3hNOuX (Q_HS#o6Om\[m6I}z|*-s Qjӡ`ΡRhΈcR4&veT V{fG!!o8`KlGv/ Q'LkrNbG09ljdV'dJ/x$ū; ƪDLJ?Ntԗd_KEdZ<ZʞOy}H}( oE"k, p ]J9m)&4x;+M9Y\%äVFP!UEYKN+aa +vv 5&G~/ @ngFwbg T@QG*hG`#àJƖч#oYE5Ֆ?6ѺI#!i}߻1'mOA'DNwE˘WʯrLZtr n|MU6h_t;ͩe!F"C\Mw)^?_c#99}=_{y.y[oe gÕ,CCxhvf0n"=F S{QgX*?ʶ5}NuU LN!̹27càTυKuX"#,3^rSHHO)ÝeחgHe tc*Pz/6v&:[-#Oj8L!Ht o^TGetA(V$Gz4t@U ,>JZ$K!1M9Y?(*rc IÕ 1oԸ^c$O1 (0tߞm()gO&=?G;@O$C +N $7~="jfkߛD<(/rn8Jgc :9e֋bC}9.QoM5 Bf@PuVR/d@o $0ALUۑUբsSو+P_Mq?zF6'Ѱ>W/P̽ "kb}~ZV* حa]}0) 6V~3sc ќDͽ<&X+eƋL9t{d !,IhILGQE~<.,OFnhZVZ.4Q4YMO^11 *Y4RLp* Gъ>bh$wEҳsE^CQ~cYuu>Plp5%EYG.#_'~r3&é9r2chR t4\{A>}ce΋^ vK74\j/Bj 7,3&çZ1kы`*eyn.ŞP0b %?А`kiy )^1_\A+5p`A sfZ ӄUFWPx?SH/[xոF*{'#Mx Uˈum49 | QȲˆo;҂\;$MZԑ`<5$g%b3u/IPRjk;LQ=Ji0SfiLD~]vUD,1Udݡ7k BD5| s ;_fˉHvv'иk ٥LIkxgu)"[P+AX Vs*"X$噄CIDA۹q?D&Hu46ݩTD&RS[֡WH&Qkw 9f] Ӯ\>>Rk--#h3( Zօ g?5$(a)6{{wX:˅UHo![ $lU^') UB@pR X%]|-;(@X_ GdF:QHɊz/TU"pT-*j'Y)>aq -\/]cEE-.ۅ.{glM{m8E͹gM&fD妿Tdh/twQBAIb 7sE{(" eƋ5'nUA2T>vNk^|uxs ٍ- .Um7p 7u ?Y0` N"DIe_MM  3#aVaŕt|X{w ~aJsO}6+'dZV(+\{&Y(;s;!Dn?.|A!4JX2*{`ܨ6F,ND,ҽplg9X=)dCU݅bi7;#IJ~M0ڛ.;L4FKdMw lx6OxaopfM-7K<5 *u=YY{ɬѹ"nw7$:Ea|2ϻBm ~;trL? Y 7z~vw>3dyPduˢR#~>&M-$=y@8c [<',JkG x PE.Jsn^aծ 9z;;bP\)`3V `"a(Xc DC՟hAΜ\%1{g;d+HDŽp]в]ifL j%a-=Fi)_ X䄙.vk_Ocof\5Ѷޒ()#DeauD1ljAj͚Ʈ_r;GyԌ]S'a=DA=!o'ϐ٤@"<'ةS꿤Eu[ P9 )/?]Y->cq[Ov@7$dV] QXI.E> ~&]Ե55|.,|39K:|pd4F%{"?&E)^m7&*E:9DWB-`_!  #'hΞ.u;:Ø%8--ێ$xQj6n\Sؼ"J[v+S\ޔiQ4͹ghR\pR`60؛Z (b%W`ع?DUr(kkXx"OfvwCEy m0ِ G: WJ4f Z f YCEk[Ba b[c;[v;E^/Rf 4kH#>`F%"BexڻZ֊  '˴'^)gە8Gs,c 2|Б0ʸb:r"孩s,Yl)ܲKyŬGHs1A}=aa8 bʰu3C%Mw+$U .x*TisUfdbA{IDUE"mbAZʵ‚6* ϢwKW2WN P(,q&$f@L:$rYS !,T% <:>v/ !e;ANV$(-U7W:ԁkueQDEAp(&T_ mr6bR|lb=8R>Dkzrv^Xsxvg2~(mv'Hҁzg6qr:Ucl=5DžU72uHZQ*쿼\WM#[]V:$k@=-Ia @,L[^҇Bl脯Q6PҨ\Jl'ceDkGn42ˡj ؈P'Õp[EC[K HA0O8 !*ǸBAѴJzQ[F?ҁZh!{_%OU nh`-eIz"@I<? IBI\;@QZ07- A֟O\  yӻ{Ng?.X0(<,p|!*N;h/-w 7/0-q5qư 0Q_HTXsݠ*.510B-9'%i0,p?/#`y;Y1!XG]-5.*(l9|e6z aDF|4جbcdֻ XD 7" Lk@wdI1UMV"MĴ1VT?; {. $ , /]8*!)鰲o\14Hj5Ygb<d&u1LXJS.ĈjijqgU>˧Xs%񅪩1rlp2sד2߮ ~ x}fd2dλu}Uw*ۧy#\}RtIk@9U05o\~ +Dνv FY>T\6LHTrTX@)I81g/k^˻>ϲZ1JD~{git*_[RZ 'Slgc2Z[%^[8Q׳a^,TJM9y1X( Фo>{[dWx;Y:o ʼnԄ'| Y# ed=9DD`>)9*z!K=yBu+~:|+(bŴB5vա3j}QQ,Od3DA﷑Z["xAcbIb')8I {)]I͗0!Q¶t^%?H_C=i%˯(aDHq;Y -E >cZwa*""+۟T<(_uD~6 u0iH,8$MPecU+fjy EwFrהRkha*QoxXK]եT1 0C0>O FC쿕[a>nzXXx 1 TAKXAN$˴њ -px˃*èaRҗR˲BD+ӥ0y<ּ^B7Dm#*?c WUDFp 'Dtד3.eVEdSdYsZ SehdTi:.e]} ]lrrP]‡"TP)ׅ֮e$BD䈗W2:CrSA 5˙X(IYUDijݷ8@_ (:>搁bK~RSs&]Aj@@:50wEn&= eV ̐fJ"ER+˙& t@EN *xaP^Q)~ID }*oW{|4z &Dݒ+dQ7R&w <L .VĘyPt'%uK^QIA%D%=bM\ Bf=z1@[[SNtC0B$hɍz%lKHF )m<#ER nw|D5uU%V->'= 0 $w"zlU:XZhoRXR_[ʉwP)vJU u8$WYA(4s>!W˃nWӔ90DLcJF륃I*$C`к+.5ڑ !*$[[K%u aRTM,W<w3xG =n!f,>弖E5%ژ:STGz`ēɦ *EPG!tL`Ԛ)P]U;}Q7k۫Vq<. aEI;I ;ߓI-{*l(X;3Rm 0b(eYЉ ep?L x`nȅk3?m*+z}7p$.a op=dfT[OH@l9! <1C-Z_A=_:~3i_9XFf;@ǃ4C TDu}efpx%/DZ  CmUIY60H\{_(X 't~N-ΈYC@ٿЅ5>Vx/«"\Z&!bxC`xr+Zg\OwqY}g3:44L'L>"OFtB‹ R thzAYŢa5΄*XN׊$Xr:S:|7YNKMVfx*n h0Z1X%H6YxC'k8Yš`-Kpiz-.Z`9A"<1FMz\+DNUgY~E[TBTrb6PglpO׊ ԅqlԯXOhDD(K\0ͷÀ3D2VIQo`' d9bYXz_ %^uڪ=c'ka^ qm$0vQJY!{dYװORePۅ{&5ZU@ZA^AOOlװ¼|ʼE^"i:}W A8`?'^!OY/ag$3(+0Գ^kUU Dx=Ɛ)v޶b]wtvO$0ɚiL+ c U-ZзU&VH2LkS +LVpn*roaK_*4.LHH9IŃK!™ٖ*h3p 9PʑEB6t@1=MaJ Gx3e] 0 H_,ع)rl*@k6"@d)s<>B%"FQRTR^_`khm}gDu_Ke䈳o{UeA,0|r 0p Am cZn&UdEF{$ٝyeLJflѡd Ipd}MmL$TܤL{k`""A6*YElѺoXTuT6hiHxkDPBo3OX LIePcJcmL3 CB OX8D,Wm(jT,%+`S:0 fAHEPYET{X"ő}*| 0r" mlJY?Y}@pY$Yt+NE"&C,ҖWnӧ͍a%H 4y`\ ב6H@\U6i5S@ L%M8(8#8 )kyEBoHs WC*{YZ2ɴF6 /XY7'7^"-w @WնQOEpKhdم$2 _}^3s9P=ȋ, &6D"$xY"@CSꂈvH+Brxcbg}D![{#sY=|酅 )mG,@AqU)-(٨ @:x9!#ʧMm8>-FK*P-B1l=C] n$mqI̓*xLTrQvN_Oph$$4Ia śx˜j~v?3 sn (m| 8&*K"$kb< 5$$ m \BC7EzgLֶ;_J `iԥ$Plvy[kKqN".AuR l@MIz)wrDJlGM4Ȉ.sckxRp04x@ !VIT[n崕!.H9HFdᡃ @@ i>/AH#XVJUv݅a8)D< SL*B,Kr."(fԺOt~Y-d,?~UO'IZ%ƹFa/!M _NEH?m+-רbX"r2Hۗp%H:Lԅ]j2DyL< rhxkn̡Jeu`-4[G_|S?!V5Q͹w\L0'8t Fn<&^)$Sf晁Ǽ" @`xUއd;~9HY`.^~u1p?'(-+? LpxVĂQsoH @x-ZPBP=IEA;l9dh0Tǝұk1@GA7'jXq{%&1|`0#wN!m$++N]__lEP GDj@!~P:Yvb#¶QsISM<4ϻX{1 <^ &Aj}Д(B*B/th$x!>־ݸ(%A֚o 6G` DNpxvY%|J 8hl@Uh%<>7E_AFH-Wf%Mj%q5x[eE$ʈ~nD,#T.< JVgxv|P )sC@D$;@~7w_X0L;b#Ag.%c Ѕ"f>h>vc:xJA ᭏xtURB!mj^PcM,EY$N? @Tݥl*!ы[O)W0N6Yq_§x]V:4R##@FEUtv %sP cX7`#`S4pnBPlV1@=U@ཛ-*qtхۄVJh`܃d1mL 7 $(+RHjF Iԅ*--赬F+VE9)1C -ip**ږ[ _Y0b@Ei irm氨X0nF "0XGsבᦠE~D 5A%$l*Cx*EiE$B 3E^(Lf"L)XBIPp>qʒ``0HƎV3M!p @cecm]S.̪ k~˵( ֳNA$S@N_ HpX^#xYV: Y˺ i4x9gNꇫr$Ix'xmdoqz膀6>G$aiO *PG8YQ ĉ"Qhr(Yn\2(BxYWؖ4캾6ִ)(pjz9疓 }cIÐ H8> [C* Ky6*jQ<:-F iVLY5fIehC30U- XI!J[S&bKB :l`d 'y dAQ<F?B@m7( $d=^B9"9){j`B1egui&mo ((zXHYﺘs0{mRI:ywiåPQ%^q)A@^i[[s/]G]>dM y[O,I`_2|W^9Y.ZI>I%/Ll!1=P[{/@#" RYY-BBi WNs8wHDE)RnȆVVNYm1UB& z-xX'!#b-rkE\%UAB ().˺&V-bi$c[34tIy1t-V(&OJU! R؏)=Wb:$ Bab@3)D TAO fWE5-+EJeᰵnC!L PPXb̎ D*PD BP7@`+**=9AcJ0TX,&{p´-h<(6T2TfZ;COu)t+beehEvN(Ś6SL`o֕j]IXe?mO>vqV,|0wu(Ю| L91h'trXmq* q4iLYG9 X^FbTnTl{dP0`+%4Έy#;9n0M"-^mkA 3n*l{6%5lhX?]|lpGUS`QS^}){QY>[ݱ6-mG:fSrؑhT@(а>Zt-3}=W) -4; -h+V.ӖKuG5&2EzPV3Yd>T?:- )Z,!xE qxdj"Ⱦ ̇YrmIGF#qOWٖ{)Μ /";,.TVA:/ M*#TTPb ZwVUHV "V'v[TBDs;*FvTWp5ؿ{@C]Irt*{24,٘ D7|(t: `>6RTl tU %Z~ 0Y%YԌZ˶@O?MC0UE6cɨ~ft1>EaHB$hY^Ʈ>2B)q$:فv_>%NLg9uMGpݑՍYO!T7Q5A0!LW)T=℡>@ S.n*m|l>q~M[ *UuY^ >%Mry~f^TGt<9׉ ;*b؊(Z51 <1e=+ 4Izz7ʣq)yx$N^Ս`{B4lgĖ+qVX~`%Gڛk``]]∝ʻm WrA)]n:FP>e +(I"g/YU4!@DP]g HF3s/Ћ1@ ȬMy G~Iꔮmw TB M )d† 0*IR=6prA(gȕ_OqԬbH[' eI TZ?Wmw(~2x'J 3(xBQH;<~;Y|P!4P6&Y|Q8*q؃Z1.hE R`W3^}EDi) tT7SvW  j(e2A؇lM FhTbHئ^+9z+Ko@^h *gt]e I;ؓ)AT ]PK'pIZu|أ%. CD^y_cTZc֔xL|,dЃ?%$abJxi'U { &[W']b ,YBdMƸ☑S-KE(ܛtHI$\|=fVY-$uQT0*A|5zev,L< c t%QJ,gBVҿ|GsYJehiAvtH.fCHkSS %o ki:fAYs imandelbulber1.21-1.orig/usr/share/textures/envmap.jpg0000644000175000017500000014251412274512437023651 0ustar krzysztofkrzysztofJFIFHHC     C   "1!1AQ"a2B#q$R3)!1"AQ2a#3Bq ?[SIչ`s$Xp_UVra-?F3Rk}'lʦ,[g~F9A[zԹiBM/5dqڔB z.6, 2H4K8(i/ڐl$teI0&b/VsNAK+#?r'~",~MAuslhHp6ܬ9l0g~?ْ&>Ol?rs+b9ܬb̉lc!w7iܛ2Xg>owɤْӟ.򱕳%y#)F5&FsfH;>nˢ)f΀|*;ܿN-MH̹q,Vʅ$-c,jHS$/aH9rϊ{Բ w%p: .92YE{3rz# [ҡܘ]Ɍr$֯6V˓`DK[=B i>V (ORXiC-Lpx+5IK_ -Zܩl= jpZ,T_ .4QB쑾!nA{"o|^Lʀ|sܛӔD0O-^̠B׹-i{(l*PR:cf0r,jTJA?fzf\pb+N,&U{'4GXqV=Ih X9Rrml $y=IFBn^VG3M{ _4M!0FP}/8Իku{5+6ܭH37$,Xl-Om">^HXeQjB[Bgÿpm L#МZ'Ѐ%^t; -ŭB *WoP.%Z.SF/Oҫ0@sH*lV#B׽eE\>|Ո2H1sHslYVT(Ԑ\Z^6/3LUQJْ G4bkZWJٔШR?QBe4(ԚQP%MJ'>mBk1esw+5tRet3"N].Ze+Dh#UjZ&(B彨MHԏhrӔU/RacԠX'GW jg}PgROPM5ޤR"Jc 61\c9eu8?r"_Bܓ=~MXN&'}X g?s08Oԙ|~lZy/GtReZ DyNs*dqEu'k1]kdFC$ E5`m[;H9UܼX!J˰WIX /WMIMj¹:\(oː\,j^ȽP/e-MQ^I=:Rޡt#5- KStY2 Kdkභr&grY_dJԘrIS {]oiA j0 e[ZdOh&$b hzƀe=+iQAPX̰+p#o'cEw\RObYUa\^6u)١m=k)j!ܯDJyP% Ld؅ g9]8UO(1w-ڕl54Q=J젧n=h7@@\Ъ3X}sD5P^!u=4b+g_4WQhA+=I%Gr2PsSԬSܖi` 76HY:2_弯ܵsH2Z/­ 3{'%&Û kԬڭr`z0ñ1oQfpwiTʱJt%-~H {ݘ>j#*JF rsM!m]kqu&APTνGs h@eFehԐ/<rXMgB LYVJ W#nI6;H!-W`Uܫ.tc~B}iܚhd]w/ζ`:F-)6 v2S$ Lٚ $o0 KZ 9>[,;JɕI|N Hx7 ܐJ@"[: XgI3fNr]"YVк@ va KjDDJxtmeٹ #(فܠ"Zlg ܍`;&ShKQȟA2Xu)Z5!q7&+Pw+`F3j-r$=Ar $'OMR j dG{ yE IG,$sĀ-H >ܠe#yQS,%[=_k˰/D$J$+2=I<ԝ5R+߸jP5*C#ԫFBtbF7)0fԊnM~/NM,BTvّ2a2 6HfXL,}Bjmzߔ,LFߨZ㐾%;0E+8Ȥz2Zw 1Ԙ6Nf] 7Q6z|JR3O V[GP>HWuOYL47qegcO#b"7pQٓiSfUcԉwb}HЬ0K.ZIux>1`/&eXJ[HX3K{k+L%1- ~L]cz+RqϛX=g~j;g:ё>ta Th-֌>BdAԷ&h9K?S>?%Yx] WN0df/sQNd6@d ڕԋ%"r ę[1H0\FMs>[eă.hc2'0YuM{ .q 8̲pB_XGGtFfc6߃[u^^'R+]eԦZ~H elA;7`[і;ԀqF87*"xGS5++ ; U./),w%EhOM>e.B:BOʾiEw 7.aopmSzdU NPU.&R<$A<+ܾo/:>JN n ?r -R?iRSY=7Zhn.=AbEbD.}K@QNWZԅ:֥'E2w V.B+8e (aix" ˓5 2¡ੁܹ+ԓ?lj({J |0Ա1ɅSu LpfG*-FZ$Pu)- /+>yJ,_P eKTհ2ߩ2DQJ?'?&Oe/<ܾA0.:ٖZu*&REXU:jhQPSL\i)܃D/*CN?Yִ#% J!%b' AV=R1L:v;A]0̊R ւU ".]+5;];0xSK! A~2 s%B$rx#Sѧ7Z`mnRySe♴{n!u@K2o+)ߩ1P{sRCba0jTPkqВKZ1!gWY%f&zѿrQ>+=+ܚy(i(T_N+ےj=Q -g%2*BV=A&+k Tܿa' jmSh$jw.w(Rw"NQ~7a.BrOPkk>kEOrۍ~:I#X@&J+J7;",h,}[XIW,Lh ɩB zsp:#Q-0Pi]1JC :qw)JƼQ xĹ+&ѥ*Vq]vp6+ E@aICb@l"~;4e挬rADȐ>.Йo23AIRO%'B~A5c.}-Mfn@XH&cH)IU -D$ֲБ^ l˰F_N6ԕj+^2A"aV!Ser> ]2k.R %N~q &&|F9"T(t֎%t?r"NX>#.y'ûŃJUFΥY4W]n2~?s=v d7cƸKS`ԇ'z2aN?^,r jj Z#n<Ϗs^<=lǓ (_q]-i:N2)z9y1$&c)` lSQjGr6!ŰH0DSfRhMa+#eKZvbK#ǧRRY ̶訫$f NO0"I=-f.vД.˝ңga.-?ԉc" &YuSDTD&IԒdHhF>/KD]m^Fv] ʲu)\:l bɁVz VDߩӌ@Ew'YbJqU3¥ܰ؍&ҰhH@/Ơ9YC/ڽnSamЕo  /pKI=EKw ?ZpsKhB2D3/5z= %?&;n5(]}%νu+h)ط# 2 oPNS+svs1n(5`|,f~Oud/A%T舷Dr?F'X[2A  ɨrU#QNA$oz^ 8vD [6NC,FTip AC2cMXЏ ";%_+= Qv{,7'MKAw)t; ԋ G÷í:n2,g!&a_WG SXȐMp[ɗ^ˬU_R!‰5B;-(".ǵq+@hfh;Q|.*Kى1|pÎ)$P wAPa-9ęuyg& T ##_rۡr{ߒz$eVZ\ȅ`u[]F 5ʱq?RWjiA '; fO<~J[S'~>Bj]Aɬ`<*O&'&7yNρEwqc1HUTLG*+: APf~F; D Lޠ c`/F7ͅYʄ)GkxkkCU or%ǃ&YĿq[T]i ]YΟ_򧸷4&3褣 g31E5Ru[Η;v1F=H9MMZ869%(BRؤ1Q- jYGeF\%:ͿSH)Bk=8QXǨ-W]C =KԖgӊ8}J~o61N F?R>?P~?uVoo6 NJ*FSt7:T=M1JEe?S1kq`N6Jy4 3ɜ. = ey'v|<دAzG&4sKe)[8 nlG#~&Pl^&}#:iQE.OQ ˂xYp8S$ Hj}v5+_@^d%-PH~M4UdnkNʨ^U#B~ME660[8'rĝ@R" nᴉePεVg.=F nW>ƥ gyqqw|dc2׊nJu.6ə Lkv28"Di7=Ck+JH m0,gՀјN|`_ l'"!kn0.&V/ļI_Q`a߮ rVq=Ihoq5[ՔrlR`e ur0nHBq ʴВP#pUV~]#ٯȕϪ/( YDt`֢_$)|Ϗ4c-VB;侽k^_ /#P`XcԾegy'Nsw39&I? }.I?p-@e4r岞**'&DJ >wFbm-b 1 )K[Sƿ(+#P7vA3rT5;1_u;!> ekیlM ;c7B,˫kθy.rqw!PJ,#Z'ܻ' `$ȰЗCg#8.+o&zH"E!&ҀEًNX.:kȕ$I }B ?JLl" s-L [T\_9TP7/ v!G*&@ 1R(C_eYdTOc RI&.#[j18 l(OSE 1=qFex3&u1gC²72:Em7>sArzL͋m9|xא@0m>&ZTAܗ!̫'%ba%S39=}ð0 5 ũr? Ģ59aXRDUKP ʻ gȍ7\gw`tτ[-?_ DWWmL.cy:6wb* Գ-rr tʉeu Ck$::͛}M<'';f2 eC~s̓kY'pyr<(ㅠcP-Fw/AR7e艻.ŃyF? y"~E3AjLSd@>3/p/&o6&G XP"V+s$Hfo67'J6%~T|אdO_fx㓔[Ae韎aWR%dqc9cO1|d:QXׇ.$mQ-W<~RЙOɿ5'Ѻj4%Xj^08]]o˶Xi{ , 1N1b _kٝd}|/"Pbbѝ38216'` 2<2&zJܛT.RcR@XU`Tܲޢˤnh_9O-HWkr-q@Fْ`LK6e0Dh !TSPGTu-S::񕽒W5{r* GL,42Y]0`+0U!d/u q=n `h tN-I0i.>@BAj/ǭ+j/LeWB] A =ʆ0uѕ*Hr1r PriЃW]H]]$B+#2LTQ;%*- 8D ]j)X6HWbN9v&Όe5G@d@l)1`q{6RrTyz_[#NVZBLyT(;&(K{kԁ! 暂ף,[4te)仍 S V^E'pWg[2 zOUV2I>s+hg&ަw[b0\2ѿ"!vee:"'b.z˒Ž|UF[D;V-XnF6;n$ƹw,\YԢ7!W@iƠ̾~mw9 u3ȶ}P*pC8qfQ*Bd{H8^>.@+1BP|2NO)zIy/h7uxܹn&r|C.ŋȒvLWq泰ǫ0gV?#ncVX{?,lQ憌 c9"+us< ULANYοg9 .I[qbeH&;W n}@쬴ȥ:Eb1O+ Hb*N[5)DWqRVGs<'s#u@CbRg56Hf R:"=^1v%'#ƀ'hFu:ޡD4ܲOFUvԘ+1-@Y:2,~MJKn ,N&k܆*S XlIrD򀃥Lъ ,BHe XseʴY1!4d eaL1 %ڪ"<2!PiXj/Sfa&^l$XJkm@rM,Xm }˫ˡ NKPWfF&z,!#3dGًORf2ܔ.=q2*ԔQi_FOl1$N3%rw2uZw[-!Y_DZG-2t=61DE ~ 'ٓB^MfFszޮ5"ܸiV#*^dg~įel4ac<a6Cj:Y i!B(kuE[{F|b480qĭ*Xbaèp U>7M)aZMi*I ZoFQ\$᳨+dt(_5bm>4 Uj\=̊p96aQ9ټ\y ԃ Ԇ!gאNv"Ԋa @G|9!\>2LSxb;Ԙ(?7kXa O9lN6>aٌ"uOgKbT SVc)`=ėd=@iP?cV:d*pr4=*䮍~7V]D3)wpxg||gbʪ!#Jՙ] e'ٗqٌn[<-0>4h4tZgdUpӜ :Bqįdz/ȃ2w]q^qLM|>ٓ"y!\iDӅXWdYM\:>5@|3fy2Lm~GsVÝw>l3wR*SUXaa--^ (Ƈ6.C7KevIWG)jF8-VFz[ӞhTfG"+Qe1z?pD DkgBl0q#c(j-* )eCdɍBd,]^ʺ3_n a'|M~4֢=ye^ LFwxx ΣcTah}= ڤv_n[UYjJIf;\R#О/T+ZXI"45(]/p~ˠK-2g܁]Q(RqsQ@~~% tb?d .622rB9]pb`aك$ f3.BIj\?q5'|aޠhؑŧJWN-~+<;\VPJu(u\Rxq۩nDPoN"uCQr52M^9, jh>9_Zh|:Q%Cy<Ƒ3jrnzςg~~.k15﹠ Spٞ#dP /1ĚT] t|;Qu"eSe* ir]zQSb\Z :q(u!S0_K啍J>n-) OenZR91lL倨 Τ h8$E̦Mb!Ua .: C:;CL8i(8ch gq(bu- Π L9V{c6b3GR;:aYUݖ7T:47k|s #;4kJl(k w[e+g[̷7gWǂƩ&a(h P!pFy@#]4ţ$WS;(؃M}^5a8X'䏏^΍"cc2dğS_5Mϭ3}O6R>Qn*VLsWDL)R͗~r̜ŶMdm>(%*U)c<=-)lTk=12K\w *L$rMvb]L ̶Eki'Pp\j7Z7C S7tgqЪ׋$˱˻}U9 U*V:Қ AL@3>kJ4s7brʇBcd'nU:\qڳisԕ>a@"4wBvL'q"ں2ХIV-TI`z]&ULeb?Wmn2>!h޾]Y-SO&n2N>sZliƿ@yaѝc$U'P8 !^v8ƒ'" 4-[tҦ4ZثJ]->ve)TΏk HoqUz,jӱŕeR]pbң W$^0Wb> bWQ%Mn"[:av >/to!f>Vʖ<ܜg(l1z= W)_^VxEr)Cyt&.zJZ fɧga$r.RX\η) W;>b O7  qM Afͳɬ+0Z9]{[K[˸m#I ܟNݲ Q>?!?Qq|rGi%eLD ©n6636._M wП*Jj18Y?h{KF%oY2 Y( 2 _6x8zv`FkԞ3hHd)7D"SΧQB۞^oӲJ̬X([gFw"#X}M*ϒRu>}}m_-yĔ̹<乥Cds>kxrx%sdqayv}4<7 2nhlakkqܻb7=~;7+.8quc9&jlo*mEp~;~' $Z)EQo%-S09v#Y_=H0 D[f+!\o,`Z9(fkzaDu=(@@YP'4b[?$L)p,fJaŵ4fψCL[l5TkF rjVlE@ǿWM0`a wɳITN +ZI͓J6xL%ׇ~>PˀPL~aͽ1ST<u'S)n(M"EմPvzmç⣗c.1rfQ'ʧz|3*w*Dcو\]к* N,K6RDR6xY啐ez"D}IZI[0`먩_H d[)̰0pǹ֦M2KiL2:EXEwBa]][(ױI^[Xx(Pκ/p\ 5U@tgDJY%Y?Rtdw @C5r+*?f&φSgf0s&wXNf$6^f6IZt9 T~@`DNdWjshQ޷.>D3<30*WS9EBz H37.*" JI(jd!}BM~dl20-yxw\2k_72I%N?Q=HVVX߸$_V##3IZ,Y*gиLK ^ꎔoQJA65PDn/%vy?^+sLeo'4TELǣ#;>`!0I4\/4n$7$VH%^5$rp~ӎv ? N2m*9RǬm:ohơ: _jxkqTc8#ou6mekB^9q+W9fucjT/4/pEi,{mSVΖ=PgA+vzp+J;@|kb;K65yJrC8Rg&˰8FWX6íw =M& ]#jބ;|@}+Be_E $3HÔ5LJҞLAK+kf}u29S1ڨAd\[_ qJ.1K%7GV8ӊq ~s?\w:1#YU3 0>6j+Xwc YvRXʆvoP QU}N1TGod|3fbOSVПJp]3(1@YU 46Y%Q^n= C?Զ[c2?oȿoS{O5ؒP=A QԀVYA'[G-e243<#TqGGsHxsRO94-ʼn!:1 1O}|[G:"B8/r7~:>U M@L ȇ۳܈`c|*-u(B * 7I]B+ JQ%-* )3cQ";s=AnnJ*:ޡ6"esQHep"FHV3D%hTJsifʢ&-aF;2!V/sCٳv!WA?@U-qlΑ*׹q(EQ;Ծ;i1za,CJhjV#LjH ȷ^A1b"5 v.gRFhI0{G3PDj}HTADaՆ0;p{Qtc@"=CpQK4}a $ʙqvܟTṱ#oYp/xMDX:j V"OvƔO5[J_#Vz񼀮-єkⴁPHgup^IѱczVL:SyQ?喭YLS(^rF񦤌јj-l+X3/?9z3_z|]v#LL:*"D;)೗/vqAͿĝ0b.e|)br6PR;Qʯ>]<,Gf>G[qڳ>Le6Moixd- Q~[~ VaPN}þVѻtFM+s7=_70Y:q[ףK`XkAzϪ#8&`MuCrs+ӈyvB#PNs0Ӎb\h˖YWf+mԾEW0|Mфasy3;r-}͟ŊNq !4X N1Eu̶2xn҉n.mS1q!=>o溫ZdOng]bUj~^U=Oage#_5_ kgr_%[T`Bl`'Fׯn%t=cWB~c~2ڇўMb xTq22k46 lZB{YLH_B1y// ~V=DW& zdjS|#d' qwrxmTe䁌8⾄_e&:23ܸ(a'~R Q&7aԕC`*Hu~K񊖥 {P1Y޴e w7s$Y3_cqU}cdnJџ=ϲ@Ќ&%5cӍ޶z#aIkG<ĭ!{52 a}] 6#Etoy`byJ#vHR'Y»FXQi?^$A9->cԐ?Œ}{JI)Xv1-*|}BhZE:Yxw'7dK?zc\ܝ06\QP!̰S%phe2X`}Ft!)ZQ@BmQ-A Lַ!)vr3877)y|Aщvg#>W+Gy#'"z r)F(Jr+*6 &q,Kk)/;Sr)ctnVPG7ގ籼is 1 j- SFK n2 ){|CUe`Fk WU"4-m 2FItL.< w&T!蹭b߱ʳ+2-w#r4bٻPcLCc3'Q FT̮S/DB_K_e z0x׳CF{'J["Pp~*\)t'gṙ>>+n~GqђYPN#I@{3]p=5`6L ˧0y7ⲆKqF^L\6Ӧ}&IygAnr{Z9;aPWV#1.7ơk滓|Vu-|p.\n;f^юΐ$uS?m.:*[:u+3k+-K+.=Q6dw%NN@4`5mUPGBFTId?"*a99i6 v䦏sVl٧QlUc!5WucB|<-l@f_ EOqxU> c$t6':Yρ~ QWq//k iL~KKԉo)*U2/f<<_k>ayJU؝'HXEFbZ_:l DɓٿnEE`Hqq"1KZyj-=Pt!^*3쌶Mo'd)C5Lq<́EkX0ƅ)Qя1W}JߴEV|&vL/>Cf ̪iԏg{JT/c]FPJ$]K!Ɨ]ѭwО-F#&*<|5.}jz$? MGX2̼*CJ']>Wƚ b, w>Rۊ"u0oe>(m%;c( *BUJdu:F%7_8ǸVNYkqUԩ^匂{s!vHA:* B\OMUEE2a4 T1(S@gQMXlo_q 2QcTu9o=AaF|˳#L" hQw,QE'qJ@APZ۩bI&WB(2"#ZI\K7ʴ?,}qc LzfϧˊM"Ŗ|%3*J΢ZBxVg8YWXJb,V#s;8E/BcROV0u`Br5AuBG'L[OBӶ2NRRS P{dpGQ4ewctW]i,"^2mT`JJ9bF8&+Kƕ+.7SR=Oc,jZ)$ |1X@3lFtuN'2tM[->߉Afa| h UTlmƮU -;E~[Yc;qAM I#-9Vd]8,A](tb$ }3hp@G;9@qw98?zUW}%o`)K]cj@[G9CcG[LbdR%ner3 ge -߰ږ~X!"\gQ=e< Qܳґ&2Se\gKy'rI؝4ۉĤrtD{Hfk-5s5$flH7&8@wxhkʗg;.Jv )ƙbǿdnk!qPuޜjoBW.yfm]UQn*y-cܑL LK ^rámx[zw~]2b4=tFK:B#W*KVMI2G2Ы#{ۼPog}~7q:e"1e.O&ޞh.:qqG)nNt9;:є#QF3#~+e"gU4_Et^Q^:xF+wu?Ꙛ] ȱl}}Mx2MlG XAQ(8zރz~~f3lvc˧Ua?PU>z?9 q.+!hgfڜmboS5㊊QL:d r;<`iN7伐&Rrm_QU|ClRqRj @Ƴ'ʹYQce'T+CufdrK8f>Kf7 DUS[Mu|gFђjSdz<s霾۵#uk3LRrM!b)oVJc bSvh,w+y9K ?<=͏)a8y'$ja}Ɵ} +n6~ư컛\1F'C>9)њx6|=.{_;Zes !3h崢Uv7Xw5"w-w(P; ]\?+mN+C7qǿyn > B>C"ѶjBG0}u3|fiw5=ĴГ@fw.2Xv5˯Gb FC(ܴcR4E 7R#p1N`;JՊ>J/ شiↅ\Ⱦ7C㉳ D _@bAeNܱ, rᎍ/} R0p]v;-l5C;f(Mw_=?vcT?PK_R|9/FL18W™ZVބ6F:E$bj.§&/Ө|X2G a-x$u5|_ ֕Axg+ JC2{ieb`GS8Ϟ]I;G!W淑RשќJGE|wRϞ"͈Y#8I\֬/]a2mٝ z;*]9 `odr. ؐjFc)mMYjvtR$؝A4y4QA:ѝ('RyĭhC]lF4V[#deKс~1s.u³:0BT]3 <%Bx^Ut[@PBjRi|f}j0ä)DGy.,(ɓ rH:E;$ܧ (&a45ZAr9 [;f|%=}ch{82.+N35lX>22XFe ]v?1X$Bm$/u39>V_}P:(l/ +(ט#5Zl26qXXL !`b7ู5рgT1`Id/3 >ŎvL+_'Z$<qV1OFx ȃqR;3.C@Cqr3P &_"5ۆN !Q&gDo̧#̳ ~2f,kjnc 4pc\in] `퉐sن1NͿ/ׄ>ug3yG{2\7g!cstbKyʍ8h:~;N3&㩛 i~ 8s|1XeE8hS)FVq5*bsȤϚخF'ĩSY(;ŒȌdL[۴g1k.}l' 1_w-JS(ey1n*LChM1vdZ, 9kcc\N4vD0p@f3J|2smo] 3\odK$nbIMxܠC"{7%fG'26nG b+6yoIPb*8G߸W:;oz렷[%p$OS~1'2~Bt3uWm@qo9Q͍&|*bk=kY@byn7 u S~%{V_;,2셪Kc!2h&e^'nCcŘ+ sQ|lAjRQn[\W˖_/'K=P l/a3S>^8?RBJrrcqsT*Y,KYݩY/6{z]kj[me7E$lˎp[r2/ yDTK?wyNȝ5fXbaxV;Q\d-[BeIȺ;XD *i mT1Jq-#Lhs3/)=U riѢ/.QR0"}0ȉ®AѺ&9㹻`CBmbVֶXY\aeާ.#-¶q/~@!C(ٙM>Pt/oLvf[d!KYYtɻQW (ԿFV&4㌪e1m4 > ǚ =]!6F"#=G٘$2:j:ѫV-`~ɫ^9իRȚ G]offIU `Y8䍈=Y->N #ɉĭsŤhzqelp|uXw!C`6ڎrqYkT/H ]G`Bi 4Y%(Ҧg q MN zւH3.G+vEKE&TNKX"0PǼEGbN[^~O!fΡuTw)KU(f?SWНF-ܧ+z;Oj755l=߰rΡUQ'oOɅ t (>;e>L"8dDGи @ˀfo"s-ȔnVPE=!]rct˛#E ( sJ#*=WaN+Ckq'2;\6b{4ǥuEJu ( |pq Of?xe/Bj?zL,}؊H18a˓#WvIԨB zfX=Oo9.#nsSiFm0fyksAgak /||r9hJ>F NUzL*c/ FG$y@ `ߒax:W_NG~3hce޲ L_Ԃe SǼˤzyfa3O׵b f,g(D~Fic4uG ./`W[ fk ˺PF ~~SX)Im"yESc4܄b=x섰NqqϚp䎌\"W#$ATk@ScYJQ`LM+3~!}#F߽nhNM`&MEɎiЛPSl;rԲSLyQ ߇ Nk8)0Sܬq"j+W@aX`Tt$O9W*b-?3m%Ռii=DXs+o!&lZL(܏Nj)`y4>1P[(@L~N?5 1(M(,}FɆc3K*r8)\rnqXd} bOp5R0A,sB;$tc7(9MuZCm9LbH\Kn&V \fRлf3BاS#Wt[X'RfCZњ2QYɨAs帖kM"jt>G+ѷkv9NtVӶ1,ԷaLڶj*VqRψ M)+eVR7) {+<-ʐZVOb9YY#F`S9US^Nqz=4aϒu[?S.wcXcه}IՉH+c ůl7q:N h~-RT*oP*'!SeaԚ)JtI:ۑт <>e% eu.naO,jC#']j#Mx9rAFpۓ_duu gJQXlP԰Yh2 㖊IK"ڎ/fCѓV-#hU0Vzqud۽d)w!oB3`Ub==1c>s_c0_nzw7qHUܧ:>2>KaYHْ^_.o2Wx,;D?8Η 1P4Z+]~gmOcTh_w4y<= [іՖ;Eg8i?WX7YXV3nA }7SXn-L!{W}\~3РLAA݆}hI`[炩*+;RlN1hF}tbo4>3+Yy/c)1Exa[v|| 1<%Gv}{L`ݚ3GPfw)уBgmbbhx,?f2I#t?R@#s rz?r|{|_61Kdoq֮m 7pNc[BK} O;˅=ʎ}Hq참wd3d^OǜV xf=2ne5RpZ~:w~7Ŝ̥,:’>m PC/0gҿhڍjQZB^dN16?cQ=M.Fu4);!%:a.y T~SIdưzZ9*N>cfX\ҳE#N˳].-M.:@N/OpOZ|%Lr5/ӆ2gCw:y0 ,; L o-Xv* Mn@)X^MB;N\S&#D`Ot Eho1"YƖup0vP|fYhnǭChMexm{] i[3q5DJ-4+mtZCg)̜|V g7q`bZ,7(.An JfW^Mn>@w2V=o}/qIϞIj_5řx'r FHϖ /m~&RV2ˠ=@YJsJ>"LE 3#Z&) 2l%séO,ВE~GMcJU#&7bM@afp+~H$(rP42].дiɦ̡(ybLZ2n]wtq+-^n%J$+7JxpoLaVkq:^.K==Rvzhs3))v;0[m̜0{rdWV 4ʝP^Gpl003HsosSvp2/& ўB,O<**g8jb䬺>W2h}Ž?Ѳ;{`V p6SRJ2Vt70?.mwhLR J"l@~Y9=Ey-1*y+[Թ*Sي\w\)ݿaCNMZr<z )3I%b2C4,h bv fWZ6[nߣ=J~V58ZIW[([nK'xiCԃ)&T kG,%o'ߩ&7[Qb^T328FZ &VY=/c--Q=\$v'*7tv%8ڛ1M)"9"7 J&눩k]F(ipwaBllӻ:'#IFU}U^>*'`ٷA%Fٓu-[zMgd2M3#e}DRdm~:2,M 98IЩI3[( h/s04EfH1 N]e!B ->^|#H 4pX1q'fUs_ s)r[̸9:5Pٛsc#-KfEhωܬLz u>sry]ͯBgŊq'9,~ u75pVu1_'/saU{pىOÜc ^ u (bUI/&uĭZ^Ϧra W~VY*|/^ rr"*l=@bbdfgFKk3;;ħH7[O&JTA4Zҁq>N0V|MEvfIQfW%nMl˴ՎI:x满*Wc/ᜦIXu#U7'g帏K1w^,ОU(ð D;Gko/ЙS5TS_0 r} q/"7,ZSz̊M:F37 7(C6<H)|_ (ʹ]]7 $ (O!Q<.W 9͛f@ĘqSdǿsӖ -=׎9P'R=Bhj`7eUG ԇ8.^rP ew8YcnI.}yC4<̷!6Gܘ٪Yp_!xn5R!|鏔0kSHrXJ,eŎkEfzS;I]Ye\ L0hX3u&DLnY[qb%Q;1N3xsF$1s2T̒`, /wu@{ḆPC>]Zۡ [쫾#5fVA=h\&c~c̥Y p m26g/f"r'XG%IqrX6-f+o/RT\zx$\~zr}(R_׌kSo`E|v4,H ic16جʣ@I_F8D*çl74xu'z+|qbØ* l5b٠.]}+_﨏>{1l_cU|N.D!b90 SMiHe2ξɜ3؊J,Ŷ[&uw¯D(Ǧ-$ ؅dp姑[q]Bi|DǺn\b~3SJWX-dk3&FmD9J01\ 6 ?[e"-98/.(S;~9Z5OY"|{wb'B_G:-aw1pMw/(= B58ԥ#&WRަ:)#+ڜVqnMyUԄ̞H Sn{>&P52H~es7|t؁\:|3Κgɯ4or- /4_{h˟ɉSL謍~8)Q*WFLKn*}G\bPɲPTqfFqWB+gK] |]D194"b. ps=.tN\~+,O7#Jm)"40oKAц#mpѓSҺ.NhIfGraʰL2:ُ%w!bFI_kqze5$3/[&qIS :>?~.Qɓ= ɮnR7*GPM)De[FЍ. u ~MFH+t"'si@^XF 1_zuԊa*pznڎPh8VO)GrGxE䛀êi!z^7*mXw* ţ +l?_a5ѫO47/RXx%X,c_5zzYc1^ =FuL0dBґjTY*vfl;{ޤ@ATG KdF}I);@lR=H"Fb@cܷ'^gR9ɦ^MEOyBCRmr3Cg^):C: JG(ħAyw'&\=/Jл 2U"@ ԰(?s"@lk+~HQ 9:nQ @}I`Bt fQfw)`YTJ%A[v[k}sn4C.LڳHux@,_ Y-q dt%.2?A\u8uj|$NoFk4D56vYaLd bxd?Odw8KX3x)l{ KIxԸƕV,A͔҄SUS[}6:;ȵkC.W\:xi0Az+QF܊B11wfTi?Q7q7 wה5"I9s2͋يŃNۼ-kJ 0dր7=k}Pe<PK@00έY"D-P E#K+[%Kѥ\Q tLe=}KQRJ\3Nn=4<J^m6 SCLͶƔWq@O+GcK+pv aЪke+ZFG +#B):.͵݊${b.逛qIG-f)n.Vi?z+LOA`TaÅB[?C8bw~"|dYSGF>+Nѡ^{iֆ?>6HUoSgMJX?mc .RehQ!pC]\Vܝ|tfԏ1pas3FldC (=BR[Ku'=X߸kQ%DcZ`{WnJ6n+Z1"{2TOIw H9;]V!ԯ AfGlJ :ߌ%b,ίgp'#GJ.P7SipsO>h #q\QK/RB84؃DHc)˵3fAE^W,rR8Ŵ֦h`y y3N)n(gr ` Ig㪣~ͥl0vza89Ug \4+3sF*=_* ּ́!@YQ3 Z](2<2[o btr88P)#ŮcD~_w71~'YhsAj2߇ٛ+|F^ZS7(Ag3҆skvsM 勒ñW_:q hGI{F̝xqE0&h0xu4`@y*ǩN,jԇFbEv͆=e5)_DKSU}2ҁhx  =WΣ7Ga;dz.+ʤT eWEz>cEOr!r3/IB bJ̆=N#O. ;fyc+-I.#ٻgXHsД6E~;~#s/Ҧ:yKvLO*L<9|v1vM {1V8܊rj_z4?Ӣvb:p MR{l]F*$:RQ["ܜ^Ka(4O"BB:ԅK ڭI]HsՍ}5U1(/fkA߇貐 G nҝF3<~/l+`Z>X7wF>zA]Z/|n(zez3=!~by2k̒id q[ xF4ܤ?Bf<5^Zl OQc"}VR%ɣ0؂\0.rNE{*ʷ j̬}R'F\["\lǘyACp(Tp8:clھT$LEF;jꦠNғ>5 8L>e!JoO)ZOʴu F\YV;>uy2\>%s<u As3KSl|?+H> \& 4NS^:^IE1J6dY>)yo\3s2쎢z@;qF*YⱠ!1F^S+!k1>[KȓEf (8)l-1lwFnS[UzYAѦ3RV]R(eWMlFXtcDtr4e]Q'b.Ǩ s8.[fw'KPIzHq u j[5cCX:/ާnbmkQEe~,q'lolC'a` PQБ3ԃvT[pto'D^~cbL.-zV?0kcqpQȵ]S0)<64`*4Gn+M4FW]ve!AܙB(ubF-w3Tr YTg_4FizbȹaUm+ɸ-H,^C㍜"rΌZ E/jlǥ 9㓈/X(btcz@47`qQ0eΣu0ItMJ, 4.Q(ʤDjb^CoE.|z/B}(ñ,TGS^Tbn1﷿Qآke>g+&KzS>qN(v俑|ܖVf$gቪA#3Sᆧ_SA ]6cUxfkss+NOe;5Ϝב ~߆s2q!mSb 7 lM,A9UtTw_ub4yt"5biؘrGqZj L %J{ɰXE=ʃwau'Df曔;>O#!/A^#PFIJY}%oAg,*>惙tʓrMsL\_@wu*pIք;:W_ܯe{<,nIfM>bQŻnjLqX޷#z3j ^}ª"jSD$n.Y?V]3:d.1 [7D*Wΐ%l↑ zn2#nqN()@% PYs|?bFm| @W[ζV,ed7ўvܝq3TgHqÃ#G>]kynY:l}n4G8ؾuoqRy{uרn9bN 3省j." X{2|!QݩY; ez:VO :^J%vRƽE9)e/܏S{ԗ]`8!]p;SAOW"p2&ʼpЊlL7"Wv=Jq / $SCpi=NшTc2y$v:Ƞ u1XȋJaбŕ/4MLpXrQ?^n{ֆߩJXRӑ9;cfy^%Do2Wra*3SYl2Y1̽︝,N\@qt6.ۥ&ܫ*CP#+X)f5kWOd0l3qӠC31eGJ~7QjIJN;2[5Ic16BȚ揉H˳7VGq]^F& 0~T wqFtLȎ(jY}X hYYZH@*t a$SE{wb$\):AЂ>+ш}¦ 2ڱ/`Ҡ݉s+5aoJL?+ۈ61jjN.ؿؑ"sza א5-I3V,H0iE .*,>Sʬ~/XJ0_5HкؙTI]Q/ Nc0k2jqEKw ,1UFXԹl6eU'+z*;:)h lɳJf3#+g~ffXi_'=`PG?sn߉/:8s 2.<ǓJϯqZĘS=?6Rަ.ND7w1d-lD)4y)2I &1̗f c56> (ٚ|wF-}Y):#v7/Y&[2XD\vq|]:0t p3X<4v GCkp?о̭S]|$?~obVP~x9>G#ȖO~=Wǂ2WOńBoSw+;Z3m\j:ka $Ųʉu3F#-V3Gp`ai'G jhm&hrF\VXSgH w&smS:Qtm*X& PLO.\:0П!_CyWĝ/._{XIYc(=Ϊq6m۽8*kp&e C;9fj[i?pg%QA'nSXN̫ ܖa'} eIٔwzwم-]I^LUTw ,Q'PKڐrgV{qz0~|Dl2m>lO q6ѳ5?(@ݖx>`kI;1 j Zdz46#;DZ82'zޠwqb5yRv*dc2Nj'QƯ֕(W\Jʩdrs4SlU".>|C1d'ݎ':yhXrQg#qf 5Ve~z2wm#5=oe bJr&9ïpKC"Si*Jy8Y)dzYa--ciH.gCRv7jB\-ؘi0}e,7/ieockCX0UJ5l̮bHɐd=ܟMqzUcIJ[x;Ԩ9ANƐ~rF>kom}˦iFXX^SmܝvTw}/mqb|2XeJ'}IY#|@јJkS"8W#>Mqe ~мg o٢PFPmOK:3/2JlroƗ_F?n#%G7A?Ԓ~!G"Ag שQf] ?u7/.GW! UOf7/r9l5Kw#Vɓ>wKoO*FJήL PhǓCcr?}Ϸ;j+[t=ܵ&HGY/##as\AjK)]S2q㟕՗Ja~쏋:6JXdzYixLXD1Wu2~1׿}Eߎr׊$u:"eb礽G`ic(\\͠0;:MMiu%?ē>%ƛ]_Q&V+T@N$t$M Jjuc[Lυo: $rAzg&A.Zf L[A)dgXcy/lPgj8ry7C?yO*Cݜ_qW=si}IbN-QL3z|X{-O\@(GO0(;Lգ52s B$HqucgWp3_b;Cl'jgF)8ԍ gy~YB; Aw2;fH9W}(ܾ[Pow;.?%/:bTl2[zX:=tN9UR#h1ḱ]B-]J|Bup#9ӂQ\a-'!eX߸eTzW ݇ȂՎLw1CdE m -"+bOG:iYil;} Bx4=sC AEt>MEc#Cf1#4*CL 1_YЗ.ʓBpwsW#Qڅ *sZvΔF1!?ܮ=FRn6š(µƶLsh:_MJrۍg`ڌVqѝ8 DZ+{$W"+)gi8{%8J|TqJx@ (S\";Hf&H۫>N VL ΊP{_=U QgZKF)8Vn1v\l]*N.ÜT3|es|wK8Z6|bKPIlYN3% \Cx>E]@3H xv&7Bhqj <6p,u>ɢNWhUOreV3;p$m*NEUbvmu"S`߰L:=R^Wm~4H.ffa (VU}A5~Ni5cFծqx< ]ͨdʒ:˓o\1 ưp86G@ee92q 2b3jϵ/kd6>ql ,gf:U>.H7Wawjo?t,:c}N?p,gp7jbďOr69?qɲ#mNw& YٔV*_qg"ûx.)o1|]jYPOL6Ft[M-N?XG^3-^|U|7!_~i?l얋џUƣ- l!"!ӭ:+nNdrKMgRb]ebJZ8xJ.8JсPf7 ]"ϦVY]Pd7dʺ|hG1Ⱥ/*=ϟض)^(k`鳲v<+'/O3ml.^zpք 2c[H6ο%G22syvV/>#ΚkK?%awu[BJ |U"!n\:a2kur-IoWJSBl;^i3f"raB~K03gNBx9ˎ?rvfTs|hF_snW]xjʟ*ORz-َ(MT\cplXBȅjS7\tT)Uf~B1}`S}?" B',Ueq|}l]PC!7!ZeQ+#'(iyTK2`O0!`ɝOԛ`5⦔yFe~RNم @PaIl‘w D-;PZPi=JI2Ki4(5) S-0۰zˎV;nfZzQ^?J2V+6@Q[W׎zrA Т2+A>Yc%䞖Ҟ8AJC;X'bƛ mŮJ7␤s(IWj7A}\;3Q2o*Yt߳$᫫<ɎkFf?[:pԲj՜4L1ؼ]cL~P6phrșvn#Ho ca:1ĥg}*{0V!͛&r2BIјw[b}ЍL_nĐ膚3,4A][“ tT&v&d? 26 Zmv&Y_ >E4 3vL:cb.OZHrhA_RF33Tr-Ja"A2j^ g-Bu$Z52Fi2F F`XXyƷB VoOKٿRs_K[}qS$*&1@3L0dAa+i/~~~bA[ )?jR R{ dH^VMD$am\y&@K"et3;GE *NrԺSHChaz،k Ϝ[1]錻!ߕy@ה̱s?fK%#gשKI\[dY';y?37foFU+HAT=r.rQ rRzc:0s>N>d2p\lG۸͕vz=F~Om:eqZ0^`m kdYrNѕx=2u~i[a_L$ X6X8&eq&!GS y^4҇fr2g3TTH!м?@M@,+j.#ߔd1yk>'pm2wɻ@V9#P\&oS䦭1\K5AzGg)A:?T4\NfL2#ʌ#L!鲧SP!3?.]RΌ}3ԩ? ޘO`%'oٯ1d7g~\Wzowa#bywVbj&93m{7}ͱǧ.O"/'gCqVd < |` Q,jܫDzE`Nuk KNw+Q2CbJ]oZi*`n 61Kz"(Kjf2FZ Ua;Աnʴhi@`'pLe .i+&HE,}H1-5\xʝcÏ#}4crÑI.7*/| t1 Q Bq_k\kl=ñר-K>5lH-t7CcTqLzfKSO`@B25"ŀ߇HlvаSЇs'RAa(L- uNNEҡY@4o!,Q GGzxBybw@i3YNkdW1)& +Ƹ "4C qv# ɶ4756W]:{ErOx6! HkCoǝ57<]ȳ|!&gDgMtf߸<.PTZ1dX?Ar'?ʧ&ԗUQ$RԒ9IZG9~f3외,}D9NIP&3tf @,Od34Ш/"'t[QD@Mqcّ Դ6*`~-"J}BYaI7R]u>+&1ψWWMzX1?f_eb1&!S&Lg,Lrj@;ZD/\}R zN?*El*ee&k]@rgB EX3 wC4haV!Umq)]%٘P3}vg'Qrd .;BaE-',Ҽ-{߅WB%bae0yKAjV] bۖWٗeh<>vZ#9u.| MPh/'o #F=WQ5 ~xJo~܈;٩#`cQ 0ɗ`K^俖d{~'ba5VIDRU% s+؝ŴRfί04"߹r1q NK_Yeg`,ck,?>ewd@}L8~|X?,(o ܩ`}K?m#_w喱YF*Vw=&Bwg =c~, 'K,zIa<:ٷ8 ;I5)bbDN|ғgKLrYԫbes$rRdj’IYZIiܱhcR ?UTc (icwRkuIl*QЁl”D3s[eB79|P_S#WQډj*0kQEQ3{ÊXKffMgx*5Hю@Pe7]|r5ܥN20)8U|rNSњq+ԱAAH FR$Zq2lX.Rራ8Zu  ""'IGZk 7%$xZ:O7[*^ 11Fх߂\ă-2ŵ!s2ߌ[ѕeg/:V]{#KDbVQZ(7:4Zlm{6+(m`s&/"NJ/ٗx_p52@Ja}nu\%㱃8i12%/d 8.k FƢ{?CWܔVXbg<+2j^ɹϓR?O|Le^re3js.Pee`qI,Vw&I hO Xj>}xЪ'GL"@&Еxn)WVq P73P=lXq:ԭϱ.(?RA>Eq u$-H:-ьNjIYjGrP$Ϩ621H@o-Bm ؤvSYVLf05&+mظлp /r|rO$jz$zŷ.Hb&˩_ %'B =JΌaHV*z,BT_"?ljjid7="lvGM8rOq5|2ِqq7mT !c,n0ތQJ9B|os2oԊ6.&re=[AqОc@wӔrMY <Ӂ`?S5_' ?q?pQJWXI#97"XqHdR1TrԐ"_pƂS(?.TgF5c_5$Zqִ8wof0N6KLE|"hOzmM-b} 6P"b,o{5j$;lݙefs]CI"lV{@_sz$Z]\E9>GKmxrD"?@^7zܶwƅF،=7+ ՝ֿi[؁يWyLR$Rh~N&"Q @ſs}zc 5Viqx'%j&ZrH4A9>b0~~2VaVs_`d{hܨ߸ wܘ'A#ppckki]#ܬXӆ$4:AiXDeU=w nBĞ8413'^| N1ƍN~?ߩ{x+9KS#[g +~R a &B?Sԭ N-={2|K@ 2! K932e+COy?:(fO' :(l{d?|Ba*FH!A u<*f'`HS]}I jN#.=S5 hc#~p,ZqR&O4'+`Đ.#iߙԉԠ6A~ihB'$^Eb=?T_؇ʳŖ &r8,YߐHq NHp~ 7xb,EeF7UƆ^(?S0|S3,/ MżJz_ŋ/7UFktҾ)4! '5"q104V 7M cAH7H9DHDnu== B |ԏ'0;Y'vg(c EVP TSl|J ;p힞aQ0icF==*ihߌ T,JEބ OF RĩwzzYTMj>-njKʽܝz["@2ЁgS8 fE_3߆]0~r%HߪF25hێF֣׊J f9Z AaS<чU' ${ۘ<Ҙ #suK"bEbbj\Vy>Sۮ;#".~)T3y#:H1E|M_5Rr^/#굣f2"j/P=[7P۹Bi\e9VHg?,hvij;[OT ">[}\O}0;rXO /P Ӧ:HHQK{^eD&Xn J9hFjn@%a3vַpU4K"i=nb]]ne<ejs#N}J;żdZJhaE o;sRE5o(LGZT :&~K:@8=Mu` (x%YvvXw'=v#&A%-Ͼ LL NB+FEV +y^7>uoP9>YE WF=UFbwcQ!Εd'}"-X9Jɾ3if1`d0=||2)W')E#X nؚ.nz.I»4dnxr[ߝ XI{k:z,GF=|;qژջyГG#Ćund }~>e{&}CW%:]>P5h۪1$ #YT(uhN|e]VOF=o@6/%-]FVhxHpI:ijXAYhSYόdTBFпmjԊE=k5_eKU:O. F E IWc[GaEH(~w+62fVIACCV DZaisG4SW6yΥ񖓑Ce^bW|Ab8?]v#*@DejwGRd Y9|Vpc 5>h+BnHwՌSE5ռA'V{hIԭ`r xcVTdjyߴk7Ye R4K1R+Jވ795-{dRɐVd_S!EK  I>XQ.ݨվ1boE~d%^hM  i'Pй= W(rc"+uobו:orJe۟*joV)S:6 (I BtMЮlzq̑PЊ =BIhOGj裩(D?:)NҬrj7-C8ч^qx YkT86Iy f(U5naHѹsݘ^>Ihk7 (sE+qr{~:[Ih.[$;zU*eE&z41XF H3p*"Bz>{+x_ đPS"fqg o9Hc(kˇ2Yu:Jy? &  8чTx ǭ8R_dc1:"WfQho}840*1zi,$|ʹ ܻ`L^[o63чZo& '~}Lww i0ǟ7ןp^3\MHDɯ2ޡ$5~uVߓI.\~ I4o2[;s[Ѵp\b'O?'2_2Kc+&71Ey޴muH.ç#:r܎ׂ)^{!<u-wcc ﳣ`m vz]V z+YՍ[Vёz3^'F޹vvC \`H|K`I<z*ciUzi q&Qc`h)=|П?;H$NK51ysj.ti+/jSU4 NlY`rJ չӃ Fh&{ޱ ¥콗je>'@䩿 xտ= "yhL}Zm[X:$Iph:rrD c7/xlV|H7Yw oQP{ٯI ׂuįz(PV옳łTN j&{_1lh$ܷAws7#,V51kXZ)õl{K|/{DqѠI4Zʼkw ă? ݮ4mU|YBI[ !CbO"| {F"~ #wRb *aAKEތqrVZ:Ya:_깚k7jY4]%ى.(['qzـ0<$o5 %d]xiK8Sux/sT!I>~\w%Ʒ{<˴ջTF%45oNL L+)NZnw\ sV G<̙)/Q dJ۸/q3Pŝuo62|tm{ZhtKYV;@嫁>-^J!{~16ѷC?@վھo9^Vuq|@3nC/Adx׹<_BI#c3EGZBVsr`*)'y.Au+['&eKEM0BA7yC8 '*^{*=NV}j j݄/hU_TI$u}Gbw}<JE` T0-QaRåМߟa6 wPPW-y*wA}gM,z,M)p&LE< gŽȫItKrݸ؍#J:̬|Ih.&FtcdH3RUFJZۣpe[)3]g:./b4"ڏ]%^Gv(I&L"ռfݧW6ɓrϊP$0bICG5㴟oFZ Vew|ȭzw&TJd]i?`iިy s85̀Ƕq}}ɴI'yDjt ؗitsP y+r>Δ]=v(7#̻wu.3oŀ'ӞpA`#@GEVo (|Dy `V$)ڢ'p"r㛛~,M^-Mh$[&` Yt^5KF{̣&)P[ 0ao K<q/uoOacY-M}Ǧ#g@*AΡגEA|(˨r\|g[.9C#V;}z =C&U}v7q?C<fi[aPhRuomo58ѷ| 3ߵ@'7W5F2khBT\Hj5▒`/|LQw@bO%qI"{9!TVN5N>=ң5ѷ/v0T8@kOUR&~Q.pCyIhq`DzdXx4Cbgʼn *LVE,6E&ZVp(4,kI'p^9"Շy4 0יh4&ӆ1=) NNX*un3whIFuD]IO'~O1ffnվ|šֳ7fM[^ޥ|QE'|LDG X$P:mV9#VbV !'t]u[ X?qK+e:P#Gh)JvtaRb+ $7zUr&Lz z*/T)>ŢVh~&.-ǖPmjo[s-B\ ꄞ-Ta:NHt]P՟;V `@duR~${M #o~<ȨTlV4$FeЈ3ܛjf+KbiŅ-KiUT=%JތP2R 2ݑ:U/@Ls< 2B*mv$gF(Ě'1վ;;wfL·wFhhPJw ׺䤘'{ 4 8|CB( >J,5iYVfn7Cdtmɍ[ Eh>U CEMGsnP ƊzB;_<`uГR;# 1D [-A)8ѷowfDh+iE*:WQgH [6]mf_`ӈVy,ᄸD*VQgOA2KýU Ƴcfg΁C%ۊрK,RQ~%v>QվD"y1yE96SGUg `-f~5:l;qs \VDΣh/Cve[FiջkC-IvГBGTDVgk7E=AuTh۩=n d:j9rV3YH+~ FF=t46EJCgYN1CQduxT &.wxzӂeXOЀPHFnMF,IQo>gʐj=M"eK@i,6`}"XPmޏ`GuRGW5ȧ?&Y5Rw.M8Nkջ=u+'m1Zj=TGfQD׹,QDLռՇ4nw%2TzBI2n8 2/P$?ٰP2NNܞD"վ,efЉ6b bm\Q + cʩ2Nj p8dhs8Jk7'0PI5(fMOLkws?`k}Otq'VB0d [m:LQ܎=C1kz*(q Us^0g@weڊX*j#=D֑0f>#Y]d PLj c{s_;\yѷ˥ F1q r?a= _ O*վ=ǎYw ,XbצW"671j$L#{h!ߓ د6L軔x' VQ * rzL Qއ쩫|\/]ooMh,PM][-ˑN\ii=bw=҇q1|Sa5a$qC=F?T!yC'ٳQa YN&*5of-Gf@|[#a>E)=8 YϱqH2U˦mC 4Kr|1NLS6qB2QAq u`|Mu"v:[g*,)r)Ap4/N!902?韪Bw9Kw֝ϊ۝}D`+554S4*9 ,/%>dOD$A,w4m ?+{ΰu{}!Q Pypxbdv4чvwt)BgPMM93=rˬZǝiNZ6J+M CVyWÊwG,GY뵍 _uwbިmp?K^P'|l۠ތ;h/So qIl֐'iA[ʯl 4= wwa6SAվf<µY. ոeA;&IG&t #ýXV\E1)Uq'((j/q:-Py9cn"NA.ؙ (6b&o1QꪕF)=[fxEtaؖM >i$_.oПvGLA.{ʚX?`DcF ߆3GW7>;z slӒ^}3ixyffMbY\s$@V b o2Fk@ױJG(|;* jS}f~ǃ\ Ƞ.l?՞W W6`YƒnpDGm4bE,'F߀Q86槶*JǝwMU+{>]ШhKqEhߗO' V5 ZL2͸1}#[7zG`9*=W7N*p/޼$j].V\VE( oNcJ9^iQ"bJػ똩Pc%:$yJUc(xSN<@J/j=SWLppRs^ԥX즟)ՀN(._.PLR1_(0QTWsX*N3î*Si1W}nTmZ;IjY*uo5m^ /}xo< nɚJ,!/:,-A}}eWniƴuH^.˪wM(S Pvd/' N>j=ji!r#PHs*nU@ ]CF( }Mո̀^SpO`V#)aaռlx $Nާ+#YNphI>Vy[۩4]w^‚W*u,UAt5lbCgYD"՝yh ɗ[ɨA7eBS( D!ez6 rKfoF)}GV0"Y 3RjL7G_`7k9 3% EA!H:5J~ɀ]4] s,YռGr([Uv1Nx,nZ"(_ֈ:̟+ERfH9z?5UcGzǬe0.ZZA\ &v悒O:Zw"к+ֺJ~-E [) 3O9XjD` hì P\HRnm5'#bj||Ikw3:.ˉn$ޥOuh@yxz_oJ[uahZZRV$|7>#_dN[,:֞q9}1cnw5os!h-GWߋpċ?f$X~̄ ݋bRJ? dRZP*Mk6<͌[W7b4 ިhR|WH:㸏R}AHkw˴\g| [;/). Z L[|~FW^xn!3_1FbB+ ηxlAnjA;,H 暷 >4afyR3}`,ϥYf ^J$Zz𾿁[K֎>-ԚPdw0|\ρvчPF_V5o?_7(uȓO$[K-SB&Y"QbAqr)ߑnNr[Ѥ|]o`C5n<9T'pU1"G}MDsoNs8]+mJuoyCI vN`})`V=`%%j=P}{M{CV6IK7u`]gE晢&, ס?/kj$bx-m/SA"j暷%xc#o-SY8M}&x5QA2Cxo TVT2a 転`kP/a]J$쟎 )-jP,h`FRt4mAB?7UM7`TwqUoڠ^A o1n@{o'P[È{Ϗ2L_'1K⼜ [\gD p#}8濫BF6j%aManŐi٪{J?#2J)/XzӑZ/䱭߷-7.VP1qQP_cc@U-sxzX}$6y$aƸǙqa:6{g67տ*K&y+V*&86ƈ:D/hx1s-=wd”Yս҇=/F9cucRR+@]`G:m=Q  Bo@8X/9P ߓF čy9&"j%"fk\/58&`Y9a̢@Tn/hT4_@-7%W1krj(tp9ـ yC@UyJV]$>kѷ9˟ !*Rz51HqdΟ]g3  8 վ-fi5;8lI.s*_mq'F AH|-i&?>L[܉o:6kA @<"AR].$*8mG˲'{1aS6Fa0/oU>`a8տ[Q҃S/Kȩ3^f-p4]f&Z]F˻307aVa⪋=C`{Y|+ E)p4"ƭM,vU`N58*Ǘlv1%տW(Br:lP&y:2  V0Od"@$kF a7WjvoU$tPe s!}VÞA (f,z1`$Z_~|hz 83[})2O~2!ͨ|㜲uo˓HՋ͍NojV`ɥNHdE j]3hN輢;DRã9aZNzUϽ[aHOgd);w"ȱѷM./[ϕj'u v`z;w#Y L4 ށ=8bT#Oyahѷr{սssOߓNt}pI:S3ޑ"g2ч_"9:"4 ޜJtHk72$R3d~:8Gf!e|ZK?}LA`|)oHGYB Ps朘5'{TH@#ޅGSj^f +E݀rt9 Ǯ.~y@]jpH 3%ƍ7,L1%q3m'iezט*-\&ޭ/(F=swG IgV*@Ԑ"3q8TԍG9Vtv4w9nh)jlϱ_2q 0y9@5(Pԫ<MzZISÕ3AXZeV<t`ֺ6QeD=DC̠H6c@ ڟ6viF@$>mDf@K4)7s3䉻G֊:as77owsT̋t F@G$ GVj|<8*(!Osy9z\W0i1hIj. uҟpE=`S)o:$!0վY.@ ?iIn=0z7j>bsDuU{`b2OTq"\tfJ af懑'bRHh${, CbOgVSdNwЯ)yU;y!Ri@b)8e=jgO4M=ȃ =\)]BS+m;ʯ?.Z\9|}i!Mk(FYJ+Pb8BYd^9?T:%|6&ZJn4L}ؑBwLH jg{]&dRﳑt]& GRwm$j=H9LS(cN6[LM>UVۘJ{'Wp|3cs!18-{ /c2\'Bb$v2ޮ ثV{HվTwJh{h.ur3 4hq&rBRp_qzC :+OuII(@6`-Zf*EPU LK/cƁ;@g‚)3*]Dape;V4m°1gV5dX5iM'j ܮX^/0A ?q\RGQH\*%B(Uhsb!2XD޳ O۱)kw,ZrVel,u+,F{)I͌ZS6Ee˵YuJ|G["iT lT:CԋVE]Mc)$!)k*To|0z^= 5r+-aXp"WEA,3J)a,y2L9a ,d`맕Ob܊^LȭT@aEz\YfjN=JA5kqMf|hƚ8^eءSҲ KX EE1kxu_YẼXa 7ACFP%B5"툥SJ?'s$dTadmfvZyո"/ZɃX(ArP-jEhJڡhìE Ĺo[O[YMsIeʮwW>@nUP@ڻ8ѷH!jTTU/atRGVVdO74LwhHZx" ,Z4 r"{]Kк]u'sCLg^ @7z}3*jm$:>L7~|d %"9η|+ CdICBRIN|kw'0{ Dv^Wl3+*zATs]K%CyA⇃ZE `:f0jh790bX ~jE̪gK\'ؿ:qT1Bz"0˦@ P2[p6[tm._? Mo '056 ]ϖ[տep.>S!Sqz^T[S[Ah+G7)&!;^˹)x{?7a!c%}eηy*@OR\ή4JYʠ5 \D7΍ݿfNT#,MJbh,aRņ+1x_gvt~ŧiw%ClBA>uO{bO^/23=Z WbNX.*VaΕ cQb e=x5 ֺI4[EmF#DΌzӪcuj piTkվD4o@d4ՂZk`;y]P@aronDvk6דPC7j2)Z|}M$L[d۹>Whò%[#^)[ɦ(B7<#TK ֠[0IO_ظI4+Ah.xfA1E{S,@O_!c"fİH*"}5H0]E"%|_t dX&/zY2 hf2lcwň+|>3_N[&-*f|n>` nŘjFJ$T[3aŴmKS@jayz~ȳ~9o?U5<ս>L@u"S&#?k=u)t*YL>!8 [i]={vEo0d7Hz2=Q6{|(Ϛ|\-[ݻT sN9'y -J729֞?B>ИYW$߷ezpպ9`$?jg n@ 2sʀJГnpL@#9:,RKݹ. }_8К,^'!noyWhOmK%\g&8R#1k:6q%szXɃ4 x50wj2f-QAZ6Ed͗ ոWAJV8 fEcP&U Vi0{7b=lS0=i Eӷ9}ɸg|+6<-Sj:J(u 95#2塣oT$]Bվxq˷Vni~bYBLsZ(MAQH g(%TTz47`|KQ oz.+ߔsM5fV g*{Vt$ԡQ"O⚷4& )Һ6D"AվՈQ{-U$fH|YMs0K 1\k|1ެY@y`|8(L|`ǯ`:U=[݀OnDI9Ė5Dq^(4m9AY ֋vh.(V_SY:10T]`L6gnm`ОdkV&4DdP6b-P4mA6_/VmN}M u`HD┭.y3D{MJ| [Za-&p]qd"[[߽fS&zVp椿6}`2kgFܼFU++{uh%NtR؃'&H!JE$}K) ڷ;}R8'|RPwDҴUzͽ "|ۜC#zDH\G_/o,.PȒ/5\!ĐGwvzhb pZvR꤉r@4ƓNR`K0-:z&`@Eܟ-I:ba 9m$In*Od~aEOqQ&&BrI hk|C]\CA!ڊ dվ*)^kr'w{(BM,֭m3O|;2&S)w\}^41Į*=bh3 fj! $+yϔ~qDr<㉅HEpf NfﶭSԞxO@օL3|О,_BA+AÏ^Jj[)I7+s!6-mj@BP"a@$} q ά8REehF<7+gE梎cԺվnȫc@CBVmnɊ\+:67\M}[ڪ.[/};WgvhrчZ,AOܓnP܌ DT>(Q? =w>^B=L]aRTQ. Ͽ/O]nM+RxYؓw Dsaތ%3F&&=*ǹnyk)IBi$?0'p6H%.d1MA0&Ѓ$y7y7$ŒW_S~yC@4' rDڅm[*:Ǩ(m~.PD6']!F94 RH8AUhkGY\9(MʼvKgG[ͅ րMj vsWȲ,ÈѷtWB2 wM5oQ\mY S'EMx|F_sZlbZ5I'w*yRFen1#FpW֎ax@șͼޕ 8=U.{M>`84E J yZlxRh pV؆*hSn&]BAY5o^pn=;L:UH͵| ?Fݚlj\Lf)AP_7d *F~qR7Y>4m : ~5Op3voB ╣{PTmG"0'%ʠMbQNl*9c@Jjsߓ*Yh+5uHяXȬ#;ƭUX&⇺L+|_`T*ǎ;Y $wzoTԪ$O]CjezB9!0=) }%,\ 5X 8PHŎt Gw(w H(I`?S?7oX$rH9t'#əoȫw.n8iu f []զ%~( B1nAW3. ȆIz&~nǕ>1 lwA^ 'wkLJtCJq# &ZzkԔ.4]ا,ո,KXGi JjhW Hɷ*SnBwg'4 3x2b G,fZ.)avʶ=I,t+y*gSvÉp/! %-$?:չWYxt6Bz P*:@yt=r|hYCrm!Ǯ`JAT&$U$Yf?fꗖ~4mN2uk|޵IJ7VVJs-pZSF4?%0T==^IN91Гn4F=RTVr'z);©⼠m[&.s 䒎fJOItjPn;Zx76 SR L6oS\Z@9$ \I:6yRԍw`U"'Tzny _B]7䨤.E4ny4 Uhۇr@( P 7{DpM`Թ*D1"g[q5j\$u,}֟F ̊яP3[8/i؁o"\֦<t)Pja[_>)z(o"!SQ I 9Qŝ'OY8يV֮g%ɀ:6๪UT=G3ZIb;3ohNLfEޯ5*`uuS:=vս;ɮtSE*n5V45%oQ>.< yUS@VIdxfG,jHbwլ1n_ʥ")+;Z ո%N~<ML_"Ɗ:vhFh]G<#r'y1|bx55ftU]>.].Byv Yކ17 x;R3u'뚘hXܾuZ};\4$·N`њqߊM{MhnaQEI25sY|p ?40)\տ~|KK}hyy"%nTw~R'M %eV(-F53g<΁[~buu\,†]iCMuKSq&mG^~PϚgwybuxup6zyͫM$M\ xC1:6\ ,MuKn ;^0L,G^8$,:]dx boL$/d4qXQPO]rFHv󏘜VsN"V3ʷ1Y :lHjuo=~Is+p&`,:^Ih۹ BM ML|I90;[ֿɦh[վj,i I&[x4o\ s6̃uq\r5okm@$NIZ:GyX{@я^9fk7#)]߲%r)FH 'wڢ-2\έ$Cp-1qvۯ_3|k5IT o Q H MJ=dI:_q.ч_dXj|=W#$ ;Jũ$^I\{>TVN\x\I_J[So q1/5sBz/Lz¿ LI9"P(hzȜvF:E& F:©x";>I .A%hvDesz%64m"' վXUAB:yx Wrk}, xzEQj)x_pX!(o3:o"Pj40cEcDcFgʊ֑N^ԓI]5o6MDw@x#;ao%3.tYMjaМ+|TM|pqϜws|6+P W ݋n&C"{T"EJU޵ElIYUb߄ D"( wGxjzD3X0 u _LںW=̞KQW|51 Y_]H `@R"8BOЄ ԷJz'FL=a攰/_sּf91k7 X5oO  Wq_&ܜhowg]a> VwbAվTӶY}LQ5X{gHiT \:/'Ū52v`[wU Zzțr(v΄'Cx[䢛,Ǯh ϒ>/6xV'} hu')M"-/Z:r̢N z{,1ƭ%J]8eYս\~*3R]7zuדq^{4m T2oԖ|#pqٱHuy[F> Fuwe=uo)f`2Up]w`& e2 Z"N)oZYY!iY|fg(t-c<tsU(i<݇s-hi9F@m]Yu^15jm)kUpf3ޚY.dwc纶u}. z- _pow]gGX,F~`wIX|qH$hzX0foPs_'*8$/ 3?[@f'(nf"'FȘLPZמGP̀Eژ-'VU,r+5h+Ow:m'z`OUA⎧Dڿ6aBĒb̛_3oDc|2WT;/Sj&jeŐp4YKR8ͼC +LߺN[IrD7LН[IQN!MuEmx?O`&R $z'Q |K攙#Pw<MƊ:<֔f]uo#r餔OZ|U+c\wPSrPj\@'(#΄bNhuoUG!J~l$(;0IrM t.I|Pѡ_lkT{"w7O,Kzڲd z@ֻ0  [J΅EGчUM*LDd_NH-HͩK Fy1Vf$I2]jusAd 33I'٬ nXP'*љέh!)1pj߿rEa\ Hho>ޢMsy/0*]EKV\i@2 LԙW޺o'üCTXy|}{kpII5'|CB^G58DߐZ&;5`=d҃=vbL8s &k`*As߃ 9@&Gt}4hS$3'7` fdn ͉ڈkgw>$I<}Gֽ} 3kk8{TIJw,P9OFU!2 t]xt"g[e짪:B8Xh|v-z]/;'iV KUC'FZRVJM4Sx3N_b(u݋Eڷ̢DU$=LڷC< <~Hj$E4wb|S'6Sʫ|&0t ޅĉv%^ڷu*md<ۺ~lMVH5';2cY'yT>fTY&dro]fJ=pi"]fX$ E]QFH. f>Qf:u$VYOFbJixo:'QIH5oECa|xяRE$~.Bja\L1!C!QfؑZEe݇N]1<ӳ@J b>[j 'f4m6F 2xxY:p*x"AȖGS$jls6Ek'1xA`/V|P+ [fnɖjQ2q 汅[@O:A(:؟b\LsBy24]dMGvX`>ȌLnD׸PuC?>I(<օ Vu'EpOZ|̦fqK5> ^Fc5Sb 5ۘ㋸ zu&?'{'ɚAV3eh Hw꺷]\`f5B< 71SD˸(Uso|w?[o5(Hm7 *$O: ,3o4=÷PDRb }P(;g@[7r{K (m=wS1&N!IU9:"mzGuړocRys!XmcmBV0asRδ5jUX7:){"f&5X0—|tm$5UT}ջOt ޽@v ֓'=aT.Sz>9BliSFukh6$a6N^V֚5X{bJQ"3oG#Gg{Q7.bzKr'^DטV`B#KX+uw$Uӑ籗z>=)1ޢsy2$e2X_?Hտ-L\Mө˗t]]n6n.G,Fr0\y5슋NQ s m6@պn}r !o?r2Gaou!%Q] [Hw$,c1\OOY_ZvS:d##"#,^o А S^Jӑ[}ku ӾO󽋂-ݚC =uHM,Ĝwտv*[\<ρ7.EO4?s t KQ` \0o?Wz1W|q C$ xZ:7ŸvR5`-~ ɑc0 ջOp&>΁[(܀?r:uTv|v6-TN#+b\(t =j$ruOPCEUB0+EI4U-,v>IM}ho>x wDy2f.́^G11lo8]D%FnbY!xz[><1wK, ռ Y-{`)GAxh๭Rr,iwܯZU(a@,@"\վ Ay-p5:J俒D0&2t ז#_έJ} sh1Vlɿt1N꘥i!|/usp@>^HUAN~\WQM.o uz:Fh槵+}fE fHe2 (lP}2֎<(&\zZ7EU>`Vn$ d]w=`µjbGN*-ƢZzc5ÁM|PD_fUX 4S?jNr{F~)]?n$urqCc 0u $@8:.W7z&￟ڍ n^Huɰ4DXXS!hJ'ʖRfdAchz19#=\溷rZ\yя_7L)5}[ۥkRH ΁C6͟4]GH4j&.VН>/%k94OP}L:Vq:#ܞ!zaKf*YZ[D MGߝx/(]<Ԉi09i):͕}M+,R5n":.HrH?qzR"3>RGU|LOktٻ kF v! Cy"r."[,=o5qta);8Z Y7G4c0[UEp3Ή;kEo5ä:/ R=Z% L{7 7lILǯ8f L!-[-U93 COb`+9Fn@3[@FLkš*jAd :%dA} j}+bDUQoo 59#HŖugV4CVJ\sfMX{ U `w'3^Hѣx55fsYH0^L3\K*un#"E⣱g Aw>+́%eoY); =غpRwgwZHJoIDE>k[> ~R}í*%AI/ L4_Qb&T9.\y|+ηxu~>ՠsHx""hB {z)>}}SY.NHj0yb |b(8S<0uo_yuSeR![eqaWs2cՃpS[N]BIO#MDUztmꦟd_P5i>c x+_$}ɴC&Mѷޕp,KuGVv1CDЙIiOs չ<g.7>̂uqUm R$i]faYgF=f:1n4 @" \6[ 4혋m>YMIrb \n>"=裮pl]iFkX^ & COf8ZI$9v^Gj+ }CĞ'5-qה41o/.^&)6(tq{ҮFC+ Z*0VҪ5$uW(}4gtS @:ڱՔHs5'Z:ĤjDa\vxkظ> +[ llt =up#Ժ aB.wfS bj߄;k{e˧* I%_2n *md ˲k{뷒)'}l+rm@[P@.?c C/\j y:o"R(n|åXKlԕ2#Ȗ4$"А ךNLrofuLFި}Ni zr'ƀª=G[A޼eI&t]~=3E "yP3[$ۼp;H4pwl]jAJEso!k9 $'I;NzY),z6ǀ;܀C5 ]< @6_M7۳U\QEoj{4V~5o&&BlN;nssQ~ɽa&EEЎguF #b_@C *& >5eAA*TURJwCY8zCTXNC n!Y.oWvռ>hڎmɹ2[ɶ^˨J)V}8^'Vu& ܋"-SiůS""2aXm~{scY΁; s)!C}h u:1)1Tz1oP򥦉)Q9{ juj0[H=ֹEWKENU-ޓb_cFGSH$8y4zGEa9$&ºffLA]iǀ3?/Vk6EE4 ܇И͌uo0đF=aU3Y+6CUt%`vDG&Vu;Ozȡ6|%k754+r|[x^Xލ/7jxˣLEOjAx,ıX$ƍ.ՊZC a09,][8D}u@Fx8u$ :Dk7F)!R  UuޗV!_E?%fៗV+"+|d7 i4a&@ѷ  Y8w4 2MMwVx.RIv$EbhPwe"Ԥ_frrч@3@fv͹w2iLFԳP R|޵fEj1@B_rKn-&hR:.Q>Qq박sw5V~遭.h_AgIpNWKrgG<ݶ|<[I#Ex #Ρ?XȨ|$ܒfUvv{r;f͍gDE8ݎ Ǡ^I.HSkɴ(,bhL=cVu V߷nl`5 b֚6VoJ8p0g!ɐ(uǞ<d 2*H E"fHPku'ȿ%V e=iʿ?ykIJ˕]5pH 5oH"9v֚2"{caSN'~Mʫ Cȭ浊|B <$T|uic5J%v(3{Aty~&Eߟ,k 3Vh~~| Z~]1+w jK xc੗:99<%K¯#Xzǜ @.N_֞3yQB |Py YL҂54" DSZ)CdБD `ް?#sn_TPcLm͆U6V5} Fz幯"7lRY>{UTT]$d~M=ʳ?b<ڛxn(|j P( Y^q T49Y\}`V;S0Cc@ɛ[#x=lC˽g #Pz^dw$:@On#s=|T83'η|;w g*s:%g (.A%]|"ÿw%M[xV_+$u|8*Ը>xUWq:? =fC8C *\{۽ҁN}q±&^ $IIB'کujLH| 7+4o 3I_ Z杭NdSÂk) 0qԅk bi]sA~8d t fBq\f^m/ƙ&fexpj=uwQlt ߈[xu7ث/߫ѿ\+OV1‚ԜT{ TfIdw|Gԑ%!=q?%LORF;W.NOɴʊ2m|"0DCŝM.O"DJI`Pꋑڲ-ps|pU)OԸ5eH6 Cw;G$ "MsC[*<nd:࣪Ш"Qe)Ca{voP:j=pdl:׈IRJ:G|Mj-y79 |i}+y7}IHdeчZSJ^UGYep sx:vT]o^UAL7q j]|΍ "Xay~;s})rb0L#R;9eZ֞AVmt}*cCJbvF=Nl?$x;2W`tM)a(h;. ;K.ǵWӂ8GZ;`%ڟ X/*"n ޢLԊBlюXeV lD?yY_[&R(A=:&^p"5oT2h3kH1!TrD Ox) Nl+][ {> yEN(Ǵ(!ߝf Klh ?w/{~~R_:$ItDDC7սGWxߡGp /)UV ^SQy(\觮C49"xRƷ|{HHXOV:zhX( տ'11Pꅓ9Q[bf5DfráL2o[cLz 7)ݖQEݳ<C}սC%֢t]C0j {<ƣ֜Ц~$dNءREniPW Afdn&#؅mC(2pã΁##gA<HjO q-Buva6aDļށ'ŊzcV /e3|épD:³ڌמrK_K6:"7%i39lwȑPf:(5YW$uبc_ 'uJ0ڪO] &H_*U4]g`j=rQV|Gw#%#7)2 Fzl5X3^s}p1pߔ"1Db~8i^@kw19ό́dxAGN޿}Qž3A7b(g/I&;$bw̑옘38:)L:w{Xw7e/~92O]OTBOQ4RwTـ#ɣpub41Ih.+/J=f|>szQwDBMsn 2;mMx~3CټEXtGLc6.6sq╢U:.vLcɏ[ʅla$Н}1CY֎#xF&px.oϏ<1tÄ߁5+u9>*s}h/QB}@5P4p՞?3"l؞HjGą QNEE]Y lqpV&rj'5"SFI<30QySt!q6W#腂nCUA.3!;;ssAE;}CnE4m8[c*0t R|fV>5n_$^zRo梳7Wy=+y0V,\ }dAs&%ȓZo1Abέ_4zfnj=]DV s3ƍ$8kPBGgZYh::aw4cBus5c}n _w׆_0I] PeSɷ]rs fIS9A_,Pў/mDŽ*ͼ`z7=d_ PjD~c5qupkbW}TTPoLJ4 ypړm ;fI.iE5e[ڵn*jh$ڢDX8$ƭf+QV1 ,TSIPcwk3yJnȭ4T~x8=ϐN?աNi.& |#5P'qnRr@_`NaiAռa?I].AQѢP+V_fð'{2HH/:iF;96JJNugVFvy!cFIx :BIYaNhNLܫL}cw)7C.A"Sǁ-kwEŴL_OV4\ Xos""xT@1]nIYρT4[`xSED"K:䤅7wvo@R>Z6j'>(EsQX'%]Y!#UtE/,z"FFx *U­[)=V@>ѷ>hYe#YUm(QI6 TS$bN")g2˶"{uo@x',)䤽fef#2ѷ9/7OXfWɄr l#I[ϟměhȫ%owqnԞ叫fD昡 P;n|Ԛ2MTaҔ(GX((SI s}#z> fTPtCb]kw ~ & Jsc̖\P4n3odPsZfhn|Thx䞾 Q_YqtFz6+CV]rGd$dV1:o{.$FZ]HIf)$uA5DVnp L X"]dQ$Bsz"Y2 wK͸'OZ޺ZRi$1aܣYw _$w!VJkŻ\Q|7H_V#2IGho)Tݝ3[]':obH"n5;׼F?Nnw)W`x UNkpt~ ~nqq+"9eG]1{\odH5_ Mxi69Eh nVx_75T <E,—sh] zزhR"4H'[UVK:-3KG]H2Uh$uW2&_o5,P^Yw2Eщ21SYCM>Su]րG! #:]ɒ856L^dr-X7ɯk,ˀP`~}9njfDO^Ih'M"4}3Bw9 1[{3z'F᪐[(H,gY6}p:H:$R~?xpg5h(@H.zO 57RsRG"{'ox1DE m;Ϳ9$uo}ȇa@uX]4#!={%|FAo 8aԩhN2?M؜Q\ ,EObDc+9fʜAR[c˭[B0pȑ.x}Y֣浀MgBI[PlE:a7:YJ)$ԟwikwClDS%=BW:^L:nh!Ǯ6E@,o~"F{g!PA4ɬBV ǬM5ox $X^Sw"'w%+̩hjܓ#ytogz,Y$W).$'5:GP<ܛy)K܃Va7AVľo9'tc#ĺy UC I'{+o$؃Ef]FANA"gF裭5oru7>.i"g@Y=L!rȜ3H>f YQXA]0҉@W'GO վUhM-4T{HNi~=FWMx߅) =QT/1d&w/Zz܁BptO7NT5O(qhjfz( 7k 9N}Z7qu˚UmM*J9Ŕ#5"nFU||)>AU8ոꃏNIP G93zhiE0}ucePӀ!VL:BuP̝}1e5oQ -4г=j$+@+"iA *i.;(j1bsCQ7rEִV56̣Pl3ޑj*&G{~X@qWh_z㷫:{;ɇYM|atmR2TAVD/)sڅ% [8g*YKz06rjs@%G :& dA ~} 4qpxZ(1.hڔ.XH99ti^K~boJ}2U^U :ү-ڵɷwn CZCAk葯 741,.#V*E=B-*"NoG6X`U"տԔL E*KQ/䀳rDȠOa[8@,[QA >MO䚚֎#NK&4 ! ة()]xB)5,"m X#̀噙RQ$* M>6uo*H_:6+ě2DT6Cv iW %[ I'<٣0"Й1'/վTTqh,Cy?GƋZI50_`G";] @{BL+~{9[ia hh-oɞn_;7V&I<ofbh(RE' `˾PE*8,և! ywV _7C@z.Ł9U RE_}H@Y $|J lܰ3u'ɥw,v ]+G@ ԝQ%4G\-UWULb/mOkDuwPkJ2ux3q'(5+/V @l^rIf'*U>~DS*~0q5 櫂6s|~n qAN@=)FqjJw<^WV&b$r$3zLJ `2>6]oud KU5+=w~,k7ROsZBxZz|L:2hkǁYYƨF`dKMҩ!V1d]Ӏt[kW= &#TIZRSwLsN)=b6#@$*)d*w_:V&㻥+6 lĊg6EGz?yHiPfC4g[BávtM6WG8`vYV+fL[F&Tc!%H D( j@HI%BˣB}@[yi-ahX5LrkLwq;8~q]Coe$ "Rm5=g'yOAXaK$ǎog7 ^ $QlfO;> F 4\E1sCXd)DOxn9.JuÆa3#W)+cV%<u}!0Q6{򴂸qb[ܮ7gIOM_GM-lb,;eQݓ[Qr|Hձs%j.&8!Ck՟}+DP|/J]Uvi 귗TVwW#t QEGXB\J-"2gs?vx+me1䑗e vX ˲` ӄa4X>SSEj/dp!=[\}aM.*)' @Ȉ S&{({3~37\cGx|JjN"89q $2Y\P (&Qd`Lл% r]=E@gh΋*'C]رG fhDa , Zڐdaw͆V38} L% 1ȌTpL KxGcP<DiZ&,SAr,𸉜ǐ_b1ALڐ,n߶'YмaM L5pAAPI& ]z#UomؖO5{A"K$Af$9%" bH` f0'tO9ꅻqRH{^UuS[=Ӟ=iO{Ӟ=iO{Ӟ}-=} =i$ڃޏgOJ%L?c{!skmo{dŽ ڱ 5;>{hv=u7w] ~=4wx0ޠ= b/K+7[:|'sW Q=ߤ?~_7[ս\ge?"CYFSHilGg}L$VU}BҧUu}/Tڽ._+ok[o}T[3(7; &Kra߻1?|>OO,>VQ}=3ȄdMޤ^`vRD2!-rԁNh[MQߗAEHfXr5Y6\BUP%$(P&۵RUO=0,Y勛Ã#}Ve6;O}M^{0T塓U6ӵqV?aǹu{EݕÃb8Gq,>AM pAZf}ӣXڝJmkɱIƆ"HaDT\ʋ˛ˆeȳIb t˶YYen,vTC M2;1$G)x%l#$JłqKoE] reh*p<"ڎPoȚd#HFO .;2Cv04Ea481e W6ԭ(-٨P4lvP̍˶iR7Pxۉ#R3h9.'Lə9ZH>p)Ls`ld-v:g???F0oPbi1k?Csx'|⡡_Y/^ʵ N> `}خh]y|aNsyqQ~ulbA}8vUxX U:]4@L,$'G1"1*% 2WB퍊4ͮ*T,["B.CY9zF#mˤݪg^DݕR"z#ѰȆyx$.>EoL뭏z4̎5Ѭ8x0@Zͼ@a/xڡt'O-#M049G?v~FCD@Ŭ_BkIU0PZh5i]µ7z"fƘOr"H$X[쵸rgK7(lL4/> sNIvx^0=G_'~K7V%GOQQ Z'ae3nj͇V1:>ϐEX8_lnnn5x Eu}/35׬j5xigYvp*M"uǾtys3zěx=1o&Z{?IWkڦ.~G>?"f#&ǧ8Et=&GGgVã' bzzV rfq Ӵp_Dw<&tLZݺ(*rŵ]1 L$̝rGd"Bjs)~FnY| _+wDb;HGmѬp):%}ic}{[ C"Qq .-Sbtx}(bd(ŗbhbx|>ͭUrĻyT^έgo\71xeo=O/?{海_µ;lUvGK$RpɃrth;ſOe?*?wu>?'f;_ Jy:n((r|l6#huLaS!^lJF,OS^|,vv!=O:DѲBeÄKg=nn*$Zm6$;Dv%_oTA0SiI" }StLбl 4{! %ЪAz.&˖82.BȕtAҥb:D JDXm0:< p`ҬW˂W/=O3f' Rs՝MVMY 4a1Mch }Q4Eg?.WOQʕ27:C, q{ARm̮E4:JU*p)AC!+(v Uթ5jt:=BAI#)6 C:2{19l\B$ST:Gclb́qVC3äa0Qt<@rTA*n`;>K<$HeH%hl=fer t uVFyZ؃3;zSOw>k7+G,(z@w\/OnF&NOk6U-q}*4n]gF]][al0D`hs`ns^FQtFhʭ9f U .S}*mƆRoIsguA6]-.Vl|T*5٪psPhHwmnwП 8&k;&c#i˝*}a;dr,nE6UH&:H4:}QO( x&CܠU+ zHlۧgl;#|ҭ/|*t^ˁK=;O;N>БmzBe,p2';¥Si*4MZrN }xj7$ FfGd?wE J\|!<w B4MR8z`(tL\tA17z{' fG˂AhX0"ۍ.`BLDR fd:dW;^:W O+o>O%C~/z/ v&!0m ^Ry{[ۦ0tp}Cv}AM (U8T`iĥ:>p TZ=>E)&Rt/DQUn޸GX}}stK;YzMvvv r Ш4Z躆>RtA_LiIJULVť2'=3ϓ xc>~ mֈ'<(on`t&`P!)[]ºBL`qM:b"G &ХS R1ʿoׁ}Wi\ W/~yDVI9{E7<)Ldq 1osnRo;\^ZRBMbCpz s~^R[Tz![OujN8mVNtt]mh[a(āip;~^j*r{iO|եXh џc$`t.W+՚5Njz[gm e7~3]•ś BODpؐcDc E`$`\5LE|5GըPm8uSJ/?=A&T>cSt C,ڭeRg^FWWOy&C\r6Ų:xP4FvBؚ!厅{dbaR!ֶr4mL]\`cn<ܤ?Dx6>fӦѰit<d̠m9$1D)aIE# %PU.GX qߡq676)ejEnFq3o> sC::vfEPTD/.nҲq uVXnrx4 M08f83I>N2}O*$4f2!ƆCa{g:Kw*̾8NQ/|F~W6nM;C/i!E,H)B 12:#'3.+׷oחfh NfI,¸VYۮ2:6@ M%0 E(cAZM:$1(tcG8D:_;(pс7J x!3i|t[%4{loڅ6 ە;.& s~@t""t{0-w0{*"KKרT+b #쵍ƭ_:e~_r`g޷+ݗ+э. џR(GnQ,՚K/LI.k[ \_pg&\cO#,6T]q|.I U;-lo{+R on\Ƈb(NL_Z嚉e;MuN؟ P7{dR  ٔ"vv4=E j[?V^qT,M: x2գ| =C@%ٔt_TNMd"Jڲ g\%17oyI-FIbT2HײτitZD" Uaj$Evh/6]%\ÃLS)幹كQ,s2 4M-s`׷^dm2ݮk8ϙ;dl p=nvG_HP0:sqx?;NR.fK7ѪG7^oBHbn߁O^ŭ=a;*dbmW+?\mA]emFtI$¬mhFۣݲ/]ar8a<<ǩX]!19c{H*52>2w4,.^Ɨ~USlXBD2~|ä/ 1PP ȠxM-Lrpa],G$ ӳ:ZkI\^ܕu:xضʶE&/@51 Vp@#x.yE-it=z|MF9vpnOrlLKѵ%$x4]FL=~cW卻R{ (fODVe\BXT"0Ȅ d۸CؖKe+vh¡e"N1M:Y6fG*Yv<\O]mfí5.,n  Jx8nD|(xFxb] GͣCq]<)6FDP(W.֐"}qҟb#s|~`8ȑ} *шz \~yNԚ6 tU5H F:M4ayL::N $kZ(_~׃\uM,]O'3 P_'F.~w/C͎E0FT qڪ&b W9="Q66,oqI'ĩ;L\bfnCJ6eXtf@Mә7ɭU^+o AJ G7tT URo3m:6z@'0[. $u@( pXXX S-8sQGT/`m+zC'Y͢|X6D~gxf r%Ww^ϥcKB!PP$ GtwK*  Q C77³/<+zJ<མ= 'BXlAz_|ey`'[=؇fO|<muC l9 F·_RK9<<(f&E4;%lbKllI E&.opFLX] sc x,|aַRoж\ }}iNs MSYZv \[U7xem/"Tº` I<Ł消gV:tmX@UL6hJ*BUVCyB$QoT*Z&W_Xc|)D:;}S!&( _([Q,YE"&dD!H ZOئfPⱱ[JA?|FaCXz.uӹ||af ?c#?>k7 Tޣk|_/ ]_8/}sm'٭9ְXHqk"  @U5b!^\*ҵ<'Wj(I>۩rp2Ł.]~A [/g7#WԽ{27Zu{wj~Ç?=HWWVo=6΄ξ"nޔ6D\+C_?lx?c'N|Ew;sWߎCqSKg>Pzl?1̙K_zJ-lhv041-G L=gkL92Zǃz}-ct\a(6Fw=v+k,xiq]mᰎi:A砫Y&Z|e$$can" |[qv(B,>źMcaPVe5ghHҵ-F"jT@?#$c'\v*F@tuJ:؎aE `n(H2`mmTxAuvt6ۻ≷8J^Dx5_mTx i(^iCY^]o}o}'‰3=DRbuuvU8NPi7797ݭDu魍/'cѱ?x:k9{?]-|mKs{@qEm ]8绢0qI4:XvP0X͈paqj& b!`Hc9 NBj&#llt1M;TM= :8A֠RQRjx QWhU)؎O,#B0bTZmTMC3fƲ9DitA"@٣k{[M"Qro*:B"/䓯(6^z+=0NJ)\†D6B%ԩ[Y>_y9sUL㑇$E&pun˻J?ERѯ?x= F/'u9;9j* |[Uq{uɉ)iJZ%8=P빢87nzy?}ģ?7)>=?v[7Ʃ㇎ʛp|_-]e"Pd U##e. t6nrK& 0K'YY/*(t]CUTMV ilj\Fj,P@%b`1MquVBZ"H'S/JhXu%㲲jD]l7=1]vXD%6 T#禆&'_|B}a|-<~=-|_~CLnk]3CJiST؇}Ǐ>sSweAyZjO?z@;te`8%,ޒ%ivY(;[ p]..R[;|?*;٨g_ώ҅3oiv}`b #'.6sm13ds,`3"B"kL HR$Wjn[gc!ܞ@f$燹rsUՑx1m14Mu=:.&  |3>:/=MǨI_XrZ%0me261pMS@\Sdt @6(p=I 0T8얺cQxT%u5=R(w6+.WZ&|]"aHX%05znHP!Wqq||1>AQ$H!4=G=¡+;fBG繺vãұlmG=ub&[-rĢ }_B?ڏjfq:% E(nI=iw+''y>{_ST͗RܕQ*ob !Uw|7nX?ǔ7zU.$iX-R6-\be3G"as"q`tDNJtY)+rskc3?~ꅁ{N7r _"HNŋI% ULIz$~y˯ "U잏 aEQOT. *еkM`r|S%0[UjB(p*h?!qM4MvpPgKtM! /$3 Qn:r5iw-<@FTn2?7`C{I^woMo*]yﻪMUW=8N Iq+Je(BA)(v%r)=VuyoUz{޼2E4ssg{bh+͙;gGho'nݶVvr'F:D)&E6R2VknQnyInYT?l(0 3|qukm+gutM*kUTbzrn-.uqQ7vR?8:t*ǝ{ ;Ă-t[ ~k_I.\Nlw1>MOL XaQĹq"^$Ԫ[Cxaxj5tA|FcS*vT$la6>>A>0'%d#p ] "lĆXj`,USTiZ覅ڴp+ib%\l h +(vr|N'IfvQohD{;(\wqv$i&f x@M,,&y hBW/frc~yS}$e AЙ P3`(7:D2?#-syoZ;ʑrvm쏝c|CU{Mx*O \o|mtF;궮\-GZ#'̾yeˊ0LS|Y?xSS|`OzTI۩"#q"bExBas %߿A\6 Ѵ,Qku!0D&BH2MJE,mQŽݤЍ&S싓przx[̩c|sψH>!uQł3v\6;om{8:BK$CgI%K4u+ z, ptrX44dlq-,#LG-ꥩwcHg*4&6g^|ٓ+5yI I6jVZV$Y퐈|]GQTpHlL n._m*&. KtX$[ABB4 MPu fq$^;epRdv FۼUX!Qij¤fhnޤ砚/gmg/U"8{h#n|[\Jjj.# =#vWlَ%DP-aȲyJDf?.ruT/ZhO>C\qG'R5l`89s#\v.\ghG?`usOe|P_?޾97xbQ3{&%S9UɕQN{HNxʃO1}|Rlщh>܏3hpr[IeNM(H\ԉFcDz"%K0L%ea8aTNi"$ ,x~2K(^P.鉹ޡX1{6M&W`Md :5 dI'aD.Eab:g4+ A`2 "]5 [4݂p[ r!JevJ5 B.Pd!s=;;ƙN67Ww/_e};KGwG`ut Q,_ʕBC5$G뿥?@>/* Z8wx<Aqoiє]"S00EgXBC{4(Si$kߡ#"l6;qK54q$}LOy_yݝ!0.ݡPr[ wJg[ hB\ "a',ap:$\nL)d~ӏߣ7%r 3't.\JOGS-uvInRGd u:cn<0J^gl_RN#S! oA4 e Y֛46q:D~2QTj6:zK/ox|eHQi4I$tDdIٲNE5p+2SnC"ˡ7-,L$b~-d/t&рD[k |Yg3Q ݜIU|.eE2WP)jv%Vv튒/D]5)4X\X/Z^v#v-k߻msbim W=CGk#n}ᕧ_W1Mgѡ>v2u{zx~~z_Jh4^?<. (I4{͟pO| 3J}"]sE<@k G*_fUmE:S&Bg8HIG{4LҡEAUEQ!{@p8BdUH?'pv|ǹ} zLTgs'Ͼ8ۿ=>$)S=66A@KM$A^agg<^P7swj8y|D2n\~lV&dž:Ɲ{+Eҹ2;=5f6)*jM҅&EŁK% MT1LnX2n@o4%]OK=i)5AaSp9|rd/$_6h85'`I0[d;WXX ;*a $T7 z$+U:4M8e4( \Xg>h85!bn&>uLN^eVE!,Ζɔ`dBRZeYRL q`P2rww% {>MOar{s"x ͂X],sB7u >D  v:x飻VJHR>UB4YY%_=%ȐHx6S_6RzU7KȿFW[ >0CoOmi6y$rTDXç1dre'fɰJ]eıGlV:d܊̩ٓ uMC jt ,TNX5h *]6,LS ACpp9%<.6!h奻}s>`;+ v qm+H$ܤ/..p4&.|N\LI+r(vOţpXتQ n, 8%$HTTM Ӣ7@Q$kѺ)fQ'Sj6\UXM]ˤTϽ \;ba Ȁ89e\.vgq V ?,]{7o; KlJf}3/EKlߵ:?-(ѵ 赑|sZm%c-`~UQޤ=fj#Gx5D!_7JWK߻6QB6_die?"[_~%=NW{].\]]-Hxc%Jn\g"nRTI%vaM|^/Z3/.c4ur<&jjQ5q;e ELEk; X$ijgΜVӸIOo'-^;d Obpi y\5U#)g3s8p+@ԉm렿N'4,vIf'/dku%0u [kP71"k)7=:D&z.:=CiԸtwc4t2%Ξ'bwNk'*ϯ~nYG'E?/]kS&5w'ܔEwG5ile"LNp 6J^ ڸ)B^/^¹Gy\LONѨTp8Zc!ҥ<_7/q6[|31s8¨¦8(T*.=]m W瘙>~S4 UZ#aqqַ5E:b!:ڂFrifuiH8]4ݢ8Mqa:?SsmTM¥y]))h&SFBP,jd/.˄[|vlòt޽L&Wz:.cj;6ɧ _3˗sKu`4a$maa7Z"Yh2_"Q) Ea"#QufeXL(ֱP|v^z>?7PJ!${4]d ,, Dl]dKC(NA*KK\.6Y*Q>VV [`b]ͿpJC~뿵}m뱍 wY7{wфϐXl ]twu;wn 9|M"]P&tgPnbuC'Cޠ5@^ƣhMg&eTUzziD`ko;WPF[O<4a77{L$WYIV V~=L 0<]2i_{eԦIi%&jGw^.MHBj%qdw4'ЂX8ѡ>9a&0, mLt<Y܊L#5hkrsouARgi+$Qb=~[p(ɕk\NA6ljdeB?/>81O ]X,qo~imoAGCV)5~r@BL16؊np{< W^̣2{r;wmK7Vi q+&ՆE6F0 KPbestę}Ydܘ[Kl^eU4s*%U=jb]'os` jE~0$sg6!8{3' *j>߻pUyRWHzI,㱇淿e6I24j&]<4j9_ަV1LuE茄ѐ_è乾zqmwqinc)S4>]X /On3ɸ$pER۔U;SGD&owNJ;oSvQ;PU56h ,"zâwDFHShZ qy!Y: ;/3:2&;G 슓vTUҍ5+9861n'nahpLjtLZV$HhԹFVgq1 Z@k6立#TqR?ĢBx\.G "NR,WdHgKlS`_;Te::yuh!H5lv &:` iR(:?Kg؅&iqR>,qz ,х(JdK5lf$*!kkg+pSǎlYZ]Di ۷IJ(sNszZʙ];y6ud%ƻ[I'j?S{Nٳ= ~MoNPfgxtw~*X̸X_ 췋GEEm2, JR< ߿~nX̭ya}wl1=ɑNNM q^xbs'[*rbcr# u񉧟 aC3XiRrw|lno_^ܸ@o[{)Vֶ+sy}T;{@OP(F.A7nwvS$Vqz.M&CT*;)R՚ 앱 Aݛ~qql Q%Qi 8tɂFN@ Ēllg׫턂,,\NC7ixဋ6a@zvFcY R2(L:CvNda@gʼn]S4ʵ+[qz;4D2CnޥN#Jpo=,%tϫ/>OB)H.fgO2{|/};%,P$wI0cJjʹy߼6-jt_3oh߿zͧ{߽/}>xGNuFYG.޽4G|}IaTD<.q/>IԠ%2^vuvs|&ˉ,A2LjwZ.2K)Jŵ}MyYX+o\ǞyjkyU Z\L4&ęc&k1 Wv{wr>HH7޺v FB0v66d%&(ZC#*8,.otHpbE*[!Saɖ915D `J1kvj &,&PaVk:&G'2=vFFx Gb8lL.%nE\PUMr%,[v&5>%p'NldseVhlgjlIJ)~MD]#A,S#o9>.Lt)a;B^/RZ\ױ+vJGnh2ebqu,j\Q;U$Sc);;bW\:ۻTk lV&;$ZڅJmbh*C]] q*] !!{Rl\AE>W0 $ۡ}jbFbl]ܾ} Ӂu8$d`Fw{׫ç4pMCMnb,庁.Sh4wdUɗTX]ۤZc/?88G[2Z)E*sӏ5 #Dnjd!˂ێ& h.((7,Mnk:e!Wu2uܒDkGW=v yӓmhNVY^_f'%ҭu.$aW87WXKq4jܧ'i H'/ƑEkQ(iq*YlK8ef#]^<古G#iso ~ Gﶵ5JjEky?) *l K|^l $X!斶B4+*wvPUU-X*fNL0}M;0 ѐɩc lf䭥sikON0#="!>/_O=+l'bp(FZnOn#cxt uscb$_m`۱y ُq)P(IgQ svbNf'xx<6q;Erw"䗸37[\ER2ignqnpga{˫}yHW'nYh7|Yrꌷ}ۢ$*Lс^EJƙ3yy&c#ݬ`!Q{-"Iz)ω8wfkW78x+m26IPUM%Ԧ0P2d^#()vBo>k;I -,oO yIVMVr3%ڽd,z:C \U-1\G8"^ʩjA1|l록\rV !̏Ȁ%܏,~me8xnZt"hShm{C|0JwwwOexK|Orfv&G`4+0En{v.jC;,ȩ&S#xz[gJ.ruk`\6Sܞ_˃& *Spobʭ-"266ډ9u{)J BA{eF經)YMTevx*Onq+**0F~8uETUSC̜7ϫȓgltPAgGY1,ɩ3YyX6(lAzbnp"~_D,^7B 2L.p'8VBB__7[ wk")TIkg3'961ətv =>H~8rF3Mv6' *禣lh|%.\vKHj˟~n"Uu;:xsIT ow!#Z ~n{CS2m%6HV92ޠTٕB0?mdj_ϽcXSsygC|[o h.D`VY^BEBE|0"91͍%LK%DT%*s T,3b;B\anP<\Wq>AKG*WVō{s%Y~n[9wi{zrڙMy,y Bf@H-Ӧy,[eҖh,]lٙzz: ]ՕsՍ0Cyt‡S=u>Ydye7HHe\d3ß-;#{cv0ZEa:6^aCtbGeJE<F Җ|$w+!{#Alf}줓1ҩ/SX^K*óLO LpO7Ggǘ2u/47=JiJ&Q/D.<'{|x4( tlt:z2K$ XC{x^?EjqJx$LGoewHclQNYLZ:>xsqjչ۬$KNUz\_L`1JZ(J_Ggآe5Z fq ,cLvT:zw$画l6}k fB)_xSɗh»ݠnc9& ! B'FU^z{ xNٟCJuoO!٤)NHfYIT鎅 1>^ rITey;f0kmj|AZZ|d.-2ը5$Ţ]kSaȥ6h7[!f'؞,cx5RJ:BU%,&9?NP>ʬ,2*nƓG9yc~z{<.VSkL:6s?v^7"rjCKQ;gɔkHEQIt F{i>gI%n̳6urm,hrDMZaA Ta# R*ՈBDa EkKl$2xTuFF r2۩v8-`}uhpGZt"M,`!_iv0b0ۛ9&ǂ'&Ilmq,Pj~<IRwuc;& Iscݼwcƴ 81ż[K;\E/aO__0:BhUU-9!I K$wK8H$SǼ8hnDj/|O}aLOj;zN?A__77n/Ai|'ysv+} zUy˖e`v~.t<Cח6X (,,%N֙y֒YEA󆝏?ք4(9lY_4,p2 @an_n_W_~^|bYW?oWٗ3G$ǨGk 0:7`ԣP5dTCC~ֶr/mPosb~qwf7_Xi] 3:q~_%O=kP1:60x'rʡ~ɐ@Wݖ7Oyp>cu&4L ӡC_؋h=( Ul޽8\vbiK}.>7V6[̯$2?3L8,ר;>/΍\[Gx(/r':NAq)0a5%ec|gehFcyȂ׭!:o]-s~^|=ytjlZ"&G"b+͙Wh6;::}_Hls*r7U|'ȿL |dj͙+ۼw;q*1&b(LRgOP O7JեjVP|!dAf\Ctn΍M.P"2cq,S\& wP*qhni8c+- Bt,F8oX<+ʅx5s3SԚS#tu2ufPWq:29uj!ϕjEC~2=^j6t}_y2]>cT V7=~("}!/V E+ Z$_{}/$d~'i }=h+Z96SEV6J8 Ox˗ygvBAib"tx&̰[()V0>>BZQ=+NhoB*XJO&Ib o_\FX6Xs3S|Gp[76T[d;X" z|a,*x*&kQvmf{^r6+d+6荅$S\Yˀ$웝f#mHD>~{ za[޹@TDRϜ=DRլqIĭ\r*GӀ[%*1(,{Dz n[p(,9߫`v,J KECmCGPoP)~w׽}wo~\ .|O;t7&G.n:-D\m#8^!5ۂ|卷qkaWV5~Gz'>,o_WQ+IA U¥VIɷ1l$/t&?x?GP̓x#@GU= LSoTx9q(}>VM`+Sd`Puڕ ''F MG;FbdCGLEl'vp(ZdfCASd<4HZAeA˦V67%_{cS$u4 65!7aLثʣ*"=1 YQ" ȤJm2x$X@Ų- 棯'NAS\ZnCa1@N{~Pq0) |A?7BY" ki. *b;!."K01j6\/} uc;/*|vd:J`?8lfeDYя>I/UllAuG3 d2"lBnö6Mr2F[Ip` LV6VY*q}8{-.QJip^Az-V4L+g~qBn\g?<}O=WvkH8~IB ]<;O80@/}= G7[HPkU}u*\N疉%TAbrЇnE=Ttۦ;jq]>.D pyx^V8#]ƽLYȳk/̯ݛ8? S(:FŜ΃ hBBvs%E" JapnJeY6ؓ)fҌ`ee jXIҵ5Pe|8a(lX <"OòJ)^fu#_N:A,D󨔫mM1LQz4|ɱn0 %v2E>ϡ.]A f`DW/sqVEx`Nxm IDATJ0«88N[FIYAGd~-\HX, " ; <4G&Ns2uŘ_Nă'x#l-4(VuܚKYNImտ:GS;`,8읞 Hf 4[6;FģSh)|ea/1DP\AVb( XtG5οKW6-S=5PF>4"U09ec&٤Tm 9"'="K"ZZ,N </ 8}Aj$x5nU&p( k`>Mff(HܣEOEb4x4O<8;G2ĴܸlPIyvCOSHm25wT5]=A-HfkzE"FV$mWzJa"DUDd &"JtEH hi6[HH,±,x{g|Ǩf 2h2f $GO4li\^.#ݴe O).]LjC>:@m-1>LQ]Rʭ޻Ze—űn2"/r.Fzx%+xnFG xe Gc$ Fh(dm^GbGTiSi`Z"# "]~jc&nFM-i7\^NQDP WwrwSh{O_ / ̳qqr¡}N&J1􆰓-O>T*UὋ|e2Bz GzsLN E9^y`&72M4g}q޾c";"GɖGloabv DZhTk VDdse66,R0 p$,HI68wn|#l?޹;=17+Vw*|SGH E`D|n%'_yC|ÏD,MV%j "!`>4k%$C-Jf)\1Nk 29>£BT* H+5\V1[*PoTjMLq#""ͶMi i@e鋻i5N@IA#hhumKXJ4Tv9N+K<1^O۷fKԛmf7#S017>@)r@d[ b7UN'3;LJ?҅Ql7L0bi!_(v۱):>DAbSS=n~`0Hnwz, ˍhC'(W TN0zdV3Qq&ՅWpsq=!Fem3F:?q cw:t9FZg(wko {Q$MWWg/bgΩ}!^&8}j cqLɅY-EݸIk-x96}GQT[&銸jD Ɖ- !S(HvitlDN6G#rqi|aG#cZn4 ˦4 ]& 7$RHa8S}nH};A#0.xVLe9XS~">_c Q||E\3U&|x$ZݼNb{l#!FzhȭO {~йGUQҀ>3nCrtʵ}Btdȡ9mFM\'d%^/ç(dvYK˜z0\\3eTM!̝QVQ%2pDp맿/P˺ i4:^ôAsy z0:&F rػw/"3Ao.YQW7$;*9/Dsg?N,%32C&ceX&nY"K[I.,R}F=q66 [q -QDS6IdkJO4 /,C=A^[%:o37 T&,<uKee'O>פ/Ө5e˘"ܑE(ڸ\n2m1tި[ @'.l-EpiM\D&b'o&BW8`(߽qVݹԭ|w~Xg΋_ oYYM32'8:\ ndh,N#> vdp ¯H.s<{b:\  T);GZe3_!q=^^{:>("ix3x|Fpk6u&"r dL$Ya7_%?BwWhD0eKŶMtSq{<ȲqI6`HM4eh$ѦU wOmw/nYrk)މ!}.#CȒV*GWHVo0lEOG]$[lH܇vLF ;AMF1E^gi#eTZ;el뎬m8i,+H[nc(x(VJm-bٱi5;H覍mغ+Oņþ0/F JsG0+ԡ#qKFI07`nYp~#,,إ;&TyVRd-peIzUA0qdhu,tFJ υH\2nA?k;ey&G_\qZz5o/(߳*@2~KWo}v4#Jom {FU.+uYMf7*Lu~?GGPDF"]?5[6PEM\*(`sGj}x= *a6# `c>W|83n_{Ru99Þ;r:V k$N$ŭ$]NaWV6 8x* KY|q}Oj@; ۉ*했8 h.QQݲ0MFˤ\/iuzu:Po5 uPejM,$b'o3am-͇zR۬S)6/A&Ww+TӼ}1̓'cDiC#5omP( uSm|*dCdjvI nH#`Pt:D88tEdG8K6ȕL6:7߽G.}O87ŁOnnx2fC$]RWGZ"ps*nD8Fݢm+l&R;r]WxhvsW׹Y'P{]bHfaCTU.W1mIR~HȏmzVM7o ORq;)9owt*jJMcwhDCS +P1 JA~|_fm}sW./]]#~WV6 +mqP%K±sǫ۸ r(,aK( F5c.z.zD<MAl¶]V㔖;B=¡{ZX+JN ~( n_pNȲj }enQGgݪJPK(zy z uI[(3GO x VYʒ4)65,f7\ ݰ])wDfh* FBl2)p~D BnE\jdvC&ND @ۡgG:a8p=\fphP(>A&\<g|hvG7T>U4xQ.n.C0f:d/3x6o]v2O$?=P(3g/'qLəq~WS(Le)Vk4;vһEDѢ+b7@4f=YݱV rRbQ0;6m0L$AXU)" 17!P1L|EK#[nf]7 ˲Q$vI.gXOTPCm|h8$5k]C,5_+د->E~Cc?+LE_z;r3%LvJdi~B\<MsVoH U78~{*€(Rp33Y.r]W%CjC29D Lbι G+%m @ IG1\Mj1!c:jŹqnݾǭ;L$Fj\{6Z߼oaw8$/^b.ٱ9:ր7?cY+fW*٫}(q~ROTHdB&Ld05gt|?$A$oDADD!hDn@gL"$$MS#*s ) $No/|&r:!LDgiE("Kɟu}A׍I寽N?c{;t!5訅h)'┻CF&r16Sq]qG(,ϛ8nȱ$fj03˛Xw~AÏ?$৉3ӓRW?t¡Y/rCŲX@LMMuRX[: S7cFks.ͶE?,:O.37Cr$nӬ sq;dR'Hq} bחdYf&Ȓ@&")2I& \dr,b1TU&3?fsT9P-h|P"#.Zf{x9UΟ=~cI^{=6w+ܻɉi"nj:}r&O"&A>%ӪlT*ncxj" 1i}/%04E$$&dP!L5zV@TY rd:EWn?`?}o@?arQn?Bk}aBRTwT-76x*ϱKxD">G>u6k?`a"g8G:vt]%yoLRTnSnu4fwB7TbLH$ 0b "Qk4iL$ UNYU8*(Um%"v_,ou ǃ[!G~߮zW@|8Ff7xwH(Bnm2vRצ2J233ŝ=J}\.Ap{)yC *=r 3&Cr A>rf@$)X)TKܐh Z"HhvZke~^@wPm 98,dpjO<SLMM8"? njlny}x<8N_G8SyDHAzl s=ҶHBul&=;04$(Bq(h4z4],AV:}bA4=$Ywhw$ ݈t2kKrZ}$ۻG8!\^'`v$|[rfuK \hF 4>`>u4˅$mN93O,Q0dV8=eoԆ!gF#pvwm]sxMi352vrcH8AR$PLCRi}TY Ii,"!='dn~vۢ{dZFltݐGcuyL07F,&a￿A27E"`ai,Xj,NDQ`T&$576gɄJ4"O+dL !C*Ic1M&G{i$F\(AEb2k*5ϗhwEa|R\|;{<E/Q$!)2*2" #K 7vI>{_si~?oox+Ơ8[, I%GB+Iέ{^"_H;Ed<4 UZ&O^<i#˫9=?n:)k,DA@zή:,+M照/VL} gh{]4"_?B'g I}'k ݐTb[@PQełA6.2U%5芆d J.QH)tkZŞKqfxfd[Aa[g(*|#)}9:hN^̥=b*ebu*>XZfyw8vͭ#bf I1" H":G>jMbu4mlcCr FY:Z jjzL%n*HB KE f\2t< tUA4w8t"d!p5C Kds_;ؖLG/S/5~&TW^eh<{uu[r$O+xo,ciqC,+q)\\rj*S)bL ^ݚMҐ?"P0FM>%$`t ^$ aH?(Eee;(`hd2YRq yK }:*VWyp"Z [lucc씻,-Lt:+k(V*Ի{Egtmo"6as|SXˀy`v\r&MlZ4 c1<7/rT3g.Vǃ-ݛ+VV1D(j6Eb,&Tj5ڝrś7 ̓WH l4($yilw:nnCW,Fh:T(ȺZ,>,_'}pm# CNxOfa~^y[w(~Sϱ6sܺW[㜻pJRH2|nN8a䰱CLɥ$xdmn S)6H`ҷBEP|p5!B4]Hz^{4(OL&Ax [c4{;V&pnݭ[= t3F6Px6=7$nB2g빤 b:LJ NTh |&)2i4X."T,:J1H'$VY=5psF5iSO=n z?W*c_/{wo_m7:0ѩR[oW^I%bjvjMF2ť ;׷xs}}޼SODbV|)[8^ȯ}4G|;o2~5-ϲWli'|J-DzN#e~~~\B!͠(!{myq$bc"7odș`SqzŅenߦ}UuϏ%g `͚fLEQ ѲŒ!PэUxn@C⃍T$ CGLSy㭻 +W ~;%UΟ? v,"t>#d/[]^xQsu]^3wncWYZ1(6@aH&.TEF%TEs]C Et{ >1fyw);zS-; l;勜YN1W LOgʦxL WQlMh:-+B"] !%ulAIg̍'[;Y*PkZcm2E%H1Ya&bF QO⹋sڶ=1 яHT,9?3xڬ~cEDBQT_EZRZE.?+u>3\qEyqsVAj̓ȥ4^~>͆EoGS! gOG(<'M0m*ՖK~FȊ@U%$8鄠 R.<OPc C4FlYG40QTEHudIM\xG_"K'9,Qkָs ONWOW:/|׮^ϧ_xsǗm>%=7t\Z :n@$D^~WuM$} ?N+ C ilFc` " Y##TUa::RSZT.C)U#  ܀tB%eǓ ɼt=k[l CAA=t%Dnhc1z-HF+0<6}͏x??7)3~*W/VQq|H$ qo}G4}n/Gk"_/P6)dCy r?roSy * r_yz65Yă7yP#Lꂁe d' ib  X,%0iH%SNsfgƹ5<ϦXs}/]F ʥ~[|s1JwgG.05/aY{08q{s<鼉Hxb\DCbxTk=-zcec E#=+!ˣ1"C` ~80"i((#U`zN0WQ<:b823C\mPuhzt:61]al Ynr=ˆ t{}޿WνCfY08ӓG) XSv>!`*1ftV@ԙ/OX?!zIh4!1yPM(bLLaT-I-p`RDEXNt>={|}~LFw^H(d;hO\ճzGf|6'|2߽A?$dƶr JtD:siiRi:?r|2ALdgR+!p1 ;d"qT37"t\VeL8H VCSVp`y>ǝXMLJ:! Y@"rB1z2t`:BEVتb,e}ꖋFT.UC r\ #°cn\!N:iwjTVEŸ }NNras?MNDjm>$Q`kc 8*6;0=9gVx)nݹCa}wַy;qmVE,+Lht精?I?Px<`c,TjXgw[0=n0L|.KաRk3xFErIrsD\N\feuc+t:-z}|a EU}t[M^}&fRnȍ7W/8TU+llk3' )fnJ&8!mTBw1OPd *E!"Qj8nHT@"F<|FG I Aba(H&ϕ +h8AlnaH=`vjY4=3)KߩIkjܼ{0z ^ Rd*-K=&r n4 D]BL yC\QЂG63I*FLc"g:~0&T} SD IS20leH14E+' XD!.mHLC i ȗ.? l_6c||ZLTv*ǯJLnl|a]Ξ9E3DܸqT&S'y <|s cxaRv?;˹q܀,lwh,L$Yl3;#R/Qov! 3219,3(Z1\rF& !q>BcO=LZCW6ݶE*׷Y!h4;#4=jǦVz:XȋޡBP98kk|  ѤxdzIuJlt) IcD~D0щ2ˍ0јs d*)1MPxd>Y1#ٓDMk"/| &;D>R8PSrm~zQN&J60=5Xv|]EId1Hd)޳(\\>`h R(Q"YH4:*"$eCf2&}l7BSd4YE%,LM %qK 9*} !]%%b_u??'~ Buy*FlKHgmHO~L|ϱۇaHx[gnf 8yħɤc^ ?Ienn^ DLNhQ^ߥTvbeߢX*1]Rk& ]'3;D)Ȫıi^| JLXj0 \!lhwlXlų'zm} "b1Zӡ;G?BS$wXnDd:c824SScaݣ K$1 c TJ4~٩a2FE.⽻Z%1CZC$E!Ab|Rܡoƕ CbR21]]Qp֠~K&%#0rA"P@~Ȥ T `) BO\5&2q5kG%(HHj0*|W_7^N =s' ' ;&ՖM*j /H&@H^{ǟ8FzQ`f:)ew6YOb Pțs1̘DR!BiH'B l&x! _ϰ*29l!k Vo@\/ GlF#Әg{f躊, GF9Ξ^҅%*7o=~^+|'_`wy>iz.{-LWZL _4[{,/q:L.p 7߿D`2O*>;;5&3*{Ĵ)39axL EDt?B !FL h[>, 4U#bSQe@ 01سTCP&N3[/]{8sg (Ȏ-ga JA _ŵ;k y3&鸎4H:|U־uuwth HYǖd5ei+̱GaG#YBPRI轫=+r{G +}}^yL(A>nPPH $c2˥ 2ޘgN33F!lU$b2*3 HnDP5x1IQ\q͊IYݩm? {n޽#*xO|sS^|EriWnD)%O<Ĉs.^8,r1.]n:|"XZZP7?:u^͉?q??wAzds)$E808#S|!(fb4yabB&`cg>{M{,VG&rk}Wb:.͖ErI%tܷ2?c`my$CGfQ}3# nR?uWflme=4F^2^C2e.u3H1$Si@ݪE%V7;;VXH"C(dMk*SjRDQI4Z>noCq݈xL!WH8^@tʹGHst J*ՆfY[_B|Qޢ<gYZݤrgD{d:&M-.CI%@< )BFxʅCkwd/#Qe& N@ EU8`8e0YH!TM"6$ww ' Yޱѐ)$4fT:7MGct-.SItTR$uSD!gJaq]uQeZKö*ToT4hHe8OlUmB?ИAHA4=ߺ~UEՓ^v.{fz,>>Ǚ=|Èr 8=!H'B |ZcEI%d )NbY>t-t\!wl;孻m:` b9!15B Vjn!F'Wf B̐awnlV803Efqh@QLTlU:LNr{~8 jXERkz^ַk\/3ZȡpIRNȥbcqf#93 $LBW)U:d:d pD $ d5&JB$+$ >AB !T$Ax!HN#e~! R(mwvۇn~R76~b,ܹU" vHpIVrK>_E2&16:D*?T%>_o*/rB.FLXXXd}?a<9Å O` X[ׯR]{Lj3Dxħ?G>F&hKW._y768|pnlE*Avױun1ZMS=|INRqJ;rYBUxh6h5AbHDz.ߦ^oQbtlG@!E1`j,h^'K4U U%I2=g(#@ZfdR,$H(a(TLtP5LLPڳ ޞ)^Dk2B(UO[J o$Yf}Nt9͑EZ6]W"HHfnmSE- E+YA!Hż4S)f'SL01&#,b;&9?Dn[lGPmџ\ԈA4Fץa"=0JYD$Ub`qcib9!JʑORiFVί;{9n0=8%zQoHCiPX\եesD>S?1MOÍ+ Ӭ,/01Zk0 EU@dj*2:kz$ӱ>3:&׸u{S'cYz*"ꨚN26h$)^|u=̭2m%H&vG ՎV̪DD"K1 Q54 &qFtm>0ildUWwp#P/L\%ȲCdIfsM*NJZ!v*M>L*7^Lu..sd& zN>74Tl ah$:A8;s56{ c i\OJ4,\|Yf:^%"Hf}1TVrPԐr%X)[A!ӱ\}k "Cy $ Eû?j4!i=tapϭGT}6.aߵgn/-3D E!Blt[4}`FHv7*UL~>.un!)JO2Tpeʥkŷ^&6> s}Uֹr[hz^ufMv*Vet$A6cie&ǁSLM:}XERSׯė7緘/ +2JA'dt]C=B!82pY/5*IdboXL 'H$44& #l'tI fr dc,rxx;5\'v=m H2qM워|{6ٔDҎ(<0eq@^Arht= ^`:2=upZ;٤>ph?/\GˡOamwƅY(w [ǃWԯ?\y&tbhQ77h^(3L s<ޏ`ARXs$K[TA6޲IG4]~?LKYl-H"3bxx?/z~Q$=v}`~ƈVZy?punAdY"3Ir2f#ZA29=yi4`ksEc(BU@Sd2aFG֛W|Io3<2d/_brrյMd%B*꘼~yt!׮͑Mőڎ6tt{/]j3=9đÓ@1OǴ@(P%6]⺎J^23b$ ]WX4Zyї~H"BBH`BR1VbءqbLp8G>]6J^MD9FItEÌ[(qI$I"ɥ *GtmR,dG$.KM7@H>aGL뒈I$Ъ +MFk)F$*h(Zfg3pUrl*7n*Ayni'z=O^?=(To@"$[mM.U'ΊȐŢu%& [oފVwiµ=FF7b2&7W \߫.Jt&Ɨx1Vd&](bff:T^zuv+FUT\8X IDATB$Ŵǣ벱]% c;AI#z7.S5PU]L\&E<.Z#JN[Y\\dsR"[kW`&'LC!+nȁzݟ귚.D5:;%4,P˴ɧTZ Ȳ՛ۤxIoLN7 KTAqܐa*^(Cu2F^c:GpX^_ >fFRd H ӣavqC خXBL5D?ѩc9lLJ;4Y%T,]QBA(K2zKH+{c\_gHk +T}YZ,9$ D2 ulz>|\,Ksh{~ƅ9B vC o7]\)kQC dEzhRrGN!V1MqSv۱f TMֲ1MGG_=m gW(u[oo!K2vk7V8rhfCz Kud9@={f#WUY2i, ]"?)dbH(|~Y<տd%s{ş"9w"miyx28&^8P(rYP,&0TKk A.kNd b#CI13cz2C!k`.h(ڜ9ZDU:' e&ȦebB2O`(!sC$ f@ tM 2nlbJ * ' 0VˢV06SڭtAH";:' g]FT%(gx2 w,J'W,sK<410e0dm1P0MTM#1TLSJS,$06=F.-3=gh0E>@ҳBC"v*W><$BD Ĉi}P>AEB6<=TB!"LG*gtT$P qݾVmQZLfc, :h!N&3=1X!cl- J*.Ȧur ,m6&faѲ\v;阊 v.*)!Qnz|{.s-qqD!aʂ]@A ]dYn sx>lcfb"[o\{]1a<{D@^GOJw{ǒr -b}gN MN[] iF'&'bL簺=n͕,ryߵ{٣g{"1R1 Eyz.N!p]ףѲ)uz q`*vJ?l{_R1r C"gADqRDBSpMA$ \/Bdv-ʕ6ɘL*22d2s5-VykJ5[m_ l}ERTlksQ8ouz=˲kM"Hty&F 22\IJ\<Eѡc[&M*IπQCڮDߗzdu; qf 96KFh*Z fmʡLLgfWVw{fi8rdVO};Nik۩G@!kE~CMV'?%!s]KMt#g Kbqx|ڭ6K L&tQ?~:8`}m[7nc?2:cz H}E5W,,Əy$K+++rx:< C"ʰ+0-04#384qC\AXf+, MTCQT?nv=ݫRH>"r|w:t.ݞvE04ID!4ZЮ'D@D6.q"n`Z""0=B<#i ߏGyADB p>H,LfFB2}aDG "ƦXۭslju81#S"p:*-J #*. Q(>C&R[}t:j< Gf:zk|1>?7 ISô|ߣZ}ǐ*BH9[5ɹ'.bw]$١k Xۍk.URYA~ҏ$ j p?x҉$C D ,яW>i# ]EUHv\:>^OfJd0 BM)4HNҰ*Q%j%ek;mCU"J!" t]&8^"HP0tIxLFQ$L7lV08nD^𝐄1<8fx ΫoO3qxj.'O灣ԫ57Ix6i\mֺ|AM; KɼHJĐ[,ϒ}Qun,lu"2039ݏ8.KkA:v ,tFx4>K4dIc&kk_.­T5чϲSbdxZI+_}/Z-v{ALMpTаz.&YY\$BtMffdAJ+sN'5,Qo~"BIF!tiKdfXcdv,Fz"HT-Tܹk_F\F JLv/| EI3+6z,eOSjPk3S]7J&(7l]r͊I "̮KnQmx? Y@d<7=B#Jql_9b]88{a;#'9<=ʑaG \8QB[D:6c1ұ~ЊIdrFB4EO{]ʍ.9hj@2A͎O!nG"4IFA2JPADPحw @dHB$?TbIt, H5t`z ž8JG1Fx.dnh"[\`1X/E(d(Kws 5&"Q֖V{/'M}K7ŵ]7"n(f3cex ΥKnWzZm AA@*pqNRי'cm @%J]"y}\|o^ 8~0^;- 'PjH$8po]ߺDqp t8ziUKϽ8ss Xy'}ԫ{4;.[k׈E<}OyOBfT* v-v0Pt\ʵ#M`(!+ĴcVn0J& -CI'5\/1mOe4E;_({!q!N8LEWRHz*1]osγ!%NO봥 M)RDL$ TLf(EZӦ$>4=\vk.ەw;t84&Ґ5OU%^HtpH #Z\!Wpv$A !Cy&N T@34b˫U,һpa-[ؾN|.makH^1Ư/.Wv^7y@:s7Lb^]K{v%3#ݮ8y$y.ssi'X^֝u=f Lo%<(CUUx\~Vtq= !ݸK\W9uG!ӰLuvw& C$;o#\|%>0IW_{}hT&:=G0ԈoH| BDNTwI2+,/(﬑/H8|~ ]CMV#10bU IH34&c#y z Qtzۚ% RZ]0PT CS$t PQ ndyEw N&sKۜ=wW$$^&s|G8uCn0 i51.]ǹsXVl>Oeym\.Li4hJTAl6i6[O;,np|t2mo0IMr`8=]$ '7nF6٭])H$Y,jxBVP8J:jMzۥ grɧikGĴ,"pR4}=VK6ն"?'1Б4qYTj*B `|Pzo-5X߶(:t{iH)hb*#9.[.fN0=bj$f(/ldՐIj@Cp D$\k6X+w?O<7k;cj^4ǿ7v%7.1Z1{nHܞ[`uG?tg<×|4^81"/v#G,|/ĶܾqT2M6gxhN?JPfj?Kei9*8G|m WЍ8=AQʻ Z u ]퇂Jw(cIB%PPiX<Ü| 뫴5^| <?G62Xvb4ZKf? mEs?@k: u* 2D*0?rl-ITJ'ɦ 4E4tE%Ҙa|*m {a &S6eC",\@"gwW+䓺}cU}wEߗ߀q̙Ӄ!~snK=L$0doGp&~(F!e*|[*wЍ\ciu wja^x*]\7@r)Nn_7wC-L&AClۢR00M=b.ΣYi4utFi"RW/~B..믿α%-h5v@uswuΝ>&/>w 9Oߤ[7i6~3'fwp5iz :^? >!=ô C0r69C { TM#&H )2ǵMdL%P ipƳ|էs%^5**?`zG[I⍳Ldvj:ضG\h n\{Nsw["&Sgxzoٻ,X3G7- Eu} EdY$CC O4Uw<2 YI&9QED٪ 8>"JHD)'2$LL!RHoj"#LgHdUXkxeeM6޻ _SnOE_ /ܺBD:榢7Ȓ tZ-MBPToUyVSt=dtfC`ٴ& k$S*PT >Z i4p=ugbLYt;M6@٩q޿8>N2Z&7 \p-'ΝPǦ9sG{{WxuVljTx_zمc>ql;`j",pKtOLSQB-\F2L(!42Ʉ6\+&U4U!%{ENo<p tɦ4$I0|T~~_3_-yoRhrIG|pF:"qtj,-™L.p%6HE~ M Hy/|ͩ['hn0zsqD63I\/`bz4È0Ev|\F%_H0^9.uha@<>;>\_W)$UΟs9Iݽ >[ah0}RB2&ɏw]āO ~ T? ~Ͻj띿EE! !HcwL$UR21l}z{z"WQ5 Q8 I%,L*K/2C<P,g n|>׮eGlqz]fsS%n{t6Y>5GduX]'ϿL U4iT+Nfi4:,-̲8?'w{}~ l  ?N~iaj= `*GdiX-X6G U@UUǧX,5N5% Oflr4-=$ \?=Mc|b/gd{g^d)&Gz^ujX`ҩR7\u88lII5ӵђB.9 g`E{>~$rz.mhHA2QgQbq*`*! }˥29X&ҳW/IB9U:jud* jrICHB)NI"y@Zǰh,ttm UĽzҏO/C@8qjij^Ϙ,Ri|89% ]⒰pL (R8^y "&\?X~DxI ,ixL\ΓNf2h87q2׮|'OKb]r4[|;Biҩ4Z\!4{cbbVX(!|627FWrPbX&nWRo`:Úl./\#ЏU8:像6̳Pq&WI5* XO`.Ű}|E"I }__Sp\KǗ6cyT@_?z=5F;oOLw_TlRcwvWP7q=SeRO>v46iƏed9rvq@PT&&KE, h[<ڬ<裤K,>w޸I6;5o~jJfZbnvMV /)mE(F{$3s iR~CjQ}NHvd; = Nb!cDO堪""Rɤ3,-p&=ݧTJtP$z^k4Sw;=VEMX&jN'D&4w>^m{B&l;-fцf$k[[ēIaff f# M8u$ef8gO{P9< eZh1UH~"Gs}0H'S!Ʒt dɩ2FVӮsT bEA[$Si&";SWNaz}QV]8_xyJ>;VLNOc޸ˣ-cmv$fE'(bSXS7h6ZTm^t*A/sM1?ѣut;K #I"A0 N@,6) cWwÛiq#<\%j5ɕʘOQa}+*{G_$98f砅S!Q Zlw'X!t (I J2&"G>R*M3CF ޽sH2PC=49"_}}QH'UD'E?Y2Yx0h]lB #j-t{6,S9ʥBг>%$-( -xBfvo@W(Pm4QA qoecu}6Bwh0 *g dGf=N-`.3gc ZHg\"|^\Nvan$A?6 1n`>3=dQ@SERqP otb>4l6vtLF](dؾm::b&gjuqlţ.A 077(f4lxw|6SO|p:h0טɐ8҉<ѓ+I2'4xQm!M3W_}|* 8U)tmON_eS XXg}kJIfos.qq$!C QB%yfӧN?!&b10pID2N.;7Q5RHJT Bȋ wrحFx LOfq/r FF #9*H0:*bG+MuB1 gE[ G7pz$:봚bZ!e3-޿2j7f󧧹sw|:('Mbzq&'(R1XɓplQpI"3 *ӓ%6xB,k R)V !;l 7"H(!=Åp=t# 4G ,Nfh5:5bZAP $\OoIĐ!1Yn9t]zDvYczr^֣CrkCTi&Ne(ehbW3Y0MBbJDpa|y<%Rv?G)O+*h|rDHOOE]~]uƧIPpa gĈ^C^ |"\?ݯsSV7xGg|<}]IϖY:y}z| U{..cz]VS,Nu>7W;w]0`fa]ﲳWgxb(pw}( ذj7,$dHfF*D4U! C:NjKQohq2.~Ǩ2}XP(|QyI+R0:1E,:`sdWarӪwzd~nG{nwE!RPLBh-ZmJ˃HSvq0h4;?s_xf1ACl7"y#qHZ ZmCuqvE%l'TL0;rgA!OHR{pF4< MIPٔs a3;MkTOPO ? ?=oo1w0?׶L&G%TBK/ēs{U)n~X_Ǭw^c͕kKs.ծE,ΏRxz;ӣt^l'$`v2Dg$XZTeL2 ,b@03ѱh=# hŅ%g8qbť<>|xn3::B<6LFxȒDܻ9D~Kԛ: F&=%ws"֣A.Ch8C<.Xb8c9J8(OZ+ ۷bdi-׿@17v跻Fkd-UHcb|t1ÿ7oxSe}]䘆 Ej4mei~C=UQ(ZLaKt*aaKx$*kLOObj*}+ēiΜZ |1DT0w&2=3o}ȫ>O2ƛës¥ gxgyS^m_}nhY^\frrO+R. -ίg:"_yJI׎mtJejM D84tNӦZ(U.!"ˤ1$ jiwhrD2BEb(JDaCIʌ.Po PΪsc-ɑ匊 hu<Tj]"(:=$UavNdTMZ6|(lF T8l}J Oz|gD(g4QP& Y[[nY嗾,lI(diI4}F)28n@?C8PoY<6,-͡h #A!?Gr"A$+'_[uΜ;I;ܼ,ǖ&ڼwxAs{&rL:pn̙" (W>>G f h6؎O\l@L5y37TEd2NűT%#c1j>y2_~)V )gO0:^t$tdcgjCӹzvNj-c1oQfaft蝐3g2=Q#TҨϓ' d24=#ư7P5h E11z&CBAÆc ;""2sԱC 8XH1bb4OZest2Xb6A!.`Y'RLyx%gT 4mcDF1n9X NXBZ#ZgŎZ})Ÿv ?aggMdǛr݇{tё-99ds)$Y4-2I`iq(2U;<>,Lq>t(tq1U#Zo0?J*)8 YCW~K67g_|%pl"Ώo[>2?ƒǻd5/%&wRk:㋟{r\ĥO<:ӨqG5 Vt#Y>( *1E0L!r\Ew"R* :#pQ+"[;4Z= 'ɦ^>9ff'< IDATSHi֐TFD4 s'_<σpEF!F=ﲻ[ޣ]$5"z/}Oc}s?ogoGylGM}==2'O }HLtt)ږZ X8(I I yg,{R 9THav(c1xqFU;?DYQ$"TYd$DZa &cB vt|[G%\?4d\#qr!}L7AmRISIiPvM9 M5aR9| g?! ƅdc$ e b~fl&yaCE9lӅ0w}]I \b_u\HDUDAwmt]' .,ͷnzm&iGK.u)puuz&c~tumfDL<0y<9~|GɗJ\YH#&<<`㨅$, rnM%-̏$X۩Qk9 "ȥB7HlFo@g# WlQ,qEUd R DY(% tlqQ>Ӥ~Õ|tְμ HUVd2{GSqdE²-v}?ykggd}눛wL ^YnsK΢VWhu\?ڠzdyn ]w0?ʳOѭivm\d$I}=ˆKY9u>r9ybn:m$!"'4xw㺴:.;=3Sdĕ,L* BrZ%@"lGDTv~feaH$8nNG<Nj"qzw dlJ!)xV@. 2YrGM& O6!Dv/Od>mig|?x?_msryQ(fU6vZ̏\Ƶ |7 \|S |p[w7ЭןZ}O3@%K37]bder3IF *)mXPH&b xFCt aZ"DF6W"$qgXA:|"ǗNo&MV,^0L;Ϝ2Z÷z$/>1CY;۸kϞe(wV\+y4;$Wcai\ZpQץrDU's4,cS%0dn 9&4cq6#$dagMSH$_rwJ,Q^̕#Fu@$ =a[ҳl췈dH We0 CtgHR dQ$UQDZ}3K $MDN+D; Bbj*)H8_b_`KIyvKh{XV ylC?`{z-W\,S\.(ύLG5G 1MSlsg[+͇VyǗf2;Biѱ_*l -R)G6]^}$X-ٷ?qKH&y#p,D[c(,ΞT,_ɔBO'P4IYRHgIj-[J$2JHh1N.Fdf@&gaf '&8}b px:7/ci4grEYSyPB NP)'筷Q(3Z_.^xYFԚ5VM癟ةc 5,3bÏű6i5[lsgGd1N5+UR\=c;K nXBv]|:D>I!ᙋsFݦqQlfek{~|+2UNMb*D1xv?2 n5Lr^(a$N̍dXuiUDM(Hai{Ftjn O ' Y> 0JɿmҹYerBd{9vt1 Rg^d\?pܩj%sqDz(K/<vT2~wMcW=G[lKKc٤±i4٦׮09^߭#Dk+Tmn֙,T=41g1۫|pjZI1*>VQ4R!mzvgI$LMO$}#z7`~* 4d\!*O 8W/e-p}un~ xS\r'/_b~f+WQ,dx s3$)%v&8dc{E{myNeY]ăGm5>_}2dğmGx t]Vܸ|Ky}6Lev8}8Vn`! "G-Rrdb 5]L' ?,FP$ v4$E =gn(LN$93otBDBeb{G ;5ΞF zO{DӲy+|_\<ܳ4[׿{7?D C$%I eaeلã= Wx,ϤuQ(8=ez/_b,תt-jO1|OC'€(36Qa$b "Q݁-'f`@Wl$>FϷɦc,Z"S;c9]GS"ڭ$P.Qa099ƭ0. So69hKǖ.rmk:/"ٴ3e8^ RQ Hj2wtI YHĕaA\Ex(L>$-IQAIh9QS'J "AYknp t q-8?Dtd2J^D.Iix2٤D1"ש׻1JMsar)2A"DF" ^xy-Q#IM+Hn%ÇT[6=}wl) 1 ZmȲLLN&'گI&pl&qpT1瞿{kMomd)ӵ|Beq"G:5;=ˣѷq| ?iT::eO$٬% 869;>2Hɱ8M."T&# DIbml~ax*XvHmggrli޿wtR}iO2b@g*,)mV}W/d3٩FML '鰰4C,N;G קVI%QsWNanb$˯3{|UwWa 4Hq$FFҌf B }F3h3#B(ͦi]u>2|ܸCt ꦴ&?2"_DwDQ|x$u^zYNZӟx˯r}&ia:#Ξ;]d|{oajj*& 3s(FI(imk,NoPGJc07ns?l8!%R氻G,,3;;]'@St:mfGWJF!t~EQ,@D1{>̘ī?I裩2q .a F>צTs]>gv3tIDAUU0:Ky&b(v|z!)ӓ4Z._:ϥ']޾̧_8M%=$B=Vv^zi#"agNr{e/1n0˫>SV #yT2 ~HQdjgsvH#^$&jyw?Sݽ]Dpl.lR- <KKTfuCJOLs_m2Vob6 h*xGV@Vdn^%qMv[ID?5>9{3~`j`e2ԫyB?@3LM*:! GgOWm~*iѵT]?x3|4q!8Qtj9hWueJY)x~@FTQE dEU2*y"UCa~k[2/4LM!S( 1 KMS "*[=&+\w,lh*! ~D%2V6s>RhBz{8$45RV|} e1l+[~EEX0 :}խc}2 y/ Ð?cc@R]zk45Ypji8 Y]ߦ׊.XG.35^cڌJu* 'O_.a;wt:U.N̳roM0;3JHgiA' 6+{8(Ԫ9 VF%d9%Nqh;D)XB>xxBƐ:ZG.B{Q(Z_ "Q+ JCj^E;TtDBg`_r?s"p!c2Kҵu=v67#C4BVKyvYJ9I9h1 :8NNQsm\>O6kqp8d;Gy 8nTkyELcZ {-t1OۋhvDFLR̐ϘE%03RA<{F>QAN)$ DQ E@s ℣^@TKu:;*F8I( x-yuv); ݦC¥yT֑A;ZTHE!fF rf2A̓!hirȺ呩6{D& BZPe9MS,W;XD8ݐXvKIs.;ۻ}| Q(ݽ.|e:M>_ HeDh4R)σ;vl&c,nqll޻tzL6O!o"k)A7 R|Vףw13g%żI.cPXVͲtbdU,QDA™S_?N`X,;w~s lȌuj"j3M׾k7 E:AM},C%Ns5.M4Aĉ9 ĉ%.?>tbg.n%&5S|8s)nAύi R4Øɉ2u 2,(ky T#!b4 ckoH=20-*q1"8J׍iBn|1&y*xqR(;Ty2εd,!X7h=)$SI0T?T*%!c] IDAT zIHAL1gZ|DX;dhצyG#<cơnݣ{L2@JTHwX--mo]E3t6z >s՗Yɗ@$޹}҉yS|Ym>**Jsg[/FR(*xNi&Q8"%IGb,hwXKEȚ SS c OHIJ)SIfvv]Sq NhBDN3) CN )i2aaJ)K'py=Z>ik1A4FHh8& }vBƄdW&Y#&f^4X[]^@7-Vy+@ #4M/eE MՑHH #D1 ۵ B޹"g*$D) '$q JH?D=GJD=Oy-}oSˆ׹t-a,yz)Oُ5'h5g >Soo]EuSHe#'OO`\M0 ~u|9GZ ASU4AFaȂR1afU0D24}4%a` dtT@.3 L[^!4,S%oHJAIsbA"!NEL]F H=]7 8:85qL6tO]±;p萱drppxxϵ9H\qEavOX[7YiȒ ePU% en%kia*R&\~Xy++ER8z)Ʉ:EK%IPZ.ei*ClxCWopc  KW9hX`c/ |:u:} M="UU0(,Vz,\j9K.i:(0TKa9 ~}IG:ZN1eWkLl2|^^^?:_֫j*RQIRpIjed ~xL`S*aE誊&O +Ww8D4$BtdY #0 M$. 8DQd0iߓI") 2&L$$+`*ii`鮇L2ɐXQT gOq}IΜ+dY{d^! Pv@Hs`j2G߹dj&KޏX[kP/5?^Jlɞn}|c?1 ? ,ı_ MX1+kL;lsD^P(m0Kys\B R+~m~M#I0դo. Za{[$fY:6"(JcPQe8Iu$!as+)3=.sDd gm \6ij΀FRG?<ʵ뫔&Iö`#@4 O)tL]&1ƑM&aLZ!^)EtIߋ™sK dng]Z?x#˥ 6d2V $4 t$ =;s4iF) Bjxc;jv vz$qt6_x,CyW@*8F^ɵ#4UgONb<0R$pB$)bc3Y IR\8G4,/3}nL %%$e =OX"\vR Irƨ4H|?u]%MGvqi:kkiw F "6BJB`lv$ n#L"W~x6+U@ 45xĜOO !3e`hvT (28!,:Hi{h-40B!t(Jh6$xfh7>?'5ַ:!)cfks Q ٥)N׹xjs'gQT7`c^y۫pb$j 882&fg0Q7nSEf&\p]$L9qLb#v2"F$')>*@D1~ xb@WtYFEW Y2;Z)1)R&2&ԫy.]" % qրfq#rYCCH ,1dwNs@ ,p$P̛LLNJ Ä0UV\=O.Wt#?yĭ?wNc#6Ǟ'Ǿ'{fqzo*9׮nՂIAXvӟ}Y^r[8!~r&W//gWO}& 8J/s-A Z CPN&fIVuv"a@6R,Z.D1i1"z!q $,Ixh 63p]a+w|} AwcNA#.ңPmVW8_~yMQ*$ E h#%o}j~ uZ{Nao}lR)g j~%V6%2tXJUw bbAeh8>Ab u{h i`࣫ 7!%ȊL>k$!IHDahB&XAʅH"i^xE~Fc/˯|~3,pUV6#'C0V=nRԸ}.Mt:}#N-LOqgUgFD's \4 (c?k~HÁ,z"2aa2ǐDaB{I"HTN0 q"w~ 7ޢqXϿW?׏8! ^+llƛobZ&^^`hac4l2V;`J*Uȇp}ir _ssk5fI"E3 ]'bI, DEհ&,XdkAȌr.,'V6YH€.BQ"1$qwyU['r*v99$ֻ̮zan~C'n@^Vaʹe{ԣU15EUZ:.HS P Cb(24E`!c20ߛ\G7g]w$ (*k:REd+մqq$^rS]f>|o.?`\e|Bݢk l X SRfgꔋ*$!`iqq <^ { 7ur9OPu P0t Yضp1:zxt$IJŨH-6ϒϛ,.xs5~g^{/5A 4OroBx8sscL|/^ej>}yvmVzK:˛77pd4t(%\_B5Tidf7DQ:KS,AVba~C;$}d9%cOs(LȚ  Eٿ#8Pw?$u (16͖(RJJ9tCd`Sϟe71Z6+"A!?=MY.弁"K' o9ݏ鼽>;lc7CmG~3?% ^?/|쥳 /=Ʊ釯iu/툻-xvG^kr).Zo1V.:<](BdL$_xͶx mUxnJ$EVU$FOes琹1n%(oF,spاQU8IEi4OtM"(,!4uDB*!!s&cwXVru䔌!I^rOw^]+k =O1*i82DXȔXg.ʉv6f +c`ʎ*Xvhda3HR Ϗhveb'MUtr1HRLL:ÈLFqr$$ɨ##HY{賻璤 I͘Tխ> a/d/d(@QJ̍癪꣙*|,-'D:?n͓Odgc{K&L0P )d,\'|o\ K xems{8bcC=G8 IDAT<4|?{ֽdaiVihܹ&fgK^9/̩*Wnzu<W" '9sfnݍCB@&u{v9c;!!1I 0=tч|2`zv 7d}}'Lim,C2G 84EEZ!1Bn J0?A&F=| cn^#8N`L.!%ʕbw,[CV%Ne!n0SOcc??I>IFmx)ܹ ops*y\}4>g V^JHȊ=$1bڣ:_Uh OdR"Mcmpa ɚ*KC#,]|'UPgΔQd+GmLU YBNghk[M޸D-dqo\> i#!3c=RѵCyom"G^B\8w2`ӌQc? wl,8?>C;nN7Dk35Y_oxY|Oq.a(~S;6Ԍ'q,NQ.ܸʛ7ݐP,)+kti:ӓaB`3 ddMе앦 ,N199{Z}O6NߙFr%EqEKU2Fw  H^yec=H$"%l>{{ɋ3V%Q><ϷضICdi EE$l6KAI^b<Li$ k 9UVY85.Zh4!r]^} F'(u} 65z=Z+_~;{$Y8͵+u ?e ]㽛x>6i"~Ra`9;q𣀤.$! !P l9hP40ht14ٙ /?|G {W:ýj.g f5>ܮp(;0GԚQ sO"$ jOu'QzO'y{X?'PW/{t1Ch4{|[J-_HF³6X^Y_^GtB uޥ3, SE"?T*QmAH࣪D3YtE"OhxDoiM:z}Nϧ39*q,/8)wH&U ]FD/s]U&J=!{Og?sFͯ}un߾ids#XI*lLb*D͏o>`lȕ瞡xs(v^FCR[L;(Ld H|nVvu&y}v'XxYO?Ó?g/?מciaFP%1z|,3Qt7w[XX.*G:tms+3\J1m`V#e,.LQ4M+m " v4~ Q=AW -jF"餈 ]q{TkGGMַ*Zd:񘌦A1]% l36[*.^<盨DdljY֐塅wE{;]ڭ. Z|2*kpf!XZ&4[Ȓmu}΀C<ϡjGmW]µzI'LDZb`Ȅi7↌8 =Q݀À qNLIh@:V0 |Ad"sTѳ P/CL'"lg|dHnjDzZc5p) iԈ0H\XCC~ P43y6+g3׸ U/&٩fvӊ8=j0M`*Mu\={RSif4?%fqBOvz Hpp\z˫ӂ9tC7vݐѴ̩qjM&T 67:/=,.-#K!$~qTE (ݾOFSDdE$P] [_cltV_/i[d cTxȈF6bvϼp;6|__bqa癝cqife!HG ;5mM\)45 ȥdqPE|P-7Y;_}mMr Z;ܨLQvohB"K$P9c2 mg& dI@aց4Cw݀n_|\Rc G']D4Ev@ D{4:"$!ltC=o9HiLcQd(bE2lã2fŒ\~ț7xJ.wXL> N6S@$`-;v?ǻ২~Z 8)_/xI88:`uoN( 흲`R=k;8<:o-|rwD|[0=c~2q4J_x n6ܯw=-Hj)$2ㄡO.3tu]VGQ5(f,-8,TŀB. 籹qϱz?%Wi6hhc[}>"\g {wpf$(xu(*F~eJJ̓ Vuwc>`wWZPmlΜ^!K(W+Pw>v\Z qme)ѥc`HCAAqA,.N!5gpˆNBݎ"ȒDUQ(l.h4݁XQ6tMjcb$F,.LMt-k &Ɗ:q^IqOG\].C|A% lW851Q0|%fϧ8옾:+cBght$a9<<+H X0=9k;_jq8VfB% {PUWWyedqh]jY{xL=`\>wH]t!V5n<{ IH7_W>K(FH$2ܸq/u@EQ$ |b1!t;tm7d2;.r}Hk#"L"J#YsУ7Xssͭ]+3>Y f ED*F(DbV,#"*ői^#)A{}  F>D )!YI%T@@QE2mݵ".epl Ypv'Hȉ6OVf}qɤp8*@PB2eC 1ɥ`LnY1nע, C w-T'M3 +TˇT_ڵddn~2R(M<@jݾtIQeZ!8=ȵFV'ىxov~~§|_dN$VntB ~>) #lRv B 6iv].kݝcA| բhs<{<(}ԡ$SELLj D#K"2q9dIƴ}Э+\#uΠ B&clu)H$ +%61# o 2gϟFd:C*hd!!G5J(~6$ZQ4R:)]eԤ ,-1]QTR̊ IpG$bC4dRIdLF:털^0 (0 T\D]vOh!IV1ug'H*}|4}J&ȧf2G-ũKSIfF҄:2|;w=ױ~xw'mTW>svb2 N.L_YsRn n>c/TJw&&FsHD8~ +\8bj&'l씐oR,N9<,O BAݱE'αX O Vߡ鲳hlc:jd:(* (͏#C ]"ʕfb<>q YR3+sT+5T4',ΏJ!Π"7:DOQvYEUKܼWv#&&$cGuD6fbcv"G$c*8Ni;t#pIeDQx`C 2Q0;ppQ/E85':B(`!& :6$N +4=CS%RIQfƒhI@BX\XiҺHL1n\\"h; q3i{.)W V 4Ef6`#S퀯xXJqTw)5z?x`?v{Ϭ.`s|ߟ^˦E67I'cF|%=K]/Ѩ5Q5qZ9*Hi ;P.?ߦ ''-Zq";1|獏y]D<Pd ǴqI2H$9sBaZM0BH!@>[p&l6[$S:ssȊJRc}}vgZ=B\fw3lV _8{zkdZh$Pf&KMx)dƍkd*::&rL".ހxJ&5H z^LBď|*- d`B7:;*xnKx^, uC! Zl7$=A/BOs}DA`|$ƹ,A#dnϧL!F.c(""*05&IгB\f|bx7{w| c4GhIvxzϒMhuu#8H: EtIm#6K3xb&g]B +pppgܸz8{4ӓSM3RhuFIפT:X,8gv&ˠ"azz( X\Zdyy Q2FGʴz=F_}eN/94;ROh6|s`$-ضd1ǭֺ( L܈1M]ݐFO X3|pB$݀{a(>&NJacGt̀!z$DahH\]OpzeT2h\Z$N&ȠjҐoضqVV&T$l_AT49wysrӦrӓt{]ͷ?BVW>=arbjT{ӣ 7׹v6K;tNDxj6"54gt]%Z[ީtʏ}'OYE b*6GSt.vqs B(Q,++KlllrpvXKEvw߽˭{ lzҢZ"BL&瘞(2,Vqgx>Hlָp |I'% 16^$L#>Ap}g?@WYu%g" P*H$B`u1C\#I=l-FgYN /_cPG |H_yX#.{*/y2f_~<ڢo QVg̘A1 +U% "l;ݶIrLq|T! U9sjJ =^$ H$ 5Q?p Mo +,?bM&`xG!@Dzz<ù3ܾC)dbfU=˫3!-&Ƙ)DF*w+XN@>eP,yvCVB9xfQGTpCYPH2J{댎-$blU߹g1b d||m79w7ЍB貳*`:\?Bh41++4z=G;l8zsY?\>nlQ$} G],/ .d"q=,YEu*Md)$Ȥb(ƛw+K }\Z女Qޥٶ8izkͮɑ^coD߽zm+|r;99Qn~olqЬQ! q vr|'`!;|a||]WrxG\JxXڡ7h5MZ.^! z&iuZxvl&C:LMBd;4l؎G,&t:] ?cZ/bz9\FU$AlDa}(i ݏ{P%oe;?$&wc"OM`LOQ*/1(sy9ItRgf\C%R tR' "L%bL:)j"2!KiUFVD CcvnlD.^X$P5fJ"1gdž'O b,c ?L+r6( b!W q6wL&q=F1R/\Y i$q]#TN-ѝ(DRy>f$\&T+yB5`$2#$)Tcpq:$00&4<=y=a~2 *w'n2յ;hBCYXMar`gQ*&]:$Ӆdو媣cdBҩ8Qi:t: ,B IDATnDQdfr*Svp}ΠS)022)-F'!Hܾ}^(/pjy_'[w?w8Td~aNj(dGhZtzDAd.hq\j8^J7c,Mfv*}>/tSi173lZ/4QsP5)W{l%uQUQȦuA$J.^>PĐ {!ҵ=jazܠٶx4dLJQ\DI%On(c#N/O073TB >GT'8% "Z )t&g$p>A $UM@?8fjrsa:Vs]L(ѷ0 M?.OG,1ַwl;nc#}~O.NI "n?W_~^_g&,ww*G{ݾRQ(fV,KAREdIk|`a2 [ݽO|Xβ|NNN8>)ObyqrF-,.ܼ~/uDEV#s9Z cD,MP(|^rUR1/|3;|evngC~-|EGl-=|$خD1$WHP̧DL<$D$I""G0Q""lgv<BWoSA#A׾.&RIc*aU _]ݮC\q``Y#Lx!F1Ӭ,LHdrt&<P,9X`, <+&!P9*u=@7d' V"f(&p,5dYF|@df!܈Aae<9Q$]2-35| / 'A 5UM:I 7S##|i|j7~__s_˓ٙ$\xdA?^svJZFt^86ZdfYVO/7k"5Iͭm|=>s_ ^ @զqpTѨ#0?'Lϟ!S';T1Bwy #YzK< ;>L~Xɹsn[oLmrzaǥ6翈FlloѨIu.]Xr T%R4gIS#H ٌBqďoayiT:G d,G[|W\dn2ykLLU2͇wyCV R!GܾG Lc .L%O ԻH>atDr|$'D""֘3='hw} )W^Q=.!&z=S^odSG0ؔJ M8/̧4L0 Yۭ1%NfEgí5.~ 2ZA@Fu[pќA,`."&5lW-wGXrg5mj}b" bѴk^<I9<3Gץo:H>߷QUs ,^{9έzE~7}7߾K#0Hf{ .ZG|>QJi,/NrjyS+3) Y҅bzHbCFHbQ(W|9?,Ws\ϙyR޾ ̍'.\X4֏LsPCKO*pTϏ? R&ȤuF:IG+(#!$NȲHPmH2r|z"OBZ.R&)!cQkmJ\B|EI5|ק L}6Cb;qdY!x EkkúMHܐt]aa"E-Jfgj,I2>"&LOLQΠJIfrboa6JJ"tݐZM9\LҰpt\g '<'P:=x  a?)ڟt|?!x4 `)gGR_};SB_;nwH$LL J! *xZ=ff7$йpy\ۣt|v8>i< P*#,/-Lvlr=>rCSɘL:P>+Wfv#1 WyܾC>}.^X{l<+xujmr,D G6KE ) I98M,MŹx{]|G!(,,ZCeݞE2CSH*鸊,ۧu8.w0b=DCCxE IT|--Nnٔ-*mL;z2(2!Mb9!"35Id$1$B@e,$&GxI EuUBPTˣ"wF $n&2邪3=6+Bѧڧc2?5t1_@K=d2ExxRy%/]\ZNnQz,.R.U)d$S1dEl26>\03=nhbH8s3rw6tZL/K/^ Bp*sPjkui6ȊAJ  ]Zk0LdOmh & "a itBiq}(M"Q(وH\Hi>#8#&<N.3?bvH2J> E&ʤ* ]DCέ.3?T],N]ոu‡k|QNOT[6LB1TERx$" "'89jpw[uaR')&(F@.OhD2a6y&1+m <[r9N 4>cP=! %HZ4z&0Yd!KA<xI+<#<B,ރ\F5n(LMex3;'ضGhĻ?\]~TU2186b*a!\1r,3Sc4HdN-/07"H1lB$:}d"DrMX<9e旐$ AJtNMOMuDc LR FlyRt]sIF*LC0VȠ L$UѶZIuxMevtkJ>+$uQ'I #2>2ݼS sS~_[I0e|'0(Wܹít: &fv8& (4Mp8\83Fµg>^w7ȊH:;}gET*adRIbtHVPmňA n9|mMD`f,XѬF\!hMMqf4t31qD^aScY6[Gu&3AoTF2q0Cef.$ ɘL 17IƊ哴m\zhZ|7 ;7;i|rIU5- Dy3#Q _7ww6? ? ^O xR4i;OG? I'lSi9g :;=Fى_8iBͷߦZg $:WYf1-X\_}I>6$a .\9T=[T%|XY021^7}ё,;[QvSdqN=A~5.]Na*lt;=$%F:{2 F31A!kҙ4n8=e}焓((B.~xqO1 ʀfs@!1ϩc MnSٔ6@Ȓ)ƘAZ8{fLZ%4`c fq`].rl(DGPit|o}+ܗvHo{ a L9%=*-ʏ_k['Wֶ-r5dnah튓l$t9w(ܠwWC҆wXskҏDTN?ӏ ML0H:T%u(R8aD'51"CcSf7X㐩Jb>n;lhXأѶlq:eiHHihF'J)TYlZGRd3Je@|vz(\~sУl;rj`0rY61uK< ̭m$5\BA%SJ.'-T|Yhlo0c˛du$IEUjl:(~+;MdEa%}2n !DA@3*a2t"0LZ!q]}?8= TCN{}Y}C/|}a/l-(bb>_Gn'_o'O,&;<6=WbΟ*8t™3 ae{շx)ffy xGB.9'͂,hG2L&ݴY^akTX͛78u(jplE@²IfuE"̔M:`hD\ɠ 5EB"񤭧Tk9 bc68GʐxsxzLZAt)Ur3,#Hk]iD ڭ6^Sj+(I pz'@wq!?zmˠ'ȣ"o-mEw@ Nw}\L#]!e(D \*DsyD.%QLbDZccy0U8^O3ҭ9!'wH~}" *S:D# ާs\dk.Ȓ| 6sTE)9sOG}~M^zM4ER)}6|D59PϾ#VWvPP*56TJiyM.ߨ)l'B)m3Ǭw.""Y^mRMt<bI`.錎(HB1[=YA$c(DVj%hD*!$ >cL}I6c:^m%fFeYコ_#͵l "0 H0>IN-LѨw#MOeӨL&FۨL.c+ +6wZ'f'mLW &IP( >L9y LnH$^z{sx`f?8dz`=䟳/?, x7r>Ú_:p:zrEQL$/r͟=>hٮcahp7Glm<)3=Wcwx9n.98ǔ 9+y~+8WBVgS?sx';{MƎMq|vۜ:}g?zr)ͅs"6Ǐ7Xf0vh6GO=i]1~ x~m{MAB6m`q< Ğ+bTUA%yN{#ad>D>XrRYhkBA=Yciy\kȓͤY^BtzQ.f9RIqWZ6q̃,%KU&!"٣\*G1nU/oP.I8Kg8"k46ܰBJ:J&"GE IDATK ,qv!MW8>*2HBDPͨGX0w<krtW/i?/amO$K_^hd:P~1 - ˫ |y:^oݸǞUN(15]$آTbLuE]3&إT*#ֈ Ra e䮏~@miOiZmf 5_Sr&tul"=ߠ鲺Ʌ4zp)|/'aueD |p D6_TʜͰ۴kkTSTJFK }&Qqs}3Y9T ؟,.SU $Ijvly{w>8$*= w ?j q_4"  C!ݹy8sL%JF!%qY^g0_a0e"._(O{8&Y.ސ'pf!E㧙a -o|&3iJyj! JjAD]U) 9V27[$D$ 0YmZ5@BLz>鴁븮L LE$ Z8I˥e /I$I`H8c\V;Zo[\N1^sg|+=}3[w-R'":$͖i^( ӥIHA J{][[}1,RȤhlt-M׉cN(|6GoY9nsx>{]~ @?<㾃u]|)׾b )M;)UҬlRotlm)O=;jr^g}OpZJ>6i ,/o9aH'L P1t yqDQ`4rt Dtj<LMES5仆B%7h4B>or:Q,#PI2)C%64UvGo8zFFĊel^|Gجz o`yE2MmWbǏc0ht,m>RGkC7ٮ4_ G[;m^2?rٴJȐ `E!Ǔu{,8E&,+y 9YV% F t A=(%U CTlDEYc~J6h'GRidU!=TYBfpL ?x챇,l7?gKH7֋K ,A?@5MNGg@-ēdTY |.h0tcAPȩ*Mw\yRe\r!vK>W (I~,r~D-Q׿{S`%@?Uχ>hBOo:O[?OͯnTCÙhJYF%n/xKt;ܺq_Yg8E=:a $D<vrs6{{-Ec3qa@O@G I IB"yÑ 8@44 S$@ Jd4L]U($4M"|0@edYixQ*ruH0bl lH7Ͱ;H.MSS?K[{\<7nChv}mySC+ Q#I$P i\BvG|TIƶ$ /.dET=te6[7[C{iO] =. ??mR̄E,--/dQdNgT+iXnŚۻG<\$_gβ5&3Sy Tl.^ \e{1$ DD!$qBNP$"鴊(c76d"vV$ &&WxE.PI $aT).cA$R\5C\RIJCa}kQ;K _΁vwR0佋>gu݅B˯u]Z펉յ=k,= G9q^|No^__fiu[> fɧRnYDz]8ad k ác GQ!,%( *Bf~0tbo̝]pulkHdpW٣ݵI%nީi2pe}#FFwަ?j",O, #ϑmmgW."TU.S<8^FY6zrQ*N{~8J0qVs6?izQ>F:[ csv#mJD֞ie8f)h\.QDRD׆j9C.c< A|4T!fYl=UcTmJfHRJ^zscu2Y,svC<AOUYTt=8{AoQ17[E5\Z vwhÑEI8Շ@!C7tri8iwqF$@$(B1Z1MԤ_(a12k5RN.kiSղ E-# $qD Fe<ϥ0Un17Klmq܈nߧj|r*/.OWܺc'r=Y8gNg#;ۂFmFNRtC'/e |VRj{ɥN.ac*.S:p錊(~nNFUd<7`8t>y>)Sej*p'N`goD:;fqT(IdٴA&5dM{#Gm8Q< u.aR*d}Hb?DG{~n(DG&-akg4[#j"$$!!H1;cv[5"@Cύ(dTYM$bz(I@E#Ө7I b|?&ln0  |F"wYKi* ,Q*CMH".YoمI |e;Qzb?> pHUק?g}7i4`8VWքd4tII88ˍ[1< s9Xplq gs-záexчp{iAb~~BH1ݮ"R.eI8MG~H1Di%vl-tJANĔK"1$(D*b0"(f0 ` $(2Q KJ!oP*TTKi4UxLƖ3:RhH؈S*I+iN$"0iUsx{}Bbw_ɽ9q'd?3!ϯ?>8C9y?~W_y9~ڶp Z>Q, rkoP^_Kn$"]z^Gbie:oz\.ţ躌5v,ͭ-VWus.0t:# MBQu4**RV{V! **թ4C H5Ț2dkO>6%Ti:ZCQ$0b0 PZlFB PUP(SL.7),k2ł,hJ!Kb^'swz8ɦRit>C.&SyΗ&N b C)d$JqH>iMֿf }?"9D~8[S'+Nժkoh,sHuGcOƶ-x<++k\.S%:#{$1)rp8b{g5ѐݽ6w6YBvE:c25S&1qVO3b4F.뱸X#5#l1b$Q@`v­먪L-& dLgqN()M Ӑ)dUr)PdA1 lJfZ@E gۅٜylnثH][Cf)q{(TŅ*k :!F^2RBT Y324g w z #QF% CG|?ѵT?Y2qHgchRȊJ,Ne1yJpvDTDq)ffϽt;Lڻ!vwE?*۷._686k ,Op~_Z1.Ibpmgͤ(ܸ5Yt~mN:ch4fvz3g}^0 )1ORQ#Qi46+l? 58NJ)F>C+ N"+&-rCHLriRB4KbQ Fgΐݖ C(LTI`l,5v}Q"R.ܐj)KTXPȨF͎CA)ؘ Իc.3SE$@02 zg+r>Ѡv->A=2+z,?ijWvG"rCsLCT)t2YZ5Oh|/b:xҨ7t؍I2R+d*eqD7#Lf1]TɤE Y`yA;dm"`n>T2F*M;$h .AUaLDU =uFԪe*9dBrncAt{NG[u=Ν>v'>Mz\n{(|,߿?a-;7/3܋$@Fw~3:|T*UreVUǞyX({{d _xBXYS*AAJԦSYiP. j1 ࣏.i*,aI܌ɑB$pgE }kĉ@+^ ٴ I@`PMR-HBB*%S)Yf*,LD(h*%4br{yOh6:$M6ֶkw6lKpôɇ_8J?9ؐw/2@vSQ=c5EJ{;kӳ{+S'fHgr3<#8s6"+Vc򗿄+?YuސV=r6ۍ!3sRjH.W%*y3Fe,; L}5Bbt96e2[*5zvL>Q+,o8̔51QBNC$*4i]%c*ؖ)^ Rv 8>GZdc #ơI90X±";+{nӆZv[l+=lsi;~EsK2ݽ̻Wj% IwR-O^s Y:o^i:^wۜ\+{c>UwI|+7YX#)XiQ'BX"t5C!_"J3ƈDOFQ*ȒN!e`;T9O:㱵ۡ9XtlJQ 'kxK}w{eG$}W'ާ u'â} ]~Ptdo~3>|ImjVP x˴;yfgt;M.:/*Ǐ͠*>a_?ͭ;~lGKob6FxTVbkwBG. d$f8RIcfnfL*Kz8(ffOhpwA3Ad( bZCSUtC D``з8si-h)AL;ޠ+o(aa6|{"Wpx ]GH S7>]PYE%cxዏ^:0LΝ]1 8u (ܾ}fA% $I5d)hh 9y|Ǧ =75<+=bQ|K-R4yx8tXYkRf_gj:n0FQc 4 yvg5PeEH☄bNjȦTyREY NlJq Ut]&n=?p)-@EQ>1.wVߕ/1< *}*[$N=q #d.IMj}NRG@J;wFxYn AGkX!ӗRf]T*y|$N !<\"}ȃzbHJ'$@UߟomK>1)?\_6b<_ !U>go.Xǭ%\Ge(wuw+^o:v6-%|P%yZw R\ fG{m缎C}r\_H8$ JQ/za>zy o-[z4 84ï~nϠ[[A$=C1r'tmB "r}L,L9DsZ.<1D"<)Q>;dwڍe7oBPNr,-F8= p=JEx /v˭v}WAcFSӫ5P̣!bGMws4yrzP,8NNu\9gO ` tVJJLo,sDjWr$0r5H@%GS9;c4Rp$p е "#@ Q"{K΋JHy2bt+b,nNM maC ~KAG 4s1z:  iځz Ȱ\ TzMmG>ԀA0`ȐAhpUmi>KG_m4hq$qRLD ik ~o*wCB r no_rƺ?&'qDBzkK'!{cB'qSu"D;%@…#px%jЀK f 躅#~42z3YwCKn҂&`~t@Jn"ȥ9 8€Qx@)GbCCpt2<Y[ p<+f( Pjd`42 &@"\1B]x%E`%LRbtN$RY241fAD`<BZbتoZG)A'Ru7u-/A* Ie%bm'W-H)Q[[OG&~dRw"#C7=nT7y_b=Va{WnMWk_c|ON;g“u guŔ4y:ȸ5V9OFs-->xf<$>)D@f.8Lp¤'֐D ji{JF40R0i#9"VD650k,@ƵiMM;kӀMH,L;ޟ4_^r )Mb ` i,2* 4p)4-g `kʲ|7 Y$d ` a(4uFVx31Xlj¸.Ǒ7^34%~voO^nZ_l|mXd۸4(kjޡڷ9IENDB`mandelbulber1.21-1.orig/usr/share/icons/go-up.png0000644000175000017500000000275512274512437022650 0ustar krzysztofkrzysztofPNG  IHDR szzbKGD pHYs^tIME  n9zIDATxV[lUE]sI[@bAD @  >HԈhc5R#3P0[8L 7-Rn?ܙ={^9bB{11ַ֦)@;:/8>`ژwW-^MjsgNڹd =˾s@#[ m+d2_:YϏԭh\ L kG:"&%Į'vO5iXSZC*RWC-r J7WVySk!j>gwp"gfLaUEk|sK޷!ڂ7!;+{:E0 q=M}WJ\H/L`J[8Zvlnݯ+<`3ox';8C-d~>kW3n4r3]Հxd( ܌9,|Zs]_V=]FMm8R g6>`ʗ LyAH@"#%aFk[usG“-`OԆ]C dMLXSs4[N'骮& =oϿ#L;RgCФς8K GQ^F]UFގۦI4-)(ɗi9 Cy=ۇ y4m\ס3UN ]'sEӣM Vלy)pBa8vvBme! z d\RS=x M#+?VITrтL -:BI A`0t \Y)NF %҃0nϞG#F@@N>4`ThJ@ULqwi@#v#rM 3+.--B^q c"HY c:Ԝ2L'Xqxx~+=4`cha 0+Ka*3{ϳ/\ӍQsHn~X_BduIENDB`mandelbulber1.21-1.orig/usr/share/icons/object-rotate-left.png0000644000175000017500000000304012274512437025277 0ustar krzysztofkrzysztofPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxŗkLW5[ٖ-R#زA@,H++PEQjD0PqKmlD m838uNݲOfQ{OgHխ/9=9&!૿SbCHH \]Fza_D?̹dC%t?M@Y-bxګ&05qw ӱ^/MG ߤq4}ّc齊o=fN7_ UH FFe- G ܯ;zЩő = Ŭ& zD͹iQ) M@~ZcGKaI*񴟸o"¤@:-E6v^y S ")lAC{< p4Sd;L~ |rvAviO,#|_h~/&SŨ!XV}%hCwE.2i8, U23G{٨E!!=XX1ꄬ7)^k$Io݂L#Z,,v'8Y3>Ke(i\Sm I&\vK>J\>F1jT !W~Lha,OnL/;"Gh"jQWBu  WCmvla5Pie|Ovo j P7OΎkf 'o@sٸ3SP-D*wS<{[Yhi(9rOF9?\non+i6$loFL@=vREf~a6IU{7@v\'E}Vp& pTg('U0S%D0lSmn@ɧ=zx.Mv֯LnU8IOЎ`/V1{[Zga2TUՏ5C6G79uʝ)4J O!.D[mŻXś=:{ʳQ[0!`M'C\!~EegZ59P*T, rf\Jy/< ra삮Π2JV84h@MmFfUڶ+)%w֣\c|I XTLV58fYR&FU{KGZELeKF+:`3,C %jbClHv<μ<N(-jUjYGoe vMb7qeY#6Ė|I 5JscCV4dC|I ˤK)^ 힙VCyuuUF~&1#kbK|/alj.V;`;Ł)N*Ѡ{@dΰFl-yld?7ztjӎ{ dL1v;IENDB`mandelbulber1.21-1.orig/usr/share/icons/go-previous.png0000644000175000017500000000300012274512437024060 0ustar krzysztofkrzysztofPNG  IHDR szz pHYs^tIME '!PbKGDIDATxW[lTUGg-ڤ@U ah$$0hDJ?|T!M@ҨA*mNtfa(vxmv眵k;G[|70lВ2{T8Qɳ w9(J T,ߞwZMO}G!T,{\g7/'ELѧ@xE;㶹1/[m{fZqi.9`i4}"\Q95S-_RGR4#.)I q1=Vw64޼hzimR`'.SZqKi(f}SOXBI\ޢ7&l oJjUg-#IS]~m\Lv4!7Yxvrg<GL#oAA]'jؚLe<bqTU%Ƅ!xNa.s]r]wm]| |,.Л*"jMF 1a "2YAޱa C]MTu֖ESI*M.J0.w1|{l fE kCu!1C)бO p ~B 3̕D@  jvMq1j)XHc@eg9 /x3]{"0TATs2W\ D@ت eN"`8wHP!/_ u%2t|E?8B)k!gΝjfOy iJQi:I0 j44|:m+epAFQP.R ,ib!J9p//l vYra8JqSڥ,% 8`qd ]zΖC DH;2{ZԞ{_i|{^n @e1yd:PQ.0De[h5JfweYI)A߳y8ʁ3cOf1&j@D<%r@{ ѫ%]*+/ǩ\)N8pOFG"]5sunR?ZɌ'`1 Sn1:Ѽ'~MtyO :=o{{uCͳj$k L'+nhO_=]sxݬ-,w2J:`tkadtI>g۷clz; RIENDB`mandelbulber1.21-1.orig/usr/share/icons/go-down.png0000644000175000017500000000263512274512437023170 0ustar krzysztofkrzysztofPNG  IHDR szz pHYs^tIME  ;+Ck?@/ * F yٖ7mt<~|d|&L`ќsMK}SCHJT-hc;{fQY{}3- hnfD"V_Ns:2}hΐcȭLYض):ɸEh5+Ʀhp Q NdMs H߇3ЀMo@]j䉣*GN7ei%LH3Պ(~2'ϵQBSd/fR9ӂ˽h@Npu±BUTSs#APqr>fn&䍡|_pmF8x(‘"B]uM7YZm@VDdS&k,nN"$:z!NGv| ` ̅isT$'[7ڿ%fR e+*ʡpaJ d0ȺC ڪ,(=} *%vy;H]d @J>,EQ՞;hO92AF I;i>"{ț4Yԍ+Vc!CQ N *RG۩CnuT @bh&ܦOQQ ZWKu.w~fO< z%bCU Q`\38wH޻ =~3<(.t 4d͗dQ|39drjՍs]\ׅ8Ǹws'J ;խR}@Ԍn?;]?&CT5#hz_>bΦoi-O6z{钵zLmA(B5MGN}"$P38֏tLD߇5RLR}ӵIENDB`mandelbulber1.21-1.orig/usr/share/icons/object-rotate-right.png0000644000175000017500000000304012274512437025462 0ustar krzysztofkrzysztofPNG  IHDR szzsBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxW{LWlf[DpJ`)XVJ C%VDA- ,E:^hy W@"Třĩs-.e嬷ܘ/Ztkrlı8w\ѣH ?g_H ny?5 w?clGa0Kd]~ml*6#kgg-cH?G s_!KGL$#/V !nm5\>k:"3|B+vbVD|8Mzjn Q-/ 4@,{t 58!IBܤɨ/anl4h~o9~|d}5!5"{\ iNThqVy)J.hDx@XIOD"YVA17 ` Dij4 u# )E=G yȕajm>7Ѭ3JO =VG?ANmySCTv,ڄƋhB.4{sLe Dԗhb+l7 qZ X\.aiN(dW 8jI5h(CaӮg 6hi n|cgA<[,d~#jCrKB~[Hj^1l~ʏ"jąU_}r;Py9=6o1zqK%#ĥjij6`φj(^x9$,"i<6|$^9oC(:|)2`̝n'nDmAܶq8Kp]e-H@KH kȌQbqrsA=B6Py/5U~Ǫ2Nz9SF#n'ojsgb#8WP1~nhb|܄vϷ '֛jiYIv%=Ĵ/NbB~ .q̞SCfՅ}ݐST9JJtrYS1 H:Qٍ<5 R:3EJ}r󠉪7.v}jjˈisɐq]ӰcϠ,dX-b6`=7"uVYlu23n BX%%jel>pm0qG TV1i%T"*H$GI %5jćDa)?+)ô>J AMe:(kl޶q u]& ! 1#9RCj %D2RʶҢ~ a +3. Zf]vw(PmvOe%4h:|u\d5ph g0`UhB>N@b2f̑RK8ՌiJl\e}ҁ|"!ɑSOH/IENDB`mandelbulber1.21-1.orig/usr/share/examples/0000755000175000017500000000000012274512437021605 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/usr/share/examples/hypercomplex - ambient occlusion.fract0000644000175000017500000000475512274512437031054 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.5; formula 4; N 15; minN 0; iteration_threshold_mode 1; analityc_DE_mode 0; DE_factor 0.10000000000000001; shadows_intensity 0.5; shadows_cone_angle 0; ambient_occlusion_quality 3; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fractal_color 0; coloring_speed 4; slow_shading 1; post_SSAO_enabled 0; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/iter fog 1.fract0000644000175000017500000000761612274512437024460 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 29.999999999999996; angle_beta 20; zoom 7; formula 8; quality 2; DE_factor 0.29999999999999999; brightness 0.80000000000000004; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 34107; background_color_1_G 0; background_color_1_B 39212; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_R 10658; background_color_3_G 0; background_color_3_B 47123; fog_colour_1_R 65535; fog_colour_1_G 65535; fog_colour_1_B 65535; fog_colour_2_R 65535; fog_colour_2_G 65535; background_color_1_G 0; background_color_1_B 39212; fractal_color 0; coloring_random_seed 247872; coloring_speed 2; coloring_palette_offset 15.9; post_SSAO_enabled 0; main_light_intensity 0; aux_light_number 4; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_intensity 0.10000000000000001; aux_light_predefined_2_x 0; aux_light_predefined_2_intensity 0.10000000000000001; aux_light_predefined_3_x 0; aux_light_predefined_3_y 0; aux_light_predefined_3_z -3; aux_light_predefined_3_intensity 0.10000000000000001; aux_light_predefined_4_x 3; aux_light_predefined_4_y -3; aux_light_predefined_4_z -3; aux_light_predefined_4_intensity 0.10000000000000001; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_3_enabled 1; aux_light_predefined_4_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 14250; aux_light_predefined_1_colour_B 11747; aux_light_predefined_2_colour_R 13049; aux_light_predefined_2_colour_G 18416; aux_light_predefined_2_colour_B 65535; aux_light_predefined_3_colour_R 19564; aux_light_predefined_3_colour_G 65535; aux_light_predefined_3_colour_B 17049; aux_light_predefined_4_colour_R 65535; aux_light_predefined_4_colour_G 64956; aux_light_predefined_4_colour_B 17205; mandelbox_scale -2; view_distance_max 30; penetrating_lights 0; iteration_fog_enable 1; iteration_fog_opacity 3000; iteration_fog_opacity_trim 8; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette ff19c7 cdcfc9 d4728b 22b200 cf9812 27714b a989ff bc1188 80a580 200000 89a144 5c3821 9b00c4 9a3ad2 a4de41 d9b22d 146a3d b1836b b33e6c 81973c db472b 55d136 b67d5b 146cac e600bc a753ca b95ebe 40ab5 aaff93 ffc8d4 e8d1d9 10591e 8912dc 458693 4750 601500 82afff 4f62 193400 1875fe a8faf8 cdd85d 1aa9c0 f4dfaf 14461e d7c238 323fcf aac300 a5cc37 6353c8 119d34 9eff4d 5374ff 131e4f a566e3 2ad0a2 ff3b7c 4e04af b7f965 9b5099 a58300 7e73 249618 4a9e28 8c573e 790b71 260073 c58a48 3574 ba007a 6d7c15 395c00 7624 f9ff3e bc6a00 ea14dd 949d3f 6e9e38 4b7e1c 69aa3d 34300 83683e af0097 47b6d2 fbb9d0 7122b7 f6fff6 afff8c 336387 8680ae 855907 24ed63 c551c0 6e72ff 6bd9ff 7f533d aebd20 a9b5e 57c7b2 4aaa0e ffefff b68e00 2f008b 6dff94 ccb145 6bc1c1 3621a5 fff2b4 bdb6ff 4ff89b ff7099 22cd06 9a66d8 ea5c3d 31967f 9c4728 c2049e 32bb 7d2f23 89b6ff d3978a c09497 34205c 6b8713 e70dbb 245b00 c73900 d3be00 608638 8300 b269 95d749 bddd56 5c5319 ec4bd1 4cffa3 499978 49a1ad 672906 ff7f8f 53dcff 524f55 5000cc f38220 6a67 3e46ce a1ffca 2e013e af230a a18e54 8f45b6 677657 331017 47d71c f4fd7c ffcf99 ce8095 9e7900 8b683c 8bdb7 c9caa3 9cba00 bb618f f1ea25 73c3f2 21bc1d 417707 a52fff f9aca0 b5cf71 bdb7 f8ffde 6b4c0a 9fbfff 706bc1 7cac6a 22d400 be8d3a 50f8a5 ff7956 b65164 ae2c00 6164b7 516171 23e0c d24d69 5affff 5c4baf 90ffff 17003d c16bd8 8fff2a 483440 a3cbff 73f27c 9f775 ba5a98 ab41ff c3f85 88ec63 ff98c4 97d7 966013 598aff b26c00 8dc746 8e53dc ffff95 a55685 c432fa 8200e1 c0ffff 8b08c5 c50100 27a800 8d5500 6e3f71 928db0 868d00 7e008e 543f 664910 7f884d 910000 9db9c7 427361 65909 d5ff46 929ceb c5 520032 2c4e89 6bb374 11c0a2 32c514 ff7beb a1603c b3732a 291700 e2ffc5 9effc5 931aad 37ffff 53b848 3ea9d7 d9beaf b7c3 ecbaee 4c2468 3f16ca 2cd54b 53582a dbdb0a 1428 0 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/interior - mandelbulb power 2.fract0000644000175000017500000000502612274512437030126 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; z_min 0; view_point_x -0.5; view_point_z 0.29999999999999999; angle_beta 40; zoom 2; formula 3; power 8; N 25; quality 0.5; analityc_DE_mode 0; ambient_occlusion 2; ambient_occlusion_quality 2; glow_intensity 0; background_color_1_R 57593; background_color_1_G 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_R 65535; background_color_3_G 53317; background_color_3_B 0; background_color_1_G 0; ambient_occlusion_enabled 1; fractal_color 0; coloring_speed 0.20000000000000001; coloring_palette_offset 68.700000000000003; slow_shading 1; limits_enabled 1; post_SSAO_enabled 0; interior_mode 1; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/iter fog 4.fract0000644000175000017500000000567312274512437024464 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 320; image_height 240; view_point_x -0.57686825491230742; view_point_y 0.081186645371862293; view_point_z -0.086602540378443879; perspective 1; formula 4; N 70; iteration_threshold_mode 1; analityc_DE_mode 0; ambient_occlusion_quality 1; glow_intensity 0; background_color_1_R 548; background_color_1_G 0; background_color_1_B 18773; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_R 13755; background_color_3_G 0; background_color_3_B 10317; fog_colour_1_R 40396; fog_colour_1_G 58455; fog_colour_1_B 65535; fog_colour_2_R 65535; fog_colour_2_G 65360; fog_colour_2_B 0; fog_colour_3_R 24000; fog_colour_3_B 0; background_color_1_G 0; background_color_1_B 18773; fractal_color 0; slow_shading 1; post_SSAO_enabled 0; aux_light_number 1; aux_light_predefined_1_intensity 1; aux_light_predefined_1_enabled 1; aux_light_predefined_1_colour_R 44263; aux_light_predefined_1_colour_G 17910; aux_light_predefined_1_colour_B 11183; view_distance_max 5.5470532618140282; penetrating_lights 0; iteration_fog_enable 1; iteration_fog_opacity 400; iteration_fog_opacity_trim 8; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/tglad - scale -1.73 closeup.fract0000644000175000017500000000470012274512437027170 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.6372781064899551; view_point_y -1.637423371490901; view_point_z -1.5754503503695569; angle_alfa 29.999999999999996; angle_beta 20; zoom 0.00064000000000000005; perspective 1.5; formula 8; quality 2; brightness 0.80000000000000004; shadows_intensity 0.5; ambient_occlusion 2; ambient_occlusion_quality 3; glow_color_1_R 972; glow_color_1_G 18853; glow_color_1_B 56277; glow_color_2_R 50931; glow_color_2_G 50931; glow_color_2_B 50931; coloring_random_seed 345; coloring_speed 2; coloring_palette_offset 57; post_DOF_enabled 1; post_DOF_focus 132.81838590255677; mandelbox_scale -1.73; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette ba1a2d 915d66 72e46b 64ebff 21ba51 9372 620000 8d9162 644928 e2ca83 e2227c 97232d 8d00 689c17 9d1bd0 870c2f 878969 a1393d 3e9b70 ac00 801230 7641 ff83ff 9d56d6 d738c1 8310f9 d592ff 6afff9 767772 b07600 ffff5c 4c19d2 4a8da4 f0f0e8 218a18 8d0072 60cf28 a0089 da00a8 775f 45446f ff60ac 896378 710000 e737fe 5e05 6a001e bfee56 49dbff 931d07 e1e0c1 f2c935 ff33e0 ec4048 4800 4d5db5 d06742 efb54c 97ff44 c0602c 8dffb4 cd824f 4883 a73a6b f3ff7e 9ab180 ccd0b3 df8ee3 919392 501da2 834382 a11000 f7c44 14ac8f 46fffd 7bc177 6218ab 758e49 f3ed78 d54d00 fc70a2 ffffa2 c7341c 5cfae6 4fcfc7 9bc57 a3c868 e22d29 9fcdba 9b0376 85e04c dd36b6 ec6489 ffd9bb 4fd1c2 0 bfb3ff a56fea 270ec5 144bb7 7b0d95 ff7f33 2bd08b da9ce2 65ffff 39bd00 5249f3 aac185 4800 850022 bf1e eb90de 45c00 ad6095 8d6c61 9246 5500 e4aeff a161ec 633c00 2a61af 880b61 81cc37 4a695f 39257 3056a0 7e53c2 75a897 397664 6bb096 4d9f17 12811d 328f 731a7c 643500 33d8e4 464101 ffa96b 2c8f a2a105 65ffff 74d1ff 394355 13b3 5cbd00 524770 b33fa8 dda5a b73307 c000c4 705d97 22006e ffae2c d77ec0 e18c2f 86a955 a0201c 845ddc 6720db 447167 c73b4a ff7fb3 f3cad6 a721 53cada d6651d 50c3aa 623fe7 732b05 9fae65 3c007a d6cb43 2eb647 398253 b46ca6 997b45 d87dcd bec56f d2006e ffffff cd5697 0 638b71 f6a6eb b64b94 5346e6 314900 36db91 302736 5855e0 ff7aac f86f44 b5d34f ff4a58 67227b 5b6bff 9965f1 fffffd 4a617e 655774 37d011 3981 913158 91756e 770000 11bc21 723e 3019ff eb14b6 a993b6 c5fffd 6249ff 73ff80 ad6693 2bff99 3364 b98cff df9eff 128101 a6172b 64cc96 39ffe4 c10000 c6ffff a7b4 6af9ff 8719ea 1a0014 a2813c a7ffde 23f58a c790bf 84c0a6 90864b c35976 5e9048 ffa7da 716c16 5f9e39 a69b 785321 ff94ff 5b1100 b34fb9 b3502e 750069 8e9400 e2ff8a 135600 9b0011 284500 c1cfa0 c4732c d1f69f c9b280 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Volumetric light 2.fract0000644000175000017500000000632412274512437026176 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.218071388127177; view_point_y -2.6121625215134152; view_point_z -1.664040358622489; angle_alfa 25; zoom 9.9999999999999995e-08; perspective 1.2; formula 7; quality 2; DE_factor 0.10000000000000001; shadows_intensity 0.10000000000000001; ambient_occlusion 0.10000000000000001; specular 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_G 0; background_color_3_B 0; background_color_1_G 0; background_color_1_B 0; coloring_speed 3; coloring_palette_offset 97; post_fog_visibility 17.399999999999999; post_fog_color_R 31246; post_fog_color_G 43115; post_fog_color_B 52545; post_DOF_focus 19.300000000000001; aux_light_intensity 0.10000000000000001; aux_light_number 1; aux_light_predefined_1_x 0; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_intensity 1; aux_light_predefined_1_enabled 1; aux_light_predefined_1_colour_R 31926; aux_light_predefined_1_colour_G 55320; aux_light_predefined_1_colour_B 60137; aux_light_visibility 0; view_distance_max 4.9921210758674679; volumetric_light_intensity_0 1; volumetric_light_intensity_1 1; volumetric_light_enabled_1 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 677266 93b4a3 c4eddb a3cab5 8ba894 6e8577 58635d 4d4b4a 44313a 381c2a 351625 2e0f21 23091b 150414 b0003 170d00 2b1900 3d2400 503102 623e02 744d00 895c02 9c6f00 b18001 c59200 dca803 f0bf01 ecc200 d5b502 bfa900 a89801 928603 777300 5e5d00 464202 2a2800 130f02 13050f 250d1c 341824 3e2932 4d4e4b 6e8075 98bda6 b6dcd0 667366 301f24 b0007 402c21 835c37 bc7e44 e19b38 f8aa1a f9b012 ebaa33 c99340 97733f 574327 90501 2a1b1e 5d5f54 a5cab8 a1c1af 6f8779 505050 402633 351427 2a0b1a 14040f 120b00 2f1f09 381500 604008 782f02 8f1f01 a81301 bd0905 d80106 ee1006 f01e05 d82703 c42804 aa2901 992502 812202 6e1a01 581403 430c00 2e0500 1b0101 a0002 1a0515 23081b 330d26 3a0c28 3f1c31 4a3e45 545e59 6b8175 8daa97 a9d0bb b6e1d3 8a9d8f 5a5453 381c2a 220917 c0107 250c10 4d221f 775734 965c3c b0333a d56d43 ed9547 f8c83b d66f0a ce4408 fd931e ed9f29 ed8742 e88d59 ae6e33 9c5835 7f3c36 5a2827 2f1716 c0a09 130410 2b0f21 392328 585550 7c8f83 9dc2b4 c2ead8 a0c4aa 89a495 718878 586960 4c514d 483c40 402831 371b27 341524 2b101f 240b1b 180714 80204 140e00 221f00 333102 463f01 574400 654600 774501 8c4201 a03d02 b43803 cb3903 dc4600 ef5702 ed6804 d76a00 c56805 ab6600 905e01 755303 604202 443001 291d00 100602 1b0714 2d0e1f 371828 48373f 566458 87a18d bee8d6 889c8d 3e2f2b e0910 352b15 7f6936 bd9c40 e5c030 fada1a f5e111 e6cd38 bc8142 76462f 252117 1d0c16 4c4441 a1beaf 9fc6b3 6c8172 4d4747 3a192a 300f24 1d061a a0003 220701 400a00 5a0e02 780c03 900b02 ad0703 c80106 dd0004 f30305 e60507 cb0704 b80607 9e0804 870504 6f0402 5a0202 430203 2e0000 170100 c0008 1a0116 28051f 340c27 3b102b 452c3a 4f4c4e 607266 829f8b a4c1ad c3eedd 8ea699 5c5250 341924 200a16 a0307 321c16 623a29 89583b af7142 ca883f e19d37 f2ad2c f9bc12 fcc40b f9c31e edba31 daaf39 c69c3e ad863b 8a6936 644d2b 38291a d0601 15080f 2f1c22 403434 ; mandelbulber1.21-1.orig/usr/share/examples/rotated mandelbox 4.fract0000644000175000017500000000725512274512437026357 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -0.0042227043865108657; view_point_y 2.2244192987986251; view_point_z 1.482325998097048; angle_alfa 170; angle_beta 20; zoom 0.23999999999999999; perspective 1.2; formula 8; DE_factor 0.69999999999999996; brightness 0.80000000000000004; ambient_occlusion 0.5; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_1_G 51968; background_color_1_B 34596; coloring_random_seed 197783; coloring_speed 2; coloring_palette_offset 107.59999999999999; main_light_intensity 0.29999999999999999; aux_light_intensity 1.5; aux_light_number 1; aux_light_predefined_1_x 0.0024398607363051361; aux_light_predefined_1_y 2.236568246581057; aux_light_predefined_1_z 1.4657067192472291; aux_light_predefined_1_intensity 3.1226899459432007e-05; aux_light_predefined_2_x 0.06569802343538636; aux_light_predefined_2_y 2.252966493250256; aux_light_predefined_2_z 1.4774712866973569; aux_light_predefined_2_intensity 1.728279433286734e-05; aux_light_predefined_3_x -0.063504801335196134; aux_light_predefined_3_y 2.2549845529610391; aux_light_predefined_3_z 1.4818624869894961; aux_light_predefined_3_intensity 3.9717594663694168e-05; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_3_enabled 1; aux_light_visibility 200; mandelbox_scale -1.2; mandelbox_folding_min_radius 0.10000000000000001; mandelbox_rotation_X1_beta 5; mandelbox_rotation_Y1_alfa 5; mandelbox_rotation_X2_beta -5; mandelbox_rotation_Y2_alfa -5; mandelbox_color_X 0.02; mandelbox_color_Y 0.02; mandelbox_color_Z 0.020000000000000011; mandelbox_rotation_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette c46f8d 643cbf 18b276 782047 2f0000 e8003a c69b9e c9af 8a8dff ffffd4 b3ffff 3e421d b06771 3c8099 244075 213c0d c01e9a fa2c69 253fb7 a7fa57 e7578 213da9 9f41b2 d0ffab df00c9 66789b 700bca 72a b8deaf 72b0a0 ed4fef 29a1 7fcbff ce41c9 52986c ded5ca e5acbf a4 4fc547 b4ae00 380067 294270 292a46 ffffd9 a762d3 60a668 3e82af 27a10a f8f2ff 960a6 84001c ffde42 26fc23 8f79f5 ffd0ff 681404 e50061 7b2453 2e93ac 7000b5 19ff3d 782971 bf4abc 5ebf7a ed0ba5 632cdf e8b4ff 9cb202 c84d59 277a5d cd2233 2cf8ed 6a85 ae7c00 35fffd e630b0 33bf84 7b23bb 640de1 1ee7cb 403e4b d46199 5889d3 9a648d 8775c5 745c4d 72377d e20c6f 7eee85 8958b4 740e 56ffdd 30463f 856f49 aece62 b9b0d2 9851b9 9b5f1d 56aeb2 733cda a73e4e 5c46b1 57 ff935b d2ffc4 88085e a5ff34 81 46fff0 8bd6ee e16578 d8b450 a1ff24 c7429e 5cec91 f04f4b 60098 e6b450 ffc070 65b16a bd9aff dfd00c 94759c f61aca 579d 5e40d6 83c9b0 c868ff 60a669 a1a0a2 305900 449019 4c1b8d d157e 3e8eea a6b3ce 4f2d6e 1556 8c6945 157a7f c138f5 80a7cd dc5e09 6cb9f 293eaa 53003c 8ba320 b6ffc1 95000 f2b0f2 412e7c a2c374 6c885d 8fa0f2 2d0000 46d32d 800b7 8c8bb4 f167ff 39a79b d7a000 2ad97d 17bd68 383d53 7a4d96 5d00 e33593 dcff7b b45df8 72b0aa 19bf63 47ff1e 61c7ff 140010 45c2ff a73268 461600 cda9ff a1a9b2 82a878 576f1e 521f41 b41426 145b5f c2a754 23344d bfe152 3778a1 ffe820 49bc 95ff20 879258 5e68 aacdc0 bc2097 9f3fa0 67ff4b 18d600 ff186b 728b7c 2e29e6 3eef9a ffffff 7fd087 adafff b4ffa0 f1cedf 616402 8eea7b a8e465 d94a23 7bd6 41f27b f4ff5d d8415c 581177 6e ff2466 779245 e0 cb3ccd 6a52ae 8dff5a 32efff ba67cd bf66df d0fb63 eb3be6 b2eeb7 ff47fc c6d202 e73d4e a2187b 1c0000 ff70be 8a83b9 6060ff 146936 5b5900 6a07aa b1121 615667 7ad901 8cebff d2ac93 16ca0e aa7a31 449f00 2f9e4e d597c1 83d65a be7d84 f1df72 cea500 91872 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/example animation (keyframes).fract0000644000175000017500000000561612274512437030321 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; IFS_offsetZ 1.6180330000000001; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447483; IFS_3_y 0.30901699437170932; IFS_3_z 0.50000000000276568; IFS_3_enabled 1; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; IFS_4_enabled 1; IFS_5_x 0.70710678118654757; IFS_5_y 0.70710678118654757; IFS_5_enabled 1; frames_per_keyframe 25; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/examples/modified mandelbulb 1.fract0000644000175000017500000000403312274512437026615 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 592; angle_alfa -29.999999999999996; angle_beta 20; formula 13; analityc_DE_mode 0; DE_factor 0.5; coloring_speed 0.10000000000000001; coloring_palette_offset 68.400000000000006; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/rotated mandelbox 1.fract0000644000175000017500000000535612274512437026354 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -2.000869900999942; view_point_y -1.9696934385674341; view_point_z -1.822395119458277; angle_alfa 29.999999999999996; angle_beta 20; zoom 5.1199999999999998e-05; formula 8; quality 2; smoothness 2; DE_factor 0.96875; brightness 0.80000000000000004; ambient_occlusion 2; ambient_occlusion_quality 3; glow_intensity 0.96875; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_1_G 51968; background_color_1_B 34596; coloring_random_seed 23423; coloring_palette_offset 31.800000000000001; mandelbox_scale -1.2; mandelbox_rotation_main_alfa 10; mandelbox_rotation_main_beta 5; mandelbox_rotation_main_gamma 7; mandelbox_color_Sp1 0.5; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ff4a90 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/hypercomplex - julia - environment mapping.fract0000644000175000017500000000500612274512437032626 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -2; view_point_y -0.65000000000000002; view_point_z -0.69999999999999996; angle_alfa -74; angle_beta 17; zoom 0.001; perspective 1.5; formula 4; power 6; N 10; smoothness 5; julia_mode 1; julia_a 0.59999999999999998; iteration_threshold_mode 1; analityc_DE_mode 0; DE_factor 0.29999999999999999; reflect 2; shadows_intensity 0.20000000000000001; ambient_occlusion 0; specular 5; glow_intensity 0; textured_background 1; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; fractal_color 0; slow_shading 1; post_SSAO_enabled 0; file_destination images/image; file_background /usr/share/mandelbulber/textures/envmap.jpg; file_envmap /usr/share/mandelbulber/textures/envmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/iter fog 3.fract0000644000175000017500000000506612274512437024457 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 600; view_point_x 0.36742322715945902; view_point_y -0.30008641345793918; view_point_z -1.212131230610858; angle_alfa 90; angle_beta 32.999999999999993; zoom 1.111111111111111e-08; perspective 1; power 4; DE_factor 0.5; shadows_intensity 1.5; specular 0.29999999999999999; glow_intensity 0; fog_colour_1_R 65535; fog_colour_1_G 65535; fog_colour_1_B 65535; fog_colour_2_R 65535; fog_colour_2_G 65535; post_SSAO_enabled 0; main_light_alfa -1.5707963267948966; main_light_beta 0.3490658503988659; main_light_colour_R 64443; main_light_colour_G 54991; main_light_colour_B 43222; view_distance_max 3.7701560855386469; penetrating_lights 0; iteration_fog_enable 1; iteration_fog_opacity 70000; iteration_fog_opacity_trim 2; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/modified mandelbulb 2.fract0000644000175000017500000000402712274512437026621 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.69999999999999996; angle_alfa -29.999999999999996; angle_beta 20; formula 14; power 8; smoothness 3; analityc_DE_mode 0; DE_factor 0.5; coloring_speed 0.10000000000000001; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/colour palette example.fract0000644000175000017500000000403112274512437027162 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; formula 1; power 8; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; coloring_speed 30; coloring_palette_offset 88.299999999999997; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 7b00ff 7700fe 7100ff 6a00ff 6500fe 5d00ff 5800fe 5100fe 4b00ff 4600ff 3f00fe 3a00fe 3400ff 2e00ff 2800fd 2201ff 1b00ff 1500ff f00ff a00fe 300fd 1fc 7fe cfe 13ff 18ff 1ffe 24fe 2bfe 30fe 37fe 13cfe 43ff 48fe 4eff 54fd 5aff 60fd 65ff 6bff 73fe 78fd 7eff 84ff 8aff 8ffe 195ff 9bff a1ff 1a6ff 1adff b2fe b9fe bffd 1c5ff ccfe d1ff d7ff ddff e3fe e8ff efff f4ff fbfd fefe fff7 fff3 ffed 1ffe7 fee1 feda ffd4 fecc fec7 ffc3 ffbd feb8 ffb1 1feab fea4 ff9f ff99 1fe93 1ff8f ff8a ff82 ff7b ff76 ff71 1ff6b 1fe65 fe5d ff59 ff53 fe4d fd49 ff44 fe3c ff37 ff2f ff29 1fe25 1fe1f fe18 ff12 ff0b fe06 ff01 3fe00 9fe00 efe00 15ff00 1cff00 22fe01 27ff00 2cff00 32ff00 38fe00 3dfe00 44fe00 49ff02 4ffe01 56fe00 5bff00 5fff00 66fe00 6dff00 74fe00 78ff00 7eff00 83ff00 89ff00 90ff00 96ff00 9dfe00 a2ff00 a9ff00 aeff00 b5ff00 bbfe01 c0fe00 c6fe00 ccff02 d2fe01 d8ff00 defe00 e4ff00 e9ff00 eeff00 f5ff00 fbff00 fefa00 fef400 ffef01 ffe901 fee100 fedd00 ffd700 fed100 ffcc00 ffc500 febf00 ffb900 ffb300 ffac00 ffa800 fea100 fe9b00 ff9501 fe8f00 ff8900 fe8300 fe7c00 ff7600 fe7000 ff6c00 ff6500 ff5f00 ff5800 ff5300 fe4d00 fd4700 fe4100 fe3a00 ff3600 fe2f00 ff2801 fe2200 fd1c00 ff1600 ff0f00 fd0a00 ff0400 fe0000 ff0005 fe010c fe0013 ff0016 ff001e ff0125 ff002a fe002f fe0037 ff003f ff0044 ff004a ff004e fe0056 ff005c fe0060 ff0067 ff006c ff0175 fe0079 ff0080 ff0087 ff008c fe0094 ff009a ff009e fe00a4 fe01ac ff00b1 fe00b6 ff00bc ff00c3 ff00c9 fd00ce fe00d5 fe00db ff00e2 ff00e7 fe00ef fe00f4 ff00f9 fb00fe f500fe ef00ff ea00ff e300ff de00fd d700ff d100fe cb00ff c400fe bf00fe b900ff b300fe ae00fd a600fd a000fe 9900ff 9300fe 8f00fe 8800fe 8200ff ; mandelbulber1.21-1.orig/usr/share/examples/constant factor 1.2 - mandelbulb power 8.fract0000644000175000017500000000516412274512437031715 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 20; zoom 2.6000000000000001; perspective 1; formula 1; power 8; N 255; fractal_constant_factor 1.3999999999999999; quality 2; ambient_occlusion 2; ambient_occlusion_fast_tune 0.69999999999999996; glow_intensity 0.10000000000000001; glow_color_1_R 1333; glow_color_1_G 65535; glow_color_1_B 0; glow_color_2_R 64879; glow_color_2_G 65535; glow_color_2_B 13146; background_color_1_R 22974; background_color_1_G 2839; background_color_1_B 3754; background_color_2_R 18474; background_color_2_G 19244; background_color_2_B 12800; background_color_1_G 2839; background_color_1_B 3754; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 23423; coloring_speed 0.5; coloring_palette_offset 75.799999999999997; post_SSAO_enabled 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ff4a90 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/volumetric fog 2.fract0000644000175000017500000000610012274512437025672 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 0.1287778002212015; view_point_y -0.21756413351104731; view_point_z -2.0570482182551522; angle_alfa -320.00000000000028; angle_beta 8; zoom 1.5624999999999999e-09; perspective 1.2; formula 8; DE_factor 0.5; brightness 1.3; gamma 0.55000000000000004; glow_intensity 0; fog_colour_1_R 10042; fog_colour_1_G 10042; fog_colour_1_B 10042; fog_colour_2_R 25367; fog_colour_2_G 15869; fog_colour_2_B 2469; fog_colour_3_R 53458; fog_colour_3_G 52244; fog_colour_3_B 52244; post_SSAO_quality 40; main_light_alfa -1.2217304763960306; main_light_beta 0.17453292519943295; mandelbox_scale -1.2; mandelbox_folding_min_radius 0.10000000000000001; mandelbox_rotation_X1_alfa -10; mandelbox_rotation_X1_gamma 5; mandelbox_rotation_Y1_beta 3.0000000000000004; mandelbox_rotation_Z1_beta -3.0000000000000009; mandelbox_rotation_X2_alfa 8; mandelbox_rotation_X2_gamma -6.0000000000000009; mandelbox_rotation_Y2_alfa -3.0000000000000004; mandelbox_rotation_Z2_alfa 3.0000000000000009; mandelbox_rotation_enabled 1; view_distance_max 10.440601302019751; volumetric_fog_density 0.80000000000000004; volumetric_fog_colour_1_distance 0.029999999999999999; volumetric_fog_colour_2_distance 0.050000000000000003; volumetric_fog_distance_factor 0.040000000000000001; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/stereo.fract0000644000175000017500000000525112274512437024132 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 600; image_height 400; view_point_x -0.55683369298059504; view_point_y -0.6488901041535271; view_point_z 0.24696541507945; angle_alfa -119.99999999999999; angle_beta 0; zoom 0.02; perspective 1.2; formula 12; quality 0.5; julia_a -1; analityc_DE_mode 0; DE_factor 0.5; ambient_occlusion 2; glow_color_1_R 65535; glow_color_1_G 6563; glow_color_1_B 0; glow_color_2_R 65535; glow_color_2_G 64489; glow_color_2_B 18303; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_1_G 0; background_color_1_B 0; coloring_random_seed 123; coloring_palette_offset 9.5; hybrid_formula_1 7; hybrid_iterations_1 5; hybrid_power_2 4; hybrid_power_5 8; hybrid_cyclic 1; stereo_eye_distance 0.01; stereo_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 3a443b 455042 424e3e 3b473d 3e4b39 414c44 556349 68744d 56603e 4a5931 414f28 70853c 768435 778234 758135 404a18 5d6830 70842a 5d6c2a 576429 595214 4d4d20 968918 969324 697831 4c5622 46531e 4e6022 5c7026 697a2f 4f6029 5a6b35 50632b 495523 5b6832 576528 525b20 78892b 475517 4f5815 788620 979f0e a0a311 a39f07 aba80c b0a704 66640d 515820 ada304 58611a 4c5316 a2a011 5b6228 4b5015 4f5319 988e12 b89c04 484e14 515717 464e16 464e1b 675f03 908b15 757f28 525d27 3e451b 41481c 444b1b b49518 8a8829 58650c 7a8523 7c8a2e 50611f 5b5e2e 44502a 485326 687532 535b2b 434d19 80881a 8a8e1a 8c983c 88a148 537e6d 4e7968 4f7868 507969 4d7666 4e7769 4d7766 4f7669 507667 4c7163 487163 436c5e 476d60 456b5e 466c5f 44685c 436358 416156 3c5c51 36564b 354e46 445448 515f52 83826e 3a3c2f 5f6443 4d553b 3b4732 37432d 3e4a32 3d4a30 3f4d30 425330 4d5936 4e5925 70783d 4b5934 968d48 485534 3a4837 384734 303a32 3a443b 3c453c 3e412e 4b5242 4a5043 595853 424c43 4d544d 65716e 6d7675 636c6b 585e5a 636a67 6d726e 646661 7f847b 8e9490 454f46 7e8482 545f59 4b564a 445147 44543b 3f4b41 596354 434d3f 434f45 48554c 4a514a 4e5747 3d493d 5a6253 424c41 3a4a43 3a4942 3f4e47 78837a 67706d 5f6867 7d8685 6b7473 404b47 586163 506053 63655b 5a6156 3d4946 3c4c49 404f4c 42514c 404f4c 404f4a 41504b 43524d 4d5854 6f7975 727b75 737977 757772 6f746e 626761 b0b1a2 f4f7eb f2f4e9 f1f3e8 f2f4e9 f0f2e7 f3f5ea f2f5e9 f3f5e9 f4f6e9 f2f3eb f4f6eb f3f5ea f4f6eb f4f6eb f3f4ec f3f5ea f3f5ea f3f5ea f3f5ea f4f6eb f4f6eb f4f6eb f4f6eb f4f5ed f5f6ee f5f7ea f6f7ef f5f6ee f6f7ef f5f6ee f5f6ee f3f4ec c5c8be 8c8f8b 91958e 5d6668 505f64 4e5b61 5f6d70 4c5e60 51615e 495b5b 4c5c61 47585f 47595b 44595d 44595e 455a5d 455a5b 445959 455a5d 425758 44595a 435859 415657 435956 435956 415452 3e5052 3f5351 435851 41534d 415049 3d4842 566056 3b4a45 49554c 414e44 ; mandelbulber1.21-1.orig/usr/share/examples/menger sponge 3.fract0000644000175000017500000000632412274512437025507 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 1280; image_height 720; x_min -100; x_max 100; y_min -100; y_max 100; z_min 0; z_max 1; view_point_x -0.33587179145078228; view_point_y 0.33404090401036141; view_point_z -4.017440972009667e-08; angle_alfa -17.120000289127422; angle_beta -2.23561127055138; angle_gamma -0.83617106104479355; zoom 8.7791495198902594e-09; perspective 1.5; formula 7; quality 2; DE_factor 0.5; shadows_intensity 0.5; ambient_occlusion 0.5; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; fractal_color 0; coloring_random_seed 24235; coloring_palette_offset 52; post_fog_visibility 109.90000000000001; post_fog_color_R 30876; post_fog_color_G 30876; post_fog_color_B 30876; post_SSAO_enabled 0; main_light_colour_R 58718; main_light_colour_G 51414; main_light_colour_B 21994; aux_light_intensity 0.12; aux_light_random_seed 12344; aux_light_number 1000; aux_light_distribution_radius 3.0000000000000001e-06; aux_light_visibility 600000; aux_light_random_center_X -0.33587179145078228; aux_light_random_center_Y 0.33404090401036141; aux_light_random_center_Z -4.017440972009667e-08; penetrating_lights 0; reflections_max 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 84f9a1 80f6db e4a966 6a4b3b b700 5178cb edb5cb 8b1300 52be 348610 2402 e2b0c3 beffb9 5f65c0 ff7d88 665077 dc70bb c20b 244caf 55c7 70947b d113a6 4ceb0d 519a3b c7b319 974505 c00006 5f0067 f34fd5 142d08 10000 79154e 1bb9a1 64ff33 c10b00 70d48f af006a 8be08d a851a2 7300ba dd8199 89c962 a028a2 2525 aaffff ac6041 82b56e c43aaa ee77d3 b3a823 392eea 480417 3751c0 75c4ea 4e2e00 c7052a 74f5ca a500d7 5dfb56 f66573 bfffd1 eba6ff bc0b98 47f959 d80def 17dc78 7d74ae f8408c 34155a c38967 71dc03 e66d63 633b34 8d98 418541 7f8768 ffffff 3800b3 fff69b 46e176 f07fe5 54c5d4 e3ae51 9619a9 e35297 525400 36720d 3c6ce4 d1af09 258e20 7eb200 906229 243027 7b0bcd b6ff59 924f3c e42b58 ad98 90beac 370000 1af 33a466 a8b0b4 edde84 f8cbff acdfad 220011 3a7a1b 56a4a5 753973 f0ffff 952212 e11967 b2ce48 d280ab aa26 a82432 b53b9 489531 d05c77 d23b69 e28a85 769c41 2a4ac1 b53aff bcfff0 860a11 dfffaf e8c4c7 9492fc dcebff 95b7 f5fda4 b94883 89cb2b 9faca4 a6a19e ff91d8 4aafe0 56a918 718884 e71eba 6ffdf ddb27d dd535 ab193 7386cf 72ff45 d3ea5b ffff3d ff41e6 bc2c31 ff7df2 227a87 4ba1bd 75ac40 45499a 68e74c f50029 1e4e66 65000c fbffd6 ab7b9e ffe34a 18d0c3 dc3317 52618b 5c9e29 ba5e00 9abec4 ff47ff e8ff71 fe41a7 48927a b1c497 6ecc35 7c5530 ffffff ffffec d71399 1cff3c 678498 4f365a 4913c 49cfe1 5d8100 7aba18 a285b9 ca3348 79a232 a700 a28a23 6dffff c4ff6b 88302e 2344a 5480dc 725f35 cc4 c7ffa0 ffb7f7 7e07aa 3f0089 33f208 68da66 1a7d22 49a687 b61f00 ebff79 c4da55 999 a59a a72837 a054c9 3c06 fc9fff 421ec5 c41 290022 e81006 393e39 99ffef 6b1aa3 3c2e6d 947aeb a64db8 a240b3 66c3 9d0000 d1b2a3 d34d5f ac0000 56bab4 4c00 8784d3 10bbf4 d9ffff e4d026 2f981f bf3944 acb100 310049 e693cb 1e8e7f 897599 5ebc bccb ff1ead ffedff de615a ccfe4b 91cfb3 ff3030 4fae00 dd2c30 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/default.fract0000644000175000017500000000353312274512437024256 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Mandelbulb with backlight.fract0000644000175000017500000000472612274512437027551 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; formula 1; power 8; DE_factor 0.5; ambient_occlusion 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 15938; background_color_2_G 18521; background_color_2_B 18977; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; fractal_color 0; post_SSAO_enabled 0; main_light_intensity 0; main_light_alfa 0.78539816339744828; aux_light_intensity 0.20000000000000001; aux_light_number 4; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_3_enabled 1; aux_light_predefined_4_enabled 1; aux_light_visibility 10; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/raytraced reflections 2.fract0000644000175000017500000001031412274512437027223 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 1280; image_height 720; view_point_x -0.8427533388095565; view_point_y -0.56929970321238166; view_point_z -0.2482080515282879; angle_alfa -80.000000000000014; angle_beta 10; zoom 3.9062499999999998e-10; perspective 1.2; formula 7; fractal_constant_factor 2; quality 0.10000000000000001; DE_factor 0.90000000000000002; gamma 0.69999999999999996; reflect 0.5; shadows_intensity 1; ambient_occlusion_fast_tune 0.40000000000000002; glow_intensity 0.20000000000000001; glow_color_1_R 0; glow_color_1_G 28730; glow_color_1_B 65535; glow_color_2_R 33091; glow_color_2_G 56081; glow_color_2_B 65535; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; fog_colour_1_R 27621; fog_colour_1_G 44020; fog_colour_1_B 56288; fog_colour_3_R 43866; fog_colour_3_G 43866; fog_colour_3_B 43866; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_speed 0.10000000000000001; coloring_palette_offset 229.30000000000001; post_fog_enabled 1; post_fog_visibility 146.19999999999999; post_fog_visibility_front 91.861860366061734; post_fog_color_R 45452; post_fog_color_G 45452; post_fog_color_B 45452; post_SSAO_enabled 0; main_light_alfa 0.3490658503988659; main_light_beta 0.52359877559829882; aux_light_intensity 0.20000000000000001; aux_light_number 1; aux_light_predefined_1_x -0.82217749892278935; aux_light_predefined_1_y -0.56579404900822838; aux_light_predefined_1_z -0.24761447935436881; aux_light_predefined_1_intensity 1.028009291394281e-05; aux_light_predefined_2_x -0.81518203512310117; aux_light_predefined_2_y -0.56182193151611326; aux_light_predefined_2_z -0.2487424656212581; aux_light_predefined_2_intensity 5.0220183615700529e-05; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 64872; aux_light_predefined_1_colour_B 29277; aux_light_predefined_2_colour_R 65535; aux_light_predefined_2_colour_G 9710; aux_light_predefined_2_colour_B 15683; aux_light_visibility 1500; view_distance_max 5.4615319385823007; volumetric_light_intensity_1 0.001; volumetric_light_intensity_2 0.01; raytraced_reflections 1; reflections_max 6; volumetric_fog_colour_1_distance 0.001425335988622764; volumetric_fog_colour_2_distance 0.0028506719772455271; volumetric_fog_distance_factor 0.0028506719772455271; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/FoldIntPow2 3.fract0000644000175000017500000000674012274512437025067 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 2.8590016299382892; view_point_y -0.93030523852267955; view_point_z -3.361548886548575; angle_alfa 45; angle_beta 37.999999999999993; zoom 4.0000000000000002e-09; perspective 1.2; formula 12; power 8; smoothness 0.10000000000000001; folding_limit 2; folding_value 4; analityc_DE_mode 0; gamma 0.90000000000000002; reflect 0.5; shadows_intensity 2; ambient_occlusion 2; ambient_occlusion_quality 6; ambient_occlusion_fast_tune 0.5; glow_intensity 0.5; glow_color_1_R 65535; glow_color_1_G 19878; glow_color_1_B 0; glow_color_2_R 65535; glow_color_2_G 28533; glow_color_2_B 34519; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 477889; coloring_speed 0.10000000000000001; coloring_palette_offset 224.5; post_fog_enabled 1; post_fog_visibility 174.40000000000001; post_fog_visibility_front 29.699999999999999; post_fog_color_R 59042; post_fog_color_G 55154; post_fog_color_B 32789; post_SSAO_enabled 0; post_SSAO_quality 40; post_DOF_enabled 1; post_DOF_focus 161.03757239499134; post_DOF_radius 7.5999999999999996; IFS_scale 1; IFS_rot_alfa 0.17453292519943289; IFS_rot_beta 0.17453292519943289; IFS_rot_gamma 0.17453292519943289; IFS_0_x 0.70710678118654757; IFS_0_y 0.70710678118654757; IFS_1_x 0.70710678118654757; IFS_1_z 0.70710678118654757; IFS_2_x 0; IFS_2_y 0.70710678118654757; IFS_2_z 0.70710678118654757; hybrid_formula_2 8; hybrid_formula_3 10; hybrid_formula_5 16; hybrid_power_5 10; mandelbox_rotation_main_alfa 3.0000000000000004; mandelbox_rotation_main_beta -8; mandelbox_rotation_main_gamma 9; linear_DE_mode 1; raytraced_reflections 1; reflections_max 2; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 30312c 282a28 292725 262624 262523 25241f 252e24 3f5537 1f1f1c 1e201c 202224 2f322b 82786b aea48b a8927d c9b29a c1a895 77654e 5e4b37 61513d 856869 4f3523 332522 7e5949 77564f 866658 675555 231910 9c7d55 8e7666 423a38 603d2b 151414 211a1c 11141e 413037 1a1613 666254 7a7f83 14100d 110d01 67585a 3b2d1d 281904 221912 92878e 78715c 655e6c 5e504e 464445 706662 35312b 4b484b 221d1c 372e2c 50503 5c4133 332324 5a4b3c 322c20 796762 6b5849 6f6c61 71614c 5b4b3b 25191b 1c1b20 1d1714 767858 362828 6d696d 565146 524245 362929 4b3e2b 110d0e 272121 20202 26231b 3b2a2c 41322e 856149 13110c 2a2722 3f3631 332f2a 342a2b 201e18 422b33 553a38 b19b83 281f21 15120d 355a39 1f2020 70707 141213 858873 2e292f 1f202b e0d0d 14110f 43321f 261d25 7a7ba2 201d1d 222524 525058 998a8b 95765e 9b8077 8e756a 5c4f3d a08a7d bda78f 917565 8e7a5a 705949 816e6b a78776 a0826d b58e75 be997f ab8f81 88706e 5d5955 6c6960 898778 8e9d83 7ea189 83aa88 94a477 889061 757657 7d7759 796e54 74754e 78814c 7a884c 6c784d 797653 6d7150 6a754b 6c6f51 64644a 504a3f 4f4642 413e2d 3d382d 4a3f35 5f5f60 a6b9eb e5eeff b0c6e8 7f888d 8994a9 929eaf 6e766e 68777e 8b9ec8 8a9fbc 94b0e2 7a96ac 919ebc a5a5a5 87897c 605e4f 585e4c 9faf9a c1cbc8 d3dde6 cad2d9 8e9685 6d7669 7c9885 9aafaa b8d2ec fbfbf9 ffffff fefefc bad3f8 85a1af 737a80 8d9ca2 a0aeb5 8b9da1 bbd3ef bdd0e6 6f8069 424932 2b2820 2f2b20 484f31 69704e 696c49 4e4f35 4a462a 444e32 4f5135 44523a 54684c 92aebf 9fb5c2 8d9e7c 667448 4f5637 302f21 25271a 2a261a 2d2a1e 2a271b 2d2e21 585b52 91a6d8 87a0d8 53615f 4d4c34 64694e 85877b 93a277 bed1a4 bbc79b b7dab8 e7f2f5 eff5f6 d6dda8 a1b36a 7a8f51 52552c 454e2c 76874a 88905d 71814a 7d8051 6b6c44 555b37 6f8540 c4e089 f0fbc8 e5f1b2 b7ce84 8f9c5f 708246 45502c 383a26 322e25 25251d 26261e 252620 2e2d28 2d2f27 3f3b30 292826 252a25 262620 2b2c27 ; mandelbulber1.21-1.orig/usr/share/examples/power 2 - Julia environment mapping central light.fract0000644000175000017500000000635212274512437033716 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -2; view_point_y -0.65000000000000002; view_point_z -0.69999999999999996; angle_alfa -74; angle_beta 17; zoom 0.001; perspective 1.5; formula 3; quality 0.10000000000000001; julia_mode 1; julia_a 0.69999999999999996; julia_b 0.20000000000000001; julia_c 0.29999999999999999; analityc_DE_mode 0; DE_factor 0.10000000000000001; reflect 3; shadows_intensity 0.20000000000000001; ambient_occlusion 0; ambient_occlusion_fast_tune 0.5; specular 5; glow_intensity 0; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; textured_background 1; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; fractal_color 0; post_SSAO_enabled 0; aux_light_intensity 0.20000000000000001; aux_light_number 1; aux_light_predefined_1_x 0; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_intensity 0.10000000000000001; aux_light_predefined_1_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 58498; aux_light_predefined_1_colour_B 17367; aux_light_visibility 20; reflections_max 1; file_destination images/image; file_background /usr/share/mandelbulber/textures/envmap.jpg; file_envmap /usr/share/mandelbulber/textures/envmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/trigonometric - power 6 julia.fract0000644000175000017500000000470412274512437030165 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.68511116220774626; view_point_y -0.172860211033669; view_point_z -0.33127143116294722; zoom 0.0040000000000000001; perspective 1.2; formula 1; power 6; julia_mode 1; julia_a 1; julia_c 0.29999999999999999; DE_factor 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; post_SSAO_enabled 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/power 2 - default.fract0000644000175000017500000000442712274512437025635 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 592; view_point_x -0.5; formula 3; analityc_DE_mode 0; DE_factor 0.5; shadows_intensity 1; glow_intensity 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; coloring_random_seed 1123456; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette c866fc b940 d8abff 150078 cebd8b 71d210 c90000 ffc461 1d50de 400 d3ff3e 32d759 b3ff9f d9b259 963f41 ec8b41 f336ff 70ffdf ffffff b0ffff fc8aff bf00ea 261dd1 880000 1d0255 3e ff53ff bd14 563c5f 536b92 462259 264855 83e4dd ef2f81 6291ff 391b0b 465878 76be9c 3c51ff 8e78d3 3b8f76 d81100 700059 79d79b ffe6f0 b1996c d28238 d5e75b a9059a 52d6ed ff85ea cc0075 43cebc 44ff89 7fba60 678171 9f24d3 41ffff 50bcff 876d00 4bba90 71cc20 97913d 44df75 ff4ee4 ffc7f9 8608 8184c0 f508da e60c4f 5f4e33 98445 e83eff aab2d0 76ffaf 683e47 1100a3 35 7cb912 375170 8b7ebf ff82e3 251fd4 6e2de4 35a3b1 8e00b3 96ae73 6d50ff 60747a a00772 9fbfd2 c58f79 2fff3b 2cfff1 eea4ff c4f2b2 5eff65 45f1ff 397231 ffbfe2 c4fbd8 bb8987 e94357 4d864 a16f00 84ff7d 7b9181 132f fff754 6bc713 50b7 60001 8f14ab 180585 d8482c 7e7d9e 1c9bbe 80eff6 48b685 f0c798 2c94f1 9c7900 ae1933 3e7a17 844462 3f648b d9cfd0 d0a3ba ff7e29 ff321a 5a5cca ff268e 27ae3b d0847e b1ade0 cb15b2 d8ffba 1b9d4a c6e101 ffaf68 165d4b 0 a5d1ea ffb571 b0ff47 9f8e1f 5d0d28 95698c ff3a3b 9e e4b746 79c492 cededf 7a4a ccb7f2 1e7d3e 652816 812970 916700 36c1 35c0f6 272d92 744d 9a42d 43bb94 b0d0ca 45bb57 3c633a 70 532a57 e0e69a 85c2a8 bc7c92 876 ee00e6 3f0462 3304b7 603f28 9329 d855d8 590057 491c0e ce43 19ece0 ec9200 ba006a fffffa fa6fb8 802e06 6731ff 4ebc 22854a 436387 670000 e2cec9 87cc9d f39cc5 475b2c f736a3 ce007e 791b55 2d6157 544623 ffc1b3 314ce7 cc3821 7fd51d bd827a c90089 6b0051 377880 4e481b 79e600 df d1fecf ac7527 5d9d90 fb51ff a6977a 9965 be9cdf d4fc7d cf2122 7a2dcc ffa7ff 93f3e0 8a5b5f 50205b d150f6 d000a5 56ff48 3c1ec7 afcfd9 b1a883 ab8a95 920000 17b698 a4339d 19c597 f46e63 5c 73ac94 554855 44496b 3e41ad 6b4000 aeff9a 5fc6d9 cb3de3 d86782 d00080 5f09c3 7399d6 ffffff c84cda ffffff ; mandelbulber1.21-1.orig/usr/share/examples/rotated mandelbox 2.fract0000644000175000017500000000570012274512437026346 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.917084127904042; view_point_y 1.8348181888350721; view_point_z -1.887474909815255; angle_alfa 119.99999999999999; angle_beta 20; zoom 0.016; formula 8; quality 0.5; DE_factor 0.9453125; brightness 0.80000000000000004; ambient_occlusion_quality 3; glow_intensity 0.9453125; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_1_G 51968; background_color_1_B 34596; coloring_random_seed 23423; coloring_speed -0.40000000000000002; coloring_palette_offset 41.5; main_light_alfa 0.78539816339744828; mandelbox_scale -1.2; mandelbox_folding_min_radius 0.10000000000000001; mandelbox_rotation_X1_beta 4; mandelbox_rotation_Y1_alfa 4; mandelbox_rotation_Y1_beta 3.0000000000000004; mandelbox_rotation_Y1_gamma 5; mandelbox_rotation_Z1_beta 2; mandelbox_rotation_Y2_alfa -3.0000000000000004; mandelbox_color_Sp1 0.5; mandelbox_rotation_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ff4a90 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/raytraced reflections 1.fract0000644000175000017500000000573312274512437027233 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.50949349258296206; view_point_y -1.5968839775709549; view_point_z -4.1347224594028997; angle_alfa -59.999999999999993; angle_beta 20; zoom 3.9999999999999999e-12; perspective 1.2; formula 8; fractal_constant_factor 2; quality 0.00020000000000000001; DE_factor 0.5; gamma 0.59999999999999998; reflect 0.80000000000000004; shadows_intensity 3; ambient_occlusion 0; glow_intensity 0; glow_color_1_R 0; glow_color_1_G 28730; glow_color_1_B 65535; glow_color_2_R 33091; glow_color_2_G 56081; glow_color_2_B 65535; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_1_G 0; background_color_1_B 0; coloring_speed 5; coloring_palette_offset 126.8; post_SSAO_enabled 0; main_light_alfa 0.3490658503988659; main_light_beta 1.2217304763960306; view_distance_max 23.31669483477744; constant_DE_threshold 1; raytraced_reflections 1; reflections_max 3; volumetric_fog_density 0.10000000000000001; volumetric_fog_colour_1_distance 0.00076466135982497475; volumetric_fog_colour_2_distance 0.0015293227196499499; volumetric_fog_distance_factor 0.0015293227196499499; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/IFS Icosahedron.fract0000644000175000017500000000527112274512437025473 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; shadows_intensity 1; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; IFS_offsetZ 1.6180330000000001; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_3_x -0.80901699437447483; IFS_3_y 0.30901699437170932; IFS_3_z 0.50000000000276568; IFS_3_enabled 1; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; IFS_4_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/examples/rotated mandelbox 3.fract0000644000175000017500000000567712274512437026364 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 2.664248479959852; view_point_y 1.5688676396704719; view_point_z -1.5357138309319029; angle_alfa 150; angle_beta 20; zoom 0.0012800000000000001; perspective 1.2; formula 8; DE_factor 0.69999999999999996; brightness 0.80000000000000004; ambient_occlusion 0.5; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_1_G 51968; background_color_1_B 34596; coloring_random_seed 23423; coloring_speed 2; coloring_palette_offset 30.600000000000001; main_light_alfa 1.0471975511965976; main_light_beta -0.69813170079773179; mandelbox_scale -1.3999999999999999; mandelbox_rotation_X1_beta 10; mandelbox_rotation_Z1_alfa 20; mandelbox_color_Y 0.029999999999999999; mandelbox_color_Z 0.040000000000000008; mandelbox_color_Sp1 0.10000000000000001; mandelbox_rotation_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 8b6f7d cda291 c2815f 3d2718 966846 8e6249 845641 7d5232 bb7f5a c98f4d 9d644a b46a3e 84482e 834c3b 854d3a b36430 855f49 c09e88 e0a969 9e7166 fab16d c89e84 a28e81 c68f6b d8925e a86945 907156 665244 66564f 7c4d3d d78d5b 856554 ac856d be7a59 ec9c53 594235 9d6544 a27560 cf8a4f cd8d6e da9b79 694d24 78431f 472b21 16010d 5d3c22 c48244 844f42 906450 ba7b4e 130c15 985f43 895a3a 965a37 a0754b 101315 503d2c 7d6351 8a5744 b78367 251816 3010e 593e30 714234 855748 725240 60312 5030a 131410 9040d 835e4c 7e431c ae683b 93725b 96866d 5a3f2b 603f30 15 34271d 6c4734 885845 8d5b3f 20107 c060a 362312 624129 704b3b 915b3e 2000b 2c1e1e 4f3425 6a4a43 b06e49 674b44 825c51 2a150d cc6f2c 773f29 916952 ae8050 211009 362d26 f 442e22 753f1b a5734e 8f5f4c 442112 461c08 a95f33 68321a 90583c f0a09 b1784f 8f5730 13060a 50382f 2f2321 b48873 81533e 3d1712 784d37 8e5d42 100709 8f7261 7d685b 614c39 5b4738 7d6354 5d4c3f 614b3c 746153 3b3632 514646 5d493d 856d57 a18368 6e504b 42383d 49495b 64575d 3a4563 5e77b6 b5b9d6 bbbad4 c0bbd9 c7c0e1 c9c2e4 cdc5ea cec6ef d0caf1 cec7f1 cfc8f4 d2caf6 c4c1f6 b0bbf6 aeb8f6 aab8f7 a6b4f7 9d92b6 8b7358 8f7b5e 7e7273 9badf2 a3b0fc 6e5640 62625d 646462 8b9ad3 8096e1 95abf9 6077bf 5f79c4 87a1f3 85a2f0 84a1f1 839ff2 819df1 7e9ef0 7e9df0 7d9cf0 7d9bf1 7c9aef 7b99ef 7a99ee 7999ee 7899ed 7898ed 7898ed 7898ed 7898ed 7797ec 7598ec 7598ec 7598ec 7698ec 7697ed 7597ee 7596ed 7698ef 7597ee 7697ec 7797ec 7898ed 7998ed 7b99ef 7b9aee 7c9bee 7d9cef 7c9bee 7e9df0 829ef1 829fef 84a1ef 86a1f2 87a1f1 8aa3f1 8ba6f0 8ca6f0 91a8f2 93a9f4 96acf5 99aff6 9caff4 9fb2f5 a2b3f5 adb8f6 bcbff6 bcbff2 bec1f4 c2c2f3 c2c0ef c1c0ea c0bfe9 bfbfe5 bdbde2 b8b9d8 b1b4d2 6a81ac 586882 55636c 85827f 8893b7 6c85b1 6d83b4 5d78a8 5a76a6 5b77a7 5371a0 5372a1 4b6a98 506f9d 466895 535a7f d2ae9d aa8c73 ; mandelbulber1.21-1.orig/usr/share/examples/tglad - scale 3.fract0000644000175000017500000000515612274512437025240 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 29.999999999999996; angle_beta 20; zoom 12; formula 8; quality 2; brightness 0.80000000000000004; shadows_intensity 1; ambient_occlusion 2; ambient_occlusion_quality 3; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 36798; background_color_1_B 0; background_color_2_G 0; background_color_2_B 0; background_color_3_R 65535; background_color_3_G 65535; background_color_3_B 65535; background_color_1_G 36798; background_color_1_B 0; coloring_random_seed 32423; coloring_speed 2; coloring_palette_offset 68.299999999999997; mandelbox_scale 3; mandelbox_color_Sp1 2; mandelbox_color_Sp2 0.5; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette f8b4e4 6cbd7c 9cdd6b 570010 8418f 3d2100 590062 f23e9b bc4851 ab73ad 460e91 50f231 16a389 f5a2a9 af350c 7aad4a a34900 4a272e 32bc56 734c9a 33664f b6a650 26a74b 387a9c bd8392 97ad7c ceff88 29c89a 440080 be00b4 e250b8 bb46ff d5b8a7 a05e9b 22b115 ed2336 772a ee6cff 335725 ab4d7f c6e7dc 45778e 69e553 c14231 49ecff fffa3c 1828cf 9b7440 3800ac 9a6644 66b254 b04100 5dffea 9b9200 b0 89fffb 32d58a 16a992 812f 57a0ff 3f8126 4a512d a93e35 200b4 ac2dbe ff8c39 22c0 93be2e 607629 5aeacf fddaf5 a18820 1b4488 cebfff f4ffc8 f72ee1 b71d69 fb2cc1 d484db 352441 298904 654fb0 893 8dcba0 7f9fb4 d98237 f7ff33 2e1c 6936 78a641 ff39b1 9f004c d045e8 e73f5e 3e8df4 aa006f cdff54 785db5 b687fb 6d41bb 8ca900 dc4724 800000 2ed476 c9b5ff b6c4 6bed3d 43ff44 c6484e 7d6095 3aa4a2 97374c a61f5f 4391cc 20ab19 8d3200 5924bd d09d59 6bffb9 40e922 3cb4f7 b2314d 712e ff942f a5d944 335a2a 5cc040 87405f cc2eb8 9a40ce e73179 b5994e 3e5e72 ffe83a 7d4faf 7a0081 46570b b9faa6 e0d51b 5955c5 eb7078 4ba630 fff8ff c9b0f d9010f e8a2e2 b03683 8f4cc2 4ccbcd 86126d cd30ed fcff5b 37735d b80099 2a2e59 53f4c4 ffd27f a2a9a7 ffbe76 dbc1ae ffeff6 ffda97 a1896b 8032b9 194cec 26c57d 96ffff 2b18a3 39526 146100 348c24 60 4f55c6 20497a e3f82 8f5dc6 241ec7 97b67b 419d00 1ab7c8 32b40c e069ad 8b1248 9b3a00 72d63a bbe43e c052cf ca5825 ff5b73 e23e40 457cbc fffff7 5aaa00 3f0000 78d1d0 ffebff ff54ff 23d8e0 5ea56e 54093b 42c242 a90480 c742ff bbc155 f23912 b750 92f3a1 0 600080 500 52ff3c f7bdcb c1a8c5 a55a4e 5a700 ce2f76 482793 52a90d b54ba3 ae1400 b2af23 d43c41 76459 9a0045 110061 dcb545 e0c8d2 ffec20 a850ff 9a4fb2 ff59ff 586fe9 72611e 3597 58c4c5 336887 ffe8c2 f02c34 9141ac 83683e e67852 bcf8cb 865af0 ffb7f7 546d40 5f3b00 afbdcc fff4fe 10f458 d7ff76 e0dd5 8e9690 5fff6f 6248a7 e04ed6 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/tglad - scale 2.fract0000644000175000017500000000504212274512437025231 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 29.999999999999996; angle_beta 20; zoom 20; formula 8; quality 2; brightness 0.80000000000000004; ambient_occlusion 2; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_3_R 22383; background_color_3_G 7213; background_color_3_B 7213; background_color_1_G 51968; background_color_1_B 34596; coloring_random_seed 23423; coloring_speed 2; coloring_palette_offset 25.5; mandelbox_color_Sp1 0.5; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ff4a90 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/IFS Sierpinski.fract0000644000175000017500000000553212274512437025355 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -0.40348724364265348; view_point_y -0.71355769784665479; view_point_z 0.18023562212760461; angle_beta 10; zoom 0.00095999999999999992; perspective 0.90000000000000002; formula 10; quality 0.5; DE_factor 0.80000000000000004; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; post_DOF_enabled 1; post_DOF_focus 131.06586416840898; post_DOF_radius 10.300000000000001; IFS_offsetY 1; IFS_offsetZ 1; IFS_0_x 0.70710678118654757; IFS_0_y 0.70710678118654757; IFS_0_enabled 1; IFS_1_x 0.70710678118654757; IFS_1_z 0.70710678118654757; IFS_1_enabled 1; IFS_2_x 0; IFS_2_y 0.70710678118654757; IFS_2_z 0.70710678118654757; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/IFS Trees.fract0000644000175000017500000000547112274512437024321 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 592; image_height 592; view_point_x 0.20771801765757561; view_point_y -0.0324924935715643; view_point_z -0.3607963176801316; angle_alfa 29.999999999999996; angle_beta -10; zoom 0.059999999999999998; formula 10; smoothness 2; background_color_1_R 13567; background_color_1_G 43541; background_color_1_B 64847; background_color_1_G 43541; background_color_1_B 64847; coloring_random_seed 706976977; IFS_scale 1.3200000000000001; IFS_offsetX 0.38462958684577397; IFS_offsetY 0.9230710053527027; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.70710678118654757; IFS_0_y 0.70710678118654757; IFS_1_x 0.70710678118654757; IFS_1_z 0.70710678118654757; IFS_2_x 0; IFS_2_y 0.70710678118654757; IFS_2_z 0.70710678118654757; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_alfa -0.43633231299858238; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 82a8d2 8b511b 94da61 cbe255 a6f1d8 97b01c 13985d ca9600 99843 66db7d b7e193 779d00 589131 6e7a36 90ff2b 951580 ffffde 7200b9 94315c 6e49 58d3df 9159e0 36d747 f8d3ab cf62f7 30b074 5b4a87 688093 a4c3ee e99bcb 4bebb3 b958fd 316b55 6b19b0 10e59b a9729e b60da6 cf9997 7339ff 43b8ff 2f6a22 78c807 afa533 9c2c 3c66da cd3fb6 66adee 87bb d2a4 b5c700 5d2597 e4e653 55ffe5 466be7 9f5c85 359222 329464 5d664d ff61a3 31dfc7 9b31d8 cff161 20b906 220047 f2ffcf 8a3764 51c005 91bda6 69526 85862a 4738f5 3f4414 15aa6a 3e2b59 d043eb 8eb5 13ccab 7afe5e 213e23 641969 2231ab 8b5f 3ab788 0 0 ee4d0c 450020 91fff2 db3061 b2 4c0700 695814 4400cd 41d02e 44d9ff 7785b6 ce2f70 6791ff cbff8b 2b26 7b46d5 5845e0 a5738b 7509e de6dff c6ddd3 830022 a6d695 ff6efa 1e4525 2b 480000 13c0ba d5c552 864807 5700 fbff46 102f00 517269 ced4ff d5ffff 54d26d 1e7800 282845 409d48 ab1c81 980000 b6e441 c10f99 1336 d175b4 880000 9a3e2b 35874f 8f4243 6dccf0 c16f55 ffff8f 662cd2 9899 fff1ff 663d3b b6b5b4 779a52 50ee72 889387 a94300 16bb88 ab875b c083 d49640 86aa2 732f89 d6231e f393ff 1f7814 2b9b48 900028 603170 e65d2a 658c66 edc357 4463df f811a5 c3049a 2ae7c2 49625c 61281e a563 d8ffe7 5b946b 5bc65c 23c7 76b5 d50e49 89baa3 973d8d 9cc 922c7e 56 1f3440 e934aa 984999 ff3eb2 2f007d 2674b4 ea7cff 97b44f f09723 eef0dd b50000 3cac25 898dba 42b0c8 ffcef3 1c0ca a1ffff 935728 af7c5c 257d4b fffe73 4600b9 96a186 b9a8ec b6d15a 51b7 fd429a b3d9b0 95e086 b84439 38126c ab49da 819c04 7846bd 180000 d8b15b 5cac4e 2fc5ea d25023 76da5f a18e00 8e7100 801090 d400bc b2119a c16f37 31cd6c 8cb0ce 3ec738 5f5f00 bfdba1 ff991f cbdaf1 745391 d6b3e4 60afa7 c029ff 6b004c 12a1d 74008e cf86eb bc5f8e 5abb45 6bee81 ff8f5c 6293e1 c2036d 333ed2 a59e28 6a228b ab9e3a b0e0ff e100b4 9b9fbe b63fec ffffff ; mandelbulber1.21-1.orig/usr/share/examples/tglad - scale 2 - coloured lights.fract0000644000175000017500000000701412274512437030417 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 29.999999999999996; angle_beta 20; zoom 20; formula 8; quality 2; brightness 0.80000000000000004; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 34107; background_color_1_G 0; background_color_1_B 39212; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_R 10658; background_color_3_G 0; background_color_3_B 47123; background_color_1_G 0; background_color_1_B 39212; fractal_color 0; coloring_random_seed 23423; coloring_speed 2; coloring_palette_offset 15.9; post_SSAO_enabled 0; main_light_intensity 0; aux_light_number 4; aux_light_predefined_1_x 9; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_intensity 1; aux_light_predefined_2_x 0; aux_light_predefined_2_y -9; aux_light_predefined_3_x 0; aux_light_predefined_3_y 0; aux_light_predefined_3_z -9; aux_light_predefined_3_intensity 1; aux_light_predefined_4_x 9; aux_light_predefined_4_y -9; aux_light_predefined_4_z -9; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_3_enabled 1; aux_light_predefined_4_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 14250; aux_light_predefined_1_colour_B 11747; aux_light_predefined_2_colour_R 13049; aux_light_predefined_2_colour_G 18416; aux_light_predefined_2_colour_B 65535; aux_light_predefined_3_colour_R 19564; aux_light_predefined_3_colour_G 65535; aux_light_predefined_3_colour_B 17049; aux_light_predefined_4_colour_R 65535; aux_light_predefined_4_colour_G 64956; aux_light_predefined_4_colour_B 17205; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ff4a90 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/IFS Icosahedron 2.fract0000644000175000017500000000534412274512437025616 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; IFS_offsetZ 1.6180330000000001; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_3_x -0.80901699437447483; IFS_3_y 0.30901699437170932; IFS_3_z 0.50000000000276568; IFS_3_gamma 0.3490658503988659; IFS_3_enabled 1; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; IFS_4_gamma 0.3490658503988659; IFS_4_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Hybrid 4.fract0000644000175000017500000000640212274512437024175 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 0.55385172694576934; view_point_y -0.95500785116533105; view_point_z -0.5690509325733607; angle_alfa 29.999999999999996; angle_beta 20; zoom 0.12; perspective 1.2; formula 12; julia_mode 1; analityc_DE_mode 0; DE_factor 1.640625; shadows_intensity 0.5; ambient_occlusion 2; glow_intensity 1.640625; glow_color_1_R 65535; glow_color_1_G 7594; glow_color_1_B 0; glow_color_2_R 63197; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 16232; background_color_1_G 15941; background_color_1_B 4024; background_color_2_R 18071; background_color_2_G 0; background_color_2_B 39046; background_color_1_G 15941; background_color_1_B 4024; coloring_random_seed 123; coloring_speed 2; coloring_palette_offset 113.2; IFS_scale 2.6099999999999999; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447483; IFS_3_y 0.30901699437170932; IFS_3_z 0.50000000000276568; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; hybrid_formula_1 7; hybrid_formula_5 10; hybrid_iterations_1 3; hybrid_power_5 3; hybrid_cyclic 1; linear_DE_mode 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/examples/spherical folding - menger sponge.fract0000644000175000017500000000450512274512437031036 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; angle_alfa -29.999999999999996; formula 7; spherical_folding_mode 1; spherical_folding_fixed 1.1000000000000001; spherical_folding_min 0.55000000000000004; shadows_intensity 1; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 20550; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_1_G 20550; coloring_speed 2; coloring_palette_offset 21.800000000000001; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Hybrid 1.fract0000644000175000017500000000627512274512437024202 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.52961829599101706; view_point_y -3.1227761354339729; view_point_z -1.0511253618082941; angle_alfa 40; zoom 0.40000000000000002; formula 12; quality 2; smoothness 3; julia_mode 1; julia_a -1; analityc_DE_mode 0; gamma 0.69999999999999996; shadows_intensity 1; ambient_occlusion 1.3; glow_intensity 0.5; glow_color_1_R 8461; glow_color_1_G 36873; glow_color_1_B 0; glow_color_2_R 63197; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 16232; background_color_1_G 15941; background_color_1_B 4024; background_color_2_R 18071; background_color_2_G 0; background_color_2_B 39046; fog_colour_1_R 29068; fog_colour_1_G 29068; fog_colour_1_B 29068; background_color_1_G 15941; background_color_1_B 4024; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 615578; coloring_speed 2; coloring_palette_offset 164.40000000000001; post_SSAO_enabled 0; post_DOF_enabled 1; post_DOF_focus 159.38411530779516; post_DOF_radius 18.100000000000001; main_light_alfa 0.52359877559829882; main_light_beta 0.52359877559829882; hybrid_formula_1 8; hybrid_formula_2 3; hybrid_formula_5 0; hybrid_iterations_1 2; hybrid_power_5 1.5; hybrid_cyclic 1; linear_DE_mode 1; volumetric_fog_density 0.10000000000000001; volumetric_fog_colour_1_distance 0.020045711661303929; volumetric_fog_colour_2_distance 0.040091423322607872; volumetric_fog_distance_factor 0.040091423322607872; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette f0c05 131105 1f160f 291304 5d4b3f 77513f 6c4b38 4b3127 240c08 281110 783826 7e2f22 3e0704 480c07 560b0a 581312 7c1916 9b2a25 9c3c27 bf5437 b05b2d e09574 f89279 f3735a bf3823 931d11 ea6c53 8f291a 54231e d5654b d14d26 c54d29 5c1a10 106 41520 d2939 c2e3d a3c4a e4753 4e97a3 48909b 488d80 6b7536 85541b b4681d 956421 502d0f 3e2b0d 241001 220c04 1d0c06 241412 2c1608 744e2b 96492f 95432e 9a4530 a34327 a64d2e c6674b a74a2b d66c52 ca5e44 b54428 cf594b e07156 c86642 c8543e c15839 ad5531 c46542 b95735 a84f31 ab543e 973f2d 913d33 771311 8f2933 99474b c18190 621b1e 47140c a16e7a d0b0d 104 20001 20000 4 80306 8a1007 897c37 8a8242 9aa758 8bb25f 48975f 60ac6d 59a34e 73ad69 8dbc67 9eae5c ae9d52 bb9e58 c6a369 b46644 773b2d a0407 380601 8a2711 c45734 effdf7 f8fbfb f8fbfb 8f5d75 aa595d 230508 5f3855 407 30008 7 10100 10000 20206 845f42 875a42 160301 24180f 10004 30102 0 20202 20202 70302 80602 170f07 c0702 a6811f dab259 785b28 bd8d04 feedb4 d3cdac f3f1b4 fefce2 f9fef2 f8f775 4a3d21 21150d 94875f 6e5733 312305 90100 1d1103 2f2a06 564c1e 8e8e1c c9e26a 6e7e20 9fb529 c9b855 d9aa72 775219 a87d5b 5c460e 765d27 806c36 180600 906f3f c49c59 ab874b 758028 93b53d 94a541 7b8229 729b2c bcd258 6d552d e3df87 b1b54f bde765 cdf17f c1e271 dcf37e a0ab38 c7d257 c6eb46 819c35 474f00 425d11 47540a a4cf6a 97c65f c0c168 9ec549 457405 42561c 1b2205 2b230b 44452a 342a10 281d05 2a2208 cedb8b 675027 665b1d 232303 5f9133 9fda46 58810c 577a1b 71a537 374c09 35480d c0b779 483614 47351e 836629 ddc38c 9a8939 e4cf93 e7cd72 ddd94d f4e857 fbfa5b e9f255 81a108 bac45c faefa9 4a2d07 4c3d31 766c37 21300 315014 371602 815730 f6d195 5f3e2b 7c5723 e38a3b c69d5b ecdbad 150a05 b0500 332623 70000 10204 10000 0 0 0 0 0 0 101312 90706 170f0d 170d09 ; mandelbulber1.21-1.orig/usr/share/examples/Hybrid 2.fract0000644000175000017500000000537412274512437024202 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -0.5; angle_beta 50; zoom 3; formula 12; quality 2; analityc_DE_mode 0; background_color_1_G 33103; background_color_1_B 56633; background_color_1_G 33103; background_color_1_B 56633; textured_background 1; coloring_speed 3; coloring_palette_offset 79.599999999999994; IFS_0_x 0.70710678118654757; IFS_0_y 0.70710678118654757; IFS_0_enabled 1; IFS_1_x 0.70710678118654757; IFS_1_z 0.70710678118654757; IFS_1_enabled 1; IFS_2_x 0; IFS_2_y 0.70710678118654757; IFS_2_z 0.70710678118654757; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; hybrid_formula_1 3; hybrid_formula_5 10; hybrid_iterations_1 3; linear_DE_mode 1; file_destination images/image; file_background /usr/share/mandelbulber/textures/background.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette fca7a2 fb9d67 fc9a3d fdb428 e1b487 816a45 ecb583 d9ae63 774301 f5c977 f9bd65 e1bc5d 91a24b 62a149 3e923a 11762a 134f28 2a2823 460a21 4d0619 46041c 370212 2c0315 29050a 270604 220b1e 4f 50441 40524 20705 50500 50000 c0203 90000 500 50304 182e2b 358650 43ae27 3ba516 21915c 2c7b3e e2d0a e3807 152a07 b0609 c0219 1b0325 400921 9b2d20 627126 1e3028 872c1f 5b0e1d 1f802e a15e24 614b21 593c26 2d4c1f 501013 600c2e 59264e 4f1543 55006f 39123e 41c10 b1c20 71128 1f4d20 37851c 338c31 328d39 34903b 369041 389044 3a8f4a 408f55 458b5c 45a25c 66679f ac68b6 9e69fe 927bc5 907ec3 a37c9e b67b31 dc874d fecf88 f8b47a fde18f fafc89 fff58f fbae8a fec284 b29f6a 5e5d6e 302a7a 3c3db1 5a9498 7d77bf 9f8af1 5524c9 6425c8 662466 60236c 502794 4c27d4 a696b7 7465ab 7a63c1 9265c5 a260a7 ab6294 ab62b2 a757f7 944cf7 7e3efd 7038fc 5e31cd 4c297a 3e2447 381e4b 2f1a4f 2d1b39 311613 3a161a 4e2d17 483616 502b19 5c5f1c 5c6c13 675715 763d19 8b6906 8f5701 8b2c02 903200 883602 71310c 451f40 120c7e 6c 90057 130844 160b4b 1b0c73 1f0c88 260e8d 2f148c 491380 681f7d 83348f 844dbf 8872c2 9399c2 95acaa 99b195 85ae97 37765e 142d19 30221b 612318 743c08 866503 894200 7f2308 6d0721 2c0c31 110e47 1c0667 1d0d39 3d187f 3e1746 441b23 461c69 4f207d 592681 612b89 6d338e 7a3a95 89509a 996ba1 a27cac b38ab4 b79bba a9a6c4 6ea2bf 5f9dc4 5e98c0 5f94bc 6e8bbb 9891c6 a275b9 995ed7 8a3cfa 8b32ef 802f60 282b48 1e390d 192d09 151d26 21836 17717f 52a6a5 28b0ad f83ad 634a2 318b3 32dd2 1f74f6 5b6cff 80261 f107d 151e9d 1b29b9 2d3ced 3d27fd 3431a5 8181a 13442d 44c25 62e15 f1e0a a1208 a1b 10018 80319 a0308 140606 190b0a 2c180f 262011 2a2603 252406 221907 190d06 40601 10000 110904 21140d 37220e 462e1d 5e3a19 773f20 8a4720 a05631 c37c39 dbbc40 f0f84a f8fb4e fffb60 fefa71 fcfb76 fbfd7a fcee7c fcc391 ; mandelbulber1.21-1.orig/usr/share/examples/xenodreambuie's formula 2.fract0000644000175000017500000000523412274512437027463 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.016595536592831282; view_point_y 0.63035674208515413; view_point_z 0.1112428239168104; angle_alfa 20; angle_beta 20; zoom 2.7999999999999998; perspective 0.90000000000000002; formula 11; power 2; julia_mode 1; julia_a -1; analityc_DE_mode 0; DE_factor 0.80000000000000004; glow_color_1_R 65535; glow_color_1_G 0; glow_color_1_B 0; glow_color_2_R 65535; glow_color_2_G 65313; glow_color_2_B 0; background_color_1_R 51004; background_color_1_G 49727; background_color_1_B 36716; background_color_2_R 36112; background_color_2_G 15909; background_color_2_B 10495; background_color_1_G 49727; background_color_1_B 36716; coloring_random_seed 213898; coloring_speed 0.10000000000000001; coloring_palette_offset 151.59999999999999; post_SSAO_quality 35; main_light_alfa 0.69813170079773179; main_light_beta 0.3490658503988659; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 0 54f734 88ff93 a93a00 9f8872 13a5c6 680e0e ee185a 1f6aa5 81f986 e6ffff 442957 a9c041 6affff 52496b 137823 3c221a 2bb098 99a38e b0c97e 285ea4 97d49c edd7da 390073 4ace6a 37bb01 71a290 69ff45 68e639 d2edbd 7d4f94 a071c4 fff8fe a40000 5244c0 732968 ff99b7 3f2d0c 95b9c1 ff66ba 459e46 ac58ff 6da78e ff51f2 bc7c8e 9d8fa9 4062ff 8d8fe4 d2ce50 e72648 3039b4 1ca6 cd6abb 7f0000 5effb3 595c2a 3c41 769d8d ff85f4 928cd6 e98473 c0a770 b6ffc9 64ceff 84769 485aaa 6b2a1f 39a2 a40070 d41186 0 9cd881 7844c0 4e1a8f b1ff7c 36ff92 56d 7000f 16436a 8f5ff9 556b2f 82ba8f cdffb4 e92cfe 82bbff a550d6 d581eb 42466c fee779 61c832 6d8898 c3a45f 2e65 d692c4 b45050 c80000 f38138 214337 535783 ffefff 5dd8ff 2f9055 efb439 b03288 727eaa ff23ba b4bb e8ffff b3eabc 39d06f 8eb2e0 c84c8e 66008f 166992 356620 ba7cff 2366 1 77c85e ac8300 c8e60a 78c648 2f6baf a573b1 d153d9 7fff92 e5e5fb 8eff3a bc1400 9e0c99 c99bb9 a2009d 769b80 a4f49f 7c3dd2 180023 1c4a21 7900c7 5b6351 8d19b9 951a9e d3c81 cca6f2 da685f d5a2ff 6ce07e b64280 c000c 280017 68f450 3d0000 1100c1 d1ff71 b9a100 c64f75 3e8700 fa9896 2f8915 f56eff 41a400 930700 28662d ddcaff 2800cf 463824 3fb6bf ffad34 380047 f609c c8cb1f 8030b1 5fd3ff 265e8c ae0000 a22c1a 438eff dfaf94 cfff87 c4 95caca 5684ff 380085 52fdff a159 5a00b3 2131 1a131e 18e 93ae66 870000 ffffff 794c00 8c0052 71e4e6 2532bf 415b8f 725e4f 8955fd a639 5e97ff c99ae4 5da9c0 741860 ec69ff 8034ff 2facf3 300aa0 cdd1ac 42915 a0a36b e1002e 4c4ca4 3c6929 65 353a00 47e187 ba4c45 46ffff d60eaf 4a4499 e1f613 ffa15b 9a1406 ff9bff ff8588 2d2b27 7d197d d38ce5 229826 361c d3acdc f29e46 31dc37 49a2 914f9d 60074d ffd4ff 596cff c8aa5e 37938b 6595a ba15a5 735177 5f009d b0af6e ff7ab4 e3d22c 166900 2bbabc b74935 dbec7b f153ea 20768e ea3daf dda9a4 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/power 2 - julia.fract0000644000175000017500000000672012274512437025313 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa -70; zoom 3; formula 3; quality 0.5; julia_mode 1; julia_a 0.59999999999999998; analityc_DE_mode 0; DE_factor 0.20000000000000001; brightness 1.5; reflect 0.5; shadows_intensity 0.20000000000000001; ambient_occlusion 0.20000000000000001; glow_intensity 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; fractal_color 0; post_SSAO_enabled 0; main_light_colour_R 65502; main_light_colour_G 64905; aux_light_intensity 0.01; aux_light_number 3; aux_light_predefined_1_x 0; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_intensity 1; aux_light_predefined_2_x 0; aux_light_predefined_2_y 0.80000000000000004; aux_light_predefined_3_x 0; aux_light_predefined_3_y -0.80000000000000004; aux_light_predefined_3_z 0; aux_light_predefined_3_intensity 1; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_3_enabled 1; aux_light_predefined_1_colour_R 64153; aux_light_predefined_1_colour_G 65535; aux_light_predefined_1_colour_B 12262; aux_light_predefined_2_colour_R 63525; aux_light_predefined_2_colour_G 14035; aux_light_predefined_2_colour_B 21742; aux_light_predefined_3_colour_R 13956; aux_light_predefined_3_colour_G 65535; aux_light_predefined_3_colour_B 13432; aux_light_visibility 100; file_destination images/image; file_envmap /usr/share/mandelbulber/textures/envmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/tglad - scale -1.4, minRadius 0.1.fract0000644000175000017500000000537312274512437027725 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.825157918507734; view_point_y -1.958004518739203; view_point_z -1.7245305072293351; angle_alfa 29.999999999999996; angle_beta 20; zoom 5.1200000000000001e-06; perspective 1.2; formula 8; brightness 0.80000000000000004; ambient_occlusion 2; ambient_occlusion_quality 3; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_1_G 51968; background_color_1_B 34596; coloring_random_seed 23423; coloring_palette_offset 188.80000000000001; post_DOF_focus 129.8140237940022; post_DOF_radius 10.4; mandelbox_scale -1.3; mandelbox_folding_min_radius 0.10000000000000001; mandelbox_color_Sp1 3; mandelbox_color_Sp2 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ff4a90 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/trigonometric - default.fract0000644000175000017500000000446012274512437027241 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; angle_alfa -29.999999999999996; formula 1; power 6; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 3210; post_SSAO_enabled 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 929ec8 b4fff8 33ba89 b5b0 3968 ffebc4 5be893 65e007 a0f2ff bdcc7b 88fff8 d3c195 686bff c23000 3626 6d8376 6776e7 ff28b6 ca4aae 427ac6 7c5d5e d58c98 ffff9b 61cd25 40ff8d bf001c 9f4ec5 884bf7 79265a ec2c69 4cff71 b47d42 94deff ae2c30 31ad9a 42dbff 329d73 ddf0ff a5396b 6c6300 78ff99 69d861 75eb62 9b4a55 d1b2af 466711 be9a3f c60000 5101 2ca2 3a2613 90889b 60 73971f 1005 291d04 c95fa7 e7a49f cbb3f0 ff6d67 6fe368 818eff ab127e 378a4c 61002 d1bef6 6015 e796ff 4b3cef 698ee1 7d3b02 8327 d1661a 12fec8 49c800 32aa00 cecdd7 4fac4b 6500 3f7ca4 bf9b a84f00 6c2474 37d276 ab5959 ffc3ff 658 bc36ac 4193ff ff4c91 40d548 697f19 ff98ff fffcf0 2759 bf67c8 c595c7 9b1223 ff8949 e8434b c95b88 2e4fb9 7c1700 5386c3 6998 b2f19e 35a2d2 d20ac4 836a52 a3f6d3 5b54d 9368d6 ffa074 67e8ff 98e3db 8ba2d b6605 6ce9f9 ac5421 85bfb3 804832 484d9b ff5240 ff96b4 854273 206266 fff96d ac143d d20b2 6a4a00 912f69 95ec9c 4c2e51 f61ed1 dfff7d de7d62 bd346c a38cbe ba25c1 1562a3 bb1f44 27ff5f ffdf69 64d2ff 6252 4b6d27 4fa624 6f2e55 4366 5bdd13 8f4e02 47493c 7457a7 ffffff bc2d0e 1d2500 d3cacf a2dd79 54a33f c1508c d66238 6a323b 1a0500 9f6e2c 1bde9c ff7483 d47fa1 ff693e e18cb0 3f6b00 ff768d a97fce 9eabee ac008e c3757d bb977b e1e861 928028 dc9bef 28cc6d 4f33f8 5277 ff4db7 b1fe0e f078ff fd3004 f6ff91 efffb7 ffae42 d69000 ffd0bd 868403 f100ef 6bffff ff6fff ff7cb5 ffe05b 8a63ef ab2481 c39fbf daede6 f3bfff d3e167 52ffca 6297ad 45e769 ffff66 a92ebc ac3300 eb0944 dc9d6b 430000 a7c500 d074ec 23ff6b ffffe3 75ff86 cd75ab 494de3 4be8de 91a8b6 1aa000 7f3fb8 66bd7d b5e0eb 74b562 e12347 b50000 ff283e 7e0011 6f10e3 ff92ae 2c5305 11703d aa9aff 6b0019 1345a 8cd945 ff4efd 935e36 b94364 a08d92 ae2f3c 5e88aa de264b bf5017 9fff7b 34273 deffb8 570024 62adb0 85aa92 7a8754 17ab2f b6a1b0 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/power 2 - hq ambient occlusion.fract0000644000175000017500000000475712274512437030206 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.5; formula 3; N 15; smoothness 0.5; iteration_threshold_mode 1; analityc_DE_mode 0; DE_factor 0.20000000000000001; shadows_intensity 0.5; shadows_cone_angle 0; glow_intensity 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fractal_color 0; coloring_random_seed 1123456; slow_shading 1; post_SSAO_enabled 0; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette c866fc b940 d8abff 150078 cebd8b 71d210 c90000 ffc461 1d50de 400 d3ff3e 32d759 b3ff9f d9b259 963f41 ec8b41 f336ff 70ffdf ffffff b0ffff fc8aff bf00ea 261dd1 880000 1d0255 3e ff53ff bd14 563c5f 536b92 462259 264855 83e4dd ef2f81 6291ff 391b0b 465878 76be9c 3c51ff 8e78d3 3b8f76 d81100 700059 79d79b ffe6f0 b1996c d28238 d5e75b a9059a 52d6ed ff85ea cc0075 43cebc 44ff89 7fba60 678171 9f24d3 41ffff 50bcff 876d00 4bba90 71cc20 97913d 44df75 ff4ee4 ffc7f9 8608 8184c0 f508da e60c4f 5f4e33 98445 e83eff aab2d0 76ffaf 683e47 1100a3 35 7cb912 375170 8b7ebf ff82e3 251fd4 6e2de4 35a3b1 8e00b3 96ae73 6d50ff 60747a a00772 9fbfd2 c58f79 2fff3b 2cfff1 eea4ff c4f2b2 5eff65 45f1ff 397231 ffbfe2 c4fbd8 bb8987 e94357 4d864 a16f00 84ff7d 7b9181 132f fff754 6bc713 50b7 60001 8f14ab 180585 d8482c 7e7d9e 1c9bbe 80eff6 48b685 f0c798 2c94f1 9c7900 ae1933 3e7a17 844462 3f648b d9cfd0 d0a3ba ff7e29 ff321a 5a5cca ff268e 27ae3b d0847e b1ade0 cb15b2 d8ffba 1b9d4a c6e101 ffaf68 165d4b 0 a5d1ea ffb571 b0ff47 9f8e1f 5d0d28 95698c ff3a3b 9e e4b746 79c492 cededf 7a4a ccb7f2 1e7d3e 652816 812970 916700 36c1 35c0f6 272d92 744d 9a42d 43bb94 b0d0ca 45bb57 3c633a 70 532a57 e0e69a 85c2a8 bc7c92 876 ee00e6 3f0462 3304b7 603f28 9329 d855d8 590057 491c0e ce43 19ece0 ec9200 ba006a fffffa fa6fb8 802e06 6731ff 4ebc 22854a 436387 670000 e2cec9 87cc9d f39cc5 475b2c f736a3 ce007e 791b55 2d6157 544623 ffc1b3 314ce7 cc3821 7fd51d bd827a c90089 6b0051 377880 4e481b 79e600 df d1fecf ac7527 5d9d90 fb51ff a6977a 9965 be9cdf d4fc7d cf2122 7a2dcc ffa7ff 93f3e0 8a5b5f 50205b d150f6 d000a5 56ff48 3c1ec7 afcfd9 b1a883 ab8a95 920000 17b698 a4339d 19c597 f46e63 5c 73ac94 554855 44496b 3e41ad 6b4000 aeff9a 5fc6d9 cb3de3 d86782 d00080 5f09c3 7399d6 ffffff c84cda ffffff ; mandelbulber1.21-1.orig/usr/share/examples/trigonometric - power 8 deep zoom.fract0000644000175000017500000000540112274512437030740 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.2081344729756496; view_point_y -1.0192291497670281; view_point_z -0.35062886612559802; angle_alfa -40.000000000000007; angle_beta -49.999999999999993; zoom 9.9999999999999995e-08; perspective 1.5; formula 1; power 8; DE_factor 0.29999999999999999; shadows_intensity 0.5; ambient_occlusion_fast_tune 0.40000000000000002; glow_intensity 0.80000000000000004; glow_color_1_R 65535; glow_color_1_G 34958; glow_color_1_B 0; glow_color_2_R 61016; glow_color_2_G 59410; glow_color_2_B 54591; background_color_1_G 0; background_color_1_B 44389; background_color_1_G 0; background_color_1_B 44389; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; fractal_color 0; post_fog_enabled 1; post_fog_visibility 115.3; post_fog_visibility_front 30.699999999999999; post_fog_color_R 65535; post_fog_color_G 65535; post_SSAO_enabled 0; post_DOF_enabled 1; post_DOF_focus 96.952763056731698; post_DOF_radius 4.7999999999999998; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/primitive objects - inverted box.fract0000644000175000017500000000613112274512437030740 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 3.958377376097959; view_point_y -4.9721730549385814; view_point_z -2.1366466546208338; angle_alfa 40; angle_beta 20; zoom 9.9999999999999995e-08; perspective 1.2; formula 8; quality 2; brightness 0.59999999999999998; reflect 0.5; shadows_intensity 4; ambient_occlusion 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 51968; background_color_1_B 34596; background_color_2_R 49582; background_color_2_G 26523; background_color_2_B 26523; background_color_3_R 22383; background_color_3_G 7213; background_color_3_B 7213; background_color_1_G 51968; background_color_1_B 34596; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 23423; coloring_speed 2; coloring_palette_offset 25.5; post_SSAO_enabled 0; mandelbox_scale -2; mandelbox_color_Sp1 0.5; view_distance_max 20; raytraced_reflections 1; reflections_max 10; primitive_invertedBox_enabled 1; primitive_invertedBox_size_X 15; primitive_invertedBox_size_Y 15; primitive_invertedBox_size_Z 15; primitive_invertedBox_colour_R 65535; primitive_invertedBox_colour_G 60956; primitive_invertedBox_colour_B 2812; primitive_invertedBox_reflect 0.90000000000000002; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a1ae4e 5e612d 507c9d 704e 74e545 812ed1 cc0000 5bb967 6dbb86 7effff e3984 bc00b6 c10076 527ac9 69b020 98b61f baef43 a30033 c03f74 97 536f95 b429a8 d44b fbdb4e c58cc0 bd2393 9e76 a61500 b4a89f 7a0056 17f47d c7c4ac 16c7 6c8e23 218e82 ffdcff 4478 831d65 e4b54b 53d1d5 efa41d e90 ac2130 e94bff c7b8c7 4ea436 9ac2f7 cdff8c 8a88e2 ba95f8 bb2d0b 7c188f 530000 c84964 4c9c92 8aff94 8b72af 8b2b3a a18e2a 5b6d00 900017 aaf469 92fdce d634cf 170000 5f5671 a111 845de0 3600bd ff69f3 4f0a 90e7e3 fffaff 6385b6 47e815 57ffff ffde8f 39746c 6e2292 5dab 348969 657560 465e54 3c370b 7000 a02400 b1ee93 ab9eff 65c0e5 d6e600 131c62 8ba5c1 43eaba 9a4e f952f7 72930e 5dfd53 980104 4a935d 351a6a 4565c5 1c2f49 8c4c65 fc90dd a000 1a00 2cb3a7 ff4b41 6dc271 43ffc5 3d562 5a34f9 e2eb6a 89c6cd 292400 481038 bc84 cb4ca8 765ff0 3187dc 522600 ffd361 a20407 598434 a31bea 79a46c e94249 760000 3f1f00 d21f31 9fb43b 659cbd 998869 40eadf ffffff ea06c9 28a96d b400 67166b 87fd67 90dcff 477a28 360095 616b 310078 d172ab 8e1cd4 1800 e8f3db 5e004f 545a4d 89876d f65574 bf16ff 1bd056 1c6fc0 457e27 ffffff ffff5b aec6a5 bfbc00 cf01c8 af0020 8b0004 be6b06 6dffaa daa3da 788df0 38d0a1 c55d00 f1b7ff bb2fb5 cef057 acaa34 c3838a a61014 130038 6b5e00 ecc7 55b794 a7ec3c 7d570c 9f5b10 e29bf3 580000 9c0d5b 628bd3 e20845 bb48a1 b6c47e 5fce3e 230002 838f3f 615fbd ffbf57 dfb474 d9f1d5 da7742 3919 7d755f fd97ff cf2b ada1ff bc006b 32968c ffc6ff 648 b9e551 5b41ff 1a37 9a28ad 3f4448 9e990e 5429a0 4b04b7 78 458e97 caf0ef 1094de d22097 f1dd39 ca9d59 cb3a5c a14d68 e4ff5e e338ff ffff8d 30ff6b ffba68 60ca32 cc5500 96312b e5fe0 dcffff c53c1e 71a8ff ba0090 90b831 7a7233 561123 d86bc6 2c8fbf a8bab2 3e9d01 c5ea85 dcf13f 233219 d2cbbb e32fb7 b26a0e a843ff ffee0a 2cff71 ffba4c ad26c7 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/interior - mandelbox scale 2.fract0000644000175000017500000000464212274512437027730 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 592; z_min 0; view_point_x -3.401003087120785; view_point_y -6.3702199126404926; view_point_z -2.1632634178537522; angle_beta 40; zoom 4; formula 8; N 50; quality 0.5; ambient_occlusion 2; glow_intensity 0; background_color_1_R 23524; background_color_1_G 0; background_color_1_B 26768; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_1_G 0; background_color_1_B 26768; coloring_speed 2; coloring_palette_offset 137.80000000000001; slow_shading 1; limits_enabled 1; mandelbox_color_Sp1 1; mandelbox_color_Sp2 1; interior_mode 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/menger sponge.fract0000644000175000017500000000654612274512437025372 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -0.1319394784649747; view_point_y -0.10785655088456531; view_point_z 0.24670721632477291; angle_alfa 25; zoom 3.2000000000000002; perspective 0.80000000000000004; formula 7; power 8; quality 2; DE_factor 0.80000000000000004; shadows_intensity 2; shadows_cone_angle 5; ambient_occlusion_fast_tune 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 65535; background_color_1_G 65535; background_color_3_R 65535; background_color_3_G 65535; background_color_3_B 65535; fog_colour_1_R 33903; fog_colour_1_G 32689; fog_colour_1_B 32689; background_color_1_G 65535; coloring_speed 3; coloring_palette_offset 97; post_fog_visibility 17.399999999999999; post_fog_visibility_front 29.800000000000001; post_fog_color_R 31246; post_fog_color_G 43115; post_fog_color_B 52545; post_DOF_focus 165.37005204376189; main_light_beta 0.17453292519943295; aux_light_intensity 0.10000000000000001; aux_light_predefined_1_x 0.59999999999999998; aux_light_predefined_1_y 0.5; aux_light_predefined_1_z 0.5; aux_light_predefined_1_intensity 0.10000000000000001; aux_light_predefined_1_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 56214; aux_light_predefined_1_colour_B 10013; volumetric_fog_density 0.5; volumetric_fog_colour_1_distance 0.20000000000000001; volumetric_fog_colour_2_distance 0.40000000000000002; volumetric_fog_distance_factor 0.29999999999999999; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 677266 93b4a3 c4eddb a3cab5 8ba894 6e8577 58635d 4d4b4a 44313a 381c2a 351625 2e0f21 23091b 150414 b0003 170d00 2b1900 3d2400 503102 623e02 744d00 895c02 9c6f00 b18001 c59200 dca803 f0bf01 ecc200 d5b502 bfa900 a89801 928603 777300 5e5d00 464202 2a2800 130f02 13050f 250d1c 341824 3e2932 4d4e4b 6e8075 98bda6 b6dcd0 667366 301f24 b0007 402c21 835c37 bc7e44 e19b38 f8aa1a f9b012 ebaa33 c99340 97733f 574327 90501 2a1b1e 5d5f54 a5cab8 a1c1af 6f8779 505050 402633 351427 2a0b1a 14040f 120b00 2f1f09 381500 604008 782f02 8f1f01 a81301 bd0905 d80106 ee1006 f01e05 d82703 c42804 aa2901 992502 812202 6e1a01 581403 430c00 2e0500 1b0101 a0002 1a0515 23081b 330d26 3a0c28 3f1c31 4a3e45 545e59 6b8175 8daa97 a9d0bb b6e1d3 8a9d8f 5a5453 381c2a 220917 c0107 250c10 4d221f 775734 965c3c b0333a d56d43 ed9547 f8c83b d66f0a ce4408 fd931e ed9f29 ed8742 e88d59 ae6e33 9c5835 7f3c36 5a2827 2f1716 c0a09 130410 2b0f21 392328 585550 7c8f83 9dc2b4 c2ead8 a0c4aa 89a495 718878 586960 4c514d 483c40 402831 371b27 341524 2b101f 240b1b 180714 80204 140e00 221f00 333102 463f01 574400 654600 774501 8c4201 a03d02 b43803 cb3903 dc4600 ef5702 ed6804 d76a00 c56805 ab6600 905e01 755303 604202 443001 291d00 100602 1b0714 2d0e1f 371828 48373f 566458 87a18d bee8d6 889c8d 3e2f2b e0910 352b15 7f6936 bd9c40 e5c030 fada1a f5e111 e6cd38 bc8142 76462f 252117 1d0c16 4c4441 a1beaf 9fc6b3 6c8172 4d4747 3a192a 300f24 1d061a a0003 220701 400a00 5a0e02 780c03 900b02 ad0703 c80106 dd0004 f30305 e60507 cb0704 b80607 9e0804 870504 6f0402 5a0202 430203 2e0000 170100 c0008 1a0116 28051f 340c27 3b102b 452c3a 4f4c4e 607266 829f8b a4c1ad c3eedd 8ea699 5c5250 341924 200a16 a0307 321c16 623a29 89583b af7142 ca883f e19d37 f2ad2c f9bc12 fcc40b f9c31e edba31 daaf39 c69c3e ad863b 8a6936 644d2b 38291a d0601 15080f 2f1c22 403434 ; mandelbulber1.21-1.orig/usr/share/examples/Hybrid 3.fract0000644000175000017500000000642212274512437024176 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 0.21740479693455239; view_point_y -0.47605349795600599; view_point_z -0.20633595839294419; angle_alfa 20; zoom 1; perspective 1.5; formula 12; julia_mode 1; julia_a -1; analityc_DE_mode 0; DE_factor 0.2578125; ambient_occlusion 2; glow_intensity 0.2578125; glow_color_1_R 65535; glow_color_1_G 7594; glow_color_1_B 0; glow_color_2_R 63197; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_R 16232; background_color_1_G 15941; background_color_1_B 4024; background_color_2_R 18071; background_color_2_G 0; background_color_2_B 39046; background_color_1_G 15941; background_color_1_B 4024; coloring_random_seed 123; coloring_speed 3; coloring_palette_offset 18; IFS_scale 2.6099999999999999; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447505; IFS_3_y 0.30901699437170937; IFS_3_z 0.50000000000276579; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; hybrid_formula_1 3; hybrid_formula_2 5; hybrid_formula_3 10; hybrid_formula_5 7; hybrid_iterations_2 2; hybrid_power_5 3; linear_DE_mode 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 874000 d89000 856406 654500 be7a03 f48b03 8c6200 c49503 df7c08 ae5a00 f56b00 f96a05 ef7300 f86802 714b00 aa7500 f6b600 f4a100 c66e00 ec9104 d67800 e5b500 d69e0f 965d00 704e00 9f6c00 bc7908 e87c00 ff980b 814800 f79301 febb02 fe9809 f6a800 fdba0b fcad05 ec7803 f8a903 f17000 f47600 fb6f00 e48c00 c48a03 f27a07 f18b08 ed8800 f79a01 e66300 6a3800 cf7200 d98401 885904 de9003 c7911d cc7d03 d0a613 b67300 cd8800 ba7c00 cc7f00 a28000 d7960b d37302 dea805 d7a30b d29900 e9b00a e9b502 d09a00 d58200 ea930a d59203 c78900 b68502 d79400 cf7400 eea50a d57100 eaa209 d1a203 cb7901 ec9b03 ec9803 d27701 c37703 ce8b00 ec7902 efb20c eea302 fbbd0e c17400 bc8603 dd6a04 de6c00 f66601 f25c02 d76f00 dcaa03 b66e00 e38605 b66a00 d98b09 d88a01 e58300 b88100 c98d02 ed840d d55500 c69b0b e2a40a dc9a00 fca90f f3b904 9c7500 a49700 a99300 ae8800 7c6200 af850f 766200 987f05 939703 908e00 7e7702 969500 9b9c00 a2a300 959301 868004 8f8b05 8b8800 9b9c03 909300 939700 a89f00 ab9c08 959302 bab10b dccd02 d6cc01 bebc08 8f9500 b3ad01 b8b007 959700 b9a400 a69501 a39200 bab000 c5bf00 d0c203 927b08 777400 b0a709 988014 d6c900 b2ab00 c8b200 d1c201 a09503 e6c003 d2bc0e 6a5e00 322900 a08f01 ba940f b4a30c b69914 bcb01b 665308 af7e00 40320a c0b61b 4f3d00 b6a901 968015 1f1200 b8610a 7f710c 544a00 514511 534d11 1b1900 38390b 111100 4d3904 1e2000 a1006 1e0f00 502500 aa5300 482800 f86200 9a4e03 353202 e46600 ce5d03 bd6614 fd7201 e56600 bf4e05 a45100 fe8700 f97407 dc7000 d89000 dc7500 dd7d00 d89503 df9300 9e4908 e07f14 e07d00 e26302 e37804 e86a00 ee7800 dc6c00 ca7002 e37100 e45700 915100 db5e03 e18404 e26400 df8e03 de6707 e38512 f7720d fa7403 fd8100 fa7503 e05c00 a75e00 946f00 d57400 d85704 d15a01 c38608 9a8a09 8b7000 4f4b04 2e290b 382b09 242a00 6b4807 493300 8e4c00 674600 e56b11 5f3d00 c39a17 e25b02 d77b00 785c00 8d4208 ; mandelbulber1.21-1.orig/usr/share/examples/spherical folding - mandelbulb power 2.fract0000644000175000017500000000444112274512437031650 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; angle_alfa 29.999999999999996; formula 3; spherical_folding_mode 1; spherical_folding_fixed 0.80000000000000004; spherical_folding_min 0.40000000000000002; analityc_DE_mode 0; DE_factor 0.20000000000000001; glow_intensity 0.20000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; textured_background 1; file_destination images/image; file_background /usr/share/mandelbulber/textures/background.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/interior - mandelbulb power 8.fract0000644000175000017500000000447712274512437030145 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; z_min 0; view_point_z 0.29999999999999999; zoom 2; power 8; N 7; quality 0.5; smoothness 0.10000000000000001; ambient_occlusion 2; glow_intensity 0; background_color_1_R 23524; background_color_1_G 0; background_color_1_B 26768; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_1_G 0; background_color_1_B 26768; coloring_speed 0.20000000000000001; coloring_palette_offset 68.700000000000003; slow_shading 1; limits_enabled 1; interior_mode 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/constant factor -1.2 - mandelbox scale -1.5.fract0000644000175000017500000000521112274512437031773 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.365707983207705; view_point_y -2.4996895083459019; view_point_z -1.391836539304776; angle_alfa 29.999999999999996; zoom 0.80000000000000004; perspective 1; formula 8; fractal_constant_factor -1.2; brightness 0.80000000000000004; ambient_occlusion 2; glow_intensity 0.10000000000000001; glow_color_1_R 1333; glow_color_1_G 65535; glow_color_1_B 0; glow_color_2_R 64879; glow_color_2_G 65535; glow_color_2_B 13146; background_color_1_R 65535; background_color_1_G 46654; background_color_1_B 13282; background_color_2_R 58357; background_color_2_G 213; background_color_2_B 39698; background_color_1_G 46654; background_color_1_B 13282; coloring_random_seed 866408; coloring_speed 4; coloring_palette_offset 71.599999999999994; mandelbox_scale -1.5; mandelbox_color_Sp1 0.5; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 1a7e00 f4861b 444e98 ef0deb 35a24c 93884d f0c866 86e9fe 8bff5f 5f4566 ff7596 747330 208793 c99a54 3b9441 723464 45c55b f8af78 fff9b4 37bbd 3c83 3334a1 6d88b8 ff66ff fdffa9 bfffa2 c31acf e3da49 2de3cc 89000a b00a30 581788 bf9f ee6b46 78ff88 7563b3 6ca6d5 740038 18a900 b7787e 967c8d 9a86d0 6a330c d902d3 96964c 9cbdb1 acf068 2aa800 3e912a 3affff 6f44ff 38c987 ce4295 b50000 d13d89 7abf d100 bed0ab aa575 a12e73 10a84e b04a2a fc27ff dbff59 f64bff 49dc25 6981b3 9e142c 8e00 8eacff 449600 70019d 63b63f 794ae4 ffe151 fd85bd 7bf1ff 2dc2c0 86d5b5 4e70 27d2e5 37e3ad 39736a 15434b 3fe6 8297 786da5 e540da 9f94 84442c bd45 1eaf74 6725b d0c7f bc6741 9a0eb3 f28cff cd438b 6a3a4c dab2c4 7f7b63 73ce29 2174 746c83 9e4282 bb4385 75c998 180000 6d450a 3f5fff 5e77bd ff7f43 d3d868 e9bb44 37902f f28142 931909 863bff efffff 3af576 cbdc73 7f9ed2 7346a1 617d47 bb75da 95d012 baf30d ffadfa 25090c aee57e ffff4a 9088bd 16b1a8 d1ff68 d44c4b ed3955 6180cf 3f27d4 b5905c 4d4ee8 19238 969937 c46105 a161b0 ad4b95 4e44d9 c42570 866a92 3bff79 8290ff d800d2 648c38 f8ede1 ffa14e e5dd3d 2eb602 a86400 c80047 48939d e89d6a 6729b0 568a00 430078 eebd16 2913c8 c3 603365 40425 6ae75 7e98db d197a9 188318 66b124 104dbd b2551f 65501a f18200 12c841 5be561 334374 59fd93 a8 85ff87 37883a c70056 ba9d9f 6f0055 a13ae7 eb2fe4 76dce8 972a6c 9589ca 984394 196cb6 9649a8 727ec6 333000 19ca5a d6a834 6d3bf 458254 b3cfd2 96b2a b7be60 d54ae 1100a6 82b81a ff5abd 5b9013 ac32ad ecff5f cea9be 5fcf79 980040 f0a541 ffffff 9c28d0 5d8024 62408f 5d3e 665a a9f137 8c6e68 3437c4 abdf79 6eac46 ffef3f 77a85a de84d2 831720 3c3e28 e057c3 c1c700 3503b7 e3001e 523a5d f768f7 7e167d d1fff5 a487b a7100 f822ff 3f604e 8c9ef4 12f70b 108b8e 7a4fff a28994 65e5c4 8a53c1 df3c78 9426b0 55f36b 39b4be 36f572 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Volumetric light 1.fract0000644000175000017500000000703312274512437026173 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.0182641281666369; view_point_y -2.7976576991784832; view_point_z -1.718890188123682; angle_alfa 20; zoom 9.9999999999999995e-08; perspective 1.2; formula 10; DE_factor 0.10000000000000001; ambient_occlusion 0.10000000000000001; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_G 0; background_color_3_B 0; background_color_1_G 0; background_color_1_B 0; coloring_random_seed 123; coloring_speed 2; post_fog_visibility 29.100000000000001; post_fog_color_R 44469; post_fog_color_G 47625; post_fog_color_B 55213; main_light_intensity 0.10000000000000001; aux_light_intensity 0.20000000000000001; aux_light_number 1; aux_light_predefined_1_x 0; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 27667; aux_light_predefined_1_colour_B 10024; aux_light_visibility 0; IFS_scale 2.7999999999999998; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447505; IFS_0_y 0.30901699437170937; IFS_0_z -0.50000000000276579; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447505; IFS_3_y 0.30901699437170937; IFS_3_z 0.50000000000276579; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; view_distance_max 5.156670564371046; volumetric_light_intensity_0 1; volumetric_light_intensity_1 2; volumetric_light_enabled_1 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/examples/modified mandelbulb 2 - sliced.fract0000644000175000017500000000411012274512437030153 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; y_min 0; z_min 0; view_point_x -1; angle_alfa -29.999999999999996; angle_beta 40; zoom 1.7; formula 14; analityc_DE_mode 0; DE_factor 0.5; coloring_speed 0.10000000000000001; coloring_palette_offset 143.69999999999999; limits_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/tglad - scale -2.fract0000644000175000017500000000501312274512437025304 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_z 0.5; angle_alfa 40; zoom 6; perspective 1; formula 8; DE_factor 0.90625; brightness 1.2; reflect 0.69999999999999996; shadows_intensity 1; ambient_occlusion 0.20000000000000001; ambient_occlusion_quality 3; glow_intensity 0.90625; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; textured_background 1; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; fractal_color 0; coloring_random_seed 453; coloring_speed 0.20000000000000001; post_SSAO_enabled 0; mandelbox_scale -2; raytraced_reflections 1; file_destination images/image; file_background /usr/share/mandelbulber/textures/background.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 45d6f6 f6cfcc 4fd285 1e8669 6e48 125a17 f15ce5 5c4ca1 62d76a 5c0092 ff6299 e8ff85 66c335 7362f a4ff4b 9dffed a8ffee 60b2 ff91ff 233138 cf48d0 c546fa a7bf b9a70e 99dc58 a472d1 9781c0 ee3463 6e2497 6087ff bcc7a ddf184 92a100 995a 7373a1 36928e fa69d7 566e00 c5f8e0 6d0077 997f3d 8dffa7 5f28ff ddb07c f630b4 cbd342 a100ab 2444 ffefb4 9e0002 54ffd0 c834bc 1e2af4 397194 5025f5 3a2b00 7e82 d1d9df d076d3 34199e 5fad5c e2b306 a4c840 124946 7 e2f5a1 242cac 6a6ff1 4c7c5f 1304 6ed73d 187aca 61bfba ac52ac d3ada3 ab239c 790000 7c7bcd ffc11b ab10 e74730 96d97e 21bd0b 1e0015 5895fb ac6407 3734e1 e30000 55446f ffeaff 8f0854 6ce8ff 93ad 31ee87 c70e60 74ccdf b6f435 da46ff 4c5f5a 1951da c96caa 340b08 65b52f 7cff4a b5369c a9d62c 5daea5 a8283f ff59ef 670094 ffffea b8ba32 67448c ffb0f2 c50017 a1d2aa d947a4 5a5150 2c0058 bea1be c92d00 fffbff 3161c7 e725e8 a0bf5a ffc150 7f7b4e 695aba 98af1a 95175d 58ff2b d5 a83b7f cda1e6 1f37d7 a8a9f7 4801b6 6a65c9 20aca9 9187af c32fd1 ead1ff aa67 97a2ff dbf6ff ff9782 16 cf4342 670723 a9002e 2cffa4 7f726f 61ad2 822604 7ba6ba 5f7244 796808 c49352 a4f071 7bf860 1a8b 90df95 6d38f3 f784ff f52ff9 e26ba1 b425 7751b4 8d6145 61faff c28d45 f24517 9d39cd 300050 ebb3c3 1e9109 ff5cb7 3741 30f38d 3eaaff 75689f b8466d d70efe dc43d7 5847a6 9a0313 fda7c1 ffac90 e30049 198bf1 d9ffff dd67af af568d 81c827 4ec846 3799bc 880080 d3c3e9 789472 3e63e7 ffc2b2 3988a0 881f16 d6f0ff e18a27 41fff4 c8967a fb63ff c558f1 b3657b 9aa710 7700b7 a1f60b ffffcf 75ff7e b28ab cdeaff 58acea 9e469d 49588f 3e8ab6 2d0373 5a442e 5ac73c 4d0049 ffa0ff 5b2211 698f50 f8e498 92d15 451799 29ffeb 445a7d 93253c 6d74a1 5b4ab3 be003d 186226 df268a 336389 71ba4f 10bd6d 8b69cd 6330ae 1f0044 b6c03a caa849 ffd94c 7d86bc 785f7e bd4087 793e77 1c9a00 816075 b56cd0 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/menger sponge - equirectangular projection.fract0000644000175000017500000000506412274512437033012 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 400; view_point_x 0.0034210476073625708; view_point_y -0.40557274886234418; view_point_z 0.33456999239107432; angle_alfa 0; angle_beta 0; zoom 0.02; perspective 1; formula 7; gamma 0.80000000000000004; shadows_intensity 1; shadows_cone_angle 5; ambient_occlusion 2; ambient_occlusion_quality 3; background_color_1_R 9508; background_color_1_G 0; background_color_1_B 5947; background_color_2_R 5328; background_color_2_G 0; background_color_2_B 8410; background_color_1_G 0; background_color_1_B 5947; ambient_occlusion_enabled 1; fractal_color 0; post_SSAO_enabled 0; main_light_alfa -0.52359877559829882; main_light_beta 0.6108652381980153; fish_eye 2; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/primitive objects - water.fract0000644000175000017500000000564112274512437027476 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.2037975951926897; view_point_y -0.4039936155537196; view_point_z 0.046944266658377337; angle_alfa 10.000000000000011; angle_beta -14.999999999999998; zoom 3.1250000000000001e-05; perspective 1.2; formula 7; DE_factor 0.5; reflect 0.20000000000000001; shadows_intensity 1.3; ambient_occlusion_fast_tune 0.5; fog_colour_1_R 35793; fog_colour_1_G 38294; fog_colour_1_B 46972; fog_colour_2_R 28565; fog_colour_2_G 37396; fog_colour_2_B 47856; fog_colour_3_R 39178; fog_colour_3_G 40469; fog_colour_3_B 42212; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 255627; coloring_saturation 0.29999999999999999; post_SSAO_enabled 0; raytraced_reflections 1; volumetric_fog_colour_1_distance 0.01; volumetric_fog_colour_2_distance 0.02; volumetric_fog_distance_factor 0.01; primitive_water_enabled 1; primitive_water_level 0.10000000000000001; primitive_water_amplitude 0.050000000000000003; primitive_water_length 0.5; primitive_water_iterations 8; primitive_water_colour_G 20612; primitive_water_colour_B 41224; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 315723 4f4169 767f78 504a23 e7eaa8 9cc5b9 b222f 97beb3 d7989b 6a954c 73709c dae0d9 bdc1a7 c1e7e5 7f8a75 b292c0 2a5a5d 7b8297 ded3d1 9a9188 537d4e c2909c 403756 292919 6baaa9 c2d7bd 967a6f 5d4951 143936 500d1a 8d6c90 364a33 d8c0c0 8c726c 44333f 60273b 430711 8da49d 99b6a8 4f2b5c bda28c 795d70 4d1f40 407561 d1c6c3 e0d6b7 8e6186 7c8668 3c556b cca8df 566178 40433f dfd8d8 b5969f 3e6c64 a3ca83 7b9778 f2632 704665 c7e4e6 3d3f62 e7c6ca a6a2cf a2885c 4e5055 728271 58666b 606790 8d8c83 645f2f d9d5ba 979e81 ae95c1 678191 9b639a 1e322a 140413 482752 6c7e7b 795945 865193 363c27 7c9eb1 54606f 62806d 213a50 5c214f 688298 293400 68663e 6da46e 13383c 4e3f64 624f67 3d3560 9d918b 6e7a89 c4f7e6 3e452b 69a1a6 7b586d 72526f ccc6d0 681f4f 71635f 9bd3ce b99ba4 7f8d7f d5dbb9 7a7341 4f746b 4e2842 647b38 e3e7ce 609c62 21261b cfa28e adb2af 8e8271 c27fc0 747294 fab6cf f3b24 4f2e5a abc2a1 acd4ad 405657 a49867 f4e5fc c7abd6 ca92c7 a5b998 515a19 dfc4ba 145842 f0f4ff 7ea278 1c1e4c 2f454d d4bab6 242c30 8b87a9 5a6666 c0ceda 78a59a 52757a 636f70 aaa7c9 90696d d2f9d1 88aea0 5c5955 85767d c6d1d5 898e5b 46346d baf8f1 ad7e79 1e584b 5f4e44 b5b3d3 a98075 586791 526850 82635b 736682 5e6d8b ffc9f6 696987 723873 aac3a4 6f8566 b38c92 1d3f29 5b6376 241723 3a1712 927c95 b0a98b a1b1c9 92b1ad b39997 9dadb3 e9aee7 b39ba8 cbf0e0 213f43 607c65 5f915e 98aeb3 667183 cecceb c9a8df eac3e8 588087 52417d 985366 d7efe3 94996f 3a2f2b a8daca 344846 8b90b7 9cb27f 7f5f61 1e6049 f7b5c0 272e64 577c77 6e6763 a77d8f 4e2e34 adb5af dabdd9 a4cbc3 86b577 737e93 cf94b2 58887a c2bae3 fad0ee c9b8ad 5b4876 a6e3ab b08da4 649898 6f6055 c0dfd4 6b7f64 204734 87a2b2 33585d ffcfd5 373c4e eaf2e7 766074 191326 61612b 84abc4 5e7c5d 477a6b 4a4e5a adafbb cea1eb 8496cc d2d3aa 241318 afe2be 50a1 70b499 4b3b47 a1ab7a a6acc5 1428 0 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/IFS Octahedral Sierpinski.fract0000644000175000017500000000513112274512437027377 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 10; zoom 2; formula 10; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_2_R 54473; background_color_2_G 57812; background_color_2_B 59901; background_color_1_G 37121; background_color_1_B 57898; IFS_0_x 0.70710678118654757; IFS_0_y 0.70710678118654757; IFS_0_enabled 1; IFS_1_x 0.70710678118654757; IFS_1_z 0.70710678118654757; IFS_1_enabled 1; IFS_2_x 0; IFS_2_y 0.70710678118654757; IFS_2_z 0.70710678118654757; IFS_2_enabled 1; IFS_3_x 0.70710678118654757; IFS_3_y -0.70710678118654757; IFS_3_enabled 1; IFS_4_x 0.70710678118654757; IFS_4_z -0.70710678118654757; IFS_4_enabled 1; IFS_5_x 0; IFS_5_y 0.70710678118654757; IFS_5_z -0.70710678118654757; IFS_5_enabled 1; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/xenodreambuie's formula.fract0000644000175000017500000000525712274512437027346 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 592; image_height 592; view_point_x -0.018435515863492281; view_point_y -0.14831328486650749; view_point_z 0.07123325738092634; angle_alfa 20; zoom 2.7999999999999998; formula 11; power 2; julia_mode 1; julia_a 0.69999999999999996; julia_c 0.5; analityc_DE_mode 0; DE_factor 0.80000000000000004; glow_color_1_R 65535; glow_color_1_G 0; glow_color_1_B 0; glow_color_2_R 65535; glow_color_2_G 65313; glow_color_2_B 0; background_color_1_R 51004; background_color_1_G 49727; background_color_1_B 36716; background_color_2_R 36112; background_color_2_G 15909; background_color_2_B 10495; background_color_1_G 49727; background_color_1_B 36716; coloring_random_seed 213898; coloring_speed 0.10000000000000001; coloring_palette_offset 151.59999999999999; post_SSAO_quality 35; main_light_alfa 0.69813170079773179; main_light_beta 0.3490658503988659; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 0 54f734 88ff93 a93a00 9f8872 13a5c6 680e0e ee185a 1f6aa5 81f986 e6ffff 442957 a9c041 6affff 52496b 137823 3c221a 2bb098 99a38e b0c97e 285ea4 97d49c edd7da 390073 4ace6a 37bb01 71a290 69ff45 68e639 d2edbd 7d4f94 a071c4 fff8fe a40000 5244c0 732968 ff99b7 3f2d0c 95b9c1 ff66ba 459e46 ac58ff 6da78e ff51f2 bc7c8e 9d8fa9 4062ff 8d8fe4 d2ce50 e72648 3039b4 1ca6 cd6abb 7f0000 5effb3 595c2a 3c41 769d8d ff85f4 928cd6 e98473 c0a770 b6ffc9 64ceff 84769 485aaa 6b2a1f 39a2 a40070 d41186 0 9cd881 7844c0 4e1a8f b1ff7c 36ff92 56d 7000f 16436a 8f5ff9 556b2f 82ba8f cdffb4 e92cfe 82bbff a550d6 d581eb 42466c fee779 61c832 6d8898 c3a45f 2e65 d692c4 b45050 c80000 f38138 214337 535783 ffefff 5dd8ff 2f9055 efb439 b03288 727eaa ff23ba b4bb e8ffff b3eabc 39d06f 8eb2e0 c84c8e 66008f 166992 356620 ba7cff 2366 1 77c85e ac8300 c8e60a 78c648 2f6baf a573b1 d153d9 7fff92 e5e5fb 8eff3a bc1400 9e0c99 c99bb9 a2009d 769b80 a4f49f 7c3dd2 180023 1c4a21 7900c7 5b6351 8d19b9 951a9e d3c81 cca6f2 da685f d5a2ff 6ce07e b64280 c000c 280017 68f450 3d0000 1100c1 d1ff71 b9a100 c64f75 3e8700 fa9896 2f8915 f56eff 41a400 930700 28662d ddcaff 2800cf 463824 3fb6bf ffad34 380047 f609c c8cb1f 8030b1 5fd3ff 265e8c ae0000 a22c1a 438eff dfaf94 cfff87 c4 95caca 5684ff 380085 52fdff a159 5a00b3 2131 1a131e 18e 93ae66 870000 ffffff 794c00 8c0052 71e4e6 2532bf 415b8f 725e4f 8955fd a639 5e97ff c99ae4 5da9c0 741860 ec69ff 8034ff 2facf3 300aa0 cdd1ac 42915 a0a36b e1002e 4c4ca4 3c6929 65 353a00 47e187 ba4c45 46ffff d60eaf 4a4499 e1f613 ffa15b 9a1406 ff9bff ff8588 2d2b27 7d197d d38ce5 229826 361c d3acdc f29e46 31dc37 49a2 914f9d 60074d ffd4ff 596cff c8aa5e 37938b 6595a ba15a5 735177 5f009d b0af6e ff7ab4 e3d22c 166900 2bbabc b74935 dbec7b f153ea 20768e ea3daf dda9a4 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/fish eye.fract0000644000175000017500000000611012274512437024320 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 0.39500352565961561; view_point_y -0.85378131251278577; view_point_z -0.64349668879448074; angle_alfa 49.999999999999993; angle_beta 0; zoom 0.0051200000000000004; perspective 0.69999999999999996; formula 7; power 8; quality 0.5; DE_factor 0.78125; shadows_intensity 0.80000000000000004; ambient_occlusion_fast_tune 0.69999999999999996; specular 0.5; glow_intensity 0.78125; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; fog_colour_1_R 18077; fog_colour_1_G 4120; fog_colour_1_B 4120; fog_colour_2_R 65535; fog_colour_2_G 52561; fog_colour_2_B 0; fog_colour_3_R 64800; fog_colour_3_B 29411; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_speed 3; coloring_palette_offset 155.69999999999999; post_SSAO_enabled 0; fish_eye 1; reflections_max 2; volumetric_fog_density 1; volumetric_fog_colour_1_distance 0.0052729670737512932; volumetric_fog_colour_2_distance 0.01054593414750259; volumetric_fog_distance_factor 0.01054593414750259; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 677266 93b4a3 c4eddb a3cab5 8ba894 6e8577 58635d 4d4b4a 44313a 381c2a 351625 2e0f21 23091b 150414 b0003 170d00 2b1900 3d2400 503102 623e02 744d00 895c02 9c6f00 b18001 c59200 dca803 f0bf01 ecc200 d5b502 bfa900 a89801 928603 777300 5e5d00 464202 2a2800 130f02 13050f 250d1c 341824 3e2932 4d4e4b 6e8075 98bda6 b6dcd0 667366 301f24 b0007 402c21 835c37 bc7e44 e19b38 f8aa1a f9b012 ebaa33 c99340 97733f 574327 90501 2a1b1e 5d5f54 a5cab8 a1c1af 6f8779 505050 402633 351427 2a0b1a 14040f 120b00 2f1f09 381500 604008 782f02 8f1f01 a81301 bd0905 d80106 ee1006 f01e05 d82703 c42804 aa2901 992502 812202 6e1a01 581403 430c00 2e0500 1b0101 a0002 1a0515 23081b 330d26 3a0c28 3f1c31 4a3e45 545e59 6b8175 8daa97 a9d0bb b6e1d3 8a9d8f 5a5453 381c2a 220917 c0107 250c10 4d221f 775734 965c3c b0333a d56d43 ed9547 f8c83b d66f0a ce4408 fd931e ed9f29 ed8742 e88d59 ae6e33 9c5835 7f3c36 5a2827 2f1716 c0a09 130410 2b0f21 392328 585550 7c8f83 9dc2b4 c2ead8 a0c4aa 89a495 718878 586960 4c514d 483c40 402831 371b27 341524 2b101f 240b1b 180714 80204 140e00 221f00 333102 463f01 574400 654600 774501 8c4201 a03d02 b43803 cb3903 dc4600 ef5702 ed6804 d76a00 c56805 ab6600 905e01 755303 604202 443001 291d00 100602 1b0714 2d0e1f 371828 48373f 566458 87a18d bee8d6 889c8d 3e2f2b e0910 352b15 7f6936 bd9c40 e5c030 fada1a f5e111 e6cd38 bc8142 76462f 252117 1d0c16 4c4441 a1beaf 9fc6b3 6c8172 4d4747 3a192a 300f24 1d061a a0003 220701 400a00 5a0e02 780c03 900b02 ad0703 c80106 dd0004 f30305 e60507 cb0704 b80607 9e0804 870504 6f0402 5a0202 430203 2e0000 170100 c0008 1a0116 28051f 340c27 3b102b 452c3a 4f4c4e 607266 829f8b a4c1ad c3eedd 8ea699 5c5250 341924 200a16 a0307 321c16 623a29 89583b af7142 ca883f e19d37 f2ad2c f9bc12 fcc40b f9c31e edba31 daaf39 c69c3e ad863b 8a6936 644d2b 38291a d0601 15080f 2f1c22 403434 ; mandelbulber1.21-1.orig/usr/share/examples/FoldIntPow2 2.fract0000644000175000017500000000713412274512437025064 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 2.419570036139878; view_point_y -1.358436201999063; view_point_z -2.738259301536464; angle_alfa 45; angle_beta 37.999999999999993; zoom 3.2000000000000002e-14; perspective 1.2; formula 12; power 8; quality 0.00029999999999999997; smoothness 0.10000000000000001; folding_limit 5; folding_value 10; analityc_DE_mode 0; gamma 0.59999999999999998; reflect 0.69999999999999996; shadows_intensity 0.59999999999999998; ambient_occlusion 0.69999999999999996; ambient_occlusion_fast_tune 0.5; glow_intensity 0.5; glow_color_1_R 65535; glow_color_1_G 19878; glow_color_1_B 0; glow_color_2_R 65535; glow_color_2_G 28533; glow_color_2_B 34519; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 593531; coloring_speed 0.10000000000000001; coloring_palette_offset 164.19999999999999; post_fog_enabled 1; post_fog_visibility 162.30000000000001; post_fog_visibility_front 29.699999999999999; post_fog_color_R 65535; post_fog_color_G 65535; post_SSAO_enabled 0; post_SSAO_quality 60; post_DOF_focus 151.06209042765693; post_DOF_radius 10.199999999999999; IFS_scale 1; IFS_rot_alfa -0.05235987755982989; IFS_rot_beta 0.26179938779914941; IFS_rot_gamma 0.1221730476396031; IFS_0_x 0.70710678118654757; IFS_0_y 0.70710678118654757; IFS_0_enabled 1; IFS_1_x 0.70710678118654757; IFS_1_z 0.70710678118654757; IFS_1_enabled 1; IFS_2_x 0; IFS_2_y 0.70710678118654757; IFS_2_z 0.70710678118654757; IFS_2_enabled 1; hybrid_formula_2 10; hybrid_formula_3 8; hybrid_formula_5 16; hybrid_iterations_2 4; hybrid_iterations_3 4; hybrid_power_5 10; mandelbox_rotation_main_alfa 3.0000000000000004; mandelbox_rotation_main_beta -8; mandelbox_rotation_main_gamma 20; FoldingIntPow_folding_factor 5; linear_DE_mode 1; constant_DE_threshold 1; raytraced_reflections 1; reflections_max 2; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 89fff9 a14b33 863fa8 53b1df 22a538 a8d9d5 aac891 1d218a 72beff 1705 e33bd7 c48e6e 38abca 39541c 3ecfff 9c28 2e0563 4c9814 8da5c9 212506 a9a9c0 4affff 647862 57cdfb e16ded 35 ff7b4f 5c1138 2b2d 2 deeb82 4d1157 a66c91 acffbb 41b784 2cff52 3000 764a29 701f f3e91e 5ab464 cdff74 e7fff5 e2ffd3 15982f 55cb39 1734d2 c371 9f004c d67b10 80ff6d b20015 c07cd3 130029 5c4a8c 4737fd 6a8061 bb31a7 331472 11931c 3f2018 6fb844 ffd454 c80e00 541924 9515ac 847843 c60c0 9af217 d889ed aedbb 5aff57 287d17 adddc4 32e39b 3a 39aec3 ff7962 7affff c0ef00 9d40d4 ff85ff ff6cff 2f1480 ea6b4c e5afd6 4b562d 7b5b28 baffff cb200 c501 40e805 2422c4 a36c00 2772a9 ffffe3 ccacb0 c1ff5f d15a1b 0 6b27a0 a59282 7098fe 245566 a1f00 3d606c c794ff 9e4a7d 75ff4e 6a8800 49f5ff 42878b deb73e ffcaff f3dd61 eea537 86452f b3a06 93 a43ae1 ff2f8f efa9bd 57ef19 712d65 8bad5a 52cb44 a2ad92 692f1 8a4900 ef8019 3e0158 aaff60 a277c9 834d7a 9fb137 bea3ff d8deaf acff4f 37c6fc 94f298 908754 d6d0ff 8d5d6c 962e2f 784abe 3be7da 224b61 aa658a 8b7dbb 48d0dd 6985ff 7a1e82 512ab0 2aa3bf 10415a 7cba9f 476a7f 88aabe f1a7b7 fe72b7 c59012 5dfb8d 9aaa 7267c3 ff8ec3 da23e9 f4c98e 273159 cd77de 3e3736 9dac80 1a4a00 a7825f ffa2a9 3dff85 7fd5 ffc98e 8b4f00 68e9d0 5eebdb 5724ad cd5d0c 9ac46b 1e1b00 b25607 1d7b45 41f200 e5e3c7 1a87b9 c0a100 5319a7 61cec3 23c9b7 3f00a7 1ad84c cfff73 b12fee f2d0ed e08acf 4d866c a37616 9fefb6 83bd57 8a70c1 8b9ab2 8dc1f1 56cac5 8b6d8b eaa8ff 3164 3cfff0 bbf24b 5acaa8 67743c bf82fd c760ff 77a33d 46ff95 c72f06 a39a1 357b97 5135fd 61a4a6 eca950 266700 607a9a bdb4ac 3d9da6 bc0000 a570 62302d 92365a ffd293 50082 ff9aff f87b3f 6836c7 51b3 9cfba2 4b1740 9c865e dc4fff 7dad50 e54cdd 7193a0 e7c07 8abc18 fa7f34 a967c c35f3d d05150 ffac88 e00e7 4bc79e d4fff9 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/quaternion - lathe.fract0000644000175000017500000000433012274512437026206 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.5; formula 5; analityc_DE_mode 0; DE_factor 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; fractal_color 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/trigonometric - hq ambient occlusion.fract0000644000175000017500000000456012274512437031605 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; power 8; DE_factor 0.5; shadows_intensity 0.5; ambient_occlusion 1.5; glow_intensity 0.10000000000000001; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; fractal_color 0; post_SSAO_enabled 0; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/power 2 - screen space ambient occlusion.fract0000644000175000017500000000457212274512437032124 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.5; formula 3; spherical_folding_fixed 0.5; spherical_folding_min 1; analityc_DE_mode 0; DE_factor 0.59999999999999998; shadows_intensity 0.20000000000000001; ambient_occlusion 1.5; specular 0.29999999999999999; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; fractal_color 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Volumetric light 3.fract0000644000175000017500000000753512274512437026204 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x -2.754637098211612; view_point_y -1.002605909954452; view_point_z -1.6924581879147731; angle_alfa -70; zoom 9.9999999999999995e-08; perspective 1; formula 3; N 15; julia_mode 1; julia_a 0.59999999999999998; analityc_DE_mode 0; DE_factor 0.10000000000000001; brightness 1.5; shadows_intensity 0.10000000000000001; ambient_occlusion 0.10000000000000001; glow_intensity 0.5; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_G 0; background_color_3_B 0; background_color_1_G 0; background_color_1_B 0; fractal_color 0; main_light_colour_R 65502; main_light_colour_G 64905; aux_light_intensity 0.01; aux_light_number 3; aux_light_predefined_1_x 0; aux_light_predefined_1_y 0; aux_light_predefined_1_z 0; aux_light_predefined_1_intensity 1; aux_light_predefined_2_x 0; aux_light_predefined_2_y 0.80000000000000004; aux_light_predefined_3_x 0; aux_light_predefined_3_y -0.80000000000000004; aux_light_predefined_3_z 0; aux_light_predefined_3_intensity 1; aux_light_predefined_1_enabled 1; aux_light_predefined_2_enabled 1; aux_light_predefined_3_enabled 1; aux_light_predefined_1_colour_R 64153; aux_light_predefined_1_colour_G 65535; aux_light_predefined_1_colour_B 12262; aux_light_predefined_2_colour_R 63525; aux_light_predefined_2_colour_G 14035; aux_light_predefined_2_colour_B 21742; aux_light_predefined_3_colour_R 13956; aux_light_predefined_3_colour_G 65535; aux_light_predefined_3_colour_B 13432; aux_light_visibility 0; view_distance_max 3.908165747514559; volumetric_light_intensity_0 1; volumetric_light_intensity_1 0.10000000000000001; volumetric_light_enabled_1 1; volumetric_light_intensity_2 0.10000000000000001; volumetric_light_enabled_2 1; volumetric_light_intensity_3 0.10000000000000001; volumetric_light_enabled_3 1; volumetric_light_intensity_4 0.10000000000000001; penetrating_lights 0; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/constant factor 2.0 - mandelbox scale 2.0.fract0000644000175000017500000000575612274512437031652 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; view_point_x 1.5010485057117831; view_point_y -1.7585939208802419; view_point_z -4.508391382652829; angle_alfa 20; angle_beta 20; zoom 0.0012800000000000001; perspective 1; formula 8; power 2; fractal_constant_factor 2; quality 2; gamma 0.5; reflect 0.5; shadows_intensity 1.5; ambient_occlusion_quality 3; ambient_occlusion_fast_tune 0.69999999999999996; glow_color_1_R 1333; glow_color_1_G 65535; glow_color_1_B 0; glow_color_2_R 64879; glow_color_2_G 65535; glow_color_2_B 13146; background_color_1_R 4693; background_color_1_G 13526; background_color_1_B 17658; background_color_2_R 6793; background_color_2_G 6767; background_color_2_B 6637; background_color_1_G 13526; background_color_1_B 17658; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 627277; coloring_speed 4; coloring_palette_offset 10.1; post_fog_enabled 1; post_fog_visibility 144.69999999999999; post_fog_color_R 56852; post_fog_color_G 56324; post_fog_color_B 39735; post_SSAO_enabled 0; post_DOF_enabled 1; post_DOF_focus 141.82297373725524; mandelbox_color_Sp1 0.5; reflections_max 2; file_destination images/image; file_envmap /usr/share/mandelbulber/textures/envmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 660a00 2b9900 4a09a0 d3283e bb5413 790b0a b065d 6e986c a661ed 48ff5c 10e7b9 48 a6d0ff b40f5e 8cffff 552241 923df5 f2ebf1 9b7300 8e58bd 9ca3b b000 dcf2fb 1600 4ad4ed a8c72d a368b5 dc8f86 5ac300 fa494c 424eff 49008d f4beff 955749 71b048 8a1ab2 9a8f 33ffd9 692e a11859 a74504 71222d 7aaa6 f58ad2 79b7ff 60574d 1dd94d e69b23 d920bd 5d049d e27844 ffffbc 524445 ffffdc d9ffc9 61a0f7 a09488 98248c cfff67 ffffe0 5d355b 20 fdea51 521062 be0334 8f275b 7dbe d3e99c ffff89 8f4887 65ffff 458eff 5e1378 2bc419 8f2455 b79b0a ada1f8 80e7 76d400 731dd5 8ba840 837038 484000 325921 ff2640 ca4b65 19ab 3a8442 11675f a66566 c88075 a0ce ff4aff 20007e 273d6c fff141 7bc3a3 ffff5b adef41 8c0b7c 535a3 36285f b71e48 ff7ca7 ccd700 ff78fe c4c2 e756e4 dad684 fff8c6 d0c822 55daff 8b0000 5edfe3 a2a5d4 13d09f 6feca6 790099 e0d324 650014 1d3bc1 34bff1 a0ffaa 920918 ffe966 d5ebf1 e53bf9 2e0f9a 6f8100 4fff95 d4ff3a 2b32 ffaeaf 8088a4 563156 9f4f59 ed75ce 6352d8 4af871 5500 ffc4f6 dc2b6b 960030 3b00 ddd4ff e5a0e8 62ffff 610016 8cefd3 2e52f0 7a4cff 97f56b 762000 a0bd0c ff4d69 350b7 6cb73a fa1b57 241fb6 57643e 9b4b35 d81000 737b48 aee202 5c0065 51f3d8 2daa64 ca5f03 8b1a78 72bc7b 1aa62f 9c44ee 243461 6f8248 1495da 41ff84 31e957 85b235 424e46 9032ec a78e9e ffd88b 736bff d0ad2 e016ae e3fe07 1b1cb1 7dcca8 4430e9 e14dff 86e469 d11ebd 7bb379 643434 cd62b8 a900a4 58daff d7ded6 2ba83f 1d00 b74d80 a1d40f 12a34d 950700 ffffe4 b26b9e 14001a 3a4696 890c3a 248dca 2f1640 3c2d00 3798c6 52b24a 784da1 e78bff 9a5de7 ffe03b ca4f33 bf4397 5900 cb0049 882f63 6a3497 8a76c5 731dfc 5d218b 763450 e493c0 d95985 369650 435f41 f1ff93 2f4e 941dca 3f0891 9e5400 986b97 6f54ff 23d300 b93f05 fff0b5 c3357b 572661 94777c 3047 3a1e66 3b98b7 b800 c5bb5e ccb5a3 1569 ea4239 93a14e cec275 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/primitive objects - set.fract0000644000175000017500000000773512274512437027155 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x 0.18793852415718171; view_point_y -0.068404028665133745; angle_beta 10; zoom 2; perspective 1; formula 10; ambient_occlusion 0.20000000000000001; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_random_seed 386593; post_SSAO_enabled 0; aux_light_number 1; aux_light_predefined_1_x -0.61392373173091708; aux_light_predefined_1_y -0.96985027785133981; aux_light_predefined_1_z -0.098090253022036999; aux_light_predefined_1_intensity 0.057974605401686821; aux_light_predefined_1_enabled 1; aux_light_predefined_1_colour_R 65535; aux_light_predefined_1_colour_G 42452; aux_light_predefined_1_colour_B 16181; aux_light_visibility 2; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_5_x 0.70710678118654757; IFS_5_y -0.70710678118654757; IFS_5_enabled 1; IFS_6_x 0.70710678118654757; IFS_6_z -0.70710678118654757; IFS_6_enabled 1; IFS_7_x 0; IFS_7_y 0.70710678118654757; IFS_7_z -0.70710678118654757; IFS_7_enabled 1; penetrating_lights 0; raytraced_reflections 1; reflections_max 4; primitive_plane_enabled 1; primitive_plane_centre_Z 0.5; primitive_plane_colour_R 39681; primitive_plane_colour_G 0; primitive_plane_colour_B 0; primitive_plane_reflect 0.80000000000000004; primitive_box_enabled 1; primitive_box_centre_X 0.5; primitive_box_centre_Y -1; primitive_box_centre_Z 0.25; primitive_box_size_X 0.5; primitive_box_size_Y 0.5; primitive_box_size_Z 0.5; primitive_box_colour_R 17441; primitive_box_colour_G 32209; primitive_box_colour_B 65535; primitive_box_reflect 0.29999999999999999; primitive_invertedBox_enabled 1; primitive_invertedBox_colour_R 65535; primitive_invertedBox_colour_G 64973; primitive_invertedBox_colour_B 11971; primitive_invertedBox_reflect 0.5; primitive_sphere_enabled 1; primitive_sphere_radius 0.70709999999999995; primitive_sphere_colour_R 17270; primitive_sphere_colour_G 51465; primitive_sphere_colour_B 0; primitive_sphere_reflect 0.59999999999999998; primitive_invertedSphere_enabled 1; primitive_invertedSphere_radius 7.0709999999999997; primitive_invertedSphere_colour_R 65535; primitive_invertedSphere_colour_G 0; primitive_invertedSphere_colour_B 0; primitive_invertedSphere_reflect 0.90000000000000002; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette ffb69d 34019f 613f5a 54573a 8880be e85e05 3bc9f6 ed6c49 ffea73 a7cd7f 17006d 83ef2c a1ffac 2f6531 8e 4000a6 b822aa 1a54c1 4339e0 5236ee f53dea 8c0453 4c42e0 3cbb37 feff9b 535a69 742a42 502145 1c0037 7cffef f66e13 f00 41a5ff 710081 b77c f7e197 e0e01d b8cf8f 91f5ff 8046c 3f030f 4b400 d4cbd9 e8ac4b 9975ff 339318 893f47 28988c e4e3be 89954a ad7085 ce8201 de00a5 91bec1 75 8c0bb1 58699 723a83 b3ff82 5c4ca9 595e81 224918 7ed882 49a6 bc2cb0 54210c 53b085 da0ce9 5a5a43 ffcf4d 94bbc1 3b9ee2 ad7618 dc6937 b95c58 c59e32 bf3cb1 4c3f97 df3d73 e45dff dd56f5 ec59f0 ed81a8 d28d7e 2c92d7 49009e 1d0b0f 8662b2 4d3cbd 829a00 1284d5 5d9ffc a6481e 6e0070 64ddd3 f036c1 889397 378582 307f66 d5196d bee721 b664c5 1a7286 a6456a 32b90 d739d6 92163a 91ff82 883b11 ff43cd ba585c f31c1c 7adf94 bc0f0b a1c17b 5a8e00 254ada 728c5e 19ef05 b9 a3364b a5b672 168b00 bd6668 b94b25 ac576a b8e2ff bdf5c2 492b2a f9b3ff 1200c6 6a5ac4 83c72c 6e02 483626 5cffb6 9735 545dff 36de3b 17de56 734f97 fad641 c72200 6543 189500 e4e8ce b00084 ff3b97 55f90b ab2954 afb0e9 4d64ff ecce ffe957 eeecd1 f33564 2545 c0ffbc 4831b8 b5e524 dbfdaa b3ce8a 771927 1e5b63 a5cd00 b8986c 45c4 4eff69 a1aa71 9f22e3 1a0047 89eec0 c1c48c 9c39fa 94d449 e3b4e4 8e8630 680011 4ce78e b932ff fc9827 c1111c bf3e00 fade4e 3a547d 93f9ee 811d26 10007c 8ead9c d6d0b1 4de271 656455 ff3be6 c464c4 82eb6e 3f5132 ffed5d cdffbc e1ffff 615d10 7cdabf 498fa5 d56ef8 7ce69a 82a51f 859e00 9aeaa3 40ad64 f69289 c50000 4ad45a a3dcff 5a0134 c7406a 6c4fc5 4673e9 d440ff 28ff46 b071e2 3edb6d 46ff32 e5e67 f2718f e77aff 37b5d6 bd1ab3 b2bced e3a7ff 69fcea 7f7546 b3a13a ec22ba d7908b f5896e 1e347f bd75a4 637faa cdc8ff 6d4bf6 63a692 5a411f 94569a d665c1 740013 88c687 2c3376 cfbd4a 20995a 2fceff ff0000 43c900 fffd2e 447dff 9b0000 0 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/IFS Dodecahedron.fract0000644000175000017500000000532112274512437025610 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; angle_beta 20; zoom 4; perspective 0.80000000000000004; formula 10; background_color_1_R 7891; background_color_1_G 37121; background_color_1_B 57898; background_color_1_G 37121; background_color_1_B 57898; coloring_random_seed 123; coloring_speed 2; IFS_scale 2.6179999999999999; IFS_offsetY 1; IFS_offsetZ 1; IFS_absX 1; IFS_absY 1; IFS_absZ 1; IFS_0_x 0.80901699437447483; IFS_0_y 0.30901699437170932; IFS_0_z -0.50000000000276568; IFS_0_enabled 1; IFS_1_x -0.50000000000276579; IFS_1_y 0.80901699437447505; IFS_1_z 0.30901699437170937; IFS_1_enabled 1; IFS_2_x 0.30901699437170937; IFS_2_y -0.50000000000276579; IFS_2_z 0.80901699437447494; IFS_2_enabled 1; IFS_3_x -0.80901699437447505; IFS_3_y 0.30901699437170937; IFS_3_z 0.50000000000276579; IFS_4_x 0.50000000000276579; IFS_4_y -0.80901699437447505; IFS_4_z 0.30901699437170937; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a5818e fe6ec1 f6ff71 838ccd b998a3 d4aab6 8edc0c 24e508 7eaf69 e70000 ff8edb ae3c22 9e8f00 2c98a5 ceff84 eb87af c5a752 ffb9ff ff9f4f db71ff 7fcee 7b7a00 535000 b56e42 87ffda 445e00 d91bd3 b3ff5b eb3ae7 c5f6b2 4c995c 2ac100 d6d7fe 14ce41 d38ce 635489 2a0c65 b1f37 17f2f9 a7dadf b5e1a8 ff5167 3c009f 6955e8 907ce7 cb4e70 31591f 5dff82 ffffff 3327e6 2fa542 d90923 5fe400 33b0 81c300 ff99e0 8eb494 a44313 ff726a 788932 8943ff 86d7dc 80bdbd 66ad52 64e87d 3095d8 e5ffd0 207aa2 eeeb6c 840952 40c4 2037 c87400 fff9ff c983d4 5e8e 9d4d75 6b13 139e 18ba02 6d3b0a 23fb3c 8bffff 8fa673 f5eaff 938278 64e54d ffc531 f83402 9b7 3acf1b 8ca5d4 97f00 fa61f2 46402a ca209c a8f2ff fffb47 8820c7 9c7111 102154 9a5f8b 8ea40f 381fb1 d2a245 a291ff 8fba24 87918b ff443d add2c7 8eee07 22cc70 6ab1b4 ffa4ff 7d5a51 fff5f0 fdf088 8916d4 c5bd 6c09b7 f7a8d9 ffbf96 ce9c35 871a88 b8bfa8 e48b7b 513900 800000 83ad2f 52abe0 3000ba 4a7535 67ff95 40b400 949460 2c0038 ffe4af 2f2f3e 915b89 a897ad 7cffff ff34eb 3fc20d 3fd3ec 927668 a5a66f 9a9172 494026 54278f b15 2c815a 90019 55652b ffb6ff 76c15d f67862 4b9c0e 15922c 514c 6a8383 46ffff 208196 702067 528243 a1d5b9 21a0a3 2c df1bb1 ff93ff 18fc1 be36be b00000 a4819c 789646 6e5a03 4e8d00 e364 8e4193 946d98 91b5b3 48602e e46210 a5007f 938946 dbff31 49b3c9 6fb0a0 58464d 996e33 b022ae 3d4c9d 4451ff 1ff63a 88e239 94dbc6 e2d43b 214cc1 bcbd97 fd28eb 45c7c5 408241 7187a6 3f487f 27c492 327554 25dda8 f07feb ff7eff 5457 3e60df d389ef 21553f 17e061 5ba8b8 199516 ca003f 479f7a 3a935a ff5cff a35ad9 6464f6 4cee53 593e52 6ad36a f365dd d7fff6 1fcdff 4cffaa 22543a 95386 cb1109 bf4e08 acdd88 9a26ce ffffab a1006c aaff80 4eec2b b00002 be9394 14c055 619eec 1f1125 1ab400 e0726c 3600 6621c6 903635 81ffff 399090 dbefa9 a484b3 103aa7 808e41 d9313c ffffff ; mandelbulber1.21-1.orig/usr/share/examples/power 2 - limits.fract0000644000175000017500000000516212274512437025507 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; x_min -3; x_max 3; y_min 0; y_max 3; z_min 0; z_max 3; view_point_x -0.59999999999999998; view_point_y -0.5; angle_alfa 20; zoom 2; formula 3; N 20; quality 2; analityc_DE_mode 0; DE_factor 0.5; shadows_intensity 1; glow_intensity 0; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; coloring_random_seed 1234; coloring_speed 2; coloring_palette_offset 131.30000000000001; limits_enabled 1; post_SSAO_enabled 0; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette a96f47 b2774b af7543 af7545 af7545 ad7444 9e6942 8b6b53 a0d0c 50604 60604 70707 30301 161405 4a4926 656334 5d5f2f 494922 504c28 5f5f2d 67642e 6f6936 706346 7f7458 837a5c 817363 424029 292c17 30321e 4e5021 615f24 898a51 1c1810 161813 f0f0d a0a08 60604 40301 1a120d 8d7c6f 907e70 918174 938374 948572 8f806c 927f71 917e70 907d6f 938072 948173 927f71 917e70 927f70 907d6f 927f71 938072 938072 938072 957d71 947d71 947d70 947e71 947e71 927f71 927f71 927f71 927f71 907d6f 917e70 927f71 938072 948173 948173 938072 927f71 927f71 8f7c6e 907d6f 917e70 938072 907d6f 907d6f 907d6f 8e7b6d 907d6f 907d6f 907d6f 907d6f 8d7e6e 8b7b67 85766a 161510 d0d0b 80806 80806 252627 554e2b 857e30 242a17 867a6a 665e4c 31322d 333335 424726 454324 e1de9e bbad68 f1e189 aba850 ede997 61612f 696449 323230 2e2f2b 504e3a 927a6e 2c2f1a 5e6137 5e5c2d 90a02 a0a08 11110f 141413 151812 dea259 dfa651 dda558 e0a959 dfa858 e0a959 e0a959 e1a958 e2a958 e4ab59 e5ab59 e3ab58 e5ad58 e5ac57 e5ac53 e6ad51 c1986a cba479 c79f7c c79f7b c29979 c69e79 be9d7c bb8d69 ccaa81 cdab88 ae896c ab8462 bd926c ac8762 b48c68 b48c68 b99367 be9365 b49670 a27d5c b27f55 a89b77 9d7d67 a88460 967761 8f735d 94755c 967459 98765a 98795c 997960 9c7862 9d7863 9e7a64 a07a67 a17d6b a07b69 a07b6a a27c6f a27d6d a27f6c a17c6a a27f6c a07f6c a07f6c 9f7f6c a27e6d 9f7b6e 9e7d6e 9e7d6a 9c7b68 9c7b6c 9c7b6a 9d7c69 9c7b68 9f7e6b 9d7c6d 9d7c6c 9d7c6d 9d7c69 9c7b68 9d7c69 9d7c6d 9f7e6f 9f7e6f a07f70 a17e6e a27b66 9e7865 987764 977765 9d7c69 a48068 a17d65 9d7961 9c7860 977b65 9d7f67 9f7e64 a07d61 a77e5e a17d5f a29171 b79571 9e826d bf9a69 bc9268 bd9369 c1976d b68e6a ba9369 b99569 b08b60 fcfdfd fefefc d6dac3 fefef5 c5c7b9 dbddcf b59d7f caa16b c69c78 c79b75 d9d7c9 bfc6bf 6b7577 a8895f c98948 c08245 c18347 bf7d43 b17245 a66c46 9c6643 956340 8a6049 ; mandelbulber1.21-1.orig/usr/share/examples/modified mandelbulb 3.fract0000644000175000017500000000403212274512437026616 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 600; y_min 0; z_min 0; angle_alfa -29.999999999999996; angle_beta 20; zoom 2.3999999999999999; formula 15; power 8; analityc_DE_mode 0; DE_factor 0.5; coloring_palette_offset 85; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/quaternion - julia.fract0000644000175000017500000000523612274512437026223 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; formula 5; quality 0.014999999999999999; julia_mode 1; julia_a 0.29999999999999999; julia_b 0.40000000000000002; julia_c 0.69999999999999996; analityc_DE_mode 0; DE_factor 0.5; reflect 0.69999999999999996; shadows_intensity 1; ambient_occlusion 0.5; specular 2; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; textured_background 1; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; coloring_speed 0.29999999999999999; post_SSAO_enabled 0; constant_DE_threshold 1; raytraced_reflections 1; reflections_max 2; file_destination images/image; file_background /usr/share/mandelbulber/textures/background.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Folded trigonometric power 8 version 2.fract0000644000175000017500000000517112274512437031732 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; angle_alfa 20; zoom 10; perspective 1.5; power 8; tglad_folding_mode 1; folding_limit 2; folding_value 4; DE_factor 0.703125; brightness 1.2; ambient_occlusion 2; ambient_occlusion_quality 2; glow_intensity 0.703125; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 6811; background_color_2_G 0; background_color_2_B 17272; background_color_3_R 13512; background_color_3_G 621; background_color_3_B 0; background_color_1_G 0; background_color_1_B 0; ambient_occlusion_enabled 1; coloring_speed 0.02; post_SSAO_enabled 0; post_DOF_enabled 1; post_DOF_focus 167.34207820439465; file_destination images/image; file_lightmap /usr/share/mandelbulber/textures/lightmap.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/menger sponge 2.fract0000644000175000017500000000606012274512437025503 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_height 800; x_min -100; x_max 100; y_min -100; y_max 100; z_min 0; z_max 1; view_point_x -0.33584729783240302; view_point_y 0.33401508410832709; view_point_z -1.522029105742936e-10; angle_alfa 20; zoom 0.00048000000000000001; perspective 1.5; formula 7; quality 2; DE_factor 0.5; shadows_intensity 0.5; ambient_occlusion 2; glow_intensity 0; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 23418; background_color_2_G 0; background_color_2_B 18239; background_color_1_G 0; background_color_1_B 0; coloring_random_seed 750744; coloring_speed 5; coloring_palette_offset 52; limits_enabled 1; post_fog_enabled 1; post_fog_visibility 139.09999999999999; post_fog_visibility_front 30; post_fog_color_R 31246; post_fog_color_G 43115; post_fog_color_B 52545; post_DOF_enabled 1; post_DOF_focus 126.59191612312381; main_light_colour_R 58718; main_light_colour_G 51414; main_light_colour_B 21994; volumetric_fog_density 0.5; volumetric_fog_colour_1_distance 0.00016000007610145531; volumetric_fog_colour_2_distance 0.00032000015220291062; volumetric_fog_distance_factor 0.00032000015220291062; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 8ec777 ff4299 944f63 8dbbdd 674470 774d44 4006e db7969 81ae ff9adc 88dfd8 7691af ff68a8 6ca494 cb3d1e bd8fe0 43c1cc 111f 5057ce 3bd1ff ff7d83 e1d7d0 3cff74 a150ad e048b6 b02c9b 6f55d3 b96e2c da9dfa a2f8a2 dfe77f dad2 54bacb ae2e95 775c63 7b4180 29e40 77c326 7b7570 948775 272781 33f593 5ab75 4c555c ad568c 24bd73 97499e d1ffe0 fb225b b9913a 43b685 3ffff3 bcd187 88f5b3 ff32f4 e97738 a5a0fb 404570 625c97 2e465c fecb8e 6e000b eeb05 9773f8 e4c480 ffffff 659 64cdcd 965aaf 41b176 c9a970 b90500 d165a0 3369d9 5d202c 91648 e06737 7969 833a37 1700ad 292668 bf71ae a0003e 8fffff a400 608c00 f53c49 aa00 51aa0f 7c16 e5d3f5 4c7000 953ac4 b68ac5 e129c6 ffe39b 3f5c3b 269e38 8742ff e13796 1e063b b727aa 7c9ba9 27ed9f 7b0bff ba4f9c 8bc5ff 560006 8bc6ff d6b2d8 3f73a6 896d1f a754d3 230000 bef6ba 2cd00 8e0cd0 d6c0d4 1e6589 fff4ea d94e6c 606cc5 476442 848622 49a947 974877 ff74f6 3cb377 fffa6b 3c077a c5ff71 463c00 8fe896 42ffff 54e0ff 0 9d122c 38c5b7 b00000 91444a ffecff 569ab5 9adcf3 f0ffcb 5c36f1 23d0c8 ffff94 3dbc90 404e12 8a68ea ffaea2 a154a0 6d7488 b45 be7056 3b003e b5c2e7 f89fdb ff439e 53f930 64af14 ab4a55 23ffff b4327 ffff98 804b88 48dfc2 ff206e 863982 a20007 ffff41 182187 291ecc 8c762a 73ffa3 cbb159 3526fc 5239c7 8d09 e07d 267002 f13889 c73a ffffc5 ffb6ff 583912 2e83f2 4b5674 ffbc60 f9ee2c e091f9 435569 b71f45 9595de 45fe29 5aa33b 2d690c 1000b7 caf7b2 3cff41 52af79 4357b2 75b2 2100a0 83d086 ff9eee 364161 15810 cf5100 705a1b 3f3d31 14b1b7 b36f96 da512c 443f08 ff85f0 ffffff 794e4a 7565f8 2ac24d 2ee172 39a5ff f92f35 d041fd efc012 45e8 a7dd00 c670b5 22f8a5 213b6d 7eb615 bad695 e0f154 404650 335cc8 91416b 12eaa1 4831a0 48ff5e fffff4 b5f45c 37aac2 860b93 450099 58da 887836 7f84b0 323ab9 8168ff 984f5a 962990 17204b a04d97 1428 0 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/spherical folding - mandelbulb power 8.fract0000644000175000017500000000515612274512437031662 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.90966781319268208; view_point_y -1.5700402062501071; view_point_z -1.0454821298845891; angle_alfa -29.999999999999996; zoom 2e-08; perspective 1.2; formula 1; power 8; spherical_folding_mode 1; spherical_folding_fixed 0.90000000000000002; spherical_folding_min 0.45000000000000001; DE_factor 0.12890625; ambient_occlusion_fast_tune 0.5; glow_intensity 0.12890625; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; textured_background 1; ambient_occlusion_enabled 1; fast_ambient_occlusion_mode 1; post_SSAO_enabled 0; post_DOF_enabled 1; post_DOF_focus 162.67429649550482; post_DOF_radius 10.9; view_distance_max 3.6524631495988058; file_destination images/image; file_background /usr/share/mandelbulber/textures/background.jpg; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Folded trigonometric power 8.fract0000644000175000017500000000524012274512437030137 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; x_min -0.5; x_max 0.5; y_min -0.5; y_max 0.5; z_min -0.5; z_max 0.5; view_point_x 2.256902437830242; view_point_y -6.416300258915177; view_point_z -4.6501611348891414; angle_alfa 20; angle_beta 35; zoom 3.3333333333333327e-08; perspective 1.2; power 8; tglad_folding_mode 1; brightness 1.2; shadows_intensity 0.5; ambient_occlusion_quality 2; glow_color_1_R 65535; glow_color_1_G 1935; glow_color_1_B 0; glow_color_2_R 64715; glow_color_2_G 65535; glow_color_2_B 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 6811; background_color_2_G 0; background_color_2_B 17272; background_color_3_R 65535; background_color_3_G 61519; background_color_3_B 229; background_color_1_G 0; background_color_1_B 0; coloring_speed 0.02; post_DOF_enabled 1; post_DOF_focus 168.06504566239954; view_distance_max 15.496597795181099; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/iter fog 2.fract0000644000175000017500000000511012274512437024444 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; image_width 600; view_point_x 3.1952492913587269; view_point_y -5.5343341154817667; view_point_z -3.6895560769878442; angle_alfa 29.999999999999996; angle_beta 32.999999999999993; zoom 9.9999999999999995e-08; perspective 1; formula 8; N 18; DE_factor 0.20000000000000001; shadows_intensity 2; specular 0.29999999999999999; fog_colour_1_R 5461; fog_colour_1_G 64050; fog_colour_1_B 5712; fog_colour_2_R 62930; fog_colour_2_G 2970; fog_colour_2_B 45896; fog_colour_3_R 0; fog_colour_3_G 47451; post_SSAO_enabled 0; main_light_alfa -1.5707963267948966; main_light_beta 0.26179938779914941; mandelbox_scale -2; view_distance_max 10.733254042146459; penetrating_lights 0; iteration_fog_enable 1; iteration_fog_opacity 200; iteration_fog_opacity_trim 10; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette 6ed3b1 ffffb9 b85a3d 6f7a12 631a1c 5c9567 386514 7e5439 2cefec f3737d ab97aa 21cb59 4fdfa0 2ec1e0 2af8d6 7a3ca0 dd3e3b a4ab49 4b557 b7e624 e4e393 a97787 584676 64f718 112fc9 ff3dff bf393d 81c3c6 1c00bf 6f7197 85db38 e36037 beffe3 e9a73 ba92 957088 adb7ea ef4971 e26704 d548bf 73291 d30b2b 48 a429bd 511884 6e039a 93c731 dec07a 1028 3d7500 c3b048 9cc72b 21008d 3c7054 36851e c5f00 ce7e80 1295b5 924b68 c4452a 6100cc 6c3a6c 8e5a83 ffe16e 66f43b 76de51 ffbaff 418a65 5d2238 5ca53f ffdbda 96ffdf d1d625 8a4c00 ff1faf 1c874d fdda7f 216100 198b00 b1db58 7e4a8d a495bd e49ce1 141fa4 e23 b53d83 c07168 88fcff c5e04 1a0098 685d02 ff3b38 7d9084 6da700 a2c855 680500 ff87ff 49a21b 2543b8 65d80d 77a0fe 97ffda d4ffff 3000e 976668 ff94ff d2b579 bdb634 40000 ffb68a 9b83ea 9623c5 5effce 1a534d 230077 8fa300 b00055 ff4bbe 845e17 3691a6 b597de 38794d 36a047 5f5000 bbad73 cdff16 450e3c ff609d c94d8d a6ba30 7d99ff ffff9e c0f25e cb47ad 550000 3d7100 7d4a86 3b500 3efa57 daa3c0 b74028 7bc8ab ffefa2 3d00 ffff5f 860c59 7dff72 9000c6 2fe5b7 e79cdc 3f32cf 7ed135 ca739d b32981 4aed67 ef3738 afa1 8cbea4 bb3ef3 15a9 d59496 76d033 a8856e 826c70 6c6286 ffff6b 3446ea 4c8502 5030 76b83a 5534 23ff6e 32bf17 8d4390 dbcd54 d1100 b274c1 1c001e 92a40e b18323 69612f dffaff 42e34c 509bf3 8a11 bd78b0 33d40e 7852e2 5dbb83 b49689 7eda97 495fb1 4dda5 abab86 7085a9 a2563c ffdfff 2b3d cf9fda 654e 520400 ec94f0 84046b 6fbc25 7e24f6 5639d7 c9a238 93ff49 3c41ff 87abdf a43f53 27a5c2 f9e855 47 ffffff 79ce00 20fe83 6e2798 79007a fe98b6 55dfff b73415 312ff0 2fff8b 9ca65a d69 552d7f 5ccc9d e9db31 164e52 2e00b6 467d 554048 187ba5 c541a6 245b03 5a 41b831 225d52 4f7ba4 e6fffd 657659 df27a3 7ea200 ffed2e 934c10 aa63be 5fa9 b3e4ff 40495f 972971 9810 b26a9a 544887 9d3713 ffffff ; mandelbulber1.21-1.orig/usr/share/examples/Volumetric fog 1.fract0000644000175000017500000000566112274512437025644 0ustar krzysztofkrzysztofMandelbulber 1.1599999999999999; view_point_x -0.98737072117366054; view_point_y -0.43163037245961872; view_point_z -0.045380921561488333; angle_alfa 80; angle_beta 10; zoom 4.8828124999999998e-11; perspective 1.2; formula 1; quality 0.5; julia_a -0.0013861443224509611; julia_b -0.1240563284000485; julia_c -0.004166749982426228; DE_factor 0.5; brightness 1.3999999999999999; gamma 0.5; shadows_intensity 2; specular 0; glow_intensity 0; background_color_1_G 0; background_color_1_B 0; background_color_2_R 0; background_color_2_G 0; background_color_2_B 0; background_color_3_G 0; background_color_3_B 0; fog_colour_1_R 65535; fog_colour_1_G 42226; fog_colour_2_R 65535; fog_colour_2_G 65535; fog_colour_3_R 5624; fog_colour_3_G 11328; fog_colour_3_B 32714; background_color_1_G 0; background_color_1_B 0; coloring_random_seed 420698; post_SSAO_enabled 0; post_SSAO_quality 40; post_DOF_focus 90.257253235780468; view_distance_max 3.622947253192081; c_add -0.5; volumetric_fog_density 3; volumetric_fog_colour_1_distance 2.0000000000000002e-05; volumetric_fog_colour_2_distance 0.0001; volumetric_fog_distance_factor 3.0000000000000001e-06; file_destination images/image; file_animation_path paths/path.txt; file_keyframes keyframes/keyframe; palette d9928c 9156d5 eb71 21af23 507031 6d5d30 2d9638 f5534e e9df73 597 e 7e2c a61563 91b20d 4b4781 2b6088 38005d 2c276e 4ca89b 42e388 39 ffbdb1 95c300 60c632 41ff87 ae78 8744dc 629fff 86532f f3c3a6 ceeffa a51c09 44a33d 20837f ffb0d5 d07762 ad218 c8f2e7 6c6c61 af9109 556744 d8b036 6cffff 6d6bab 60e791 c76658 8f7640 52946c c177da 4b3493 97bb3 179039 52a538 ffa851 269940 888c6 43e4b7 bb00ab b5abac ffaff8 4d2845 884ed0 ff3636 75b4ab c79133 74d45a 8effc7 696497 e33452 5d0000 1c1e5b 4b7fd0 e1d45e 64750c 9fe957 71ffff ffff7c 4199 5e0000 7ec076 397a3b 72cbfa 69ffba cf797b 7dd1ff ea297 d4ba4d 357e3b 65e4c6 5e7036 75ee4f 1f82a5 85e33e 73c31d 4d394a 26f3ae 7815b1 d739d6 ffff63 57c8aa f8ffaa 9a6947 c4b2d3 deba6b 95000c b73e cfa5ff 43ab00 ac623a 23d9ce 6c82b5 2d1178 67f98c 5f7900 28 e56fbe ff3562 b20000 d510f0 3d00 1e4572 ffadff 63036b 9e5528 807fb0 70a8e4 a4c141 869b7b bfcc3e 773eec 94aaa6 ffd7d2 197f f89ae1 864db4 b9ff60 996a00 65a6c0 8fa6ff 5a29 8dc265 a99282 eb41f9 c9e184 84bba3 626500 334336 5e1f00 4aa00a 59b3ff adc844 91b0f0 396100 da8 32c004 857c98 ff869a c137b4 801e0 d2f1d2 49c903 4f24dc ffffa2 1fd5ce 3b4814 cd16c4 61eec7 cc864c a0a71 5a7820 5ea08c bba0ed c3002e 6d6cf5 ee504d b276a1 eb7dab 83582a 1e00b5 c3e9ff d0646d 63003d 93d82f 189a00 3dd0ff 4c83ff 5fc756 bd8eba 9acf40 b8ce af1be6 f8fffb bbf2b8 4ca24f 5a9691 ff334d fb86ef 129070 ffb7fe 8da680 2a0099 8b0728 b9d5d5 abc500 5cfbc0 bf648e df502f cd8654 7d19b1 9c2c6 bfc459 5622db 3fbd6b fffd8c 48b656 65d481 ee33ff 9c90 8a14ff 72ffd5 75e22a c39b54 57b0ff a00 66ffff a994b7 9fae14 e9ff97 9b6e89 33076a 713490 78c18a b777eb 18afb5 abfffe 920434 c30e05 4ca583 c1fa3e 738091 81a3 2d5400 8cffff 2d71 92cdec 100d14 ff6bff ffb8fa d710c 2d5d73 3569ab a32900 c4ae81 ffffff 39ddb3 ffffff ; mandelbulber1.21-1.orig/usr/share/exampleOCLformulas/0000755000175000017500000000000012274512437023531 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/usr/share/exampleOCLformulas/cl_example1Init.c0000644000175000017500000000116512274512437026716 0ustar krzysztofkrzysztof// This file has all commands which are executed once before iteration loop. // It can be used to initialize all variables and do some preliminary calculations // all available variables are defined in mandelbulber_cl_data.h float tgladDE = 1.0f; //example use of custom parameter float3 ones = 1.0f + consts->fractal.custom[0]; float mr2 = consts->fractal.mandelbox.minRadius * consts->fractal.mandelbox.minRadius; float fr2 = consts->fractal.mandelbox.fixedRadius * consts->fractal.mandelbox.fixedRadius; float scale = consts->fractal.mandelbox.scale; //this variable is used to calculate surface colour colourMin = 0.0f; mandelbulber1.21-1.orig/usr/share/exampleOCLformulas/cl_example3.c0000644000175000017500000000212412274512437026070 0ustar krzysztofkrzysztof// This file has all commands which are executed inside iteration loop // for(i = 0; i < N; i++) // example is based on Mandelbulb formula but without distance estimation // works only with Delta DE // z is a main 3-dimentional iterated vector // c is constant variable like in Mandelbrot set: z(n+1) = z(n)^2 + c // r is a length of z vector float th0 = asin(native_divide(z.z ,r)); float ph0 = atan2(z.y, z.x); float rp = native_powr(r, power); float th = th0 * power; float ph = ph0 * power; float cth = native_cos(th); z = (float3) {cth * native_cos(ph), cth * native_sin(ph), native_sin(th)}; z*=rp; z+=c; //calculation of length of z vector r = distance(z, orbitTrap); //calculation of surface colour if (r < colourMin) colourMin = r; //needed for calculation of fake lights based on orbit traps #if _orbitTrapsEnabled if (i >= consts->fractal.fakeLightsMinIter && i <= consts->fractal.fakeLightsMaxIter) distFromOrbitTrap += (1.0f/(r*r)); #endif //iteration terminate condition if(r>4.0f || any(isinf(z))) { //calculation of surface colour out.colourIndex = colourMin * 5000.0f; break; } mandelbulber1.21-1.orig/usr/share/exampleOCLformulas/cl_example2.c0000644000175000017500000000226212274512437026072 0ustar krzysztofkrzysztof// This file has all commands which are executed inside iteration loop // for(i = 0; i < N; i++) // example is based on Mandelbulb formula // z is a main 3-dimentional iterated vector // c is constant variable like in Mandelbrot set: z(n+1) = z(n)^2 + c // r is a length of z vector float th0 = asin(native_divide(z.z ,r)) + offset; float ph0 = atan2(z.y, z.x) + offset; float rp = native_powr(r, power - 1.0f); float th = th0 * power; float ph = ph0 * power ; float cth = native_cos(th); r_dz = rp * r_dz * power + 1.0f; rp *= r; z = (float3) {cth * native_cos(ph), cth * native_sin(ph), native_sin(th)}; z*=rp; z+=c*mul; //calculation of length of z vector r = distance(z, orbitTrap); //calculation of surface colour if (r < colourMin) colourMin = r; //needed for calculation of fake lights based on orbit traps #if _orbitTrapsEnabled if (i >= consts->fractal.fakeLightsMinIter && i <= consts->fractal.fakeLightsMaxIter) distFromOrbitTrap += (1.0f/(r*r)); #endif //iteration terminate condition if(r>4.0f || any(isinf(z))) { //calculation of distance estimation dist = 0.5f * r * native_log(r) / (r_dz); //calculation of surface colour out.colourIndex = colourMin * 5000.0f; break; } mandelbulber1.21-1.orig/usr/share/exampleOCLformulas/cl_example3Init.c0000644000175000017500000000042612274512437026717 0ustar krzysztofkrzysztof// This file has all commands which are executed once before iteration loop. // It can be used to initialize all variables and do some preliminary calculations // all available variables are defined in mandelbulber_cl_data.h float power = consts->fractal.power; r = length(z); mandelbulber1.21-1.orig/usr/share/exampleOCLformulas/cl_example2Init.c0000644000175000017500000000064512274512437026721 0ustar krzysztofkrzysztof// This file has all commands which are executed once before iteration loop. // It can be used to initialize all variables and do some preliminary calculations // all available variables are defined in mandelbulber_cl_data.h float power = consts->fractal.power; r = length(z); float r_dz = 1.0f; //example use of custom parameters float mul = consts->fractal.custom[0] + 1.0f; float offset = consts->fractal.custom[1]; mandelbulber1.21-1.orig/usr/share/exampleOCLformulas/cl_example1.c0000644000175000017500000000220212274512437026063 0ustar krzysztofkrzysztof// This file has all commands which are executed inside iteration loop // for(i = 0; i < N; i++) // example is based on Mandelbox formula // z is a main 3-dimentional iterated vector // c is constant variable like in Mandelbrot set: z(n+1) = z(n)^2 + c // r is a length of z vector z = fabs(z + ones) - fabs(z - ones) - z; float rr = dot(z,z); float m = scale; if (rr < mr2) m = scale / mr2; else if (rr < fr2) m = scale / rr; //example of use of rotation matrix (Mandelbox main rotation) z = Matrix33MulFloat3(consts->fractal.mandelbox.mainRot, z); z = z * m + c; //part of distance estimation calculation tgladDE = tgladDE * fabs(m) + 1.0f; //length of z vector r = distance(z, orbitTrap); //surface colour colourMin += fabs(m); //needed for calculation of fake lights based on orbit traps #if _orbitTrapsEnabled if (i >= consts->fractal.fakeLightsMinIter && i <= consts->fractal.fakeLightsMaxIter) distFromOrbitTrap += (1.0f/(r*r)); #endif //iteration terminate condition if(r>1024.0f) { //calculation of distance estimation dist = r / fabs(tgladDE); //calculation of surface colour out.colourIndex = colourMin / i * 300.0f; break; }mandelbulber1.21-1.orig/usr/bin/0000755000175000017500000000000012274512437017435 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/src/0000755000175000017500000000000012315324731016635 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/src/common_math.h0000644000175000017500000000527712274512437021330 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / some functions for different calculations / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef COMMON_MATH_H_ #define COMMON_MATH_H_ #include "algebra.hpp" struct sVectorsAround { double alpha; double beta; CVector3 v; int R; int G; int B; bool notBlack; }; struct sVector { double x; double y; double z; }; template struct sSortZ { TYPE z; int i; }; enum enumPerspectiveType { threePoint = 0, fishEye = 1, equirectangular = 2, fishEyeCut = 3 }; //int abs(int v); int Random(int max); double dMax(double a, double b, double c); double dMin(double a, double b, double c); //void QuickSortZBuffer(sSortZ *dane, int l, int p); template void QuickSortZBuffer(sSortZ *dane, int l, int p) { int i,j; //robocze indeksy sSortZ x,y; //robocze zmienne typu sortowany obiekt i=l; //{ i : = minimalny klucz } j=p; //{ j : = maksymalny klucz } x=dane[(l+p)/2]; //{ x - wyraz srodkowy sortowanej tablicy } do { //{ cala historie bedziemy powtarzac tak dlugo jak . . . } while(dane[i].z < x.z) //{ dopoki jestesmy na lewo od srodkowego } { i++; //{ ...powiekszamy indeks i } } while(x.z < dane[j].z) //{ dopoki na prawo od srodkowego } { j--; //{ ...zmniejszamy indeks j } } if(i<=j) //{ jezeli i <= j wtedy : } { //{ zamieniamy miejscami wyrazy i, j } y=dane[i]; //{ podstawienie do zmiennej roboczej } dane[i]=dane[j]; //{ pierwszy etap zamiany } dane[j]=y; //{ drugi etap zamiany } i++; //{ zwiekszenie indeksu i } j--; //{ zmniejszenie indeksu j } } } while(i<=j); //{ nie zostanie spelniony warunek i>j } if(l max - 2) count = max - 2; SaveStatus(); } bool CParamsUndo::GetUndo(sParamRender *params) { bool result = false; if (count > 0) { ReadInterface(params); string filename2=IndexFilename("undo/undo","fract",level%max); SaveSettings(filename2.c_str(), *params, true); count--; level--; if (level < 0) level = 0; filename2=IndexFilename("undo/undo","fract",level%max); if (FileIfExists(filename2.c_str())) { LoadSettings(filename2.c_str(), *params); result = true; } else { printf("Undo file not found (index = %d)\n", level % max); result = false; } } else { printf("I'm sorry, no undo\n"); result = false; } SaveStatus(); return result; } bool CParamsUndo::GetRedo(sParamRender *params) { bool result = false; if (level < last) { level++; count++; if (count > max - 2) count = max - 2; string filename2=IndexFilename("undo/undo", "fract", level % max); if (FileIfExists(filename2.c_str())) { LoadSettings(filename2.c_str(), *params); result = true; } else { printf("Undo file not found (index = %d)\n", level % max); result = false; } } else { printf("I'm sorry, no redo\n"); result = false; } SaveStatus(); return result; } void CParamsUndo::SaveStatus(void) { FILE *file = fopen("undo/undo.state", "w"); if (file) { fprintf(file,"%d %d %d",count,last,level); fclose(file); } } void CParamsUndo::LoadStatus(void) { FILE *file = fopen("undo/undo.state", "r"); if(file) { int result = fscanf(file,"%d %d %d",&count,&last,&level); (void)result; printf("Undo status: count=%d, last=%d, level=%d\n",count,last,level); fclose(file); } } mandelbulber1.21-1.orig/src/algebra.cpp0000644000175000017500000001041512274512437020745 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / Vector and matrix algebra / Functions for CMatrix33 and CRotationMatrix classes / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include "algebra.hpp" /***************** class CMatrix33 ***********************/ CMatrix33::CMatrix33() { m11 = 0; m12 = 0; m13 = 0; m21 = 0; m22 = 0; m23 = 0; m31 = 0; m32 = 0; m33 = 0; } CMatrix33::CMatrix33(const CMatrix33 &matrix) { m11 = matrix.m11; m12 = matrix.m12; m13 = matrix.m13; m21 = matrix.m21; m22 = matrix.m22; m23 = matrix.m23; m31 = matrix.m31; m32 = matrix.m32; m33 = matrix.m33; } CMatrix33& CMatrix33::operator=(const CMatrix33 &matrix) { m11 = matrix.m11; m12 = matrix.m12; m13 = matrix.m13; m21 = matrix.m21; m22 = matrix.m22; m23 = matrix.m23; m31 = matrix.m31; m32 = matrix.m32; m33 = matrix.m33; return *this; } CMatrix33 CMatrix33::operator*(const CMatrix33 &matrix) const { CMatrix33 result; result.m11 = m11 * matrix.m11 + m12 * matrix.m21 + m13 * matrix.m31; result.m12 = m11 * matrix.m12 + m12 * matrix.m22 + m13 * matrix.m32; result.m13 = m11 * matrix.m13 + m12 * matrix.m23 + m13 * matrix.m33; result.m21 = m21 * matrix.m11 + m22 * matrix.m21 + m23 * matrix.m31; result.m22 = m21 * matrix.m12 + m22 * matrix.m22 + m23 * matrix.m32; result.m23 = m21 * matrix.m13 + m22 * matrix.m23 + m23 * matrix.m33; result.m31 = m31 * matrix.m11 + m32 * matrix.m21 + m33 * matrix.m31; result.m32 = m31 * matrix.m12 + m32 * matrix.m22 + m33 * matrix.m32; result.m33 = m31 * matrix.m13 + m32 * matrix.m23 + m33 * matrix.m33; return result; } CVector3 CMatrix33::operator*(const CVector3 &vector) const { CVector3 result; result.x = m11 * vector.x + m12 * vector.y + m13 * vector.z; result.y = m21 * vector.x + m22 * vector.y + m23 * vector.z; result.z = m31 * vector.x + m32 * vector.y + m33 * vector.z; return result; } /**************** class RotarionMatrix **********************/ CRotationMatrix::CRotationMatrix() { matrix.m11 = 1.0; matrix.m12 = 0.0; matrix.m13 = 0.0; matrix.m21 = 0.0; matrix.m22 = 1.0; matrix.m23 = 0.0; matrix.m31 = 0.0; matrix.m32 = 0.0; matrix.m33 = 1.0; zero = true; } void CRotationMatrix::RotateX(double angle) { if (angle != 0.0) { CMatrix33 rot; double s = sin(angle); double c = cos(angle); rot.m11 = 1.0; rot.m22 = c; rot.m33 = c; rot.m23 = -s; rot.m32 = s; matrix = matrix * rot; zero = false; } } void CRotationMatrix::RotateY(double angle) { if (angle != 0.0) { CMatrix33 rot; double s = sin(angle); double c = cos(angle); rot.m22 = 1.0; rot.m33 = c; rot.m11 = c; rot.m31 = -s; rot.m13 = s; matrix = matrix * rot; zero = false; } } void CRotationMatrix::RotateZ(double angle) { if (angle != 0.0) { CMatrix33 rot; double s = sin(angle); double c = cos(angle); rot.m33 = 1.0; rot.m11 = c; rot.m22 = c; rot.m12 = -s; rot.m21 = s; matrix = matrix * rot; zero = false; } } void CRotationMatrix::SetRotation(double angles[3]) { Null(); RotateZ(angles[2]); RotateY(angles[1]); RotateX(angles[0]); } void CRotationMatrix::SetRotation(double alfa, double beta, double gamma) { Null(); RotateZ(alfa); RotateY(beta); RotateX(gamma); } CVector3 CRotationMatrix::RotateVector(const CVector3& vector) const { if (!zero) { CVector3 vector2 = matrix * vector; return vector2; } else { return vector; } } void CRotationMatrix::Null() { //CRotationMatrix(); matrix.m11 = 1.0; matrix.m12 = 0.0; matrix.m13 = 0.0; matrix.m21 = 0.0; matrix.m22 = 1.0; matrix.m23 = 0.0; matrix.m31 = 0.0; matrix.m32 = 0.0; matrix.m33 = 1.0; zero = true; } double CRotationMatrix::GetAlfa() const { return atan2(matrix.m12,matrix.m22); } double CRotationMatrix::GetBeta() const { return asin(-matrix.m32); } double CRotationMatrix::GetGamma() const { return atan2(matrix.m31,matrix.m33); } CRotationMatrix CRotationMatrix::Transpose() const { CRotationMatrix m; m.matrix.m11 = matrix.m11; m.matrix.m12 = matrix.m21; m.matrix.m13 = matrix.m31; m.matrix.m21 = matrix.m12; m.matrix.m22 = matrix.m22; m.matrix.m23 = matrix.m32; m.matrix.m31 = matrix.m13; m.matrix.m32 = matrix.m23; m.matrix.m33 = matrix.m33; m.zero = false; return m; } mandelbulber1.21-1.orig/src/interface.cpp0000644000175000017500000102006112274512437021307 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / definition of user interface and functions / for parameters handling / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include #include #include "interface.h" #include "settings.h" #define CONNECT_SIGNAL(object, callback, event) g_signal_connect(G_OBJECT(object), event, G_CALLBACK(callback), NULL) #define CONNECT_SIGNAL_CLICKED(x, y) CONNECT_SIGNAL(x, y, "clicked") sMainWindow renderWindow; sInterface Interface; sInterface_data Interface_data; sNoGUIdata noGUIdata; GtkWidget *window_histogram, *window_interface; GtkWidget *darea2, *darea3; GtkWidget *dareaPalette; GtkClipboard *clipboard; sTimelineInterface timelineInterface; GtkWidget *timeLineWindow = 0; char lastFilenameImage[1000]; char lastFilenameSettings[1000]; char lastFilenamePalette[1000]; bool programClosed = false; bool interfaceCreated = false; bool paletteViewCreated = false; char *sharedDir; int x_mouse = 0; int y_mouse = 0; double last_z_mouse = 2.0; double smooth_last_z_mouse = 2.0; using namespace std; GtkWidget* CreateEdit(const gchar *text, const gchar *txt_label, int size, GtkWidget *edit) { GtkWidget *box = gtk_hbox_new(FALSE, 1); gtk_entry_set_text(GTK_ENTRY(edit), text); gtk_entry_set_width_chars(GTK_ENTRY(edit), size); GtkWidget *label = gtk_label_new(txt_label); gtk_box_pack_start(GTK_BOX(box), label, false, false, 1); gtk_box_pack_start(GTK_BOX(box), edit, false, false, 1); return box; } GtkWidget* CreateWidgetWithLabel(const gchar *txt_label, GtkWidget *widget) { GtkWidget *box = gtk_hbox_new(FALSE, 1); GtkWidget *label = gtk_label_new(txt_label); gtk_box_pack_start(GTK_BOX(box), label, false, false, 1); gtk_box_pack_start(GTK_BOX(box), widget, false, false, 1); return box; } void CreateFilesDialog(GtkWidget *widget, gpointer data) { sDialogFiles *dialog = new sDialogFiles; dialog->window_files = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(dialog->window_files), "File paths"); gtk_container_set_border_width(GTK_CONTAINER(dialog->window_files), 10); dialog->box_main = gtk_vbox_new(FALSE, 1); dialog->box_buttons = gtk_hbox_new(FALSE, 1); dialog->table_edits = gtk_table_new(7, 4, false); dialog->label_destination = gtk_label_new("Destination image sequence"); dialog->label_background = gtk_label_new("Background"); dialog->label_envmap = gtk_label_new("Environment map"); dialog->label_lightmap = gtk_label_new("Ambient occlusion color map"); dialog->label_path = gtk_label_new("Animation path"); dialog->label_keyframes = gtk_label_new("Keyframe sequence"); dialog->edit_destination = gtk_entry_new(); dialog->edit_background = gtk_entry_new(); dialog->edit_envmap = gtk_entry_new(); dialog->edit_lightmap = gtk_entry_new(); dialog->edit_path = gtk_entry_new(); dialog->edit_keyframes = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(dialog->edit_destination), 100); gtk_entry_set_width_chars(GTK_ENTRY(dialog->edit_background), 100); gtk_entry_set_width_chars(GTK_ENTRY(dialog->edit_envmap), 100); gtk_entry_set_width_chars(GTK_ENTRY(dialog->edit_lightmap), 100); gtk_entry_set_width_chars(GTK_ENTRY(dialog->edit_path), 100); gtk_entry_set_width_chars(GTK_ENTRY(dialog->edit_keyframes), 100); gtk_entry_set_text(GTK_ENTRY(dialog->edit_destination), Interface_data.file_destination); gtk_entry_set_text(GTK_ENTRY(dialog->edit_background), Interface_data.file_background); gtk_entry_set_text(GTK_ENTRY(dialog->edit_envmap), Interface_data.file_envmap); gtk_entry_set_text(GTK_ENTRY(dialog->edit_lightmap), Interface_data.file_lightmap); gtk_entry_set_text(GTK_ENTRY(dialog->edit_path), Interface_data.file_path); gtk_entry_set_text(GTK_ENTRY(dialog->edit_keyframes), Interface_data.file_keyframes); dialog->bu_cancel = gtk_button_new_with_label("Cancel"); dialog->bu_ok = gtk_button_new_with_label("OK"); dialog->bu_select_destination = gtk_button_new_with_label("Select"); dialog->bu_select_background = gtk_button_new_with_label("Select"); dialog->bu_select_envmap = gtk_button_new_with_label("Select"); dialog->bu_select_lightmap = gtk_button_new_with_label("Select"); dialog->bu_select_path = gtk_button_new_with_label("Select"); dialog->bu_select_keyframes = gtk_button_new_with_label("Select"); g_signal_connect(G_OBJECT(dialog->bu_ok), "clicked", G_CALLBACK(PressedOkDialogFiles), dialog); g_signal_connect(G_OBJECT(dialog->bu_cancel), "clicked", G_CALLBACK(PressedCancelDialogFiles), dialog); g_signal_connect(G_OBJECT(dialog->bu_select_destination), "clicked", G_CALLBACK(PressedSelectDestination), dialog); g_signal_connect(G_OBJECT(dialog->bu_select_background), "clicked", G_CALLBACK(PressedSelectBackground), dialog); g_signal_connect(G_OBJECT(dialog->bu_select_envmap), "clicked", G_CALLBACK(PressedSelectEnvmap), dialog); g_signal_connect(G_OBJECT(dialog->bu_select_lightmap), "clicked", G_CALLBACK(PressedSelectLightmap), dialog); g_signal_connect(G_OBJECT(dialog->bu_select_path), "clicked", G_CALLBACK(PressedSelectFlightPath), dialog); g_signal_connect(G_OBJECT(dialog->bu_select_keyframes), "clicked", G_CALLBACK(PressedSelectKeyframes), dialog); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->label_destination, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->label_background, 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->label_envmap, 0, 1, 2, 3); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->label_lightmap, 0, 1, 3, 4); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->label_path, 0, 1, 4, 5); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->label_keyframes, 0, 1, 5, 6); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->edit_destination, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->edit_background, 1, 2, 1, 2); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->edit_envmap, 1, 2, 2, 3); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->edit_lightmap, 1, 2, 3, 4); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->edit_path, 1, 2, 4, 5); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->edit_keyframes, 1, 2, 5, 6); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->bu_select_destination, 2, 3, 0, 1); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->bu_select_background, 2, 3, 1, 2); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->bu_select_envmap, 2, 3, 2, 3); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->bu_select_lightmap, 2, 3, 3, 4); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->bu_select_path, 2, 3, 4, 5); gtk_table_attach_defaults(GTK_TABLE(dialog->table_edits), dialog->bu_select_keyframes, 2, 3, 5, 6); gtk_box_pack_start(GTK_BOX(dialog->box_main), dialog->table_edits, false, false, 1); gtk_box_pack_start(GTK_BOX(dialog->box_main), dialog->box_buttons, false, false, 1); gtk_box_pack_start(GTK_BOX(dialog->box_buttons), dialog->bu_cancel, true, true, 1); gtk_box_pack_start(GTK_BOX(dialog->box_buttons), dialog->bu_ok, true, true, 1); gtk_container_add(GTK_CONTAINER(dialog->window_files), dialog->box_main); gtk_widget_show_all(dialog->window_files); } double atofData(const gchar *text) { double retval = atof(text); return retval; } enumFractalFormula FormulaNumberGUI2Data(int formula) { enumFractalFormula formula2 = trig_optim; if (formula == 0) formula2 = none; if (formula == 1) formula2 = trig_optim; if (formula == 2) formula2 = fast_trig; if (formula == 3) formula2 = minus_fast_trig; if (formula == 4) formula2 = xenodreambuie; if (formula == 5) formula2 = hypercomplex; if (formula == 6) formula2 = quaternion; if (formula == 7) formula2 = menger_sponge; if (formula == 8) formula2 = tglad; if (formula == 9) formula2 = kaleidoscopic; if (formula == 10) formula2 = mandelbulb2; if (formula == 11) formula2 = mandelbulb3; if (formula == 12) formula2 = mandelbulb4; if (formula == 13) formula2 = foldingIntPow2; if (formula == 14) formula2 = smoothMandelbox; if (formula == 15) formula2 = mandelboxVaryScale4D; if (formula == 16) formula2 = aexion; if (formula == 17) formula2 = benesi; if (formula == 18) formula2 = bristorbrot; if (formula == 19) formula2 = generalizedFoldBox; if (formula == 20) formula2 = invertX; if (formula == 21) formula2 = invertY; if (formula == 22) formula2 = invertZ; if (formula == 23) formula2 = invertR; if (formula == 24) formula2 = sphericalFold; if (formula == 25) formula2 = powXYZ; if (formula == 26) formula2 = scaleX; if (formula == 27) formula2 = scaleY; if (formula == 28) formula2 = scaleZ; if (formula == 29) formula2 = offsetX; if (formula == 30) formula2 = offsetY; if (formula == 31) formula2 = offsetZ; if (formula == 32) formula2 = angleMultiplyX; if (formula == 33) formula2 = angleMultiplyY; if (formula == 34) formula2 = angleMultiplyZ; return formula2; } int FormulaNumberData2GUI(enumFractalFormula formula) { int formula2 = 0; if (formula == none) formula2 = 0; if (formula == trig_optim) formula2 = 1; if (formula == fast_trig) formula2 = 2; if (formula == minus_fast_trig) formula2 = 3; if (formula == xenodreambuie) formula2 = 4; if (formula == hypercomplex) formula2 = 5; if (formula == quaternion) formula2 = 6; if (formula == menger_sponge) formula2 = 7; if (formula == tglad) formula2 = 8; if (formula == kaleidoscopic) formula2 = 9; if (formula == mandelbulb2) formula2 = 10; if (formula == mandelbulb3) formula2 = 11; if (formula == mandelbulb4) formula2 = 12; if (formula == foldingIntPow2) formula2 = 13; if (formula == smoothMandelbox) formula2 = 14; if (formula == mandelboxVaryScale4D) formula2 = 15; if (formula == aexion) formula2 = 16; if (formula == benesi) formula2 = 17; if (formula == bristorbrot) formula2 = 18; if (formula == generalizedFoldBox) formula2 = 19; if (formula == invertX) formula2 = 20; if (formula == invertY) formula2 = 21; if (formula == invertZ) formula2 = 22; if (formula == invertR) formula2 = 23; if (formula == sphericalFold) formula2 = 24; if (formula == powXYZ) formula2 = 25; if (formula == scaleX) formula2 = 26; if (formula == scaleY) formula2 = 27; if (formula == scaleZ) formula2 = 28; if (formula == offsetX) formula2 = 29; if (formula == offsetY) formula2 = 30; if (formula == offsetZ) formula2 = 31; if (formula == angleMultiplyX) formula2 = 32; if (formula == angleMultiplyY) formula2 = 33; if (formula == angleMultiplyZ) formula2 = 34; return formula2; } //read data from interface void ReadInterface(sParamRender *params) { if (!noGUI) { params->doubles.vp.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_va))); params->doubles.vp.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_vb))); params->doubles.vp.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_vc))); params->doubles.alpha = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_alfa))) / 180.0 * M_PI; params->doubles.beta = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_beta))) / 180.0 * M_PI; params->doubles.gamma = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_gammaAngle))) / 180.0 * M_PI; params->doubles.zoom = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_zoom))); params->doubles.persp = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_persp))); params->doubles.DE_factor = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_DE_stepFactor))); params->doubles.quality = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_DE_thresh))); params->doubles.smoothness = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_roughness))); params->fractal.doubles.N = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_maxN))); params->fractal.minN = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_minN))); params->fractal.doubles.power = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_power))); params->image_width = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_imageWidth))); params->image_height = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_imageHeight))); params->noOfTiles = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_tiles))); params->doubles.imageAdjustments.brightness = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_brightness))); params->doubles.imageAdjustments.imageGamma = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_gamma))); params->doubles.imageAdjustments.contrast = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_contrast))); params->imageSwitches.hdrEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkHDR)); params->doubles.imageAdjustments.ambient = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_ambient))); params->doubles.imageAdjustments.globalIlum = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_ambient_occlusion))); params->doubles.imageAdjustments.glow_intensity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_glow))); params->doubles.imageAdjustments.reflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_reflect))); params->doubles.imageAdjustments.shading = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_shading))); params->doubles.imageAdjustments.directLight = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_shadows))); params->doubles.imageAdjustments.specular = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_specular))); params->global_ilumination = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAmbientOcclusion)); params->fastGlobalIllumination = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkFastAmbientOcclusion)); params->doubles.fastAoTune = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fastAoTune))); params->globalIlumQuality = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_AmbientOcclusionQuality))); params->shadow = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkShadow)); params->fractal.iterThresh = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIterThresh)); params->fractal.juliaMode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkJulia)); params->slowShading = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSlowShading)); params->texturedBackground = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkBitmapBackground)); params->background_as_fulldome = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkBitmapBackgroundFulldome)); params->fractal.doubles.julia.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_julia_a))); params->fractal.doubles.julia.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_julia_b))); params->fractal.doubles.julia.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_julia_c))); params->fractal.doubles.amin = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_amin))); params->fractal.doubles.amax = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_amax))); params->fractal.doubles.bmin = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_bmin))); params->fractal.doubles.bmax = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_bmax))); params->fractal.doubles.cmin = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_cmin))); params->fractal.doubles.cmax = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_cmax))); params->fractal.limits_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkLimits)); params->imageSwitches.coloringEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkColoring)); params->coloring_seed = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_color_seed))); params->doubles.imageAdjustments.coloring_speed = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_color_speed))); params->doubles.colourSaturation = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_colour_saturation))); params->fractal.tgladFoldingMode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkTgladMode)); params->fractal.sphericalFoldingMode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSphericalFoldingMode)); params->fractal.IFS.foldingMode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIFSFoldingMode)); params->fractal.doubles.foldingLimit = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_tglad_folding_1))); params->fractal.doubles.foldingValue = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_tglad_folding_2))); params->fractal.doubles.foldingSphericalFixed = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_spherical_folding_1))); params->fractal.doubles.foldingSphericalMin = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_spherical_folding_2))); params->imageSwitches.fogEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkFogEnabled)); params->doubles.imageAdjustments.fogVisibility = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentFogDepth)); params->SSAOQuality = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentSSAOQuality)); params->SSAOEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled)); params->DOFEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkDOFEnabled)); params->doubles.DOFFocus = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentDOFFocus)); params->doubles.DOFRadius = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentDOFRadius)); params->doubles.imageAdjustments.mainLightIntensity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mainLightIntensity))); params->doubles.auxLightIntensity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightIntensity))); params->auxLightRandomSeed = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightRandomSeed))); params->auxLightNumber = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightNumber))); params->doubles.auxLightMaxDist = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightMaxDist))); params->doubles.auxLightDistributionRadius = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightDistributionRadius))); params->doubles.auxLightPre[0].x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre1x))); params->doubles.auxLightPre[0].y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre1y))); params->doubles.auxLightPre[0].z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre1z))); params->doubles.auxLightPreIntensity[0] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre1intensity))); params->doubles.auxLightPre[1].x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre2x))); params->doubles.auxLightPre[1].y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre2y))); params->doubles.auxLightPre[1].z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre2z))); params->doubles.auxLightPreIntensity[1] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre2intensity))); params->doubles.auxLightPre[2].x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre3x))); params->doubles.auxLightPre[2].y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre3y))); params->doubles.auxLightPre[2].z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre3z))); params->doubles.auxLightPreIntensity[2] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre3intensity))); params->doubles.auxLightPre[3].x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre4x))); params->doubles.auxLightPre[3].y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre4y))); params->doubles.auxLightPre[3].z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre4z))); params->doubles.auxLightPreIntensity[3] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPre4intensity))); params->auxLightPreEnabled[0] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre1Enabled)); params->auxLightPreEnabled[1] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre2Enabled)); params->auxLightPreEnabled[2] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre3Enabled)); params->auxLightPreEnabled[3] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre4Enabled)); params->doubles.auxLightVisibility = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightVisibility))); params->doubles.mainLightAlpha = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mainLightAlfa))) / 180.0 * M_PI; params->doubles.mainLightBeta = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mainLightBeta))) / 180.0 * M_PI; params->doubles.auxLightRandomCenter.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightRandomCentreX))); params->doubles.auxLightRandomCenter.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightRandomCentreY))); params->doubles.auxLightRandomCenter.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightRandomCentreZ))); params->doubles.volumetricLightIntensity[0] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricLightMainIntensity))); params->doubles.volumetricLightIntensity[1] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricLightAux1Intensity))); params->doubles.volumetricLightIntensity[2] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricLightAux2Intensity))); params->doubles.volumetricLightIntensity[3] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricLightAux3Intensity))); params->doubles.volumetricLightIntensity[4] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricLightAux4Intensity))); params->volumetricLightEnabled[0] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightMainEnabled)); params->volumetricLightEnabled[1] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux1Enabled)); params->volumetricLightEnabled[2] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux2Enabled)); params->volumetricLightEnabled[3] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux3Enabled)); params->volumetricLightEnabled[4] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux4Enabled)); params->penetratingLights = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPenetratingLights)); params->fractal.IFS.doubles.scale = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSScale))); params->fractal.IFS.doubles.rotationAlfa = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSAlfa))) / 180.0 * M_PI; params->fractal.IFS.doubles.rotationBeta = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSBeta))) / 180.0 * M_PI; params->fractal.IFS.doubles.rotationGamma = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSGamma))) / 180.0 * M_PI; params->fractal.IFS.doubles.offset.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSOffsetX))); params->fractal.IFS.doubles.offset.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSOffsetY))); params->fractal.IFS.doubles.offset.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSOffsetZ))); params->fractal.IFS.doubles.edge.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSEdgeX))); params->fractal.IFS.doubles.edge.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSEdgeY))); params->fractal.IFS.doubles.edge.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_IFSEdgeZ))); params->fractal.IFS.absX = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIFSAbsX)); params->fractal.IFS.absY = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIFSAbsY)); params->fractal.IFS.absZ = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIFSAbsZ)); params->fractal.IFS.mengerSpongeMode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIFSMengerSponge)); params->startFrame = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_animationStartFrame))); params->endFrame = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_animationEndFrame))); params->framesPerKeyframe = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_animationFramesPerKey))); params->doubles.imageAdjustments.paletteOffset = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentPaletteOffset)); for (int i = 0; i < HYBRID_COUNT; ++i) { params->fractal.hybridIters[i] = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_hybridIter[i]))); params->fractal.doubles.hybridPower[i] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_hybridPower[i]))); } params->fractal.hybridCyclic = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkHybridCyclic)); params->perspectiveType = (enumPerspectiveType)gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboPerspectiveType)); if(params->perspectiveType == fishEyeCut){ params->fishEyeCut = true; params->perspectiveType = fishEye; } else { params->fishEyeCut = false; } params->doubles.stereoEyeDistance = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_stereoDistance))); params->stereoEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkStereoEnabled)); params->doubles.viewDistanceMin = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_viewMinDistance))); params->doubles.viewDistanceMax = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_viewMaxDistance))); params->fractal.interiorMode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkInteriorMode)); params->fractal.doubles.constantFactor = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_FractalConstantFactor))); params->fractal.linearDEmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkDELinearMode)); params->fractal.constantDEThreshold = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkConstantDEThreshold)); params->fractal.mandelbox.rotationsEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkMandelboxRotationsEnable)); params->fractal.mandelbox.doubles.foldingLimit = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxFoldingLimit))); params->fractal.mandelbox.doubles.foldingValue = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxFoldingValue))); params->fractal.mandelbox.doubles.foldingSphericalFixed = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxSpFoldingFixedRadius))); params->fractal.mandelbox.doubles.foldingSphericalMin = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxSpFoldingMinRadius))); params->fractal.mandelbox.doubles.sharpness = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxSharpness))); for (int component = 0; component < 3; ++component) params->fractal.mandelbox.doubles.rotationMain[component] = atofData(gtk_entry_get_text(GTK_ENTRY( Interface.edit_mandelboxRotationMain[component]))) / 180.0 * M_PI; for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) for (int axis = 0; axis < 3; ++axis) for (int component = 0; component < 3; ++component) params->fractal.mandelbox.doubles.rotation[fold][axis][component] = atofData( gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxRotation[fold][axis][component]))) / 180.0 * M_PI; params->fractal.mandelbox.doubles.colorFactorR = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorR))); params->fractal.mandelbox.doubles.colorFactorX = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorX))); params->fractal.mandelbox.doubles.colorFactorY = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorY))); params->fractal.mandelbox.doubles.colorFactorZ = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorZ))); params->fractal.mandelbox.doubles.colorFactorSp1 = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorSp1))); params->fractal.mandelbox.doubles.colorFactorSp2 = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorSp2))); params->fractal.mandelbox.doubles.scale = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxScale))); params->fractal.mandelbox.doubles.offset.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxOffsetX))); params->fractal.mandelbox.doubles.offset.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxOffsetY))); params->fractal.mandelbox.doubles.offset.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxOffsetZ))); params->fractal.mandelbox.doubles.solid = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxSolid))); params->fractal.mandelbox.doubles.melt = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxMelt))); params->image_width = (params->image_width/8)*8; params->image_height = (params->image_height/8)*8; for (int i = 0; i < IFS_VECTOR_COUNT; i++) { params->fractal.IFS.doubles.direction[i].x = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSx))); params->fractal.IFS.doubles.direction[i].y = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSy))); params->fractal.IFS.doubles.direction[i].z = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSz))); params->fractal.IFS.doubles.alfa[i] = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSalfa))) / 180.0 * M_PI; params->fractal.IFS.doubles.beta[i] = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSbeta))) / 180.0 * M_PI; params->fractal.IFS.doubles.gamma[i] = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSgamma))) / 180.0 * M_PI; params->fractal.IFS.doubles.distance[i] = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSdistance))); params->fractal.IFS.doubles.intensity[i] = atof(gtk_entry_get_text(GTK_ENTRY(Interface.IFSParams[i].editIFSintensity))); params->fractal.IFS.enabled[i] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.IFSParams[i].checkIFSenabled)); } params->fractal.doubles.FoldingIntPowFoldFactor = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_FoldingIntPowFoldingFactor))); params->fractal.doubles.FoldingIntPowZfactor = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_FoldingIntPowZFactor))); params->reflectionsMax = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_reflectionsMax))); params->imageSwitches.raytracedReflections = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkRaytracedReflections)); params->fractal.mandelbox.doubles.vary4D.fold = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxVaryFold))); params->fractal.mandelbox.doubles.vary4D.minR = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxVaryMinR))); params->fractal.mandelbox.doubles.vary4D.rPower = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxVaryRPower))); params->fractal.mandelbox.doubles.vary4D.scaleVary = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxVaryScale))); params->fractal.mandelbox.doubles.vary4D.wadd = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mandelboxVaryWAdd))); params->fractal.doubles.cadd = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_cadd))); params->doubles.fogColour1Distance = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricFogColorDistance))); params->doubles.fogColour2Distance = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricFogColorDistance2))); params->doubles.fogDensity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricFogDensity))); params->doubles.fogDistanceFactor = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_volumetricFogDistanceFact))); params->fractal.doubles.primitives.planeCentre.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneCentreX))); params->fractal.doubles.primitives.planeCentre.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneCentreY))); params->fractal.doubles.primitives.planeCentre.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneCentreZ))); params->fractal.doubles.primitives.planeNormal.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneNormalX))); params->fractal.doubles.primitives.planeNormal.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneNormalY))); params->fractal.doubles.primitives.planeNormal.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneNormalZ))); params->doubles.primitivePlaneReflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitivePlaneReflect))); params->fractal.primitives.planeEnable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitivePlaneEnabled)); params->fractal.primitives.onlyPlane = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveOnlyPlane)); params->fractal.doubles.primitives.boxCentre.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxCentreX))); params->fractal.doubles.primitives.boxCentre.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxCentreY))); params->fractal.doubles.primitives.boxCentre.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxCentreZ))); params->fractal.doubles.primitives.boxSize.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxSizeX))); params->fractal.doubles.primitives.boxSize.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxSizeY))); params->fractal.doubles.primitives.boxSize.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxSizeZ))); params->doubles.primitiveBoxReflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveBoxReflect))); params->fractal.primitives.boxEnable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveBoxEnabled)); params->fractal.doubles.primitives.invertedBoxCentre.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxCentreX))); params->fractal.doubles.primitives.invertedBoxCentre.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxCentreY))); params->fractal.doubles.primitives.invertedBoxCentre.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxCentreZ))); params->fractal.doubles.primitives.invertedBoxSize.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxSizeX))); params->fractal.doubles.primitives.invertedBoxSize.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxSizeY))); params->fractal.doubles.primitives.invertedBoxSize.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxSizeZ))); params->doubles.primitiveInvertedBoxReflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxReflect))); params->fractal.primitives.invertedBoxEnable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveInvertedBoxEnabled)); params->fractal.doubles.primitives.sphereCentre.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveSphereCentreX))); params->fractal.doubles.primitives.sphereCentre.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveSphereCentreY))); params->fractal.doubles.primitives.sphereCentre.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveSphereCentreZ))); params->fractal.doubles.primitives.sphereRadius = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveSphereRadius))); params->doubles.primitiveSphereReflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveSphereReflect))); params->fractal.primitives.sphereEnable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveSphereEnabled)); params->fractal.doubles.primitives.invertedSphereCentre.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereCentreX))); params->fractal.doubles.primitives.invertedSphereCentre.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereCentreY))); params->fractal.doubles.primitives.invertedSphereCentre.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereCentreZ))); params->fractal.doubles.primitives.invertedSphereRadius = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereRadius))); params->doubles.primitiveInvertedSphereReflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereReflect))); params->fractal.primitives.invertedSphereEnable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveInvertedSphereEnabled)); params->fractal.doubles.primitives.waterHeight = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterHeight))); params->fractal.doubles.primitives.waterAmplitude = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterAmplitude))); params->fractal.doubles.primitives.waterLength = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterLength))); params->fractal.doubles.primitives.waterRotation = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterRotation))); params->fractal.doubles.primitives.waterAnimSpeed = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterAnimSpeed))); params->doubles.primitiveWaterReflect = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterReflect))); params->fractal.primitives.waterIterations = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_primitiveWaterIterations))); params->fractal.primitives.waterEnable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveWaterEnabled)); params->fractal.genFoldBox.type = (enumGeneralizedFoldBoxType)gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType)); params->OpenCLEngine = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLEngine)); params->OpenCLPixelsPerJob = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLPixelsPerJob))); params->doubles.iterFogOpacityTrim = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_iterFogOpacityTrim))); params->doubles.iterFogOpacity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_iterFogOpacity))); params->imageSwitches.iterFogEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIterFogEnable)); params->fakeLightsEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkFakeLightsEnabled)); params->fractal.doubles.fakeLightsOrbitTrap.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsOrbitTrapX))); params->fractal.doubles.fakeLightsOrbitTrap.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsOrbitTrapY))); params->fractal.doubles.fakeLightsOrbitTrap.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsOrbitTrapZ))); params->doubles.fakeLightsIntensity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsIntensity))); params->doubles.fakeLightsVisibility = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsVisibility))); params->doubles.fakeLightsVisibilitySize = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsVisibilitySize))); params->fractal.fakeLightsMinIter = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsMinIter))); params->fractal.fakeLightsMaxIter = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_fakeLightsMaxIter))); params->doubles.shadowConeAngle = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_shadowConeAngle))); #ifdef CLSUPPORT params->fractal.useCustomOCLFormula = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClCustomEnable)); params->fractal.customOCLFormulaDEMode = (enumOCLDEMode)gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLDEMode)); if(clSupport->customFormulas) { std::string actualName, actualFormula, actualIni; clSupport->customFormulas->GetActual(&actualName, &actualFormula, &actualIni); strcpy(params->fractal.customOCLFormulaName, actualName.c_str()); for(int i=0; i<15; i++) params->fractal.doubles.customParameters[i] = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_customParameters[i]))); } params->fractal.doubles.deltaDEStep = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLDeltaDEStep))); params->OpenCLDOFMethod = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLDOFMode)); #endif GdkColor color; gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorGlow1), &color); params->effectColours.glow_color1 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorGlow2), &color); params->effectColours.glow_color2 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorBackgroud1), &color); params->background_color1 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorBackgroud2), &color); params->background_color2 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorBackgroud3), &color); params->background_color3 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorFog1), &color); params->fogColour1 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorFog2), &color); params->fogColour2 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorFog3), &color); params->fogColour3 = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorFog), &color); params->effectColours.fogColor = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre1), &color); params->auxLightPreColour[0] = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre2), &color); params->auxLightPreColour[1] = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre3), &color); params->auxLightPreColour[2] = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre4), &color); params->auxLightPreColour[3] = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorMainLight), &color); params->effectColours.mainLightColour = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorPrimitivePlane), &color); params->primitivePlaneColour = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveBox), &color); params->primitiveBoxColour = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveInvertedBox), &color); params->primitiveInvertedBoxColour = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveSphere), &color); params->primitiveSphereColour = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveInvertedSphere), &color); params->primitiveInvertedSphereColour = GdkColor2sRGB(color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveWater), &color); params->primitiveWaterColour = GdkColor2sRGB(color); int formula = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboFractType)); if (formula == 0) params->fractal.formula = trig_optim; if (formula == 1) params->fractal.formula = trig_DE; if (formula == 2) params->fractal.formula = fast_trig; if (formula == 3) params->fractal.formula = minus_fast_trig; if (formula == 4) params->fractal.formula = xenodreambuie; if (formula == 5) params->fractal.formula = hypercomplex; if (formula == 6) params->fractal.formula = quaternion; if (formula == 7) params->fractal.formula = menger_sponge; if (formula == 8) params->fractal.formula = tglad; if (formula == 9) params->fractal.formula = kaleidoscopic; if (formula == 10) params->fractal.formula = mandelbulb2; if (formula == 11) params->fractal.formula = mandelbulb3; if (formula == 12) params->fractal.formula = mandelbulb4; if (formula == 13) params->fractal.formula = foldingIntPow2; if (formula == 14) params->fractal.formula = smoothMandelbox; if (formula == 15) params->fractal.formula = mandelboxVaryScale4D; if (formula == 16) params->fractal.formula = aexion; if (formula == 17) params->fractal.formula = benesi; if (formula == 18) params->fractal.formula = bristorbrot; if (formula == 19) params->fractal.formula = hybrid; if (formula == 20) params->fractal.formula = generalizedFoldBox; #ifdef CLSUPPORT if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClCustomEnable))) params->fractal.formula = ocl_custom; #endif CheckPrameters(params); for (int i = 0; i < HYBRID_COUNT; ++i) params->fractal.hybridFormula[i] = FormulaNumberGUI2Data(gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboHybridFormula[i]))); double imageScale = 0; int scale = gtk_combo_box_get_active(GTK_COMBO_BOX(renderWindow.comboImageScale)); if (scale == 0) imageScale = 1.0/10.0; if (scale == 1) imageScale = 1.0/8.0; if (scale == 2) imageScale = 1.0/6.0; if (scale == 3) imageScale = 1.0/4.0; if (scale == 4) imageScale = 1.0/3.0; if (scale == 5) imageScale = 1.0/2.0; if (scale == 6) imageScale = 1.0; if (scale == 7) imageScale = 2.0; if (scale == 8) imageScale = 4.0; if (scale == 9) imageScale = 6.0; if (scale == 10) imageScale = 8.0; if (scale == 11) { int winWidth = renderWindow.scrolled_window->allocation.width; int winHeight = renderWindow.scrolled_window->allocation.height;; //gtk_window_get_size(GTK_WINDOW(renderWindow.window),&winWidth,&winHeight); winWidth-=renderWindow.scrollbarSize; winHeight-=renderWindow.scrollbarSize; imageScale = (double)winWidth / params->image_width; if(params->image_height*imageScale > winHeight) imageScale = (double)winHeight / params->image_height; } Interface_data.imageScale = imageScale; params->imageFormat = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboImageFormat)); if (params->SSAOEnabled && params->global_ilumination) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Warning! Both Ambient occlusion based on simulated rays and Screen Space Ambient Occlusion (SSAO) are activated. SSAO will be deactivated"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); params->SSAOEnabled = false; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled), params->SSAOEnabled); } if (!params->SSAOEnabled && !params->global_ilumination && params->doubles.imageAdjustments.reflect > 0 && !params->imageSwitches.raytracedReflections) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Warning! For reflection effect the Screen Space Ambient Occlusion (SSAO) effect has to be activated"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); params->SSAOEnabled = true; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled), params->SSAOEnabled); } if ((params->SSAOEnabled || params->DOFEnabled) && params->noOfTiles > 1) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Warning! When tile rendering is enabled, DOF and SSAO have to be disabled"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); params->SSAOEnabled = false; params->DOFEnabled = false; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled), params->SSAOEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkDOFEnabled), params->DOFEnabled); } params->fractal.frameNo = 0; } if (params->fractal.formula == trig_DE || params->fractal.formula == trig_optim || params->fractal.formula == menger_sponge || params->fractal.formula == kaleidoscopic || params->fractal.formula == tglad || params->fractal.formula == smoothMandelbox || params->fractal.formula == mandelboxVaryScale4D || params->fractal.formula == generalizedFoldBox) params->fractal.analitycDE = true; else params->fractal.analitycDE = false; params->doubles.resolution = 1.0 / params->image_width / params->noOfTiles; bool volLightEnabled = false; for (int i = 0; i < 5; i++) { if (params->volumetricLightEnabled[i]) volLightEnabled = true; } params->imageSwitches.volumetricLightEnabled = volLightEnabled; params->quiet = false; InterfaceData2Params(params); Interface_data.imageFormat = (enumImageFormat) params->imageFormat; mainImage.SetImageParameters(params->doubles.imageAdjustments, params->imageSwitches); //srand(Interface_data.coloring_seed); //NowaPaleta(paleta, 1.0); sRGB *palette2 = Interface_data.palette; for (int i = 0; i < 256; i++) { params->palette[i] = palette2[i]; } if(params->fractal.primitives.planeEnable) params->palette[253] = sRGBDiv256(params->primitivePlaneColour); if(params->fractal.primitives.boxEnable) params->palette[252] = sRGBDiv256(params->primitiveBoxColour); if(params->fractal.primitives.invertedBoxEnable) params->palette[251] = sRGBDiv256(params->primitiveInvertedBoxColour); if(params->fractal.primitives.sphereEnable) params->palette[250] = sRGBDiv256(params->primitiveSphereColour); if(params->fractal.primitives.invertedSphereEnable) params->palette[249] = sRGBDiv256(params->primitiveInvertedSphereColour); if(params->fractal.primitives.waterEnable) params->palette[248] = sRGBDiv256(params->primitiveWaterColour); RecalculateIFSParams(params->fractal); CreateFormulaSequence(params->fractal); } void ReadInterfaceAppSettings(sAppSettings *appParams) { #ifdef CLSUPPORT appParams->oclUseCPU = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLGPUCPU)); appParams->oclDeviceIndex = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex)); appParams->oclPlatformIndex = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex)); appParams->oclEngineSelection = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLEngine)); appParams->oclCycleTime = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLProcessingCycleTime))); appParams->oclMemoryLimit = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLMaxMem))); appParams->oclTextEditor = gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLTextEditor)); #endif appParams->absoluteMovementModeEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorAbsoluteDistance)); appParams->zoomByMouseClickEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkZoomClickEnable)); appParams->goCloseToSurfaceEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorGoToSurface)); appParams->cameraMoveStepRelative = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_step_forward))); appParams->cameraMoveStepAbsolute = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_NavigatorAbsoluteDistance))); appParams->rotationStep = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_step_rotation))); appParams->mouseCloseUpRatio = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mouse_click_distance))); appParams->netRenderClientPort = gtk_entry_get_text(GTK_ENTRY(Interface.edit_netRenderClientPort)); appParams->netRenderClientIP = gtk_entry_get_text(GTK_ENTRY(Interface.edit_netRenderClientName)); appParams->netRenderServerPort = gtk_entry_get_text(GTK_ENTRY(Interface.edit_netRenderServerPort)); } void WriteInterfaceAppSettings(sAppSettings *appParams) { #ifdef CLSUPPORT gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLGPUCPU), appParams->oclUseCPU); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), appParams->oclDeviceIndex); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), appParams->oclPlatformIndex); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLEngine), appParams->oclEngineSelection); gtk_entry_set_text(GTK_ENTRY(Interface.edit_OpenCLProcessingCycleTime), DoubleToString(appParams->oclCycleTime)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_OpenCLMaxMem), IntToString(appParams->oclMemoryLimit)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_OpenCLTextEditor), appParams->oclTextEditor.c_str()); #endif gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorAbsoluteDistance), appParams->absoluteMovementModeEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkZoomClickEnable), appParams->zoomByMouseClickEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorGoToSurface), appParams->goCloseToSurfaceEnabled); gtk_entry_set_text(GTK_ENTRY(Interface.edit_step_forward), DoubleToString(appParams->cameraMoveStepRelative)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_NavigatorAbsoluteDistance), DoubleToString(appParams->cameraMoveStepAbsolute)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_step_rotation), DoubleToString(appParams->rotationStep)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mouse_click_distance), DoubleToString(appParams->mouseCloseUpRatio)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_netRenderClientPort), appParams->netRenderClientPort.c_str()); gtk_entry_set_text(GTK_ENTRY(Interface.edit_netRenderClientName), appParams->netRenderClientIP.c_str()); gtk_entry_set_text(GTK_ENTRY(Interface.edit_netRenderServerPort), appParams->netRenderServerPort.c_str()); } char* DoubleToString(double value) { static char text[100]; sprintf(text, "%.16lg", value); return text; } char* IntToString(int value) { static char text[100]; sprintf(text, "%d", value); return text; } void WriteInterface(sParamRender *params) { gtk_entry_set_text(GTK_ENTRY(Interface.edit_va), DoubleToString(params->doubles.vp.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_vb), DoubleToString(params->doubles.vp.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_vc), DoubleToString(params->doubles.vp.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_alfa), DoubleToString(params->doubles.alpha * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_beta), DoubleToString(params->doubles.beta * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_gammaAngle), DoubleToString(params->doubles.gamma * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_zoom), DoubleToString(params->doubles.zoom)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_persp), DoubleToString(params->doubles.persp)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_DE_stepFactor), DoubleToString(params->doubles.DE_factor)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_DE_thresh), DoubleToString(params->doubles.quality)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_roughness), DoubleToString(params->doubles.smoothness)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_maxN), IntToString(params->fractal.doubles.N)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_minN), IntToString(params->fractal.minN)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_power), DoubleToString(params->fractal.doubles.power)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageWidth), IntToString(params->image_width)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageHeight), IntToString(params->image_height)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_tiles), IntToString(params->noOfTiles)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_brightness), DoubleToString(params->doubles.imageAdjustments.brightness)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_gamma), DoubleToString(params->doubles.imageAdjustments.imageGamma)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_contrast), DoubleToString(params->doubles.imageAdjustments.contrast)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_ambient), DoubleToString(params->doubles.imageAdjustments.ambient)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_ambient_occlusion), DoubleToString(params->doubles.imageAdjustments.globalIlum)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_glow), DoubleToString(params->doubles.imageAdjustments.glow_intensity)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_reflect), DoubleToString(params->doubles.imageAdjustments.reflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_shading), DoubleToString(params->doubles.imageAdjustments.shading)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_shadows), DoubleToString(params->doubles.imageAdjustments.directLight)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_specular), DoubleToString(params->doubles.imageAdjustments.specular)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_AmbientOcclusionQuality), IntToString(params->globalIlumQuality)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_julia_a), DoubleToString(params->fractal.doubles.julia.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_julia_b), DoubleToString(params->fractal.doubles.julia.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_julia_c), DoubleToString(params->fractal.doubles.julia.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_amin), DoubleToString(params->fractal.doubles.amin)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_amax), DoubleToString(params->fractal.doubles.amax)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_bmin), DoubleToString(params->fractal.doubles.bmin)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_bmax), DoubleToString(params->fractal.doubles.bmax)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_cmin), DoubleToString(params->fractal.doubles.cmin)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_cmax), DoubleToString(params->fractal.doubles.cmax)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_color_seed), IntToString(params->coloring_seed)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_color_speed), DoubleToString(params->doubles.imageAdjustments.coloring_speed)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_colour_saturation), DoubleToString(params->doubles.colourSaturation)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_tglad_folding_1), DoubleToString(params->fractal.doubles.foldingLimit)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_tglad_folding_2), DoubleToString(params->fractal.doubles.foldingValue)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_spherical_folding_1), DoubleToString(params->fractal.doubles.foldingSphericalFixed)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_spherical_folding_2), DoubleToString(params->fractal.doubles.foldingSphericalMin)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mainLightIntensity), DoubleToString(params->doubles.imageAdjustments.mainLightIntensity)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightIntensity), DoubleToString(params->doubles.auxLightIntensity)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightRandomSeed), IntToString(params->auxLightRandomSeed)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightNumber), IntToString(params->auxLightNumber)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightMaxDist), DoubleToString(params->doubles.auxLightMaxDist)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightDistributionRadius), DoubleToString(params->doubles.auxLightDistributionRadius)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre1x), DoubleToString(params->doubles.auxLightPre[0].x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre1y), DoubleToString(params->doubles.auxLightPre[0].y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre1z), DoubleToString(params->doubles.auxLightPre[0].z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre1intensity), DoubleToString(params->doubles.auxLightPreIntensity[0])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre2x), DoubleToString(params->doubles.auxLightPre[1].x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre2y), DoubleToString(params->doubles.auxLightPre[1].y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre2z), DoubleToString(params->doubles.auxLightPre[1].z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre2intensity), DoubleToString(params->doubles.auxLightPreIntensity[1])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre3x), DoubleToString(params->doubles.auxLightPre[2].x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre3y), DoubleToString(params->doubles.auxLightPre[2].y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre3z), DoubleToString(params->doubles.auxLightPre[2].z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre3intensity), DoubleToString(params->doubles.auxLightPreIntensity[2])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre4x), DoubleToString(params->doubles.auxLightPre[3].x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre4y), DoubleToString(params->doubles.auxLightPre[3].y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre4z), DoubleToString(params->doubles.auxLightPre[3].z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightPre4intensity), DoubleToString(params->doubles.auxLightPreIntensity[3])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mainLightAlfa), DoubleToString(params->doubles.mainLightAlpha * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mainLightBeta), DoubleToString(params->doubles.mainLightBeta * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightVisibility), DoubleToString(params->doubles.auxLightVisibility)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightRandomCentreX), DoubleToString(params->doubles.auxLightRandomCenter.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightRandomCentreY), DoubleToString(params->doubles.auxLightRandomCenter.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_auxLightRandomCentreZ), DoubleToString(params->doubles.auxLightRandomCenter.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSScale), DoubleToString(params->fractal.IFS.doubles.scale)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSAlfa), DoubleToString(params->fractal.IFS.doubles.rotationAlfa * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSBeta), DoubleToString(params->fractal.IFS.doubles.rotationBeta * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSGamma), DoubleToString(params->fractal.IFS.doubles.rotationGamma * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSOffsetX), DoubleToString(params->fractal.IFS.doubles.offset.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSOffsetY), DoubleToString(params->fractal.IFS.doubles.offset.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSOffsetZ), DoubleToString(params->fractal.IFS.doubles.offset.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSEdgeX), DoubleToString(params->fractal.IFS.doubles.edge.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSEdgeY), DoubleToString(params->fractal.IFS.doubles.edge.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_IFSEdgeZ), DoubleToString(params->fractal.IFS.doubles.edge.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_animationStartFrame), IntToString(params->startFrame)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_animationEndFrame), IntToString(params->endFrame)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_animationFramesPerKey), IntToString(params->framesPerKeyframe)); for (int i = 0; i < HYBRID_COUNT; ++i) { gtk_entry_set_text(GTK_ENTRY(Interface.edit_hybridIter[i]), IntToString(params->fractal.hybridIters[i])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_hybridPower[i]), DoubleToString(params->fractal.doubles.hybridPower[i])); } gtk_entry_set_text(GTK_ENTRY(Interface.edit_stereoDistance), DoubleToString(params->doubles.stereoEyeDistance)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorR), DoubleToString(params->fractal.mandelbox.doubles.colorFactorR)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorX), DoubleToString(params->fractal.mandelbox.doubles.colorFactorX)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorY), DoubleToString(params->fractal.mandelbox.doubles.colorFactorY)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorZ), DoubleToString(params->fractal.mandelbox.doubles.colorFactorZ)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorSp1), DoubleToString(params->fractal.mandelbox.doubles.colorFactorSp1)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxColorFactorSp2), DoubleToString(params->fractal.mandelbox.doubles.colorFactorSp2)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxFoldingLimit), DoubleToString(params->fractal.mandelbox.doubles.foldingLimit)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxFoldingValue), DoubleToString(params->fractal.mandelbox.doubles.foldingValue)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxSpFoldingFixedRadius), DoubleToString(params->fractal.mandelbox.doubles.foldingSphericalFixed)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxSpFoldingMinRadius), DoubleToString(params->fractal.mandelbox.doubles.foldingSphericalMin)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxSharpness), DoubleToString(params->fractal.mandelbox.doubles.sharpness)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxOffsetX), DoubleToString(params->fractal.mandelbox.doubles.offset.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxOffsetY), DoubleToString(params->fractal.mandelbox.doubles.offset.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxOffsetZ), DoubleToString(params->fractal.mandelbox.doubles.offset.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxSolid), DoubleToString(params->fractal.mandelbox.doubles.solid)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxMelt), DoubleToString(params->fractal.mandelbox.doubles.melt)); for (int component = 0; component < 3; ++component) gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxRotationMain[component]), DoubleToString( params->fractal.mandelbox.doubles.rotationMain[component] * 180.0 / M_PI)); for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) for (int axis = 0; axis < 3; ++axis) for (int component = 0; component < 3; ++component) gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxRotation[fold][axis][component]), DoubleToString(params->fractal.mandelbox.doubles.rotation[fold][axis][component] * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxScale), DoubleToString(params->fractal.mandelbox.doubles.scale)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_viewMaxDistance), DoubleToString(params->doubles.viewDistanceMax)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_viewMinDistance), DoubleToString(params->doubles.viewDistanceMin)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_FractalConstantFactor), DoubleToString(params->fractal.doubles.constantFactor)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_FoldingIntPowFoldingFactor), DoubleToString(params->fractal.doubles.FoldingIntPowFoldFactor)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_FoldingIntPowZFactor), DoubleToString(params->fractal.doubles.FoldingIntPowZfactor)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricLightMainIntensity), DoubleToString(params->doubles.volumetricLightIntensity[0])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricLightAux1Intensity), DoubleToString(params->doubles.volumetricLightIntensity[1])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricLightAux2Intensity), DoubleToString(params->doubles.volumetricLightIntensity[2])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricLightAux3Intensity), DoubleToString(params->doubles.volumetricLightIntensity[3])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricLightAux4Intensity), DoubleToString(params->doubles.volumetricLightIntensity[4])); gtk_entry_set_text(GTK_ENTRY(Interface.edit_reflectionsMax), IntToString(params->reflectionsMax)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxVaryFold), DoubleToString(params->fractal.mandelbox.doubles.vary4D.fold)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxVaryMinR), DoubleToString(params->fractal.mandelbox.doubles.vary4D.minR)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxVaryRPower), DoubleToString(params->fractal.mandelbox.doubles.vary4D.rPower)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxVaryScale), DoubleToString(params->fractal.mandelbox.doubles.vary4D.scaleVary)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_mandelboxVaryWAdd), DoubleToString(params->fractal.mandelbox.doubles.vary4D.wadd)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_cadd), DoubleToString(params->fractal.doubles.cadd)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricFogColorDistance), DoubleToString(params->doubles.fogColour1Distance)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricFogColorDistance2), DoubleToString(params->doubles.fogColour2Distance)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricFogDensity), DoubleToString(params->doubles.fogDensity)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_volumetricFogDistanceFact), DoubleToString(params->doubles.fogDistanceFactor)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fastAoTune), DoubleToString(params->doubles.fastAoTune)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneCentreX), DoubleToString(params->fractal.doubles.primitives.planeCentre.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneCentreY), DoubleToString(params->fractal.doubles.primitives.planeCentre.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneCentreZ), DoubleToString(params->fractal.doubles.primitives.planeCentre.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneNormalX), DoubleToString(params->fractal.doubles.primitives.planeNormal.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneNormalY), DoubleToString(params->fractal.doubles.primitives.planeNormal.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneNormalZ), DoubleToString(params->fractal.doubles.primitives.planeNormal.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitivePlaneReflect), DoubleToString(params->doubles.primitivePlaneReflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxCentreX), DoubleToString(params->fractal.doubles.primitives.boxCentre.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxCentreY), DoubleToString(params->fractal.doubles.primitives.boxCentre.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxCentreZ), DoubleToString(params->fractal.doubles.primitives.boxCentre.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxSizeX), DoubleToString(params->fractal.doubles.primitives.boxSize.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxSizeY), DoubleToString(params->fractal.doubles.primitives.boxSize.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxSizeZ), DoubleToString(params->fractal.doubles.primitives.boxSize.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveBoxReflect), DoubleToString(params->doubles.primitiveBoxReflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxCentreX), DoubleToString(params->fractal.doubles.primitives.invertedBoxCentre.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxCentreY), DoubleToString(params->fractal.doubles.primitives.invertedBoxCentre.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxCentreZ), DoubleToString(params->fractal.doubles.primitives.invertedBoxCentre.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxSizeX), DoubleToString(params->fractal.doubles.primitives.invertedBoxSize.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxSizeY), DoubleToString(params->fractal.doubles.primitives.invertedBoxSize.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxSizeZ), DoubleToString(params->fractal.doubles.primitives.invertedBoxSize.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedBoxReflect), DoubleToString(params->doubles.primitiveInvertedBoxReflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveSphereCentreX), DoubleToString(params->fractal.doubles.primitives.sphereCentre.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveSphereCentreY), DoubleToString(params->fractal.doubles.primitives.sphereCentre.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveSphereCentreZ), DoubleToString(params->fractal.doubles.primitives.sphereCentre.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveSphereRadius), DoubleToString(params->fractal.doubles.primitives.sphereRadius)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveSphereReflect), DoubleToString(params->doubles.primitiveSphereReflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereCentreX), DoubleToString(params->fractal.doubles.primitives.invertedSphereCentre.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereCentreY), DoubleToString(params->fractal.doubles.primitives.invertedSphereCentre.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereCentreZ), DoubleToString(params->fractal.doubles.primitives.invertedSphereCentre.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereRadius), DoubleToString(params->fractal.doubles.primitives.invertedSphereRadius)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveInvertedSphereReflect), DoubleToString(params->doubles.primitiveInvertedSphereReflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterHeight), DoubleToString(params->fractal.doubles.primitives.waterHeight)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterLength), DoubleToString(params->fractal.doubles.primitives.waterLength)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterAmplitude), DoubleToString(params->fractal.doubles.primitives.waterAmplitude)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterRotation), DoubleToString(params->fractal.doubles.primitives.waterRotation)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterIterations), IntToString(params->fractal.primitives.waterIterations)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterReflect), DoubleToString(params->doubles.primitiveWaterReflect)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_primitiveWaterAnimSpeed), DoubleToString(params->fractal.doubles.primitives.waterAnimSpeed)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_iterFogOpacity), DoubleToString(params->doubles.iterFogOpacity)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_iterFogOpacityTrim), DoubleToString(params->doubles.iterFogOpacityTrim)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsIntensity), DoubleToString(params->doubles.fakeLightsIntensity)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsVisibility), DoubleToString(params->doubles.fakeLightsVisibility)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsVisibilitySize), DoubleToString(params->doubles.fakeLightsVisibilitySize)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsOrbitTrapX), DoubleToString(params->fractal.doubles.fakeLightsOrbitTrap.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsOrbitTrapY), DoubleToString(params->fractal.doubles.fakeLightsOrbitTrap.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsOrbitTrapZ), DoubleToString(params->fractal.doubles.fakeLightsOrbitTrap.z)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsMinIter), DoubleToString(params->fractal.fakeLightsMinIter)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_fakeLightsMaxIter), DoubleToString(params->fractal.fakeLightsMaxIter)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_shadowConeAngle), DoubleToString(params->doubles.shadowConeAngle)); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkAmbientOcclusion), params->global_ilumination); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkFastAmbientOcclusion), params->fastGlobalIllumination); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkShadow), params->shadow); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIterThresh), params->fractal.iterThresh); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkJulia), params->fractal.juliaMode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkSlowShading), params->slowShading); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkLimits), params->fractal.limits_enabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkBitmapBackground), params->texturedBackground); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkBitmapBackgroundFulldome), params->background_as_fulldome); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkColoring), params->imageSwitches.coloringEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkTgladMode), params->fractal.tgladFoldingMode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkSphericalFoldingMode), params->fractal.sphericalFoldingMode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIFSFoldingMode), params->fractal.IFS.foldingMode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkFogEnabled), params->imageSwitches.fogEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled), params->SSAOEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkDOFEnabled), params->DOFEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre1Enabled), params->auxLightPreEnabled[0]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre2Enabled), params->auxLightPreEnabled[1]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre3Enabled), params->auxLightPreEnabled[2]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkAuxLightPre4Enabled), params->auxLightPreEnabled[3]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIFSAbsX), params->fractal.IFS.absX); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIFSAbsY), params->fractal.IFS.absY); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIFSAbsZ), params->fractal.IFS.absZ); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIFSMengerSponge), params->fractal.IFS.mengerSpongeMode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkHybridCyclic), params->fractal.hybridCyclic); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkStereoEnabled), params->stereoEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkMandelboxRotationsEnable), params->fractal.mandelbox.rotationsEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkInteriorMode), params->fractal.interiorMode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkDELinearMode), params->fractal.linearDEmode); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkConstantDEThreshold), params->fractal.constantDEThreshold); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightMainEnabled), params->volumetricLightEnabled[0]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux1Enabled), params->volumetricLightEnabled[1]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux2Enabled), params->volumetricLightEnabled[2]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux3Enabled), params->volumetricLightEnabled[3]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkVolumetricLightAux4Enabled), params->volumetricLightEnabled[4]); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPenetratingLights), params->penetratingLights); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkRaytracedReflections), params->imageSwitches.raytracedReflections); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitivePlaneEnabled), params->fractal.primitives.planeEnable); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveOnlyPlane), params->fractal.primitives.onlyPlane); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveBoxEnabled), params->fractal.primitives.boxEnable); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveInvertedBoxEnabled), params->fractal.primitives.invertedBoxEnable); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveSphereEnabled), params->fractal.primitives.sphereEnable); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveInvertedSphereEnabled), params->fractal.primitives.invertedSphereEnable); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkPrimitiveWaterEnabled), params->fractal.primitives.waterEnable); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkIterFogEnable), params->imageSwitches.iterFogEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkFakeLightsEnabled), params->fakeLightsEnabled); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkHDR), params->imageSwitches.hdrEnabled); gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentFogDepth), params->doubles.imageAdjustments.fogVisibility); gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentSSAOQuality), params->SSAOQuality); gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentDOFFocus), params->doubles.DOFFocus); gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentDOFRadius), params->doubles.DOFRadius); gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentPaletteOffset), params->doubles.imageAdjustments.paletteOffset); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSx), DoubleToString(params->fractal.IFS.doubles.direction[i].x)); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSy), DoubleToString(params->fractal.IFS.doubles.direction[i].y)); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSz), DoubleToString(params->fractal.IFS.doubles.direction[i].z)); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSalfa), DoubleToString(params->fractal.IFS.doubles.alfa[i] * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSbeta), DoubleToString(params->fractal.IFS.doubles.beta[i] * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSgamma), DoubleToString(params->fractal.IFS.doubles.gamma[i] * 180.0 / M_PI)); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSdistance), DoubleToString(params->fractal.IFS.doubles.distance[i])); gtk_entry_set_text(GTK_ENTRY(Interface.IFSParams[i].editIFSintensity), DoubleToString(params->fractal.IFS.doubles.intensity[i])); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.IFSParams[i].checkIFSenabled), params->fractal.IFS.enabled[i]); } #ifdef CLSUPPORT gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDEMode), params->fractal.customOCLFormulaDEMode); params->fractal.useCustomOCLFormula = false; if(params->fractal.formula == ocl_custom) params->fractal.useCustomOCLFormula = true; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClCustomEnable), params->fractal.useCustomOCLFormula); if (params->fractal.useCustomOCLFormula) { if (!clSupport->IsEnabled()) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClEnable), true); } if (clSupport->customFormulas) { bool result = clSupport->customFormulas->SetActualByName(params->fractal.customOCLFormulaName); if(!result) { printf("Formula %s doesn't exists in your library\n", params->fractal.customOCLFormulaName); if (!noGUI) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Formula %s doesn't exists in your library\n", params->fractal.customOCLFormulaName); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } for (int i = 0; i < 15; i++) gtk_entry_set_text(GTK_ENTRY(Interface.edit_customParameters[i]), DoubleToString(params->fractal.doubles.customParameters[i])); } } gtk_entry_set_text(GTK_ENTRY(Interface.edit_OpenCLDeltaDEStep), DoubleToString(params->fractal.doubles.deltaDEStep)); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDOFMode), params->OpenCLDOFMethod); #endif enumPerspectiveType perspTypeTemp = params->perspectiveType; if(params->fishEyeCut && perspTypeTemp == fishEye) perspTypeTemp = fishEyeCut; gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboPerspectiveType), perspTypeTemp); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), params->fractal.genFoldBox.type); int formula = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboFractType)); if (params->fractal.formula == trig_optim) formula = 0; if (params->fractal.formula == trig_DE) formula = 1; if (params->fractal.formula == fast_trig) formula = 2; if (params->fractal.formula == minus_fast_trig) formula = 3; if (params->fractal.formula == xenodreambuie) formula = 4; if (params->fractal.formula == hypercomplex) formula = 5; if (params->fractal.formula == quaternion) formula = 6; if (params->fractal.formula == menger_sponge) formula = 7; if (params->fractal.formula == tglad) formula = 8; if (params->fractal.formula == kaleidoscopic) formula = 9; if (params->fractal.formula == mandelbulb2) formula = 10; if (params->fractal.formula == mandelbulb3) formula = 11; if (params->fractal.formula == mandelbulb4) formula = 12; if (params->fractal.formula == foldingIntPow2) formula = 13; if (params->fractal.formula == smoothMandelbox) formula = 14; if (params->fractal.formula == mandelboxVaryScale4D) formula = 15; if (params->fractal.formula == aexion) formula = 16; if (params->fractal.formula == benesi) formula = 17; if (params->fractal.formula == bristorbrot) formula = 18; if (params->fractal.formula == hybrid) formula = 19; if (params->fractal.formula == generalizedFoldBox) formula = 20; gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboFractType), formula); for (int i = 0; i < HYBRID_COUNT; ++i) gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboHybridFormula[i]), FormulaNumberData2GUI(params->fractal.hybridFormula[i])); GdkColor color; color = sRGB2GdkColor(params->effectColours.glow_color1); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorGlow1), &color); color = sRGB2GdkColor(params->effectColours.glow_color2); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorGlow2), &color); color = sRGB2GdkColor(params->background_color1); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorBackgroud1), &color); color = sRGB2GdkColor(params->background_color2); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorBackgroud2), &color); color = sRGB2GdkColor(params->background_color3); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorBackgroud3), &color); color = sRGB2GdkColor(params->fogColour1); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorFog1), &color); color = sRGB2GdkColor(params->fogColour2); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorFog2), &color); color = sRGB2GdkColor(params->fogColour3); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorFog3), &color); color = sRGB2GdkColor(params->effectColours.fogColor); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorFog), &color); color = sRGB2GdkColor(params->auxLightPreColour[0]); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre1), &color); color = sRGB2GdkColor(params->auxLightPreColour[1]); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre2), &color); color = sRGB2GdkColor(params->auxLightPreColour[2]); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre3), &color); color = sRGB2GdkColor(params->auxLightPreColour[3]); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre4), &color); color = sRGB2GdkColor(params->effectColours.mainLightColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorMainLight), &color); color = sRGB2GdkColor(params->primitivePlaneColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorPrimitivePlane), &color); color = sRGB2GdkColor(params->primitiveBoxColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveBox), &color); color = sRGB2GdkColor(params->primitiveInvertedBoxColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveInvertedBox), &color); color = sRGB2GdkColor(params->primitiveSphereColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveSphere), &color); color = sRGB2GdkColor(params->primitiveInvertedSphereColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveInvertedSphere), &color); color = sRGB2GdkColor(params->primitiveWaterColour); gtk_color_button_set_color(GTK_COLOR_BUTTON(Interface.buColorPrimitiveWater), &color); DrawPalette(params->palette); } void AddComboTextsFractalFormula(GtkComboBox *combo) { gtk_combo_box_append_text(combo, "None"); gtk_combo_box_append_text(combo, "Mandelbulb"); gtk_combo_box_append_text(combo, "Polynomic power 2"); gtk_combo_box_append_text(combo, "Polynomic power 2 - minus z"); gtk_combo_box_append_text(combo, "Xenodreambuie's formula"); gtk_combo_box_append_text(combo, "Hypercomplex"); gtk_combo_box_append_text(combo, "Quaternion"); gtk_combo_box_append_text(combo, "Menger sponge"); gtk_combo_box_append_text(combo, "Mandelbox"); gtk_combo_box_append_text(combo, "Kaleidoscopic IFS"); gtk_combo_box_append_text(combo, "Modified Mandelbulb 1"); gtk_combo_box_append_text(combo, "Modified Mandelbulb 2"); gtk_combo_box_append_text(combo, "Modified Mandelbulb 3"); gtk_combo_box_append_text(combo, "FoldingIntPow2"); gtk_combo_box_append_text(combo, "Smooth Mandelbox"); gtk_combo_box_append_text(combo, "Mandelbox vary scale 4D"); gtk_combo_box_append_text(combo, "Aexion"); gtk_combo_box_append_text(combo, "Benesi"); gtk_combo_box_append_text(combo, "Bristorbrot"); gtk_combo_box_append_text(combo, "Generalized Mandelbox Fold"); gtk_combo_box_append_text(combo, "x^2/(x + p)"); gtk_combo_box_append_text(combo, "y^2/(y + p)"); gtk_combo_box_append_text(combo, "z^2/(z + p)"); gtk_combo_box_append_text(combo, "r^2/(r + p)"); gtk_combo_box_append_text(combo, "spherical fold (radius = p)"); gtk_combo_box_append_text(combo, "x^p, y^p, z^p"); gtk_combo_box_append_text(combo, "x * p"); gtk_combo_box_append_text(combo, "y * p"); gtk_combo_box_append_text(combo, "z * p"); gtk_combo_box_append_text(combo, "x + p"); gtk_combo_box_append_text(combo, "y + p"); gtk_combo_box_append_text(combo, "z + p"); gtk_combo_box_append_text(combo, "axis X angle multiply by p"); gtk_combo_box_append_text(combo, "axis Y angle multiply by p"); gtk_combo_box_append_text(combo, "axis Z angle multiply by p"); } void CreateInterface(sParamRender *default_settings) { //------------- glowne okno renderowania renderWindow.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(renderWindow.window), "Mandelbulber Render Window"); CONNECT_SIGNAL(renderWindow.window, StopRenderingAndQuit, "delete_event"); gtk_widget_add_events(GTK_WIDGET(renderWindow.window), GDK_CONFIGURE); CONNECT_SIGNAL(renderWindow.window, WindowReconfigured, "configure-event"); //glowny box w oknie renderWindow.mainBox = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(renderWindow.mainBox), 0); //obszar rysowania renderWindow.drawingArea = gtk_drawing_area_new(); gtk_widget_set_size_request(renderWindow.drawingArea, mainImage.GetPreviewWidth(), mainImage.GetPreviewHeight()+50); gtk_window_set_default_size(GTK_WINDOW(renderWindow.window), mainImage.GetPreviewWidth() + 16, mainImage.GetPreviewHeight() + 50); renderWindow.lastWindowWidth = mainImage.GetPreviewWidth()+16; renderWindow.lastWindowHeight = mainImage.GetPreviewHeight()+50; gtk_signal_connect(GTK_OBJECT(renderWindow.drawingArea), "expose-event", GTK_SIGNAL_FUNC(on_darea_expose), NULL); gtk_signal_connect(GTK_OBJECT(renderWindow.drawingArea), "motion_notify_event", (GtkSignalFunc) motion_notify_event, NULL); gtk_signal_connect(GTK_OBJECT(renderWindow.drawingArea), "button_press_event", GTK_SIGNAL_FUNC(pressed_button_on_image), NULL); gtk_widget_set_events(renderWindow.drawingArea, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK); renderWindow.hadjustment = gtk_adjustment_new(0, 0, 1000, 1, 1, 100); renderWindow.vadjustment = gtk_adjustment_new(0, 0, 1000, 1, 1, 100); renderWindow.scrolled_window = gtk_scrolled_window_new(GTK_ADJUSTMENT(renderWindow.hadjustment), GTK_ADJUSTMENT(renderWindow.vadjustment)); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(renderWindow.scrolled_window), renderWindow.drawingArea); gtk_box_pack_start(GTK_BOX(renderWindow.mainBox), renderWindow.scrolled_window, true, true, 1); //----- buttons renderWindow.boxButtons = gtk_hbox_new(FALSE, 1); gtk_box_pack_start(GTK_BOX(renderWindow.mainBox), renderWindow.boxButtons, false, false, 1); //image scale combo renderWindow.labelImageScale = gtk_label_new("Image scale:"); gtk_box_pack_start(GTK_BOX(renderWindow.boxButtons), renderWindow.labelImageScale, false, false, 1); renderWindow.comboImageScale = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1/10"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1/8"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1/6"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1/4"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1/3"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1/2"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "1"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "2"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "4"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "6"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "8"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboImageScale), "Fit to window"); gtk_combo_box_set_active(GTK_COMBO_BOX(renderWindow.comboImageScale), 11); gtk_box_pack_start(GTK_BOX(renderWindow.boxButtons), renderWindow.comboImageScale, false, false, 10); //image scale combo renderWindow.labelMouseClickMode = gtk_label_new("Mouse click function:"); gtk_box_pack_start(GTK_BOX(renderWindow.boxButtons), renderWindow.labelMouseClickMode, false, false, 1); renderWindow.comboMouseClickMode = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "None"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Move the camera"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set fog front distance"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set fog visibility distance"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set Depth of Field focus point"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set position of aux. light #1"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set position of aux. light #2"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set position of aux. light #3"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set position of aux. light #4"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set position of centre for random lights"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Set Julia constant"); gtk_combo_box_append_text(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), "Measure"); gtk_combo_box_set_active(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), 1); gtk_box_pack_start(GTK_BOX(renderWindow.boxButtons), renderWindow.comboMouseClickMode, false, false, 1); //mainBox into window gtk_container_add(GTK_CONTAINER(renderWindow.window), renderWindow.mainBox); //wyswietlenie wszystkich widgetow gtk_widget_show_all(renderWindow.window); //get scrollbar size GtkWidget *hscrollbar = gtk_scrolled_window_get_hscrollbar(GTK_SCROLLED_WINDOW(renderWindow.scrolled_window)); renderWindow.scrollbarSize = hscrollbar->allocation.height; //------------------- okno histogramu iteracji ------------ window_histogram = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window_histogram), "left - number of iterations (max 64) / right - number of steps (max. 1000)"); CONNECT_SIGNAL(window_histogram, StopRenderingAndQuit, "delete_event"); //glowny box w oknie GtkWidget *box2 = gtk_vbox_new(FALSE, 0); gtk_container_set_border_width(GTK_CONTAINER(box2), 5); //obszar rysowania darea2 = gtk_drawing_area_new(); gtk_widget_set_size_request(darea2, 512, 128); gtk_box_pack_start(GTK_BOX(box2), darea2, FALSE, FALSE, 0); gtk_container_add(GTK_CONTAINER(window_histogram), box2); gtk_widget_show_all(window_histogram); //------------------- MAIN WINDOW ------------ window_interface = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window_interface), "Mandelbulber (default.fract)"); gtk_container_set_border_width(GTK_CONTAINER(window_interface), 10); CONNECT_SIGNAL(window_interface, StopRenderingAndQuit, "delete_event"); //tabs Interface.tabs = gtk_notebook_new(); Interface.tab_label_view = gtk_label_new("View"); Interface.tab_label_engine = gtk_label_new("Engine"); Interface.tab_label_fractal = gtk_label_new("Fractal"); Interface.tab_label_hybrid = gtk_label_new("Hybrid"); Interface.tab_label_mandelbox = gtk_label_new("Mandelbox"); Interface.tab_label_shaders = gtk_label_new("Shaders 1"); Interface.tab_label_image = gtk_label_new("Image"); Interface.tab_label_animation = gtk_label_new("Animation"); Interface.tab_label_shaders2 = gtk_label_new("Shaders 2"); Interface.tab_label_lights = gtk_label_new("Lights"); Interface.tab_label_IFS = gtk_label_new("IFS"); Interface.tab_label_openCL = gtk_label_new("OpenCL"); Interface.tab_label_about = gtk_label_new("About..."); Interface.tab_box_view = gtk_vbox_new(FALSE, 1); Interface.tab_box_engine = gtk_vbox_new(FALSE, 1); Interface.tab_box_fractal = gtk_vbox_new(FALSE, 1); Interface.tab_box_shaders = gtk_vbox_new(FALSE, 1); Interface.tab_box_image = gtk_vbox_new(FALSE, 1); Interface.tab_box_animation = gtk_vbox_new(FALSE, 1); Interface.tab_box_shaders2 = gtk_vbox_new(FALSE, 1); Interface.tab_box_about = gtk_vbox_new(FALSE, 1); Interface.tab_box_lights = gtk_vbox_new(FALSE, 1); Interface.tab_box_IFS = gtk_vbox_new(FALSE, 1); Interface.tab_box_hybrid = gtk_vbox_new(FALSE, 1); Interface.tab_box_mandelbox = gtk_vbox_new(FALSE, 1); Interface.tab_box_openCL = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_view), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_engine), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_fractal), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_shaders), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_image), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_animation), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_shaders2), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_lights), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_IFS), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_about), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_hybrid), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_openCL), 5); Interface.tabsPrimitives = gtk_notebook_new(); Interface.tab_label_primitivePlane = gtk_label_new("Plane"); Interface.tab_label_primitiveWater = gtk_label_new("Water"); Interface.tab_label_primitiveBox = gtk_label_new("Box"); Interface.tab_label_primitiveBoxInv = gtk_label_new("Inverted Box"); Interface.tab_label_primitiveSphere = gtk_label_new("Sphere"); Interface.tab_label_primitiveSphereInv = gtk_label_new("Inverted sphere"); Interface.tab_box_primitivePlane = gtk_vbox_new(FALSE, 1); Interface.tab_box_primitiveWater = gtk_vbox_new(FALSE, 1); Interface.tab_box_primitiveBox = gtk_vbox_new(FALSE, 1); Interface.tab_box_primitiveBoxInv = gtk_vbox_new(FALSE, 1); Interface.tab_box_primitiveSphere = gtk_vbox_new(FALSE, 1); Interface.tab_box_primitiveSphereInv = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_primitivePlane), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_primitiveWater), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_primitiveBox), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_primitiveBoxInv), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_primitiveSphere), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_primitiveSphereInv), 5); Interface.tabsNetRender = gtk_notebook_new(); Interface.tab_label_server = gtk_label_new("Server"); Interface.tab_label_client = gtk_label_new("Client"); Interface.tab_box_server = gtk_vbox_new(FALSE, 1); Interface.tab_box_client = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_server), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_client), 5); Interface.tabsOpenCL = gtk_notebook_new(); Interface.tab_label_openclEngine = gtk_label_new("Engine"); Interface.tab_label_openclCustom = gtk_label_new("Custom formulas"); Interface.tab_box_openclEngine = gtk_vbox_new(FALSE, 1); Interface.tab_box_openclCustom = gtk_vbox_new(FALSE, 1); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_openclEngine), 5); gtk_container_set_border_width(GTK_CONTAINER(Interface.tab_box_openclCustom), 5); //boxes Interface.boxMain = gtk_vbox_new(FALSE, 1); Interface.boxButtons = gtk_hbox_new(FALSE, 1); Interface.boxView = gtk_vbox_new(FALSE, 1); Interface.boxCoordinates = gtk_hbox_new(FALSE, 1); Interface.boxAngle = gtk_hbox_new(FALSE, 1); Interface.boxNavigation = gtk_vbox_new(FALSE, 1); Interface.boxNavigationButtons = gtk_hbox_new(FALSE, 1); Interface.boxNavigationZooming = gtk_hbox_new(FALSE, 1); Interface.boxZoom = gtk_hbox_new(FALSE, 1); Interface.boxArrows = gtk_hbox_new(FALSE, 1); Interface.boxArrows2 = gtk_vbox_new(FALSE, 1); Interface.boxArrows3 = gtk_vbox_new(FALSE, 1); Interface.boxFractalFormula = gtk_vbox_new(FALSE, 1); Interface.boxFractalPower = gtk_hbox_new(FALSE, 1); Interface.boxFractalFoldingIntPow = gtk_hbox_new(FALSE, 1); Interface.boxFractalFolding = gtk_vbox_new(FALSE, 1); Interface.boxFractalRayMarching = gtk_vbox_new(FALSE, 1); Interface.boxFractalSwitches = gtk_hbox_new(FALSE, 1); Interface.boxLimits = gtk_hbox_new(FALSE, 1); Interface.boxJulia = gtk_hbox_new(FALSE, 1); Interface.boxQuality = gtk_hbox_new(FALSE, 1); Interface.boxImage = gtk_vbox_new(FALSE, 1); Interface.boxImageRes = gtk_hbox_new(FALSE, 1); Interface.boxEffects = gtk_vbox_new(FALSE, 1); Interface.boxBrightness = gtk_hbox_new(FALSE, 1); Interface.boxShading = gtk_hbox_new(FALSE, 1); Interface.boxShading2 = gtk_hbox_new(FALSE, 1); Interface.boxEffectsChecks = gtk_hbox_new(FALSE, 1); Interface.boxEffectsChecks2 = gtk_hbox_new(FALSE, 1); Interface.boxEffectsColoring = gtk_hbox_new(FALSE, 1); Interface.boxColors = gtk_vbox_new(FALSE, 1); Interface.boxGlowColor = gtk_hbox_new(FALSE, 1); Interface.boxLoadSave = gtk_hbox_new(FALSE, 1); Interface.boxAnimation = gtk_vbox_new(FALSE, 1); Interface.boxAnimationButtons = gtk_hbox_new(FALSE, 1); Interface.boxAnimationEdits = gtk_hbox_new(FALSE, 1); Interface.boxAnimationEdits2 = gtk_hbox_new(FALSE, 1); Interface.boxTgladFolding = gtk_hbox_new(FALSE, 1); Interface.boxSphericalFolding = gtk_hbox_new(FALSE, 1); Interface.boxSaveImage = gtk_hbox_new(FALSE, 1); Interface.boxPostFog = gtk_vbox_new(FALSE, 1); Interface.boxFogButtons = gtk_hbox_new(FALSE, 1); Interface.boxFogSlider = gtk_hbox_new(FALSE, 1); Interface.boxFogSlider2 = gtk_hbox_new(FALSE, 1); Interface.boxPostSSAO = gtk_vbox_new(FALSE, 1); Interface.boxSSAOButtons = gtk_hbox_new(FALSE, 1); Interface.boxSSAOSlider = gtk_hbox_new(FALSE, 1); Interface.boxPostDOF = gtk_vbox_new(FALSE, 1); Interface.boxDOFSlider1 = gtk_hbox_new(FALSE, 1); Interface.boxDOFSlider2 = gtk_hbox_new(FALSE, 1); Interface.boxDOFButtons = gtk_hbox_new(FALSE, 1); Interface.boxLightBallance = gtk_vbox_new(FALSE, 1); Interface.boxLightsParameters = gtk_vbox_new(FALSE, 1); Interface.boxPredefinedLights = gtk_vbox_new(FALSE, 1); Interface.boxLightBrightness = gtk_hbox_new(FALSE, 1); Interface.boxLightDistribution = gtk_hbox_new(FALSE, 1); Interface.boxLightDistribution2 = gtk_hbox_new(FALSE, 1); Interface.boxLightPre1 = gtk_hbox_new(FALSE, 1); Interface.boxLightPre2 = gtk_hbox_new(FALSE, 1); Interface.boxLightPre3 = gtk_hbox_new(FALSE, 1); Interface.boxLightPre4 = gtk_hbox_new(FALSE, 1); Interface.boxLightCommon= gtk_hbox_new(FALSE, 1); Interface.boxMainLight = gtk_vbox_new(FALSE, 1); Interface.boxMainLightPosition = gtk_hbox_new(FALSE, 1); Interface.boxIFSMain = gtk_vbox_new(FALSE, 1); Interface.boxIFSMainEdit = gtk_hbox_new(FALSE, 1); Interface.boxIFSMainEdit2 = gtk_hbox_new(FALSE, 1); Interface.boxIFSParams = gtk_vbox_new(FALSE, 1); Interface.boxIFSButtons = gtk_hbox_new(FALSE, 1); Interface.boxIFSDefaults = gtk_hbox_new(FALSE, 1); Interface.boxIFSEdge = gtk_hbox_new(FALSE, 1); Interface.boxKeyframeAnimation = gtk_vbox_new(FALSE, 1); Interface.boxKeyframeAnimationButtons = gtk_hbox_new(FALSE, 1); Interface.boxKeyframeAnimationButtons2 = gtk_hbox_new(FALSE, 1); Interface.boxKeyframeAnimationEdits = gtk_hbox_new(FALSE, 1); Interface.boxBottomKeyframeAnimation = gtk_hbox_new(FALSE, 1); Interface.boxPalette = gtk_vbox_new(FALSE, 1); Interface.boxPaletteOffset = gtk_hbox_new(FALSE, 1); Interface.boxImageSaving = gtk_vbox_new(FALSE, 1); Interface.boxImageAutoSave = gtk_hbox_new(FALSE, 1); Interface.boxHybrid = gtk_vbox_new(FALSE, 1); Interface.boxStereoscopic = gtk_vbox_new(FALSE, 1); Interface.boxStereoParams = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxMainParams = gtk_vbox_new(FALSE, 1); Interface.boxMandelboxRotations = gtk_vbox_new(FALSE, 1); Interface.boxMandelboxColoring = gtk_vbox_new(FALSE, 1); Interface.boxMandelboxMainParams1 = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxMainParams2 = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxRotationMain = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxColor1 = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxColor2 = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxColor3 = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxOffset = gtk_hbox_new(FALSE, 1); Interface.boxViewDistance = gtk_hbox_new(FALSE, 1); Interface.boxVolumetricLight = gtk_vbox_new(FALSE, 1); Interface.boxVolumetricLightGeneral = gtk_hbox_new(FALSE, 1); Interface.boxVolumetricLightMain = gtk_hbox_new(FALSE, 1); Interface.boxVolumetricLightAux = gtk_hbox_new(FALSE, 1); Interface.boxMandelboxVary = gtk_hbox_new(FALSE, 1); Interface.boxVolumetricFog = gtk_hbox_new(FALSE, 1); Interface.boxPrimitives = gtk_vbox_new(FALSE, 1); Interface.boxPrimitivePlane = gtk_vbox_new(FALSE, 1); Interface.boxPrimitivePlane1 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitivePlane2 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveBox = gtk_vbox_new(FALSE, 1); Interface.boxPrimitiveBox1 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveBox2 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveInvertedBox = gtk_vbox_new(FALSE, 1); Interface.boxPrimitiveInvertedBox1 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveInvertedBox2 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveSphere = gtk_vbox_new(FALSE, 1); Interface.boxPrimitiveSphere1 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveSphere2 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveInvertedSphere = gtk_vbox_new(FALSE, 1); Interface.boxPrimitiveInvertedSphere1 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveInvertedSphere2 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveWater = gtk_vbox_new(FALSE, 1); Interface.boxPrimitiveWater1 = gtk_hbox_new(FALSE, 1); Interface.boxPrimitiveWater2 = gtk_hbox_new(FALSE, 1); Interface.boxMeasure = gtk_vbox_new(FALSE, 1); Interface.boxMeasure1 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClSettings = gtk_vbox_new(FALSE, 1); Interface.boxOpenClSwitches1 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClInformation = gtk_vbox_new(FALSE, 1); Interface.boxOpenClEngineSettingsV = gtk_vbox_new(FALSE, 1); Interface.boxOpenClEngineSettingsH1 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClEngineSettingsH2 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClEngineSettingsH3 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClEngineSettingsH4 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClCustomV1 = gtk_vbox_new(FALSE, 1); Interface.boxOpenClCustomH11 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClCustomH12 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClCustomH13 = gtk_hbox_new(FALSE, 1); Interface.boxOpenClCustomV2 = gtk_vbox_new(FALSE, 1); Interface.boxNetRenderClientV = gtk_vbox_new(FALSE, 1); Interface.boxNetRenderClientH1 = gtk_hbox_new(FALSE, 1); Interface.boxNetRenderServerV = gtk_vbox_new(FALSE, 1); Interface.boxNetRenderServerH1 = gtk_hbox_new(FALSE, 1); Interface.boxFakeLightsV = gtk_vbox_new(FALSE, 1); Interface.boxFakeLightsH1 = gtk_hbox_new(FALSE, 1); Interface.boxFakeLightsH2 = gtk_hbox_new(FALSE, 1); Interface.boxImageAdjustmentsV = gtk_vbox_new(FALSE, 1); Interface.boxImageAdjustmentsH1 = gtk_hbox_new(FALSE, 1); Interface.boxShadersSurfaceV = gtk_vbox_new(FALSE, 1); Interface.boxShadersSurfaceH1 = gtk_hbox_new(FALSE, 1); Interface.boxShadersSurfaceH2 = gtk_hbox_new(FALSE, 1); Interface.boxShadersSurfaceH3 = gtk_hbox_new(FALSE, 1); Interface.boxShadersSurfaceH4 = gtk_hbox_new(FALSE, 1); Interface.boxShadersVolumetricV = gtk_vbox_new(FALSE, 1); Interface.boxShadersVolumetricH1 = gtk_hbox_new(FALSE, 1); Interface.boxShadersVolumetricH2 = gtk_hbox_new(FALSE, 1); Interface.boxShadersVolumetricH3 = gtk_hbox_new(FALSE, 1); Interface.boxShadersVolumetricH4 = gtk_hbox_new(FALSE, 1); //tables Interface.tableLimits = gtk_table_new(2, 3, false); Interface.tableArrows = gtk_table_new(3, 3, false); Interface.tableArrows2 = gtk_table_new(3, 3, false); Interface.tableIFSParams = gtk_table_new(9, 9, false); Interface.tableHybridParams = gtk_table_new(5, 3, false); Interface.tableMandelboxRotations = gtk_table_new(5, 7, false); Interface.tableOpenCLCustom = gtk_table_new(5, 3, false); //frames Interface.frCoordinates = gtk_frame_new("Viewpoint coordinates"); Interface.fr3Dnavigator = gtk_frame_new("3D Navigator"); Interface.frFractalFormula = gtk_frame_new("Formula"); Interface.frFractalFoldingIntPow = gtk_frame_new("Folding Int Pow 2 formula"); Interface.frFractalFolding = gtk_frame_new("Folding"); Interface.frFractalRayMarching = gtk_frame_new("Ray-tracing parameters"); Interface.frLimits = gtk_frame_new("Limits"); Interface.frImage = gtk_frame_new("Image parameters"); Interface.frEffects = gtk_frame_new("Shading effects"); Interface.frColors = gtk_frame_new("Colours"); Interface.frLoadSave = gtk_frame_new("Settings"); Interface.frAnimation = gtk_frame_new("Flight animation"); Interface.frAnimationFrames = gtk_frame_new("Frames to render"); Interface.frPostFog = gtk_frame_new("Simple fog"); Interface.frPostSSAO = gtk_frame_new("Screen space ambient occlusion"); Interface.frPostDOF = gtk_frame_new("Depth of field"); Interface.frLightBallance = gtk_frame_new("Light brightness balance"); Interface.frLightsParameters = gtk_frame_new("Random lights parameters"); Interface.frLightsCommon = gtk_frame_new("Common parameters"); Interface.frPredefinedLights = gtk_frame_new("Predefined lights"); Interface.frMainLight = gtk_frame_new("Main light source (connected with camera)"); Interface.frIFSMain = gtk_frame_new("General IFS parameters"); Interface.frIFSParams = gtk_frame_new("Symmetry vectors"); Interface.frIFSDefaults = gtk_frame_new("Vector presets"); Interface.frKeyframeAnimation = gtk_frame_new("Keyframe animation"); Interface.frKeyframeAnimation2 = gtk_frame_new("Key-frames"); Interface.frPalette = gtk_frame_new("Colour palette (click on colour palette to edit)"); Interface.frImageSaving = gtk_frame_new("Image saving"); Interface.frHybrid = gtk_frame_new("Hybrid formula"); Interface.frStereo = gtk_frame_new("Stereoscopic rendering"); Interface.frMandelboxMainParams = gtk_frame_new("Main Mandelbox parameters"); Interface.frMandelboxRotations = gtk_frame_new("Rotation of Mandelbox folding planes"); Interface.frMandelboxColoring = gtk_frame_new("Mandelbox colouring parameters"); Interface.frVolumetricLight = gtk_frame_new("Volumetric light"); Interface.frMandelboxVary = gtk_frame_new("Mandelbox vary scale 4D"); Interface.frPrimitives = gtk_frame_new("Primitive shapes"); Interface.frPrimitivePlane = gtk_frame_new("Plane"); Interface.frPrimitiveBox = gtk_frame_new("Box"); Interface.frPrimitiveInvertedBox = gtk_frame_new("Inverted box"); Interface.frPrimitiveSphere = gtk_frame_new("Sphere"); Interface.frPrimitiveInvertedSphere = gtk_frame_new("Inverted sphere"); Interface.frPrimitiveWater = gtk_frame_new("Water"); Interface.frMeasure = gtk_frame_new("Coordinate measurement"); Interface.frOpenClSettings = gtk_frame_new("OpenCL kernel"); Interface.frOpenClInformation = gtk_frame_new("OpenCL information"); Interface.frOpenClEngineSettings = gtk_frame_new("OpenCL engine settings"); Interface.frNetRender = gtk_frame_new("Rendering via network"); Interface.frFakeLights = gtk_frame_new("Fake lights based on orbit traps"); Interface.frImageAdjustments = gtk_frame_new("Image adjustments"); Interface.frShadersSurface = gtk_frame_new("Surface"); Interface.frShadersVolumetric = gtk_frame_new("Volumetric"); Interface.frOpenClCustomSelection = gtk_frame_new("Custom formula management"); Interface.frOpenClCustomParams = gtk_frame_new("Custom parameters for custom formula"); //separators Interface.hSeparator1 = gtk_hseparator_new(); Interface.vSeparator1 = gtk_vseparator_new(); //buttons Interface.buRender = gtk_button_new_with_label("RENDER"); Interface.buStop = gtk_button_new_with_label("STOP"); Interface.buApplyImageAdjustments = gtk_button_new_with_label("Apply changes"); Interface.buSaveImage = gtk_button_new_with_label("Save JPG"); Interface.buSavePNG = gtk_button_new_with_label("Save PNG"); Interface.buSavePNG16 = gtk_button_new_with_label("Save PNG 16-bit"); Interface.buSavePNG16Alpha = gtk_button_new_with_label("Save PNG 16-bit + Alpha"); Interface.buFiles = gtk_button_new_with_label("Select file paths (output images, textures)"); Interface.buColorGlow1 = gtk_color_button_new(); Interface.buColorGlow2 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorGlow1), "Glow colour 1"); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorGlow2), "Glow colour 2"); Interface.buColorBackgroud1 = gtk_color_button_new(); Interface.buColorBackgroud2 = gtk_color_button_new(); Interface.buColorBackgroud3 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorBackgroud1), "Background colour 1"); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorBackgroud2), "Background colour 2"); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorBackgroud2), "Background colour 3"); Interface.buLoadSettings = gtk_button_new_with_label("Load Settings"); Interface.buSaveSettings = gtk_button_new_with_label("Save Settings"); Interface.buUp = gtk_button_new(); Interface.buDown = gtk_button_new(); Interface.buLeft = gtk_button_new(); Interface.buRight = gtk_button_new(); Interface.buRotateLeft = gtk_button_new(); Interface.buRotateRight = gtk_button_new(); Interface.buMoveUp = gtk_button_new(); Interface.buMoveDown = gtk_button_new(); Interface.buMoveLeft = gtk_button_new(); Interface.buMoveRight = gtk_button_new(); Interface.buForward = gtk_button_new_with_label("Forward"); Interface.buBackward = gtk_button_new_with_label("backward"); Interface.buInitNavigator = gtk_button_new_with_label("Reset view"); Interface.buAnimationRecordTrack = gtk_button_new_with_label("Record path"); Interface.buAnimationContinueRecord = gtk_button_new_with_label("Continue recording"); Interface.buAnimationRenderTrack = gtk_button_new_with_label("Render animation"); Interface.buColorFog = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorFog), "Fog colour"); Interface.buColorSSAO = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorSSAO), "Screen space ambient occlusion color"); Interface.buUpdateSSAO = gtk_button_new_with_label("Update image"); Interface.buUpdateDOF = gtk_button_new_with_label("Update DOF"); Interface.buColorAuxLightPre1 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre1), "Colour of Auxiliary light #1"); Interface.buColorAuxLightPre2 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre2), "Colour of Auxiliary light #2"); Interface.buColorAuxLightPre3 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre3), "Colour of Auxiliary light #3"); Interface.buColorAuxLightPre4 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorAuxLightPre4), "Colour of Auxiliary light #4"); Interface.buColorMainLight = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorMainLight), "Main light source colour"); Interface.buDistributeLights = gtk_button_new_with_label("Distribute / update lights"); Interface.buIFSNormalizeOffset = gtk_button_new_with_label("Normalize offset vector"); Interface.buIFSNormalizeVectors = gtk_button_new_with_label("Normalize symmetry vectors"); Interface.buAnimationRecordKey = gtk_button_new_with_label("Record key-frame"); Interface.buAnimationRenderFromKeys = gtk_button_new_with_label("Render from key-frames"); Interface.buUndo = gtk_button_new_with_label("Undo"); Interface.buRedo = gtk_button_new_with_label("Redo"); Interface.buBuddhabrot = gtk_button_new_with_label("Render Buddhabrot"); Interface.buRandomPalette = gtk_button_new_with_label("Random"); Interface.buGetPaletteFromImage = gtk_button_new_with_label("Get palette from JPG"); Interface.buTimeline = gtk_button_new_with_label("Timeline"); Interface.buIFSDefaultDodeca = gtk_button_new_with_label("Dodecahedron"); Interface.buIFSDefaultIcosa = gtk_button_new_with_label("Icosahedron"); Interface.buIFSDefaultOcta = gtk_button_new_with_label("Octahedron"); Interface.buIFSDefaultMengerSponge = gtk_button_new_with_label("Menger sponge"); Interface.buIFSReset = gtk_button_new_with_label("Reset vectors"); Interface.buAutoDEStep = gtk_button_new_with_label("LQ"); Interface.buAutoDEStepHQ = gtk_button_new_with_label("HQ"); Interface.buCopyToClipboard = gtk_button_new_with_label("Copy to clipboard"); Interface.buGetFromClipboard = gtk_button_new_with_label("Paste from clipboard"); Interface.buLoadExample = gtk_button_new_with_label("Load example"); Interface.buColorFog1 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorFog1), "Fog colour 1"); Interface.buColorFog2 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorFog2), "Fog colour 2"); Interface.buColorFog3 = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorFog3), "Fog colour 3"); Interface.buColorPrimitivePlane = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorPrimitivePlane), "Plane colour"); Interface.buColorPrimitiveBox = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorPrimitiveBox), "Box colour"); Interface.buColorPrimitiveInvertedBox = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorPrimitiveInvertedBox), "Inverted box colour"); Interface.buColorPrimitiveSphere = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorPrimitiveSphere), "Sphere colour"); Interface.buColorPrimitiveInvertedSphere = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorPrimitiveInvertedSphere), "Inverted sphere colour"); Interface.buColorPrimitiveWater = gtk_color_button_new(); gtk_color_button_set_title(GTK_COLOR_BUTTON(Interface.buColorPrimitiveWater), "Water colour"); Interface.buAutoFog = gtk_button_new_with_label("Auto fog"); Interface.buMeasureActivation = gtk_button_new_with_label("Activate measurement"); Interface.buSaveAllImageLayers = gtk_button_new_with_label("Save all layers"); Interface.buOpenCLNewFormula = gtk_button_new_with_label("New"); Interface.buOpenCLEditFormula = gtk_button_new_with_label("Edit formula"); Interface.buOpenCLEditFormulaInit = gtk_button_new_with_label("Edit formula Init"); Interface.buOpenCLDeleteFormula = gtk_button_new_with_label("Delete"); Interface.buOpenCLRecompile = gtk_button_new_with_label("Recompile"); Interface.buConvertPathToKeyframes = gtk_button_new_with_label("Convert flight path to keyframes"); //edit Interface.edit_va = gtk_entry_new(); Interface.edit_vb = gtk_entry_new(); Interface.edit_vc = gtk_entry_new(); Interface.edit_julia_a = gtk_entry_new(); Interface.edit_julia_b = gtk_entry_new(); Interface.edit_julia_c = gtk_entry_new(); Interface.edit_amin = gtk_entry_new(); Interface.edit_amax = gtk_entry_new(); Interface.edit_bmin = gtk_entry_new(); Interface.edit_bmax = gtk_entry_new(); Interface.edit_cmin = gtk_entry_new(); Interface.edit_cmax = gtk_entry_new(); Interface.edit_alfa = gtk_entry_new(); Interface.edit_beta = gtk_entry_new(); Interface.edit_gammaAngle = gtk_entry_new(); Interface.edit_zoom = gtk_entry_new(); Interface.edit_persp = gtk_entry_new(); Interface.edit_maxN = gtk_entry_new(); Interface.edit_minN = gtk_entry_new(); Interface.edit_power = gtk_entry_new(); Interface.edit_FoldingIntPowFoldingFactor = gtk_entry_new(); Interface.edit_FoldingIntPowZFactor = gtk_entry_new(); Interface.edit_DE_thresh = gtk_entry_new(); Interface.edit_DE_stepFactor = gtk_entry_new(); Interface.edit_roughness = gtk_entry_new(); Interface.edit_imageWidth = gtk_entry_new(); Interface.edit_imageHeight = gtk_entry_new(); Interface.edit_ambient = gtk_entry_new(); Interface.edit_ambient_occlusion = gtk_entry_new(); Interface.edit_brightness = gtk_entry_new(); Interface.edit_gamma = gtk_entry_new(); Interface.edit_glow = gtk_entry_new(); Interface.edit_reflect = gtk_entry_new(); Interface.edit_shading = gtk_entry_new(); Interface.edit_shadows = gtk_entry_new(); Interface.edit_specular = gtk_entry_new(); Interface.edit_AmbientOcclusionQuality = gtk_entry_new(); Interface.edit_step_forward = gtk_entry_new(); Interface.edit_step_rotation = gtk_entry_new(); Interface.edit_mouse_click_distance = gtk_entry_new(); Interface.edit_animationDESpeed = gtk_entry_new(); Interface.edit_color_seed = gtk_entry_new(); Interface.edit_color_speed = gtk_entry_new(); Interface.edit_colour_saturation = gtk_entry_new(); Interface.edit_tglad_folding_1 = gtk_entry_new(); Interface.edit_tglad_folding_2 = gtk_entry_new(); Interface.edit_spherical_folding_1 = gtk_entry_new(); Interface.edit_spherical_folding_2 = gtk_entry_new(); Interface.edit_mainLightIntensity = gtk_entry_new(); Interface.edit_auxLightIntensity = gtk_entry_new(); Interface.edit_auxLightNumber = gtk_entry_new(); Interface.edit_auxLightMaxDist = gtk_entry_new(); Interface.edit_auxLightRandomSeed = gtk_entry_new(); Interface.edit_auxLightDistributionRadius = gtk_entry_new(); Interface.edit_auxLightPre1x = gtk_entry_new(); Interface.edit_auxLightPre1y = gtk_entry_new(); Interface.edit_auxLightPre1z = gtk_entry_new(); Interface.edit_auxLightPre1intensity = gtk_entry_new(); Interface.edit_auxLightPre2x = gtk_entry_new(); Interface.edit_auxLightPre2y = gtk_entry_new(); Interface.edit_auxLightPre2z = gtk_entry_new(); Interface.edit_auxLightPre2intensity = gtk_entry_new(); Interface.edit_auxLightPre3x = gtk_entry_new(); Interface.edit_auxLightPre3y = gtk_entry_new(); Interface.edit_auxLightPre3z = gtk_entry_new(); Interface.edit_auxLightPre3intensity = gtk_entry_new(); Interface.edit_auxLightPre4x = gtk_entry_new(); Interface.edit_auxLightPre4y = gtk_entry_new(); Interface.edit_auxLightPre4z = gtk_entry_new(); Interface.edit_auxLightPre4intensity = gtk_entry_new(); Interface.edit_mainLightAlfa = gtk_entry_new(); Interface.edit_mainLightBeta = gtk_entry_new(); Interface.edit_auxLightVisibility = gtk_entry_new(); Interface.edit_auxLightPlacementDistance = gtk_entry_new(); Interface.edit_auxLightRandomCentreX = gtk_entry_new(); Interface.edit_auxLightRandomCentreY = gtk_entry_new(); Interface.edit_auxLightRandomCentreZ = gtk_entry_new(); Interface.edit_IFSScale = gtk_entry_new(); Interface.edit_IFSAlfa = gtk_entry_new(); Interface.edit_IFSBeta = gtk_entry_new(); Interface.edit_IFSGamma = gtk_entry_new(); Interface.edit_IFSOffsetX = gtk_entry_new(); Interface.edit_IFSOffsetY = gtk_entry_new(); Interface.edit_IFSOffsetZ = gtk_entry_new(); Interface.edit_IFSEdgeX = gtk_entry_new(); Interface.edit_IFSEdgeY = gtk_entry_new(); Interface.edit_IFSEdgeZ = gtk_entry_new(); Interface.edit_animationFramesPerKey = gtk_entry_new(); Interface.edit_animationStartFrame = gtk_entry_new(); Interface.edit_animationEndFrame = gtk_entry_new(); Interface.edit_contrast = gtk_entry_new(); for (int i = 0; i < HYBRID_COUNT; ++i) { Interface.edit_hybridIter[i] = gtk_entry_new(); Interface.edit_hybridPower[i] = gtk_entry_new(); } Interface.edit_NavigatorAbsoluteDistance = gtk_entry_new(); Interface.edit_stereoDistance = gtk_entry_new(); Interface.edit_mandelboxScale = gtk_entry_new(); Interface.edit_mandelboxFoldingLimit = gtk_entry_new(); Interface.edit_mandelboxFoldingValue = gtk_entry_new(); Interface.edit_mandelboxSpFoldingFixedRadius = gtk_entry_new(); Interface.edit_mandelboxSpFoldingMinRadius = gtk_entry_new(); Interface.edit_mandelboxSharpness = gtk_entry_new(); Interface.edit_mandelboxOffsetX= gtk_entry_new(); Interface.edit_mandelboxOffsetY= gtk_entry_new(); Interface.edit_mandelboxOffsetZ= gtk_entry_new(); Interface.edit_mandelboxSolid = gtk_entry_new(); Interface.edit_mandelboxMelt = gtk_entry_new(); for (int component = 0; component < 3; ++component) Interface.edit_mandelboxRotationMain[component] = gtk_entry_new(); for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) for (int axis = 0; axis < 3; ++axis) for (int component = 0; component < 3; ++component) { Interface.edit_mandelboxRotation[fold][axis][component] = gtk_entry_new(); gtk_entry_set_width_chars(GTK_ENTRY(Interface.edit_mandelboxRotation[fold][axis][component]), 5); } Interface.edit_mandelboxColorFactorR = gtk_entry_new(); Interface.edit_mandelboxColorFactorSp1 = gtk_entry_new(); Interface.edit_mandelboxColorFactorSp2 = gtk_entry_new(); Interface.edit_mandelboxColorFactorX = gtk_entry_new(); Interface.edit_mandelboxColorFactorY = gtk_entry_new(); Interface.edit_mandelboxColorFactorZ = gtk_entry_new(); Interface.edit_viewMinDistance = gtk_entry_new(); Interface.edit_viewMaxDistance = gtk_entry_new(); Interface.edit_FractalConstantFactor = gtk_entry_new(); Interface.edit_volumetricLightMainIntensity = gtk_entry_new(); Interface.edit_volumetricLightAux1Intensity = gtk_entry_new(); Interface.edit_volumetricLightAux2Intensity = gtk_entry_new(); Interface.edit_volumetricLightAux3Intensity = gtk_entry_new(); Interface.edit_volumetricLightAux4Intensity = gtk_entry_new(); Interface.edit_reflectionsMax = gtk_entry_new(); Interface.edit_mandelboxVaryFold = gtk_entry_new(); Interface.edit_mandelboxVaryMinR = gtk_entry_new(); Interface.edit_mandelboxVaryRPower = gtk_entry_new(); Interface.edit_mandelboxVaryScale = gtk_entry_new(); Interface.edit_mandelboxVaryWAdd = gtk_entry_new(); Interface.edit_cadd = gtk_entry_new(); Interface.edit_volumetricFogDensity = gtk_entry_new(); Interface.edit_volumetricFogColorDistance = gtk_entry_new(); Interface.edit_volumetricFogColorDistance2 = gtk_entry_new(); Interface.edit_volumetricFogDistanceFact = gtk_entry_new(); Interface.edit_fastAoTune = gtk_entry_new(); Interface.edit_primitivePlaneCentreX = gtk_entry_new(); Interface.edit_primitivePlaneCentreY = gtk_entry_new(); Interface.edit_primitivePlaneCentreZ = gtk_entry_new(); Interface.edit_primitivePlaneNormalX = gtk_entry_new(); Interface.edit_primitivePlaneNormalY = gtk_entry_new(); Interface.edit_primitivePlaneNormalZ = gtk_entry_new(); Interface.edit_primitivePlaneReflect = gtk_entry_new(); Interface.edit_primitiveBoxCentreX = gtk_entry_new(); Interface.edit_primitiveBoxCentreY = gtk_entry_new(); Interface.edit_primitiveBoxCentreZ = gtk_entry_new(); Interface.edit_primitiveBoxSizeX = gtk_entry_new(); Interface.edit_primitiveBoxSizeY = gtk_entry_new(); Interface.edit_primitiveBoxSizeZ = gtk_entry_new(); Interface.edit_primitiveBoxReflect = gtk_entry_new(); Interface.edit_primitiveInvertedBoxCentreX = gtk_entry_new(); Interface.edit_primitiveInvertedBoxCentreY = gtk_entry_new(); Interface.edit_primitiveInvertedBoxCentreZ = gtk_entry_new(); Interface.edit_primitiveInvertedBoxSizeX = gtk_entry_new(); Interface.edit_primitiveInvertedBoxSizeY = gtk_entry_new(); Interface.edit_primitiveInvertedBoxSizeZ = gtk_entry_new(); Interface.edit_primitiveInvertedBoxReflect = gtk_entry_new(); Interface.edit_primitiveSphereCentreX = gtk_entry_new(); Interface.edit_primitiveSphereCentreY = gtk_entry_new(); Interface.edit_primitiveSphereCentreZ = gtk_entry_new(); Interface.edit_primitiveSphereRadius = gtk_entry_new(); Interface.edit_primitiveSphereReflect = gtk_entry_new(); Interface.edit_primitiveInvertedSphereCentreX = gtk_entry_new(); Interface.edit_primitiveInvertedSphereCentreY = gtk_entry_new(); Interface.edit_primitiveInvertedSphereCentreZ = gtk_entry_new(); Interface.edit_primitiveInvertedSphereRadius = gtk_entry_new(); Interface.edit_primitiveInvertedSphereReflect = gtk_entry_new(); Interface.edit_primitiveWaterHeight = gtk_entry_new(); Interface.edit_primitiveWaterAmplitude = gtk_entry_new(); Interface.edit_primitiveWaterLength = gtk_entry_new(); Interface.edit_primitiveWaterRotation = gtk_entry_new(); Interface.edit_primitiveWaterIterations = gtk_entry_new(); Interface.edit_primitiveWaterReflect = gtk_entry_new(); Interface.edit_primitiveWaterAnimSpeed = gtk_entry_new(); Interface.edit_measureX = gtk_entry_new(); Interface.edit_measureY = gtk_entry_new(); Interface.edit_measureZ = gtk_entry_new(); Interface.edit_tiles = gtk_entry_new(); Interface.edit_iterFogOpacity = gtk_entry_new(); Interface.edit_iterFogOpacityTrim = gtk_entry_new(); Interface.edit_OpenCLPixelsPerJob = gtk_entry_new(); Interface.edit_OpenCLProcessingCycleTime = gtk_entry_new(); Interface.edit_OpenCLMaxMem = gtk_entry_new(); Interface.edit_OpenCLTextEditor = gtk_entry_new(); Interface.edit_OpenCLDeltaDEStep = gtk_entry_new(); Interface.edit_netRenderClientName = gtk_entry_new(); Interface.edit_netRenderClientPort = gtk_entry_new(); Interface.edit_netRenderServerPort = gtk_entry_new(); Interface.edit_fakeLightsOrbitTrapX = gtk_entry_new(); Interface.edit_fakeLightsOrbitTrapY = gtk_entry_new(); Interface.edit_fakeLightsOrbitTrapZ = gtk_entry_new(); Interface.edit_fakeLightsMinIter = gtk_entry_new(); Interface.edit_fakeLightsMaxIter = gtk_entry_new(); Interface.edit_fakeLightsIntensity = gtk_entry_new(); Interface.edit_fakeLightsVisibility = gtk_entry_new(); Interface.edit_fakeLightsVisibilitySize = gtk_entry_new(); Interface.edit_shadowConeAngle = gtk_entry_new(); for(int i=0; i<15; i++) Interface.edit_customParameters[i] = gtk_entry_new(); //combo // fract type Interface.comboFractType = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Mandelbulb"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Mandelbulb - Daniel White's"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Polynomic power 2"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Polynomic power 2 - minus z"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Xenodreambuie's formula"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Hypercomplex"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Quaternion"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Menger sponge"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Tglad's formula (Mandelbox)"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Kaleidoscopic IFS"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Modified Mandelbulb 1"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Modified Mandelbulb 2"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Modified Mandelbulb 3"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "FoldingIntPower2"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Smooth Mandelbox"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Mandelbox vary scale 4D"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Aexion"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Benesi"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Bristorbrot"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Hybrid"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboFractType), "Generalized Mandelbox Fold"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboFractType), 1); //image format Interface.comboImageFormat = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageFormat), "JPEG"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageFormat), "PNG 8-bit"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageFormat), "PNG 16-bit"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageFormat), "PNG 16-bit with alpha channel"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboImageFormat), 0); for (int i = 0; i < HYBRID_COUNT; ++i) { Interface.comboHybridFormula[i] = gtk_combo_box_new_text(); AddComboTextsFractalFormula(GTK_COMBO_BOX(Interface.comboHybridFormula[i])); } Interface.comboPerspectiveType = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboPerspectiveType), "Three-point perspective"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboPerspectiveType), "Fish eye"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboPerspectiveType), "Equirectangular projection"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboPerspectiveType), "Fish eye 180 degree cut"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboPerspectiveType), 0); Interface.comboImageProportion = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageProportion), "Free"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageProportion), "1:1"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageProportion), "5:4"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageProportion), "4:3"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageProportion), "16:10"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboImageProportion), "16:9"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboImageProportion), 0); Interface.comboGeneralizedFoldBoxType = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Tetrahedron"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Cube"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Octahedron"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Dodecahedron"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Octahedron/Cube"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Icosahedron"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Box 6"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), "Box 5"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboGeneralizedFoldBoxType), 0); Interface.comboOpenCLEngine = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLEngine), "Fast: no effects"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLEngine), "Normal: shadows, glow, fast AO"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLEngine), "Full: all shaders"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLEngine), "No DE"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLEngine), 0); Interface.comboOpenCLDeviceIndex = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), "0"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), "1"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), "2"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), "3"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), 0); Interface.comboOpenCLPlatformIndex = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), "0"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), "1"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), "2"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), "3"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), 0); Interface.comboOpenCLGPUCPU = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLGPUCPU), "GPU"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLGPUCPU), "CPU"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLGPUCPU), 0); Interface.comboOpenCLCustomFormulas = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), "Enable OpenCL to get list"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), 0); Interface.comboOpenCLDEMode = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDEMode), "Calculated DE in formula"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDEMode), "Delta DE"); //gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDEMode), "no DE"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDEMode), 0); Interface.comboOpenCLDOFMode = gtk_combo_box_new_text(); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDOFMode), "Post effect"); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLDOFMode), "Monte Carlo"); gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDEMode), 0); //progress bar Interface.progressBar = gtk_progress_bar_new(); //checkboxes Interface.checkShadow = gtk_check_button_new_with_label("Shadows"); Interface.checkAmbientOcclusion = gtk_check_button_new_with_label("Ambient occlusion"); Interface.checkFastAmbientOcclusion = gtk_check_button_new_with_label("AO fast mode"); Interface.checkIterThresh = gtk_check_button_new_with_label("MaxIter mode"); Interface.checkJulia = gtk_check_button_new_with_label("Julia mode"); Interface.checkSlowShading = gtk_check_button_new_with_label("Not DE Shading mode (slow)"); Interface.checkLimits = gtk_check_button_new_with_label("Enable limits"); Interface.checkBitmapBackground = gtk_check_button_new_with_label("Textured background"); Interface.checkBitmapBackgroundFulldome = gtk_check_button_new_with_label("Fulldome background"); Interface.checkColoring = gtk_check_button_new_with_label("Coloured surface"); Interface.checkTgladMode = gtk_check_button_new_with_label("Tglad's folding mode "); Interface.checkSphericalFoldingMode = gtk_check_button_new_with_label("Spherical folding mode "); Interface.checkIFSFoldingMode = gtk_check_button_new_with_label("Kaleidoscopic IFS folding mode (parameters on Kaleidoscopic IFS tab)"); Interface.checkFogEnabled = gtk_check_button_new_with_label("Enable fog "); Interface.checkSSAOEnabled = gtk_check_button_new_with_label("Screen space ambient occlusion enable "); Interface.checkDOFEnabled = gtk_check_button_new_with_label("Depth of field enable "); Interface.checkZoomClickEnable = gtk_check_button_new_with_label("Enable zoom by mouse click"); Interface.checkAuxLightPre1Enabled = gtk_check_button_new_with_label("Enable"); Interface.checkAuxLightPre2Enabled = gtk_check_button_new_with_label("Enable"); Interface.checkAuxLightPre3Enabled = gtk_check_button_new_with_label("Enable"); Interface.checkAuxLightPre4Enabled = gtk_check_button_new_with_label("Enable"); Interface.checkIFSAbsX = gtk_check_button_new_with_label("abs(x)"); Interface.checkIFSAbsY = gtk_check_button_new_with_label("abs(y)"); Interface.checkIFSAbsZ = gtk_check_button_new_with_label("abs(z)"); Interface.checkIFSMengerSponge = gtk_check_button_new_with_label("Menger Sponge"); Interface.checkAutoSaveImage = gtk_check_button_new_with_label("Auto-save"); Interface.checkHybridCyclic = gtk_check_button_new_with_label("Cyclic loop"); Interface.checkNavigatorAbsoluteDistance = gtk_check_button_new_with_label("Absolute distance mode"); Interface.checkNavigatorGoToSurface = gtk_check_button_new_with_label("Go close to indicated surface"); Interface.checkStraightRotation = gtk_check_button_new_with_label("Rotation without\nusing gamma\nangle"); Interface.checkStereoEnabled = gtk_check_button_new_with_label("Enable stereoscopic rendering"); Interface.checkMandelboxRotationsEnable = gtk_check_button_new_with_label("Enable rotation of each folding plane"); Interface.checkInteriorMode = gtk_check_button_new_with_label("Interior mode"); Interface.checkDELinearMode = gtk_check_button_new_with_label("Linear DE mode"); Interface.checkConstantDEThreshold = gtk_check_button_new_with_label("Const. DE threshold"); Interface.checkVolumetricLightMainEnabled = gtk_check_button_new_with_label("Enable"); Interface.checkVolumetricLightAux1Enabled = gtk_check_button_new_with_label(""); Interface.checkVolumetricLightAux2Enabled = gtk_check_button_new_with_label(""); Interface.checkVolumetricLightAux3Enabled = gtk_check_button_new_with_label(""); Interface.checkVolumetricLightAux4Enabled = gtk_check_button_new_with_label(""); Interface.checkPenetratingLights = gtk_check_button_new_with_label("Penetrating lights"); Interface.checkRaytracedReflections = gtk_check_button_new_with_label("Ray-traced reflections"); Interface.checkPrimitivePlaneEnabled = gtk_check_button_new_with_label("Enabled"); Interface.checkPrimitiveOnlyPlane = gtk_check_button_new_with_label("Only plane (2D mode)"); Interface.checkPrimitiveBoxEnabled = gtk_check_button_new_with_label("Enabled"); Interface.checkPrimitiveInvertedBoxEnabled = gtk_check_button_new_with_label("Enabled"); Interface.checkPrimitiveSphereEnabled = gtk_check_button_new_with_label("Enabled"); Interface.checkPrimitiveInvertedSphereEnabled = gtk_check_button_new_with_label("Enabled"); Interface.checkPrimitiveWaterEnabled = gtk_check_button_new_with_label("Enabled"); Interface.checkOpenClEnable = gtk_check_button_new_with_label("OpenCL Enable"); Interface.checkOpenClCustomEnable = gtk_check_button_new_with_label("Use custom formula"); Interface.checkIterFogEnable = gtk_check_button_new_with_label("Iteration fog"); Interface.checkNetRenderClientEnable = gtk_check_button_new_with_label("Client enable"); Interface.checkNetRenderServerEnable = gtk_check_button_new_with_label("Server enable"); Interface.checkNetRenderServerScan = gtk_check_button_new_with_label("Scan for clients"); Interface.checkFakeLightsEnabled = gtk_check_button_new_with_label("Enable fake lights"); Interface.checkHDR = gtk_check_button_new_with_label("HDR"); //pixamps Interface.pixmap_up = gtk_image_new_from_file((string(sharedDir)+"icons/go-up.png").c_str()); Interface.pixmap_down = gtk_image_new_from_file((string(sharedDir)+"icons/go-down.png").c_str()); Interface.pixmap_left = gtk_image_new_from_file((string(sharedDir)+"icons/go-previous.png").c_str()); Interface.pixmap_right = gtk_image_new_from_file((string(sharedDir)+"icons/go-next.png").c_str()); Interface.pixmap_rotate_left = gtk_image_new_from_file((string(sharedDir)+"icons/object-rotate-left.png").c_str()); Interface.pixmap_rotate_right = gtk_image_new_from_file((string(sharedDir)+"icons/object-rotate-right.png").c_str()); Interface.pixmap_move_up = gtk_image_new_from_file((string(sharedDir)+"icons/go-up.png").c_str()); Interface.pixmap_move_down = gtk_image_new_from_file((string(sharedDir)+"icons/go-down.png").c_str()); Interface.pixmap_move_left = gtk_image_new_from_file((string(sharedDir)+"icons/go-previous.png").c_str()); Interface.pixmap_move_right = gtk_image_new_from_file((string(sharedDir)+"icons/go-next.png").c_str()); //labels Interface.label_animationFrame = gtk_label_new("Frame:"); Interface.label_animationDistance = gtk_label_new("Estimated distance to fractal:"); Interface.label_animationSpeed = gtk_label_new("Flight speed:"); Interface.label_keyframeInfo = gtk_label_new("Frame: ,keyframe: "); Interface.label_fog_visibility = gtk_label_new("Visibility:"); Interface.label_SSAO_quality = gtk_label_new("Quality:"); Interface.label_DOF_focus = gtk_label_new("Focus:"); Interface.label_DOF_radius = gtk_label_new("Radius:"); Interface.label_auxLightPre1 = gtk_label_new("Light #1:"); Interface.label_auxLightPre2 = gtk_label_new("Light #2:"); Interface.label_auxLightPre3 = gtk_label_new("Light #3:"); Interface.label_auxLightPre4 = gtk_label_new("Light #4:"); Interface.label_IFSx = gtk_label_new("symmetry x"); Interface.label_IFSy = gtk_label_new("symmetry y"); Interface.label_IFSz = gtk_label_new("symmetry z"); Interface.label_IFSalfa = gtk_label_new("alpha"); Interface.label_IFSbeta = gtk_label_new("beta"); Interface.label_IFSgamma = gtk_label_new("gamma"); Interface.label_IFSdistance = gtk_label_new("distance"); Interface.label_IFSintensity = gtk_label_new("intensity"); Interface.label_IFSenabled = gtk_label_new("enabled"); Interface.label_paletteOffset = gtk_label_new("offset:"); Interface.label_DE_threshold = gtk_label_new("Detail level:"); Interface.label_measureDistance = gtk_label_new("Distance from last point:"); Interface.label_OpenClComputingUnits = gtk_label_new(""); Interface.label_OpenClMaxClock = gtk_label_new(""); Interface.label_OpenClMaxWorkgroup = gtk_label_new(""); Interface.label_OpenClMemorySize = gtk_label_new(""); Interface.label_OpenClPlatformBy = gtk_label_new(""); Interface.label_OpenClStatus = gtk_label_new(""); Interface.label_OpenClWorkgroupSize = gtk_label_new(""); Interface.label_serverStatus = gtk_label_new("status: not enabled"); Interface.label_clientStatus = gtk_label_new("status: not enabled"); Interface.label_sliderFog = gtk_label_new("visibility = "); Interface.label_sliderDOF = gtk_label_new("fog focus distance = "); for (int i = 1; i <= HYBRID_COUNT; ++i) Interface.label_HybridFormula[i-1] = gtk_label_new(g_strdup_printf("Formula #%d:", i)); Interface.label_NavigatorEstimatedDistance = gtk_label_new("Estimated distance to the surface:"); Interface.label_about = gtk_label_new("Mandelbulber "MANDELBULBER_VERSION_STR"\n" "author: Krzysztof Marczak\n" "Licence: GNU GPL v3\n" "www: www.mandelbulber.com\n" "thanks to: Knighty, Makemeunsee, Marius Schilder, Ryan Hitchman, Jeff Epler, Martin Reinecke, Quazgaa" ); //sliders Interface.adjustmentFogDepth = gtk_adjustment_new(30.0, 0.1, 200.0, 0.1, 10.0, 0.1); Interface.sliderFogDepth = gtk_hscale_new(GTK_ADJUSTMENT(Interface.adjustmentFogDepth)); Interface.adjustmentSSAOQuality = gtk_adjustment_new(20, 1, 100, 1, 10, 1); Interface.sliderSSAOQuality = gtk_hscale_new(GTK_ADJUSTMENT(Interface.adjustmentSSAOQuality)); Interface.adjustmentDOFFocus = gtk_adjustment_new(20.0, 0.1, 200.0, 0.1, 10.0, 0.1); Interface.sliderDOFFocus = gtk_hscale_new(GTK_ADJUSTMENT(Interface.adjustmentDOFFocus)); Interface.adjustmentDOFRadius = gtk_adjustment_new(10.0, 0.1, 100.0, 0.1, 10.0, 0.1); Interface.sliderDOFRadius = gtk_hscale_new(GTK_ADJUSTMENT(Interface.adjustmentDOFRadius)); Interface.adjustmentPaletteOffset = gtk_adjustment_new(0, 0, 256.0, 0.1, 10.0, 0.1); Interface.sliderPaletteOffset = gtk_hscale_new(GTK_ADJUSTMENT(Interface.adjustmentPaletteOffset)); //colour palette dareaPalette = gtk_drawing_area_new(); gtk_widget_set_size_request(dareaPalette, 640, 30); //connected signals CONNECT_SIGNAL_CLICKED(Interface.buRender, StartRendering); CONNECT_SIGNAL_CLICKED(Interface.buStop, StopRendering); CONNECT_SIGNAL_CLICKED(Interface.buApplyImageAdjustments, PressedApplyBrigtness); CONNECT_SIGNAL_CLICKED(Interface.buSaveImage, PressedSaveImage); CONNECT_SIGNAL_CLICKED(Interface.buSavePNG, PressedSaveImagePNG); CONNECT_SIGNAL_CLICKED(Interface.buSavePNG16, PressedSaveImagePNG16); CONNECT_SIGNAL_CLICKED(Interface.buSavePNG16Alpha, PressedSaveImagePNG16Alpha); CONNECT_SIGNAL_CLICKED(Interface.buLoadSettings, PressedLoadSettings); CONNECT_SIGNAL_CLICKED(Interface.buSaveSettings, PressedSaveSettings); CONNECT_SIGNAL_CLICKED(Interface.buFiles, CreateFilesDialog); CONNECT_SIGNAL_CLICKED(Interface.buUp, PressedNavigatorUp); CONNECT_SIGNAL_CLICKED(Interface.buDown, PressedNavigatorDown); CONNECT_SIGNAL_CLICKED(Interface.buLeft, PressedNavigatorLeft); CONNECT_SIGNAL_CLICKED(Interface.buRight, PressedNavigatorRight); CONNECT_SIGNAL_CLICKED(Interface.buRotateLeft, PressedNavigatorRotateLeft); CONNECT_SIGNAL_CLICKED(Interface.buRotateRight, PressedNavigatorRotateRight); CONNECT_SIGNAL_CLICKED(Interface.buMoveUp, PressedNavigatorMoveUp); CONNECT_SIGNAL_CLICKED(Interface.buMoveDown, PressedNavigatorMoveDown); CONNECT_SIGNAL_CLICKED(Interface.buMoveLeft, PressedNavigatorMoveLeft); CONNECT_SIGNAL_CLICKED(Interface.buMoveRight, PressedNavigatorMoveRight); CONNECT_SIGNAL_CLICKED(Interface.buForward, PressedNavigatorForward); CONNECT_SIGNAL_CLICKED(Interface.buBackward, PressedNavigatorBackward); CONNECT_SIGNAL_CLICKED(Interface.buInitNavigator, PressedNavigatorInit); CONNECT_SIGNAL_CLICKED(Interface.buAnimationRecordTrack, PressedAnimationRecord); CONNECT_SIGNAL_CLICKED(Interface.buAnimationContinueRecord, PressedAnimationContinueRecording); CONNECT_SIGNAL_CLICKED(Interface.buAnimationRenderTrack, PressedAnimationRender); CONNECT_SIGNAL(Interface.adjustmentFogDepth, ChangedSliderFog, "value-changed"); CONNECT_SIGNAL(Interface.adjustmentDOFFocus, ChangedSliderDOF, "value-changed"); CONNECT_SIGNAL_CLICKED(Interface.checkFogEnabled, ChangedSliderFog); CONNECT_SIGNAL_CLICKED(Interface.buUpdateSSAO, PressedSSAOUpdate); CONNECT_SIGNAL_CLICKED(Interface.buUpdateDOF, PressedDOFUpdate); CONNECT_SIGNAL_CLICKED(Interface.buDistributeLights, PressedDistributeLights); CONNECT_SIGNAL_CLICKED(Interface.buIFSNormalizeOffset, PressedIFSNormalizeOffset); CONNECT_SIGNAL_CLICKED(Interface.buIFSNormalizeVectors, PressedIFSNormalizeVectors); CONNECT_SIGNAL_CLICKED(Interface.buAnimationRecordKey, PressedRecordKeyframe); CONNECT_SIGNAL_CLICKED(Interface.buAnimationRenderFromKeys, PressedKeyframeAnimationRender); CONNECT_SIGNAL_CLICKED(Interface.buUndo, PressedUndo); CONNECT_SIGNAL_CLICKED(Interface.buRedo, PressedRedo); CONNECT_SIGNAL_CLICKED(Interface.buBuddhabrot, PressedBuddhabrot); CONNECT_SIGNAL(Interface.adjustmentPaletteOffset, ChangedSliderPaletteOffset, "value-changed"); CONNECT_SIGNAL_CLICKED(Interface.buRandomPalette, PressedRandomPalette); CONNECT_SIGNAL_CLICKED(Interface.buGetPaletteFromImage, PressedGetPaletteFromImage); CONNECT_SIGNAL_CLICKED(Interface.buTimeline, PressedTimeline); CONNECT_SIGNAL_CLICKED(Interface.buIFSDefaultDodeca, PressedIFSDefaultDodeca); CONNECT_SIGNAL_CLICKED(Interface.buIFSDefaultIcosa, PressedIFSDefaultIcosa); CONNECT_SIGNAL_CLICKED(Interface.buIFSDefaultOcta, PressedIFSDefaultOcta); CONNECT_SIGNAL_CLICKED(Interface.buIFSDefaultMengerSponge, PressedIFSDefaultMengerSponge); CONNECT_SIGNAL_CLICKED(Interface.buIFSReset, PressedIFSReset); CONNECT_SIGNAL(renderWindow.comboImageScale, ChangedComboScale, "changed"); CONNECT_SIGNAL(Interface.comboFractType, ChangedComboFormula, "changed"); CONNECT_SIGNAL_CLICKED(Interface.checkTgladMode, ChangedTgladFoldingMode); CONNECT_SIGNAL_CLICKED(Interface.checkJulia, ChangedJulia); CONNECT_SIGNAL_CLICKED(Interface.checkSphericalFoldingMode, ChangedSphericalFoldingMode); CONNECT_SIGNAL_CLICKED(Interface.checkIFSFoldingMode, ChangedIFSFoldingMode); CONNECT_SIGNAL_CLICKED(Interface.checkLimits, ChangedLimits); CONNECT_SIGNAL_CLICKED(Interface.checkAmbientOcclusion, ChangedAmbientOcclusion); CONNECT_SIGNAL_CLICKED(Interface.checkFastAmbientOcclusion, ChangedFastAmbientOcclusion); CONNECT_SIGNAL_CLICKED(Interface.checkMandelboxRotationsEnable, ChangedMandelboxRotations); CONNECT_SIGNAL_CLICKED(Interface.buAutoDEStep, PressedAutoDEStep); CONNECT_SIGNAL_CLICKED(Interface.buAutoDEStepHQ, PressedAutoDEStepHQ); CONNECT_SIGNAL_CLICKED(Interface.checkConstantDEThreshold, ChangedConstantDEThreshold); CONNECT_SIGNAL(Interface.comboImageProportion, ChangedImageProportion, "changed"); CONNECT_SIGNAL(Interface.edit_imageHeight, ChangedImageProportion, "activate"); CONNECT_SIGNAL_CLICKED(Interface.buCopyToClipboard, PressedCopyToClipboard); CONNECT_SIGNAL_CLICKED(Interface.buGetFromClipboard, PressedPasteFromClipboard); CONNECT_SIGNAL_CLICKED(Interface.buLoadExample, PressedLoadExample); CONNECT_SIGNAL_CLICKED(Interface.buAutoFog, PressedAutoFog); CONNECT_SIGNAL_CLICKED(Interface.buMeasureActivation, PressedMeasureActivation); CONNECT_SIGNAL_CLICKED(Interface.checkOpenClEnable, ChangedOpenClEnabled); CONNECT_SIGNAL_CLICKED(Interface.checkOpenClCustomEnable, ChangedOpenClCustomEnable); CONNECT_SIGNAL(Interface.comboOpenCLCustomFormulas, ChangedComboOpenCLCustomFormulas, "changed"); CONNECT_SIGNAL_CLICKED(Interface.checkIterFogEnable, ChangedIterFogEnable); CONNECT_SIGNAL_CLICKED(Interface.buSaveAllImageLayers, PressedSaveAllImageLayers); CONNECT_SIGNAL_CLICKED(Interface.checkNetRenderServerEnable, PressedServerEnable); CONNECT_SIGNAL_CLICKED(Interface.checkNetRenderServerScan, PressedServerScan); CONNECT_SIGNAL_CLICKED(Interface.checkNetRenderClientEnable, PressedClientEnable); CONNECT_SIGNAL_CLICKED(Interface.buOpenCLEditFormula, PressedOpenCLEditFormula); CONNECT_SIGNAL_CLICKED(Interface.buOpenCLEditFormulaInit, PressedOpenCLEditFormulaInit); CONNECT_SIGNAL_CLICKED(Interface.buOpenCLNewFormula, PressedOpenCLNewFormula); CONNECT_SIGNAL_CLICKED(Interface.buOpenCLDeleteFormula, PressedOpenCLDeleteFormula); CONNECT_SIGNAL_CLICKED(Interface.buOpenCLRecompile, PressedRecompile); CONNECT_SIGNAL_CLICKED(Interface.buConvertPathToKeyframes, PressedPath2Keyframes); gtk_signal_connect(GTK_OBJECT(dareaPalette), "button_press_event", GTK_SIGNAL_FUNC(pressed_button_on_palette), NULL); gtk_widget_set_events(GTK_WIDGET(dareaPalette), GDK_BUTTON_PRESS_MASK); gtk_signal_connect(GTK_OBJECT(dareaPalette), "expose-event", GTK_SIGNAL_FUNC(on_dareaPalette_expose), NULL); //----------------------- main box ----------------------- // box buttons gtk_box_pack_start(GTK_BOX(Interface.boxMain), Interface.boxButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxButtons), Interface.buRender, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxButtons), Interface.buStop, true, true, 1); // frame view point gtk_box_pack_start(GTK_BOX(Interface.tab_box_view), Interface.frCoordinates, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frCoordinates), Interface.boxView); // box coordinates gtk_box_pack_start(GTK_BOX(Interface.boxView), Interface.boxCoordinates, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxCoordinates), CreateEdit("0,0", "x:", 20, Interface.edit_va), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxCoordinates), CreateEdit("0,0", "y:", 20, Interface.edit_vb), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxCoordinates), CreateEdit("0,0", "z:", 20, Interface.edit_vc), false, false, 1); // box angle gtk_box_pack_start(GTK_BOX(Interface.boxView), Interface.boxAngle, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAngle), CreateEdit("0,0", "alpha (yaw):", 15, Interface.edit_alfa), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAngle), CreateEdit("0,0", "beta (pitch):", 15, Interface.edit_beta), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAngle), CreateEdit("0,0", "gamma (roll):", 15, Interface.edit_gammaAngle), false, false, 1); // box zoom gtk_box_pack_start(GTK_BOX(Interface.boxView), Interface.boxZoom, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxZoom), CreateEdit("2,5", "Close up (zoom):", 20, Interface.edit_zoom), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxZoom), CreateEdit("0,5", "perspective (FOV):", 5, Interface.edit_persp), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxZoom), CreateWidgetWithLabel("Perspective projection:", Interface.comboPerspectiveType), false, false, 1); //buttons arrows gtk_container_add(GTK_CONTAINER(Interface.buUp), Interface.pixmap_up); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows), Interface.buUp, 1, 2, 0, 1); gtk_container_add(GTK_CONTAINER(Interface.buDown), Interface.pixmap_down); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows), Interface.buDown, 1, 2, 2, 3); gtk_container_add(GTK_CONTAINER(Interface.buLeft), Interface.pixmap_left); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows), Interface.buLeft, 0, 1, 1, 2); gtk_container_add(GTK_CONTAINER(Interface.buRight), Interface.pixmap_right); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows), Interface.buRight, 2, 3, 1, 2); gtk_container_add(GTK_CONTAINER(Interface.buRotateLeft), Interface.pixmap_rotate_left); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows), Interface.buRotateLeft, 0, 1, 2, 3); gtk_container_add(GTK_CONTAINER(Interface.buRotateRight), Interface.pixmap_rotate_right); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows), Interface.buRotateRight, 2, 3, 2, 3); gtk_box_pack_start(GTK_BOX(Interface.tab_box_view), Interface.fr3Dnavigator, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.fr3Dnavigator), Interface.boxArrows); gtk_box_pack_start(GTK_BOX(Interface.boxArrows), Interface.boxArrows2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxArrows2), Interface.tableArrows, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxArrows2), Interface.checkStraightRotation, false, false, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkStraightRotation), false); //navigation gtk_box_pack_start(GTK_BOX(Interface.boxArrows), Interface.boxNavigation, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), Interface.buInitNavigator, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), Interface.boxNavigationButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigationButtons), Interface.buForward, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigationButtons), Interface.buBackward, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), CreateEdit(DoubleToString(0.5), "Step for camera moving multiplied by DE:", 5, Interface.edit_step_forward), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), Interface.checkNavigatorAbsoluteDistance, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), CreateEdit(DoubleToString(0.1), "Absolute movement distance:", 10, Interface.edit_NavigatorAbsoluteDistance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), CreateEdit(DoubleToString(10.0), "Rotation step in degrees", 5, Interface.edit_step_rotation), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), CreateEdit(DoubleToString(3.0), "Mouse click close-up ratio", 5, Interface.edit_mouse_click_distance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), Interface.boxNavigationZooming, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigationZooming), Interface.checkZoomClickEnable, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNavigationZooming), Interface.checkNavigatorGoToSurface, false, false, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkZoomClickEnable), true); gtk_box_pack_start(GTK_BOX(Interface.boxNavigation), Interface.label_NavigatorEstimatedDistance, false, false, 1); //buttons arrows 2 gtk_container_add(GTK_CONTAINER(Interface.buMoveUp), Interface.pixmap_move_up); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows2), Interface.buMoveUp, 1, 2, 0, 1); gtk_container_add(GTK_CONTAINER(Interface.buMoveDown), Interface.pixmap_move_down); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows2), Interface.buMoveDown, 1, 2, 2, 3); gtk_container_add(GTK_CONTAINER(Interface.buMoveLeft), Interface.pixmap_move_left); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows2), Interface.buMoveLeft, 0, 1, 1, 2); gtk_container_add(GTK_CONTAINER(Interface.buMoveRight), Interface.pixmap_move_right); gtk_table_attach_defaults(GTK_TABLE(Interface.tableArrows2), Interface.buMoveRight, 2, 3, 1, 2); gtk_box_pack_start(GTK_BOX(Interface.boxArrows), Interface.boxArrows3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxArrows3), Interface.tableArrows2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_view), Interface.frMeasure, true, true, 1); gtk_container_add(GTK_CONTAINER(Interface.frMeasure), Interface.boxMeasure); gtk_box_pack_start(GTK_BOX(Interface.boxMeasure), Interface.boxMeasure1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMeasure1), Interface.buMeasureActivation, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMeasure1), CreateEdit("0", "X:", 20, Interface.edit_measureX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMeasure1), CreateEdit("0", "Y:", 20, Interface.edit_measureY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMeasure1), CreateEdit("0", "Z:", 20, Interface.edit_measureZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMeasure), Interface.label_measureDistance, false, false, 1); // frame fractal gtk_box_pack_start(GTK_BOX(Interface.tab_box_fractal), Interface.frFractalFormula, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frFractalFormula), Interface.boxFractalFormula); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFormula), CreateWidgetWithLabel("Fractal formula type:", Interface.comboFractType), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFormula), Interface.boxJulia, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxJulia), CreateEdit("0,0", "Julia x:", 20, Interface.edit_julia_a), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxJulia), CreateEdit("0,0", "Julia y:", 20, Interface.edit_julia_b), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxJulia), CreateEdit("0,0", "Julia z:", 20, Interface.edit_julia_c), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxJulia), Interface.checkJulia, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFormula), Interface.boxFractalPower, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalPower), CreateEdit("8,0", "power:", 5, Interface.edit_power), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalPower), CreateEdit("1,0", "Fractal constant factor:", 5, Interface.edit_FractalConstantFactor), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalPower), CreateEdit("0,0", "c add:", 5, Interface.edit_cadd), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_fractal), Interface.frFractalFoldingIntPow, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frFractalFoldingIntPow), Interface.boxFractalFoldingIntPow); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFoldingIntPow), CreateEdit("2,0", "Cubic folding factor:", 5, Interface.edit_FoldingIntPowFoldingFactor), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFoldingIntPow), CreateEdit("10,0", "Z factor:", 5, Interface.edit_FoldingIntPowZFactor), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_fractal), Interface.frFractalFolding, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frFractalFolding), Interface.boxFractalFolding); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFolding), Interface.boxTgladFolding, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxTgladFolding), Interface.checkTgladMode, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxTgladFolding), CreateEdit("1,0", "Folding limit:", 5, Interface.edit_tglad_folding_1), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxTgladFolding), CreateEdit("2,0", "Folding value:", 5, Interface.edit_tglad_folding_2), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFolding), Interface.boxSphericalFolding, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSphericalFolding), Interface.checkSphericalFoldingMode, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSphericalFolding), CreateEdit("1,0", "Fixed radius:", 5, Interface.edit_spherical_folding_1), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSphericalFolding), CreateEdit("0,5", "Min. radius:", 5, Interface.edit_spherical_folding_2), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalFolding), Interface.checkIFSFoldingMode, false, false, 1); //primitives gtk_box_pack_start(GTK_BOX(Interface.tab_box_fractal), Interface.frPrimitives, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitives), Interface.boxPrimitives); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitives), Interface.tabsPrimitives, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_primitivePlane), Interface.frPrimitivePlane, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitivePlane), Interface.boxPrimitivePlane); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane), Interface.boxPrimitivePlane1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane1), CreateEdit("0.0", "Centre x:", 10, Interface.edit_primitivePlaneCentreX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane1), CreateEdit("0.0", "y:", 10, Interface.edit_primitivePlaneCentreY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane1), CreateEdit("0.0", "z:", 10, Interface.edit_primitivePlaneCentreZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane1), CreateEdit("0.0", "Normal x:", 5, Interface.edit_primitivePlaneNormalX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane1), CreateEdit("0.0", "y:", 5, Interface.edit_primitivePlaneNormalY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane1), CreateEdit("-1,0", "z:", 5, Interface.edit_primitivePlaneNormalZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane), Interface.boxPrimitivePlane2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane2), Interface.buColorPrimitivePlane, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane2), CreateEdit("0,0", "Reflect:", 5, Interface.edit_primitivePlaneReflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane2), Interface.checkPrimitivePlaneEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitivePlane2), Interface.checkPrimitiveOnlyPlane, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_primitiveWater), Interface.frPrimitiveWater, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitiveWater), Interface.boxPrimitiveWater); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater), Interface.boxPrimitiveWater1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater1), CreateEdit("0.0", "Level:", 10, Interface.edit_primitiveWaterHeight), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater1), CreateEdit("0.1", "Wave amplitude:", 10, Interface.edit_primitiveWaterAmplitude), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater1), CreateEdit("1.0", "Wave length:", 10, Interface.edit_primitiveWaterLength), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater1), CreateEdit("0", "Rotation:", 10, Interface.edit_primitiveWaterRotation), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater1), CreateEdit("5", "Iterations:", 3, Interface.edit_primitiveWaterIterations), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater), Interface.boxPrimitiveWater2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater2), Interface.buColorPrimitiveWater, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater2), CreateEdit("0,7", "Reflect:", 5, Interface.edit_primitiveWaterReflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater2), CreateEdit("0,1", "Waves anim speed:", 5, Interface.edit_primitiveWaterAnimSpeed), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveWater2), Interface.checkPrimitiveWaterEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_primitiveBox), Interface.frPrimitiveBox, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitiveBox), Interface.boxPrimitiveBox); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox), Interface.boxPrimitiveBox1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox1), CreateEdit("0.0", "Centre x:", 10, Interface.edit_primitiveBoxCentreX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox1), CreateEdit("0.0", "y:", 10, Interface.edit_primitiveBoxCentreY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox1), CreateEdit("0.0", "z:", 10, Interface.edit_primitiveBoxCentreZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox1), CreateEdit("1.0", "Size x:", 10, Interface.edit_primitiveBoxSizeX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox1), CreateEdit("1.0", "y:", 10, Interface.edit_primitiveBoxSizeY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox1), CreateEdit("1.0", "z:", 10, Interface.edit_primitiveBoxSizeZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox), Interface.boxPrimitiveBox2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox2), Interface.buColorPrimitiveBox, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox2), CreateEdit("0,0", "Reflect:", 5, Interface.edit_primitiveBoxReflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveBox2), Interface.checkPrimitiveBoxEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_primitiveBoxInv), Interface.frPrimitiveInvertedBox, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitiveInvertedBox), Interface.boxPrimitiveInvertedBox); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox), Interface.boxPrimitiveInvertedBox1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox1), CreateEdit("0.0", "Centre x:", 10, Interface.edit_primitiveInvertedBoxCentreX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox1), CreateEdit("0.0", "y:", 10, Interface.edit_primitiveInvertedBoxCentreY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox1), CreateEdit("0.0", "z:", 10, Interface.edit_primitiveInvertedBoxCentreZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox1), CreateEdit("10.0", "Size x:", 10, Interface.edit_primitiveInvertedBoxSizeX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox1), CreateEdit("10.0", "y:", 10, Interface.edit_primitiveInvertedBoxSizeY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox1), CreateEdit("10.0", "z:", 10, Interface.edit_primitiveInvertedBoxSizeZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox), Interface.boxPrimitiveInvertedBox2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox2), Interface.buColorPrimitiveInvertedBox, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox2), CreateEdit("0,0", "Reflect:", 5, Interface.edit_primitiveInvertedBoxReflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedBox2), Interface.checkPrimitiveInvertedBoxEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_primitiveSphere), Interface.frPrimitiveSphere, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitiveSphere), Interface.boxPrimitiveSphere); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere), Interface.boxPrimitiveSphere1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere1), CreateEdit("0.0", "Centre x:", 10, Interface.edit_primitiveSphereCentreX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere1), CreateEdit("0.0", "y:", 10, Interface.edit_primitiveSphereCentreY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere1), CreateEdit("0.0", "z:", 10, Interface.edit_primitiveSphereCentreZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere1), CreateEdit("2.0", "z:", 10, Interface.edit_primitiveSphereRadius), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere), Interface.boxPrimitiveSphere2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere2), Interface.buColorPrimitiveSphere, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere2), CreateEdit("0,0", "Reflect:", 5, Interface.edit_primitiveSphereReflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveSphere2), Interface.checkPrimitiveSphereEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_primitiveSphereInv), Interface.frPrimitiveInvertedSphere, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPrimitiveInvertedSphere), Interface.boxPrimitiveInvertedSphere); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere), Interface.boxPrimitiveInvertedSphere1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere1), CreateEdit("0.0", "Centre x:", 10, Interface.edit_primitiveInvertedSphereCentreX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere1), CreateEdit("0.0", "y:", 10, Interface.edit_primitiveInvertedSphereCentreY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere1), CreateEdit("0.0", "z:", 10, Interface.edit_primitiveInvertedSphereCentreZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere1), CreateEdit("2.0", "z:", 10, Interface.edit_primitiveInvertedSphereRadius), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere), Interface.boxPrimitiveInvertedSphere2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere2), Interface.buColorPrimitiveInvertedSphere, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere2), CreateEdit("0,0", "Reflect:", 5, Interface.edit_primitiveInvertedSphereReflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPrimitiveInvertedSphere2), Interface.checkPrimitiveInvertedSphereEnabled, false, false, 1); //tab --- engine gtk_box_pack_start(GTK_BOX(Interface.tab_box_engine), Interface.frFractalRayMarching, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frFractalRayMarching), Interface.boxFractalRayMarching); gtk_box_pack_start(GTK_BOX(Interface.boxFractalRayMarching), Interface.boxQuality, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), CreateEdit("250", "Max. iterations:", 5, Interface.edit_maxN), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), CreateEdit("1", "Min. iterations:", 5, Interface.edit_minN), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), Interface.label_DE_threshold, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), Interface.edit_DE_thresh, false, false, 1); gtk_entry_set_text(GTK_ENTRY(Interface.edit_DE_thresh), "1,0"); gtk_entry_set_width_chars(GTK_ENTRY(Interface.edit_DE_thresh), 5); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), CreateEdit("1,0", "DE step factor:", 5, Interface.edit_DE_stepFactor), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), Interface.buAutoDEStep, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), Interface.buAutoDEStepHQ, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxQuality), CreateEdit("1,0", "Smoothness:", 5, Interface.edit_roughness), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalRayMarching), Interface.boxFractalSwitches, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalSwitches), Interface.checkIterThresh, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalSwitches), Interface.checkInteriorMode, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalSwitches), Interface.checkDELinearMode, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalSwitches), Interface.checkConstantDEThreshold, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalSwitches), Interface.checkSlowShading, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFractalRayMarching), Interface.boxViewDistance, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxViewDistance), CreateEdit("1e-15", "Minimum render distance:", 10, Interface.edit_viewMinDistance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxViewDistance), CreateEdit("20", "Maximum render distance:", 10, Interface.edit_viewMaxDistance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_engine), Interface.frLimits, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frLimits), Interface.boxLimits); gtk_box_pack_start(GTK_BOX(Interface.boxLimits), Interface.tableLimits, false, false, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableLimits), CreateEdit("-0,5", "x min:", 20, Interface.edit_amin), 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableLimits), CreateEdit("-0,5", "y min:", 20, Interface.edit_bmin), 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableLimits), CreateEdit("-0,5", "z min:", 20, Interface.edit_cmin), 2, 3, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableLimits), CreateEdit("0,5", "x max:", 20, Interface.edit_amax), 0, 1, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableLimits), CreateEdit("0,5", "y max:", 20, Interface.edit_bmax), 1, 2, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableLimits), CreateEdit("0,5", "z max:", 20, Interface.edit_cmax), 2, 3, 1, 2); gtk_box_pack_start(GTK_BOX(Interface.boxLimits), Interface.checkLimits, false, false, 1); //frame netRender gtk_box_pack_start(GTK_BOX(Interface.tab_box_engine), Interface.frNetRender, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frNetRender), Interface.tabsNetRender); gtk_box_pack_start(GTK_BOX(Interface.tab_box_server), Interface.boxNetRenderServerV, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderServerV), Interface.boxNetRenderServerH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderServerH1), Interface.checkNetRenderServerEnable, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderServerH1), Interface.checkNetRenderServerScan, false, false, 1); gtk_widget_set_sensitive(Interface.checkNetRenderServerScan, false); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderServerH1), CreateEdit("5555", " network port:", 20, Interface.edit_netRenderServerPort), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderServerV), Interface.label_serverStatus, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_client), Interface.boxNetRenderClientV, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderClientV), Interface.boxNetRenderClientH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderClientH1), Interface.checkNetRenderClientEnable, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderClientH1), CreateEdit("11.0.0.4", " IP or domain of server:", 20, Interface.edit_netRenderClientName), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderClientH1), CreateEdit("5555", "port:", 10, Interface.edit_netRenderClientPort), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxNetRenderClientV), Interface.label_clientStatus, false, false, 1); //frame image gtk_box_pack_start(GTK_BOX(Interface.tab_box_image), Interface.frImage, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frImage), Interface.boxImage); gtk_box_pack_start(GTK_BOX(Interface.boxImage), Interface.boxImageRes, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageRes), CreateEdit("800", "Image width:", 5, Interface.edit_imageWidth), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageRes), CreateEdit("600", "Image height:", 5, Interface.edit_imageHeight), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageRes), CreateWidgetWithLabel("Image proportion:", Interface.comboImageProportion), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageRes), CreateEdit("1", "Tiles (rows and columns):", 5, Interface.edit_tiles), false, false, 1); //frame image adjustments gtk_box_pack_start(GTK_BOX(Interface.tab_box_image), Interface.frImageAdjustments, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frImageAdjustments), Interface.boxImageAdjustmentsV); gtk_box_pack_start(GTK_BOX(Interface.boxImageAdjustmentsV), Interface.boxImageAdjustmentsH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAdjustmentsH1), CreateEdit("1,0", "brightness:", 5, Interface.edit_brightness), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAdjustmentsH1), CreateEdit("1,0", "contrast:", 5, Interface.edit_contrast), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAdjustmentsH1), CreateEdit("1,0", "gamma:", 5, Interface.edit_gamma), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAdjustmentsH1), Interface.checkHDR, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAdjustmentsH1), Interface.buApplyImageAdjustments, false, false, 1); //frame Stereoscopic gtk_box_pack_start(GTK_BOX(Interface.tab_box_image), Interface.frStereo, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frStereo), Interface.boxStereoscopic); gtk_box_pack_start(GTK_BOX(Interface.boxStereoscopic), Interface.boxStereoParams, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxStereoParams), CreateEdit("0,1", "Distance between eyes:", 20, Interface.edit_stereoDistance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxStereoParams), Interface.checkStereoEnabled, false, false, 1); //frame Image saving gtk_box_pack_start(GTK_BOX(Interface.tab_box_image), Interface.frImageSaving, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frImageSaving), Interface.boxImageSaving); gtk_box_pack_start(GTK_BOX(Interface.boxImageSaving), Interface.boxSaveImage, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSaveImage), Interface.buSaveImage, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSaveImage), Interface.buSavePNG, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSaveImage), Interface.buSavePNG16, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSaveImage), Interface.buSavePNG16Alpha, true, true, 1); //gtk_box_pack_start(GTK_BOX(Interface.boxSaveImage), Interface.buSaveAllImageLayers, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageSaving), Interface.boxImageAutoSave, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAutoSave), CreateWidgetWithLabel("Auto-save / animation image format:", Interface.comboImageFormat), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxImageAutoSave), Interface.checkAutoSaveImage, false, false, 1); //frame effects gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders), Interface.frShadersSurface, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frShadersSurface), Interface.boxShadersSurfaceV); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceV), Interface.boxShadersSurfaceH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH1), CreateEdit("0,5", "shading:", 5, Interface.edit_shading), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH1), CreateEdit("1,0", "direct light:", 5, Interface.edit_shadows), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH1), CreateEdit("1,0", "specularity:", 5, Interface.edit_specular), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH1), CreateEdit("0,0", "ambient:", 5, Interface.edit_ambient), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH1), CreateEdit("10,0", "Soft shadow cone angle:", 5, Interface.edit_shadowConeAngle), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceV), Interface.boxShadersSurfaceH2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH2), CreateEdit("2,0", "ambient occlusion:", 5, Interface.edit_ambient_occlusion), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH2), CreateEdit("4", "AO quality:", 5, Interface.edit_AmbientOcclusionQuality), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH2), CreateEdit("1,0", "Fast AO tune:", 5, Interface.edit_fastAoTune), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH2), CreateEdit("0,0", "reflection:", 5, Interface.edit_reflect), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH2), CreateEdit("5", "reflections depth:", 5, Interface.edit_reflectionsMax), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceV), Interface.boxShadersSurfaceH3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH3), Interface.checkShadow, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH3), Interface.checkAmbientOcclusion, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH3), Interface.checkFastAmbientOcclusion, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersSurfaceH3), Interface.checkRaytracedReflections, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders), Interface.frShadersVolumetric, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frShadersVolumetric), Interface.boxShadersVolumetricV); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricV), Interface.boxShadersVolumetricH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH1), CreateEdit("1,0", "glow:", 5, Interface.edit_glow), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH1), CreateEdit("100", "iter. fog opacity", 6, Interface.edit_iterFogOpacity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH1), CreateEdit("3", "fog opacity trim (iterations)", 6, Interface.edit_iterFogOpacityTrim), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricV), Interface.boxShadersVolumetricH2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH2), CreateEdit("1,0", "Fog density:", 5, Interface.edit_volumetricFogDensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH2), CreateEdit("1,0", "Fog colour 1 distance:", 5, Interface.edit_volumetricFogColorDistance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH2), CreateEdit("1,0", "Fog colour 2 distance:", 5, Interface.edit_volumetricFogColorDistance2), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH2), CreateEdit("1,0", "Fog distance factor:", 5, Interface.edit_volumetricFogDistanceFact), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH2), Interface.buAutoFog, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricV), Interface.boxShadersVolumetricH3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH3), Interface.checkBitmapBackground, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH3), Interface.checkBitmapBackgroundFulldome, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxShadersVolumetricH3), Interface.checkIterFogEnable, false, false, 1); //frame fake lights gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders), Interface.frFakeLights, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frFakeLights), Interface.boxFakeLightsV); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsV), Interface.boxFakeLightsH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH1), CreateEdit("2", "Min iter.:", 5, Interface.edit_fakeLightsMinIter), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH1), CreateEdit("4", "Max iter.:", 5, Interface.edit_fakeLightsMaxIter), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH1), CreateEdit("1,0", "Intensity:", 10, Interface.edit_fakeLightsIntensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH1), CreateEdit("1,0", "Visibility:", 10, Interface.edit_fakeLightsVisibility), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH1), CreateEdit("1,0", "Size:", 10, Interface.edit_fakeLightsVisibilitySize), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH1), Interface.checkFakeLightsEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsV), Interface.boxFakeLightsH2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH2), CreateEdit("0,0", "Orbit trap X:", 5, Interface.edit_fakeLightsOrbitTrapX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH2), CreateEdit("0,0", "Y:", 5, Interface.edit_fakeLightsOrbitTrapY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFakeLightsH2), CreateEdit("0,0", "Z:", 5, Interface.edit_fakeLightsOrbitTrapZ), false, false, 1); //frame fog gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders), Interface.frPostFog, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPostFog), Interface.boxPostFog); gtk_box_pack_start(GTK_BOX(Interface.boxPostFog), Interface.boxFogButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFogButtons), Interface.checkFogEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFogButtons), CreateWidgetWithLabel("Fog colour:", Interface.buColorFog), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFogButtons), Interface.label_sliderFog, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPostFog), Interface.boxFogSlider, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFogSlider), Interface.label_fog_visibility, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxFogSlider), Interface.sliderFogDepth, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPostFog), Interface.boxFogSlider2, false, false, 1); //frame animation gtk_box_pack_start(GTK_BOX(Interface.tab_box_animation), Interface.frAnimation, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frAnimation), Interface.boxAnimation); gtk_box_pack_start(GTK_BOX(Interface.boxAnimation), Interface.boxAnimationButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimationButtons), Interface.buAnimationRecordTrack, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimationButtons), Interface.buAnimationContinueRecord, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimationButtons), Interface.buAnimationRenderTrack, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimation), Interface.boxAnimationEdits, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimationEdits), CreateEdit(DoubleToString(0.01), "Flight speed (DE multiplier):", 5, Interface.edit_animationDESpeed), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimation), Interface.label_animationFrame, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimation), Interface.label_animationDistance, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimation), Interface.label_animationSpeed, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_animation), Interface.frKeyframeAnimation, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frKeyframeAnimation), Interface.boxKeyframeAnimation); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimation), Interface.boxKeyframeAnimationButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimationButtons), Interface.buAnimationRenderFromKeys, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimation), Interface.boxKeyframeAnimationButtons2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimationButtons2), Interface.buConvertPathToKeyframes, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimation), Interface.boxKeyframeAnimationEdits, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimationEdits), CreateEdit("100", "Frames per key:", 5, Interface.edit_animationFramesPerKey), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxKeyframeAnimation), Interface.label_keyframeInfo, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_animation), Interface.frAnimationFrames, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frAnimationFrames), Interface.boxAnimationEdits2); gtk_box_pack_start(GTK_BOX(Interface.boxAnimationEdits2), CreateEdit("0", "Start frame:", 5, Interface.edit_animationStartFrame), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxAnimationEdits2), CreateEdit("1000", "End frame:", 5, Interface.edit_animationEndFrame), false, false, 1); //---- tab pot effects //frame palette gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders2), Interface.frPalette, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPalette), Interface.boxPalette); gtk_box_pack_start(GTK_BOX(Interface.boxPalette), Interface.boxEffectsColoring, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), Interface.checkColoring, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), Interface.vSeparator1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), CreateEdit("123456", "Random seed:", 6, Interface.edit_color_seed), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), CreateEdit("1,0", "Saturation:", 6, Interface.edit_colour_saturation), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), CreateEdit("1,0", "Colour speed:", 6, Interface.edit_color_speed), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), Interface.buRandomPalette, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxEffectsColoring), Interface.buGetPaletteFromImage, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPalette), dareaPalette, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPalette), Interface.boxPaletteOffset, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPaletteOffset), Interface.label_paletteOffset, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPaletteOffset), Interface.sliderPaletteOffset, true, true, 1); //frame colors gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders2), Interface.frColors, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frColors), Interface.boxColors); gtk_box_pack_start(GTK_BOX(Interface.boxColors), Interface.boxGlowColor, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("Glow 1:", Interface.buColorGlow1), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("2:", Interface.buColorGlow2), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("Background 1:", Interface.buColorBackgroud1), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("2:", Interface.buColorBackgroud2), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("3:", Interface.buColorBackgroud3), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("Fog 1:", Interface.buColorFog1), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("2:", Interface.buColorFog2), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxGlowColor), CreateWidgetWithLabel("3:", Interface.buColorFog3), false, false, 1); //frame SSAO gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders2), Interface.frPostSSAO, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPostSSAO), Interface.boxPostSSAO); gtk_box_pack_start(GTK_BOX(Interface.boxPostSSAO), Interface.boxSSAOButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSSAOButtons), Interface.checkSSAOEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSSAOButtons), Interface.buUpdateSSAO, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPostSSAO), Interface.boxSSAOSlider, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSSAOSlider), Interface.label_SSAO_quality, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxSSAOSlider), Interface.sliderSSAOQuality, true, true, 1); //frame DOF gtk_box_pack_start(GTK_BOX(Interface.tab_box_shaders2), Interface.frPostDOF, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPostDOF), Interface.boxPostDOF); gtk_box_pack_start(GTK_BOX(Interface.boxPostDOF), Interface.boxDOFButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFButtons), Interface.checkDOFEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFButtons), Interface.buUpdateDOF, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFButtons), Interface.label_sliderDOF, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPostDOF), Interface.boxDOFSlider1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFSlider1), Interface.label_DOF_focus, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFSlider1), Interface.sliderDOFFocus, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPostDOF), Interface.boxDOFSlider2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFSlider2), Interface.label_DOF_radius, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxDOFSlider2), Interface.sliderDOFRadius, true, true, 1); //gtk_box_pack_start(GTK_BOX(Interface.tab_box_posteffects), Interface.buBuddhabrot, true, true, 1); //---- tab Lights gtk_box_pack_start(GTK_BOX(Interface.tab_box_lights), Interface.frMainLight, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frMainLight), Interface.boxMainLight); gtk_box_pack_start(GTK_BOX(Interface.boxMainLight), Interface.boxMainLightPosition, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMainLightPosition), CreateEdit("-45", "Horizontal angle relative to camera:", 6, Interface.edit_mainLightAlfa), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMainLightPosition), CreateEdit("45", "Vertical angle relative to camera:", 6, Interface.edit_mainLightBeta), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMainLightPosition), CreateWidgetWithLabel("Colour:", Interface.buColorMainLight), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_lights), Interface.frLightsCommon, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frLightsCommon), Interface.boxLightCommon); gtk_box_pack_start(GTK_BOX(Interface.boxLightCommon), Interface.buDistributeLights, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightCommon), CreateEdit("0", "Number of aux. lights:", 6, Interface.edit_auxLightNumber), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightCommon), CreateEdit(DoubleToString(0.01), "Manual placement distance:", 6, Interface.edit_auxLightPlacementDistance), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_lights), Interface.frLightBallance, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frLightBallance), Interface.boxLightBallance); gtk_box_pack_start(GTK_BOX(Interface.boxLightBallance), Interface.boxLightBrightness, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightBrightness), CreateEdit("1,0", "Main light intensity:", 6, Interface.edit_mainLightIntensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightBrightness), CreateEdit("1,0", "Auxiliary lights intensity:", 6, Interface.edit_auxLightIntensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightBrightness), CreateEdit("1,0", "Lights visibility:", 6, Interface.edit_auxLightVisibility), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightBrightness), Interface.checkPenetratingLights, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_lights), Interface.frLightsParameters, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frLightsParameters), Interface.boxLightsParameters); gtk_box_pack_start(GTK_BOX(Interface.boxLightsParameters), Interface.boxLightDistribution, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightDistribution), CreateEdit("1234", "Random seed:", 6, Interface.edit_auxLightRandomSeed), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightDistribution), CreateEdit("0,1", "Maximum distance from fractal", 12, Interface.edit_auxLightMaxDist), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightsParameters), Interface.boxLightDistribution2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightDistribution2), CreateEdit("3.0", "Distribution radius of lights:", 6, Interface.edit_auxLightDistributionRadius), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightDistribution2), CreateEdit("0", "Centre of distribution X:", 12, Interface.edit_auxLightRandomCentreX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightDistribution2), CreateEdit("0", "Y:", 12, Interface.edit_auxLightRandomCentreY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightDistribution2), CreateEdit("0", "Z:", 12, Interface.edit_auxLightRandomCentreZ), false, false, 1); //frame: predefined lights gtk_box_pack_start(GTK_BOX(Interface.tab_box_lights), Interface.frPredefinedLights, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frPredefinedLights), Interface.boxPredefinedLights); gtk_box_pack_start(GTK_BOX(Interface.boxPredefinedLights), Interface.boxLightPre1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), Interface.label_auxLightPre1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), CreateEdit("3,0", "x:", 12, Interface.edit_auxLightPre1x), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), CreateEdit("-3,0", "y:", 12, Interface.edit_auxLightPre1y), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), CreateEdit("-3,0", "z:", 12, Interface.edit_auxLightPre1z), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), CreateEdit("1,0", "intensity:", 12, Interface.edit_auxLightPre1intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), Interface.buColorAuxLightPre1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre1), Interface.checkAuxLightPre1Enabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPredefinedLights), Interface.boxLightPre2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), Interface.label_auxLightPre2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), CreateEdit("-3,0", "x:", 12, Interface.edit_auxLightPre2x), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), CreateEdit("-3,0", "y:", 12, Interface.edit_auxLightPre2y), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), CreateEdit("0,0", "z:", 12, Interface.edit_auxLightPre2z), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), CreateEdit("1,0", "intensity:", 12, Interface.edit_auxLightPre2intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), Interface.buColorAuxLightPre2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre2), Interface.checkAuxLightPre2Enabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPredefinedLights), Interface.boxLightPre3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), Interface.label_auxLightPre3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), CreateEdit("1,0", "x:", 12, Interface.edit_auxLightPre3x), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), CreateEdit("3,0", "y:", 12, Interface.edit_auxLightPre3y), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), CreateEdit("-1,0", "z:", 12, Interface.edit_auxLightPre3z), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), CreateEdit("1,0", "intensity:", 12, Interface.edit_auxLightPre3intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), Interface.buColorAuxLightPre3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre3), Interface.checkAuxLightPre3Enabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxPredefinedLights), Interface.boxLightPre4, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), Interface.label_auxLightPre4, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), CreateEdit("1,0", "x:", 12, Interface.edit_auxLightPre4x), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), CreateEdit("-1,0", "y:", 12, Interface.edit_auxLightPre4y), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), CreateEdit("-3,0", "z:", 12, Interface.edit_auxLightPre4z), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), CreateEdit("1,0", "intensity:", 12, Interface.edit_auxLightPre4intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), Interface.buColorAuxLightPre4, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLightPre4), Interface.checkAuxLightPre4Enabled, false, false, 1); //frame: volumetric lights gtk_box_pack_start(GTK_BOX(Interface.tab_box_lights), Interface.frVolumetricLight, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frVolumetricLight), Interface.boxVolumetricLight); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLight), Interface.boxVolumetricLightGeneral, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLight), Interface.boxVolumetricLightMain, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightMain), CreateEdit("1,0", "Intensity for main light:", 12, Interface.edit_volumetricLightMainIntensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightMain), Interface.checkVolumetricLightMainEnabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLight), Interface.boxVolumetricLightAux, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), CreateEdit("1,0", "L #1:", 12, Interface.edit_volumetricLightAux1Intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), Interface.checkVolumetricLightAux1Enabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), CreateEdit("1,0", "L #2:", 12, Interface.edit_volumetricLightAux2Intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), Interface.checkVolumetricLightAux2Enabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), CreateEdit("1,0", "L #3:", 12, Interface.edit_volumetricLightAux3Intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), Interface.checkVolumetricLightAux3Enabled, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), CreateEdit("1,0", "L #4:", 12, Interface.edit_volumetricLightAux4Intensity), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxVolumetricLightAux), Interface.checkVolumetricLightAux4Enabled, false, false, 1); //tab IFS //frame: main IFS gtk_box_pack_start(GTK_BOX(Interface.tab_box_IFS), Interface.frIFSMain, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frIFSMain), Interface.boxIFSMain); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMain), Interface.boxIFSMainEdit, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit), CreateEdit("2,0", "scale:", 6, Interface.edit_IFSScale), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit), CreateEdit("0", "rotation alpha:", 6, Interface.edit_IFSAlfa), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit), CreateEdit("0", "rotation beta:", 6, Interface.edit_IFSBeta), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit), CreateEdit("0", "rotation gamma:", 6, Interface.edit_IFSGamma), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMain), Interface.boxIFSMainEdit2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), CreateEdit("1", "offset x:", 6, Interface.edit_IFSOffsetX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), CreateEdit("0", "offset y:", 6, Interface.edit_IFSOffsetY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), CreateEdit("0", "offset z:", 6, Interface.edit_IFSOffsetZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), Interface.checkIFSAbsX, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), Interface.checkIFSAbsY, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), Interface.checkIFSAbsZ, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMainEdit2), Interface.checkIFSMengerSponge, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSMain), Interface.boxIFSEdge, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSEdge), CreateEdit("0", "Edge x:", 6, Interface.edit_IFSEdgeX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSEdge), CreateEdit("0", "Edge y:", 6, Interface.edit_IFSEdgeY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSEdge), CreateEdit("0", "Edge z:", 6, Interface.edit_IFSEdgeZ), false, false, 1); //frame: IFS params gtk_box_pack_start(GTK_BOX(Interface.tab_box_IFS), Interface.frIFSParams, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frIFSParams), Interface.boxIFSParams); gtk_box_pack_start(GTK_BOX(Interface.boxIFSParams), Interface.tableIFSParams, false, false, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSx, 0, 1, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSy, 1, 2, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSz, 2, 3, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSalfa, 3, 4, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSbeta, 4, 5, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSgamma, 5, 6, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSdistance, 6, 7, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSintensity, 7, 8, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.label_IFSenabled, 8, 9, 0, 1); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { Interface.IFSParams[i].editIFSx = gtk_entry_new(); Interface.IFSParams[i].editIFSy = gtk_entry_new(); Interface.IFSParams[i].editIFSz = gtk_entry_new(); Interface.IFSParams[i].editIFSalfa = gtk_entry_new(); Interface.IFSParams[i].editIFSbeta = gtk_entry_new(); Interface.IFSParams[i].editIFSgamma = gtk_entry_new(); Interface.IFSParams[i].editIFSdistance = gtk_entry_new(); Interface.IFSParams[i].editIFSintensity = gtk_entry_new(); Interface.IFSParams[i].checkIFSenabled = gtk_check_button_new(); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSx), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSy), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSz), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSalfa), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSbeta), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSgamma), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSdistance), 6); gtk_entry_set_width_chars(GTK_ENTRY(Interface.IFSParams[i].editIFSintensity), 6); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSx, 0, 1, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSy, 1, 2, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSz, 2, 3, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSalfa, 3, 4, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSbeta, 4, 5, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSgamma, 5, 6, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSdistance, 6, 7, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].editIFSintensity, 7, 8, i + 1, i + 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableIFSParams), Interface.IFSParams[i].checkIFSenabled, 8, 9, i + 1, i + 2); } gtk_box_pack_start(GTK_BOX(Interface.tab_box_IFS), Interface.boxIFSButtons, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSButtons), Interface.buIFSNormalizeOffset, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSButtons), Interface.buIFSNormalizeVectors, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSButtons), Interface.buIFSReset, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_IFS), Interface.frIFSDefaults, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frIFSDefaults), Interface.boxIFSDefaults); gtk_box_pack_start(GTK_BOX(Interface.boxIFSDefaults), Interface.buIFSDefaultDodeca, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSDefaults), Interface.buIFSDefaultIcosa, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSDefaults), Interface.buIFSDefaultOcta, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxIFSDefaults), Interface.buIFSDefaultMengerSponge, false, false, 1); //tab hybrid formula gtk_box_pack_start(GTK_BOX(Interface.tab_box_hybrid), Interface.frHybrid, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frHybrid), Interface.boxHybrid); gtk_box_pack_start(GTK_BOX(Interface.boxHybrid), Interface.tableHybridParams, false, false, 1); for (int i = 0; i < HYBRID_COUNT; ++i) gtk_table_attach_defaults(GTK_TABLE(Interface.tableHybridParams), Interface.label_HybridFormula[i], 0, 1, i, i + 1); for (int i = 0; i < HYBRID_COUNT; ++i) gtk_table_attach_defaults(GTK_TABLE(Interface.tableHybridParams), Interface.comboHybridFormula[i], 1, 2, i, i + 1); for (int i = 0; i < HYBRID_COUNT; ++i) gtk_table_attach_defaults(GTK_TABLE(Interface.tableHybridParams), CreateEdit("3", " iterations:", 6, Interface.edit_hybridIter[i]), 2, 3, i, i + 1); for (int i = 0; i < HYBRID_COUNT; ++i) gtk_table_attach_defaults(GTK_TABLE(Interface.tableHybridParams), CreateEdit("2", "power / scale / p:", 6, Interface.edit_hybridPower[i]), 3, 4, i, i + 1); gtk_box_pack_start(GTK_BOX(Interface.boxHybrid), Interface.checkHybridCyclic, false, false, 1); //tab Mandelbox gtk_box_pack_start(GTK_BOX(Interface.tab_box_mandelbox), Interface.frMandelboxMainParams, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frMandelboxMainParams), Interface.boxMandelboxMainParams); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams), Interface.boxMandelboxMainParams1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams1), CreateEdit("2", "Scale", 6, Interface.edit_mandelboxScale), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams1), CreateEdit("3,0", "Sharpness", 6, Interface.edit_mandelboxSharpness), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams1), CreateEdit("1,0", "Solid", 6, Interface.edit_mandelboxSolid), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams1), CreateEdit("0,0", "Melt", 6, Interface.edit_mandelboxMelt), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams), Interface.boxMandelboxMainParams2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams2), CreateEdit("1", "Folding limit", 6, Interface.edit_mandelboxFoldingLimit), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams2), CreateEdit("2", "Folding value", 6, Interface.edit_mandelboxFoldingValue), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams2), CreateEdit("1", "Fixed radius", 6, Interface.edit_mandelboxSpFoldingFixedRadius), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams2), CreateEdit("0,5", "Min radius", 6, Interface.edit_mandelboxSpFoldingMinRadius), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxMainParams), Interface.boxMandelboxOffset, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxOffset), CreateEdit("1", "Spherical folding offset X", 6, Interface.edit_mandelboxOffsetX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxOffset), CreateEdit("1", "Y", 6, Interface.edit_mandelboxOffsetY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxOffset), CreateEdit("1", "Z", 6, Interface.edit_mandelboxOffsetZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxOffset), CreateWidgetWithLabel("GeneralizedFoldBox type", Interface.comboGeneralizedFoldBoxType), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_mandelbox), Interface.frMandelboxRotations, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frMandelboxRotations), Interface.boxMandelboxRotations); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxRotations), Interface.boxMandelboxRotationMain, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxRotations), Interface.checkMandelboxRotationsEnable, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxRotationMain), CreateEdit("0", "Main rotation: alpha", 6, Interface.edit_mandelboxRotationMain[0]), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxRotationMain), CreateEdit("0", "beta", 6, Interface.edit_mandelboxRotationMain[1]), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxRotationMain), CreateEdit("0", "gamma", 6, Interface.edit_mandelboxRotationMain[2]), false, false, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Negative plane"), 1, 4, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Positive plane"), 4, 7, 0, 1); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Alpha"), 1, 2, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Beta"), 2, 3, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Gamma"), 3, 4, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Alfa"), 4, 5, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Beta"), 5, 6, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Gamma"), 6, 7, 1, 2); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("X Axis"), 0, 1, 2, 3); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Y Axis"), 0, 1, 3, 4); gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), gtk_label_new("Z Axis"), 0, 1, 4, 5); for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) for (int axis = 0; axis < 3; ++axis) for (int component = 0; component < 3; ++component) gtk_table_attach_defaults(GTK_TABLE(Interface.tableMandelboxRotations), Interface.edit_mandelboxRotation[fold][axis][component], component + fold * 3 + 1, component + fold * 3 + 2, axis + 2, axis + 3); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxRotations), Interface.tableMandelboxRotations, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_mandelbox), Interface.frMandelboxVary, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frMandelboxVary), Interface.boxMandelboxVary); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxVary), CreateEdit("0,1", "Vary scale", 6, Interface.edit_mandelboxVaryScale), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxVary), CreateEdit("1", "Fold", 6, Interface.edit_mandelboxVaryFold), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxVary), CreateEdit("0,5", "min R", 6, Interface.edit_mandelboxVaryMinR), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxVary), CreateEdit("1", "R power", 6, Interface.edit_mandelboxVaryRPower), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxVary), CreateEdit("0", "w add", 6, Interface.edit_mandelboxVaryWAdd), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_mandelbox), Interface.frMandelboxColoring, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frMandelboxColoring), Interface.boxMandelboxColoring); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColoring), Interface.boxMandelboxColor1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColor1), CreateEdit("0", "Resultant absolute value component", 6, Interface.edit_mandelboxColorFactorR), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColoring), Interface.boxMandelboxColor2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColor2), CreateEdit("0,1", "X plane component", 6, Interface.edit_mandelboxColorFactorX), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColor2), CreateEdit("0,2", "Y plane component", 6, Interface.edit_mandelboxColorFactorY), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColor2), CreateEdit("0,3", "Z plane component", 6, Interface.edit_mandelboxColorFactorZ), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColoring), Interface.boxMandelboxColor3, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColor3), CreateEdit("5,0", "Min radius component", 6, Interface.edit_mandelboxColorFactorSp1), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxMandelboxColor3), CreateEdit("1,0", "Fixed radius component", 6, Interface.edit_mandelboxColorFactorSp2), false, false, 1); //tab OpenCL gtk_box_pack_start(GTK_BOX(Interface.tab_box_openCL), Interface.tabsOpenCL, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_openclEngine), Interface.frOpenClSettings, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frOpenClSettings), Interface.boxOpenClSettings); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClSettings), Interface.boxOpenClSwitches1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClSwitches1), Interface.checkOpenClEnable, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClSwitches1), Interface.comboOpenCLEngine, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_openclEngine), Interface.frOpenClInformation, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frOpenClInformation), Interface.boxOpenClInformation); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClPlatformBy, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClMaxClock, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClMemorySize, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClComputingUnits, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClMaxWorkgroup, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClWorkgroupSize, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClInformation), Interface.label_OpenClStatus, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_openclEngine), Interface.frOpenClEngineSettings, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frOpenClEngineSettings), Interface.boxOpenClEngineSettingsV); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsV), Interface.boxOpenClEngineSettingsH1, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH1), CreateWidgetWithLabel("Device type:", Interface.comboOpenCLGPUCPU), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH1), CreateWidgetWithLabel("Platform index:", Interface.comboOpenCLPlatformIndex), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH1), CreateWidgetWithLabel("Device index:", Interface.comboOpenCLDeviceIndex), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH1), CreateEdit("256", "Max GPU mem to use [MB]:", 6, Interface.edit_OpenCLMaxMem), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsV), Interface.boxOpenClEngineSettingsH2, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH2), CreateEdit("1", "Processing cycle time [s] (higher gives better performace)", 6, Interface.edit_OpenCLProcessingCycleTime), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsV), Interface.boxOpenClEngineSettingsH3, false, false, 1); #ifdef WIN32 gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH3), CreateEdit("notepad.exe", "Text editor:", 40, Interface.edit_OpenCLTextEditor), false, false, 1); #else gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH3), CreateEdit("/usr/bin/kate", "Text editor:", 40, Interface.edit_OpenCLTextEditor), false, false, 1); #endif gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsV), Interface.boxOpenClEngineSettingsH4, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH4), CreateEdit("1e-5", "Delta for DeltaDE distance estimation:", 6, Interface.edit_OpenCLDeltaDEStep), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClEngineSettingsH4), CreateWidgetWithLabel("DOF effect method:", Interface.comboOpenCLDOFMode), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_openclCustom), Interface.frOpenClCustomSelection, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frOpenClCustomSelection), Interface.boxOpenClCustomV1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomV1), Interface.boxOpenClCustomH11, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH11), Interface.comboOpenCLCustomFormulas, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH11), Interface.buOpenCLNewFormula, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH11), Interface.buOpenCLEditFormula, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH11), Interface.buOpenCLEditFormulaInit, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH11), Interface.buOpenCLDeleteFormula, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH11), Interface.buOpenCLRecompile, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomV1), Interface.boxOpenClCustomH12, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH12), CreateWidgetWithLabel("Distance estimation method:", Interface.comboOpenCLDEMode), false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomV1), Interface.boxOpenClCustomH13, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomH13), Interface.checkOpenClCustomEnable, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.tab_box_openclCustom), Interface.frOpenClCustomParams, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frOpenClCustomParams), Interface.boxOpenClCustomV2); for(int i=0; i<15; i++) { char text[100]; int row = i / 3; int column = i % 3; sprintf(text, "consts->fractal.custom[%2d]:", i); gtk_table_attach_defaults(GTK_TABLE(Interface.tableOpenCLCustom), CreateEdit("0", text, 6, Interface.edit_customParameters[i]), column, column+1, row, row+1); } gtk_box_pack_start(GTK_BOX(Interface.boxOpenClCustomV2), Interface.tableOpenCLCustom, false, false, 1); //tab About... gtk_box_pack_start(GTK_BOX(Interface.tab_box_about), Interface.label_about, false, false, 1); //tabs gtk_box_pack_start(GTK_BOX(Interface.boxMain), Interface.tabs, false, false, 1); //setup files button gtk_box_pack_start(GTK_BOX(Interface.boxMain), Interface.buFiles, false, false, 1); //Load / Save settings gtk_box_pack_start(GTK_BOX(Interface.boxMain), Interface.frLoadSave, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frLoadSave), Interface.boxLoadSave); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buLoadSettings, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buSaveSettings, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buLoadExample, true, true, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buCopyToClipboard, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buGetFromClipboard, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buUndo, false, false, 1); gtk_box_pack_start(GTK_BOX(Interface.boxLoadSave), Interface.buRedo, false, false, 1); //Keyframe aniation gtk_box_pack_start(GTK_BOX(Interface.boxMain), Interface.frKeyframeAnimation2, false, false, 1); gtk_container_add(GTK_CONTAINER(Interface.frKeyframeAnimation2), Interface.boxBottomKeyframeAnimation); gtk_box_pack_start(GTK_BOX(Interface.boxBottomKeyframeAnimation), Interface.buTimeline, true, true, 1); //progressbar gtk_box_pack_start(GTK_BOX(Interface.boxMain), Interface.progressBar, false, false, 1); //tabs gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_view, Interface.tab_label_view); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_engine, Interface.tab_label_engine); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_image, Interface.tab_label_image); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_fractal, Interface.tab_label_fractal); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_IFS, Interface.tab_label_IFS); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_hybrid, Interface.tab_label_hybrid); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_mandelbox, Interface.tab_label_mandelbox); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_shaders, Interface.tab_label_shaders); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_shaders2, Interface.tab_label_shaders2); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_lights, Interface.tab_label_lights); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_animation, Interface.tab_label_animation); #ifdef CLSUPPORT gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_openCL, Interface.tab_label_openCL); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsOpenCL), Interface.tab_box_openclEngine, Interface.tab_label_openclEngine); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsOpenCL), Interface.tab_box_openclCustom, Interface.tab_label_openclCustom); #endif gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabs), Interface.tab_box_about, Interface.tab_label_about); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsPrimitives), Interface.tab_box_primitivePlane, Interface.tab_label_primitivePlane); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsPrimitives), Interface.tab_box_primitiveWater, Interface.tab_label_primitiveWater); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsPrimitives), Interface.tab_box_primitiveBox, Interface.tab_label_primitiveBox); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsPrimitives), Interface.tab_box_primitiveBoxInv, Interface.tab_label_primitiveBoxInv); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsPrimitives), Interface.tab_box_primitiveSphere, Interface.tab_label_primitiveSphere); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsPrimitives), Interface.tab_box_primitiveSphereInv, Interface.tab_label_primitiveSphereInv); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsNetRender), Interface.tab_box_server, Interface.tab_label_server); gtk_notebook_append_page(GTK_NOTEBOOK(Interface.tabsNetRender), Interface.tab_box_client, Interface.tab_label_client); //main window pack gtk_container_add(GTK_CONTAINER(window_interface), Interface.boxMain); CreateTooltips(); gtk_widget_show_all(window_interface); //set default sensivity settings ChangedComboFormula(NULL, NULL); ChangedTgladFoldingMode(NULL, NULL); ChangedJulia(NULL, NULL); ChangedSphericalFoldingMode(NULL, NULL); ChangedLimits(NULL, NULL); ChangedMandelboxRotations(NULL, NULL); ChangedAmbientOcclusion(NULL, NULL); ChangedFastAmbientOcclusion(NULL, NULL); ChangedIterFogEnable(NULL, NULL); //Writing default settings WriteInterface(default_settings); interfaceCreated = true; renderRequest = false; //load app settings sAppSettings appParams; #ifdef CLSUPPORT if(LoadAppSettings("mandelbulber_ocl_settings", appParams)) #else if(LoadAppSettings("mandelbulber_settings", appParams)) #endif { WriteInterfaceAppSettings(&appParams); } else { printf("Will be used default settings\n"); } g_timeout_add (100,(GSourceFunc)CallerTimerLoop,NULL); g_timeout_add (100,(GSourceFunc)CallerTimerLoopWindowRefresh,NULL); clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); } void CreateTooltips(void) { #ifndef __sgi gtk_widget_set_tooltip_text(Interface.boxCoordinates, "Coordinates of camera view point in fractal units"); gtk_widget_set_tooltip_text(Interface.comboFractType, "Type of fractal formula"); gtk_widget_set_tooltip_text(Interface.checkJulia, "Fractal will be rendered as Julia fractal\naccording to coordinates of Julia constant"); gtk_widget_set_tooltip_text(Interface.boxJulia, "Coordinates of camera view point in fractal units"); gtk_widget_set_tooltip_text(Interface.boxCoordinates, "Coordinates of camera view point in fractal units"); gtk_widget_set_tooltip_text(Interface.edit_power, "Fractal formula power\nOnly works with trigonometric formulas\nWhen using Tglad's formula, it is a scale factor"); gtk_widget_set_tooltip_text(Interface.edit_maxN, "Maximum number of iterations"); gtk_widget_set_tooltip_text(Interface.edit_minN, "Minimum number of iterations"); gtk_widget_set_tooltip_text(Interface.edit_DE_thresh, "Dynamic DE threshold factor.\n1 = DE threshold equals to 1 screen pixel\nHigher value gives more details"); gtk_widget_set_tooltip_text(Interface.edit_DE_stepFactor, "DE steps fractor.\n1 -> step = Estimated Distance\nLower value gives higher accuracy of finding fractal surface"); gtk_widget_set_tooltip_text(Interface.checkIterThresh, "Iteration count threshold mode"); gtk_widget_set_tooltip_text(Interface.checkLimits, "Enables cross-sections of fractal"); gtk_widget_set_tooltip_text(Interface.boxLimits, "Coordinates of cross-sections (limit box)"); gtk_widget_set_tooltip_text(Interface.edit_alfa, "Camera rotation around vertical axis"); gtk_widget_set_tooltip_text(Interface.edit_beta, "Camera rotation around horizontal axis"); gtk_widget_set_tooltip_text(Interface.edit_zoom, "Camera size. Smaller value gives higher zoom (distance between camera and viewpoint)"); gtk_widget_set_tooltip_text(Interface.edit_persp, "Perspective ratio\n0 = Axonometric projection\nHigher value gives deeper perspective effect"); gtk_widget_set_tooltip_text(Interface.tableArrows, "Camera rotation"); gtk_widget_set_tooltip_text(Interface.tableArrows2, "Camera movement"); gtk_widget_set_tooltip_text(Interface.buInitNavigator, "Initialise camera.\nCamera viewpoint will be moved far and camera very close to viewpoint"); gtk_widget_set_tooltip_text(Interface.buForward, "Move camera forward"); gtk_widget_set_tooltip_text(Interface.buBackward, "Move camera backward"); gtk_widget_set_tooltip_text(Interface.edit_step_forward, "Step length factor\nstep = factor * estimated_distance_to_fractal"); gtk_widget_set_tooltip_text(Interface.edit_step_rotation, "Rotation step in degrees"); gtk_widget_set_tooltip_text(Interface.edit_imageWidth, "Final image width"); gtk_widget_set_tooltip_text(Interface.edit_imageHeight, "Final image height"); gtk_widget_set_tooltip_text(renderWindow.comboImageScale, "Image scale in render window\nSmaller value <-> smaller render window"); gtk_widget_set_tooltip_text(Interface.edit_brightness, "Image brightness"); gtk_widget_set_tooltip_text(Interface.edit_gamma, "Image gamma"); gtk_widget_set_tooltip_text(Interface.edit_contrast, "Image contrast"); gtk_widget_set_tooltip_text(Interface.buApplyImageAdjustments, "Applying all image adjustment changes during or after rendering"); gtk_widget_set_tooltip_text(Interface.edit_shading, "angle of incidence of light effect intensity"); gtk_widget_set_tooltip_text(Interface.edit_shadows, "shadow intensity"); gtk_widget_set_tooltip_text(Interface.edit_specular, "intensity of specularity effect"); gtk_widget_set_tooltip_text(Interface.edit_ambient, "intensity of global ambient light"); gtk_widget_set_tooltip_text(Interface.edit_ambient_occlusion, "intensity of ambient occlusion effect"); gtk_widget_set_tooltip_text(Interface.edit_glow, "intensity of glow effect"); gtk_widget_set_tooltip_text(Interface.edit_reflect, "intensity of texture reflection (environment mapping effect)\nor intersity of raytraced reflections\n"); gtk_widget_set_tooltip_text(Interface.edit_AmbientOcclusionQuality, "ambient occlusion quality\n1 -> 8 rays\n3 -> 64 rays\n5 -> 165 rays\n10 -> 645 rays\n30 -> 5702 rays (hardcore!!!)"); gtk_widget_set_tooltip_text(Interface.checkShadow, "Enable shadows"); gtk_widget_set_tooltip_text(Interface.checkAmbientOcclusion, "Enable ambient occlusion effect"); gtk_widget_set_tooltip_text(Interface.checkFastAmbientOcclusion, "Switch to ambient occlusion based on distance estimation"); gtk_widget_set_tooltip_text(Interface.checkSlowShading, "Enable calculation of light's angle of incidence based on fake gradient estimation\nVery slow but works with all fractal formulas"); gtk_widget_set_tooltip_text(Interface.checkBitmapBackground, "Enable spherical wrapped textured background"); gtk_widget_set_tooltip_text(Interface.checkBitmapBackgroundFulldome, "Beckground texture in FullDome format"); gtk_widget_set_tooltip_text(Interface.checkColoring, "Enable fractal coloring algorithm"); gtk_widget_set_tooltip_text(Interface.edit_color_seed, "Seed for random fractal colors"); gtk_widget_set_tooltip_text(Interface.buColorGlow1, "Glow color - low intensity area"); gtk_widget_set_tooltip_text(Interface.buColorGlow2, "Glow color - high intesity area"); gtk_widget_set_tooltip_text(Interface.buColorBackgroud1, "Color of background top"); gtk_widget_set_tooltip_text(Interface.buColorBackgroud2, "Color of background bottom"); gtk_widget_set_tooltip_text( Interface.buAnimationRecordTrack, "Recording of flight path. First you should set the camera starting position using the 3D Navigator tool and choose a low image resolution. For change of flight direction please use the mouse pointer"); gtk_widget_set_tooltip_text(Interface.buAnimationRenderTrack, "Render animation according to recorded flight path"); gtk_widget_set_tooltip_text(Interface.edit_animationDESpeed, "Flight speed - depends on estimated distance to fractal surface"); gtk_widget_set_tooltip_text(Interface.buRender, "Render and save image"); gtk_widget_set_tooltip_text(Interface.buStop, "Terminate rendering"); gtk_widget_set_tooltip_text(Interface.buFiles, "Configure file paths"); gtk_widget_set_tooltip_text(Interface.buLoadSettings, "Load fractal settings"); gtk_widget_set_tooltip_text(Interface.buSaveSettings, "Save fractal settings"); gtk_widget_set_tooltip_text(Interface.buColorBackgroud1, "Color of background top"); gtk_widget_set_tooltip_text(Interface.edit_mouse_click_distance, "Close-up ratio in mouse clicking mode"); gtk_widget_set_tooltip_text(Interface.frKeyframeAnimation, "Function for rendering animation with keyframes.\n" "All keyframes are stored in keyframes/keyframeXXXXX.fract files\n" "Keyframe files are settings files and can be also loaded and saved using Load Settings and Save Settings\n" "Most of the floating point parameters are interpolated using Catmull-Rom Splines"); gtk_widget_set_tooltip_text(Interface.checkTgladMode, "Additional formula modifier. Cubic folding from Mandelbox formula"); gtk_widget_set_tooltip_text(Interface.checkSphericalFoldingMode, "Additional formula modifier. Spherical folding from Mandelbox formula"); for (int i = 1; i < HYBRID_COUNT; ++i) gtk_widget_set_tooltip_text(Interface.comboHybridFormula[i-1], g_strdup_printf("Formula #%d in sequence", i)); gtk_widget_set_tooltip_text(Interface.comboHybridFormula[HYBRID_COUNT-1], g_strdup_printf("Formula #%d in sequence. When cyclic loop is disabled, then this formula will be used for the rest of iterations and cannot be set as NONE", HYBRID_COUNT - 1)); for (int i = 1; i < HYBRID_COUNT; ++i) gtk_widget_set_tooltip_text(Interface.edit_hybridIter[i-1], g_strdup_printf("Number of iterations for formula #%d", i)); gtk_widget_set_tooltip_text(Interface.edit_hybridIter[HYBRID_COUNT-1], g_strdup_printf("Number of iterations for the %dth formula (not used when cyclic loop is enabled)", HYBRID_COUNT-1)); for (int i = 1; i < HYBRID_COUNT; ++i) gtk_widget_set_tooltip_text(Interface.edit_hybridPower[i-1], g_strdup_printf("Power / scale parameter for formula #%d", i)); gtk_widget_set_tooltip_text(Interface.checkHybridCyclic, "When enabled, the formula sequence is looped"); gtk_widget_set_tooltip_text(Interface.checkNavigatorAbsoluteDistance, "Movement step distance will be constant (absolute)"); gtk_widget_set_tooltip_text(Interface.edit_NavigatorAbsoluteDistance, "Absolute movement step distance"); gtk_widget_set_tooltip_text(Interface.edit_color_speed, "Colour variation speed"); gtk_widget_set_tooltip_text(Interface.buRandomPalette, "Generates random palette according to entered random seed"); gtk_widget_set_tooltip_text(Interface.buGetPaletteFromImage, "Grab colours from selected image"); gtk_widget_set_tooltip_text(Interface.sliderFogDepth, "Visibility distance measured from Front value"); gtk_widget_set_tooltip_text(Interface.sliderFogDepth, "Front distance of fog"); gtk_widget_set_tooltip_text(Interface.buAutoDEStep, "Scan for optimal DE factor for low image quality"); gtk_widget_set_tooltip_text(Interface.buAutoDEStepHQ, "Scan for optimal DE factor for high image quality"); gtk_widget_set_tooltip_text(Interface.checkConstantDEThreshold, "Switches to constant DE threshold mode\nDetail size not depends on image resolution and perspective depthness"); gtk_widget_set_tooltip_text(Interface.checkNetRenderServerEnable, "Enables server for render farm. Specified port must be not firewalled"); gtk_widget_set_tooltip_text(Interface.checkNetRenderServerScan, "Enables scanning for client-applications. It will wait for clients as long as it is needed\n" "During scanning time all clients have to enabled\n" "When the client will be found there will be displayed his IP addres\n" "When looking for clients will be done, uncheck scanning icon"); gtk_widget_set_tooltip_text(Interface.checkNetRenderClientEnable, "Connects the client to specified server\n" "Enabling the client have to be done when scanning function on server side is enabled"); #endif } bool ReadComandlineParams(int argc, char *argv[]) { noGUIdata.animMode = false; noGUIdata.keyframeMode = false; noGUIdata.playMode = false; noGUIdata.startFrame = 0; noGUIdata.endFrame = 99999; noGUIdata.imageFormat = imgFormatJPG; noGUIdata.netrenderMode = false; strcpy(noGUIdata.netRenderPortString, "5555"); strcpy(noGUIdata.settingsFile, "default.fract"); bool result = true; if (argc > 1) { for (int i = 1; i < argc; i++) { //printf("%s*\n", argv[i]); if (strcmp(argv[i], "-nogui") == 0) { noGUI = true; printf("commandline: no GUI mode\n"); continue; } if (strcmp(argv[i], "-flight") == 0) { noGUIdata.animMode = true; noGUIdata.playMode = true; printf("commandline: flight mode\n"); continue; } if (strcmp(argv[i], "-keyframe") == 0) { noGUIdata.animMode = true; noGUIdata.keyframeMode = true; printf("commandline: keyframe mode\n"); continue; } if (strcmp(argv[i], "-start") == 0) { i++; if (i < argc) { noGUIdata.startFrame = atoi(argv[i]); printf("commandline: start frame = %d\n", noGUIdata.startFrame); continue; } } if (strcmp(argv[i], "-end") == 0) { i++; if (i < argc) { noGUIdata.endFrame = atoi(argv[i]); printf("commandline: end frame = %d\n", noGUIdata.endFrame); continue; } } if (strcmp(argv[i], "-format") == 0) { i++; if (i < argc && (strcmp(argv[i], "jpg") == 0)) { noGUIdata.imageFormat = imgFormatJPG; printf("commandline: JPG image format\n"); continue; } else if (i < argc && (strcmp(argv[i], "png") == 0)) { noGUIdata.imageFormat = imgFormatPNG; printf("commandline: PNG image format\n"); continue; } else if (i < argc && (strcmp(argv[i], "png16") == 0)) { noGUIdata.imageFormat = imgFormatPNG16; printf("commandline: PNG 16-bit image format\n"); continue; } else if (i < argc && (strcmp(argv[i], "png16alpha") == 0)) { noGUIdata.imageFormat = imgFormatPNG16Alpha; printf("commandline: PNG 16-bit with alpha channel image format\n"); continue; } else { printf("commandline: wrong image format\n"); goto bad_arg; } } if (strcmp(argv[i], "-res") == 0) { i++; if(i < argc) { int w, h; int res = sscanf(argv[i], "%dx%d", &w, &h); if(res != 2) { printf("commandline: Argument must be -res WWWWxHHHH\n"); goto bad_arg; } else { static char width_override[100], height_override[100]; snprintf(width_override, sizeof(width_override), "image_width=%d", w); snprintf(height_override, sizeof(height_override), "image_height=%d", h); noGUIdata.overrideStrings.push_back(width_override); noGUIdata.overrideStrings.push_back(height_override); continue; } } else { printf("commandline: Argument must be -res WWWWxHHHH\n"); goto bad_arg; } } if (strcmp(argv[i], "-fpk") == 0) { i++; if(i < argc) { int fpk = atoi(argv[i]); if(fpk <= 0) { printf("commandline: argument must be -fpk NNN\n"); goto bad_arg; } else { static char fpk_override[100]; snprintf(fpk_override, sizeof(fpk_override), "frames_per_keyframe=%d", fpk); noGUIdata.overrideStrings.push_back(fpk_override); continue; } } else { printf("commandline: argument must be -fpk NNN\n"); goto bad_arg; } } if (strcmp(argv[i], "-ip") == 0) { i++; if(i < argc) { if(strlen(argv[i]) < 20) { strcpy(noGUIdata.netRenderIPString, argv[i]); noGUIdata.netrenderMode = true; continue; } else { printf("commandline: argument must be e.g. -ip 192.168.0.1\n"); goto bad_arg; } } } if (strcmp(argv[i], "-port") == 0) { i++; if(i < argc) { if(strlen(argv[i]) < 6) { strcpy(noGUIdata.netRenderPortString, argv[i]); continue; } else { printf("commandline: argument must be -port NUMBER\n"); goto bad_arg; } } } if (strcmp(argv[i], "-o") == 0) { i++; if(i < argc) { noGUIdata.overrideStrings.push_back(argv[i]); continue; } else { printf("commandline: need override argument after -o\n"); } } if (i < argc - 1 || (strcmp(argv[i], "-help") == 0)) { bad_arg: printf("commandline: wrong parameters\n"); printf("Syntax:\nmandelbulber [options...] [settings_file]\n"); printf("options:\n"); printf(" -nogui - start program without GUI\n"); printf(" -flight - render flight animation\n"); printf(" -keyframe - render keyframe animation\n"); printf(" -start N - start renderig from frame number N\n"); printf(" -end N - rendering will end on frame number N\n"); printf(" -o key=value - override item 'key' from settings file with new value 'value'\n"); printf(" -res WIDTHxHEIGHT - override image resolution\n"); printf(" -fpk N - override frames per key parameter\n"); printf(" -ip N.N.N.N - set application as a client connected to server of given IP address\n"); printf(" -port - set network port number for Netrender (default 5555)\n"); printf(" -format FORMAT - image output format\n"); printf(" jpg - JPEG format\n"); printf(" png - PNG format\n"); printf(" png16 - 16-bit PNG format\n"); printf(" png16alpha - 16-bit PNG with alpha channel format\n"); printf("[settings_file] - file with fractal settings (program also tries\nto find file in ./mandelbulber/settings directory)\n"); printf("When settings_file is put as command argument then program will start in noGUI mode\n"); result = false; break; } else { strcpy(noGUIdata.settingsFile, argv[i]); printf("commandline: settings file: %s\n", noGUIdata.settingsFile); noGUI = true; } } } return result; } void Params2InterfaceData(sParamRender *source) { strcpy(Interface_data.file_destination, source->file_destination); strcpy(Interface_data.file_background, source->file_background); strcpy(Interface_data.file_envmap, source->file_envmap); strcpy(Interface_data.file_lightmap, source->file_lightmap); strcpy(Interface_data.file_path, source->file_path); strcpy(Interface_data.file_keyframes, source->file_keyframes); Interface_data.franeNo = source->fractal.frameNo; Interface_data.tileCount = source->tileCount; } void InterfaceData2Params(sParamRender *dest) { strcpy(dest->file_destination, Interface_data.file_destination); strcpy(dest->file_background, Interface_data.file_background); strcpy(dest->file_envmap, Interface_data.file_envmap); strcpy(dest->file_lightmap, Interface_data.file_lightmap); strcpy(dest->file_path, Interface_data.file_path); strcpy(dest->file_keyframes, Interface_data.file_keyframes); dest->fractal.frameNo = Interface_data.franeNo; dest->tileCount = Interface_data.tileCount; } void CheckPrameters(sParamRender *params) { if(params->doubles.zoom <= 1e-15) params->doubles.zoom = 1e-15; if(params->doubles.DE_factor <= 0.0001) params->doubles.DE_factor = 0.0001; if(params->doubles.smoothness <= 0.00001) params->doubles.smoothness = 0.00001; if(params->doubles.persp <= 0.001) params->doubles.persp = 0.001; if(params->globalIlumQuality >=30) params->globalIlumQuality = 30; if(params->globalIlumQuality <=1) params->globalIlumQuality = 1; if(params->image_width < 32) params->image_width = 32; if(params->image_height < 32) params->image_height = 32; if(params->reflectionsMax > 100) params->reflectionsMax = 100; if(params->noOfTiles < 1) params->noOfTiles = 1; if(params->noOfTiles > 100) params->noOfTiles = 100; if(params->doubles.fogDensity < 0.0) params->doubles.fogDensity = 0.0; if(params->doubles.imageAdjustments.reflect < 0.0) params->doubles.imageAdjustments.reflect = 0.0; } sRGB GdkColor2sRGB(GdkColor color) { sRGB color2; color2.R = color.red; color2.G = color.green; color2.B = color.blue; return color2; } GdkColor sRGB2GdkColor(sRGB color) { GdkColor color2; color2.red = color.R; color2.green = color.G; color2.blue = color.B; color2.pixel = 0; return color2; } sRGB sRGBDiv256(sRGB color) { sRGB color2; color2.R = color.R/256; color2.G = color.G/256; color2.B = color.B/256; return color2; } //#define CLSUPPORT #ifdef CLSUPPORT void Params2Cl(const sParamRender *params, sClInBuff *clInBuff, sClInConstants *clConstantsBuff) { sClParams *clParams = &clConstantsBuff->params; sClFractal *clFractal = &clConstantsBuff->fractal; clParams->alpha = params->doubles.alpha; clParams->beta = params->doubles.beta; clParams->gamma = params->doubles.gamma; clParams->height = clSupport->GetHeight(); clParams->width = clSupport->GetWidth(); clParams->persp = params->doubles.persp; clParams->vp = CVector2float3(params->doubles.vp); clParams->zoom = params->doubles.zoom; clParams->DEfactor = params->doubles.DE_factor; clParams->quality = params->doubles.quality; clParams->slowShading = params->slowShading; clParams->mainLightAlfa = params->doubles.mainLightAlpha; clParams->mainLightBeta = params->doubles.mainLightBeta; clFractal->N = params->fractal.doubles.N; clFractal->power = params->fractal.doubles.power; clFractal->juliaMode = params->fractal.juliaMode; clFractal->mandelbox.scale = params->fractal.mandelbox.doubles.scale; clFractal->mandelbox.foldingLimit = params->fractal.mandelbox.doubles.foldingLimit; clFractal->mandelbox.foldingValue = params->fractal.mandelbox.doubles.foldingValue; clFractal->mandelbox.minRadius = params->fractal.mandelbox.doubles.foldingSphericalMin; clFractal->mandelbox.fixedRadius = params->fractal.mandelbox.doubles.foldingSphericalFixed; clFractal->mandelbox.mainRot = RotMatrix2matrix33(params->fractal.mandelbox.mainRot); for (int i = 0; i < 6; i++) { clFractal->mandelbox.rot[i] = RotMatrix2matrix33(params->fractal.mandelbox.rot[i % 2][i / 2]); clFractal->mandelbox.rotinv[i] = RotMatrix2matrix33(params->fractal.mandelbox.rotinv[i % 2][i / 2]); } clFractal->mandelbox.rotEnabled = params->fractal.mandelbox.rotationsEnabled; clFractal->mandelbox.colorFactorX = params->fractal.mandelbox.doubles.colorFactorX; clFractal->mandelbox.colorFactorX = params->fractal.mandelbox.doubles.colorFactorY; clFractal->mandelbox.colorFactorX = params->fractal.mandelbox.doubles.colorFactorZ; clFractal->formula = params->fractal.formula; clFractal->julia = CVector2float3(params->fractal.doubles.julia); clFractal->constantDEThreshold = params->fractal.constantDEThreshold; clFractal->fractalConstantFactor = params->fractal.doubles.constantFactor; clFractal->ifs.absX = params->fractal.IFS.absX; clFractal->ifs.absY = params->fractal.IFS.absY; clFractal->ifs.absZ = params->fractal.IFS.absZ; clFractal->ifs.mengerSpongeMode = params->fractal.IFS.mengerSpongeMode; clFractal->ifs.rotationAlpha = params->fractal.IFS.doubles.rotationAlfa; clFractal->ifs.rotationBeta = params->fractal.IFS.doubles.rotationBeta; clFractal->ifs.rotationGamma = params->fractal.IFS.doubles.rotationGamma; clFractal->ifs.scale = params->fractal.IFS.doubles.scale; clFractal->ifs.offset = CVector2float3(params->fractal.IFS.doubles.offset); clFractal->ifs.edge = CVector2float3(params->fractal.IFS.doubles.edge); clFractal->ifs.mainRot = RotMatrix2matrix33(params->fractal.IFS.mainRot); for(int i=0; i<9; i++) { clFractal->ifs.enabled[i] = params->fractal.IFS.enabled[i]; clFractal->ifs.rot[i] = RotMatrix2matrix33(params->fractal.IFS.rot[i]); clFractal->ifs.distance[i] = params->fractal.IFS.doubles.distance[i]; clFractal->ifs.alpha[i] = params->fractal.IFS.doubles.alfa[i]; clFractal->ifs.beta[i] = params->fractal.IFS.doubles.beta[i]; clFractal->ifs.gamma[i] = params->fractal.IFS.doubles.gamma[i]; clFractal->ifs.intensity[i] = params->fractal.IFS.doubles.intensity[i]; clFractal->ifs.direction[i] = CVector2float3(params->fractal.IFS.doubles.direction[i]); } clFractal->opacity = params->doubles.iterFogOpacity; clFractal->opacityTrim = params->doubles.iterFogOpacityTrim; clFractal->fakeLightsMinIter = params->fractal.fakeLightsMinIter; clFractal->fakeLightsMaxIter = params->fractal.fakeLightsMaxIter; clFractal->customOCLFormulaDEMode = params->fractal.customOCLFormulaDEMode; clFractal->linearDEmode = params->fractal.linearDEmode; for(int i=0; i<15; i++) clFractal->custom[i] = params->fractal.doubles.customParameters[i]; clFractal->amin = params->fractal.doubles.amin; clFractal->amax = params->fractal.doubles.amax; clFractal->bmin = params->fractal.doubles.bmin; clFractal->bmax = params->fractal.doubles.bmax; clFractal->cmin = params->fractal.doubles.cmin; clFractal->cmax = params->fractal.doubles.cmax; clFractal->limitsEnabled = params->fractal.limits_enabled; clFractal->interiorMode = params->fractal.interiorMode; clFractal->primitives.planeEnable = params->fractal.primitives.planeEnable; clFractal->primitives.boxEnable = params->fractal.primitives.boxEnable; clFractal->primitives.invertedBoxEnable = params->fractal.primitives.invertedBoxEnable; clFractal->primitives.sphereEnable = params->fractal.primitives.sphereEnable; clFractal->primitives.invertedSphereEnable = params->fractal.primitives.invertedSphereEnable; clFractal->primitives.waterEnable = params->fractal.primitives.waterEnable; clFractal->primitives.planeCentre = CVector2float3(params->fractal.doubles.primitives.planeCentre); clFractal->primitives.planeNormal = CVector2float3(params->fractal.doubles.primitives.planeNormal); clFractal->primitives.boxCentre = CVector2float3(params->fractal.doubles.primitives.boxCentre); clFractal->primitives.boxSize = CVector2float3(params->fractal.doubles.primitives.boxSize); clFractal->primitives.invertedBoxCentre = CVector2float3(params->fractal.doubles.primitives.invertedBoxCentre); clFractal->primitives.invertedBoxSize = CVector2float3(params->fractal.doubles.primitives.invertedBoxSize); clFractal->primitives.sphereCentre = CVector2float3(params->fractal.doubles.primitives.sphereCentre); clFractal->primitives.invertedSphereCentre = CVector2float3(params->fractal.doubles.primitives.invertedSphereCentre); clFractal->primitives.sphereRadius = params->fractal.doubles.primitives.sphereRadius; clFractal->primitives.invertedSphereRadius = params->fractal.doubles.primitives.invertedSphereRadius; clFractal->primitives.waterHeight = params->fractal.doubles.primitives.waterHeight; clFractal->primitives.waterAmplitude = params->fractal.doubles.primitives.waterAmplitude; clFractal->primitives.waterLength = params->fractal.doubles.primitives.waterLength; clFractal->primitives.waterRotation = params->fractal.doubles.primitives.waterRotation; clFractal->primitives.waterAnimSpeed = params->fractal.doubles.primitives.waterAnimSpeed; clFractal->primitives.waterIterations = params->fractal.primitives.waterIterations; clFractal->primitives.primitivePlaneReflect = params->doubles.primitivePlaneReflect; clFractal->primitives.primitiveBoxReflect = params->doubles.primitiveBoxReflect; clFractal->primitives.primitiveInvertedBoxReflect = params->doubles.primitiveInvertedBoxReflect; clFractal->primitives.primitiveSphereReflect = params->doubles.primitiveSphereReflect; clFractal->primitives.primitiveInvertedSphereReflect = params->doubles.primitiveInvertedSphereReflect; clFractal->primitives.primitiveWaterReflect = params->doubles.primitiveWaterReflect; clFractal->primitives.primitivePlaneColour = sRGB2float3(params->primitivePlaneColour, 65536.0); clFractal->primitives.primitiveBoxColour = sRGB2float3(params->primitiveBoxColour, 65536.0); clFractal->primitives.primitiveInvertedBoxColour = sRGB2float3(params->primitiveInvertedBoxColour, 65536.0); clFractal->primitives.primitiveSphereColour = sRGB2float3(params->primitiveSphereColour, 65536.0); clFractal->primitives.primitiveInvertedSphereColour = sRGB2float3(params->primitiveInvertedSphereColour, 65536.0); clFractal->primitives.primitiveWaterColour = sRGB2float3(params->primitiveWaterColour, 65536.0); clFractal->frameNo = params->fractal.frameNo; clFractal->deltaDEStep = params->fractal.doubles.deltaDEStep; for(int i=0; i<256; i++) { clInBuff->palette[i].x = params->palette[i].R/256.0; clInBuff->palette[i].y = params->palette[i].G/256.0; clInBuff->palette[i].z = params->palette[i].B/256.0; clInBuff->palette[i].w = 0.0; } clParams->colouringSpeed = params->doubles.imageAdjustments.coloring_speed; clParams->colouringOffset = params->doubles.imageAdjustments.paletteOffset; clParams->ambientOcclusionIntensity = params->doubles.imageAdjustments.globalIlum; clParams->specularIntensity = params->doubles.imageAdjustments.specular; clParams->mainLightIntensity = params->doubles.imageAdjustments.directLight * params->doubles.imageAdjustments.mainLightIntensity; clParams->shading = params->doubles.imageAdjustments.shading; clParams->glowIntensity = params->doubles.imageAdjustments.glow_intensity; clParams->colouringEnabled = params->imageSwitches.coloringEnabled; clParams->fastAmbientOcclusionEnabled = (params->fastGlobalIllumination); clParams->slowAmbientOcclusionEnabled = params->global_ilumination && !params->fastGlobalIllumination; clParams->shadowConeAngle = params->doubles.shadowConeAngle; clParams->penetratingLights = params->penetratingLights; clParams->viewDistanceMax = params->doubles.viewDistanceMax; clParams->shadow = params->shadow; clParams->reflectionsMax = params->reflectionsMax; if(!params->imageSwitches.raytracedReflections) clParams->reflectionsMax = 0; clParams->reflect = params->doubles.imageAdjustments.reflect; clParams->globalIlumQuality = params->globalIlumQuality; clParams->fastAoTune = params->doubles.fastAoTune; clParams->fogVisibility = pow(10.0, params->doubles.imageAdjustments.fogVisibility / 10 - 16.0); clParams->fogEnabled = params->imageSwitches.fogEnabled; clParams->auxLightIntensity = params->doubles.auxLightIntensity; clParams->SSAOquality = params->SSAOQuality; clParams->fogColour = sRGB2float3(params->effectColours.fogColor, 65536.0); clParams->glowColour1 = sRGB2float3(params->effectColours.glow_color1, 65536.0); clParams->glowColour2 = sRGB2float3(params->effectColours.glow_color2, 65536.0); clParams->backgroundColour1 = sRGB2float3(params->background_color1, 65536.0); clParams->backgroundColour2 = sRGB2float3(params->background_color2, 65536.0); clParams->backgroundColour3 = sRGB2float3(params->background_color3, 65536.0); clParams->mainLightColour = sRGB2float3(params->effectColours.mainLightColour, 65536.0); clParams->fogColour1Distance = params->doubles.fogColour1Distance; clParams->fogColour2Distance = params->doubles.fogColour2Distance; clParams->fogDensity = params->doubles.fogDensity; clParams->fogDistanceFactor = params->doubles.fogDistanceFactor; clParams->fogColour1 = sRGB2float3(params->fogColour1, 65536.0); clParams->fogColour2 = sRGB2float3(params->fogColour2, 65536.0); clParams->fogColour3 = sRGB2float3(params->fogColour3, 65536.0); clParams->DOFEnabled = params->DOFEnabled; clParams->DOFFocus = pow(10, params->doubles.DOFFocus / 10.0 - 16.0); clParams->DOFRadius = params->doubles.DOFRadius; clParams->DOFmethod = params->OpenCLDOFMethod; clParams->auxLightVisibility = params->doubles.auxLightVisibility; int lightCount = 0; for(int i = 0; i < 4; i++) { if (Lights[i].enabled) lightCount = i+1; } int numberOfLights = max(lightCount, params->auxLightNumber); clParams->auxLightNumber = numberOfLights; for(int i = 0; i < clParams->auxLightNumber; i++) { clInBuff->lights[i].enabled = Lights[i].enabled; clInBuff->lights[i].intensity = Lights[i].intensity; clInBuff->lights[i].position = CVector2float3(Lights[i].position); clInBuff->lights[i].colour = sRGB2float3(Lights[i].colour, 65536.0); } clParams->imageBrightness = params->doubles.imageAdjustments.brightness; clParams->imageContrast = params->doubles.imageAdjustments.contrast; clParams->imageGamma = params->doubles.imageAdjustments.imageGamma; clParams->hdrEnabled = params->imageSwitches.hdrEnabled; clParams->perspectiveType = params->perspectiveType; clParams->fishEyeCut = params->fishEyeCut; clParams->iterFogEnabled = params->imageSwitches.iterFogEnabled; clParams->iterFogOpacity = params->doubles.iterFogOpacity; clParams->iterFogOpacityTrim = params->doubles.iterFogOpacityTrim; for(int i=0; i < 5; i++) { clParams->volumetricLightEnabled[i] = params->volumetricLightEnabled[i]; clParams->volumetricLightIntensity[i] = params->doubles.volumetricLightIntensity[i]; } clParams->volumetricLightEnabledAny = params->imageSwitches.volumetricLightEnabled; clParams->fakeLightsEnabled = params->fakeLightsEnabled; clParams->fakeLightsIntensity = params->doubles.fakeLightsIntensity; clParams->fakeLightsVisibility = params->doubles.fakeLightsVisibility; clParams->fakeLightsVisibilitySize = params->doubles.fakeLightsVisibilitySize; clParams->fakeLightsOrbitTrap = CVector2float3(params->fractal.doubles.fakeLightsOrbitTrap); clParams->texturedBackground = params->texturedBackground; } matrix33 RotMatrix2matrix33(CRotationMatrix rot) { matrix33 rot33; CMatrix33 matrix = rot.GetMatrix(); rot33.m1 = (cl_float3){{matrix.m11, matrix.m12, matrix.m13}}; rot33.m2 = (cl_float3){{matrix.m21, matrix.m22, matrix.m23}}; rot33.m3 = (cl_float3){{matrix.m31, matrix.m32, matrix.m33}}; return rot33; } cl_float3 CVector2float3(CVector3 vect) { cl_float3 vect2 = (cl_float3){{vect.x, vect.y, vect.z}}; return vect2; } cl_float3 sRGB2float3(sRGB colour, double factor) { cl_float3 col = (cl_float3){{colour.R / factor, colour.G / factor, colour.B / factor}}; return col; } #endif mandelbulber1.21-1.orig/src/timeline.hpp0000644000175000017500000000323412274512437021164 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for animation timeline / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef TIMELINE_HPP_ #define TIMELINE_HPP_ #include "database.hpp" #include "cimage.hpp" #include "smartptr.h" #include "files.h" #include "interface.h" #include "settings.h" #include "callbacks.h" gboolean thumbnail_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data); void PressedKeyframeThumbnail(GtkWidget *widget, GdkEventButton *event); struct sTimelineRecord { int index; sRGB8 thumbnail[128*128]; }; class cTimeline { public: cTimeline(); ~cTimeline(); bool IsCreated(void) {return isCreated;} int Initialize(const char *keyframesPath); //returns number of keyframes bool GetImage(int index, sRGB8 *image); void DisplayInDrawingArea(int index, GtkWidget *darea); int CheckNumberOfKeyframes(const char *keyframesPath); void CreateInterface(int numberOfKeyframes); void RebulidTimelineWindow(void); void RecordKeyframe(int index, const char *keyframeFile, bool modeInsert); void DeleteKeyframe(int index, const char *keyframesPath); void Resize(int newsize); void Reset(void); void Refresh(void); void UpdateGlobalMorph(void); void GetFrameParamsInterpolated(int index, int framesPerKey, sParamRenderD *params); int GetKeyframeCount(void) {return keyframeCount;} bool isOpened; private: smart_ptr database; int keyframeCount; bool isCreated; CMorph *morphParamRenderGlobal; }; extern smart_ptr timeline; #endif /* TIMELINE_HPP_ */ mandelbulber1.21-1.orig/src/settings.cpp0000644000175000017500000023243212274512437021215 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions loading and saving parameters / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / / many improvements done by Rayan Hitchman ********************************************************/ #include #include #include #include "files.h" #include "interface.h" #include "shaders.h" #include "settings.h" #include "smartptr.h" using namespace std; char data_directory[1000]; const char* axis_names[] = {"X", "Y", "Z"}; const char* component_names[] = {"alfa", "beta", "gamma"}; bool paletteLoadedFromSettingsFile = false; void fprintfDot(FILE *file, const char *string, double value, double defaultVal, bool compare) { bool theSame = true; if(value >= 0 && (value < defaultVal*0.9999999999 || value > defaultVal*1.0000000001)) theSame = false; if(value < 0 && (value > defaultVal*0.9999999999 || value < defaultVal*1.0000000001)) theSame = false; if (compare && !theSame) { char str[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_dtostr(str, sizeof(str), value); fprintf(file, "%s %s;\n", string, str); } if(!compare) { char str[G_ASCII_DTOSTR_BUF_SIZE]; g_ascii_dtostr(str, sizeof(str), defaultVal); fprintf(file, "%s %s;\n", string, str); } } void fprintfInt(FILE *file, const char *string, int value, int defaultVal, bool compare) { if (compare && value != defaultVal) { fprintf(file, "%s %d;\n", string, value); } if(!compare) { fprintf(file, "%s %d;\n", string, defaultVal); } } double atof2(const char *str) { char *end; double v = g_ascii_strtod(str, &end); if(end && *end == localeconv()->decimal_point[0]) { // end did not point to the string's terminating NUL, // but to the radix character of the user's locale. // This must be a "-o" commandline- setting, so convert // the value using locale-aware strtod v = strtod(str, NULL); } return v; } void MakePaletteString(const sRGB *palette, char *paletteString) { int length; int pointer = 0; for (int i = 0; i < 256; i++) { int colour = palette[i].R * 65536 + palette[i].G * 256 + palette[i].B; colour = colour & 0x00FFFFFF; length = sprintf(&paletteString[pointer], "%x ", colour); pointer += length; } } void GetPaletteFromString(sRGB *palette, const char *paletteString) { int index = 0; for (int i = 0; i < 2000; i++) { int colour = 0; sscanf(&paletteString[i], "%x", (unsigned int*)&colour); sRGB rgbColour; rgbColour.R = colour / 65536; rgbColour.G = (colour / 256) % 256; rgbColour.B = colour % 256; palette[index] = rgbColour; //printf("R = %d, G = %d, B = %d\n", rgbColour.R, rgbColour.G, rgbColour.B); while (i < 2000 && paletteString[i] != ' ') { i++; } index++; if (index == 256) { paletteLoadedFromSettingsFile = true; break; } } } void SaveSettings(const char *filename, const sParamRender& params, bool compare) { char *paletteString = new char[257 * 7]; memset(paletteString, 0, 257 * 7); MakePaletteString(params.palette, paletteString); FILE * fileSettings; fileSettings = fopen(filename, "w"); char parameterName[100]; fprintfDot(fileSettings, "Mandelbulber", MANDELBULBER_VERSION, MANDELBULBER_VERSION, false); fprintfInt(fileSettings, "image_width", params.image_width, 800, compare); fprintfInt(fileSettings, "image_height", params.image_height, 600, compare); fprintfInt(fileSettings, "tiles", params.noOfTiles, 1, compare); fprintfDot(fileSettings, "x_min", params.fractal.doubles.amin, -10.0, compare); fprintfDot(fileSettings, "x_max", params.fractal.doubles.amax, 10.0, compare); fprintfDot(fileSettings, "y_min", params.fractal.doubles.bmin, -10.0, compare); fprintfDot(fileSettings, "y_max", params.fractal.doubles.bmax, 10.0, compare); fprintfDot(fileSettings, "z_min", params.fractal.doubles.cmin, -10.0, compare); fprintfDot(fileSettings, "z_max", params.fractal.doubles.cmax, 10.0, compare); fprintfDot(fileSettings, "view_point_x", params.doubles.vp.x, 0.0, compare); fprintfDot(fileSettings, "view_point_y", params.doubles.vp.y, 0.0, compare); fprintfDot(fileSettings, "view_point_z", params.doubles.vp.z, 0.0, compare); fprintfDot(fileSettings, "angle_alfa", params.doubles.alpha * 180.0 / M_PI, -20, compare); fprintfDot(fileSettings, "angle_beta", params.doubles.beta * 180.0 / M_PI, 30, compare); fprintfDot(fileSettings, "angle_gamma", params.doubles.gamma * 180.0 / M_PI, 0.0, compare); fprintfDot(fileSettings, "zoom", params.doubles.zoom, 2.5, compare); fprintfDot(fileSettings, "perspective", params.doubles.persp, 0.5, compare); fprintfInt(fileSettings, "formula", params.fractal.formula, trig_optim, compare); fprintfDot(fileSettings, "power", params.fractal.doubles.power, 9.0, compare); fprintfInt(fileSettings, "N", params.fractal.doubles.N, 250, compare); fprintfInt(fileSettings, "minN", params.fractal.minN, 1, compare); fprintfDot(fileSettings, "fractal_constant_factor", params.fractal.doubles.constantFactor, 1.0, compare); fprintfDot(fileSettings, "quality", params.doubles.quality, 1.0, compare); fprintfDot(fileSettings, "smoothness", params.doubles.smoothness, 1.0, compare); fprintfInt(fileSettings, "julia_mode", params.fractal.juliaMode, false, compare); fprintfDot(fileSettings, "julia_a", params.fractal.doubles.julia.x, 0.0, compare); fprintfDot(fileSettings, "julia_b", params.fractal.doubles.julia.y, 0.0, compare); fprintfDot(fileSettings, "julia_c", params.fractal.doubles.julia.z, 0.0, compare); fprintfInt(fileSettings, "tglad_folding_mode", params.fractal.tgladFoldingMode, false, compare); fprintfDot(fileSettings, "folding_limit", params.fractal.doubles.foldingLimit, 1.0, compare); fprintfDot(fileSettings, "folding_value", params.fractal.doubles.foldingValue, 2.0, compare); fprintfInt(fileSettings, "spherical_folding_mode", params.fractal.sphericalFoldingMode, false, compare); fprintfDot(fileSettings, "spherical_folding_fixed", params.fractal.doubles.foldingSphericalFixed, 1.0, compare); fprintfDot(fileSettings, "spherical_folding_min", params.fractal.doubles.foldingSphericalMin, 0.5, compare); fprintfInt(fileSettings, "IFS_folding_mode", params.fractal.IFS.foldingMode, false, compare); fprintfInt(fileSettings, "iteration_threshold_mode", params.fractal.iterThresh, false, compare); fprintfInt(fileSettings, "analityc_DE_mode", params.fractal.analitycDE, true, compare); fprintfDot(fileSettings, "DE_factor", params.doubles.DE_factor, 1.0, compare); fprintfDot(fileSettings, "brightness", params.doubles.imageAdjustments.brightness, 1.0, compare); fprintfDot(fileSettings, "contrast", params.doubles.imageAdjustments.contrast, 1.0, compare); fprintfDot(fileSettings, "gamma", params.doubles.imageAdjustments.imageGamma, 1.0, compare); fprintfInt(fileSettings, "hdr", params.imageSwitches.hdrEnabled, false, compare); fprintfDot(fileSettings, "ambient", params.doubles.imageAdjustments.ambient, 0.0, compare); fprintfDot(fileSettings, "reflect", params.doubles.imageAdjustments.reflect, 0.0, compare); fprintfDot(fileSettings, "shadows_intensity", params.doubles.imageAdjustments.directLight, 0.7, compare); fprintfDot(fileSettings, "shadows_cone_angle", params.doubles.shadowConeAngle, 1.0, compare); fprintfDot(fileSettings, "ambient_occlusion", params.doubles.imageAdjustments.globalIlum, 1.0, compare); fprintfInt(fileSettings, "ambient_occlusion_quality", params.globalIlumQuality, 4, compare); fprintfDot(fileSettings, "ambient_occlusion_fast_tune", params.doubles.fastAoTune, 1.0, compare); fprintfDot(fileSettings, "shading", params.doubles.imageAdjustments.shading, 1.0, compare); fprintfDot(fileSettings, "specular", params.doubles.imageAdjustments.specular, 1.0, compare); fprintfDot(fileSettings, "glow_intensity", params.doubles.imageAdjustments.glow_intensity, 1.0, compare); fprintfInt(fileSettings, "glow_color_1_R", params.effectColours.glow_color1.R, 40984, compare); fprintfInt(fileSettings, "glow_color_1_G", params.effectColours.glow_color1.G, 44713, compare); fprintfInt(fileSettings, "glow_color_1_B", params.effectColours.glow_color1.B, 49490, compare); fprintfInt(fileSettings, "glow_color_2_R", params.effectColours.glow_color2.R, 57192, compare); fprintfInt(fileSettings, "glow_color_2_G", params.effectColours.glow_color2.G, 60888, compare); fprintfInt(fileSettings, "glow_color_2_B", params.effectColours.glow_color2.B, 62408, compare); fprintfInt(fileSettings, "background_color_1_R", params.background_color1.R, 0, compare); fprintfInt(fileSettings, "background_color_1_G", params.background_color1.G, 38306, compare); fprintfInt(fileSettings, "background_color_1_B", params.background_color1.B, 65535, compare); fprintfInt(fileSettings, "background_color_2_R", params.background_color2.R, 65535, compare); fprintfInt(fileSettings, "background_color_2_G", params.background_color2.G, 65535, compare); fprintfInt(fileSettings, "background_color_2_B", params.background_color2.B, 65535, compare); fprintfInt(fileSettings, "background_color_3_R", params.background_color3.R, 0, compare); fprintfInt(fileSettings, "background_color_3_G", params.background_color3.G, 10000, compare); fprintfInt(fileSettings, "background_color_3_B", params.background_color3.B, 500, compare); fprintfInt(fileSettings, "fog_colour_1_R", params.fogColour1.R, 0, compare); fprintfInt(fileSettings, "fog_colour_1_G", params.fogColour1.G, 0, compare); fprintfInt(fileSettings, "fog_colour_1_B", params.fogColour1.B, 0, compare); fprintfInt(fileSettings, "fog_colour_2_R", params.fogColour2.R, 0, compare); fprintfInt(fileSettings, "fog_colour_2_G", params.fogColour2.G, 30000, compare); fprintfInt(fileSettings, "fog_colour_2_B", params.fogColour2.B, 65535, compare); fprintfInt(fileSettings, "fog_colour_3_R", params.fogColour3.R, 65535, compare); fprintfInt(fileSettings, "fog_colour_3_G", params.fogColour3.G, 65535, compare); fprintfInt(fileSettings, "fog_colour_3_B", params.fogColour3.B, 65535, compare); fprintfInt(fileSettings, "background_color_1_G", params.background_color1.G, 38306, compare); fprintfInt(fileSettings, "background_color_1_B", params.background_color1.B, 65535, compare); fprintfInt(fileSettings, "textured_background", params.texturedBackground, false, compare); fprintfInt(fileSettings, "background_as_fuldome", params.background_as_fulldome, false, compare); fprintfInt(fileSettings, "shadows_enabled", params.shadow, true, compare); fprintfInt(fileSettings, "ambient_occlusion_enabled", params.global_ilumination, false, compare); fprintfInt(fileSettings, "fast_ambient_occlusion_mode", params.fastGlobalIllumination, false, compare); fprintfInt(fileSettings, "fractal_color", params.imageSwitches.coloringEnabled, true, compare); fprintfInt(fileSettings, "coloring_random_seed", params.coloring_seed, 123456, compare); fprintfDot(fileSettings, "coloring_saturation", params.doubles.colourSaturation, 1.0, compare); fprintfDot(fileSettings, "coloring_speed", params.doubles.imageAdjustments.coloring_speed, 1.0, compare); fprintfDot(fileSettings, "coloring_palette_offset", params.doubles.imageAdjustments.paletteOffset, 0.0, compare); fprintfInt(fileSettings, "slow_shading", params.slowShading, false, compare); fprintfInt(fileSettings, "limits_enabled", params.fractal.limits_enabled, false, compare); fprintfInt(fileSettings, "post_fog_enabled", params.imageSwitches.fogEnabled, false, compare); fprintfDot(fileSettings, "post_fog_visibility", params.doubles.imageAdjustments.fogVisibility, 20.0, compare); fprintfInt(fileSettings, "post_fog_color_R", params.effectColours.fogColor.R, 59399, compare); fprintfInt(fileSettings, "post_fog_color_G", params.effectColours.fogColor.G, 61202, compare); fprintfInt(fileSettings, "post_fog_color_B", params.effectColours.fogColor.B, 65535, compare); fprintfInt(fileSettings, "post_SSAO_enabled", params.SSAOEnabled, true, compare); fprintfInt(fileSettings, "post_SSAO_quality", params.SSAOQuality, 20.0, compare); fprintfInt(fileSettings, "post_DOF_enabled", params.DOFEnabled, false, compare); fprintfDot(fileSettings, "post_DOF_focus", params.doubles.DOFFocus, 21.7, compare); fprintfDot(fileSettings, "post_DOF_radius", params.doubles.DOFRadius, 10.0, compare); fprintfDot(fileSettings, "main_light_intensity", params.doubles.imageAdjustments.mainLightIntensity, 1.0, compare); fprintfDot(fileSettings, "main_light_alfa", params.doubles.mainLightAlpha, -45 * M_PI / 180.0, compare); fprintfDot(fileSettings, "main_light_beta", params.doubles.mainLightBeta, 45 * M_PI / 180.0, compare); fprintfInt(fileSettings, "main_light_colour_R", params.effectColours.mainLightColour.R, 0xFFFF, compare); fprintfInt(fileSettings, "main_light_colour_G", params.effectColours.mainLightColour.G, 0xFFFF, compare); fprintfInt(fileSettings, "main_light_colour_B", params.effectColours.mainLightColour.B, 0xFFFF, compare); if(!compare || params.auxLightPreEnabled[0] || params.auxLightPreEnabled[1] || params.auxLightPreEnabled[2] || params.auxLightPreEnabled[3] || params.auxLightNumber >0 || params.fractal.formula == ocl_custom) { fprintfDot(fileSettings, "aux_light_intensity", params.doubles.auxLightIntensity, 1.0, compare); fprintfInt(fileSettings, "aux_light_random_seed", params.auxLightRandomSeed, 1234, compare); fprintfInt(fileSettings, "aux_light_number", params.auxLightNumber, 0, compare); fprintfDot(fileSettings, "aux_light_max_dist", params.doubles.auxLightMaxDist, 0.1, compare); fprintfDot(fileSettings, "aux_light_distribution_radius", params.doubles.auxLightDistributionRadius, 3.0, compare); fprintfDot(fileSettings, "aux_light_predefined_1_x", params.doubles.auxLightPre[0].x, 3, compare); fprintfDot(fileSettings, "aux_light_predefined_1_y", params.doubles.auxLightPre[0].y, -3, compare); fprintfDot(fileSettings, "aux_light_predefined_1_z", params.doubles.auxLightPre[0].z, -3, compare); fprintfDot(fileSettings, "aux_light_predefined_1_intensity", params.doubles.auxLightPreIntensity[0], 1.3, compare); fprintfDot(fileSettings, "aux_light_predefined_2_x", params.doubles.auxLightPre[1].x, -3, compare); fprintfDot(fileSettings, "aux_light_predefined_2_y", params.doubles.auxLightPre[1].y, -3, compare); fprintfDot(fileSettings, "aux_light_predefined_2_z", params.doubles.auxLightPre[1].z, 0, compare); fprintfDot(fileSettings, "aux_light_predefined_2_intensity", params.doubles.auxLightPreIntensity[1], 1, compare); fprintfDot(fileSettings, "aux_light_predefined_3_x", params.doubles.auxLightPre[2].x, -3, compare); fprintfDot(fileSettings, "aux_light_predefined_3_y", params.doubles.auxLightPre[2].y, 3, compare); fprintfDot(fileSettings, "aux_light_predefined_3_z", params.doubles.auxLightPre[2].z, -1, compare); fprintfDot(fileSettings, "aux_light_predefined_3_intensity", params.doubles.auxLightPreIntensity[2], 3, compare); fprintfDot(fileSettings, "aux_light_predefined_4_x", params.doubles.auxLightPre[3].x, 0, compare); fprintfDot(fileSettings, "aux_light_predefined_4_y", params.doubles.auxLightPre[3].y, -1, compare); fprintfDot(fileSettings, "aux_light_predefined_4_z", params.doubles.auxLightPre[3].z, 3, compare); fprintfDot(fileSettings, "aux_light_predefined_4_intensity", params.doubles.auxLightPreIntensity[1], 2, compare); fprintfInt(fileSettings, "aux_light_predefined_1_enabled", params.auxLightPreEnabled[0], false, compare); fprintfInt(fileSettings, "aux_light_predefined_2_enabled", params.auxLightPreEnabled[1], false, compare); fprintfInt(fileSettings, "aux_light_predefined_3_enabled", params.auxLightPreEnabled[2], false, compare); fprintfInt(fileSettings, "aux_light_predefined_4_enabled", params.auxLightPreEnabled[3], false, compare); fprintfInt(fileSettings, "aux_light_predefined_1_colour_R", params.auxLightPreColour[0].R, 45761, compare); fprintfInt(fileSettings, "aux_light_predefined_1_colour_G", params.auxLightPreColour[0].G, 53633, compare); fprintfInt(fileSettings, "aux_light_predefined_1_colour_B", params.auxLightPreColour[0].B, 59498, compare); fprintfInt(fileSettings, "aux_light_predefined_2_colour_R", params.auxLightPreColour[1].R, 62875, compare); fprintfInt(fileSettings, "aux_light_predefined_2_colour_G", params.auxLightPreColour[1].G, 55818, compare); fprintfInt(fileSettings, "aux_light_predefined_2_colour_B", params.auxLightPreColour[1].B, 50083, compare); fprintfInt(fileSettings, "aux_light_predefined_3_colour_R", params.auxLightPreColour[2].R, 64884, compare); fprintfInt(fileSettings, "aux_light_predefined_3_colour_G", params.auxLightPreColour[2].G, 64928, compare); fprintfInt(fileSettings, "aux_light_predefined_3_colour_B", params.auxLightPreColour[2].B, 48848, compare); fprintfInt(fileSettings, "aux_light_predefined_4_colour_R", params.auxLightPreColour[3].R, 52704, compare); fprintfInt(fileSettings, "aux_light_predefined_4_colour_G", params.auxLightPreColour[3].G, 62492, compare); fprintfInt(fileSettings, "aux_light_predefined_4_colour_B", params.auxLightPreColour[3].B, 45654, compare); fprintfDot(fileSettings, "aux_light_visibility", params.doubles.auxLightVisibility, 1, compare); fprintfDot(fileSettings, "aux_light_random_center_X", params.doubles.auxLightRandomCenter.x, 0, compare); fprintfDot(fileSettings, "aux_light_random_center_Y", params.doubles.auxLightRandomCenter.y, 0, compare); fprintfDot(fileSettings, "aux_light_random_center_Z", params.doubles.auxLightRandomCenter.z, 0, compare); } if(!compare || params.fractal.formula == kaleidoscopic || params.fractal.formula == hybrid || params.fractal.IFS.foldingMode || params.fractal.formula == ocl_custom) { fprintfDot(fileSettings, "IFS_scale", params.fractal.IFS.doubles.scale, 2, compare); fprintfDot(fileSettings, "IFS_rot_alfa", params.fractal.IFS.doubles.rotationAlfa, 0, compare); fprintfDot(fileSettings, "IFS_rot_beta", params.fractal.IFS.doubles.rotationBeta, 0, compare); fprintfDot(fileSettings, "IFS_rot_gamma", params.fractal.IFS.doubles.rotationGamma, 0, compare); fprintfDot(fileSettings, "IFS_offsetX", params.fractal.IFS.doubles.offset.x, 1, compare); fprintfDot(fileSettings, "IFS_offsetY", params.fractal.IFS.doubles.offset.y, 0, compare); fprintfDot(fileSettings, "IFS_offsetZ", params.fractal.IFS.doubles.offset.z, 0, compare); fprintfDot(fileSettings, "IFS_edgeX", params.fractal.IFS.doubles.edge.x, 0, compare); fprintfDot(fileSettings, "IFS_edgeY", params.fractal.IFS.doubles.edge.y, 0, compare); fprintfDot(fileSettings, "IFS_edgeZ", params.fractal.IFS.doubles.edge.z, 0, compare); fprintfInt(fileSettings, "IFS_absX", params.fractal.IFS.absX, false, compare); fprintfInt(fileSettings, "IFS_absY", params.fractal.IFS.absY, false, compare); fprintfInt(fileSettings, "IFS_absZ", params.fractal.IFS.absZ, false, compare); fprintfInt(fileSettings, "IFS_menger_sponge_mode", params.fractal.IFS.mengerSpongeMode, false, compare); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { sprintf(parameterName, "IFS_%d_x", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.direction[i].x, 1, compare); sprintf(parameterName, "IFS_%d_y", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.direction[i].y, 0, compare); sprintf(parameterName, "IFS_%d_z", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.direction[i].z, 0, compare); sprintf(parameterName, "IFS_%d_alfa", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.alfa[i], 0, compare); sprintf(parameterName, "IFS_%d_beta", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.beta[i], 0, compare); sprintf(parameterName, "IFS_%d_gamma", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.gamma[i], 0, compare); sprintf(parameterName, "IFS_%d_distance", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.distance[i], 0, compare); sprintf(parameterName, "IFS_%d_intensity", i); fprintfDot(fileSettings, parameterName, params.fractal.IFS.doubles.intensity[i], 1, compare); sprintf(parameterName, "IFS_%d_enabled", i); fprintfInt(fileSettings, parameterName, params.fractal.IFS.enabled[i], false, compare); } } fprintfInt(fileSettings, "start_frame", params.startFrame, 0, compare); fprintfInt(fileSettings, "end_frame", params.endFrame, 1000, compare); fprintfInt(fileSettings, "frames_per_keyframe", params.framesPerKeyframe, 100, compare); if (!compare || params.fractal.formula == hybrid || params.fractal.formula == ocl_custom) { for (int i = 1; i <= HYBRID_COUNT; ++i) { sprintf(parameterName, "hybrid_formula_%d", i); if (i == 5) fprintfInt(fileSettings, parameterName, params.fractal.hybridFormula[i - 1], 2, compare); else fprintfInt(fileSettings, parameterName, params.fractal.hybridFormula[i - 1], 0, compare); } for (int i = 1; i <= HYBRID_COUNT; ++i) { sprintf(parameterName, "hybrid_iterations_%d", i); fprintfInt(fileSettings, parameterName, params.fractal.hybridIters[i - 1], 1, compare); } for (int i = 1; i <= HYBRID_COUNT; ++i) { sprintf(parameterName, "hybrid_power_%d", i); fprintfDot(fileSettings, parameterName, params.fractal.doubles.hybridPower[i - 1], 2, compare); } fprintfInt(fileSettings, "hybrid_cyclic", params.fractal.hybridCyclic, false, compare); } fprintfInt(fileSettings, "fish_eye", params.perspectiveType, false, compare); fprintfInt(fileSettings, "fish_eye_180cut", params.fishEyeCut, false, compare); fprintfDot(fileSettings, "stereo_eye_distance", params.doubles.stereoEyeDistance, 0.1, compare); fprintfInt(fileSettings, "stereo_enabled", params.stereoEnabled, false, compare); if (!compare || params.fractal.formula == tglad || params.fractal.formula == smoothMandelbox || params.fractal.formula == mandelboxVaryScale4D || params.fractal.formula == generalizedFoldBox || params.fractal.formula == hybrid || params.fractal.formula == ocl_custom) { fprintfDot(fileSettings, "mandelbox_scale", params.fractal.mandelbox.doubles.scale, 2.0, compare); fprintfDot(fileSettings, "mandelbox_folding_limit", params.fractal.mandelbox.doubles.foldingLimit, 1.0, compare); fprintfDot(fileSettings, "mandelbox_folding_value", params.fractal.mandelbox.doubles.foldingValue, 2.0, compare); fprintfDot(fileSettings, "mandelbox_folding_min_radius", params.fractal.mandelbox.doubles.foldingSphericalMin, 0.5, compare); fprintfDot(fileSettings, "mandelbox_folding_fixed_radius", params.fractal.mandelbox.doubles.foldingSphericalFixed, 1.0, compare); fprintfDot(fileSettings, "mandelbox_sharpness", params.fractal.mandelbox.doubles.sharpness, 3.0, compare); fprintfDot(fileSettings, "mandelbox_offset_X", params.fractal.mandelbox.doubles.offset.x, 0.0, compare); fprintfDot(fileSettings, "mandelbox_offset_Y", params.fractal.mandelbox.doubles.offset.y, 0.0, compare); fprintfDot(fileSettings, "mandelbox_offset_Z", params.fractal.mandelbox.doubles.offset.z, 0.0, compare); for (int component = 0; component < 3; ++component) { sprintf(parameterName, "mandelbox_rotation_main_%s", component_names[component]); fprintfDot(fileSettings, parameterName, params.fractal.mandelbox.doubles.rotationMain[component] * 180.0 / M_PI, 0, compare); } for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) for (int axis = 0; axis < 3; ++axis) for (int component = 0; component < 3; ++component) { sprintf(parameterName, "mandelbox_rotation_%s%d_%s", axis_names[axis], fold + 1, component_names[component]); fprintfDot(fileSettings, parameterName, params.fractal.mandelbox.doubles.rotation[fold][axis][component] * 180.0 / M_PI, 0, compare); } fprintfDot(fileSettings, "mandelbox_color_R", params.fractal.mandelbox.doubles.colorFactorR, 0, compare); fprintfDot(fileSettings, "mandelbox_color_X", params.fractal.mandelbox.doubles.colorFactorX, 0.03, compare); fprintfDot(fileSettings, "mandelbox_color_Y", params.fractal.mandelbox.doubles.colorFactorY, 0.05, compare); fprintfDot(fileSettings, "mandelbox_color_Z", params.fractal.mandelbox.doubles.colorFactorZ, 0.07, compare); fprintfDot(fileSettings, "mandelbox_color_Sp1", params.fractal.mandelbox.doubles.colorFactorSp1, 0.2, compare); fprintfDot(fileSettings, "mandelbox_color_Sp2", params.fractal.mandelbox.doubles.colorFactorSp2, 0.2, compare); fprintfInt(fileSettings, "mandelbox_rotation_enabled", params.fractal.mandelbox.rotationsEnabled, false, compare); fprintfInt(fileSettings, "mandelbox_fold_mode", params.fractal.genFoldBox.type, true, compare); fprintfDot(fileSettings, "mandelbox_solid", params.fractal.mandelbox.doubles.solid, 1.0, compare); fprintfDot(fileSettings, "mandelbox_melt", params.fractal.mandelbox.doubles.melt, 0.0, compare); } fprintfDot(fileSettings, "view_distance_max", params.doubles.viewDistanceMax, 50, compare); fprintfDot(fileSettings, "view_distance_min", params.doubles.viewDistanceMin, 1e-15, compare); fprintfInt(fileSettings, "interior_mode", params.fractal.interiorMode, false, compare); fprintfDot(fileSettings, "FoldingIntPow_folding_factor", params.fractal.doubles.FoldingIntPowFoldFactor, 2.0, compare); fprintfDot(fileSettings, "FoldingIntPow_z_factor", params.fractal.doubles.FoldingIntPowZfactor, 5, compare); fprintfInt(fileSettings, "linear_DE_mode", params.fractal.linearDEmode, false, compare); fprintfInt(fileSettings, "constant_DE_threshold", params.fractal.constantDEThreshold, false, compare); for(int i=0; i<5; i++) { sprintf(parameterName, "volumetric_light_intensity_%d", i); fprintfDot(fileSettings, parameterName, params.doubles.volumetricLightIntensity[i], 100, compare); sprintf(parameterName, "volumetric_light_enabled_%d", i); fprintfInt(fileSettings, parameterName, params.volumetricLightEnabled[i], false, compare); } fprintfInt(fileSettings, "penetrating_lights", params.penetratingLights, true, compare); fprintfInt(fileSettings, "raytraced_reflections", params.imageSwitches.raytracedReflections, false, compare); fprintfInt(fileSettings, "reflections_max", params.reflectionsMax, 5, compare); fprintfDot(fileSettings, "mandelbox_vary_scale_vary", params.fractal.mandelbox.doubles.vary4D.scaleVary, 0.1, compare); fprintfDot(fileSettings, "mandelbox_vary_fold", params.fractal.mandelbox.doubles.vary4D.fold, 1, compare); fprintfDot(fileSettings, "mandelbox_vary_minr", params.fractal.mandelbox.doubles.vary4D.minR, 0.5, compare); fprintfDot(fileSettings, "mandelbox_vary_rpower", params.fractal.mandelbox.doubles.vary4D.rPower, 1, compare); fprintfDot(fileSettings, "mandelbox_vary_wadd", params.fractal.mandelbox.doubles.vary4D.wadd, 0, compare); fprintfDot(fileSettings, "c_add", params.fractal.doubles.cadd, -1.3, compare); fprintfDot(fileSettings, "volumetric_fog_density", params.doubles.fogDensity, 0.0, compare); fprintfDot(fileSettings, "volumetric_fog_colour_1_distance", params.doubles.fogColour1Distance, 1.0, compare); fprintfDot(fileSettings, "volumetric_fog_colour_2_distance", params.doubles.fogColour2Distance, 2.0, compare); fprintfDot(fileSettings, "volumetric_fog_distance_factor", params.doubles.fogDistanceFactor, 1.0, compare); fprintfInt(fileSettings, "iteration_fog_enable", params.imageSwitches.iterFogEnabled, false, compare); fprintfDot(fileSettings, "iteration_fog_opacity", params.doubles.iterFogOpacity, 1000.0, compare); fprintfDot(fileSettings, "iteration_fog_opacity_trim", params.doubles.iterFogOpacityTrim, 4.0, compare); fprintfInt(fileSettings, "primitive_only_plane", params.fractal.primitives.onlyPlane, false, compare); if (!compare || params.fractal.primitives.planeEnable || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "primitive_plane_enabled", params.fractal.primitives.planeEnable, false, compare); fprintfDot(fileSettings, "primitive_plane_centre_X", params.fractal.doubles.primitives.planeCentre.x, 0.0, compare); fprintfDot(fileSettings, "primitive_plane_centre_Y", params.fractal.doubles.primitives.planeCentre.y, 0.0, compare); fprintfDot(fileSettings, "primitive_plane_centre_Z", params.fractal.doubles.primitives.planeCentre.z, 0.0, compare); fprintfDot(fileSettings, "primitive_plane_normal_X", params.fractal.doubles.primitives.planeNormal.x, 0.0, compare); fprintfDot(fileSettings, "primitive_plane_normal_Y", params.fractal.doubles.primitives.planeNormal.y, 0.0, compare); fprintfDot(fileSettings, "primitive_plane_normal_Z", params.fractal.doubles.primitives.planeNormal.z, -1.0, compare); fprintfInt(fileSettings, "primitive_plane_colour_R", params.primitivePlaneColour.R, 20000, compare); fprintfInt(fileSettings, "primitive_plane_colour_G", params.primitivePlaneColour.G, 20000, compare); fprintfInt(fileSettings, "primitive_plane_colour_B", params.primitivePlaneColour.B, 20000, compare); fprintfDot(fileSettings, "primitive_plane_reflect", params.doubles.primitivePlaneReflect, 0.0, compare); } if (!compare || params.fractal.primitives.boxEnable || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "primitive_box_enabled", params.fractal.primitives.boxEnable, false, compare); fprintfDot(fileSettings, "primitive_box_centre_X", params.fractal.doubles.primitives.boxCentre.x, 0.0, compare); fprintfDot(fileSettings, "primitive_box_centre_Y", params.fractal.doubles.primitives.boxCentre.y, 0.0, compare); fprintfDot(fileSettings, "primitive_box_centre_Z", params.fractal.doubles.primitives.boxCentre.z, 0.0, compare); fprintfDot(fileSettings, "primitive_box_size_X", params.fractal.doubles.primitives.boxSize.x, 2.0, compare); fprintfDot(fileSettings, "primitive_box_size_Y", params.fractal.doubles.primitives.boxSize.y, 2.0, compare); fprintfDot(fileSettings, "primitive_box_size_Z", params.fractal.doubles.primitives.boxSize.z, 2.0, compare); fprintfInt(fileSettings, "primitive_box_colour_R", params.primitiveBoxColour.R, 20000, compare); fprintfInt(fileSettings, "primitive_box_colour_G", params.primitiveBoxColour.G, 20000, compare); fprintfInt(fileSettings, "primitive_box_colour_B", params.primitiveBoxColour.B, 20000, compare); fprintfDot(fileSettings, "primitive_box_reflect", params.doubles.primitiveBoxReflect, 0.0, compare); } if (!compare || params.fractal.primitives.invertedBoxEnable || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "primitive_invertedBox_enabled", params.fractal.primitives.invertedBoxEnable, false, compare); fprintfDot(fileSettings, "primitive_invertedBox_centre_X", params.fractal.doubles.primitives.invertedBoxCentre.x, 0.0, compare); fprintfDot(fileSettings, "primitive_invertedBox_centre_Y", params.fractal.doubles.primitives.invertedBoxCentre.y, 0.0, compare); fprintfDot(fileSettings, "primitive_invertedBox_centre_Z", params.fractal.doubles.primitives.invertedBoxCentre.z, 0.0, compare); fprintfDot(fileSettings, "primitive_invertedBox_size_X", params.fractal.doubles.primitives.invertedBoxSize.x, 10.0, compare); fprintfDot(fileSettings, "primitive_invertedBox_size_Y", params.fractal.doubles.primitives.invertedBoxSize.y, 10.0, compare); fprintfDot(fileSettings, "primitive_invertedBox_size_Z", params.fractal.doubles.primitives.invertedBoxSize.z, 10.0, compare); fprintfInt(fileSettings, "primitive_invertedBox_colour_R", params.primitiveInvertedBoxColour.R, 20000, compare); fprintfInt(fileSettings, "primitive_invertedBox_colour_G", params.primitiveInvertedBoxColour.G, 20000, compare); fprintfInt(fileSettings, "primitive_invertedBox_colour_B", params.primitiveInvertedBoxColour.B, 20000, compare); fprintfDot(fileSettings, "primitive_invertedBox_reflect", params.doubles.primitiveInvertedBoxReflect, 0.0, compare); } if (!compare || params.fractal.primitives.sphereEnable || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "primitive_sphere_enabled", params.fractal.primitives.sphereEnable, false, compare); fprintfDot(fileSettings, "primitive_sphere_centre_X", params.fractal.doubles.primitives.sphereCentre.x, 0.0, compare); fprintfDot(fileSettings, "primitive_sphere_centre_Y", params.fractal.doubles.primitives.sphereCentre.y, 0.0, compare); fprintfDot(fileSettings, "primitive_sphere_centre_Z", params.fractal.doubles.primitives.sphereCentre.z, 0.0, compare); fprintfDot(fileSettings, "primitive_sphere_radius", params.fractal.doubles.primitives.sphereRadius, 1.5, compare); fprintfInt(fileSettings, "primitive_sphere_colour_R", params.primitiveSphereColour.R, 20000, compare); fprintfInt(fileSettings, "primitive_sphere_colour_G", params.primitiveSphereColour.G, 20000, compare); fprintfInt(fileSettings, "primitive_sphere_colour_B", params.primitiveSphereColour.B, 20000, compare); fprintfDot(fileSettings, "primitive_sphere_reflect", params.doubles.primitiveSphereReflect, 0.0, compare); } if (!compare || params.fractal.primitives.invertedSphereEnable) { fprintfInt(fileSettings, "primitive_invertedSphere_enabled", params.fractal.primitives.invertedSphereEnable, false, compare); fprintfDot(fileSettings, "primitive_invertedSphere_centre_X", params.fractal.doubles.primitives.invertedSphereCentre.x, 0.0, compare); fprintfDot(fileSettings, "primitive_invertedSphere_centre_Y", params.fractal.doubles.primitives.invertedSphereCentre.y, 0.0, compare); fprintfDot(fileSettings, "primitive_invertedSphere_centre_Z", params.fractal.doubles.primitives.invertedSphereCentre.z, 0.0, compare); fprintfDot(fileSettings, "primitive_invertedSphere_radius", params.fractal.doubles.primitives.invertedSphereRadius, 5.0, compare); fprintfInt(fileSettings, "primitive_invertedSphere_colour_R", params.primitiveInvertedSphereColour.R, 20000, compare); fprintfInt(fileSettings, "primitive_invertedSphere_colour_G", params.primitiveInvertedSphereColour.G, 20000, compare); fprintfInt(fileSettings, "primitive_invertedSphere_colour_B", params.primitiveInvertedSphereColour.B, 20000, compare); fprintfDot(fileSettings, "primitive_invertedSphere_reflect", params.doubles.primitiveInvertedSphereReflect, 0.0, compare); } if (!compare || params.fractal.primitives.waterEnable || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "primitive_water_enabled", params.fractal.primitives.waterEnable, false, compare); fprintfDot(fileSettings, "primitive_water_level", params.fractal.doubles.primitives.waterHeight, 0.0, compare); fprintfDot(fileSettings, "primitive_water_amplitude", params.fractal.doubles.primitives.waterAmplitude, 0.02, compare); fprintfDot(fileSettings, "primitive_water_length", params.fractal.doubles.primitives.waterLength, 0.2, compare); fprintfInt(fileSettings, "primitive_water_iterations", params.fractal.primitives.waterIterations, 5, compare); fprintfDot(fileSettings, "primitive_water_rotation", params.fractal.doubles.primitives.waterRotation, 0.0, compare); fprintfDot(fileSettings, "primitive_water_anim_speed", params.fractal.doubles.primitives.waterAnimSpeed, 0.1, compare); fprintfInt(fileSettings, "primitive_water_colour_R", params.primitiveWaterColour.R, 0, compare); fprintfInt(fileSettings, "primitive_water_colour_G", params.primitiveWaterColour.G, 5000, compare); fprintfInt(fileSettings, "primitive_water_colour_B", params.primitiveWaterColour.B, 10000, compare); fprintfDot(fileSettings, "primitive_water_reflect", params.doubles.primitiveWaterReflect, 0.7, compare); } if (!compare || params.fakeLightsEnabled || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "fake_lights_enabled", params.fakeLightsEnabled, false, compare); fprintfDot(fileSettings, "fake_lights_intensity", params.doubles.fakeLightsIntensity, 1.0, compare); fprintfDot(fileSettings, "fake_lights_visibility", params.doubles.fakeLightsVisibility, 1.0, compare); fprintfDot(fileSettings, "fake_lights_visibility_size", params.doubles.fakeLightsVisibilitySize, 5.0, compare); fprintfDot(fileSettings, "fake_lights_orbit_trap_X", params.fractal.doubles.fakeLightsOrbitTrap.x, 2.0, compare); fprintfDot(fileSettings, "fake_lights_orbit_trap_Y", params.fractal.doubles.fakeLightsOrbitTrap.y, 0.0, compare); fprintfDot(fileSettings, "fake_lights_orbit_trap_Z", params.fractal.doubles.fakeLightsOrbitTrap.z, 0.0, compare); fprintfInt(fileSettings, "fake_lights_min_iter", params.fractal.fakeLightsMinIter, 1, compare); fprintfInt(fileSettings, "fake_lights_max_iter", params.fractal.fakeLightsMaxIter, 2, compare); } #ifdef CLSUPPORT if (!compare || params.fractal.formula == ocl_custom) { fprintfInt(fileSettings, "ocl_custom_DE_mode", params.fractal.customOCLFormulaDEMode, false, compare); if(!compare) fprintf(fileSettings, "ocl_custom_formula_name %s;\n", "example"); else fprintf(fileSettings, "ocl_custom_formula_name %s;\n", params.fractal.customOCLFormulaName); for (int i = 0; i < 15; ++i) { sprintf(parameterName, "ocl_custom_par_%d", i); fprintfDot(fileSettings, parameterName, params.fractal.doubles.customParameters[i], 0.0, compare); } } fprintfDot(fileSettings, "ocl_delta_DE_step", params.fractal.doubles.deltaDEStep, 1.0e-5, compare); fprintfInt(fileSettings, "ocl_DOF_method", params.OpenCLDOFMethod, 0, compare); #endif fprintfInt(fileSettings, "frame_no", params.fractal.frameNo, 0, compare); fprintfInt(fileSettings, "tile_no", params.tileCount, 0, compare); if(strcmp(filename,"settings/.clipboard")) { if(!compare) { fprintf(fileSettings, "file_destination %s;\n", "images/image"); fprintf(fileSettings, "file_background %s;\n", (string(sharedDir)+"textures/background.jpg").c_str()); fprintf(fileSettings, "file_envmap %s;\n", (string(sharedDir)+"textures/envmap.jpg").c_str()); fprintf(fileSettings, "file_lightmap %s;\n", (string(sharedDir)+"textures/lightmap.jpg").c_str()); fprintf(fileSettings, "file_animation_path %s;\n", "paths/path.txt"); fprintf(fileSettings, "file_keyframes %s;\n", "keyframes/keyframe"); } else { fprintf(fileSettings, "file_destination %s;\n", params.file_destination); if(params.texturedBackground) fprintf(fileSettings, "file_background %s;\n", params.file_background); if(params.doubles.imageAdjustments.reflect > 0 && !params.imageSwitches.raytracedReflections) fprintf(fileSettings, "file_envmap %s;\n", params.file_envmap); if(params.global_ilumination && !params.fastGlobalIllumination) fprintf(fileSettings, "file_lightmap %s;\n", params.file_lightmap); fprintf(fileSettings, "file_animation_path %s;\n", params.file_path); fprintf(fileSettings, "file_keyframes %s;\n", params.file_keyframes); } fprintf(fileSettings, "palette %s;\n", paletteString); } fclose(fileSettings); delete[] paletteString; } void SaveAppSettings(const char *filename, const sAppSettings& appParams) { FILE * fileSettings; fileSettings = fopen(filename, "w"); fprintfInt(fileSettings, "absolute_movement_enable", appParams.absoluteMovementModeEnabled, -1, true); fprintfInt(fileSettings, "zoom_by_mouse_click_enable", appParams.zoomByMouseClickEnabled, -1, true); fprintfInt(fileSettings, "go_close_to_surface", appParams.goCloseToSurfaceEnabled, -1, true); fprintfDot(fileSettings, "camera_movement_relative_step", appParams.cameraMoveStepRelative, -1, true); fprintfDot(fileSettings, "camera_movement_absolute_step", appParams.cameraMoveStepAbsolute, -1, true); fprintfDot(fileSettings, "camera_rotation_step", appParams.rotationStep, -1, true); fprintfDot(fileSettings, "mouse_close_up_ratio", appParams.mouseCloseUpRatio, -1, true); fprintf(fileSettings, "net_render_client_port %s;\n", appParams.netRenderClientPort.c_str()); fprintf(fileSettings, "net_render_client_IP %s;\n", appParams.netRenderClientIP.c_str()); fprintf(fileSettings, "net_render_server_port %s;\n", appParams.netRenderServerPort.c_str()); #ifdef CLSUPPORT fprintfInt(fileSettings, "openCL_use_CPU", appParams.oclUseCPU, -1, true); fprintfInt(fileSettings, "openCL_platform_index", appParams.oclPlatformIndex, -1, true); fprintfInt(fileSettings, "openCL_device_index", appParams.oclDeviceIndex, -1, true); fprintfInt(fileSettings, "openCL_engine", appParams.oclEngineSelection, -1, true); fprintfDot(fileSettings, "openCL_cycle_time", appParams.oclCycleTime, -1, true); fprintfInt(fileSettings, "openCL_memory_limit", appParams.oclMemoryLimit, -1, true); fprintf(fileSettings, "openCL_text_editor %s;\n", appParams.oclTextEditor.c_str()); #endif fclose(fileSettings); } bool LoadSettings(const char *filename, sParamRender ¶ms, bool disableMessages) { string defaultsFilename = string(data_directory); defaultsFilename+="/.defaults"; if(FileIfExists(defaultsFilename.c_str())) { LoadSettings2(defaultsFilename.c_str(), params, true); } else { printf("ERROR! Missed reference file with defaults: %s\n", defaultsFilename.c_str()); abort(); } return LoadSettings2(filename, params, disableMessages); } bool LoadSettings2(const char *filename, sParamRender ¶ms, bool disableMessages) { paletteLoadedFromSettingsFile = false; char str1[100]; char str2[2000]; FILE * fileSettings; fileSettings = fopen(filename, "r"); int lineCounter = 0; params.settingsVersion = -1; if (fileSettings) { while (!feof(fileSettings)) { lineCounter++; int c = fscanf(fileSettings, "%s", str1); if (c > 0) { c = fscanf(fileSettings, "%[ ]", str2); c = fscanf(fileSettings, "%[^;]", str2); LoadOneSetting(str1, str2, params, disableMessages); c = fscanf(fileSettings, "%[^\n]", str2); } } fclose(fileSettings); //overriding of parameters defined by command line for(std::vector::const_iterator it=noGUIdata.overrideStrings.begin(); it != noGUIdata.overrideStrings.end(); it++) { char str1[100], str2[2000]; int c = sscanf(*it, "%99[^= \t]%*1[= ]%1999s", str1, str2); if(c != 2) { printf("Warning! Bad override string: %s [c=%d]\n", *it, c); WriteLog("Warning! Bad override string:"); WriteLog(*it); } else { LoadOneSetting(str1, str2, params); printf("Prameter overrided: %s = %s\n", str1, str2); } } LoadSettingsPost(params); if (params.settingsVersion > MANDELBULBER_VERSION) { printf("Settings file was created in newer version of Mandelbulber (v. %f)\n", params.settingsVersion); if (!noGUI && !disableMessages) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Warning! Settings file was created in newer version of Mandelbulber\nfile: %s\nversion: %f", filename, params.settingsVersion); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } return true; } else { //printf("Can't open settings file: %s\n", filename); return false; } } bool LoadOneSetting(const char* str1, const char *str2, sParamRender ¶ms, bool disableMessages) { char str3[100]; //IFS params bool IFSresult = false; for (int i = 0; i < IFS_VECTOR_COUNT; i++) { sprintf(str3, "IFS_%d_x", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.direction[i].x = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_y", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.direction[i].y = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_z", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.direction[i].z = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_alfa", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.alfa[i] = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_beta", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.beta[i] = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_gamma", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.gamma[i] = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_distance", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.distance[i] = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_intensity", i); if (!strcmp(str1, str3)) { params.fractal.IFS.doubles.intensity[i] = atof2(str2); IFSresult = true; break; } sprintf(str3, "IFS_%d_enabled", i); if (!strcmp(str1, str3)) { params.fractal.IFS.enabled[i] = atoi(str2); IFSresult = true; break; } } if (IFSresult) IFSresult = false; else if (!strcmp(str1, "Mandelbulber")) params.settingsVersion = atof2(str2); else if (!strcmp(str1, "image_width")) params.image_width = atoi(str2); else if (!strcmp(str1, "image_height")) params.image_height = atoi(str2); else if (!strcmp(str1, "tiles")) params.noOfTiles = atoi(str2); else if (!strcmp(str1, "x_min")) params.fractal.doubles.amin = atof2(str2); else if (!strcmp(str1, "x_max")) params.fractal.doubles.amax = atof2(str2); else if (!strcmp(str1, "y_min")) params.fractal.doubles.bmin = atof2(str2); else if (!strcmp(str1, "y_max")) params.fractal.doubles.bmax = atof2(str2); else if (!strcmp(str1, "z_min")) params.fractal.doubles.cmin = atof2(str2); else if (!strcmp(str1, "z_max")) params.fractal.doubles.cmax = atof2(str2); else if (!strcmp(str1, "view_point_x")) params.doubles.vp.x = atof2(str2); else if (!strcmp(str1, "view_point_y")) params.doubles.vp.y = atof2(str2); else if (!strcmp(str1, "view_point_z")) params.doubles.vp.z = atof2(str2); else if (!strcmp(str1, "angle_alfa")) params.doubles.alpha = atof2(str2) / 180.0 * M_PI; else if (!strcmp(str1, "angle_beta")) params.doubles.beta = atof2(str2) / 180.0 * M_PI; else if (!strcmp(str1, "angle_gamma")) params.doubles.gamma = atof2(str2) / 180.0 * M_PI; else if (!strcmp(str1, "zoom")) params.doubles.zoom = atof2(str2); else if (!strcmp(str1, "perspective")) params.doubles.persp = atof2(str2); else if (!strcmp(str1, "formula")) params.fractal.formula = (enumFractalFormula) atoi(str2); else if (!strcmp(str1, "power")) params.fractal.doubles.power = atof2(str2); else if (!strcmp(str1, "N")) params.fractal.doubles.N = atoi(str2); else if (!strcmp(str1, "minN")) params.fractal.minN = atoi(str2); else if (!strcmp(str1, "fractal_constant_factor")) params.fractal.doubles.constantFactor = atof2(str2); else if (!strcmp(str1, "quality")) params.doubles.quality = atof2(str2); else if (!strcmp(str1, "smoothness")) params.doubles.smoothness = atof2(str2); else if (!strcmp(str1, "julia_mode")) params.fractal.juliaMode = atoi(str2); else if (!strcmp(str1, "julia_a")) params.fractal.doubles.julia.x = atof2(str2); else if (!strcmp(str1, "julia_b")) params.fractal.doubles.julia.y = atof2(str2); else if (!strcmp(str1, "julia_c")) params.fractal.doubles.julia.z = atof2(str2); else if (!strcmp(str1, "tglad_folding_mode")) params.fractal.tgladFoldingMode = atoi(str2); else if (!strcmp(str1, "folding_limit")) params.fractal.doubles.foldingLimit = atof2(str2); else if (!strcmp(str1, "folding_value")) params.fractal.doubles.foldingValue = atof2(str2); else if (!strcmp(str1, "spherical_folding_mode")) params.fractal.sphericalFoldingMode = atoi(str2); else if (!strcmp(str1, "spherical_folding_fixed")) params.fractal.doubles.foldingSphericalFixed = atof2(str2); else if (!strcmp(str1, "spherical_folding_min")) params.fractal.doubles.foldingSphericalMin = atof2(str2); else if (!strcmp(str1, "IFS_folding_mode")) params.fractal.IFS.foldingMode = atoi(str2); else if (!strcmp(str1, "iteration_threshold_mode")) params.fractal.iterThresh = atoi(str2); else if (!strcmp(str1, "analityc_DE_mode")) params.fractal.analitycDE = atoi(str2); else if (!strcmp(str1, "DE_factor")) params.doubles.DE_factor = atof2(str2); else if (!strcmp(str1, "brightness")) params.doubles.imageAdjustments.brightness = atof2(str2); else if (!strcmp(str1, "contrast")) params.doubles.imageAdjustments.contrast = atof2(str2); else if (!strcmp(str1, "gamma")) params.doubles.imageAdjustments.imageGamma = atof2(str2); else if (!strcmp(str1, "hdr")) params.imageSwitches.hdrEnabled = atoi(str2); else if (!strcmp(str1, "ambient")) params.doubles.imageAdjustments.ambient = atof2(str2); else if (!strcmp(str1, "reflect")) params.doubles.imageAdjustments.reflect = atof2(str2); else if (!strcmp(str1, "shadows_intensity")) params.doubles.imageAdjustments.directLight = atof2(str2); else if (!strcmp(str1, "shadows_cone_angle")) params.doubles.shadowConeAngle = atof2(str2); else if (!strcmp(str1, "ambient_occlusion")) params.doubles.imageAdjustments.globalIlum = atof2(str2); else if (!strcmp(str1, "ambient_occlusion_quality")) params.globalIlumQuality = atoi(str2); else if (!strcmp(str1, "ambient_occlusion_fast_tune")) params.doubles.fastAoTune = atof2(str2); else if (!strcmp(str1, "shading")) params.doubles.imageAdjustments.shading = atof2(str2); else if (!strcmp(str1, "specular")) params.doubles.imageAdjustments.specular = atof2(str2); else if (!strcmp(str1, "glow_intensity")) params.doubles.imageAdjustments.glow_intensity = atof2(str2); else if (!strcmp(str1, "glow_color_1_R")) params.effectColours.glow_color1.R = atoi(str2); else if (!strcmp(str1, "glow_color_1_G")) params.effectColours.glow_color1.G = atoi(str2); else if (!strcmp(str1, "glow_color_1_B")) params.effectColours.glow_color1.B = atoi(str2); else if (!strcmp(str1, "glow_color_2_R")) params.effectColours.glow_color2.R = atoi(str2); else if (!strcmp(str1, "glow_color_2_G")) params.effectColours.glow_color2.G = atoi(str2); else if (!strcmp(str1, "glow_color_2_B")) params.effectColours.glow_color2.B = atoi(str2); else if (!strcmp(str1, "background_color_1_R")) params.background_color1.R = atoi(str2); else if (!strcmp(str1, "background_color_1_G")) params.background_color1.G = atoi(str2); else if (!strcmp(str1, "background_color_1_B")) params.background_color1.B = atoi(str2); else if (!strcmp(str1, "background_color_2_R")) params.background_color2.R = atoi(str2); else if (!strcmp(str1, "background_color_2_G")) params.background_color2.G = atoi(str2); else if (!strcmp(str1, "background_color_2_B")) params.background_color2.B = atoi(str2); else if (!strcmp(str1, "background_color_3_R")) params.background_color3.R = atoi(str2); else if (!strcmp(str1, "background_color_3_G")) params.background_color3.G = atoi(str2); else if (!strcmp(str1, "background_color_3_B")) params.background_color3.B = atoi(str2); else if (!strcmp(str1, "fog_colour_1_R")) params.fogColour1.R = atoi(str2); else if (!strcmp(str1, "fog_colour_1_G")) params.fogColour1.G = atoi(str2); else if (!strcmp(str1, "fog_colour_1_B")) params.fogColour1.B = atoi(str2); else if (!strcmp(str1, "fog_colour_2_R")) params.fogColour2.R = atoi(str2); else if (!strcmp(str1, "fog_colour_2_G")) params.fogColour2.G = atoi(str2); else if (!strcmp(str1, "fog_colour_2_B")) params.fogColour2.B = atoi(str2); else if (!strcmp(str1, "fog_colour_3_R")) params.fogColour3.R = atoi(str2); else if (!strcmp(str1, "fog_colour_3_G")) params.fogColour3.G = atoi(str2); else if (!strcmp(str1, "fog_colour_3_B")) params.fogColour3.B = atoi(str2); else if (!strcmp(str1, "textured_background")) params.texturedBackground = atoi(str2); else if (!strcmp(str1, "background_as_fuldome")) params.background_as_fulldome = atoi(str2); else if (!strcmp(str1, "shadows_enabled")) params.shadow = atoi(str2); else if (!strcmp(str1, "ambient_occlusion_enabled")) params.global_ilumination = atoi(str2); else if (!strcmp(str1, "fast_ambient_occlusion_mode")) params.fastGlobalIllumination = atoi(str2); else if (!strcmp(str1, "fractal_color")) params.imageSwitches.coloringEnabled = atoi(str2); else if (!strcmp(str1, "coloring_random_seed")) params.coloring_seed = atoi(str2); else if (!strcmp(str1, "coloring_saturation")) params.doubles.colourSaturation = atof2(str2); else if (!strcmp(str1, "coloring_speed")) params.doubles.imageAdjustments.coloring_speed = atof2(str2); else if (!strcmp(str1, "coloring_palette_offset")) params.doubles.imageAdjustments.paletteOffset = atof2(str2); else if (!strcmp(str1, "slow_shading")) params.slowShading = atoi(str2); else if (!strcmp(str1, "limits_enabled")) params.fractal.limits_enabled = atoi(str2); else if (!strcmp(str1, "post_fog_enabled")) params.imageSwitches.fogEnabled = atoi(str2); else if (!strcmp(str1, "post_fog_visibility")) params.doubles.imageAdjustments.fogVisibility = atof2(str2); else if (!strcmp(str1, "post_fog_color_R")) params.effectColours.fogColor.R = atoi(str2); else if (!strcmp(str1, "post_fog_color_G")) params.effectColours.fogColor.G = atoi(str2); else if (!strcmp(str1, "post_fog_color_B")) params.effectColours.fogColor.B = atoi(str2); else if (!strcmp(str1, "post_SSAO_enabled")) params.SSAOEnabled = atoi(str2); else if (!strcmp(str1, "post_SSAO_quality")) params.SSAOQuality = atoi(str2); else if (!strcmp(str1, "post_DOF_enabled")) params.DOFEnabled = atoi(str2); else if (!strcmp(str1, "post_DOF_focus")) params.doubles.DOFFocus = atof2(str2); else if (!strcmp(str1, "post_DOF_radius")) params.doubles.DOFRadius = atof2(str2); else if (!strcmp(str1, "main_light_intensity")) params.doubles.imageAdjustments.mainLightIntensity = atof2(str2); else if (!strcmp(str1, "main_light_alfa")) params.doubles.mainLightAlpha = atof2(str2); else if (!strcmp(str1, "main_light_beta")) params.doubles.mainLightBeta = atof2(str2); else if (!strcmp(str1, "main_light_colour_R")) params.effectColours.mainLightColour.R = atoi(str2); else if (!strcmp(str1, "main_light_colour_G")) params.effectColours.mainLightColour.G = atoi(str2); else if (!strcmp(str1, "main_light_colour_B")) params.effectColours.mainLightColour.B = atoi(str2); else if (!strcmp(str1, "aux_light_intensity")) params.doubles.auxLightIntensity = atof2(str2); else if (!strcmp(str1, "aux_light_random_seed")) params.auxLightRandomSeed = atoi(str2); else if (!strcmp(str1, "aux_light_number")) params.auxLightNumber = atoi(str2); else if (!strcmp(str1, "aux_light_max_dist")) params.doubles.auxLightMaxDist = atof2(str2); else if (!strcmp(str1, "aux_light_distribution_radius")) params.doubles.auxLightDistributionRadius = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_1_x")) params.doubles.auxLightPre[0].x = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_1_y")) params.doubles.auxLightPre[0].y = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_1_z")) params.doubles.auxLightPre[0].z = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_1_intensity")) params.doubles.auxLightPreIntensity[0] = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_2_x")) params.doubles.auxLightPre[1].x = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_2_y")) params.doubles.auxLightPre[1].y = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_2_z")) params.doubles.auxLightPre[1].z = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_2_intensity")) params.doubles.auxLightPreIntensity[1] = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_3_x")) params.doubles.auxLightPre[2].x = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_3_y")) params.doubles.auxLightPre[2].y = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_3_z")) params.doubles.auxLightPre[2].z = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_3_intensity")) params.doubles.auxLightPreIntensity[2] = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_4_x")) params.doubles.auxLightPre[3].x = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_4_y")) params.doubles.auxLightPre[3].y = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_4_z")) params.doubles.auxLightPre[3].z = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_4_intensity")) params.doubles.auxLightPreIntensity[3] = atof2(str2); else if (!strcmp(str1, "aux_light_predefined_1_enabled")) params.auxLightPreEnabled[0] = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_2_enabled")) params.auxLightPreEnabled[1] = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_3_enabled")) params.auxLightPreEnabled[2] = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_4_enabled")) params.auxLightPreEnabled[3] = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_1_colour_R")) params.auxLightPreColour[0].R = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_1_colour_G")) params.auxLightPreColour[0].G = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_1_colour_B")) params.auxLightPreColour[0].B = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_2_colour_R")) params.auxLightPreColour[1].R = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_2_colour_G")) params.auxLightPreColour[1].G = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_2_colour_B")) params.auxLightPreColour[1].B = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_3_colour_R")) params.auxLightPreColour[2].R = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_3_colour_G")) params.auxLightPreColour[2].G = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_3_colour_B")) params.auxLightPreColour[2].B = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_4_colour_R")) params.auxLightPreColour[3].R = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_4_colour_G")) params.auxLightPreColour[3].G = atoi(str2); else if (!strcmp(str1, "aux_light_predefined_4_colour_B")) params.auxLightPreColour[3].B = atoi(str2); else if (!strcmp(str1, "aux_light_visibility")) params.doubles.auxLightVisibility = atof2(str2); else if (!strcmp(str1, "aux_light_random_center_X")) params.doubles.auxLightRandomCenter.x = atof2(str2); else if (!strcmp(str1, "aux_light_random_center_Y")) params.doubles.auxLightRandomCenter.y = atof2(str2); else if (!strcmp(str1, "aux_light_random_center_Z")) params.doubles.auxLightRandomCenter.z = atof2(str2); else if (!strcmp(str1, "IFS_scale")) params.fractal.IFS.doubles.scale = atof2(str2); else if (!strcmp(str1, "IFS_rot_alfa")) params.fractal.IFS.doubles.rotationAlfa = atof2(str2); else if (!strcmp(str1, "IFS_rot_beta")) params.fractal.IFS.doubles.rotationBeta = atof2(str2); else if (!strcmp(str1, "IFS_rot_gamma")) params.fractal.IFS.doubles.rotationGamma = atof2(str2); else if (!strcmp(str1, "IFS_offsetX")) params.fractal.IFS.doubles.offset.x = atof2(str2); else if (!strcmp(str1, "IFS_offsetY")) params.fractal.IFS.doubles.offset.y = atof2(str2); else if (!strcmp(str1, "IFS_offsetZ")) params.fractal.IFS.doubles.offset.z = atof2(str2); else if (!strcmp(str1, "IFS_edgeX")) params.fractal.IFS.doubles.edge.x = atof2(str2); else if (!strcmp(str1, "IFS_edgeY")) params.fractal.IFS.doubles.edge.y = atof2(str2); else if (!strcmp(str1, "IFS_edgeZ")) params.fractal.IFS.doubles.edge.z = atof2(str2); else if (!strcmp(str1, "IFS_absX")) params.fractal.IFS.absX = atof(str2); else if (!strcmp(str1, "IFS_absY")) params.fractal.IFS.absY = atof(str2); else if (!strcmp(str1, "IFS_absZ")) params.fractal.IFS.absZ = atof(str2); else if (!strcmp(str1, "IFS_menger_sponge_mode")) params.fractal.IFS.mengerSpongeMode = atof(str2); else if (!strcmp(str1, "start_frame")) params.startFrame = atoi(str2); else if (!strcmp(str1, "end_frame")) params.endFrame = atoi(str2); else if (!strcmp(str1, "frames_per_keyframe")) params.framesPerKeyframe = atoi(str2); else if (!strcmp(str1, "hybrid_cyclic")) params.fractal.hybridCyclic = atoi(str2); else if (!strcmp(str1, "fish_eye")) params.perspectiveType = (enumPerspectiveType)atoi(str2); else if (!strcmp(str1, "fish_eye_180cut")) params.fishEyeCut = atoi(str2); else if (!strcmp(str1, "stereo_enabled")) params.stereoEnabled = atoi(str2); else if (!strcmp(str1, "stereo_eye_distance")) params.doubles.stereoEyeDistance = atof2(str2); else if (!strcmp(str1, "mandelbox_scale")) params.fractal.mandelbox.doubles.scale = atof2(str2); else if (!strcmp(str1, "mandelbox_folding_limit")) params.fractal.mandelbox.doubles.foldingLimit = atof2(str2); else if (!strcmp(str1, "mandelbox_folding_value")) params.fractal.mandelbox.doubles.foldingValue = atof2(str2); else if (!strcmp(str1, "mandelbox_folding_min_radius")) params.fractal.mandelbox.doubles.foldingSphericalMin = atof2(str2); else if (!strcmp(str1, "mandelbox_folding_fixed_radius")) params.fractal.mandelbox.doubles.foldingSphericalFixed = atof2(str2); else if (!strcmp(str1, "mandelbox_sharpness")) params.fractal.mandelbox.doubles.sharpness = atof2(str2); else if (!strcmp(str1, "mandelbox_offset_X")) params.fractal.mandelbox.doubles.offset.x = atof2(str2); else if (!strcmp(str1, "mandelbox_offset_Y")) params.fractal.mandelbox.doubles.offset.y = atof2(str2); else if (!strcmp(str1, "mandelbox_offset_Z")) params.fractal.mandelbox.doubles.offset.z = atof2(str2); else if (!strcmp(str1, "mandelbox_color_R")) params.fractal.mandelbox.doubles.colorFactorR = atof2(str2); else if (!strcmp(str1, "mandelbox_color_X")) params.fractal.mandelbox.doubles.colorFactorX = atof2(str2); else if (!strcmp(str1, "mandelbox_color_Y")) params.fractal.mandelbox.doubles.colorFactorY = atof2(str2); else if (!strcmp(str1, "mandelbox_color_Z")) params.fractal.mandelbox.doubles.colorFactorZ = atof2(str2); else if (!strcmp(str1, "mandelbox_color_Sp1")) params.fractal.mandelbox.doubles.colorFactorSp1 = atof2(str2); else if (!strcmp(str1, "mandelbox_color_Sp2")) params.fractal.mandelbox.doubles.colorFactorSp2 = atof2(str2); else if (!strcmp(str1, "mandelbox_rotation_enabled")) params.fractal.mandelbox.rotationsEnabled = atoi(str2); else if (!strcmp(str1, "mandelbox_fold_mode")) params.fractal.genFoldBox.type = (enumGeneralizedFoldBoxType)atoi(str2); else if (!strcmp(str1, "mandelbox_solid")) params.fractal.mandelbox.doubles.solid = atof2(str2); else if (!strcmp(str1, "mandelbox_melt")) params.fractal.mandelbox.doubles.melt = atof2(str2); else if (!strcmp(str1, "view_distance_max")) params.doubles.viewDistanceMax = atof2(str2); else if (!strcmp(str1, "view_distance_min")) params.doubles.viewDistanceMin = atof2(str2); else if (!strcmp(str1, "interior_mode")) params.fractal.interiorMode = atoi(str2); else if (!strcmp(str1, "linear_DE_mode")) params.fractal.linearDEmode = atoi(str2); else if (!strcmp(str1, "constant_DE_threshold")) params.fractal.constantDEThreshold = atoi(str2); else if (!strcmp(str1, "FoldingIntPow_folding_factor")) params.fractal.doubles.FoldingIntPowFoldFactor = atof2(str2); else if (!strcmp(str1, "FoldingIntPow_z_factor")) params.fractal.doubles.FoldingIntPowZfactor = atof2(str2); else if (!strcmp(str1, "penetrating_lights")) params.penetratingLights = atoi(str2); else if (!strcmp(str1, "raytraced_reflections")) params.imageSwitches.raytracedReflections = atoi(str2); else if (!strcmp(str1, "reflections_max")) params.reflectionsMax = atoi(str2); else if (!strcmp(str1, "mandelbox_vary_scale_vary")) params.fractal.mandelbox.doubles.vary4D.scaleVary = atof2(str2); else if (!strcmp(str1, "mandelbox_vary_fold")) params.fractal.mandelbox.doubles.vary4D.fold = atof2(str2); else if (!strcmp(str1, "mandelbox_vary_minr")) params.fractal.mandelbox.doubles.vary4D.minR = atof2(str2); else if (!strcmp(str1, "mandelbox_vary_rpower")) params.fractal.mandelbox.doubles.vary4D.rPower = atof2(str2); else if (!strcmp(str1, "mandelbox_vary_wadd")) params.fractal.mandelbox.doubles.vary4D.wadd = atof2(str2); else if (!strcmp(str1, "c_add")) params.fractal.doubles.cadd = atof2(str2); else if (!strcmp(str1, "volumetric_fog_density")) params.doubles.fogDensity = atof2(str2); else if (!strcmp(str1, "volumetric_fog_colour_1_distance")) params.doubles.fogColour1Distance = atof2(str2); else if (!strcmp(str1, "volumetric_fog_colour_2_distance")) params.doubles.fogColour2Distance = atof2(str2); else if (!strcmp(str1, "volumetric_fog_distance_factor")) params.doubles.fogDistanceFactor = atof2(str2); else if (!strcmp(str1, "iteration_fog_enable")) params.imageSwitches.iterFogEnabled = atoi(str2); else if (!strcmp(str1, "iteration_fog_opacity")) params.doubles.iterFogOpacity = atof2(str2); else if (!strcmp(str1, "iteration_fog_opacity_trim")) params.doubles.iterFogOpacityTrim = atof2(str2); else if (!strcmp(str1, "primitive_only_plane")) params.fractal.primitives.onlyPlane = atoi(str2); else if (!strcmp(str1, "primitive_plane_enabled")) params.fractal.primitives.planeEnable = atoi(str2); else if (!strcmp(str1, "primitive_plane_centre_X")) params.fractal.doubles.primitives.planeCentre.x = atof2(str2); else if (!strcmp(str1, "primitive_plane_centre_Y")) params.fractal.doubles.primitives.planeCentre.y = atof2(str2); else if (!strcmp(str1, "primitive_plane_centre_Z")) params.fractal.doubles.primitives.planeCentre.z = atof2(str2); else if (!strcmp(str1, "primitive_plane_normal_X")) params.fractal.doubles.primitives.planeNormal.x = atof2(str2); else if (!strcmp(str1, "primitive_plane_normal_Y")) params.fractal.doubles.primitives.planeNormal.y = atof2(str2); else if (!strcmp(str1, "primitive_plane_normal_Z")) params.fractal.doubles.primitives.planeNormal.z = atof2(str2); else if (!strcmp(str1, "primitive_plane_colour_R")) params.primitivePlaneColour.R = atoi(str2); else if (!strcmp(str1, "primitive_plane_colour_G")) params.primitivePlaneColour.G = atoi(str2); else if (!strcmp(str1, "primitive_plane_colour_B")) params.primitivePlaneColour.B = atoi(str2); else if (!strcmp(str1, "primitive_plane_reflect")) params.doubles.primitivePlaneReflect = atof2(str2); else if (!strcmp(str1, "primitive_box_enabled")) params.fractal.primitives.boxEnable = atoi(str2); else if (!strcmp(str1, "primitive_box_centre_X")) params.fractal.doubles.primitives.boxCentre.x = atof2(str2); else if (!strcmp(str1, "primitive_box_centre_Y")) params.fractal.doubles.primitives.boxCentre.y = atof2(str2); else if (!strcmp(str1, "primitive_box_centre_Z")) params.fractal.doubles.primitives.boxCentre.z = atof2(str2); else if (!strcmp(str1, "primitive_box_size_X")) params.fractal.doubles.primitives.boxSize.x = atof2(str2); else if (!strcmp(str1, "primitive_box_size_Y")) params.fractal.doubles.primitives.boxSize.y = atof2(str2); else if (!strcmp(str1, "primitive_box_size_Z")) params.fractal.doubles.primitives.boxSize.z = atof2(str2); else if (!strcmp(str1, "primitive_box_colour_R")) params.primitiveBoxColour.R = atoi(str2); else if (!strcmp(str1, "primitive_box_colour_G")) params.primitiveBoxColour.G = atoi(str2); else if (!strcmp(str1, "primitive_box_colour_B")) params.primitiveBoxColour.B = atoi(str2); else if (!strcmp(str1, "primitive_box_reflect")) params.doubles.primitiveBoxReflect = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_enabled")) params.fractal.primitives.invertedBoxEnable = atoi(str2); else if (!strcmp(str1, "primitive_invertedBox_centre_X")) params.fractal.doubles.primitives.invertedBoxCentre.x = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_centre_Y")) params.fractal.doubles.primitives.invertedBoxCentre.y = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_centre_Z")) params.fractal.doubles.primitives.invertedBoxCentre.z = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_size_X")) params.fractal.doubles.primitives.invertedBoxSize.x = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_size_Y")) params.fractal.doubles.primitives.invertedBoxSize.y = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_size_Z")) params.fractal.doubles.primitives.invertedBoxSize.z = atof2(str2); else if (!strcmp(str1, "primitive_invertedBox_colour_R")) params.primitiveInvertedBoxColour.R = atoi(str2); else if (!strcmp(str1, "primitive_invertedBox_colour_G")) params.primitiveInvertedBoxColour.G = atoi(str2); else if (!strcmp(str1, "primitive_invertedBox_colour_B")) params.primitiveInvertedBoxColour.B = atoi(str2); else if (!strcmp(str1, "primitive_invertedBox_reflect")) params.doubles.primitiveInvertedBoxReflect = atof2(str2); else if (!strcmp(str1, "primitive_sphere_enabled")) params.fractal.primitives.sphereEnable = atoi(str2); else if (!strcmp(str1, "primitive_sphere_centre_X")) params.fractal.doubles.primitives.sphereCentre.x = atof2(str2); else if (!strcmp(str1, "primitive_sphere_centre_Y")) params.fractal.doubles.primitives.sphereCentre.y = atof2(str2); else if (!strcmp(str1, "primitive_sphere_centre_Z")) params.fractal.doubles.primitives.sphereCentre.z = atof2(str2); else if (!strcmp(str1, "primitive_sphere_radius")) params.fractal.doubles.primitives.sphereRadius = atof2(str2); else if (!strcmp(str1, "primitive_sphere_colour_R")) params.primitiveSphereColour.R = atoi(str2); else if (!strcmp(str1, "primitive_sphere_colour_G")) params.primitiveSphereColour.G = atoi(str2); else if (!strcmp(str1, "primitive_sphere_colour_B")) params.primitiveSphereColour.B = atoi(str2); else if (!strcmp(str1, "primitive_sphere_reflect")) params.doubles.primitiveSphereReflect = atof2(str2); else if (!strcmp(str1, "primitive_invertedSphere_enabled")) params.fractal.primitives.invertedSphereEnable = atoi(str2); else if (!strcmp(str1, "primitive_invertedSphere_centre_X")) params.fractal.doubles.primitives.invertedSphereCentre.x = atof2(str2); else if (!strcmp(str1, "primitive_invertedSphere_centre_Y")) params.fractal.doubles.primitives.invertedSphereCentre.y = atof2(str2); else if (!strcmp(str1, "primitive_invertedSphere_centre_Z")) params.fractal.doubles.primitives.invertedSphereCentre.z = atof2(str2); else if (!strcmp(str1, "primitive_invertedSphere_radius")) params.fractal.doubles.primitives.invertedSphereRadius = atof2(str2); else if (!strcmp(str1, "primitive_invertedSphere_colour_R")) params.primitiveInvertedSphereColour.R = atoi(str2); else if (!strcmp(str1, "primitive_invertedSphere_colour_G")) params.primitiveInvertedSphereColour.G = atoi(str2); else if (!strcmp(str1, "primitive_invertedSphere_colour_B")) params.primitiveInvertedSphereColour.B = atoi(str2); else if (!strcmp(str1, "primitive_invertedSphere_reflect")) params.doubles.primitiveInvertedSphereReflect = atof2(str2); else if (!strcmp(str1, "primitive_water_enabled")) params.fractal.primitives.waterEnable = atoi(str2); else if (!strcmp(str1, "primitive_water_level")) params.fractal.doubles.primitives.waterHeight = atof2(str2); else if (!strcmp(str1, "primitive_water_amplitude")) params.fractal.doubles.primitives.waterAmplitude = atof2(str2); else if (!strcmp(str1, "primitive_water_length")) params.fractal.doubles.primitives.waterLength = atof2(str2); else if (!strcmp(str1, "primitive_water_iterations")) params.fractal.primitives.waterIterations = atoi(str2); else if (!strcmp(str1, "primitive_water_rotation")) params.fractal.doubles.primitives.waterRotation = atof2(str2); else if (!strcmp(str1, "primitive_water_anim_speed")) params.fractal.doubles.primitives.waterAnimSpeed = atof2(str2); else if (!strcmp(str1, "primitive_water_colour_R")) params.primitiveWaterColour.R = atoi(str2); else if (!strcmp(str1, "primitive_water_colour_G")) params.primitiveWaterColour.G = atoi(str2); else if (!strcmp(str1, "primitive_water_colour_B")) params.primitiveWaterColour.B = atoi(str2); else if (!strcmp(str1, "primitive_water_reflect")) params.doubles.primitiveWaterReflect = atof2(str2); else if (!strcmp(str1, "fake_lights_enabled")) params.fakeLightsEnabled = atoi(str2); else if (!strcmp(str1, "fake_lights_min_iter")) params.fractal.fakeLightsMinIter = atoi(str2); else if (!strcmp(str1, "fake_lights_max_iter")) params.fractal.fakeLightsMaxIter = atoi(str2); else if (!strcmp(str1, "fake_lights_visibility")) params.doubles.fakeLightsVisibility = atof2(str2); else if (!strcmp(str1, "fake_lights_visibility_size")) params.doubles.fakeLightsVisibilitySize = atof2(str2); else if (!strcmp(str1, "fake_lights_intensity")) params.doubles.fakeLightsIntensity = atof2(str2); else if (!strcmp(str1, "fake_lights_orbit_trap_X")) params.fractal.doubles.fakeLightsOrbitTrap.x = atof2(str2); else if (!strcmp(str1, "fake_lights_orbit_trap_Y")) params.fractal.doubles.fakeLightsOrbitTrap.y = atof2(str2); else if (!strcmp(str1, "fake_lights_orbit_trap_Z")) params.fractal.doubles.fakeLightsOrbitTrap.z = atof2(str2); #ifdef CLSUPPORT else if (!strcmp(str1, "ocl_custom_DE_mode")) params.fractal.customOCLFormulaDEMode = (enumOCLDEMode)atoi(str2); else if (!strcmp(str1, "ocl_custom_formula_name")) strcpy(params.fractal.customOCLFormulaName,str2); else if (!strcmp(str1, "ocl_delta_DE_step")) params.fractal.doubles.deltaDEStep = atof2(str2); else if (!strcmp(str1, "ocl_DOF_method")) params.OpenCLDOFMethod = atoi(str2); #endif else if (!strcmp(str1, "frame_no")) params.fractal.frameNo = atoi(str2); else if (!strcmp(str1, "tile_no")) params.tileCount = atoi(str2); else if (!strcmp(str1, "file_destination")) strcpy(params.file_destination, str2); else if (!strcmp(str1, "file_background")) strcpy(params.file_background, str2); else if (!strcmp(str1, "file_envmap")) strcpy(params.file_envmap, str2); else if (!strcmp(str1, "file_lightmap")) strcpy(params.file_lightmap, str2); else if (!strcmp(str1, "file_animation_path")) strcpy(params.file_path, str2); else if (!strcmp(str1, "file_keyframes")) strcpy(params.file_keyframes, str2); else if (!strcmp(str1, "palette")) GetPaletteFromString(params.palette, str2); else { int matched = false; char buf[100]; for (int i = 0; i < 5; ++i) { sprintf(buf, "volumetric_light_enabled_%d", i); if (!strcmp(str1, buf)) { params.volumetricLightEnabled[i] = atoi(str2); matched = true; break; } sprintf(buf, "volumetric_light_intensity_%d", i); if (!strcmp(str1, buf)) { params.doubles.volumetricLightIntensity[i] = atof2(str2); matched = true; break; } } for (int i = 1; i <= HYBRID_COUNT; ++i) { sprintf(buf, "hybrid_formula_%d", i); if (!strcmp(str1, buf)) { params.fractal.hybridFormula[i - 1] = (enumFractalFormula) atoi(str2); matched = true; break; } sprintf(buf, "hybrid_iterations_%d", i); if (!strcmp(str1, buf)) { params.fractal.hybridIters[i - 1] = atoi(str2); matched = true; break; } sprintf(buf, "hybrid_power_%d", i); if (!strcmp(str1, buf)) { params.fractal.doubles.hybridPower[i - 1] = atof2(str2); matched = true; break; } } for (int component = 0; component < 3; ++component) { sprintf(buf, "mandelbox_rotation_main_%s", component_names[component]); if (!strcmp(str1, buf)) { params.fractal.mandelbox.doubles.rotationMain[component] = atof2(str2)/ 180.0 * M_PI; matched = true; break; } } for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) { for (int axis = 0; axis < 3; ++axis) { for (int component = 0; component < 3; ++component) { sprintf(buf, "mandelbox_rotation_%s%d_%s", axis_names[axis], fold + 1, component_names[component]); if (!strcmp(str1, buf)) { params.fractal.mandelbox.doubles.rotation[fold][axis][component] = atof2(str2)/ 180.0 * M_PI; matched = true; break; } } if (matched) break; } if (matched) break; } #ifdef CLSUPPORT for (int i = 0; i < 15; ++i) { sprintf(buf, "ocl_custom_par_%d", i); if (!strcmp(str1, buf)) { params.fractal.doubles.customParameters[i] = atof2(str2); matched = true; } } #endif if (!matched) { printf("Warning! Unknown parameter: %s %s\n", str1, str2); WriteLog("Warning! Unknown parameter:"); WriteLog(str1); return false; } } return true; } void LoadSettingsPost(sParamRender ¶ms) { if (!paletteLoadedFromSettingsFile) { printf("Palette not found in settings file. Generating random palette\n"); srand(params.coloring_seed); NewPalette(params.palette, params.doubles.colourSaturation); } lightsPlaced = 0; } bool LoadAppSettings(char *filename, sAppSettings &appParams) { char str1[100]; char str2[2000]; FILE * fileSettings; fileSettings = fopen(filename, "r"); int lineCounter = 0; if (fileSettings) { while (!feof(fileSettings)) { lineCounter++; int c = fscanf(fileSettings, "%s", str1); if (c > 0) { c = fscanf(fileSettings, "%[ ]", str2); c = fscanf(fileSettings, "%[^;]", str2); if (!strcmp(str1, "absolute_movement_enable")) appParams.absoluteMovementModeEnabled = atoi(str2); else if (!strcmp(str1, "zoom_by_mouse_click_enable")) appParams.zoomByMouseClickEnabled = atoi(str2); else if (!strcmp(str1, "go_close_to_surface")) appParams.goCloseToSurfaceEnabled = atoi(str2); else if (!strcmp(str1, "camera_movement_relative_step")) appParams.cameraMoveStepRelative = atof2(str2); else if (!strcmp(str1, "camera_movement_absolute_step")) appParams.cameraMoveStepAbsolute = atof2(str2); else if (!strcmp(str1, "camera_rotation_step")) appParams.rotationStep = atof2(str2); else if (!strcmp(str1, "mouse_close_up_ratio")) appParams.mouseCloseUpRatio = atof2(str2); else if (!strcmp(str1, "net_render_client_port")) appParams.netRenderClientPort = std::string(str2); else if (!strcmp(str1, "net_render_client_IP")) appParams.netRenderClientIP = std::string(str2); else if (!strcmp(str1, "net_render_server_port")) appParams.netRenderServerPort = std::string(str2); #ifdef CLSUPPORT else if (!strcmp(str1, "openCL_use_CPU")) appParams.oclUseCPU = atoi(str2); else if (!strcmp(str1, "openCL_platform_index")) appParams.oclPlatformIndex = atoi(str2); else if (!strcmp(str1, "openCL_device_index")) appParams.oclDeviceIndex = atoi(str2); else if (!strcmp(str1, "openCL_engine")) appParams.oclEngineSelection = atoi(str2); else if (!strcmp(str1, "openCL_cycle_time")) appParams.oclCycleTime = atof2(str2); else if (!strcmp(str1, "openCL_memory_limit")) appParams.oclMemoryLimit = atoi(str2); else if (!strcmp(str1, "openCL_text_editor")) appParams.oclTextEditor = std::string(str2); #endif else { printf("Warning! Unknown parameter: %s %s\n", str1, str2); WriteLog("Warning! Unknown parameter:"); WriteLog(str1); } c = fscanf(fileSettings, "%[^\n]", str2); } } fclose(fileSettings); return true; } else { printf("Can't open application settings file: %s\n", filename); return false; } } void KeepOtherSettings(sParamRender *params) { double *doublesParamRender = new double[sizeof(sParamRenderD)]; double *doublesFractal = new double[sizeof(sFractalD)]; double *doublesMandelbox = new double[sizeof(sFractalMandelboxD)]; double *doublesIFS = new double[sizeof(sFractalIFSD)]; memcpy(doublesParamRender,¶ms->doubles,sizeof(sParamRenderD)); memcpy(doublesFractal,¶ms->fractal.doubles,sizeof(sFractalD)); memcpy(doublesMandelbox,¶ms->fractal.mandelbox.doubles,sizeof(sFractalMandelboxD)); memcpy(doublesIFS,¶ms->fractal.IFS.doubles,sizeof(sFractalIFSD)); ReadInterface(params); memcpy(¶ms->doubles,doublesParamRender,sizeof(sParamRenderD)); memcpy(¶ms->fractal.doubles,doublesFractal,sizeof(sFractalD)); memcpy(¶ms->fractal.mandelbox.doubles,doublesMandelbox,sizeof(sFractalMandelboxD)); memcpy(¶ms->fractal.IFS.doubles,doublesIFS,sizeof(sFractalIFSD)); delete[] doublesParamRender; delete[] doublesFractal; delete[] doublesMandelbox; delete[] doublesIFS; } mandelbulber1.21-1.orig/src/texture.hpp0000644000175000017500000000134512274512437021057 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for bitmap textures / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef TEXTURE_HPP_ #define TEXTURE_HPP_ #include "cimage.hpp" class cTexture { public: cTexture(const char *filename); cTexture(); ~cTexture(void); int Height(void) {return height;} int Width(void) {return width;} sRGB8 Pixel(double x, double y); sRGB8 FastPixel(int x, int y); bool IsLoaded(void) {return loaded;} private: sRGB8 Interpolation(double x, double y); sRGB8 *bitmap; int width; int height; bool loaded; }; #endif /* TEXTURE_HPP_ */ mandelbulber1.21-1.orig/src/smartptr.h0000644000175000017500000000147312274512437020675 0ustar krzysztofkrzysztof// Tiny wrappers around allocated memory to manage lifetime. #ifndef SMARTPTR_H_ #define SMARTPTR_H_ #include template class smart_ptr { public: smart_ptr(T* ptr = NULL) : ptr_(ptr) {} ~smart_ptr() { delete ptr_; } T* ptr() const { return ptr_; } T* operator->() const { return ptr_; } T& operator*() const { return *ptr_; } void reset(T* ptr = NULL) { if (ptr != ptr_) { delete ptr_; ptr_ = ptr; } } private: T* ptr_; }; template class smart_array { public: smart_array(T* ptr = NULL) : ptr_(ptr) {} ~smart_array() { delete[] ptr_; } T& operator[](std::ptrdiff_t i) const { return ptr_[i]; } T* ptr() const { return ptr_; } void reset(T* ptr = NULL) { if (ptr != ptr_) { delete[] ptr_; ptr_ = ptr; } } private: T* ptr_; }; #endif mandelbulber1.21-1.orig/src/interface.h0000644000175000017500000006730312274512437020765 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / definition of user interface and functions / for parameters handling / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef INTERFACE_H_ #define INTERFACE_H_ #include #include #include "fractparams.h" #include "cl_support.hpp" #include "callbacks.h" #include "shaders.h" #include "morph.hpp" #define MANDELBULBER_VERSION 1.211 #define MANDELBULBER_VERSION_STR "1.21-1" #ifndef SHARED_DIR #ifndef WIN32 #define SHARED_DIR "/usr/share/mandelbulber" #endif #endif extern char *sharedDir; extern int x_mouse; extern int y_mouse; extern double last_z_mouse; extern double smooth_last_z_mouse; enum enumImageFormat { imgFormatJPG = 0, imgFormatPNG = 1, imgFormatPNG16 = 2, imgFormatPNG16Alpha = 3 }; struct sMainWindow { GtkWidget *window; GtkWidget *mainBox; GtkWidget *drawingArea; GtkWidget *scrolled_window; GtkWidget *comboImageScale; GtkWidget *comboMouseClickMode; GtkWidget *boxButtons; GtkWidget *labelImageScale; GtkWidget *labelMouseClickMode; GtkObject *hadjustment; GtkObject *vadjustment; int scrollbarSize; int lastWindowWidth; int lastWindowHeight; }; struct sInterfaceIFS { GtkWidget *editIFSx; GtkWidget *editIFSy; GtkWidget *editIFSz; GtkWidget *editIFSalfa; GtkWidget *editIFSbeta; GtkWidget *editIFSgamma; GtkWidget *editIFSdistance; GtkWidget *editIFSintensity; GtkWidget *checkIFSenabled; }; struct sInterface { GtkWidget *tabs; GtkWidget *tab_label_view; GtkWidget *tab_label_fractal; GtkWidget *tab_label_image; GtkWidget *tab_label_animation; GtkWidget *tab_label_shaders2; GtkWidget *tab_label_lights; GtkWidget *tab_label_IFS; GtkWidget *tab_label_about; GtkWidget *tab_label_shaders; GtkWidget *tab_label_hybrid; GtkWidget *tab_label_mandelbox; GtkWidget *tab_label_engine; GtkWidget *tabsPrimitives; GtkWidget *tab_label_primitivePlane; GtkWidget *tab_label_primitiveWater; GtkWidget *tab_label_primitiveBox; GtkWidget *tab_label_primitiveBoxInv; GtkWidget *tab_label_primitiveSphere; GtkWidget *tab_label_primitiveSphereInv; GtkWidget *tab_label_openCL; GtkWidget *tabsNetRender; GtkWidget *tab_label_server; GtkWidget *tab_label_client; GtkWidget *tabsOpenCL; GtkWidget *tab_label_openclEngine; GtkWidget *tab_label_openclCustom; GtkWidget *tab_box_view; GtkWidget *tab_box_fractal; GtkWidget *tab_box_image; GtkWidget *tab_box_animation; GtkWidget *tab_box_shaders2; GtkWidget *tab_box_lights; GtkWidget *tab_box_IFS; GtkWidget *tab_box_about; GtkWidget *tab_box_shaders; GtkWidget *tab_box_hybrid; GtkWidget *tab_box_mandelbox; GtkWidget *tab_box_engine; GtkWidget *tab_box_primitivePlane; GtkWidget *tab_box_primitiveWater; GtkWidget *tab_box_primitiveBox; GtkWidget *tab_box_primitiveBoxInv; GtkWidget *tab_box_primitiveSphere; GtkWidget *tab_box_primitiveSphereInv; GtkWidget *tab_box_openCL; GtkWidget *tab_box_server; GtkWidget *tab_box_client; GtkWidget *tab_box_openclEngine; GtkWidget *tab_box_openclCustom; GtkWidget *boxMain; GtkWidget *boxButtons; GtkWidget *boxView; GtkWidget *boxCoordinates; GtkWidget *boxAngle; GtkWidget *boxZoom; GtkWidget *boxArrows; GtkWidget *boxArrows2; GtkWidget *boxArrows3; GtkWidget *boxNavigation; GtkWidget *boxNavigationButtons; GtkWidget *boxNavigationZooming; GtkWidget *boxFractalFormula; GtkWidget *boxFractalFolding; GtkWidget *boxFractalRayMarching; GtkWidget *boxFractalFoldingIntPow; GtkWidget *boxFractalPower; GtkWidget *boxFractalSwitches; GtkWidget *boxLimits; GtkWidget *boxJulia; GtkWidget *boxQuality; GtkWidget *boxImage; GtkWidget *boxImageRes; GtkWidget *boxEffects; GtkWidget *boxBrightness; GtkWidget *boxShading; GtkWidget *boxShading2; GtkWidget *boxEffectsChecks; GtkWidget *boxEffectsChecks2; GtkWidget *boxEffectsColoring; GtkWidget *boxColors; GtkWidget *boxGlowColor; GtkWidget *boxFilenames; GtkWidget *boxLoadSave; GtkWidget *boxAnimation; GtkWidget *boxAnimationButtons; GtkWidget *boxAnimationEdits; GtkWidget *boxAnimationEdits2; GtkWidget *boxTgladFolding; GtkWidget *boxSphericalFolding; GtkWidget *boxSaveImage; GtkWidget *boxPostFog; GtkWidget *boxFogButtons; GtkWidget *boxFogSlider; GtkWidget *boxFogSlider2; GtkWidget *boxPostSSAO; GtkWidget *boxSSAOSlider; GtkWidget *boxSSAOButtons; GtkWidget *boxPostDOF; GtkWidget *boxDOFSlider1; GtkWidget *boxDOFSlider2; GtkWidget *boxDOFButtons; GtkWidget *boxLightBallance; GtkWidget *boxLightsParameters; GtkWidget *boxPredefinedLights; GtkWidget *boxLightBrightness; GtkWidget *boxLightDistribution; GtkWidget *boxLightDistribution2; GtkWidget *boxLightPre1; GtkWidget *boxLightPre2; GtkWidget *boxLightPre3; GtkWidget *boxLightPre4; GtkWidget *boxLightCommon; GtkWidget *boxMainLight; GtkWidget *boxMainLightPosition; GtkWidget *boxIFSMain; GtkWidget *boxIFSMainEdit; GtkWidget *boxIFSMainEdit2; GtkWidget *boxIFSParams; GtkWidget *boxIFSButtons; GtkWidget *boxIFSEdge; GtkWidget *boxKeyframeAnimation; GtkWidget *boxKeyframeAnimationButtons; GtkWidget *boxKeyframeAnimationButtons2; GtkWidget *boxKeyframeAnimationEdits; GtkWidget *boxBottomKeyframeAnimation; GtkWidget *boxPalette; GtkWidget *boxPaletteOffset; GtkWidget *boxImageSaving; GtkWidget *boxImageAutoSave; GtkWidget *boxHybrid; GtkWidget *boxStereoscopic; GtkWidget *boxStereoParams; GtkWidget *boxMandelboxMainParams; GtkWidget *boxMandelboxRotations; GtkWidget *boxMandelboxColoring; GtkWidget *boxMandelboxMainParams1; GtkWidget *boxMandelboxMainParams2; GtkWidget *boxMandelboxRotationMain; GtkWidget *boxMandelboxColor1; GtkWidget *boxMandelboxColor2; GtkWidget *boxMandelboxColor3; GtkWidget *boxMandelboxOffset; GtkWidget *boxViewDistance; GtkWidget *boxIFSDefaults; GtkWidget *boxVolumetricLight; GtkWidget *boxVolumetricLightGeneral; GtkWidget *boxVolumetricLightMain; GtkWidget *boxVolumetricLightAux; GtkWidget *boxMandelboxVary; GtkWidget *boxVolumetricFog; GtkWidget *boxPrimitives; GtkWidget *boxPrimitivePlane; GtkWidget *boxPrimitivePlane1; GtkWidget *boxPrimitivePlane2; GtkWidget *boxPrimitiveBox; GtkWidget *boxPrimitiveBox1; GtkWidget *boxPrimitiveBox2; GtkWidget *boxPrimitiveInvertedBox; GtkWidget *boxPrimitiveInvertedBox1; GtkWidget *boxPrimitiveInvertedBox2; GtkWidget *boxPrimitiveSphere; GtkWidget *boxPrimitiveSphere1; GtkWidget *boxPrimitiveSphere2; GtkWidget *boxPrimitiveInvertedSphere; GtkWidget *boxPrimitiveInvertedSphere1; GtkWidget *boxPrimitiveInvertedSphere2; GtkWidget *boxPrimitiveWater; GtkWidget *boxPrimitiveWater1; GtkWidget *boxPrimitiveWater2; GtkWidget *boxMeasure; GtkWidget *boxMeasure1; GtkWidget *boxOpenClSettings; GtkWidget *boxOpenClSwitches1; GtkWidget *boxOpenClInformation; GtkWidget *boxOpenClEngineSettingsV; GtkWidget *boxOpenClEngineSettingsH1; GtkWidget *boxOpenClEngineSettingsH2; GtkWidget *boxOpenClEngineSettingsH3; GtkWidget *boxOpenClEngineSettingsH4; GtkWidget *boxOpenClCustomV1; GtkWidget *boxOpenClCustomH11; GtkWidget *boxOpenClCustomH12; GtkWidget *boxOpenClCustomH13; GtkWidget *boxOpenClCustomV2; GtkWidget *boxNetRenderServerV; GtkWidget *boxNetRenderClientV; GtkWidget *boxNetRenderServerH1; GtkWidget *boxNetRenderClientH1; GtkWidget *boxFakeLightsV; GtkWidget *boxFakeLightsH1; GtkWidget *boxFakeLightsH2; GtkWidget *boxImageAdjustmentsV; GtkWidget *boxImageAdjustmentsH1; GtkWidget *boxShadersSurfaceV; GtkWidget *boxShadersSurfaceH1; GtkWidget *boxShadersSurfaceH2; GtkWidget *boxShadersSurfaceH3; GtkWidget *boxShadersSurfaceH4; GtkWidget *boxShadersVolumetricV; GtkWidget *boxShadersVolumetricH1; GtkWidget *boxShadersVolumetricH2; GtkWidget *boxShadersVolumetricH3; GtkWidget *boxShadersVolumetricH4; GtkWidget *tableLimits; GtkWidget *tableArrows; GtkWidget *tableArrows2; GtkWidget *tableIFSParams; GtkWidget *tableHybridParams; GtkWidget *tableMandelboxRotations; GtkWidget *tableOpenCLCustom; GtkWidget *frCoordinates; GtkWidget *fr3Dnavigator; GtkWidget *frLimits; GtkWidget *frImage; GtkWidget *frEffects; GtkWidget *frColors; GtkWidget *frFilenames; GtkWidget *frLoadSave; GtkWidget *frAnimation; GtkWidget *frAnimationFrames; GtkWidget *frPostFog; GtkWidget *frPostSSAO; GtkWidget *frPostDOF; GtkWidget *frLightBallance; GtkWidget *frLightsParameters; GtkWidget *frLightsCommon; GtkWidget *frPredefinedLights; GtkWidget *frMainLight; GtkWidget *frIFSMain; GtkWidget *frIFSParams; GtkWidget *frIFSDefaults; GtkWidget *frKeyframeAnimation; GtkWidget *frKeyframeAnimation2; GtkWidget *frPalette; GtkWidget *frImageSaving; GtkWidget *frHybrid; GtkWidget *frStereo; GtkWidget *frMandelboxMainParams; GtkWidget *frMandelboxRotations; GtkWidget *frMandelboxColoring; GtkWidget *frFractalFormula; GtkWidget *frFractalFolding; GtkWidget *frFractalRayMarching; GtkWidget *frFractalFoldingIntPow; GtkWidget *frVolumetricLight; GtkWidget *frMandelboxVary; GtkWidget *frPrimitives; GtkWidget *frPrimitivePlane; GtkWidget *frPrimitiveBox; GtkWidget *frPrimitiveInvertedBox; GtkWidget *frPrimitiveSphere; GtkWidget *frPrimitiveInvertedSphere; GtkWidget *frPrimitiveWater; GtkWidget *frMeasure; GtkWidget *frOpenClSettings; GtkWidget *frOpenClInformation; GtkWidget *frOpenClEngineSettings; GtkWidget *frOpenClCustomSelection; GtkWidget *frOpenClCustomParams; GtkWidget *frNetRender; GtkWidget *frFakeLights; GtkWidget *frImageAdjustments; GtkWidget *frShadersSurface; GtkWidget *frShadersVolumetric; GtkWidget *hSeparator1; GtkWidget *hSeparator2; GtkWidget *hSeparator3; GtkWidget *hSeparator4; GtkWidget *vSeparator1; GtkWidget *buRender; GtkWidget *buStop; GtkWidget *buColorGlow1; GtkWidget *buColorGlow2; GtkWidget *buColorBackgroud1; GtkWidget *buColorBackgroud2; GtkWidget *buColorBackgroud3; GtkWidget *buColorFog1; GtkWidget *buColorFog2; GtkWidget *buColorFog3; GtkWidget *buApplyImageAdjustments; GtkWidget *buSaveImage; GtkWidget *buSavePNG; GtkWidget *buSavePNG16; GtkWidget *buSavePNG16Alpha; GtkWidget *buFiles; GtkWidget *buLoadSettings; GtkWidget *buSaveSettings; GtkWidget *buUp; GtkWidget *buDown; GtkWidget *buLeft; GtkWidget *buRight; GtkWidget *buRotateLeft; GtkWidget *buRotateRight; GtkWidget *buMoveUp; GtkWidget *buMoveDown; GtkWidget *buMoveLeft; GtkWidget *buMoveRight; GtkWidget *buForward; GtkWidget *buBackward; GtkWidget *buInitNavigator; GtkWidget *buAnimationRecordTrack; GtkWidget *buAnimationContinueRecord; GtkWidget *buAnimationRenderTrack; GtkWidget *buColorFog; GtkWidget *buColorSSAO; GtkWidget *buUpdateSSAO; GtkWidget *buUpdateDOF; GtkWidget *buColorAuxLightPre1; GtkWidget *buColorAuxLightPre2; GtkWidget *buColorAuxLightPre3; GtkWidget *buColorAuxLightPre4; GtkWidget *buColorMainLight; GtkWidget *buDistributeLights; GtkWidget *buIFSNormalizeOffset; GtkWidget *buIFSNormalizeVectors; GtkWidget *buIFSReset; GtkWidget *buAnimationRecordKey; GtkWidget *buAnimationRenderFromKeys; GtkWidget *buUndo; GtkWidget *buRedo; GtkWidget *buBuddhabrot; GtkWidget *buRandomPalette; GtkWidget *buGetPaletteFromImage; GtkWidget *buTimeline; GtkWidget *buIFSDefaultDodeca; GtkWidget *buIFSDefaultIcosa; GtkWidget *buIFSDefaultOcta; GtkWidget *buIFSDefaultMengerSponge; GtkWidget *buAutoDEStep; GtkWidget *buAutoDEStepHQ; GtkWidget *buCopyToClipboard; GtkWidget *buGetFromClipboard; GtkWidget *buLoadExample; GtkWidget *buColorPrimitivePlane; GtkWidget *buColorPrimitiveBox; GtkWidget *buColorPrimitiveInvertedBox; GtkWidget *buColorPrimitiveSphere; GtkWidget *buColorPrimitiveInvertedSphere; GtkWidget *buColorPrimitiveWater; GtkWidget *buAutoFog; GtkWidget *buMeasureActivation; GtkWidget *buSaveAllImageLayers; GtkWidget *buOpenCLNewFormula; GtkWidget *buOpenCLDeleteFormula; GtkWidget *buOpenCLEditFormula; GtkWidget *buOpenCLEditFormulaInit; GtkWidget *buOpenCLRecompile; GtkWidget *buConvertPathToKeyframes; GtkWidget *edit_va; GtkWidget *edit_vb; GtkWidget *edit_vc; GtkWidget *edit_julia_a; GtkWidget *edit_julia_b; GtkWidget *edit_julia_c; GtkWidget *edit_amin; GtkWidget *edit_amax; GtkWidget *edit_bmin; GtkWidget *edit_bmax; GtkWidget *edit_cmin; GtkWidget *edit_cmax; GtkWidget *edit_alfa; GtkWidget *edit_beta; GtkWidget *edit_gammaAngle; GtkWidget *edit_zoom; GtkWidget *edit_persp; GtkWidget *edit_maxDepth; GtkWidget *edit_maxN; GtkWidget *edit_minN; GtkWidget *edit_power; GtkWidget *edit_DE_thresh; GtkWidget *edit_DE_stepFactor; GtkWidget *edit_imageWidth; GtkWidget *edit_imageHeight; GtkWidget *edit_shading; GtkWidget *edit_shadows; GtkWidget *edit_glow; GtkWidget *edit_ambient_occlusion; GtkWidget *edit_ambient; GtkWidget *edit_brightness; GtkWidget *edit_gamma; GtkWidget *edit_contrast; GtkWidget *edit_specular; GtkWidget *edit_reflect; GtkWidget *edit_AmbientOcclusionQuality; GtkWidget *edit_fileOutput; GtkWidget *edit_fileEnvMap; GtkWidget *edit_fileAmbient; GtkWidget *edit_fileBackground; GtkWidget *edit_fileKeyframes; GtkWidget *edit_step_forward; GtkWidget *edit_step_rotation; GtkWidget *edit_mouse_click_distance; GtkWidget *edit_animationDESpeed; GtkWidget *edit_color_seed; GtkWidget *edit_colour_saturation; GtkWidget *edit_tglad_folding_1; GtkWidget *edit_tglad_folding_2; GtkWidget *edit_spherical_folding_1; GtkWidget *edit_spherical_folding_2; GtkWidget *edit_color_speed; GtkWidget *edit_mainLightIntensity; GtkWidget *edit_auxLightIntensity; GtkWidget *edit_auxLightRandomSeed; GtkWidget *edit_auxLightNumber; GtkWidget *edit_auxLightMaxDist; GtkWidget *edit_auxLightDistributionRadius; GtkWidget *edit_auxLightPre1x; GtkWidget *edit_auxLightPre1y; GtkWidget *edit_auxLightPre1z; GtkWidget *edit_auxLightPre1intensity; GtkWidget *edit_auxLightPre2x; GtkWidget *edit_auxLightPre2y; GtkWidget *edit_auxLightPre2z; GtkWidget *edit_auxLightPre2intensity; GtkWidget *edit_auxLightPre3x; GtkWidget *edit_auxLightPre3y; GtkWidget *edit_auxLightPre3z; GtkWidget *edit_auxLightPre3intensity; GtkWidget *edit_auxLightPre4x; GtkWidget *edit_auxLightPre4y; GtkWidget *edit_auxLightPre4z; GtkWidget *edit_auxLightPre4intensity; GtkWidget *edit_auxLightVisibility; GtkWidget *edit_auxLightPlacementDistance; GtkWidget *edit_auxLightRandomCentreX; GtkWidget *edit_auxLightRandomCentreY; GtkWidget *edit_auxLightRandomCentreZ; GtkWidget *edit_mainLightAlfa; GtkWidget *edit_mainLightBeta; GtkWidget *edit_IFSAlfa; GtkWidget *edit_IFSBeta; GtkWidget *edit_IFSGamma; GtkWidget *edit_IFSScale; GtkWidget *edit_IFSOffsetX; GtkWidget *edit_IFSOffsetY; GtkWidget *edit_IFSOffsetZ; GtkWidget *edit_IFSEdgeX; GtkWidget *edit_IFSEdgeY; GtkWidget *edit_IFSEdgeZ; GtkWidget *edit_animationFramesPerKey; GtkWidget *edit_animationStartFrame; GtkWidget *edit_animationEndFrame; GtkWidget *edit_hybridIter[HYBRID_COUNT]; GtkWidget *edit_hybridPower[HYBRID_COUNT]; GtkWidget *edit_NavigatorAbsoluteDistance; GtkWidget *edit_stereoDistance; GtkWidget *edit_mandelboxScale; GtkWidget *edit_mandelboxFoldingLimit; GtkWidget *edit_mandelboxFoldingValue; GtkWidget *edit_mandelboxSpFoldingFixedRadius; GtkWidget *edit_mandelboxSpFoldingMinRadius; GtkWidget *edit_mandelboxRotation[MANDELBOX_FOLDS][3][3]; GtkWidget *edit_mandelboxRotationMain[3]; GtkWidget *edit_mandelboxColorFactorX; GtkWidget *edit_mandelboxColorFactorY; GtkWidget *edit_mandelboxColorFactorZ; GtkWidget *edit_mandelboxColorFactorR; GtkWidget *edit_mandelboxColorFactorSp1; GtkWidget *edit_mandelboxColorFactorSp2; GtkWidget *edit_mandelboxSharpness; GtkWidget *edit_mandelboxOffsetX; GtkWidget *edit_mandelboxOffsetY; GtkWidget *edit_mandelboxOffsetZ; GtkWidget *edit_mandelboxSolid; GtkWidget *edit_mandelboxMelt; GtkWidget *edit_viewMinDistance; GtkWidget *edit_viewMaxDistance; GtkWidget *edit_FractalConstantFactor; GtkWidget *edit_FoldingIntPowZFactor; GtkWidget *edit_FoldingIntPowFoldingFactor; GtkWidget *edit_roughness; GtkWidget *edit_volumetricLightMainIntensity; GtkWidget *edit_volumetricLightAux1Intensity; GtkWidget *edit_volumetricLightAux2Intensity; GtkWidget *edit_volumetricLightAux3Intensity; GtkWidget *edit_volumetricLightAux4Intensity; GtkWidget *edit_reflectionsMax; GtkWidget *edit_mandelboxVaryScale; GtkWidget *edit_mandelboxVaryRPower; GtkWidget *edit_mandelboxVaryFold; GtkWidget *edit_mandelboxVaryMinR; GtkWidget *edit_mandelboxVaryWAdd; GtkWidget *edit_cadd; GtkWidget *edit_volumetricFogDensity; GtkWidget *edit_volumetricFogColorDistance; GtkWidget *edit_volumetricFogColorDistance2; GtkWidget *edit_volumetricFogDistanceFact; GtkWidget *edit_fastAoTune; GtkWidget *edit_primitivePlaneCentreX; GtkWidget *edit_primitivePlaneCentreY; GtkWidget *edit_primitivePlaneCentreZ; GtkWidget *edit_primitivePlaneNormalX; GtkWidget *edit_primitivePlaneNormalY; GtkWidget *edit_primitivePlaneNormalZ; GtkWidget *edit_primitivePlaneReflect; GtkWidget *edit_primitiveBoxCentreX; GtkWidget *edit_primitiveBoxCentreY; GtkWidget *edit_primitiveBoxCentreZ; GtkWidget *edit_primitiveBoxSizeX; GtkWidget *edit_primitiveBoxSizeY; GtkWidget *edit_primitiveBoxSizeZ; GtkWidget *edit_primitiveBoxReflect; GtkWidget *edit_primitiveInvertedBoxCentreX; GtkWidget *edit_primitiveInvertedBoxCentreY; GtkWidget *edit_primitiveInvertedBoxCentreZ; GtkWidget *edit_primitiveInvertedBoxSizeX; GtkWidget *edit_primitiveInvertedBoxSizeY; GtkWidget *edit_primitiveInvertedBoxSizeZ; GtkWidget *edit_primitiveInvertedBoxReflect; GtkWidget *edit_primitiveSphereCentreX; GtkWidget *edit_primitiveSphereCentreY; GtkWidget *edit_primitiveSphereCentreZ; GtkWidget *edit_primitiveSphereRadius; GtkWidget *edit_primitiveSphereReflect; GtkWidget *edit_primitiveInvertedSphereCentreX; GtkWidget *edit_primitiveInvertedSphereCentreY; GtkWidget *edit_primitiveInvertedSphereCentreZ; GtkWidget *edit_primitiveInvertedSphereRadius; GtkWidget *edit_primitiveInvertedSphereReflect; GtkWidget *edit_primitiveWaterHeight; GtkWidget *edit_primitiveWaterAmplitude; GtkWidget *edit_primitiveWaterLength; GtkWidget *edit_primitiveWaterRotation; GtkWidget *edit_primitiveWaterIterations; GtkWidget *edit_primitiveWaterReflect; GtkWidget *edit_measureX; GtkWidget *edit_measureY; GtkWidget *edit_measureZ; GtkWidget *edit_tiles; GtkWidget *edit_OpenCLPixelsPerJob; GtkWidget *edit_OpenCLProcessingCycleTime; GtkWidget *edit_OpenCLMaxMem; GtkWidget *edit_OpenCLTextEditor; GtkWidget *edit_OpenCLDeltaDEStep; GtkWidget *edit_iterFogOpacityTrim; GtkWidget *edit_iterFogOpacity; GtkWidget *edit_netRenderServerPort; GtkWidget *edit_netRenderClientPort; GtkWidget *edit_netRenderClientName; GtkWidget *edit_fakeLightsOrbitTrapX; GtkWidget *edit_fakeLightsOrbitTrapY; GtkWidget *edit_fakeLightsOrbitTrapZ; GtkWidget *edit_fakeLightsIntensity; GtkWidget *edit_fakeLightsVisibility; GtkWidget *edit_fakeLightsVisibilitySize; GtkWidget *edit_fakeLightsMinIter; GtkWidget *edit_fakeLightsMaxIter; GtkWidget *edit_shadowConeAngle; GtkWidget *edit_customParameters[15]; GtkWidget *edit_primitiveWaterAnimSpeed; GtkWidget *label_animationFrame; GtkWidget *label_animationSpeed; GtkWidget *label_animationDistance; GtkWidget *label_fog_visibility; GtkWidget *label_SSAO_quality; GtkWidget *label_DOF_focus; GtkWidget *label_DOF_radius; GtkWidget *label_about; GtkWidget *label_auxLightPre1; GtkWidget *label_auxLightPre2; GtkWidget *label_auxLightPre3; GtkWidget *label_auxLightPre4; GtkWidget *label_IFSx; GtkWidget *label_IFSy; GtkWidget *label_IFSz; GtkWidget *label_IFSalfa; GtkWidget *label_IFSbeta; GtkWidget *label_IFSgamma; GtkWidget *label_IFSdistance; GtkWidget *label_IFSintensity; GtkWidget *label_IFSenabled; GtkWidget *label_keyframeInfo; GtkWidget *label_paletteOffset; GtkWidget *label_HybridFormula[HYBRID_COUNT]; GtkWidget *label_NavigatorEstimatedDistance; GtkWidget *label_DE_threshold; GtkWidget *label_measureDistance; GtkWidget *label_OpenClPlatformBy; GtkWidget *label_OpenClComputingUnits; GtkWidget *label_OpenClMaxWorkgroup; GtkWidget *label_OpenClMaxClock; GtkWidget *label_OpenClMemorySize; GtkWidget *label_OpenClWorkgroupSize; GtkWidget *label_OpenClStatus; GtkWidget *label_serverStatus; GtkWidget *label_clientStatus; GtkWidget *label_sliderFog; GtkWidget *label_sliderDOF; GtkWidget *comboFractType; GtkWidget *comboImageFormat; GtkWidget *comboHybridFormula[HYBRID_COUNT]; GtkWidget *comboHybridDEMethod; GtkWidget *comboPerspectiveType; GtkWidget *comboImageProportion; GtkWidget *comboGeneralizedFoldBoxType; GtkWidget *comboOpenCLEngine; GtkWidget *comboOpenCLDeviceIndex; GtkWidget *comboOpenCLPlatformIndex; GtkWidget *comboOpenCLGPUCPU; GtkWidget *comboOpenCLCustomFormulas; GtkWidget *comboOpenCLDEMode; GtkWidget *comboOpenCLDOFMode; GtkWidget *progressBar; GtkWidget *checkAmbientOcclusion; GtkWidget *checkFastAmbientOcclusion; GtkWidget *checkShadow; GtkWidget *checkIterThresh; GtkWidget *checkJulia; GtkWidget *checkLimits; GtkWidget *checkSlowShading; GtkWidget *checkBitmapBackground; GtkWidget *checkBitmapBackgroundFulldome; GtkWidget *checkAnimationSpeedDE; GtkWidget *checkColoring; GtkWidget *checkTgladMode; GtkWidget *checkSphericalFoldingMode; GtkWidget *checkIFSFoldingMode; GtkWidget *checkFogEnabled; GtkWidget *checkSSAOEnabled; GtkWidget *checkDOFEnabled; GtkWidget *checkZoomClickEnable; GtkWidget *checkAuxLightPre1Enabled; GtkWidget *checkAuxLightPre2Enabled; GtkWidget *checkAuxLightPre3Enabled; GtkWidget *checkAuxLightPre4Enabled; GtkWidget *checkIFSAbsX; GtkWidget *checkIFSAbsY; GtkWidget *checkIFSAbsZ; GtkWidget *checkIFSMengerSponge; GtkWidget *checkAutoSaveImage; GtkWidget *checkHybridCyclic; GtkWidget *checkNavigatorAbsoluteDistance; GtkWidget *checkNavigatorGoToSurface; GtkWidget *checkStraightRotation; GtkWidget *checkStereoEnabled; GtkWidget *checkMandelboxRotationsEnable; GtkWidget *checkInteriorMode; GtkWidget *checkDELinearMode; GtkWidget *checkConstantDEThreshold; GtkWidget *checkVolumetricLightMainEnabled; GtkWidget *checkVolumetricLightAux1Enabled; GtkWidget *checkVolumetricLightAux2Enabled; GtkWidget *checkVolumetricLightAux3Enabled; GtkWidget *checkVolumetricLightAux4Enabled; GtkWidget *checkPenetratingLights; GtkWidget *checkRaytracedReflections; GtkWidget *checkPrimitivePlaneEnabled; GtkWidget *checkPrimitiveBoxEnabled; GtkWidget *checkPrimitiveInvertedBoxEnabled; GtkWidget *checkPrimitiveSphereEnabled; GtkWidget *checkPrimitiveInvertedSphereEnabled; GtkWidget *checkPrimitiveWaterEnabled; GtkWidget *checkOpenClEnable; GtkWidget *checkOpenClCustomEnable; GtkWidget *checkIterFogEnable; GtkWidget *checkNetRenderServerEnable; GtkWidget *checkNetRenderServerScan; GtkWidget *checkNetRenderClientEnable; GtkWidget *checkPrimitiveOnlyPlane; GtkWidget *checkFakeLightsEnabled; GtkWidget *checkHDR; GtkWidget *colorSelectionGlow1; GtkWidget *colorSelectionGlow2; GtkWidget *pixmap_up; GtkWidget *pixmap_down; GtkWidget *pixmap_left; GtkWidget *pixmap_right; GtkWidget *pixmap_rotate_left; GtkWidget *pixmap_rotate_right; GtkWidget *pixmap_move_up; GtkWidget *pixmap_move_down; GtkWidget *pixmap_move_left; GtkWidget *pixmap_move_right; GtkWidget *sliderFogDepth; GtkWidget *sliderSSAOQuality; GtkWidget *sliderDOFFocus; GtkWidget *sliderDOFRadius; GtkWidget *sliderPaletteOffset; GtkObject *adjustmentFogDepth; GtkObject *adjustmentSSAOQuality; GtkObject *adjustmentDOFFocus; GtkObject *adjustmentDOFRadius; GtkObject *adjustmentPaletteOffset; sInterfaceIFS IFSParams[IFS_VECTOR_COUNT]; }; struct sDialogFiles { GtkWidget *window_files; GtkWidget *box_main; GtkWidget *box_buttons; GtkWidget *boxFilePath; GtkWidget *boxFileBackground; GtkWidget *boxFileImage; GtkWidget *boxFileEnvMap; GtkWidget *boxFileAmbient; GtkWidget *boxFileKeyframes; GtkWidget *table_edits; GtkWidget *label_destination; GtkWidget *label_envmap; GtkWidget *label_lightmap; GtkWidget *label_background; GtkWidget *label_path; GtkWidget *label_keyframes; GtkWidget *edit_destination; GtkWidget *edit_envmap; GtkWidget *edit_lightmap; GtkWidget *edit_background; GtkWidget *edit_path; GtkWidget *edit_keyframes; GtkWidget *bu_ok; GtkWidget *bu_cancel; GtkWidget *bu_select_destination; GtkWidget *bu_select_envmap; GtkWidget *bu_select_lightmap; GtkWidget *bu_select_background; GtkWidget *bu_select_path; GtkWidget *bu_select_keyframes; }; struct sTimelineInterface { GtkWidget **darea; GtkWidget **label; GtkWidget *table; GtkAdjustment *windowHadjustment; GtkAdjustment *windowVadjustment; GtkWidget *scrolledWindow; GtkWidget *layoutContainer; GtkWidget *boxMain; GtkWidget *boxTable; GtkWidget *boxButtons; GtkWidget *buAnimationRecordKey2; GtkWidget *buAnimationInsertKeyframe; GtkWidget *buAnimationDeleteKeyframe; GtkWidget *buNextKeyframe; GtkWidget *buPreviousKeyframe; GtkWidget *buRefresh; GtkWidget *editAnimationKeyNumber; }; struct sInterface_data { bool disableInitRefresh; double imageScale; bool animMode; bool recordMode; bool continueRecord; bool playMode; bool keyframeMode; enumImageFormat imageFormat; char file_destination[1000]; char file_envmap[1000]; char file_background[1000]; char file_lightmap[1000]; char file_path[1000]; char file_keyframes[1000]; int franeNo; int tileCount; sRGB palette[256]; }; struct sNoGUIdata { char settingsFile[1000]; bool animMode; bool playMode; bool keyframeMode; bool netrenderMode; int startFrame; int endFrame; char netRenderIPString[20]; char netRenderPortString[6]; enumImageFormat imageFormat; sParamRender fractparams; std::vector overrideStrings; }; struct sAppSettings { #ifdef CLSUPPORT bool oclUseCPU; int oclDeviceIndex; int oclPlatformIndex; int oclEngineSelection; double oclCycleTime; double oclMemoryLimit; std::string oclTextEditor; #endif bool absoluteMovementModeEnabled; bool zoomByMouseClickEnabled; bool goCloseToSurfaceEnabled; double cameraMoveStepRelative; double cameraMoveStepAbsolute; double rotationStep; double mouseCloseUpRatio; std::string netRenderClientPort; std::string netRenderClientIP; std::string netRenderServerPort; }; //Global variables extern sMainWindow renderWindow; extern sInterface Interface; extern sTimelineInterface timelineInterface; extern sInterface_data Interface_data; extern sNoGUIdata noGUIdata; extern GtkWidget *window_histogram, *window_interface; extern GtkWidget *darea2, *darea3; extern GtkWidget *dareaPalette; extern int x_mouse; extern int y_mouse; extern bool programClosed; extern bool interfaceCreated; extern bool paletteViewCreated; extern char lastFilenameImage[1000]; extern char lastFilenameSettings[1000]; extern char lastFilenamePalette[1000]; extern GtkWidget *timeLineWindow; extern GtkClipboard *clipboard; //functions char* DoubleToString(double value); char* IntToString(int value); GtkWidget* CreateEdit(const gchar *text, const gchar *txt_label, int size, GtkWidget *edit); GtkWidget* CreateWidgetWithLabel(const gchar *txt_label, GtkWidget *widget); void CreateInterface(sParamRender *default_settings); void ReadInterface(sParamRender *params); void WriteInterface(sParamRender *params); void CreateFilesDialog(GtkWidget *widget, gpointer data); void CreateTooltips(void); bool ReadComandlineParams(int argc, char *argv[]); double atofData(const gchar* text); void AddComboTextsFractalFormula(GtkComboBox *combo); enumFractalFormula FormulaNumberGUI2Data(int formula); int FormulaNumberData2GUI(enumFractalFormula formula); void Params2InterfaceData(sParamRender *source); void InterfaceData2Params(sParamRender *dest); void CheckPrameters(sParamRender *params); sRGB GdkColor2sRGB(GdkColor color); GdkColor sRGB2GdkColor(sRGB color); sRGB sRGBDiv256(sRGB color); void ReadInterfaceAppSettings(sAppSettings *appParams); void WriteInterfaceAppSettings(sAppSettings *appParams); #ifdef CLSUPPORT void Params2Cl(const sParamRender *params, sClInBuff *clInBuff, sClInConstants *clConstantsBuff); matrix33 RotMatrix2matrix33(CRotationMatrix rot); cl_float4 CVector2float3(CVector3 vect); cl_float4 sRGB2float3(sRGB colour, double factor); #endif #endif /* INTERFACE_H_ */ mandelbulber1.21-1.orig/src/primitives.h0000644000175000017500000000163512274512437021214 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions for calculating shapes of primitive objects / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef PRIMITIVES_H_ #define PRIMITIVES_H_ #include "algebra.hpp" double PrimitivePlane(CVector3 point, CVector3 centre, CVector3 normal); double PrimitiveInvertedBox(CVector3 point, CVector3 center, CVector3 size); double PrimitiveBox(CVector3 point, CVector3 center, CVector3 size); double PrimitiveSphere(CVector3 point, CVector3 center, double radius); double PrimitiveInvertedSphere(CVector3 point, CVector3 center, double radius); double PrimitiveWater(CVector3 point, double height, double amplitude, double length, double rotation, int iterations, double animSpeed, int frame); #endif /* PRIMITIVES_HPP_ */ mandelbulber1.21-1.orig/src/netrender.cpp0000644000175000017500000004444312274512437021346 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for rendering with several network clients / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include "netrender.hpp" #include #ifndef WIN32 #include #endif CNetRender *netRender; //---------------- Constructor --------------------- CNetRender::CNetRender(int myVersion, int CPUs) { memset(&host_info, 0, sizeof host_info); host_info_list = NULL; status = 0; isServer = false; isClient = false; socketfd = 0; clientIndex = 0; version = myVersion; dataBuffer = NULL; dataSize = 0; noOfCPUs = CPUs; lastIdentifier = 0; #ifdef WIN32 WORD wVersionRequested; WSADATA wsaData; int err; /* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */ wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { /* Tell the user that we could not find a usable */ /* Winsock DLL. */ printf("WSAStartup failed with error: %d\n", err); } #endif } //------------------ Destructor --------------------- CNetRender::~CNetRender() { if (dataBuffer) delete [] dataBuffer; } //------------------- Set Server --------------------- bool CNetRender::SetServer(char *portNo, char *statusOut) { memset(&host_info, 0, sizeof host_info); host_info.ai_family = AF_INET; // IP version not specified. Can be both. host_info.ai_socktype = SOCK_STREAM; // Use SOCK_STREAM for TCP or SOCK_DGRAM for UDP. host_info.ai_flags = AI_PASSIVE; // IP Wildcard status = getaddrinfo(NULL, portNo, &host_info, &host_info_list); if (status != 0) std::cout << "getaddrinfo error" << gai_strerror(status) ; std::cout << "Creating a socket..." << std::endl; socketfd = socket(host_info_list->ai_family, host_info_list->ai_socktype, host_info_list->ai_protocol); if (socketfd == -1) std::cout << "socket error " << strerror(errno); std::cout << "Binding socket..." << std::endl; // we use to make the setsockopt() function to make sure the port is not in use // by a previous execution of our code. (see man page for more information) char yes = 1; status = setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)); #ifndef WIN32 struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; #else DWORD timeout = 1000; #endif if (setsockopt (socketfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) std::cout << "socket options error " << strerror(errno); if (setsockopt (socketfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) std::cout << "socket options error " << strerror(errno); status = bind(socketfd, host_info_list->ai_addr, host_info_list->ai_addrlen); if (status == -1) { std::cout << "bind error" << std::endl ; return false; } else { strcpy(statusOut,"status: server enabled"); printf("Server enabled\n"); isServer = true; return true; } } //------------------- Delete Server ---------------------- void CNetRender::DeleteServer(void) { if(host_info_list) freeaddrinfo(host_info_list); if(socketfd > 0) close(socketfd); if(clients.size() > 0) { for(unsigned int i=0; iai_family, host_info_list->ai_socktype, host_info_list->ai_protocol); if (socketfd == -1) std::cout << "socket error " << strerror(errno); #ifndef WIN32 struct timeval timeout; timeout.tv_sec = 1; timeout.tv_usec = 0; #else DWORD timeout = 1000; #endif if (setsockopt (socketfd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout)) < 0) std::cout << "socket options error " << strerror(errno); if (setsockopt (socketfd, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout, sizeof(timeout)) < 0) std::cout << "socket options error " << strerror(errno); //connecting to server std::cout << "Connect()ing..." << std::endl; status = connect(socketfd, host_info_list->ai_addr, host_info_list->ai_addrlen); if (status == -1) { std::cout << "connect error" << strerror(errno); strcpy(statusOut, strerror(errno)); return false; } else { strcpy(statusOut,"status: client connected to server"); printf("Client connected to server\n"); //sending version number char command[4]; size_t recvd_bytes = receiveDataFromServer(command); if(!strcmp("ver", command)) { size_t len = sizeof(version); sendDataToServer(&version, len, (char*)"VER"); } //checking aswer regarding version recvd_bytes = receiveDataFromServer(command); if(!strcmp("ok.", command)) { printf("Client version approved\n"); isClient = true; recvd_bytes = receiveDataFromServer(command); if(!strcmp("cpu", command)) { sendDataToServer(&noOfCPUs, sizeof(noOfCPUs), (char*)"CPU"); } return true; } else if(!strcmp("bad", command)) { int serverVersion = 0; if(recvd_bytes == sizeof(int)) GetData(&serverVersion); printf("Client version refused. Server version is %f\n", serverVersion/1000.0); isClient = false; sprintf(statusOut,"status: client has wrong version. Server is %f", serverVersion/1000.0); printf("Client disconnected from server because client version is wrong\n"); return false; } else { sprintf(statusOut,"status: communication error during version verification"); printf("communication error during version verification"); return false; } } } //---------------- Delete Client ------------------------ void CNetRender::DeleteClient(void) { if(host_info_list) freeaddrinfo(host_info_list); if(socketfd > 0) close(socketfd); } //------------------ Wait for client ------------------- bool CNetRender::WaitForClient(char *statusOut) { //std::cout << "Listen()ing for connections..." << std::endl; status = listen(socketfd, 5); if (status == -1) { //std::cout << "listen error" << std::endl; strcpy(statusOut,"status: listen error"); return false; } //accepting donnection struct sockaddr_storage their_addr; socklen_t addr_size = sizeof(their_addr); sClients newClient; memset(&newClient, 0, sizeof(newClient)); fd_set set; struct timeval timeout; int rv; FD_ZERO(&set); // clear the set FD_SET(socketfd, &set); // add file descriptor to the set timeout.tv_sec = 1; timeout.tv_usec = 0; rv = select(socketfd + 1, &set, NULL, NULL, &timeout); if (rv == -1) { perror("select"); // an error accured strcpy(statusOut,"status: socket error"); return false; } else if (rv == 0) { //printf("timeout occurred (1 second) \n"); // a timeout occured newClient.socketfd = -1; } else newClient.socketfd = accept(socketfd, (struct sockaddr *) &their_addr, &addr_size); if (newClient.socketfd == -1) { //std::cout << "listen error" << std::endl; strcpy(statusOut,"status: client not found"); return false; } else { std::cout << "Connection accepted. Using new socketfd : " << newClient.socketfd << std::endl; #ifndef WIN32 //getting IP address socklen_t len; struct sockaddr_storage addr; char ipstr[INET6_ADDRSTRLEN]; int port; len = sizeof addr; getpeername(newClient.socketfd, (struct sockaddr*)&addr, &len); // deal with both IPv4 and IPv6: if (addr.ss_family == AF_INET) { struct sockaddr_in *saddr = (struct sockaddr_in *)&addr; port = ntohs(saddr->sin_port); inet_ntop(AF_INET, &saddr->sin_addr, ipstr, sizeof ipstr); } else { // AF_INET6 struct sockaddr_in6 *saddr = (struct sockaddr_in6 *)&addr; port = ntohs(saddr->sin6_port); inet_ntop(AF_INET6, &saddr->sin6_addr, ipstr, sizeof ipstr); } strcpy(newClient.ipstr, ipstr); newClient.port = port; #else strcpy(newClient.ipstr, "IP unknown"); #endif //remembering new client clients.push_back(newClient); clientIndex = clients.size(); //preparing status char stat[1000]; #ifndef WIN32 sprintf(stat,"status: Client #%d has IP address: %s, port %d\n", clientIndex, ipstr, port); #else sprintf(stat,"status: Client #%d connected\n", clientIndex); #endif strcpy(statusOut, stat); std::cout << stat; //checking client version int clientVersion = 0; sendDataToClient(NULL, 0, (char*)"ver", clientIndex-1, 0); char command[4]; size_t recvd_bytes = receiveDataFromClient(command, clientIndex-1, 0); if(!strcmp("VER", command) && recvd_bytes == sizeof(int)) { GetData(&clientVersion); } if(clientVersion == version) { printf("Client version is correct\n"); //sending answer sendDataToClient(NULL, 0, (char*)"ok.", clientIndex-1, 0); //ask for number of CPUs sendDataToClient(NULL, 0, (char*)"cpu", clientIndex-1, 0); recvd_bytes = receiveDataFromClient(command, clientIndex-1, 0); if(!strcmp("CPU", command) && recvd_bytes == sizeof(int)) { int noOfCpu; GetData(&noOfCpu); clients[clientIndex-1].noOfCPU = noOfCpu; printf("Client #%d has %d CPUs\n", clientIndex, noOfCpu); } return true; } else { printf("Wrong client version\n"); //sending answer sendDataToClient(&version, sizeof(version), (char*)"bad", clientIndex-1, 0); //deleting client clients.erase(clients.end()-1); return false; } } } //--------------- Send data to client ---------------------- bool CNetRender::sendDataToClient(void *data, size_t size, char *command, int index, int32_t identifier) { //printf("Sending %d bytes data with command %s...\n", size, command); uint64_t size64 = size; send(clients[index].socketfd, command, 4, 0); #ifdef WIN32 send(clients[index].socketfd, (const char*)&identifier, sizeof(identifier), 0); send(clients[index].socketfd, (const char*)&size64, sizeof(size64), 0); #else send(clients[index].socketfd, &identifier, sizeof(identifier), 0); send(clients[index].socketfd, &size64, sizeof(size64), 0); #endif sHeader header; memset(&header,0,sizeof(header)); memcpy(header.command, command, sizeof(char[4])); header.size64 = size64; header.identifier = identifier; uint16_t crc = CRC_Fletcher16((uint8_t*)&header, sizeof(header)); #ifdef WIN32 send(clients[index].socketfd, (const char*)&crc, sizeof(crc), 0); #else send(clients[index].socketfd, &crc, sizeof(crc), 0); #endif size_t send_left = size; char *dataPointer = (char*)data; while(send_left > 0) { ssize_t bytes_send = send(clients[index].socketfd, dataPointer, send_left, 0); if (bytes_send == -1) return false; send_left -= bytes_send; dataPointer += bytes_send; //printf("Sent %d bytes\n", bytes_send); } if(size > 0) { uint16_t crcData = CRC_Fletcher16((uint8_t*)data, size); #ifdef WIN32 send(clients[index].socketfd, (const char*)&crcData, sizeof(crcData), 0); #else send(clients[index].socketfd, &crcData, sizeof(crcData), 0); #endif } return true; } //-------------- Send data to server -------------------- bool CNetRender::sendDataToServer(void *data, size_t size, char *command) { //printf("Sending %d bytes data with command %s...\n", size, command); uint64_t size64 = size; send(socketfd, command, 4, 0); int32_t identifier = lastIdentifier; #ifdef WIN32 send(socketfd, (const char*)&identifier, sizeof(identifier), 0); send(socketfd, (const char*)&size64, sizeof(size64), 0); #else send(socketfd, &identifier, sizeof(identifier), 0); send(socketfd, &size64, sizeof(size64), 0); #endif sHeader header; memset(&header,0,sizeof(header)); memcpy(header.command, command, sizeof(char[4])); header.size64 = size64; header.identifier = identifier; uint16_t crc = CRC_Fletcher16((uint8_t*)&header, sizeof(header)); #ifdef WIN32 send(socketfd, (const char*)&crc, sizeof(crc), 0); #else send(socketfd, &crc, sizeof(crc), 0); #endif size_t send_left = size; char *dataPointer = (char*)data; while(send_left > 0) { ssize_t bytes_send = send(socketfd, dataPointer, send_left, 0); if (bytes_send == -1) return false; send_left -= bytes_send; dataPointer += bytes_send; //printf("Sent %d bytes\n", bytes_send); } if(size > 0) { uint16_t crcData = CRC_Fletcher16((uint8_t*)data, size); #ifdef WIN32 send(socketfd, (const char*)&crcData, sizeof(crcData), 0); #else send(socketfd, &crcData, sizeof(crcData), 0); #endif } return true; } //------------------- Receive data from server ----------------------- size_t CNetRender::receiveDataFromServer(char *command) { dataSize = 0; //printf("Waiting for data...\n"); memset(command,0,4); ssize_t bytes_recvd = recv(socketfd, command, 4, 0); if (bytes_recvd <= 0) { if(errno != 11) { std::cout << errno << strerror(errno) << endl; } return 0; } //printf("Received command: %s\n", command); uint64_t size64 = 0; int32_t identifier; #ifdef WIN32 recv(socketfd, (char*)&identifier, sizeof(identifier), 0); recv(socketfd, (char*)&size64, sizeof(size64), 0); #else recv(socketfd, &identifier, sizeof(identifier), 0); recv(socketfd, &size64, sizeof(size64), 0); #endif sHeader header; memset(&header,0,sizeof(header)); memcpy(header.command, command, sizeof(char[4])); header.size64 = size64; header.identifier = identifier; uint16_t crc = CRC_Fletcher16((uint8_t*)&header, sizeof(header)); uint16_t crc2 = 0; #ifdef WIN32 recv(socketfd, (char*)&crc2, sizeof(crc2), 0); #else recv(socketfd, &crc2, sizeof(crc2), 0); #endif if(crc != crc2) { printf("Data header crc error\n"); char scrapBuffer[1000]; do { bytes_recvd = recv(socketfd, scrapBuffer, 1000, 0); } while(bytes_recvd > 0); return 0; } lastIdentifier = identifier; //printf("Will be received %d bytes\n", size); if (size64 > 0) { if(dataBuffer) delete [] dataBuffer; dataBuffer = new char[size64]; char *dataPointer = dataBuffer; size_t rcv_left = size64; while(rcv_left > 0) { bytes_recvd = recv(socketfd, dataPointer, rcv_left, 0); //printf("%d bytes received\n", bytes_recvd); if(bytes_recvd == -1) { printf("Data receive error\n"); return 0; } rcv_left -= bytes_recvd; dataPointer += bytes_recvd; } uint16_t crcData = CRC_Fletcher16((uint8_t*)dataBuffer, size64); uint16_t crcData2 = 0; #ifdef WIN32 recv(socketfd, (char*)&crcData2, sizeof(crcData2), 0); #else recv(socketfd, &crcData2, sizeof(crcData2), 0); #endif if(crcData != crcData2) { printf("Received data crc error\n"); char scrapBuffer[1000]; do { bytes_recvd = recv(socketfd, scrapBuffer, 1000, 0); } while(bytes_recvd > 0); return 0; } dataSize = size64; } return size64; } //--------------- receive data from client -------------------- size_t CNetRender::receiveDataFromClient(char *command, int index, int32_t reqIdentifier) { //printf("Waiting for data...\n"); memset(command,0,4); ssize_t bytes_recvd = recv(clients[index].socketfd, command, 4, 0); if (bytes_recvd <= 0) { if(errno != 11) { std::cout << errno << strerror(errno) << endl; } return 0; } //printf("Received command: %s\n", command); uint64_t size64 = 0; int32_t identifier; #ifdef WIN32 recv(clients[index].socketfd, (char*)&identifier, sizeof(identifier), 0); recv(clients[index].socketfd, (char*)&size64, sizeof(size64), 0); #else recv(clients[index].socketfd, &identifier, sizeof(identifier), 0); recv(clients[index].socketfd, &size64, sizeof(size64), 0); #endif //printf("Will be received %d bytes\n", size); sHeader header; memset(&header,0,sizeof(header)); memcpy(header.command, command, sizeof(char[4])); header.size64 = size64; header.identifier = identifier; uint16_t crc = CRC_Fletcher16((uint8_t*)&header, sizeof(header)); uint16_t crc2 = 0; #ifdef WIN32 recv(clients[index].socketfd, (char*)&crc2, sizeof(crc2), 0); #else recv(clients[index].socketfd, &crc2, sizeof(crc2), 0); #endif if(crc != crc2) { printf("Data header crc error\n"); char scrapBuffer[1000]; do { bytes_recvd = recv(clients[index].socketfd, scrapBuffer, 1000, 0); } while(bytes_recvd > 0); return 0; } if(identifier != reqIdentifier) { printf("Data identifier error (lost synchronization)\n"); char scrapBuffer[1000]; do { bytes_recvd = recv(clients[index].socketfd, scrapBuffer, 1000, 0); } while (bytes_recvd > 0); return 0; } if (size64 > 0) { if(dataBuffer) delete [] dataBuffer; dataBuffer = new char[size64]; char *dataPointer = dataBuffer; size_t rcv_left = size64; while(rcv_left > 0) { bytes_recvd = recv(clients[index].socketfd, dataPointer, rcv_left, 0); //printf("%d bytes received\n", bytes_recvd); if(bytes_recvd == -1) { printf("Data receive error\n"); return 0; } rcv_left -= bytes_recvd; dataPointer += bytes_recvd; } uint16_t crcData = CRC_Fletcher16((uint8_t*)dataBuffer, size64); uint16_t crcData2 = 0; #ifdef WIN32 recv(clients[index].socketfd, (char*)&crcData2, sizeof(crcData2), 0); #else recv(clients[index].socketfd, &crcData2, sizeof(crcData2), 0); #endif if(crcData != crcData2) { printf("Received data crc error\n"); char scrapBuffer[1000]; do { bytes_recvd = recv(socketfd, scrapBuffer, 1000, 0); } while(bytes_recvd > 0); return 0; } dataSize = size64; } return size64; } //--------------- Get data ----------------- void CNetRender::GetData(void *data) { memcpy(data, dataBuffer, dataSize); } //------------------------ Fletchers checsum ----------------- //source: http://en.wikipedia.org/wiki/Fletcher's 16-bit checksum uint16_t CNetRender::CRC_Fletcher16(uint8_t const *data, size_t bytes) { uint16_t sum1 = 0xff, sum2 = 0xff; while (bytes) { size_t tlen = bytes > 20 ? 20 : bytes; bytes -= tlen; do { sum2 += sum1 += *data++; } while (--tlen); sum1 = (sum1 & 0xff) + (sum1 >> 8); sum2 = (sum2 & 0xff) + (sum2 >> 8); } /* Second reduction step to reduce sums to 8 bits */ sum1 = (sum1 & 0xff) + (sum1 >> 8); sum2 = (sum2 & 0xff) + (sum2 >> 8); return sum2 << 8 | sum1; } mandelbulber1.21-1.orig/src/undo.hpp0000644000175000017500000000122212274512437020316 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for undo buffer / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef UNDO_HPP_ #define UNDO_HPP_ #include "fractparams.h" class CParamsUndo { public: CParamsUndo(void); void SaveUndo(sParamRender *params); bool GetUndo(sParamRender *params); bool GetRedo(sParamRender *params); void LoadStatus(void); private: void SaveStatus(void); int count; int last; int level; int max; }; extern CParamsUndo undoBuffer; #endif /* UNDO_HPP_ */ mandelbulber1.21-1.orig/src/fractparams.h0000644000175000017500000000723612274512437021327 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / definition of structures for image and effect / parameters / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef FRACTPARAMS_H_ #define FRACTPARAMS_H_ #include "fractal.h" #include "texture.hpp" struct sParamRenderD { double zoom; //zoom double DE_factor; //factor for distance estimation steps double resolution; //resolution of image in fractal coordinates double persp; //perspective factor double quality; //DE threshold factor double smoothness; double alpha; //rotation of fractal double beta; // double gamma; double DOFFocus; double DOFRadius; double mainLightAlpha; double mainLightBeta; double auxLightIntensity; double auxLightMaxDist; double auxLightDistributionRadius; double auxLightVisibility; double auxLightPreIntensity[4]; double stereoEyeDistance; double viewDistanceMin; double viewDistanceMax; double volumetricLightIntensity[5]; double fogDensity; double fogColour1Distance; double fogColour2Distance; double fogDistanceFactor; double colourSaturation; double fastAoTune; double iterFogOpacity; double iterFogOpacityTrim; double fakeLightsIntensity; double fakeLightsVisibility; double fakeLightsVisibilitySize; double shadowConeAngle; double primitivePlaneReflect; double primitiveBoxReflect; double primitiveInvertedBoxReflect; double primitiveSphereReflect; double primitiveInvertedSphereReflect; double primitiveWaterReflect; sImageAdjustments imageAdjustments; CVector3 vp; //view point CVector3 auxLightPre[4]; CVector3 auxLightRandomCenter; }; struct sParamRender { sParamRenderD doubles; sFractal fractal; int image_width; //image width int image_height; //image height int globalIlumQuality; //ambient occlusion quality int reflectionsMax; int coloring_seed; //colouring random seed int auxLightRandomSeed; int auxLightNumber; int SSAOQuality; int startFrame; int endFrame; int framesPerKeyframe; int imageFormat; int noOfTiles; int tileCount; int OpenCLEngine; int OpenCLPixelsPerJob; int OpenCLDOFMethod; enumPerspectiveType perspectiveType; bool shadow; //enable shadows bool global_ilumination; //enable global ilumination bool fastGlobalIllumination; //enable fake global ilumination bool slowShading; //enable fake gradient calculation for shading bool texturedBackground; //enable testured background bool background_as_fulldome; bool recordMode; //path recording mode bool continueRecord; //continue recording mode bool playMode; //play mode bool animMode; //animation mode bool SSAOEnabled; bool DOFEnabled; bool auxLightPreEnabled[4]; bool volumetricLightEnabled[5]; bool penetratingLights; bool stereoEnabled; bool quiet; bool fishEyeCut; bool fakeLightsEnabled; sImageSwitches imageSwitches; sRGB background_color1; //background colour sRGB background_color2; sRGB background_color3; sRGB auxLightPreColour[4]; sRGB fogColour1; sRGB fogColour2; sRGB fogColour3; sRGB primitivePlaneColour; sRGB primitiveBoxColour; sRGB primitiveInvertedBoxColour; sRGB primitiveSphereColour; sRGB primitiveInvertedSphereColour; sRGB primitiveWaterColour; sEffectColours effectColours; sRGB palette[256]; char file_destination[1000]; char file_envmap[1000]; char file_background[1000]; char file_lightmap[1000]; char file_path[1000]; char file_keyframes[1000]; cTexture *backgroundTexture; cTexture *envmapTexture; cTexture *lightmapTexture; std::vector formulaSequence; std::vector hybridPowerSequence; double settingsVersion; }; #endif /* FRACTPARAMS_H_ */ mandelbulber1.21-1.orig/src/image.h0000644000175000017500000000222412274512437020076 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions for image post-processing / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef IMAGE_H_ #define IMAGE_H_ #include "cimage.hpp" #include "fractparams.h" struct sSSAOparams { int threadNo; cImage *image; double persp; int quality; int done; enumPerspectiveType perspectiveType; int progressive; bool quiet; }; extern sRGB *buddhabrotImg; extern bool isBuddhabrot; extern double buddhabrotAutoBright; extern guint64 histogram[256]; extern unsigned int histogram2[1000]; void NewPalette(sRGB *p, double nasycenie); void DrawHistogram(void); void DrawHistogram2(void); void PostRendering_SSAO(cImage *image, double persp, int quality, enumPerspectiveType perspectiveType, bool quiet); void PostRendering_DOF(cImage *image, double deep, double neutral); void DrawPalette(sRGB *palette); void MakeStereoImage(cImage *left, cImage *right, guchar *stereoImage); void StereoPreview(cImage *temoraryImage, guchar *stereoImage); #endif /* IMAGE_H_ */ mandelbulber1.21-1.orig/src/fractal.cpp0000644000175000017500000011371312274512437020771 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / fractal iteration functions and distance estimation / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include "Render3D.h" #include "interface.h" #include "primitives.h" #include unsigned int MixNumbers(double a, double b, double c) { unsigned int result = int(a*12356312.0)^int(b*23564234.0)^int(c*35564353.0); //printf("%ud\n", result); return result; } int Noise(int seed) { int x = seed; x = (x<<7) ^ x; return abs((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff); } /** * Compute the fractal at the point, in one of the various modes * * Mode: normal: Returns distance * fake_ao: Returns minimum radius * colouring: Returns colour index * delta_DE1, delta_DE2: Returns radius */ template double Compute(CVector3 z, const sFractal &par, int *iter_count) { int L; double distance = 0; double w = 0; double constantw = 0; CVector3 dz(1.0, 0.0, 0.0); CVector3 one(1.0, 0.0, 0.0); double r_dz = 1; double ph_dz = 0; double th_dz = 0; double p = par.doubles.power; //mandelbulb power int N = par.doubles.N; CVector3 constant; double fixedRadius = par.mandelbox.doubles.foldingSphericalFixed; double fR2 = fixedRadius * fixedRadius; double minRadius = par.mandelbox.doubles.foldingSphericalMin; double mR2 = minRadius * minRadius; double tglad_factor1 = fR2 / mR2; double tgladDE = 1.0; double orbitTrapTotal = 0.0; double scale = par.mandelbox.doubles.scale; enumFractalFormula actualFormula = par.formula; if (actualFormula == kaleidoscopic || actualFormula == menger_sponge) tgladDE = 1.0; double tgladColor = 1.0; if (par.juliaMode) { constant = par.doubles.julia; } else { constant = z * par.doubles.constantFactor; } bool hybridEnabled = false; if (actualFormula == hybrid) hybridEnabled = true; double r = z.Length(); double min = 1e200; for (L = 0; L < N; L++) { if (hybridEnabled) { int tempL = L; if(tempL > (int)par.formulaSequence.size()-1) tempL = (int)par.formulaSequence.size()-1; actualFormula = par.formulaSequence[tempL]; p = par.hybridPowerSequence[tempL]; scale = p; } if (par.IFS.foldingMode) { if (par.IFS.absX) z.x = fabs(z.x); if (par.IFS.absY) z.y = fabs(z.y); if (par.IFS.absZ) z.z = fabs(z.z); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { if (par.IFS.enabled[i]) { z = par.IFS.rot[i].RotateVector(z); double length = z.Dot(par.IFS.doubles.direction[i]); if (length < par.IFS.doubles.distance[i]) { z -= par.IFS.doubles.direction[i] * 2.0 * (length - par.IFS.doubles.distance[i]); } } } z = par.IFS.mainRot.RotateVector(z - par.IFS.doubles.offset) + par.IFS.doubles.offset; z *= par.IFS.doubles.scale; z -= par.IFS.doubles.offset * (par.IFS.doubles.scale - 1.0); r = z.Length(); } if (par.tgladFoldingMode) { if (z.x > par.doubles.foldingLimit) { z.x = par.doubles.foldingValue - z.x; tgladColor *= 0.9; } else if (z.x < -par.doubles.foldingLimit) { z.x = -par.doubles.foldingValue - z.x; tgladColor *= 0.9; } if (z.y > par.doubles.foldingLimit) { z.y = par.doubles.foldingValue - z.y; tgladColor *= 0.9; } else if (z.y < -par.doubles.foldingLimit) { z.y = -par.doubles.foldingValue - z.y; tgladColor *= 0.9; } if (z.z > par.doubles.foldingLimit) { z.z = par.doubles.foldingValue - z.z; tgladColor *= 0.9; } else if (z.z < -par.doubles.foldingLimit) { z.z = -par.doubles.foldingValue - z.z; tgladColor *= 0.9; } r = z.Length(); } if (par.sphericalFoldingMode) { double fR2_2 = par.doubles.foldingSphericalFixed * par.doubles.foldingSphericalFixed; double mR2_2 = par.doubles.foldingSphericalMin * par.doubles.foldingSphericalMin; double r2_2 = r * r; double tglad_factor1_2 = fR2_2 / mR2_2; if (r2_2 < mR2_2) { z = z * tglad_factor1_2; tgladDE *= tglad_factor1_2; tgladColor += 1; } else if (r2_2 < fR2_2) { double tglad_factor2_2 = fR2_2 / r2_2; z = z * tglad_factor2_2; tgladDE *= tglad_factor2_2; tgladColor += 10; } r = z.Length(); } switch (actualFormula) { case trig_DE: { double r1 = pow(r, p - 1); double r2 = r1 * r; double th = z.GetAlfa(); double ph = -z.GetBeta(); if (Mode == 0) { double p_r1_rdz = p * r1 * r_dz; double ph_phdz = (p - 1.0) * ph + ph_dz; double th_thdz = (p - 1.0) * th + th_dz; CVector3 rot(th_thdz, ph_phdz); dz = rot * p_r1_rdz + one; r_dz = dz.Length(); th_dz = dz.GetAlfa(); ph_dz = -dz.GetBeta(); } CVector3 rot(p * th, p * ph); z = rot * r2 + constant; r = z.Length(); break; } case trig_optim: { //optimisation based on: http://www.fractalforums.com/mandelbulb-implementation/realtime-renderingoptimisations/ double th0 = asin(z.z / r); double ph0 = atan2(z.y, z.x); double rp = pow(r, p - 1.0); double th = th0 * p; double ph = ph0 * p; double cth = cos(th); r_dz = rp * r_dz * p + 1.0; rp *= r; z = CVector3(cth * cos(ph), cth * sin(ph), sin(th)) * rp + constant; r = z.Length(); break; } case mandelbulb2: { double temp, tempR; tempR = sqrt(z.x * z.x + z.y * z.y); z *= (1.0 / tempR); temp = z.x * z.x - z.y * z.y; z.y = 2.0 * z.x * z.y; z.x = temp; z *= tempR; tempR = sqrt(z.y * z.y + z.z * z.z); z *= (1.0 / tempR); temp = z.y * z.y - z.z * z.z; z.z = 2.0 * z.y * z.z; z.y = temp; z *= tempR; tempR = sqrt(z.x * z.x + z.z * z.z); z *= (1.0 / tempR); temp = z.x * z.x - z.z * z.z; z.z = 2.0 * z.x * z.z; z.x = temp; z *= tempR; z = z * r; z += constant; r = z.Length(); break; } case mandelbulb3: { double temp, tempR; double sign = 1.0; double sign2 = 1.0; if (z.x < 0) sign2 = -1.0; tempR = sqrt(z.x * z.x + z.y * z.y); z *= (1.0 / tempR); temp = z.x * z.x - z.y * z.y; z.y = 2.0 * z.x * z.y; z.x = temp; z *= tempR; if (z.x < 0) sign = -1.0; tempR = sqrt(z.x * z.x + z.z * z.z); z *= (1.0 / tempR); temp = z.x * z.x - z.z * z.z; z.z = 2.0 * z.x * z.z * sign2; z.x = temp * sign; z *= tempR; z = z * r; z += constant; r = z.Length(); break; } case mandelbulb4: { double rp = pow(r, p - 1); double angZ = atan2(z.y, z.x); double angY = atan2(z.z, z.x); double angX = atan2(z.z, z.y); CRotationMatrix rotM; rotM.RotateX(angX * (p - 1)); rotM.RotateY(angY * (p - 1)); rotM.RotateZ(angZ * (p - 1)); z = rotM.RotateVector(z) * rp + constant; r = z.Length(); break; } case xenodreambuie: { double rp = pow(r, p); double th = atan2(z.y, z.x); double ph = acos(z.z / r); if (ph > 0.5 * M_PI) { ph = M_PI - ph; } else if (ph < -0.5 * M_PI) { ph = -M_PI - ph; } z.x = rp * cos(th * p) * sin(ph * p); z.y = rp * sin(th * p) * sin(ph * p); z.z = rp * cos(ph * p); z = z + constant; r = z.Length(); break; } case fast_trig: { double x2 = z.x * z.x; double y2 = z.y * z.y; double z2 = z.z * z.z; double temp = 1.0 - z2 / (x2 + y2); double newx = (x2 - y2) * temp; double newy = 2.0 * z.x * z.y * temp; double newz = -2.0 * z.z * sqrt(x2 + y2); z.x = newx + constant.x; z.y = newy + constant.y; z.z = newz + constant.z; r = z.Length(); break; } case minus_fast_trig: { double x2 = z.x * z.x; double y2 = z.y * z.y; double z2 = z.z * z.z; double temp = 1.0 - z2 / (x2 + y2); double newx = (x2 - y2) * temp; double newy = 2.0 * z.x * z.y * temp; double newz = 2.0 * z.z * sqrt(x2 + y2); z.x = newx + constant.x; z.y = newy + constant.y; z.z = newz + constant.z; r = z.Length(); break; } case hypercomplex: { CVector3 newz(z.x * z.x - z.y * z.y - z.z * z.z - w * w, 2.0 * z.x * z.y - 2.0 * w * z.z, 2.0 * z.x * z.z - 2.0 * z.y * w); double neww = 2.0 * z.x * w - 2.0 * z.y * z.z; z = newz + constant; w = neww; r = sqrt(z.x * z.x + z.y * z.y + z.z * z.z + w * w); break; } case quaternion: { CVector3 newz(z.x * z.x - z.y * z.y - z.z * z.z - w * w, 2.0 * z.x * z.y, 2.0 * z.x * z.z); double neww = 2.0 * z.x * w; z = newz + constant; w = neww; r = sqrt(z.x * z.x + z.y * z.y + z.z * z.z + w * w); break; } case menger_sponge: { double temp; z.x = fabs(z.x); z.y = fabs(z.y); z.z = fabs(z.z); if (z.x - z.y < 0) { temp = z.y; z.y = z.x; z.x = temp; } if (z.x - z.z < 0) { temp = z.z; z.z = z.x; z.x = temp; } if (z.y - z.z < 0) { temp = z.z; z.z = z.y; z.y = temp; } if (Mode == colouring) { double length2 = z.Length(); if (length2 < min) min = length2; } z *= 3.0; z.x -= 2.0; z.y -= 2.0; if (z.z > 1.0) z.z -= 2.0; r = z.Length(); tgladDE *= 3.0; break; } case tglad: { if (par.mandelbox.rotationsEnabled) { bool lockout = false; z = par.mandelbox.rot[0][0].RotateVector(z); if (z.x > par.mandelbox.doubles.foldingLimit) { z.x = par.mandelbox.doubles.foldingValue - z.x; tgladColor += par.mandelbox.doubles.colorFactorX; lockout = true; } z = par.mandelbox.rotinv[0][0].RotateVector(z); z = par.mandelbox.rot[1][0].RotateVector(z); if (!lockout && z.x < -par.mandelbox.doubles.foldingLimit) { z.x = -par.mandelbox.doubles.foldingValue - z.x; tgladColor += par.mandelbox.doubles.colorFactorX; } z = par.mandelbox.rotinv[1][0].RotateVector(z); lockout = false; z = par.mandelbox.rot[0][1].RotateVector(z); if (z.y > par.mandelbox.doubles.foldingLimit) { z.y = par.mandelbox.doubles.foldingValue - z.y; tgladColor += par.mandelbox.doubles.colorFactorY; lockout = true; } z = par.mandelbox.rotinv[0][1].RotateVector(z); z = par.mandelbox.rot[1][1].RotateVector(z); if (!lockout && z.y < -par.mandelbox.doubles.foldingLimit) { z.y = -par.mandelbox.doubles.foldingValue - z.y; tgladColor += par.mandelbox.doubles.colorFactorY; } z = par.mandelbox.rotinv[1][1].RotateVector(z); lockout = false; z = par.mandelbox.rot[0][2].RotateVector(z); if (z.z > par.mandelbox.doubles.foldingLimit) { z.z = par.mandelbox.doubles.foldingValue - z.z; tgladColor += par.mandelbox.doubles.colorFactorZ; lockout = true; } z = par.mandelbox.rotinv[0][2].RotateVector(z); z = par.mandelbox.rot[1][2].RotateVector(z); if (!lockout && z.z < -par.mandelbox.doubles.foldingLimit) { z.z = -par.mandelbox.doubles.foldingValue - z.z; tgladColor += par.mandelbox.doubles.colorFactorZ; } z = par.mandelbox.rotinv[1][2].RotateVector(z); } else { if (z.x > par.mandelbox.doubles.foldingLimit) { z.x = par.mandelbox.doubles.foldingValue - z.x; tgladColor += par.mandelbox.doubles.colorFactorX; } else if (z.x < -par.mandelbox.doubles.foldingLimit) { z.x = -par.mandelbox.doubles.foldingValue - z.x; tgladColor += par.mandelbox.doubles.colorFactorX; } if (z.y > par.mandelbox.doubles.foldingLimit) { z.y = par.mandelbox.doubles.foldingValue - z.y; tgladColor += par.mandelbox.doubles.colorFactorY; } else if (z.y < -par.mandelbox.doubles.foldingLimit) { z.y = -par.mandelbox.doubles.foldingValue - z.y; tgladColor += par.mandelbox.doubles.colorFactorY; } if (z.z > par.mandelbox.doubles.foldingLimit) { z.z = par.mandelbox.doubles.foldingValue - z.z; tgladColor += par.mandelbox.doubles.colorFactorZ; } else if (z.z < -par.mandelbox.doubles.foldingLimit) { z.z = -par.mandelbox.doubles.foldingValue - z.z; tgladColor += par.mandelbox.doubles.colorFactorZ; } } r = z.Length(); double r2 = r * r; z += par.mandelbox.doubles.offset; if (r2 < mR2) { z *= tglad_factor1; tgladDE *= tglad_factor1; tgladColor += par.mandelbox.doubles.colorFactorSp1; } else if (r2 < fR2) { double tglad_factor2 = fR2 / r2; z *= tglad_factor2; tgladDE *= tglad_factor2; tgladColor += par.mandelbox.doubles.colorFactorSp2; } z -= par.mandelbox.doubles.offset; z = par.mandelbox.mainRot.RotateVector(z); z = z * scale + constant; tgladDE = tgladDE*fabs(scale)+1.0; r = z.Length(); break; } case generalizedFoldBox: { //Reference: http://www.fractalforums.com/new-theories-and-research/generalized-box-fold/msg36503/#msg36503 int i; const CVector3 *Nv; int sides; Nv = par.genFoldBox.Nv_tet; sides = par.genFoldBox.sides_tet; if (par.genFoldBox.type == foldCube) { Nv = par.genFoldBox.Nv_cube; sides = par.genFoldBox.sides_cube; } else if (par.genFoldBox.type == foldOct) { Nv = par.genFoldBox.Nv_oct; sides = par.genFoldBox.sides_oct; } else if (par.genFoldBox.type == foldDodeca) { Nv = par.genFoldBox.Nv_dodeca; sides = par.genFoldBox.sides_dodeca; } else if (par.genFoldBox.type == foldOctCube) { Nv = par.genFoldBox.Nv_oct_cube; sides = par.genFoldBox.sides_oct_cube; } else if (par.genFoldBox.type == foldIcosa) { Nv = par.genFoldBox.Nv_icosa; sides = par.genFoldBox.sides_icosa; } else if (par.genFoldBox.type == foldBox6) { Nv = par.genFoldBox.Nv_box6; sides = par.genFoldBox.sides_box6; } else if (par.genFoldBox.type == foldBox5) { Nv = par.genFoldBox.Nv_box5; sides = par.genFoldBox.sides_box5; } double melt = par.mandelbox.doubles.melt; double solid = par.mandelbox.doubles.solid; // Find the closest cutting plane if any that cuts the line between the origin and z. // Line is parameterized as X = Y + L*a; // Cutting plane is X.Dot(Nv) = Solid. // (Y + L*a).Dot(Nv) = solid. // a = (solid - Y.Dot(Nv))/L.Dot(Nv) = b/c CVector3 L = z; double a = 1; CVector3 Y; // Y is the origin in this case. int side = -1; double b, c; for (i = 0; i < sides; i++) { b = solid; c = L.Dot(Nv[i]); // A bit subtile here. a_r must be positive and I want to avoid divide by zero. if ((c > 0) && ((a * c) > b)) { side = i; a = b / c; } } // If z is above the foldingValue we may have to fold. Else early out. if (side != -1) { // mirror check int side_m = side; CVector3 Nv_m = Nv[side_m]; CVector3 X_m = z - Nv_m * (z.Dot(Nv_m) - solid); // Find any plane (Nv_r) closest to X_m that cuts the line between Nv_m and X_m. // Nv_m cross Nv_r will define a possible rotation axis. // a = (solid - Y.Dot(Nv)/L.Dot(Nv) = b/c. L = X_m - Nv_m; Y = Nv_m; a = 1; side = -1; for (i = 0; i < sides; i++) { if (i != side_m) { b = solid - Y.Dot(Nv[i]); c = L.Dot(Nv[i]); // A bit subtile here. a_r must be positive and I want to avoid divide by zero. if ((c > 0) && ((a * c) > b)) { side = i; a = b / c; } } } // Was a cutting plane found? if (side != -1) { // rotation check CVector3 Xmr_intersect = Y + L * a; int side_r = side; CVector3 Nv_r = Nv[side_r]; // The axis of rotation is define by the cross product of Nv_m and Nv_r and // the intersection of the line between Nv_m and Nv_r and Xmr_intersect. CVector3 L_r = Nv_m.Cross(Nv_r); // The closest point betwee z and the line of rotation can be found by minimizing // the square of the distance (D) between z and the line // X = Xmr_intersect + L_r * a_rmin. // Setting dD/da_rmin equal to zero and solving for a_rmin. double a_rmin = (z.Dot(L_r) - Xmr_intersect.Dot(L_r)) / (L_r.Dot(L_r)); // force a_rmin to be positive. I think I made an even number of sign errors here. if (a_rmin < 0) { a_rmin = -a_rmin; L_r = L_r * (-1); } CVector3 X_r = Xmr_intersect + L_r * a_rmin; // Find any plane (Nv_i) closest to Xmr_intersect that cuts the line between // Xmr_intersect and X_r. This will define a possible inversion point. // a = (solid - Y.Dot(Nv)/L.Dot(Nv) = b/c. L = X_r - Xmr_intersect; Y = Xmr_intersect; a = 1; side = -1; for (i = 0; i < sides; i++) { if ((i != side_m) && (i != side_r)) { b = solid - Y.Dot(Nv[i]); c = L.Dot(Nv[i]); // A bit subtile here. a must be positive and I want to avoid divide by zero. if ((c > 0) && ((a * c) > b)) { side = i; a = b / c; } } } if (side != -1) { // inversion check // Only inversion point possible but still need to check for melt. CVector3 X_i = Y + L * a; CVector3 z2X = X_i - z; // Is z above the melt layer. if (z2X.Dot(z2X) > (melt * melt)) { double z2X_mag = z2X.Length(); z = z + z2X * (2 * (z2X_mag - melt) / (z2X_mag + .00000001)); tgladColor += par.mandelbox.doubles.colorFactorZ; } } else { // Only rotation line possible but still need to check for melt. // Is z above the melt layer. CVector3 z2X = X_r - z; if (z2X.Dot(z2X) > (melt * melt)) { double z2X_mag = z2X.Length(); z = z + z2X * (2 * (z2X_mag - melt) / (z2X_mag + .00000001)); tgladColor += par.mandelbox.doubles.colorFactorY; } } } else { // Only mirror plane possible but still need to check for melt. CVector3 z2X = X_m - z; if (z2X.Dot(z2X) > (melt * melt)) { double z2X_mag = z2X.Length(); z = z + z2X * (2 * (z2X_mag - melt) / (z2X_mag + .00000001)); tgladColor += par.mandelbox.doubles.colorFactorX; } } } // outside solid r = z.Length(); double r2 = r * r; z += par.mandelbox.doubles.offset; if (r2 < mR2) { z *= tglad_factor1; tgladDE *= tglad_factor1; tgladColor += par.mandelbox.doubles.colorFactorSp1; } else if (r2 < fR2) { double tglad_factor2 = fR2 / r2; z *= tglad_factor2; tgladDE *= tglad_factor2; tgladColor += par.mandelbox.doubles.colorFactorSp2; } z -= par.mandelbox.doubles.offset; z = par.mandelbox.mainRot.RotateVector(z); z = z * scale + constant; tgladDE = tgladDE * fabs(scale) + 1.0; r = z.Length(); break; } case smoothMandelbox: { double sm = par.mandelbox.doubles.sharpness; double zk1 = SmoothConditionAGreaterB(z.x, par.mandelbox.doubles.foldingLimit,sm); double zk2 = SmoothConditionALessB(z.x, -par.mandelbox.doubles.foldingLimit,sm); z.x = z.x * (1.0 - zk1) + (par.mandelbox.doubles.foldingValue - z.x) * zk1; z.x = z.x * (1.0 - zk2) + (-par.mandelbox.doubles.foldingValue - z.x) * zk2; tgladColor += (zk1 + zk2) * par.mandelbox.doubles.colorFactorX; double zk3 = SmoothConditionAGreaterB(z.y, par.mandelbox.doubles.foldingLimit,sm); double zk4 = SmoothConditionALessB(z.y, -par.mandelbox.doubles.foldingLimit,sm); z.y = z.y * (1.0 - zk3) + (par.mandelbox.doubles.foldingValue - z.y) * zk3; z.y = z.y * (1.0 - zk4) + (-par.mandelbox.doubles.foldingValue - z.y) * zk4; tgladColor += (zk3 + zk4) * par.mandelbox.doubles.colorFactorY; double zk5 = SmoothConditionAGreaterB(z.z, par.mandelbox.doubles.foldingLimit,sm); double zk6 = SmoothConditionALessB(z.z, -par.mandelbox.doubles.foldingLimit,sm); z.z = z.z * (1.0 - zk5) + (par.mandelbox.doubles.foldingValue - z.z) * zk5; z.z = z.z * (1.0 - zk6) + (-par.mandelbox.doubles.foldingValue - z.z) * zk6; tgladColor += (zk5 + zk6) * par.mandelbox.doubles.colorFactorZ; r = z.Length(); double r2 = r * r; double tglad_factor2 = fR2 / r2; double rk1 = SmoothConditionALessB(r2, mR2, sm); double rk2 = SmoothConditionALessB(r2, fR2, sm); double rk21 = (1.0 - rk1) * rk2; z = z * (1.0 - rk1) + z * (tglad_factor1 * rk1); z = z * (1.0 - rk21) + z * (tglad_factor2 * rk21); tgladDE = tgladDE * (1.0 - rk1) + tgladDE * (tglad_factor1 * rk1); tgladDE = tgladDE * (1.0 - rk21) + tgladDE * (tglad_factor2 * rk21); tgladColor += rk1 * par.mandelbox.doubles.colorFactorSp1; tgladColor += rk21 * par.mandelbox.doubles.colorFactorSp2; z = par.mandelbox.mainRot.RotateVector(z); z = z * scale + constant; tgladDE = tgladDE * fabs(scale) + 1.0; r = z.Length(); break; } case foldingIntPow2: { if (z.x > par.doubles.FoldingIntPowFoldFactor) z.x = par.doubles.FoldingIntPowFoldFactor * 2.0 - z.x; else if (z.x < -par.doubles.FoldingIntPowFoldFactor) z.x = -par.doubles.FoldingIntPowFoldFactor * 2.0 - z.x; if (z.y > par.doubles.FoldingIntPowFoldFactor) z.y = par.doubles.FoldingIntPowFoldFactor * 2.0 - z.y; else if (z.y < -par.doubles.FoldingIntPowFoldFactor) z.y = -par.doubles.FoldingIntPowFoldFactor * 2.0 - z.y; if (z.z > par.doubles.FoldingIntPowFoldFactor) z.z = par.doubles.FoldingIntPowFoldFactor * 2.0 - z.z; else if (z.z < -par.doubles.FoldingIntPowFoldFactor) z.z = -par.doubles.FoldingIntPowFoldFactor * 2.0 - z.z; r = z.Length(); double fR2_2 = 1.0; double mR2_2 = 0.25; double r2_2 = r * r; double tglad_factor1_2 = fR2_2 / mR2_2; if (r2_2 < mR2_2) { z = z * tglad_factor1_2; } else if (r2_2 < fR2_2) { double tglad_factor2_2 = fR2_2 / r2_2; z = z * tglad_factor2_2; } z = z * 2.0; double x2 = z.x * z.x; double y2 = z.y * z.y; double z2 = z.z * z.z; double temp = 1.0 - z2 / (x2 + y2); double newx = (x2 - y2) * temp; double newy = 2.0 * z.x * z.y * temp; double newz = -2.0 * z.z * sqrt(x2 + y2); z.x = newx + constant.x; z.y = newy + constant.y; z.z = newz + constant.z; z.z *= par.doubles.FoldingIntPowZfactor; r = z.Length(); break; } case kaleidoscopic: { if (par.IFS.absX) z.x = fabs(z.x); if (par.IFS.absY) z.y = fabs(z.y); if (par.IFS.absZ) z.z = fabs(z.z); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { if (par.IFS.enabled[i]) { z = par.IFS.rot[i].RotateVector(z); double length = z.Dot(par.IFS.doubles.direction[i]); if (length < par.IFS.doubles.distance[i]) { z -= par.IFS.doubles.direction[i] * (2.0 * (length - par.IFS.doubles.distance[i]) * par.IFS.doubles.intensity[i]); } } } z = par.IFS.mainRot.RotateVector(z - par.IFS.doubles.offset) + par.IFS.doubles.offset; if(par.IFS.doubles.edge.x > 0) z.x = par.IFS.doubles.edge.x - fabs(par.IFS.doubles.edge.x - z.x); if(par.IFS.doubles.edge.y > 0) z.y = par.IFS.doubles.edge.y - fabs(par.IFS.doubles.edge.y - z.y); if(par.IFS.doubles.edge.z > 0) z.z = par.IFS.doubles.edge.z - fabs(par.IFS.doubles.edge.z - z.z); if (Mode == colouring) { double length2 = z.Length(); if (length2 < min) min = length2; } z *= par.IFS.doubles.scale; if(par.IFS.mengerSpongeMode) { z.x -= par.IFS.doubles.offset.x * (par.IFS.doubles.scale - 1.0); z.y -= par.IFS.doubles.offset.y * (par.IFS.doubles.scale - 1.0); if (z.z > 0.5 * par.IFS.doubles.offset.z * (par.IFS.doubles.scale - 1.0)) z.z -= par.IFS.doubles.offset.z * (par.IFS.doubles.scale - 1.0); } else { z -= par.IFS.doubles.offset * (par.IFS.doubles.scale - 1.0); } tgladDE *= par.IFS.doubles.scale; r = z.Length(); break; } case mandelboxVaryScale4D: { scale = scale + par.mandelbox.doubles.vary4D.scaleVary * (fabs(scale) - 1.0); CVector3 oldz = z; z.x = fabs(z.x + par.mandelbox.doubles.vary4D.fold) - fabs(z.x - par.mandelbox.doubles.vary4D.fold) - z.x; z.y = fabs(z.y + par.mandelbox.doubles.vary4D.fold) - fabs(z.y - par.mandelbox.doubles.vary4D.fold) - z.y; z.z = fabs(z.z + par.mandelbox.doubles.vary4D.fold) - fabs(z.z - par.mandelbox.doubles.vary4D.fold) - z.z; w = fabs(w + par.mandelbox.doubles.vary4D.fold) - fabs(w - par.mandelbox.doubles.vary4D.fold) - w; if(z.x != oldz.x) tgladColor += par.mandelbox.doubles.colorFactorX; if(z.y != oldz.y) tgladColor += par.mandelbox.doubles.colorFactorY; if(z.z != oldz.z) tgladColor += par.mandelbox.doubles.colorFactorZ; double rr = pow(z.x * z.x + z.y * z.y + z.z * z.z + w * w, par.mandelbox.doubles.vary4D.rPower); double m = scale; if (rr < par.mandelbox.doubles.vary4D.minR * par.mandelbox.doubles.vary4D.minR) { m = scale / (par.mandelbox.doubles.vary4D.minR * par.mandelbox.doubles.vary4D.minR); tgladColor += par.mandelbox.doubles.colorFactorSp1; } else if (rr < 1.0) { m = scale / rr; tgladColor += par.mandelbox.doubles.colorFactorSp2; } z = z * m + constant; w = w * m + par.mandelbox.doubles.vary4D.wadd; tgladDE = tgladDE * fabs(m) + 1.0; r = sqrt(z.x * z.x + z.y * z.y + z.z * z.z + w * w); break; } case aexion: { if(L == 0) { double cx = fabs(constant.x + constant.y + constant.z) + par.doubles.cadd; double cy = fabs(-constant.x - constant.y + constant.z) + par.doubles.cadd; double cz = fabs(-constant.x + constant.y - constant.z) + par.doubles.cadd; double cw = fabs(constant.x - constant.y - constant.z) + par.doubles.cadd; constant.x = cx; constant.y = cy; constant.z = cz; constantw = cw; double tempx = fabs(z.x + z.y + z.z) + par.doubles.cadd; double tempy = fabs(-z.x - z.y + z.z) + par.doubles.cadd; double tempz = fabs(-z.x + z.y - z.z) + par.doubles.cadd; double tempw = fabs(z.x - z.y - z.z) + par.doubles.cadd; z.x = tempx; z.y = tempy; z.z = tempz; w = tempw; } double tempx = z.x * z.x - z.y * z.y + 2.0 * w * z.z + constant.x; double tempy = z.y * z.y - z.x * z.x + 2.0 * w * z.z + constant.y; double tempz = z.z * z.z - w * w + 2.0 * z.x * z.y + constant.z; double tempw = w * w - z.z * z.z + 2.0 * z.x * z.y + constantw; z.x = tempx; z.y = tempy; z.z = tempz; w = tempw; r = sqrt(z.x * z.x + z.y * z.y + z.z * z.z + w * w); break; } case benesi: { double r1 = z.y*z.y + z.z*z.z; double newx = 0; if(constant.x < 0 || z.x < sqrt(r1)) { newx = z.x*z.x - r1; } else { newx = -z.x*z.x + r1; } r1 = - 1.0/sqrt(r1) * 2.0 * fabs(z.x); double newy = r1 * (z.y*z.y - z.z*z.z); double newz = r1 * 2.0 * z.y * z.z; z.x = newx + constant.x; z.y = newy + constant.y; z.z = newz + constant.z; r = z.Length(); break; } case bristorbrot: { double newx = z.x*z.x - z.y*z.y - z.z*z.z; double newy = z.y * (2.0 * z.x - z.z); double newz = z.z * (2.0 * z.x + z.y); z.x = newx + constant.x; z.y = newy + constant.y; z.z = newz + constant.z; r = z.Length(); break; } case invertX: { z.x = z.x >= 0.0 ? z.x*z.x/(fabs(z.x) + p) : -z.x*z.x/(fabs(z.x) + p); r = z.Length(); break; } case invertY: { z.y = z.y >= 0.0 ? z.y*z.y/(fabs(z.y) + p) : -z.y*z.y/(fabs(z.y) + p); r = z.Length(); break; } case invertZ: { z.z = z.z >= 0.0 ? z.z*z.z/(fabs(z.z) + p) : -z.z*z.z/(fabs(z.z) + p); r = z.Length(); break; } case invertR: { double rInv = r*r/(r + p); z.x = z.x / r * rInv; z.y = z.y / r * rInv; z.z = z.z / r * rInv; r = z.Length(); break; } case sphericalFold: { double rr = r*r; double pp = p*p; if (rr < pp) { z.x = 1.0 / pp; z.y = 1.0 / pp; z.z = 1.0 / pp; } else if (rr < pp*4.0) { z.x = 1.0 / rr; z.y = 1.0 / rr; z.z = 1.0 / rr; } r = z.Length(); break; } case powXYZ: { z.x = z.x >= 0 ? pow(z.x,p) : -pow(-z.x,p); z.y = z.y >= 0 ? pow(z.y,p) : -pow(-z.y,p); z.z = z.z >= 0 ? pow(z.z,p) : -pow(-z.z,p); r = z.Length(); break; } case scaleX: { z.x = z.x * p; r = z.Length(); break; } case scaleY: { z.y = z.y * p; r = z.Length(); break; } case scaleZ: { z.z = z.z * p; r = z.Length(); break; } case offsetX: { z.x = z.x + p; r = z.Length(); break; } case offsetY: { z.y = z.y + p; r = z.Length(); break; } case offsetZ: { z.z = z.z + p; r = z.Length(); break; } case angleMultiplyX: { double angle = atan2(z.z,z.y)*p; double tempR = sqrt(z.z*z.z + z.y*z.y); z.y = tempR * cos(angle); z.z = tempR * sin(angle); r = z.Length(); break; } case angleMultiplyY: { double angle = atan2(z.z,z.x)*p; double tempR = sqrt(z.z*z.z + z.x*z.x); z.x = tempR * cos(angle); z.z = tempR * sin(angle); r = z.Length(); break; } case angleMultiplyZ: { double angle = atan2(z.y,z.x)*p; double tempR = sqrt(z.x*z.x + z.y*z.y); z.x = tempR * cos(angle); z.y = tempR * sin(angle); r = z.Length(); break; } case hybrid: break; case none: break; case ocl_custom: break; } //************************** iteration terminate conditions ***************** if (Mode == deltaDE1) { if (r > 1e10) break; } else if (Mode == deltaDE2) { if (L == *iter_count) break; } if (Mode == orbitTrap) { CVector3 delta = z - par.doubles.fakeLightsOrbitTrap; distance = delta.Length(); if (L >= par.fakeLightsMinIter && L <= par.fakeLightsMaxIter) orbitTrapTotal += (1.0f/(distance*distance)); if (distance > 1000) { distance = orbitTrapTotal; break; } } if (actualFormula == menger_sponge || actualFormula == kaleidoscopic) { if (r > 1000) { distance = (r - 2.0) / tgladDE; break; } } else if (actualFormula == tglad || actualFormula == smoothMandelbox || actualFormula == mandelboxVaryScale4D || actualFormula == generalizedFoldBox) { if (r > 1024) { distance = r / fabs(tgladDE); break; } } else { if (Mode == normal) //condition for all other trigonometric and hypercomplex fractals { if (r > 1e2) { distance = 0.5 * r * log(r) / r_dz; break; } } else if (Mode == fake_AO) //mode 2 { if (r < min) min = r; if (r > 1e15) { distance = min; break; } } else if (Mode == colouring) //mode 1 { if(par.primitives.onlyPlane) { distance = z.Length(); if (distance > 1e15) { distance = (L - log(log(r) / log((double)N)) / log(p))/100.0; break; } } else { distance = z.Length(); if (distance < min) min = distance; if (distance > 1e15) { distance = min; break; } } } } } //************ return values ***************** N_counter += L + 1; Loop_counter++; if (L < 64) histogram[L]++; else histogram[63]++; if (iter_count != NULL) *iter_count = L; if (Mode == normal) { if (L == N) distance = 0; return distance; } if (Mode == deltaDE1 || Mode == deltaDE2) return r; if (Mode == fake_AO) return distance; if (Mode == orbitTrap) return distance; if (Mode == colouring) { if (par.formula == hybrid) { if (min > 100) min = 100; if (distance > 20) distance = 20; if (tgladColor > 1000) tgladColor = 1000; return distance * 5000.0 + tgladColor * 100.0 + min * 1000.0; } else if (actualFormula == tglad || actualFormula == smoothMandelbox || actualFormula == mandelboxVaryScale4D || actualFormula == generalizedFoldBox) return tgladColor * 100.0 + z.Length()*par.mandelbox.doubles.colorFactorR; else if (actualFormula == kaleidoscopic || actualFormula == menger_sponge) return min * 1000.0; else return distance * 5000.0; } } //******************* Calculate distance *******************8 double CalculateDistance(CVector3 point, sFractal ¶ms, bool *max_iter) { int L; double distance; params.objectOut = objFractal; double limitBoxDist = 0.0; if (params.limits_enabled) { double distance_a = MAX(point.x - params.doubles.amax, -(point.x - params.doubles.amin)); double distance_b = MAX(point.y - params.doubles.bmax, -(point.y - params.doubles.bmin)); double distance_c = MAX(point.z - params.doubles.cmax, -(point.z - params.doubles.cmin)); limitBoxDist = dMax(distance_a, distance_b, distance_c); if(limitBoxDist > params.doubles.detailSize) { if (max_iter != NULL) *max_iter = false; return limitBoxDist; } } if(!params.primitives.onlyPlane) { if (params.analitycDE) { distance = Compute(point, params, &L); if (max_iter != NULL) { if (L == (int)params.doubles.N) *max_iter = true; else *max_iter = false; } params.itersOut = L; if (distance < 0) distance = 0; if (L < params.minN && distance < params.doubles.detailSize) distance = params.doubles.detailSize; if (params.interiorMode && !params.normalCalculationMode) { if (distance < 0.5 * params.doubles.detailSize || L == (int)params.doubles.N) { distance = params.doubles.detailSize; if (max_iter != NULL) *max_iter = false; } } else if(params.interiorMode && params.normalCalculationMode) { if (distance < 0.9 * params.doubles.detailSize) { distance = params.doubles.detailSize - distance; if (max_iter != NULL) *max_iter = false; } } if (params.iterThresh && L < (int)params.doubles.N) { if(distance < params.doubles.detailSize) { distance = params.doubles.detailSize * 1.01; } } } else { double deltaDE = 1e-10; double r = Compute(point, params, &L); int retval = L; params.itersOut = L; point.x += deltaDE; point.y += 0; point.z += 0; double r2 = Compute(point, params, &L); double dr1 = fabs(r2 - r) / deltaDE; point.x -= deltaDE; point.y += deltaDE; point.z += 0; r2 = Compute(point, params, &L); double dr2 = fabs(r2 - r) / deltaDE; point.x += 0; point.y -= deltaDE; point.z += deltaDE; r2 = Compute(point, params, &L); double dr3 = fabs(r2 - r) / deltaDE; double dr = sqrt(dr1 * dr1 + dr2 * dr2 + dr3 * dr3); if (params.linearDEmode) { distance = 0.5 * r / dr; } else { distance = 0.5 * r * log(r) / dr; } if (distance < 0) distance = 0; if (retval == (int)params.doubles.N) { if (max_iter != NULL) *max_iter = true; distance = 0; } else if (max_iter != NULL) *max_iter = false; if (L < params.minN && distance < params.doubles.detailSize) distance = params.doubles.detailSize; if (params.interiorMode && !params.normalCalculationMode) { if (distance < 0.5 * params.doubles.detailSize || L == (int)params.doubles.N) { distance = params.doubles.detailSize; if (max_iter != NULL) *max_iter = false; } } else if(params.interiorMode && params.normalCalculationMode) { if (distance < 0.9 * params.doubles.detailSize) { distance = params.doubles.detailSize - distance; if (max_iter != NULL) *max_iter = false; } } if (params.iterThresh && retval < (int)params.doubles.N) { if(distance < params.doubles.detailSize) { distance = params.doubles.detailSize * 1.01; } } } } else { distance = 10.0; if (max_iter != NULL) *max_iter = false; } //plane if (params.primitives.planeEnable) { double planeDistance = PrimitivePlane(point, params.doubles.primitives.planeCentre, params.doubles.primitives.planeNormal); if(!params.primitives.onlyPlane && planeDistance < distance) params.objectOut = objPlane; distance = (planeDistance < distance) ? planeDistance : distance; } //box if (params.primitives.boxEnable) { double boxDistance = PrimitiveBox(point, params.doubles.primitives.boxCentre, params.doubles.primitives.boxSize); if(boxDistance < distance) params.objectOut = objBox; distance = (boxDistance < distance) ? boxDistance : distance; } //inverted box if (params.primitives.invertedBoxEnable) { double boxDistance = PrimitiveInvertedBox(point, params.doubles.primitives.invertedBoxCentre, params.doubles.primitives.invertedBoxSize); if(boxDistance < distance) params.objectOut = objBoxInv; distance = (boxDistance < distance) ? boxDistance : distance; } //sphere if (params.primitives.sphereEnable) { double sphereDistance = PrimitiveSphere(point, params.doubles.primitives.sphereCentre, params.doubles.primitives.sphereRadius); if(sphereDistance < distance) params.objectOut = objSphere; distance = (sphereDistance < distance) ? sphereDistance : distance; } //invertedSphere if (params.primitives.invertedSphereEnable) { double sphereDistance = PrimitiveInvertedSphere(point, params.doubles.primitives.invertedSphereCentre, params.doubles.primitives.invertedSphereRadius); if(sphereDistance < distance) params.objectOut = objSphereInv; distance = (sphereDistance < distance) ? sphereDistance : distance; } //water if (params.primitives.waterEnable) { double waterDistance = PrimitiveWater(point, params.doubles.primitives.waterHeight, params.doubles.primitives.waterAmplitude, params.doubles.primitives.waterLength, params.doubles.primitives.waterRotation, params.primitives.waterIterations, params.doubles.primitives.waterAnimSpeed, params.frameNo); if(waterDistance < distance) params.objectOut = objWater; distance = (waterDistance < distance) ? waterDistance : distance; } if (params.limits_enabled) { if (limitBoxDist < params.doubles.detailSize) { distance = MAX(distance, limitBoxDist); } } return distance; } // force template instantiation template double Compute(CVector3, const sFractal&, int*); template double Compute(CVector3, const sFractal&, int*); template double Compute(CVector3, const sFractal&, int*); template double Compute(CVector3, const sFractal&, int*); template double Compute(CVector3, const sFractal&, int*); template double Compute(CVector3, const sFractal&, int*); mandelbulber1.21-1.orig/src/morph.hpp0000644000175000017500000000136612274512437020507 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for animation keyframe interpolation / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef MORPH_HPP_ #define MORPH_HPP_ #include class CMorph { public: CMorph(int size, int recordSize); void AddData(int index, double *data); void SetFramesPerKey(int frames) {framesPerKey = frames;} void Linear(int frame, double *destData); void CatmullRom(int frame, double *destData); private: std::vector > dataSets; int dataSize; int count; int framesPerKey; std::vector output; }; #endif /* MORPH_HPP_ */ mandelbulber1.21-1.orig/src/cimage.hpp0000644000175000017500000001313512274512437020604 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / cImage class for offline and multiple layer image / handling / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef CIMAGE_HPP_ #define CIMAGE_HPP_ #include //global variables struct sRGB8 { unsigned char R; unsigned char G; unsigned char B; }; struct sRGB16 { unsigned short R; unsigned short G; unsigned short B; }; struct sRGBfloat { float R; float G; float B; }; struct sRGB { int R; int G; int B; }; struct sImageAdjustments { double shading; double directLight; double ambient; double specular; double reflect; double globalIlum; double brightness; double glow_intensity; double fogVisibility; double coloring_speed; double imageGamma; double paletteOffset; double mainLightIntensity; double contrast; }; struct sEffectColours { sRGB glow_color1; sRGB glow_color2; sRGB fogColor; sRGB mainLightColour; }; struct sImageSwitches { bool coloringEnabled; bool fogEnabled; bool raytracedReflections; bool volumetricLightEnabled; bool iterFogEnabled; bool hdrEnabled; }; struct sAllImageData { sRGBfloat imageFloat; unsigned short alphaBuffer; unsigned short opacityBuffer; sRGB8 colourBuffer; float zBuffer; }; class cImage { public: cImage(int w, int h, bool low_mem = false); ~cImage(); bool ChangeSize(int w, int h); void ClearImage(void); inline void PutPixelImage(int x, int y, sRGBfloat pixel) {if (x >= 0 && x < width && y >= 0 && y < height) imageFloat[x + y * width] = pixel;} inline void PutPixelImage16(int x, int y, sRGB16 pixel) {if (x >= 0 && x < width && y >= 0 && y < height) image16[x + y * width] = pixel;} inline void PutPixelColour(int x, int y, sRGB8 pixel) {if (x >= 0 && x < width && y >= 0 && y < height) colourBuffer[x + y * width] = pixel;} inline void PutPixelZBuffer(int x, int y, float pixel) {if (x >= 0 && x < width && y >= 0 && y < height) zBuffer[x + y * width] = pixel;} inline void PutPixelAlpha(int x, int y, unsigned short pixel) {if (x >= 0 && x < width && y >= 0 && y < height) alphaBuffer[x + y * width] = pixel;} inline void PutPixelOpacity(int x, int y, unsigned short pixel) {if (x >= 0 && x < width && y >= 0 && y < height) opacityBuffer[x + y * width] = pixel;} inline sRGBfloat GetPixelImage(int x, int y) {if (x >= 0 && x < width && y >= 0 && y < height) return imageFloat[x + y * width]; else return BlackFloat();} inline sRGB16 GetPixelImage16(int x, int y) {if (x >= 0 && x < width && y >= 0 && y < height) return image16[x + y * width]; else return Black16();} inline short int GetPixelAlpha(int x, int y) {if (x >= 0 && x < width && y >= 0 && y < height) return alphaBuffer[x + y * width]; else return 0;} inline short int GetPixelOpacity(int x, int y) {if (x >= 0 && x < width && y >= 0 && y < height) return opacityBuffer[x + y * width]; else return 0;} inline sRGB8 GetPixelColor(int x, int y) {if (x >= 0 && x < width && y >= 0 && y < height) return colourBuffer[x + y * width]; else return Black8();} inline float GetPixelZBuffer(int x, int y) {if (x >= 0 && x < width && y >= 0 && y < height) return zBuffer[x + y * width]; else return 1e20;} sRGB16* GetImage16Ptr(void) {return image16;} unsigned short* GetAlphaBufPtr(void) {return alphaBuffer;} float* GetZBufferPtr(void) {return zBuffer;} sRGB8* GetColorPtr(void) {return colourBuffer;} unsigned short* GetOpacityPtr(void) {return opacityBuffer;} size_t GetZBufferSize(void) {return sizeof(float) * height * width;} void CompileImage(void); int GetWidth(void) {return width;} int GetHeight(void) {return height;} int GetPreviewWidth(void) {return previewWidth;} int GetPreviewHeight(void) {return previewHeight;} int GetUsedMB(void); void SetImageParameters(sImageAdjustments adjustments, sImageSwitches switches); sImageAdjustments* GetImageAdjustments(void) {return &adj;} sImageSwitches* GetImageSwitches(void) {return &sw;} unsigned char* ConvertTo8bit(void); unsigned char* CreatePreview(double scale); void UpdatePreview(void); unsigned char* GetPreviewPtr(void); bool IsPreview(void); void RedrawInWidget(GtkWidget *dareaWidget); double GetPreviewScale() {return previewScale;} void Squares(int y, int progressiveFactor); void CalculateGammaTable(void); sRGB16 CalculatePixel(sRGBfloat pixel); void PutPixelAlfa(int x, int y, float z, sRGB8 color, double opacity, int layer); void AntiAliasedPoint(double x, double y, float z, sRGB8 color, double opacity, int layer); void AntiAliasedLine(double x1, double y1, double x2, double y2, float z1, float z2, sRGB8 color, double opacity, int layer); void CircleBorder(double x, double y, float z, double r, sRGB8 border, double borderWidth, double opacity, int layer); int progressiveFactor; private: sRGB8 Interpolation(float x, float y); bool AllocMem(void); inline sRGB16 Black16(void) {sRGB16 black = {0,0,0};return black;} inline sRGB8 Black8(void) {sRGB8 black = {0,0,0};return black;} inline sRGBfloat BlackFloat(void) {sRGBfloat black = {0.0,0.0,0.0};return black;} sRGB8 *image8; sRGB16 *image16; sRGBfloat *imageFloat; unsigned short *alphaBuffer; unsigned short *opacityBuffer; sRGB8 *colourBuffer; float *zBuffer; sRGB8 *preview; sRGB8 *preview2; sImageAdjustments adj; sImageSwitches sw; int width; int height; int *gammaTable; bool previewAllocated; int previewWidth; int previewHeight; double previewScale; bool lowMem; }; sRGB PostRendering_Fog(double z, double min, double max, sRGB fog_color, sRGB color_before); #endif /* CIMAGE_HPP_ */ mandelbulber1.21-1.orig/src/mandelbulber_cl_data.h0000644000175000017500000001417012274512437023122 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / data structures for data exchange between maon program / and OpenCL kernels / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ typedef enum { clObjFractal = 0, clObjPlane = 1, clObjWater = 2, clObjSphere = 3, clObjSphereInv = 4, clObjBox = 5, clObjBoxInv = 6 }enumClObjectType; typedef struct { cl_float3 m1; cl_float3 m2; cl_float3 m3; } matrix33; typedef struct { cl_float distance; cl_float distThresh; cl_float step; cl_float3 point; cl_int iters; } sClStep; typedef struct { cl_float scale; cl_float foldingLimit; cl_float foldingValue; cl_float fixedRadius; cl_float minRadius; cl_float colorFactorX; cl_float colorFactorY; cl_float colorFactorZ; matrix33 mainRot; matrix33 rot[6]; matrix33 rotinv[6]; cl_int rotEnabled; } sClMandelbox; typedef struct { cl_float3 position; cl_float3 colour; cl_float intensity; cl_int enabled; } sClLight; typedef struct { cl_int absX; cl_int absY; cl_int absZ; cl_int enabled[9]; cl_int mengerSpongeMode; matrix33 mainRot; matrix33 rot[9]; cl_float rotationAlpha; cl_float rotationBeta; cl_float rotationGamma; cl_float scale; cl_float distance[9]; cl_float alpha[9]; cl_float beta[9]; cl_float gamma[9]; cl_float intensity[9]; cl_float3 offset; cl_float3 direction[9]; cl_float3 edge; } sClIFS; typedef struct { cl_float3 planeCentre; cl_float3 planeNormal; cl_float3 boxCentre; cl_float3 boxSize; cl_float3 invertedBoxCentre; cl_float3 invertedBoxSize; cl_float3 sphereCentre; cl_float3 invertedSphereCentre; cl_float sphereRadius; cl_float invertedSphereRadius; cl_float waterHeight; cl_float waterAmplitude; cl_float waterLength; cl_float waterRotation; cl_float waterAnimSpeed; cl_float3 primitivePlaneColour; cl_float3 primitiveBoxColour; cl_float3 primitiveInvertedBoxColour; cl_float3 primitiveSphereColour; cl_float3 primitiveInvertedSphereColour; cl_float3 primitiveWaterColour; cl_float primitivePlaneReflect; cl_float primitiveBoxReflect; cl_float primitiveInvertedBoxReflect; cl_float primitiveSphereReflect; cl_float primitiveInvertedSphereReflect; cl_float primitiveWaterReflect; cl_int planeEnable; cl_int boxEnable; cl_int invertedBoxEnable; cl_int sphereEnable; cl_int invertedSphereEnable; cl_int waterEnable; cl_int waterIterations; } sClPrimitives; typedef struct { cl_uint N; cl_int formula; cl_int juliaMode; cl_int constantDEThreshold; cl_int fakeLightsMinIter; cl_int fakeLightsMaxIter; cl_int customOCLFormulaDEMode; cl_int linearDEmode; cl_int limitsEnabled; cl_int interiorMode; cl_int frameNo; cl_float power; cl_float opacity; cl_float opacityTrim; cl_float fractalConstantFactor; cl_float custom[15]; cl_float amin; //fractal limits cl_float amax; cl_float bmin; cl_float bmax; cl_float cmin; cl_float cmax; cl_float deltaDEStep; cl_float3 julia; sClMandelbox mandelbox; sClIFS ifs; sClPrimitives primitives; } sClFractal; typedef struct { cl_int width; cl_int height; cl_int AmbientOcclusionNoOfVectors; cl_int colouringEnabled; cl_int fastAmbientOcclusionEnabled; cl_int slowAmbientOcclusionEnabled; cl_int DOFEnabled; cl_int slowShading; cl_int penetratingLights; cl_int shadow; cl_int reflectionsMax; cl_int globalIlumQuality; cl_int fogEnabled; cl_int auxLightNumber; cl_int volumetricLightEnabled[5]; cl_int volumetricLightEnabledAny; cl_int perspectiveType; cl_int fishEyeCut; cl_int iterFogEnabled; cl_int hdrEnabled; cl_int randomSeed; cl_int fakeLightsEnabled; cl_int texturedBackground; cl_int SSAOquality; cl_int DOFmethod; cl_float alpha; cl_float beta; cl_float gamma; cl_float zoom; cl_float persp; cl_float DEfactor; cl_float quality; cl_float mainLightAlfa; cl_float mainLightBeta; cl_float colouringSpeed; cl_float colouringOffset; cl_float ambientOcclusionIntensity; cl_float specularIntensity; cl_float shading; cl_float mainLightIntensity; cl_float glowIntensity; cl_float fogColour1Distance; cl_float fogColour2Distance; cl_float fogDistanceFactor; cl_float fogDensity; cl_float DOFFocus; cl_float DOFRadius; cl_float shadowConeAngle; cl_float viewDistanceMax; cl_float reflect; cl_float fastAoTune; cl_float fogVisibility; cl_float auxLightIntensity; cl_float volumetricLightIntensity[5]; cl_float auxLightVisibility; cl_float imageBrightness; cl_float imageContrast; cl_float imageGamma; cl_float iterFogOpacity; cl_float iterFogOpacityTrim; cl_float fakeLightsIntensity; cl_float fakeLightsVisibility; cl_float fakeLightsVisibilitySize; cl_float3 vp; cl_float3 glowColour1; cl_float3 glowColour2; cl_float3 backgroundColour1; cl_float3 backgroundColour2; cl_float3 backgroundColour3; cl_float3 mainLightColour; cl_float3 fogColour; cl_float3 fogColour1; cl_float3 fogColour2; cl_float3 fogColour3; cl_float3 fakeLightsOrbitTrap; } sClParams; typedef struct { cl_float R; cl_float G; cl_float B; cl_float zBuffer; cl_ushort opacity; cl_ushort alpha; cl_uchar colR; cl_uchar colG; cl_uchar colB; } sClPixel; typedef struct { cl_float3 palette[256]; cl_float3 vectorsAround[10000]; cl_float3 vectorsAroundColours[10000]; sClLight lights[10000]; } sClInBuff; typedef struct { sClParams params; sClFractal fractal; } sClInConstants; typedef struct { cl_uint N; cl_int randomSeed; cl_float3 orbitTrap; cl_float distThresh; cl_float normalCalculationMode; enumClObjectType objectType; } sClCalcParams; typedef struct { sClCalcParams *calcParam; cl_float3 point; cl_float3 startPoint; cl_float3 eyePoint; cl_float3 viewVector; cl_float3 normal; cl_float3 lightVect; cl_float dist_thresh; cl_float lastDist; cl_float delta; cl_float resolution; cl_int vectorsCount; //cTexture *envMappingTexture; cl_float depth; cl_int stepCount; enumClObjectType objectType; } sClShaderInputData; typedef struct { cl_float3 start; cl_float3 point; cl_float3 viewVector; cl_float3 distance; cl_int stepCount; cl_float depth; cl_float lastDist; cl_float distThresh; enumClObjectType objectType; cl_float reflect; cl_int found; } sClReflect; mandelbulber1.21-1.orig/src/database.hpp0000644000175000017500000000234312274512437021122 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class similar to std::vector, but much simplier / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef DATABASE_HPP_ #define DATABASE_HPP_ enum errorCode { err_ok = 0, //operacja ok err_badIndex, //zły numer rekordu err_missedRecord //odwołanie do pustego rekordu }; //status pojedynczego rekordu struct sRecordStatus { bool used; int index; int size; }; //************ definicja klasy opisujšcej rekordy class cDatabase { public: cDatabase(int size = 1); ~cDatabase() {ClearDatabase();}; errorCode SetRecord(int index, const char *record, int recordSize); errorCode GetRecord(int index, char *record); int AddRecord(const char *record, int size); int InsertRecord(int index, const char *record, int recordSize); errorCode DeleteRecord(int index); int Count(); bool IsFilled(int index); int GetInternalIndex(int index); int NextInternalIndex(void) {return indexCount + 1;} private: char **records; sRecordStatus *status; int recordCount; int indexCount; void ClearDatabase(); }; #endif /* DATABASE_HPP_ */ mandelbulber1.21-1.orig/src/Render3D.cpp0000644000175000017500000024175612274512437020774 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / Main program and CPU rendering engine / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / / Windows port by Makemeunsee, Knigty ********************************************************/ #ifdef WIN32 /* WINDOWS */ #include #define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ #endif #ifndef WIN32 #include #endif #include #include #include #include #include #include #include #include #include "Render3D.h" #include "files.h" #include "shaders.h" #include "interface.h" #include "timeline.hpp" #include "morph.hpp" #include "settings.h" #include "undo.hpp" #include "callbacks.h" #include "netrender.hpp" using namespace std; bool noGUI = false; int NR_THREADS; JSAMPLE *tekstura; JSAMPLE *lightMap; //global conters guint64 N_counter = 0; guint64 Loop_counter = 0; guint64 DE_counter = 0; guint64 DE_counterForDEerror; guint64 Pixel_counter = 0; int Missed_DE_counter = 0; double DEerror = 0; double start_time = 0.0; bool isRendering = false; bool isPostRendering = false; bool newLineRendered = false; cImage mainImage(800, 600); double real_clock(void) { #ifdef WIN32 /* WINDOWS */ return (double) clock() / CLOCKS_PER_SEC; #else /*other unix - try sysconf*/ struct timeval tv; gettimeofday(&tv, 0); return tv.tv_sec + 1e-6 * tv.tv_usec; #endif /* WINDOWS */ } CVector3 RayMarching(sParamRender *param, sFractal *calcParam, CVector3 start, CVector3 direction, double maxScan, bool binaryEnable, sStep *stepBuff, int *buffCount, double *distThreshOut, double *lastDistOut, bool *foundOut, double *depthOut) { CVector3 point; bool found = false; double scan = param->doubles.viewDistanceMin; double distThresh = *distThreshOut; double dist = 0; double search_accuracy = 0.01 * param->doubles.quality; double search_limit = 1.0 - search_accuracy; int counter = 0; double step = param->doubles.viewDistanceMin; *buffCount = 0; double distThreshInit = *distThreshOut; for (int i = 0; i < 10000; i++) { counter++; point = start + direction * scan; bool max_iter = false; if (calcParam->constantDEThreshold) { distThresh = param->doubles.quality; } else { distThresh = scan * param->doubles.resolution * param->doubles.persp / param->doubles.quality + distThreshInit; } if(param->perspectiveType == equirectangular || param->perspectiveType == fishEye) distThresh *= M_PI; calcParam->doubles.detailSize = distThresh; dist = CalculateDistance(point, *calcParam, &max_iter); //printf("Distance = %g\n", dist/distThresh); stepBuff[i].distance = dist; stepBuff[i].iters = calcParam->itersOut; stepBuff[i].distThresh = distThresh; if (dist > 3.0) dist = 3.0; if (dist < distThresh) { if (dist < 0.1 * distThresh) Missed_DE_counter++; found = true; break; } stepBuff[i].step = step; if(param->fractal.interiorMode) { step = (dist - 0.8 * distThresh) * param->doubles.DE_factor * (1.0 - Random(1000)/10000.0);; } else { step = (dist - 0.5 * distThresh) * param->doubles.DE_factor * (1.0 - Random(1000)/10000.0);; } stepBuff[i].point = point; (*buffCount)++; scan += step; if (scan > maxScan) { break; } } if (found && binaryEnable) { //scan -= step; //double step = distThresh * 0.5; step *= 0.5; for (int i = 0; i < 20; i++) { DE_counter++; if (dist < distThresh && dist > distThresh * search_limit) { break; } else { if (dist > distThresh) { scan += step; point = start + direction * scan; } else if (dist < distThresh * search_limit) { scan -= step; point = start + direction * scan; } } if (calcParam->constantDEThreshold) { distThresh = param->doubles.quality; } else { distThresh = scan * param->doubles.resolution * param->doubles.persp / param->doubles.quality + distThreshInit; } bool max_iter = false; dist = CalculateDistance(point, *calcParam, &max_iter); //printf("Distance binary = %g\n", dist/distThresh); step *= 0.5; } } DE_counter += counter; Pixel_counter++; //counters for drawing histogram int counter2 = counter / 4; if (counter2 < 256) histogram2[counter2]++; else histogram2[255]++; *foundOut = found; *distThreshOut = distThresh; *lastDistOut = dist; *depthOut = scan; return point; } //***************************** Main thread **************************** //main rendering thread void *MainThread(void *ptr) { //getting parameters sParam *threadParameters; threadParameters = (sParam*) ptr; //initialising variables int yScrStart = threadParameters->start; yScrStart = (yScrStart / 16) * 16; int yScr = threadParameters->z; int thread_number = yScr; cImage *image = threadParameters->image; int progressive = threadParameters->progressive; int progressiveStart = threadParameters->progressiveStart; int width = image->GetWidth(); int height = image->GetHeight(); WriteLogDouble("Thread started", thread_number); //printf("Thread #%d started\n", z + 1); sParamRender param = threadParameters->param; int tiles = param.noOfTiles; int tile = param.tileCount; CVector3 vp = param.doubles.vp; double maxDepth = param.doubles.viewDistanceMax; double zoom = param.doubles.zoom; double alpha = param.doubles.alpha; double beta = param.doubles.beta; double gamma = param.doubles.gamma; int AO_quality = param.globalIlumQuality; cTexture *lightmap_texture = param.lightmapTexture; //preparing rotation matrix CRotationMatrix mRot; mRot.RotateZ(alpha); mRot.RotateX(beta); mRot.RotateY(gamma); //preparing base vectors CVector3 vector, shadowVector; CVector3 baseX(1.0, 0.0, 0.0); CVector3 baseY(0.0, 1.0, 0.0); CVector3 baseZ(0.0, 0.0, 1.0); baseX = mRot.RotateVector(baseX); baseY = mRot.RotateVector(baseY); baseZ = mRot.RotateVector(baseZ); //shadow direction vector vector.x = cos(param.doubles.mainLightAlpha - 0.5 * M_PI) * cos(-param.doubles.mainLightBeta); vector.y = sin(param.doubles.mainLightAlpha - 0.5 * M_PI) * cos(-param.doubles.mainLightBeta); vector.z = sin(-param.doubles.mainLightBeta); shadowVector = mRot.RotateVector(vector); //reflection data int maxRay = param.reflectionsMax; if (!param.imageSwitches.raytracedReflections) maxRay = 0; sReflect *reflectBuff = new sReflect[maxRay + 2]; for(int i = 0; i < maxRay + 1; i++) { //rayMarching buffers reflectBuff[i].stepBuff = new sStep[10002]; reflectBuff[i].buffCount = 0; } //calculating vectors for AmbientOcclusion sVectorsAround *vectorsAround = new sVectorsAround[10000]; int vectorsCount; int counter = 0; int lightMapWidth = param.lightmapTexture->Width(); int lightMapHeight = param.lightmapTexture->Height(); for (double b = -0.49 * M_PI; b < 0.49 * M_PI; b += 1.0 / AO_quality) { for (double a = 0.0; a < 2.0 * M_PI; a += ((2.0 / AO_quality) / cos(b))) { CVector3 d; d.x = cos(a + b) * cos(b); d.y = sin(a + b) * cos(b); d.z = sin(b); vectorsAround[counter].alpha = a; vectorsAround[counter].beta = b; vectorsAround[counter].v = d; int X = (int) ((a + b) / (2.0 * M_PI) * lightMapWidth + lightMapWidth * 8.5) % lightMapWidth; int Y = (int) (b / (M_PI) * lightMapHeight + lightMapHeight * 8.5) % lightMapHeight; vectorsAround[counter].R = lightmap_texture->FastPixel(X, Y).R; vectorsAround[counter].G = lightmap_texture->FastPixel(X, Y).G; vectorsAround[counter].B = lightmap_texture->FastPixel(X, Y).B; if (vectorsAround[counter].R > 10 || vectorsAround[counter].G > 10 || vectorsAround[counter].B > 10) { counter++; } if (counter >= 10000) break; } if (counter >= 10000) break; } if (counter == 0) { counter = 1; vectorsAround[0].alpha = 0; vectorsAround[0].beta = 0; vectorsAround[0].v.x = 0; vectorsAround[0].v.y = 0; vectorsAround[0].v.z = 0; vectorsAround[0].R = 0; vectorsAround[0].G = 0; vectorsAround[0].B = 0; } vectorsCount = counter; //printf("vectors count %d\n", counter); //aspect ratio double aspectRatio = (double) width / height; //starting point for raymarching enumPerspectiveType perspectiveType = param.perspectiveType; double fov = param.doubles.persp; //raymarching start point CVector3 start; if (perspectiveType == fishEye || perspectiveType == equirectangular) { start = vp;// + baseY * param.doubles.viewDistanceMin; } else { start = vp - baseY * (1.0 / fov * zoom);// + param.doubles.viewDistanceMin); } //parameters for iteration functions sFractal calcParam = param.fractal; calcParam.normalCalculationMode = false; WriteLogDouble("All vectors and matrices prepared", thread_number); double tileXOffset = (tile % tiles); double tileYOffset = (tile / tiles); bool breakX = false; //2-pass loop (for multi-threading) for (int pass = 0; pass < 3; pass++) { if (pass > 0) yScrStart = 0; //main loop for z values for (yScr = yScrStart; yScr <= height - progressive; yScr += progressive) { //checking if some another thread is not rendering the same z if (threadParameters->thread_done[yScr] == 0 && !breakX) { //giving information for another threads that this thread renders this z value threadParameters->thread_done[yScr] = thread_number + 1; newLineRendered = true; //WriteLogDouble("Started rendering line", z); //main loop for x values breakX = false; for (int xScr = 0; xScr <= width - progressive; xScr += progressive) { //checking if program was not closed if (programClosed) { delete[] vectorsAround; for(int i = 0; i < maxRay + 1; i++) { delete[] reflectBuff[i].stepBuff; } delete[] reflectBuff; return NULL; } //recheck threads if (threadParameters->thread_done[yScr] == thread_number + 1 || threadParameters->thread_done[yScr] == 0) { if (progressive < progressiveStart && xScr % (progressive * 2) == 0 && yScr % (progressive * 2) == 0) continue; image->progressiveFactor = progressive; //------------- finding fractal surface --------------------------- //calculating of viewVector CVector3 viewVector; double x2 = ((double) xScr / width / tiles - 0.5 + tileXOffset / tiles) * aspectRatio; double z2 = ((double) yScr / height / tiles - 0.5 + tileYOffset / tiles); bool hemisphereCut = false; if (perspectiveType == fishEye) { if (param.fishEyeCut && sqrt(x2 * x2 + z2 * z2) > 0.5 / fov) { hemisphereCut = true; } double x3 = x2 * M_PI; double z3 = z2 * M_PI; double r = sqrt(x3 * x3 + z3 * z3); if(r == 0) { viewVector.x = 0.0; viewVector.z = 0.0; viewVector.y = 1.0; } else { viewVector.x = x3 / r * sin(r * fov); viewVector.z = z3 / r * sin(r * fov); viewVector.y = cos(r * fov); } viewVector.Normalize(); } else if(perspectiveType == equirectangular) { double x3 = x2 * M_PI; double z3 = z2 * M_PI; viewVector.x = sin(fov * x3) * cos(fov * z3); viewVector.z = sin(fov * z3); viewVector.y = cos(fov * x3) * cos(fov * z3); viewVector.Normalize(); } else //3-point perspective { viewVector.x = x2 * fov; viewVector.y = 1.0; viewVector.z = z2 * fov; } viewVector = mRot.RotateVector(viewVector); //Ray marching double distThresh = 0.0; CVector3 point; CVector3 startRay = start; sShaderOutput resultShader = { 0.0, 0.0, 0.0 }; sShaderOutput objectColour = { 0.0, 0.0, 0.0 }; int rayEnd = 0; for (int ray = 0; ray <= maxRay; ray++) { reflectBuff[ray].start = startRay; reflectBuff[ray].viewVector = viewVector; reflectBuff[ray].found = false; reflectBuff[ray].buffCount = 0; if (!hemisphereCut) { point = RayMarching(¶m, &calcParam, startRay, viewVector, maxDepth, true, reflectBuff[ray].stepBuff, &reflectBuff[ray].buffCount, &distThresh, &reflectBuff[ray].lastDist, &reflectBuff[ray].found, &reflectBuff[ray].depth); } else { reflectBuff[ray].found = false; } reflectBuff[ray].point = point; reflectBuff[ray].distThresh = distThresh; reflectBuff[ray].objectType = calcParam.objectOut; if(calcParam.objectOut == objFractal) reflectBuff[ray].reflect = param.doubles.imageAdjustments.reflect; if(calcParam.objectOut == objWater) reflectBuff[ray].reflect = param.doubles.primitiveWaterReflect; if(calcParam.objectOut == objPlane) reflectBuff[ray].reflect = param.doubles.primitivePlaneReflect; if(calcParam.objectOut == objBox) reflectBuff[ray].reflect = param.doubles.primitiveBoxReflect; if(calcParam.objectOut == objBoxInv) reflectBuff[ray].reflect = param.doubles.primitiveInvertedBoxReflect; if(calcParam.objectOut == objSphere) reflectBuff[ray].reflect = param.doubles.primitiveSphereReflect; if(calcParam.objectOut == objSphereInv) reflectBuff[ray].reflect = param.doubles.primitiveInvertedSphereReflect; rayEnd = ray; if(!reflectBuff[ray].found) break; if(reflectBuff[ray].reflect == 0) break; //calculate new ray direction and start point startRay = point; sShaderInputData shaderInputData; shaderInputData.calcParam = &calcParam; shaderInputData.param = ¶m; shaderInputData.dist_thresh = reflectBuff[ray].distThresh; shaderInputData.calcParam->doubles.detailSize = reflectBuff[ray].distThresh; shaderInputData.lightVect = shadowVector; shaderInputData.point = point; shaderInputData.viewVector = viewVector; if(param.fractal.constantDEThreshold) shaderInputData.delta = reflectBuff[ray].depth * param.doubles.resolution * param.doubles.persp; else shaderInputData.delta = reflectBuff[ray].distThresh * param.doubles.quality; CVector3 vn = CalculateNormals(shaderInputData); viewVector = viewVector - vn * viewVector.Dot(vn)*2.0; startRay = startRay + viewVector * reflectBuff[ray].distThresh; } for(int ray = rayEnd; ray >= 0; ray--) { sShaderOutput objectShader = { 0.0, 0.0, 0.0, 0.0 }; sShaderOutput backgroudShader = { 0.0, 0.0, 0.0, 0.0 }; sShaderOutput volumetricShader = { 0.0, 0.0, 0.0, 0.0 }; sShaderOutput specular = { 0.0, 0.0, 0.0, 0.0 }; CVector3 lightVector = shadowVector; sShaderInputData shaderInputData; shaderInputData.calcParam = &calcParam; shaderInputData.param = ¶m; shaderInputData.dist_thresh = reflectBuff[ray].distThresh; if(param.fractal.constantDEThreshold) shaderInputData.delta = reflectBuff[ray].depth * param.doubles.resolution * param.doubles.persp; else shaderInputData.delta = reflectBuff[ray].distThresh * param.doubles.quality; shaderInputData.calcParam->doubles.detailSize = reflectBuff[ray].distThresh; shaderInputData.lightVect = lightVector; shaderInputData.point = reflectBuff[ray].point; shaderInputData.viewVector = reflectBuff[ray].viewVector; shaderInputData.eyePoint = start; shaderInputData.vectorsCount = vectorsCount; shaderInputData.vectorsAround = vectorsAround; shaderInputData.lastDist = reflectBuff[ray].lastDist; shaderInputData.envMappingTexture = param.envmapTexture; shaderInputData.depth = reflectBuff[ray].depth; shaderInputData.stepCount = reflectBuff[ray].buffCount; shaderInputData.stepBuff = reflectBuff[ray].stepBuff; shaderInputData.objectType = reflectBuff[ray].objectType; //if fractal surface was found if (reflectBuff[ray].found) { objectShader = ObjectShader(shaderInputData, &objectColour, &specular); } //end if found else { backgroudShader = BackgroundShader(shaderInputData); reflectBuff[ray].depth = 1e20; } double reflect = reflectBuff[ray].reflect; sShaderOutput pixel; if (maxRay > 0 && rayEnd > 0 && ray != rayEnd) { pixel.R = resultShader.R * reflect + (1.0 - reflect) * (objectShader.R + backgroudShader.R) + specular.R; pixel.G = resultShader.G * reflect + (1.0 - reflect) * (objectShader.G + backgroudShader.G) + specular.G; pixel.B = resultShader.B * reflect + (1.0 - reflect) * (objectShader.B + backgroudShader.B) + specular.B; } else { pixel.R = objectShader.R + backgroudShader.R + specular.R; pixel.G = objectShader.G + backgroudShader.G + specular.G; pixel.B = objectShader.B + backgroudShader.B + specular.B; } pixel.alpha = objectShader.alpha + backgroudShader.alpha; sShaderOutput opacityOut; volumetricShader = VolumetricShader(shaderInputData, pixel, &opacityOut); resultShader.R = volumetricShader.R; resultShader.G = volumetricShader.G; resultShader.B = volumetricShader.B; if(ray == 0) { image->PutPixelOpacity(xScr, yScr, (unsigned short)(opacityOut.R * 65535.0)); image->PutPixelAlpha(xScr, yScr, (unsigned short)(volumetricShader.alpha * 65535.0)); } } sRGBfloat pixel2; pixel2.R = resultShader.R; pixel2.G = resultShader.G; pixel2.B = resultShader.B; sRGB8 colour; colour.R = objectColour.R * 255; colour.G = objectColour.G * 255; colour.B = objectColour.B * 255; image->PutPixelImage(xScr, yScr, pixel2); image->PutPixelColour(xScr, yScr, colour); image->PutPixelZBuffer(xScr, yScr, (float)reflectBuff[0].depth); } else { breakX = true; break; } } //next x if (!breakX) threadParameters->linesToSend[yScr] = true; image->Squares(yScr, progressive); (*threadParameters->done)++; double progressiveDone, percent_done; if (progressive == progressiveStart) progressiveDone = 0; else progressiveDone = 0.25 / (progressive * progressive); if (progressiveStart == 1) { percent_done = ((double) *threadParameters->done / height) * 100.0; } else { percent_done = (((double) *threadParameters->done / height) * 3.0 / 4.0 / progressive + progressiveDone) * 100.0; } if (param.noOfTiles > 1) { percent_done = (param.tileCount + percent_done / 100.0) / (param.noOfTiles * param.noOfTiles) * 100.0; } if (Interface_data.animMode) { percent_done = (param.fractal.frameNo - param.startFrame + percent_done / 100.0) / (param.endFrame - param.startFrame + 1) * 100.0; } double time = real_clock() - start_time; double time_to_go = (100.0 - percent_done) * time / percent_done; int togo_time_s = (int) time_to_go % 60; int togo_time_min = (int) (time_to_go / 60) % 60; int togo_time_h = time_to_go / 3600; int time_s = (int) time % 60; int time_min = (int) (time / 60) % 60; int time_h = time / 3600; double iterations_per_sec = N_counter / time; if (!param.quiet) { printf("Done %.3f%%, to go = %dh%dm%ds, elapsed = %dh%dm%ds, iters/s = %.0f \r", percent_done, togo_time_h, togo_time_min, togo_time_s, time_h, time_min, time_s, iterations_per_sec); fflush(stdout); } //printing to console some statistics if (*threadParameters->done == height - 1) { double avg_N = (double) N_counter / Loop_counter; double avg_DE = (double) DE_counter / Pixel_counter; double avgMissedDE = (double) Missed_DE_counter / Pixel_counter * 100.0; printf("Average N = %f, Average DE steps = %f, Missed DE %.3f%%\n", avg_N, avg_DE, avgMissedDE); } //WriteLogDouble("Rendering line finished", z); } //end if thread done else { breakX = false; if (pass < 2) { int firstFree = -1; int lastFree = -1; int maxHole = 0; for (int i = 0; i < height; i += progressive) { if (firstFree < 0 && threadParameters->thread_done[i] == 0) { firstFree = i; } if (firstFree > 0 && threadParameters->thread_done[i] > 0) { lastFree = i; int holeSize = lastFree - firstFree; if (holeSize > maxHole) { yScr = (((firstFree + lastFree) / 2) / progressive) * progressive - progressive; maxHole = holeSize; } firstFree = -1; lastFree = -1; } } if (firstFree > 0 && lastFree < 0) { yScr = (((firstFree + height) / 2) / progressive) * progressive; maxHole = 1; } if (maxHole == 0) break; } if (programClosed) break; } } //next z } // next pass WriteLogDouble("Thread finished", thread_number); delete[] vectorsAround; for(int i = 0; i < maxRay + 1; i++) { delete[] reflectBuff[i].stepBuff; } delete[] reflectBuff; return 0; } //************************** Render ************************************** void Render(sParamRender param, cImage *image, GtkWidget *outputDarea) { programClosed = false; //getting image resolution from parameters CheckPrameters(¶m); int width = image->GetWidth(); int height = image->GetHeight(); if (!clSupport->IsReady()) { //turn off refreshing if resolution is very low bool bo_refreshing = true; //sending settings to clients if(netRender->IsServer()) SendSettingsToClients(param); //if it is a server, send "run" command to all clients if (netRender->IsServer()) { for (int i = 0; i < netRender->getNoOfClients(); i++) { netRender->sendDataToClient(NULL, 0, (char*)"run", i, param.fractal.frameNo); } } //calculate total number of vailable CPUs int netCpuCount = NR_THREADS; for(int i=0; igetNoOfClients(); i++) { netCpuCount += netRender->getCpuCount(i); } //setting first lines to render int cpuIndex = NR_THREADS; if (netRender->IsServer()) { for (int clientIndex = 0; clientIndex < netRender->getNoOfClients(); clientIndex++) { for(int i=0; igetCpuCount(clientIndex); i++) { int startLine = cpuIndex * height / netCpuCount; netRender->sendDataToClient(&startLine, sizeof(startLine), (char*)"stl", clientIndex, 0); printf("set start line = %d\n", startLine); cpuIndex++; } } } //clearing histogram tables for (int i = 0; i < 64; i++) histogram[i] = 0; for (int i = 0; i < 256; i++) histogram2[i] = 0; WriteLog("Histogram data cleared"); //reseting counters N_counter = 0; Loop_counter = 0; DE_counter = 0; Pixel_counter = 0; Missed_DE_counter = 0; DEerror = 0; DE_counterForDEerror = 0; //initialising threads int *thread_done = new int[height]; int *thread_done_from_server = new int[height]; bool *linesToSend = new bool[height]; GThread **Thread = new GThread *[NR_THREADS + 1]; GError **err = new GError *[NR_THREADS + 1]; sParam *thread_param = new sParam[NR_THREADS]; //initialise send/receive buffer sAllImageData *lineOfImage = NULL; lineOfImage = new sAllImageData[width+1]; int progressiveStart = 8; if (param.recordMode || noGUI || netRender->IsServer() || netRender->IsClient()) progressiveStart = 1; image->progressiveFactor = progressiveStart; double refresh_skip = 0.1; double refreshEndTime = real_clock(); image->CalculateGammaTable(); for (int progressive = progressiveStart; progressive != 0; progressive /= 2) { //if (width * height / progressive / progressive <= 100 * 100) bo_refreshing = false; //else bo_refreshing = true; int done = 0; for (int i = 0; i < NR_THREADS; i++) { err[i] = NULL; } for (int i = 0; i < height; i++) { thread_done[i] = 0; thread_done_from_server[i] = 0; linesToSend[i] = false; } WriteLog("Thread data prepared"); //running rendering threads in background for (int i = 0; i < NR_THREADS; i++) { //sending some parameters to thread if(!netRender->IsClient()) { thread_param[i].start = i * height / netCpuCount; } else { //getting indexes of first lines to render int startLine = 0; char command[4]; size_t bytes_received = netRender->receiveDataFromServer(command); if(!strcmp(command, "stl") && bytes_received == sizeof(int)) { netRender->GetData(&startLine); } printf("command = %s, start line = %d\n", command, startLine); thread_param[i].start = startLine; } //initialising local threads thread_param[i].z = i; thread_param[i].param = param; thread_param[i].image = image; thread_param[i].progressive = progressive; thread_param[i].progressiveStart = progressiveStart; thread_param[i].done = &done; thread_param[i].thread_done = thread_done; thread_param[i].linesToSend = linesToSend; //creating thread Thread[i] = g_thread_create((GThreadFunc) MainThread, &thread_param[i], TRUE, &err[i]); WriteLogDouble("Thread created", i); //printf("Rendering thread #%d created\n", i + 1); } //refresh GUI if ((!noGUI && bo_refreshing) || netRender->IsClient()) { if (image->IsPreview() || netRender->IsClient()) { while (gtk_events_pending()) gtk_main_iteration(); } int done2 = 0; //refreshing image and histograms during rendering while (done2 < height / progressive - 1 && !programClosed) { //send list of rendered lines if (netRender->IsServer() && newLineRendered) { newLineRendered = false; for (int i = 0; i < netRender->getNoOfClients(); i++) { netRender->sendDataToClient(thread_done, sizeof(int)*height, (char*)"lst", i, param.fractal.frameNo); } } char command[4]; //get rendered line if available if (netRender->IsServer()) { for (int i = 0; i < netRender->getNoOfClients(); i++) { netRender->sendDataToClient(NULL, 0, (char*)"get", i, param.fractal.frameNo); } for (int i = 0; i < netRender->getNoOfClients(); i++) { size_t bytes_recvd = netRender->receiveDataFromClient(command, i, param.fractal.frameNo); if(!strcmp(command, "GET")) { if(bytes_recvd > 0) { int *last; netRender->GetData(lineOfImage); last = (int*)&lineOfImage[width]; int y = *last; if(yPutPixelImage(x,y, lineOfImage[x].imageFloat); image->PutPixelAlpha(x,y, lineOfImage[x].alphaBuffer); image->PutPixelZBuffer(x,y, lineOfImage[x].zBuffer); image->PutPixelColour(x,y, lineOfImage[x].colourBuffer); image->PutPixelOpacity(x,y, lineOfImage[x].opacityBuffer); } thread_done[y] = 99; newLineRendered = true; } } } } } if (netRender->IsClient()) { //receiving list of already rendered lines netRender->receiveDataFromServer(command); if(!strcmp(command, "lst")) { netRender->GetData(thread_done_from_server); memcpy(thread_done, thread_done_from_server, sizeof(int)*height); } //sending rendered line if(!strcmp(command, "get")) { bool sentSomething = false; for(int y=0; yGetPixelImage(x, y); lineOfImage[x].alphaBuffer = image->GetPixelAlpha(x, y); lineOfImage[x].colourBuffer = image->GetPixelColor(x, y); lineOfImage[x].zBuffer = image->GetPixelZBuffer(x, y); lineOfImage[x].opacityBuffer = image->GetPixelOpacity(x, y); } int *last; last = (int*)&lineOfImage[width]; *last = y; netRender->sendDataToServer(lineOfImage, sizeof(sAllImageData)*(width+1),(char*)"GET"); sentSomething = true; break; } } if(!sentSomething) { //sending null answer when there si nothing to send netRender->sendDataToServer(NULL,0,(char*)"GET"); } } if(!strcmp(command, "stp")) { programClosed = true; } } if(!netRender->IsClient() && !netRender->IsServer()) g_usleep(100000); if (!noGUI) { if (progressive < progressiveStart || netRender->IsServer() || netRender->IsClient()) { if (real_clock() - refreshEndTime >= refresh_skip) { double refreshStartTime = real_clock(); if (image->IsPreview()) { image->CompileImage(); WriteLog("Image compiled"); if (param.SSAOEnabled && !netRender->IsClient() && !netRender->IsServer()) { PostRendering_SSAO(image, param.doubles.persp, param.SSAOQuality/(sqrt(progressive+2)), param.perspectiveType, param.quiet); } image->ConvertTo8bit(); WriteLog("Image converted to 8-bit"); image->UpdatePreview(); WriteLog("Preview created"); if (outputDarea != NULL) { DrawHistogram(); DrawHistogram2(); WriteLog("Histograms refreshed"); image->RedrawInWidget(outputDarea); WriteLog("Image redrawn in window"); } } refreshEndTime = real_clock(); //printf("RefreshTime: %f\n", refreshEndTime - refreshStartTime); refresh_skip = (refreshEndTime - refreshStartTime) * 10; WriteLogDouble("Image refreshed", refreshEndTime - refreshStartTime); } } } if (!noGUI) { if (outputDarea != NULL) { //progress bar char progressText[1000]; double progressiveDone, percent_done; if (progressive == progressiveStart) progressiveDone = 0; else progressiveDone = 0.25 / (progressive * progressive); if (progressiveStart == 1) { percent_done = ((double) done2 / height) * 100.0; } else { percent_done = (((double) done2 / height) * 3.0 / 4.0 / progressive + progressiveDone) * 100.0; } if (param.noOfTiles > 1) { percent_done = (param.tileCount + percent_done / 100.0) / (param.noOfTiles * param.noOfTiles) * 100.0; } if (Interface_data.animMode) { percent_done = (param.fractal.frameNo - param.startFrame + percent_done / 100.0) / (param.endFrame - param.startFrame + 1) * 100.0; } double time = real_clock() - start_time; double time_to_go = (100.0 - percent_done) * time / percent_done; int togo_time_s = (int) time_to_go % 60; int togo_time_min = (int) (time_to_go / 60) % 60; int togo_time_h = time_to_go / 3600; int time_s = (int) time % 60; int time_min = (int) (time / 60) % 60; int time_h = time / 3600; double iterations_per_sec = N_counter / time; //double avgDEerror = DEerror / DE_counterForDEerror*100.0; double avgMissedDE = (double) Missed_DE_counter / Pixel_counter * 100.0; sprintf(progressText, "%.3f%%, to go %dh%dm%ds, elapsed %dh%dm%ds, iters/s %.0f, Missed DE %.3f%%", percent_done, togo_time_h, togo_time_min, togo_time_s, time_h, time_min, time_s, iterations_per_sec, avgMissedDE); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), percent_done / 100.0); } } //refreshing GUI if (image->IsPreview() || netRender->IsClient()) { while (gtk_events_pending()) gtk_main_iteration(); } done2 = 0; for(int i=0; i 0) { done2++; } } } } //when rendered all of image lines wait for finishing threads for (int i = 0; i < NR_THREADS; i++) { g_thread_join(Thread[i]); WriteLogDouble("Thread finish confirmed", i); //printf("Rendering thread #%d finished\n", i + 1); } //terminate rendering by all clients if (netRender->IsServer()) { for (int i = 0; i < netRender->getNoOfClients(); i++) { netRender->sendDataToClient(NULL, 0, (char*)"stp", i, param.fractal.frameNo); } } if (programClosed) break; } //next progress printf("\n"); //refreshing image //*** postprocessing image->CompileImage(); WriteLog("Image compiled"); if (param.SSAOEnabled && !netRender->IsClient()) { PostRendering_SSAO(image, param.doubles.persp, param.SSAOQuality, param.perspectiveType, param.quiet); WriteLog("SSAO rendered"); } if (param.DOFEnabled && !programClosed && !netRender->IsClient()) { double DOF_focus = pow(10, param.doubles.DOFFocus / 10.0 - 16.0); PostRendering_DOF(image, param.doubles.DOFRadius * width / 1000.0, DOF_focus); WriteLog("DOF rendered"); } if (!noGUI) { if (image->IsPreview()) { image->ConvertTo8bit(); WriteLog("Image converted to 8-bit"); image->UpdatePreview(); WriteLog("Preview created"); if (outputDarea != NULL) { DrawHistogram(); DrawHistogram2(); WriteLog("Histograms refreshed"); image->RedrawInWidget(outputDarea); WriteLog("Image redrawn in window"); } } } if (!noGUI) { if (outputDarea != NULL) { char progressText[1000]; double time = real_clock() - start_time; int time_s = (int) time % 60; int time_min = (int) (time / 60) % 60; int time_h = time / 3600; double iterations_per_sec = N_counter / time; double avg_N = (double) N_counter / Loop_counter; double avg_DE = (double) DE_counter / Pixel_counter; double avgDEerror = DEerror / DE_counterForDEerror * 100.0; double avgMissedDE = (double) Missed_DE_counter / Pixel_counter * 100.0; sprintf(progressText, "Render time %dh%dm%ds, iters/s %.0f, avg. N %.1f, avg. DEsteps %.1f, DEerror %.1f%%, MissedDE %.3f%%", time_h, time_min, time_s, iterations_per_sec, avg_N, avg_DE, avgDEerror, avgMissedDE); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); } if (image->IsPreview()) { while (gtk_events_pending()) gtk_main_iteration(); } } delete[] thread_done; delete[] thread_param; delete[] Thread; delete[] err; delete[] linesToSend; delete[] thread_done_from_server; if (lineOfImage) delete[] lineOfImage; } else { #ifdef CLSUPPORT printf("OpenCL rendering\n"); clSupport->SetSize(image->GetWidth(), image->GetHeight()); sClInBuff *inCLBuff = clSupport->GetInBuffer1(); sClInConstants *inCLConstants = clSupport->GetInConstantBuffer1(); Params2Cl(¶m, inCLBuff, inCLConstants); //calculating vectors for AmbientOcclusion int counter = 0; int lightMapWidth = param.lightmapTexture->Width(); int lightMapHeight = param.lightmapTexture->Height(); for (double b = -0.49 * M_PI; b < 0.49 * M_PI; b += 1.0 / param.globalIlumQuality) { for (double a = 0.0; a < 2.0 * M_PI; a += ((2.0 / param.globalIlumQuality) / cos(b))) { CVector3 d; d.x = cos(a + b) * cos(b); d.y = sin(a + b) * cos(b); d.z = sin(b); inCLBuff->vectorsAround[counter].x = d.x; inCLBuff->vectorsAround[counter].y = d.y; inCLBuff->vectorsAround[counter].z = d.z; int X = (int) ((a + b) / (2.0 * M_PI) * lightMapWidth + lightMapWidth * 8.5) % lightMapWidth; int Y = (int) (b / (M_PI) * lightMapHeight + lightMapHeight * 8.5) % lightMapHeight; inCLBuff->vectorsAroundColours[counter].x = param.lightmapTexture->FastPixel(X, Y).R / 256.0; inCLBuff->vectorsAroundColours[counter].y = param.lightmapTexture->FastPixel(X, Y).G / 256.0; inCLBuff->vectorsAroundColours[counter].z = param.lightmapTexture->FastPixel(X, Y).B / 256.0; if (inCLBuff->vectorsAroundColours[counter].x > 0.05 || inCLBuff->vectorsAroundColours[counter].y > 0.05 || inCLBuff->vectorsAroundColours[counter].z > 0.05) { counter++; } if (counter >= 10000) break; } if (counter >= 10000) break; } if (counter == 0) { counter = 1; inCLBuff->vectorsAround[0].x = 0; inCLBuff->vectorsAround[0].y = 0; inCLBuff->vectorsAround[0].z = 0; inCLBuff->vectorsAroundColours[0].x = 0; inCLBuff->vectorsAroundColours[0].y = 0; inCLBuff->vectorsAroundColours[0].z = 0; } inCLConstants->params.AmbientOcclusionNoOfVectors = counter; //printf("Ambient occlusion counter %d\n", counter); clSupport->SetParams(inCLBuff, inCLConstants, param.fractal.formula); if(param.backgroundTexture->IsLoaded())clSupport->AssignBackgroundTexture(param.backgroundTexture); start_time = real_clock(); image->progressiveFactor = 1; clSupport->Render(image, outputDarea); image->CompileImage(); if(param.SSAOEnabled) { clSupport->SSAORender(image, outputDarea); } if(param.DOFEnabled && param.OpenCLDOFMethod == 0) { clSupport->DOFRender(image, outputDarea); } double time = real_clock() - start_time; if (image->IsPreview()) { image->ConvertTo8bit(); image->UpdatePreview(); if(!Interface_data.recordMode) { image->RedrawInWidget(outputDarea); } while (gtk_events_pending()) gtk_main_iteration(); } if (outputDarea != NULL) { char progressText[1000]; sprintf(progressText, "OpenCL rendering time: %f seconds", time); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); } #endif } //render camera and light flyight patha on preview if (image->IsPreview() && !param.quiet && !Interface_data.recordMode) { DrawKeyframePaths(¶m, image, outputDarea); } if (image->IsPreview() && !param.quiet && Interface_data.recordMode) { DrawHud(¶m, image, outputDarea); } } void DrawHud(sParamRender *param, cImage *image, GtkWidget *outputDarea) { CRotationMatrix mRotInv; mRotInv.RotateY(-param->doubles.gamma); mRotInv.RotateX(-param->doubles.beta); mRotInv.RotateZ(-param->doubles.alpha); double width = image->GetPreviewWidth(); double height = image->GetPreviewHeight(); CVector3 center = CVector3(width * 0.5, height * 0.5, 0.0); const int steps = 100; const double persp = 0.2; CVector3 circlePoint1[steps]; CVector3 circlePoint2[steps]; CVector3 circlePoint3[steps]; for(int i = 0; iAntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(circlePoint2[index1], mRotInv, persp) * (height * 0.2) + center; point2 = CalcPointPersp(circlePoint2[index2], mRotInv, persp) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(circlePoint3[index1], mRotInv, persp) * (height * 0.2) + center; point2 = CalcPointPersp(circlePoint3[index2], mRotInv, persp) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 100, 255 }, 0.5, 0); } CVector3 point1, point2; point1 = CalcPointPersp(CVector3(1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(-1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, -1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.9, -0.05, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.9, 0.05, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.9, 0.0, 0.05), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.9, 0.0, -0.05), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 255, 0, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 0.0, 1.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 0.0, -1.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, -1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.05, 0.9, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(-0.05, 0.9, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 0.9, 0.05), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 0.9, -0.05), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 1.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 255, 0 }, 0.5, 0); point1 = CalcPointPersp(CVector3(1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(-1.0, 0.0, 0.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 150, 255 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 0.0, -1.0), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 0.0, 1.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 150, 255 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.05, 0.0, 0.9), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 0.0, 1.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 150, 255 }, 0.5, 0); point1 = CalcPointPersp(CVector3(-0.05, 0.0, 0.9), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 0.0, 1.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 150, 255 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, 0.05, 0.9), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 0.0, 1.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 150, 255 }, 0.5, 0); point1 = CalcPointPersp(CVector3(0.0, -0.05, 0.9), mRotInv, 0.2) * (height * 0.2) + center; point2 = CalcPointPersp(CVector3(0.0, 0.0, 1.0), mRotInv, 0.2) * (height * 0.2) + center; image->AntiAliasedLine(point1.x, point1.y, point2.x, point2.y, -1.0, -1.0, (sRGB8 ) { 0, 150, 255 }, 0.5, 0); image->RedrawInWidget(outputDarea); } CVector3 CalcPointPersp(CVector3 point, CRotationMatrix rot, double persp) { CVector3 vect; CVector3 out; vect = rot.RotateVector(point); out.x = vect.x / (1.0 + vect.y * persp); out.y = vect.z / (1.0 + vect.y * persp); return out; } void DrawKeyframePaths(sParamRender *param, cImage *image, GtkWidget *outputDarea) { CRotationMatrix mRotInv; mRotInv.RotateY(-param->doubles.gamma); mRotInv.RotateX(-param->doubles.beta); mRotInv.RotateZ(-param->doubles.alpha); CVector3 pointPrevFrame, pointActFrame; CVector3 lightPrevFrame[4], lightActFrame[4]; for (int index = 0; index < timeline->GetKeyframeCount(); index++) { for (int frame = 0; frame < 100; frame++) { sParamRenderD paramsInterpol; timeline->GetFrameParamsInterpolated(index * 100 + frame, 100, ¶msInterpol); pointActFrame = InvProjection3D(paramsInterpol.vp, param->doubles.vp, mRotInv, param->perspectiveType, param->doubles.persp, param->doubles.zoom, image->GetPreviewWidth(), image->GetPreviewHeight()); for (int l = 0; l < 4; l++) { if (param->auxLightPreEnabled[l]) { lightActFrame[l] = InvProjection3D(paramsInterpol.auxLightPre[l], param->doubles.vp, mRotInv, param->perspectiveType, param->doubles.persp, param->doubles.zoom, image->GetPreviewWidth(), image->GetPreviewHeight()); } else { lightActFrame[l] = (CVector3 ) { 0.0, 0.0, -1.0 }; } } if (index > 0 || frame > 0) { if (pointActFrame.z > 0.0) { unsigned char R = (int) 255 * index / timeline->GetKeyframeCount(); unsigned char G = (int) 255 * frame / 100; unsigned char B = (int) 255 - 255 * index / timeline->GetKeyframeCount(); image->AntiAliasedLine(pointPrevFrame.x, pointPrevFrame.y, pointActFrame.x, pointActFrame.y, pointPrevFrame.z, pointActFrame.z, (sRGB8 ) { R, G, B }, 0.9, 0); } for (int l = 0; l < 4; l++) { if (lightActFrame[l].z > 0.0) { unsigned char R = 255 - param->auxLightPreColour[l].R / 256; unsigned char G = 255 - param->auxLightPreColour[l].G / 256; unsigned char B = 255 - param->auxLightPreColour[l].B / 256; image->AntiAliasedLine(lightPrevFrame[l].x, lightPrevFrame[l].y, lightActFrame[l].x, lightActFrame[l].y, lightPrevFrame[l].z, lightActFrame[l].z, (sRGB8 ) { R, G, B }, 0.9, 0); } } } if (frame == 0) { if (pointActFrame.z > 0.0) image->CircleBorder(pointActFrame.x, pointActFrame.y, pointActFrame.z, 5.0, (sRGB8 ) { 255, 0, 0 }, 2.0, 1.0, 0); for (int l = 0; l < 4; l++) { unsigned char R = param->auxLightPreColour[l].R / 256; unsigned char G = param->auxLightPreColour[l].G / 256; unsigned char B = param->auxLightPreColour[l].B / 256; if (lightActFrame[l].z > 0.0) image->CircleBorder(lightActFrame[l].x, lightActFrame[l].y, lightActFrame[l].z, 3.0, (sRGB8 ) { R, G, B }, 1.0, 1.0, 0); } } pointPrevFrame = pointActFrame; for (int l = 0; l < 4; l++) lightPrevFrame[l] = lightActFrame[l]; } } image->RedrawInWidget(outputDarea); } //******************************** Get number of CPU cores ************* int get_cpu_count() { int ret; #ifdef WIN32 /* WINDOWS */ SYSTEM_INFO info; GetSystemInfo(&info); ret = info.dwNumberOfProcessors; #elif defined(__sgi) ret = (int) sysconf(_SC_NPROC_ONLN); #else /*other unix - try sysconf*/ ret = (int) sysconf(_SC_NPROCESSORS_ONLN); #endif /* WINDOWS */ return ret; } //********************************** MAIN ******************************* int main(int argc, char *argv[]) { //read $home env variable const char *homedir; setlocale(LC_ALL, ""); #ifdef WIN32 /* WINDOWS */ homedir = getenv("USERPROFILE"); #else /*other unix - try sysconf*/ homedir = getenv("HOME"); #endif /* WINDOWS */ #ifdef WIN32 /* WINDOWS */ sharedDir = new char[MAXPATHLEN]; char pathCWD[MAXPATHLEN]; getcwd(pathCWD, MAXPATHLEN); strcpy(sharedDir, (string(pathCWD)+"\\").c_str()); #else /*other unix - try sysconf*/ sharedDir = new char[1000]; strcpy(sharedDir, (string(SHARED_DIR)+"/").c_str()); #endif /* WINDOWS */ //logfile #ifdef WIN32 /* WINDOWS */ logfileName="log.txt"; #else logfileName=string(homedir)+ "/.mandelbulber_log.txt"; #endif FILE *logfile = fopen(logfileName.c_str(), "w"); fclose(logfile); printf("Log file: %s\n", logfileName.c_str()); WriteLog("Log file created"); //initialising GTK+ bool result = ReadComandlineParams(argc, argv); WriteLogDouble("Parameters read from console", argc); if (result == false) { printf("Failed to start program. Wrong command syntax\n"); return -1; } if (noGUI) { printf("noGUI mode\n"); WriteLog("noGUI mode"); } else { gtk_init(&argc, &argv); WriteLog("GTK initialised"); } //detecting number of CPU cores NR_THREADS = get_cpu_count(); #ifdef ONETHREAD //for debbuging NR_THREADS = 1; #endif //NR_THREADS = 1; printf("Detected %d CPUs\n", NR_THREADS); WriteLogDouble("CPUs detected", NR_THREADS); //lockout for refreshing image during program startup Interface_data.disableInitRefresh = true; //allocating memory for image in window mainImage.CreatePreview(1.0); WriteLog("Memory allocated for preview"); //allocating memory for lights Lights = new sLight[10000]; WriteLog("memory for lights allocated"); printf("Memory allocated\n"); timeline.reset(new cTimeline); //initialising g_thread if (!g_thread_supported()) { g_thread_init(NULL); gdk_threads_init(); // Called to initialize internal mutex "gdk_threads_mutex". printf("g_thread supported\n"); } else { printf("g_thread already initialised or not supported\n"); //return 1; } WriteLog("g_thread initialised"); //OpenCL clSupport = new CclSupport(); //clSupport->Init(); sParamRender fractParamDefault; //memset(&fractParamDefault, 0, sizeof(sParamRender)); //WriteLog("allocated memory for default parameters"); //data directory location #ifdef WIN32 /* WINDOWS */ sprintf(data_directory, "%s/mandelbulber", homedir); #else sprintf(data_directory, "%s/.mandelbulber", homedir); #endif printf("Default data directory: %s\n", data_directory); //create data directory if not exists DIR *dir; dir = opendir(data_directory); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(data_directory); #else else mkdir(data_directory, (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif WriteLog("Data directory"); //create settings directory if not exists string settingsDir = string(data_directory) + "/settings"; dir = opendir(settingsDir.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(settingsDir.c_str()); #else else mkdir(settingsDir.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif WriteLog("Settings directory"); //create settings directory if not exists string imagesDir = string(data_directory) + "/images"; dir = opendir(imagesDir.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(imagesDir.c_str()); #else else mkdir(imagesDir.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif WriteLog("Images directory"); //create keyframes directory if not exists string keyframesDir = string(data_directory) + "/keyframes"; dir = opendir(keyframesDir.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(keyframesDir.c_str()); #else else mkdir(keyframesDir.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif WriteLog("Keyframes directory"); //create paths directory if not exists string pathsDir = string(data_directory) + "/paths"; dir = opendir(pathsDir.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(pathsDir.c_str()); #else else mkdir(pathsDir.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif WriteLog("Paths directory"); //create undo directory if not exists string undoDir = string(data_directory) + "/undo"; dir = opendir(undoDir.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(undoDir.c_str()); #else else mkdir(undoDir.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif WriteLog("Undo directory"); //copy defaults settings string defaults = string(data_directory) + "/.defaults"; if(!FileIfExists(defaults.c_str())) { fcopy((string(sharedDir)+"/defaults").c_str(),defaults.c_str()); WriteLog("Defaults copied"); } #ifdef CLSUPPORT //create and copy of example custom formulas string oclDir = string(data_directory) + "/custom_ocl_formulas"; dir = opendir(oclDir.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else { mkdir(oclDir.c_str()); #else else { mkdir(oclDir.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif fcopy((string(sharedDir)+"/exampleOCLformulas/cl_example1.c").c_str(),(oclDir + "/cl_example1.c").c_str()); fcopy((string(sharedDir)+"/exampleOCLformulas/cl_example2.c").c_str(),(oclDir + "/cl_example2.c").c_str()); fcopy((string(sharedDir)+"/exampleOCLformulas/cl_example3.c").c_str(),(oclDir + +"/cl_example3.c").c_str()); fcopy((string(sharedDir)+"/exampleOCLformulas/cl_example1Init.c").c_str(),(oclDir + "/cl_example1Init.c").c_str()); fcopy((string(sharedDir)+"/exampleOCLformulas/cl_example2Init.c").c_str(),(oclDir + "/cl_example2Init.c").c_str()); fcopy((string(sharedDir)+"/exampleOCLformulas/cl_example3Init.c").c_str(),(oclDir + "/cl_example3Init.c").c_str()); } WriteLog("Custom formulas directory"); #endif strcpy(lastFilenameSettings, "settings/default.fract"); strcpy(lastFilenameImage, "images/image.jpg"); strcpy(lastFilenamePalette, (string(sharedDir)+"textures/colour palette.jpg").c_str()); bool noGUIsettingsLoaded = false; if (noGUI) { if (LoadSettings(noGUIdata.settingsFile, noGUIdata.fractparams)) { noGUIsettingsLoaded = true; WriteLog("Parameters loaded in noGUI mode"); } } //initialise netRender netRender = new CNetRender(MANDELBULBER_VERSION * 1000, NR_THREADS); //set program home directory if (!chdir(data_directory)) { //update of reference file with defaults SaveSettings(".defaults", fractParamDefault, false); WriteLog("Defaults regenerated"); //loading undo buffer status undoBuffer.LoadStatus(); WriteLog("Undo buffer status loaded"); //reading default configuration in GUI mode if (!noGUI) { if (LoadSettings((string(sharedDir)+"examples/default.fract").c_str(), fractParamDefault)) { WriteLog("Default settings loaded"); printf("Default settings loaded successfully (%s)\n",(string(sharedDir)+"examples/default.fract").c_str()); //creating GTK+ GUI Params2InterfaceData(&fractParamDefault); CreateInterface(&fractParamDefault); } else { printf("Can't open default settings file: %s\n",(string(sharedDir)+"examples/default.fract").c_str()); WriteLog("Can't open default settings file"); WriteLog(data_directory); GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error! Can't open default settings file\n%s",(string(sharedDir)+"examples/default.fract").c_str()); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } } else { g_type_init(); if(!noGUIdata.netrenderMode) { if (!noGUIsettingsLoaded) { char settingsFile2[1000]; sprintf(settingsFile2, "settings/%s", noGUIdata.settingsFile); if (!LoadSettings(settingsFile2, noGUIdata.fractparams)) { printf("ERROR! Can't open settings file: %s\n", noGUIdata.settingsFile); return -1; } } WriteLog("Default settings loaded"); Interface_data.animMode = noGUIdata.animMode; Interface_data.playMode = noGUIdata.playMode; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = noGUIdata.keyframeMode; MainRender(); WriteLog("Rendering completely finished"); } else { printf("Starting net client application\n"); NoGUIClientEnable(); } } WriteLog("Memory for parameters released"); } else { printf("Can't access default data directory: %s\n", data_directory); WriteLog("Can't access default data directory"); WriteLog(data_directory); } return 0; } //Init parameters void InitMainParameters(sParamRender *fractParam) { WriteLog("Memory allocated for fractal parameters"); //reading parameters from interface if (!noGUI) { ReadInterface(fractParam); printf("Data has been read from interface\n"); WriteLog("Data read from interface"); } else { memcpy(fractParam, &noGUIdata.fractparams, sizeof(sParamRender)); Params2InterfaceData(&noGUIdata.fractparams); ReadInterface(fractParam); Interface_data.imageFormat = noGUIdata.imageFormat; WriteLog("Data read from interface"); } //animation/render mode fractParam->playMode = Interface_data.playMode; fractParam->animMode = Interface_data.animMode; fractParam->recordMode = Interface_data.recordMode; fractParam->continueRecord = Interface_data.continueRecord; } //Init main image and window bool InitMainImage(cImage *image, int width, int height, double previewScale, GtkWidget *drawingArea) { if(!image->ChangeSize(width, height)) { printf("Cannot allocate memory. Maybe image is too big"); return false; } else { WriteLog("complexImage allocated"); printf("Memory for image: %d MB\n", image->GetUsedMB()); if(!noGUI) image->CreatePreview(previewScale); if (!noGUI) { gtk_widget_set_size_request(drawingArea, image->GetPreviewWidth(), image->GetPreviewHeight()); } WriteLog("rgbbuf allocated"); //waiting for refresh window //g_usleep(100000); if (!noGUI) { for (int i = 0; i < 10; i++) { while (gtk_events_pending()) gtk_main_iteration(); } } WriteLog("Windows refreshed"); printf("Memory for image reallocated\n"); return true; } } bool LoadTextures(sParamRender *params) { //loading texture for environment mapping if(params->doubles.imageAdjustments.reflect > 0 && !params->imageSwitches.raytracedReflections) { params->envmapTexture = new cTexture(params->file_envmap); if (params->envmapTexture->IsLoaded()) { printf("Environment map texture loaded\n"); WriteLog("Environment map texture loaded"); } else { printf("Error! Can't open envmap texture: %s\n", params->file_envmap); WriteLog("Error! Can't open envmap texture"); WriteLog(params->file_envmap); if (!noGUI) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error loading envmap texture file: %s", params->file_envmap); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } //isRendering = false; //return false; } } else { params->envmapTexture = new cTexture; } //loading texture for ambient occlusion light map if(params->global_ilumination && !params->fastGlobalIllumination) { params->lightmapTexture = new cTexture(params->file_lightmap); if (params->lightmapTexture->IsLoaded()) { printf("Ambient occlusion light map texture loaded\n"); WriteLog("Ambient occlusion light map texture loaded"); } else { printf("Error! Can't open ambient occlusion light map texture:%s\n", params->file_lightmap); WriteLog("Error! Can't open ambient occlusion light map texture"); WriteLog(params->file_lightmap); if (!noGUI) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error! Can't open ambient occlusion light map texture:\n%s", params->file_lightmap); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } //isRendering = false; //return false; } } else { params->lightmapTexture = new cTexture; } //reading background texture if(params->texturedBackground) { params->backgroundTexture = new cTexture(params->file_background); if (params->backgroundTexture->IsLoaded()) { printf("Background texture loaded\n"); WriteLog("Background texture loaded"); } else { printf("Error! Can't open background texture:%s\n", params->file_background); WriteLog("Error! Can't open background texture"); WriteLog(params->file_background); if (!noGUI) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error! Can't open background texture:\n%s", params->file_background); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } //isRendering = false; //return false; } } else { params->backgroundTexture = new cTexture; } return true; } //****************************8 MAIN called by "Render" button void MainRender(void) { isRendering = true; programClosed = false; //allocating memory for fractal parameters sParamRender fractParam; if (noGUI) { memcpy(Interface_data.palette, noGUIdata.fractparams.palette, sizeof(sRGB)*256); } InitMainParameters(&fractParam); if (!LoadTextures(&fractParam)) return; //image size int width = fractParam.image_width; int height = fractParam.image_height; if(!InitMainImage(&mainImage, width, height, Interface_data.imageScale, renderWindow.drawingArea)) { int neededMem = mainImage.GetUsedMB(); InitMainImage(&mainImage, 800, 600, Interface_data.imageScale, renderWindow.drawingArea); if (!noGUI) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error allocating memory\nMaybe image was set too big\nNeeded %d MB", neededMem); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } isRendering = false; programClosed = true; Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; return; } if (!noGUI) { DrawPalette(fractParam.palette); WriteLog("Palette refreshed on GUI"); } //placing random Lights if (lightsPlaced == 0) { PlaceRandomLights(&fractParam, false); WriteLog("Lights placed"); } printf("Lights placed\n"); FILE *pFile_coordinates = NULL; //erasing file with animation path in path record mode if (fractParam.animMode && !Interface_data.keyframeMode) { if (fractParam.recordMode & !fractParam.continueRecord) { pFile_coordinates = fopen(fractParam.file_path, "w"); fclose(pFile_coordinates); WriteLog("File for coordinates prepared"); } } //auxiliary arrays string filename2; double distance = 0; char label_text[1000]; //Opening file with flight path for animation mode if ((fractParam.playMode || fractParam.continueRecord) && !Interface_data.keyframeMode) { pFile_coordinates = fopen(fractParam.file_path, "r"); WriteLog("File with coordinates opened"); } //checking number of keyframes in keyframe animation mode int maxKeyNumber = 0; if (Interface_data.keyframeMode) { do { filename2=IndexFilename(fractParam.file_keyframes, "fract", maxKeyNumber); maxKeyNumber++; } while (FileIfExists(filename2.c_str())); WriteLog("Keyframes counted"); } else { maxKeyNumber = 1; } maxKeyNumber--; if (Interface_data.keyframeMode) printf("Found %d keyframes\n", maxKeyNumber); //loading keyframes in keyframe animation mode CMorph morphParamRender(maxKeyNumber, sizeof(sParamRenderD) / sizeof(double)); CMorph morphIFS(maxKeyNumber, sizeof(sFractalIFSD) / sizeof(double)); CMorph morphMandelbox(maxKeyNumber, sizeof(sFractalMandelboxD) / sizeof(double)); CMorph morphFractal(maxKeyNumber, sizeof(sFractalD) / sizeof(double)); morphParamRender.SetFramesPerKey(fractParam.framesPerKeyframe); morphIFS.SetFramesPerKey(fractParam.framesPerKeyframe); morphMandelbox.SetFramesPerKey(fractParam.framesPerKeyframe); morphFractal.SetFramesPerKey(fractParam.framesPerKeyframe); if (Interface_data.keyframeMode) { for (int keyNumber = 0; keyNumber < maxKeyNumber; keyNumber++) { filename2=IndexFilename(fractParam.file_keyframes, "fract", keyNumber); sParamRender fractParamLoaded; LoadSettings(filename2.c_str(), fractParamLoaded, true); WriteLogDouble("Keyframe loaded", keyNumber); morphParamRender.AddData(keyNumber, (double*) &fractParamLoaded.doubles); morphIFS.AddData(keyNumber, (double*) &fractParamLoaded.fractal.IFS.doubles); morphMandelbox.AddData(keyNumber, (double*) &fractParamLoaded.fractal.mandelbox.doubles); morphFractal.AddData(keyNumber, (double*) &fractParamLoaded.fractal.doubles); WriteLogDouble("Keyframe data added to data structures", keyNumber); } printf("Keyframes loaded\n"); } bool autoSaveImage = false; if (noGUI) { if(netRender->IsClient()) { autoSaveImage = false; } else { autoSaveImage = true; } } else { autoSaveImage = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAutoSaveImage)); } bool foundLastFrame = false; if (!fractParam.continueRecord) foundLastFrame = true; //głowna pętla renderowania kolejnych klatek animacji int startFrame = 0; int endFrame = 100000; if (Interface_data.keyframeMode || Interface_data.playMode) { startFrame = fractParam.startFrame; endFrame = fractParam.endFrame; if (noGUI && noGUIdata.startFrame > 0) startFrame = noGUIdata.startFrame; if (noGUI && noGUIdata.endFrame < 99999) endFrame = noGUIdata.endFrame; if(endFrame > maxKeyNumber * fractParam.framesPerKeyframe && Interface_data.keyframeMode) endFrame = maxKeyNumber * fractParam.framesPerKeyframe; } //rewinding coordinates file to the first startFame if (fractParam.playMode) { for (int i = 0; i < startFrame; i++) { int n; n = fscanf(pFile_coordinates, "%lf %lf %lf %lf %lf %lf", &fractParam.doubles.vp.x, &fractParam.doubles.vp.y, &fractParam.doubles.vp.z, &fractParam.doubles.alpha, &fractParam.doubles.beta, &fractParam.doubles.gamma); if (n <= 0) { fclose(pFile_coordinates); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; return; } } } cImage *secondEyeImage = 0; unsigned char *stereoImage = 0; if (fractParam.stereoEnabled) { autoSaveImage = true; secondEyeImage = new cImage(width, height); secondEyeImage->CreatePreview(Interface_data.imageScale); secondEyeImage->SetImageParameters(fractParam.doubles.imageAdjustments, fractParam.imageSwitches); stereoImage = new unsigned char[width * height * 3 * 2]; } CVector3 last_vp_position = fractParam.doubles.vp; int tiles = fractParam.noOfTiles; start_time = real_clock(); printf("************ Rendering frames *************\n"); WriteLog("************ Rendering frames *************"); for (int index = startFrame; index < endFrame; index++) { WriteLogDouble("Started rendering frame", index); //printf("file index %d\n", index); //animation with recorded flight path double speed = 0.02; if(!netRender->IsClient()) { fractParam.fractal.frameNo = index; } if (fractParam.animMode && !Interface_data.keyframeMode) { sprintf(label_text, "Frame: %d", index); if (!noGUI) { gtk_label_set_text(GTK_LABEL(Interface.label_animationFrame), label_text); } //calculating of mouse pointer position int deltaXm, deltaYm; deltaXm = x_mouse - width * mainImage.GetPreviewScale() / 2; deltaYm = y_mouse - height * mainImage.GetPreviewScale() / 2; if (fractParam.recordMode) { /* fractParam.doubles.alpha -= 0.0003 * delta_xm; fractParam.doubles.beta += 0.0003 * delta_ym; */ double rotation_step = 0.000001; double deltaXm2 = deltaXm * deltaXm * (deltaXm > 0.0 ? 1.0 : -1.0); double deltaYm2 = deltaYm * deltaYm * (deltaYm > 0.0 ? 1.0 : -1.0); fractParam.doubles.gamma -= deltaXm * rotation_step * 300.0; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkStraightRotation))) { fractParam.doubles.alpha -= deltaXm2 * rotation_step; fractParam.doubles.beta += deltaYm2 * rotation_step; fractParam.doubles.gamma = 0.0f; } else { CRotationMatrix mRot; mRot.RotateZ(fractParam.doubles.alpha); mRot.RotateX(fractParam.doubles.beta); mRot.RotateY(fractParam.doubles.gamma); mRot.RotateX(-deltaYm2 * rotation_step); mRot.RotateZ(-deltaXm2 * rotation_step); fractParam.doubles.alpha = -mRot.GetAlfa(); fractParam.doubles.beta = -mRot.GetBeta(); fractParam.doubles.gamma = -mRot.GetGamma(); } } //calculation of distance to fractal surface distance = CalculateDistance(fractParam.doubles.vp, fractParam.fractal); WriteLogDouble("Distance calculated", distance); sprintf(label_text, "Estimated distance to fractal surface: %g", distance); if (!noGUI) { gtk_label_set_text(GTK_LABEL(Interface.label_animationDistance), label_text); speed = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_animationDESpeed))); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorAbsoluteDistance))) { sprintf(label_text, "Flight speed: %g", speed); } else { sprintf(label_text, "Flight speed: %g", distance * speed); } gtk_label_set_text(GTK_LABEL(Interface.label_animationSpeed), label_text); } if (distance > 5.0) distance = 5.0; //auto-calculate of zoom value fractParam.doubles.zoom = 1e-15; //path record mode if (fractParam.recordMode && foundLastFrame) { //calculation of step direction vector CVector3 delta; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorAbsoluteDistance))) { delta.x = -sin(fractParam.doubles.alpha) * cos(fractParam.doubles.beta) * speed; delta.y = cos(fractParam.doubles.alpha) * cos(fractParam.doubles.beta) * speed; delta.z = sin(fractParam.doubles.beta) * speed; } else { delta.x = -sin(fractParam.doubles.alpha) * cos(fractParam.doubles.beta) * distance * speed; delta.y = cos(fractParam.doubles.alpha) * cos(fractParam.doubles.beta) * distance * speed; delta.z = sin(fractParam.doubles.beta) * distance * speed; } //step fractParam.doubles.vp += delta; //saving coordinates to file FILE *pFile_coordinates2 = fopen(fractParam.file_path, "a"); fprintf(pFile_coordinates2, "%.11f %.11f %.11f %f %f %f\n", fractParam.doubles.vp.x, fractParam.doubles.vp.y, fractParam.doubles.vp.z, fractParam.doubles.alpha, fractParam.doubles.beta, fractParam.doubles.gamma); fclose(pFile_coordinates2); WriteLog("Coordinates saved"); } //path play mode if (fractParam.playMode || (fractParam.continueRecord && !foundLastFrame)) { //loading coordinates int n; n = fscanf(pFile_coordinates, "%lf %lf %lf %lf %lf %lf", &fractParam.doubles.vp.x, &fractParam.doubles.vp.y, &fractParam.doubles.vp.z, &fractParam.doubles.alpha, &fractParam.doubles.beta, &fractParam.doubles.gamma); if (n <= 0) { foundLastFrame = true; break; } WriteLog("Coordinates loaded"); } } //Catmull-Rom interpolation in keyframe animation mode if (fractParam.animMode && Interface_data.keyframeMode) { morphParamRender.CatmullRom(index, (double*) &fractParam.doubles); morphIFS.CatmullRom(index, (double*) &fractParam.fractal.IFS.doubles); morphMandelbox.CatmullRom(index, (double*) &fractParam.fractal.mandelbox.doubles); morphFractal.CatmullRom(index, (double*) &fractParam.fractal.doubles); WriteLog("Splines calculated"); if (fractParam.doubles.zoom < 1e-15) fractParam.doubles.zoom = 1e-15; fractParam.doubles.resolution = 1.0 / fractParam.image_width; sImageAdjustments imageAdjustments = fractParam.doubles.imageAdjustments; mainImage.SetImageParameters(imageAdjustments, fractParam.imageSwitches); sprintf(label_text, "Frame: %d, Keyframe %f", index, (double) index / fractParam.framesPerKeyframe); if (!noGUI) gtk_label_set_text(GTK_LABEL(Interface.label_keyframeInfo), label_text); WriteLog("Calculated additional data for splines"); } RecalculateIFSParams(fractParam.fractal); WriteLog("IFS params recalculated"); CreateFormulaSequence(fractParam.fractal); WriteLog("Formula sequence created"); PlaceRandomLights(&fractParam, true); if (!noGUI) { if (fractParam.animMode) WriteInterface(&fractParam); else WriteInterface(&fractParam); WriteLog("GUI data refreshed"); } bool tilesDone = false; if(netRender->IsClient()) tiles = 1; for (int tile = 0; tile < tiles*tiles; tile++) { int index2 = index * tiles * tiles + tile; if(!netRender->IsClient()) fractParam.tileCount = tile; if(tiles > 1) { printf("---------- Tile: %d -------------\n", index2); } if (Interface_data.imageFormat == imgFormatJPG && tiles == 1) { filename2 = IndexFilename(fractParam.file_destination, "jpg", index2); } else if(tiles == 1) { filename2 = IndexFilename(fractParam.file_destination, "png", index2); } else { filename2 = IndexFilename(fractParam.file_destination, "tile", index2); } FILE *testFile; testFile = fopen(filename2.c_str(), "r"); if ((testFile != NULL && !fractParam.recordMode && (autoSaveImage || fractParam.animMode || tiles > 1)) || (!foundLastFrame && fractParam.continueRecord)) { if (!fractParam.animMode) { printf("Output file (%s) exists. Skip to next file index\n", filename2.c_str()); } } else { //renderowanie fraktala //if ((index % frame_step == 0) || record_mode) if (fractParam.animMode) { distance = CalculateDistance(fractParam.doubles.vp, fractParam.fractal); printf("---------- index: %d -------------\n", index); printf("Distance = %e\n", distance); printf("alpha = %f, beta = %f\n", fractParam.doubles.alpha, fractParam.doubles.beta); printf("x = %.8f, y = %.8f, z = %.8f\n", fractParam.doubles.vp.x, fractParam.doubles.vp.y, fractParam.doubles.vp.z); if (!noGUI) { char distanceString[1000]; CVector3 delta_vp = fractParam.doubles.vp - last_vp_position; double actual_speed = delta_vp.Length(); sprintf(distanceString, "Estimated viewpoint distance to the surface: %g, actual speed: %g", distance, actual_speed); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } } CVector3 eyeLeft, eyeRight; int numberOfEyes = 1; if (fractParam.stereoEnabled) { CRotationMatrix mRotForEyes; mRotForEyes.RotateZ(fractParam.doubles.alpha); mRotForEyes.RotateX(fractParam.doubles.beta); mRotForEyes.RotateY(fractParam.doubles.gamma); CVector3 baseVectorForEyes(0.5 * fractParam.doubles.stereoEyeDistance, 0, 0); eyeLeft = fractParam.doubles.vp - mRotForEyes.RotateVector(baseVectorForEyes); eyeRight = fractParam.doubles.vp + mRotForEyes.RotateVector(baseVectorForEyes); numberOfEyes = 2; } //if number of eyes = 2 (stereo) then render two times for (int eye = 0; eye < numberOfEyes; eye++) { if (fractParam.stereoEnabled) { if (eye == 0) { fractParam.doubles.vp = eyeLeft; } else if (eye == 1) { fractParam.doubles.vp = eyeRight; } } Interface_data.disableInitRefresh = false; if (eye == 0) { mainImage.ClearImage(); WriteLog("Image cleared"); Render(fractParam, &mainImage, renderWindow.drawingArea); WriteLog("Image rendered"); } else if (eye == 1) { secondEyeImage->ClearImage(); WriteLog("Image cleared"); Render(fractParam, secondEyeImage, renderWindow.drawingArea); WriteLog("Image rendered"); MakeStereoImage(&mainImage, secondEyeImage, stereoImage); WriteLog("Stereo image made"); if (!noGUI) StereoPreview(&mainImage, stereoImage); filename2 = IndexFilename(fractParam.file_destination, "jpg", index); SaveJPEG(filename2.c_str(), 95, width * 2, height, (JSAMPLE*) stereoImage); WriteLog("Stereo image saved"); if (!noGUI) { char progressText[1000]; sprintf(progressText, "Stereoscopic image was saved to: %s", filename2.c_str()); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); StereoPreview(&mainImage, stereoImage); } } //save image if ((autoSaveImage || fractParam.animMode || tiles > 1) && !fractParam.stereoEnabled && !programClosed) { if(tiles>1) { FILE * binFile; filename2 = IndexFilename(fractParam.file_destination, "tile", index2); binFile = fopen(filename2.c_str(), "wb"); fwrite(mainImage.GetImage16Ptr(), 1, sizeof(sRGB16)*width*height, binFile); fclose(binFile); } else { unsigned char *rgbbuf2 = mainImage.ConvertTo8bit(); if (Interface_data.imageFormat == imgFormatJPG) { filename2 = IndexFilename(fractParam.file_destination, "jpg", index2); SaveJPEG(filename2.c_str(), 95, width, height, (JSAMPLE*) rgbbuf2); } else if (Interface_data.imageFormat == imgFormatPNG) { filename2 = IndexFilename(fractParam.file_destination, "png", index2); SavePNG(filename2.c_str(), 100, width, height, (png_byte*) rgbbuf2); } else if (Interface_data.imageFormat == imgFormatPNG16) { filename2 = IndexFilename(fractParam.file_destination, "png", index2); SavePNG16(filename2.c_str(), 100, width, height, mainImage.GetImage16Ptr()); } else if (Interface_data.imageFormat == imgFormatPNG16Alpha) { filename2 = IndexFilename(fractParam.file_destination, "png", index2); SavePNG16Alpha(filename2.c_str(), 100, width, height, &mainImage); } } printf("Image saved: %s\n", filename2.c_str()); WriteLog("Image saved"); WriteLog(filename2.c_str()); } } //terminate animation loop when not animation mode if (!fractParam.animMode && tile >= tiles*tiles-1) { index = 9999999; } } last_vp_position = fractParam.doubles.vp; if (testFile != NULL) { fclose(testFile); } if (programClosed) break; if(tile == tiles * tiles -1) tilesDone = true; } if(tiles > 1 && tilesDone) { SaveFromTilesPNG16(fractParam.file_destination, width, height, tiles); } if (programClosed) break; } if (fractParam.playMode && !Interface_data.keyframeMode) fclose(pFile_coordinates); delete fractParam.backgroundTexture; WriteLog("Released memory for background texture"); delete fractParam.envmapTexture; WriteLog("Released memory for envmap texture"); delete fractParam.lightmapTexture; WriteLog("Released memory for lightmap texture"); if (fractParam.stereoEnabled) { delete secondEyeImage; delete[] stereoImage; WriteLog("Released memory for stereo image"); } printf("Rendering finished\n"); WriteLog("Rendering completely finished"); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; isRendering = false; } void ThumbnailRender(const char *settingsFile, cImage *miniImage, int mode) { printf("Rendering keyframe preview: %s\n", settingsFile); if (FileIfExists(settingsFile)) { sParamRender fractParamLoaded; LoadSettings(settingsFile, fractParamLoaded, true); if (mode == 1) { KeepOtherSettings(&fractParamLoaded); } ThumbnailRender2(fractParamLoaded, miniImage); } } void ThumbnailRender2(sParamRender fractParamLoaded, cImage *miniImage) { fractParamLoaded.image_width = miniImage->GetWidth(); fractParamLoaded.image_height = miniImage->GetHeight(); fractParamLoaded.doubles.resolution = 0.5 / fractParamLoaded.image_width; if (fractParamLoaded.fractal.formula == trig_DE || fractParamLoaded.fractal.formula == trig_optim || fractParamLoaded.fractal.formula == menger_sponge || fractParamLoaded.fractal.formula == kaleidoscopic || fractParamLoaded.fractal.formula == tglad || fractParamLoaded.fractal.formula == smoothMandelbox) fractParamLoaded.fractal.analitycDE = true; else fractParamLoaded.fractal.analitycDE = false; fractParamLoaded.recordMode = false; fractParamLoaded.animMode = false; fractParamLoaded.quiet = true; fractParamLoaded.tileCount = 0; fractParamLoaded.noOfTiles = 1; RecalculateIFSParams(fractParamLoaded.fractal); CreateFormulaSequence(fractParamLoaded.fractal); miniImage->ClearImage(); miniImage->SetImageParameters(fractParamLoaded.doubles.imageAdjustments, fractParamLoaded.imageSwitches); memcpy(Interface_data.palette, fractParamLoaded.palette, sizeof(sRGB)*256); LoadTextures(&fractParamLoaded); programClosed = false; isPostRendering = false; PlaceRandomLights(&fractParamLoaded, false); Render(fractParamLoaded, miniImage, NULL); delete fractParamLoaded.backgroundTexture; WriteLog("Released memory for background texture"); delete fractParamLoaded.envmapTexture; WriteLog("Released memory for envmap texture"); delete fractParamLoaded.lightmapTexture; WriteLog("Released memory for lightmap texture"); } mandelbulber1.21-1.orig/src/primitives.cpp0000644000175000017500000000776512274512437021561 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions for calculating shapes of primitive objects / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include "primitives.h" #include double PrimitivePlane(CVector3 point, CVector3 centre, CVector3 normal) { CVector3 plane = normal; plane.Normalize(); double planeDistance = plane.Dot(point - centre); return planeDistance; } double PrimitiveInvertedBox(CVector3 point, CVector3 center, CVector3 size) { double distance, planeDistance; CVector3 corner1(center.x - 0.5*size.x, center.y - 0.5*size.y, center.z - 0.5*size.z); CVector3 corner2(center.x + 0.5*size.x, center.y + 0.5*size.y, center.z + 0.5*size.z); planeDistance = PrimitivePlane(point, corner1, CVector3(1,0,0)); distance = planeDistance; planeDistance = PrimitivePlane(point, corner2, CVector3(-1,0,0)); distance = (planeDistance < distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner1, CVector3(0,1,0)); distance = (planeDistance < distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner2, CVector3(0,-1,0)); distance = (planeDistance < distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner1, CVector3(0,0,1)); distance = (planeDistance < distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner2, CVector3(0,0,-1)); distance = (planeDistance < distance) ? planeDistance : distance; return distance; } double PrimitiveBox(CVector3 point, CVector3 center, CVector3 size) { double distance, planeDistance; CVector3 corner1(center.x - 0.5*size.x, center.y - 0.5*size.y, center.z - 0.5*size.z); CVector3 corner2(center.x + 0.5*size.x, center.y + 0.5*size.y, center.z + 0.5*size.z); planeDistance = PrimitivePlane(point, corner1, CVector3(-1,0,0)); distance = planeDistance; planeDistance = PrimitivePlane(point, corner2, CVector3(1,0,0)); distance = (planeDistance > distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner1, CVector3(0,-1,0)); distance = (planeDistance > distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner2, CVector3(0,1,0)); distance = (planeDistance > distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner1, CVector3(0,0,-1)); distance = (planeDistance > distance) ? planeDistance : distance; planeDistance = PrimitivePlane(point, corner2, CVector3(0,0,1)); distance = (planeDistance > distance) ? planeDistance : distance; return distance; } double PrimitiveSphere(CVector3 point, CVector3 center, double radius) { double distance = (point - center).Length() - radius; return distance; } double PrimitiveInvertedSphere(CVector3 point, CVector3 center, double radius) { double distance = radius - (point - center).Length(); return distance; } double PrimitiveWater(CVector3 point, double height, double amplitude, double length, double rotation, int iterations, double animSpeed, int frame) { CVector3 plane(0,0,-1); CVector3 centre(0,0,height); plane.Normalize(); double planeDistance = plane.Dot(point - centre); if(planeDistance < amplitude * 10.0) { CRotationMatrix rotMatrix; rotMatrix.RotateZ(rotation/180*M_PI); point = rotMatrix.RotateVector(point); double phase = animSpeed * frame; double k=0.23; double waveXtemp = point.x; double waveYtemp = point.y; double waveX = 0; double waveY = 0; double p = 1.0; double p2 = 0.05; for(int i=1; i<=iterations; i++) { float p3 = p * p2; double shift = phase / (i/3.0 + 1.0); waveXtemp = sin(i + 0.4*(waveX)*p3 + sin(k* point.y / length*p3) + point.x/length*p3 + shift)/p; waveYtemp = cos(i + 0.4*(waveY)*p3 + sin(point.x / length*p3) + k*point.y/length*p3 + shift*0.23)/p; waveX+=waveXtemp; waveY+=waveYtemp; p2 = p2 + (1.0 - p2) * 0.7; p *= 1.872; } planeDistance += (waveX + waveY) * amplitude; } return planeDistance; } mandelbulber1.21-1.orig/src/fractal.h0000644000175000017500000001354312274512437020436 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / definition of structures for fractal parameters / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef FRACTAL_H_ #define FRACTAL_H_ #include #include "common_math.h" #include "fractparams.h" #include #include const int IFS_VECTOR_COUNT = 9; const int HYBRID_COUNT = 5; const int MANDELBOX_FOLDS = 2; enum enumFractalFormula { none = 0, trig_DE = 1, trig_optim = 2, fast_trig = 3, hypercomplex = 4, quaternion = 5, minus_fast_trig = 6, menger_sponge = 7, tglad = 8, kaleidoscopic = 10, xenodreambuie = 11, hybrid = 12, mandelbulb2 = 13, mandelbulb3 = 14, mandelbulb4 = 15, foldingIntPow2 = 16, smoothMandelbox = 17, mandelboxVaryScale4D = 18, aexion = 19, benesi = 20, bristorbrot = 21, invertX = 22, invertY = 23, invertZ = 24, invertR = 25, sphericalFold = 26, powXYZ = 27, scaleX = 28, scaleY = 29, scaleZ = 30, offsetX = 31, offsetY = 32, offsetZ = 33, angleMultiplyX = 34, angleMultiplyY = 35, angleMultiplyZ = 36, generalizedFoldBox = 37, ocl_custom = 38 }; enum enumCalculationMode { normal = 0, colouring = 1, fake_AO = 2, deltaDE1 = 3, deltaDE2 = 4, orbitTrap = 5 }; enum enumGeneralizedFoldBoxType { foldTet = 0, foldCube = 1, foldOct = 2, foldDodeca = 3, foldOctCube = 4, foldIcosa = 5, foldBox6 = 6, foldBox5 = 7 }; enum enumObjectType { objFractal = 0, objPlane = 1, objWater = 2, objSphere = 3, objSphereInv = 4, objBox = 5, objBoxInv = 6 }; enum enumOCLDEMode { calculated = 0, deltaDE = 1, noDE = 2 }; struct sFractalIFSD { double rotationGamma; double rotationAlfa; double rotationBeta; double scale; double distance[IFS_VECTOR_COUNT]; double alfa[IFS_VECTOR_COUNT]; double beta[IFS_VECTOR_COUNT]; double gamma[IFS_VECTOR_COUNT]; double intensity[IFS_VECTOR_COUNT]; CVector3 offset; CVector3 direction[IFS_VECTOR_COUNT]; CVector3 edge; }; struct sFractalGeneralizedFoldBox { enum enumGeneralizedFoldBoxType type; CVector3 Nv_tet[4]; CVector3 Nv_cube[6]; CVector3 Nv_oct[8]; CVector3 Nv_oct_cube[14]; CVector3 Nv_dodeca[12]; CVector3 Nv_icosa[20]; CVector3 Nv_box6[8]; CVector3 Nv_box5[7]; int sides_tet; int sides_cube; int sides_oct; int sides_oct_cube; int sides_dodeca; int sides_icosa; int sides_box6; int sides_box5; }; struct sFractalIFS { sFractalIFSD doubles; bool absX, absY, absZ; bool foldingMode; // Kaleidoscopic IFS folding mode bool enabled[IFS_VECTOR_COUNT]; bool mengerSpongeMode; int foldingCount; CRotationMatrix mainRot; CRotationMatrix rot[IFS_VECTOR_COUNT]; }; struct sFractalMandelboxVary4D { double fold; double minR; double scaleVary; double wadd; double rPower; }; struct sFractalMandelboxD { double rotationMain[3]; double rotation[MANDELBOX_FOLDS][3][3]; double colorFactorX; double colorFactorY; double colorFactorZ; double colorFactorR; double colorFactorSp1; double colorFactorSp2; double scale; double foldingLimit; double foldingValue; double foldingSphericalMin; double foldingSphericalFixed; double sharpness; double solid; double melt; CVector3 offset; sFractalMandelboxVary4D vary4D; }; struct sFractalMandelbox { sFractalMandelboxD doubles; bool rotationsEnabled; CRotationMatrix mainRot; CRotationMatrix rot[MANDELBOX_FOLDS][3]; CRotationMatrix rotinv[MANDELBOX_FOLDS][3]; }; struct sFractalPrimitivesD { CVector3 planeCentre; CVector3 planeNormal; CVector3 boxCentre; CVector3 boxSize; CVector3 invertedBoxCentre; CVector3 invertedBoxSize; CVector3 sphereCentre; double sphereRadius; CVector3 invertedSphereCentre; double invertedSphereRadius; double waterHeight; double waterAmplitude; double waterLength; double waterRotation; double waterAnimSpeed; }; struct sFractalPrimitives { bool planeEnable; bool boxEnable; bool invertedBoxEnable; bool sphereEnable; bool invertedSphereEnable; bool waterEnable; bool onlyPlane; int waterIterations; }; struct sFractalD { double N; double amin; //fractal limits double amax; double bmin; double bmax; double cmin; double cmax; double constantFactor; double FoldingIntPowZfactor; double FoldingIntPowFoldFactor; double foldingLimit; //paramters of TGlad's folding double foldingValue; double foldingSphericalMin; double foldingSphericalFixed; double detailSize; double power; //power of fractal formula double cadd; double hybridPower[HYBRID_COUNT]; #ifdef CLSUPPORT double customParameters[15]; double deltaDEStep; #endif CVector3 julia; // Julia constant CVector3 fakeLightsOrbitTrap; sFractalPrimitivesD primitives; }; struct sFractal { sFractalD doubles; // maximum number of iterations int minN; // minimum number of iterations bool limits_enabled; // enable limits (intersections) bool iterThresh; //maxiter threshold mode bool analitycDE; //analytic DE mode bool juliaMode; // Julia mode bool tgladFoldingMode; // Tglad's folding mode bool sphericalFoldingMode; // spherical folding mode bool interiorMode; bool hybridCyclic; bool linearDEmode; bool constantDEThreshold; bool useCustomOCLFormula; bool normalCalculationMode; enumFractalFormula formula; int hybridIters[HYBRID_COUNT]; enumFractalFormula hybridFormula[HYBRID_COUNT]; std::vector formulaSequence; std::vector hybridPowerSequence; char customOCLFormulaName[100]; enumOCLDEMode customOCLFormulaDEMode; sFractalIFS IFS; sFractalMandelbox mandelbox; sFractalGeneralizedFoldBox genFoldBox; sFractalPrimitives primitives; int frameNo; int itersOut; enumObjectType objectOut; int fakeLightsMinIter; int fakeLightsMaxIter; }; template double Compute(CVector3 z, const sFractal &par, int *iter_count = NULL); double CalculateDistance(CVector3 point, sFractal &par, bool *max_iter = NULL); #endif /* FRACTAL_H_ */ mandelbulber1.21-1.orig/src/gdkconfig.h0000644000175000017500000000005512274512437020747 0ustar krzysztofkrzysztof#ifdef __sgi #define GDK_WINDOWING_X11 #endifmandelbulber1.21-1.orig/src/image.cpp0000644000175000017500000004174212274512437020441 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions for image post-processing / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include "image.h" #include "Render3D.h" #include "interface.h" #include "shaders.h" sRGB *buddhabrotImg; bool isBuddhabrot = false; double buddhabrotAutoBright = 1.0; guint64 histogram[256]; unsigned int histogram2[1000]; //******************* Nowa paleta kolorow **************** void NewPalette(sRGB *p, double saturation) { int R, G, B, Y; for (int i = 0; i < 255; i++) { Y = (Random(255) - 128) / (1.0 + saturation); p[i].R = R = Y + 128 + (Random(255) - 128) * saturation; p[i].G = G = Y + 128 + (Random(255) - 128) * saturation; p[i].B = B = Y + 128 + (Random(255) - 128) * saturation; if (R < 0) p[i].R = 0; if (G < 0) p[i].G = 0; if (B < 0) p[i].B = 0; if (R > 255) p[i].R = 255; if (G > 255) p[i].G = 255; if (B > 255) p[i].B = 255; } p[255].R = 255; p[255].G = 255; p[255].B = 255; p[254].R = 0; p[254].G = 0; p[254].B = 0; p[253].R = 0; p[253].G = 20; p[253].B = 40; } void PostRendering_DOF(cImage *image, double deep, double neutral) { isPostRendering = true; int width = image->GetWidth(); int height = image->GetHeight(); sRGB16 *temp_image = new sRGB16[width * height]; unsigned short *temp_alpha = new unsigned short[width * height]; sSortZ *temp_sort = new sSortZ[width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int ptr = x + y * width; temp_image[ptr] = image->GetPixelImage16(x, y); temp_alpha[ptr] = image->GetPixelAlpha(x, y); temp_sort[ptr].z = image->GetPixelZBuffer(x, y); temp_sort[ptr].i = ptr; } } if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect. Sorting zBuffer"); while (gtk_events_pending()) gtk_main_iteration(); } QuickSortZBuffer(temp_sort, 1, height * width - 1); if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect. Randomizing zBuffer"); while (gtk_events_pending()) gtk_main_iteration(); } //Randomize Z-buffer int imgSize = height*width; for(int i=imgSize-1; i>=0; i--) { sSortZ temp; temp = temp_sort[i]; double z1 = temp.z; double size1 = (z1 - neutral) / z1 * deep; int randomStep = i; bool done = false; int ii; do { ii = i - Random(randomStep); if (ii <= 0) ii = 0; sSortZ temp2 = temp_sort[ii]; double z2 = temp2.z; double size2 = (z2 - neutral) / z2 * deep; if(size1 == 0 && size2 ==0) done = true; if (size1 * size2 > 0) { double sizeCompare; if (size1 > 0) { sizeCompare = size2 / size1; } else { sizeCompare = size1 / size2; } if (sizeCompare > 0.7) { done = true; } else { done = false; } } else { done = false; } randomStep = randomStep * 0.7 - 1; if(randomStep <= 0) done = true; } while(!done); temp_sort[i] = temp_sort[ii]; temp_sort[ii] = temp; } if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect. Done 0%"); while (gtk_events_pending()) gtk_main_iteration(); } double last_time = real_clock(); int refreshCount = 0; for (int i = 0; i < height * width; i++) { int ii = temp_sort[height * width - i - 1].i; int x = ii % width; int y = ii / width; double z = image->GetPixelZBuffer(x, y); double blur = fabs((double) z - neutral) / z * deep; if (blur > 100) blur = 100.0; int size = blur; sRGB16 center = temp_image[x + y * width]; unsigned short center_alpha = temp_alpha[x + y * width]; double factor = blur * blur * sqrt(blur)* M_PI/3.0; for (int yy = y - size; yy <= y + size; yy++) { for (int xx = x - size; xx <= x + size; xx++) { if (xx >= 0 && xx < width && yy >= 0 && yy < height) { int dx = xx - x; int dy = yy - y; double r = sqrt((float)dx * dx + dy * dy); double op = (blur - r) / factor; if (op > 1.0) op = 1.0; if (op < 0.0) op = 0.0; if (op > 0.0) { double opN = 1.0 - op; sRGB16 old = image->GetPixelImage16(xx, yy); unsigned short old_alpha = image->GetPixelAlpha(xx, yy); sRGB16 pixel; pixel.R = old.R * opN + center.R * op; pixel.G = old.G * opN + center.G * op; pixel.B = old.B * opN + center.B * op; unsigned short alpha = old_alpha * opN + center_alpha * op; image->PutPixelImage16(xx, yy, pixel); image->PutPixelAlpha(xx, yy, alpha); } } } } double time = real_clock(); if (time - last_time > 0.1 && !noGUI && image->IsPreview()) { char progressText[1000]; last_time = real_clock(); double percent_done = (double) i / (height * width) * 100.0; sprintf(progressText, "Rendering Depth Of Field effect. Done %.2f%%", percent_done); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); if(refreshCount > 600) { //image->CompileImage(); image->ConvertTo8bit(); image->UpdatePreview(); image->RedrawInWidget(renderWindow.drawingArea); refreshCount = 0; } refreshCount++; while (gtk_events_pending()) gtk_main_iteration(); } if (i % 1000 == 0) { double percentDone = (double)i/(width*height)*100.0; printf("Rendering Depth Of Field efect. Done %.2f%% \r", percentDone); fflush(stdout); } if (!isPostRendering) break; } if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect. Done 100%"); while (gtk_events_pending()) gtk_main_iteration(); } printf("Rendering Depth Of Field efect. Done 100%% \n"); isPostRendering = false; delete[] temp_image; delete[] temp_alpha; delete[] temp_sort; } void ThreadSSAO(void *ptr) { sSSAOparams *param; param = (sSSAOparams*) ptr; int quality = param->quality; double persp = param->persp; int threadNo = param->threadNo; cImage *image = param->image; int width = image->GetWidth(); int height = image->GetHeight(); int progressive = param->progressive; bool quiet = param->quiet; double *cosinus = new double[quality]; double *sinus = new double[quality]; for (int i = 0; i < quality; i++) { sinus[i] = sin((double) i / quality * 2.0 * M_PI); cosinus[i] = cos((double) i / quality * 2.0 * M_PI); } double scale_factor = (double) width / (quality * quality) / 2.0; double aspectRatio = (double) width / height; enumPerspectiveType perspectiveType = param->perspectiveType; double fov = param->persp; sImageAdjustments *imageAdjustments = image->GetImageAdjustments(); double intensity = imageAdjustments->globalIlum; for (int y = threadNo * progressive; y < height; y += NR_THREADS * progressive) { for (int x = 0; x < width; x += progressive) { double z = image->GetPixelZBuffer(x, y); unsigned short opacity16 = image->GetPixelOpacity(x, y); double opacity = opacity16 / 65535.0; double total_ambient = 0; if (z < 1e19) { //printf("SSAO point on object\n"); double x2, y2; if (perspectiveType == fishEye) { x2 = M_PI * ((double) x / width - 0.5) * aspectRatio; y2 = M_PI * ((double) y / height - 0.5); double r = sqrt(x2 * x2 + y2 * y2); if(r != 0.0) { x2 = x2 / r * sin(r * fov) * z; y2 = y2 / r * sin(r * fov) * z; } } else if(perspectiveType == equirectangular) { x2 = M_PI * ((double) x / width - 0.5) * aspectRatio; //--------- do sprawdzenia y2 = M_PI * ((double) y / height - 0.5); x2 = sin(fov * x2) * cos(fov * y2) * z; y2 = sin(fov * y2) * z; } else { x2 = ((double) x / width - 0.5) * aspectRatio; y2 = ((double) y / height - 0.5); x2 = x2 * z * persp; y2 = y2 * z * persp; } double ambient = 0; for (int angle = 0; angle < quality; angle++) { double ca = cosinus[angle]; double sa = sinus[angle]; double max_diff = -1e50; for (double r = 1.0; r < quality; r += 1.0) { double rr = r * r * scale_factor; double xx = x + rr * ca; double yy = y + rr * sa; if ((int) xx == (int) x && (int) yy == (int) y) continue; if (xx < 0 || xx > width - 1 || yy < 0 || yy > height - 1) continue; double z2 = image->GetPixelZBuffer(xx, yy); double xx2, yy2; if (perspectiveType == fishEye) { xx2 = M_PI * ((double) xx / width - 0.5) * aspectRatio; yy2 = M_PI * ((double) yy / height - 0.5); double r2 = sqrt(xx2 * xx2 + yy2 * yy2); if(r != 0.0) { xx2 = xx2 / r2 * sin(r2 * fov) * z2; yy2 = yy2 / r2 * sin(r2 * fov) * z2; } } else if (perspectiveType == equirectangular) { xx2 = M_PI * (xx / width - 0.5) * aspectRatio; //--------- do sprawdzenia yy2 = M_PI * (yy / height - 0.5); xx2 = sin(fov * xx2) * cos(fov * yy2) * z2; yy2 = sin(fov * yy2) * z2; } else { xx2 = (xx / width - 0.5) * aspectRatio; yy2 = (yy / height - 0.5); xx2 = xx2 * (z2 * persp); yy2 = yy2 * (z2 * persp); } double dx = xx2 - x2; double dy = yy2 - y2; double dz = z2 - z; double dr = sqrt(dx * dx + dy * dy); double diff = -dz / dr; if (diff > max_diff) max_diff = diff; } double max_angle = atan(max_diff); ambient += -max_angle / M_PI + 0.5; } total_ambient = ambient / quality; if (total_ambient < 0) total_ambient = 0; } sRGB8 colour = image->GetPixelColor(x, y); sRGB16 pixel = image->GetPixelImage16(x, y); double R = pixel.R + 65535.0 * colour.R / 256.0 * total_ambient * intensity * (1.0 - opacity); double G = pixel.G + 65535.0 * colour.G / 256.0 * total_ambient * intensity * (1.0 - opacity); double B = pixel.B + 65535.0 * colour.B / 256.0 * total_ambient * intensity * (1.0 - opacity); if (R > 65535) R = 65535; if (G > 65535) G = 65535; if (B > 65535) B = 65535; for(int sqY =0; sqYPutPixelImage16(x + sqX, y + sqY, pixel); } } } double percentDone = (double) y / height * 100.0; if(!quiet) printf("Rendering Screen Space Ambient Occlusion. Done %.2f%% \r", percentDone); fflush(stdout); param->done++; if (!isPostRendering) break; } delete[] sinus; delete[] cosinus; } void PostRendering_SSAO(cImage *image, double persp, int quality, enumPerspectiveType perspectiveType, bool quiet) { isPostRendering = true; int height = image->GetHeight(); if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Screen Space Ambient Occlusion"); while (gtk_events_pending()) gtk_main_iteration(); } GThread **Thread = new GThread *[NR_THREADS]; GError **err = new GError *[NR_THREADS]; sSSAOparams *thread_param = new sSSAOparams[NR_THREADS]; for (int i = 0; i < NR_THREADS; i++) { err[i] = NULL; } int progressive = image->progressiveFactor; //progressive = 1; for (int i = 0; i < NR_THREADS; i++) { //sending some parameters to thread thread_param[i].threadNo = i; thread_param[i].image = image; thread_param[i].persp = persp; thread_param[i].perspectiveType = perspectiveType; thread_param[i].quality = quality * sqrt(1.0 / progressive); thread_param[i].done = 0; thread_param[i].progressive = progressive; thread_param[i].quiet = quiet; //creating thread Thread[i] = g_thread_create((GThreadFunc) ThreadSSAO, &thread_param[i], TRUE, &err[i]); } double last_time = (double) clock() / CLOCKS_PER_SEC; int total_done; if (!noGUI) { do { total_done = 0; for (int i = 0; i < NR_THREADS; i++) { total_done += thread_param[i].done; } double time = (double) clock() / CLOCKS_PER_SEC; if (time - last_time > 0.5) { char progressText[1000]; last_time = (double) clock() / CLOCKS_PER_SEC; double percent_done = (double) total_done / height * 100.0; sprintf(progressText, "Rendering Screen Space Ambient Occlusion. Done %.1f%%", percent_done); if(image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); while (gtk_events_pending()) gtk_main_iteration(); } } } while (total_done < height / progressive && isPostRendering); if(image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Screen Space Ambient Occlusion. Done 100%"); while (gtk_events_pending()) gtk_main_iteration(); } } for (int i = 0; i < NR_THREADS; i++) { g_thread_join(Thread[i]); //printf("Rendering thread #%d finished\n", i + 1); } printf("Rendering Screen Space Ambient Occlusion. Done 100%% \n"); isPostRendering = false; delete[] Thread; delete[] err; delete[] thread_param; } void DrawHistogram(void) { GdkGC *GC = gdk_gc_new(darea2->window); GdkColor color_black = { 0, 0, 0, 0 }; gdk_gc_set_rgb_fg_color(GC, &color_black); gdk_draw_rectangle(darea2->window, GC, true, 0, 0, 256, 128); GdkColor color_red = { 0, 65535, 0, 0 }; gdk_gc_set_rgb_fg_color(GC, &color_red); guint64 max = 0; for (int i = 0; i < 64; i++) { if (histogram[i] > max) max = histogram[i]; } for (int i = 0; i < 64; i++) { int height = 127.0 * histogram[i] / max; gdk_draw_rectangle(darea2->window, GC, true, i * 4, 127 - height, 4, height); } } void DrawHistogram2(void) { GdkGC *GC = gdk_gc_new(darea2->window); GdkColor color_black = { 0, 10000, 10000, 10000 }; gdk_gc_set_rgb_fg_color(GC, &color_black); gdk_draw_rectangle(darea2->window, GC, true, 256, 0, 256, 128); GdkColor color_red = { 0, 0, 65535, 0 }; gdk_gc_set_rgb_fg_color(GC, &color_red); unsigned int max = 0; for (int i = 0; i < 256; i++) { if (histogram2[i] > max) max = histogram2[i]; } for (int i = 0; i < 256; i++) { int height = 127.0 * histogram2[i] / max; gdk_draw_rectangle(darea2->window, GC, true, i * 1 + 256, 127 - height, 1, height); } } void DrawPalette(sRGB *palette) { memcpy(Interface_data.palette, palette, sizeof(sRGB)*256); if (paletteViewCreated) { double paletteOffset = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentPaletteOffset)); double colWidth = 10; GdkGC *GC = gdk_gc_new(dareaPalette->window); for (int i = 0; i < 640; i++) { int number = (int) (i * 256.0 / colWidth + paletteOffset * 256.0); sRGB color = IndexToColour(number, palette); GdkColor gdk_color; gdk_color.red = color.R * 256; gdk_color.green = color.G * 256; gdk_color.blue = color.B * 256; gdk_color.pixel = 0; if(((int)(i + paletteOffset *10) % (int)colWidth) == colWidth / 2) { gdk_color.red = gdk_color.red > 32768 ? gdk_color.red - 5000 : gdk_color.red + 5000; gdk_color.green = gdk_color.green > 32768 ? gdk_color.green - 5000 : gdk_color.green + 5000; gdk_color.blue = gdk_color.blue > 32768 ? gdk_color.blue - 5000 : gdk_color.blue + 5000; gdk_color.pixel = 0; } gdk_gc_set_rgb_fg_color(GC, &gdk_color); gdk_draw_line(dareaPalette->window, GC, i, 0, i, 30); } } } void MakeStereoImage(cImage *left, cImage *right, guchar *stereoImage) { int width = left->GetWidth(); int height = left->GetHeight(); sRGB8 *left8 = (sRGB8*) left->ConvertTo8bit(); sRGB8 *right8 = (sRGB8*) right->ConvertTo8bit(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { unsigned int addressSource = x + y * width; unsigned int addressDest = (x + y * width * 2) * 3; stereoImage[addressDest + 0] = right8[addressSource].R; stereoImage[addressDest + 1] = right8[addressSource].G; stereoImage[addressDest + 2] = right8[addressSource].B; stereoImage[addressDest + 0 + width * 3] = left8[addressSource].R; stereoImage[addressDest + 1 + width * 3] = left8[addressSource].G; stereoImage[addressDest + 2 + width * 3] = left8[addressSource].B; } } } void StereoPreview(cImage *temporaryImage, guchar *stereoImage) { guchar *image8 = temporaryImage->ConvertTo8bit(); int width = temporaryImage->GetWidth(); int height = temporaryImage->GetHeight(); memset(image8, 0, width * height * sizeof(sRGB8)); for (int y = 0; y < height / 2; y++) { for (int x = 0; x < width; x++) { int R = 0; int G = 0; int B = 0; unsigned int addressDest = (x + (y + height / 4) * width) * 3; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { unsigned int addressSource = ((x * 2 + i) + (y * 2 + j) * width * 2) * 3; R += stereoImage[addressSource + 0]; G += stereoImage[addressSource + 1]; B += stereoImage[addressSource + 2]; } } R = R / 4; G = G / 4; B = B / 4; image8[addressDest + 0] = R; image8[addressDest + 1] = G; image8[addressDest + 2] = B; } } temporaryImage->UpdatePreview(); temporaryImage->RedrawInWidget(renderWindow.drawingArea); } mandelbulber1.21-1.orig/src/Render3D.h0000644000175000017500000000447712274512437020436 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / Main program and CPU rendering engine / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / / Windows port by Makemeunsee, Knigty ********************************************************/ #ifndef RENDER3D_H_ #define RENDER3D_H_ #include "algebra.hpp" #include "image.h" #include "texture.hpp" #include "fractparams.h" #include "cl_support.hpp" struct sParam { int start; int z; int progressive; int progressiveStart; sParamRender param; cImage *image; int *done; int *thread_done; bool *linesToSend; }; struct sStep { double distance; double step; CVector3 point; int iters; double distThresh; }; struct sReflect { CVector3 start; CVector3 point; CVector3 viewVector; CVector3 distance; sStep *stepBuff; int buffCount; double depth; double lastDist; bool found; double distThresh; enumObjectType objectType; double reflect; }; //global extern guint64 N_counter; extern guint64 Loop_counter; extern guint64 DE_counter; extern guint64 Pixel_counter; extern int Missed_DE_counter; extern double DEerror; extern guint64 DE_counterForDEerror; extern double start_time; extern bool isRendering; extern bool isPostRendering; extern int NR_THREADS; extern bool noGUI; extern cImage mainImage; double real_clock(void); void MainRender(void); void *MainThread(void *ptr); void Render(sParamRender param, cImage *image, GtkWidget *outputDarea); void InitMainParameters(sParamRender *fractParam); bool InitMainImage(cImage *image, int width, int height, double previewScale, GtkWidget *drawingArea); bool LoadTextures(sParamRender *params); void ThumbnailRender(const char *settingsFile, cImage *miniImage, int mode); void ThumbnailRender2(sParamRender fractParamLoaded, cImage *miniImage); CVector3 RayMarching(sParamRender *param, sFractal *calcParam, CVector3 start, CVector3 direction, double maxScan, bool binaryEnable, sStep *stepBuff, int *buffCount, double *distThreshOut, double *lastDistOut, bool *foundOut, double *depthOut); void DrawKeyframePaths(sParamRender *param, cImage *image, GtkWidget *outputDarea); void DrawHud(sParamRender *param, cImage *image, GtkWidget *outputDarea); CVector3 CalcPointPersp(CVector3 point, CRotationMatrix rot, double persp); #endif /* RENDER3D_H_ */ mandelbulber1.21-1.orig/src/cimage.cpp0000644000175000017500000003641512274512437020605 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / cImage class for offline and multiple layer image / handling / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include #include #include #include #include "cimage.hpp" #include #include cImage::cImage(int w, int h, bool low_mem) { width = w; height = h; previewAllocated = false; lowMem = low_mem; AllocMem(); gammaTable = new int[65536]; progressiveFactor = 1; } cImage::~cImage() { if(imageFloat) delete[] imageFloat; imageFloat = NULL; if(image16) delete[] image16; image16 = NULL; if(image8) delete[] image8; image8 = NULL; if(alphaBuffer) delete[] alphaBuffer; alphaBuffer = NULL; if(opacityBuffer) delete[] opacityBuffer; opacityBuffer = NULL; if(colourBuffer) delete[] colourBuffer; colourBuffer = NULL; if(zBuffer) delete[] zBuffer; zBuffer = NULL; if(gammaTable) delete[] gammaTable; gammaTable = NULL; if (previewAllocated) { if(preview) delete[] preview; preview = NULL; if(preview2) delete[] preview2; preview2 = NULL; } } bool cImage::AllocMem(void) { if (width > 0 && height > 0) { try { imageFloat = new sRGBfloat[width * height]; image16 = new sRGB16[width * height]; image8 = new sRGB8[width * height]; zBuffer = new float[width * height]; alphaBuffer = new unsigned short[width * height]; opacityBuffer = new unsigned short[width * height]; colourBuffer = new sRGB8[width * height]; ClearImage(); } catch (std::bad_alloc& ba) { std::cerr << "bad_alloc caught: " << ba.what() << std::endl; return false; } } else { fprintf(stderr, "Error! Cannot allocate memory for image (wrong image size)\n"); } if (previewAllocated) { delete[] preview; delete[] preview2; } previewAllocated = false; preview = NULL; preview2 = NULL; return true; } bool cImage::ChangeSize(int w, int h) { if (imageFloat) delete[] imageFloat; imageFloat = NULL; if (image16) delete[] image16; image16 = NULL; if (image8) delete[] image8; image8 = NULL; if (alphaBuffer) delete[] alphaBuffer; alphaBuffer = NULL; if (opacityBuffer) delete[] opacityBuffer; opacityBuffer = NULL; if (colourBuffer) delete[] colourBuffer; colourBuffer = NULL; if (zBuffer) delete[] zBuffer; zBuffer = NULL; width = w; height = h; return AllocMem(); } void cImage::ClearImage(void) { memset(imageFloat, 0, (unsigned long int)sizeof(sRGBfloat) * width * height); memset(image16, 0, (unsigned long int)sizeof(sRGB16) * width * height); memset(image8, 0, (unsigned long int)sizeof(sRGB8) * width * height); memset(alphaBuffer, 0, (unsigned long int)sizeof(unsigned short) * width * height); memset(opacityBuffer, 0, (unsigned long int)sizeof(unsigned short) * width * height); memset(colourBuffer, 0, (unsigned long int)sizeof(sRGB8) * width * height); for (long int i = 0; i < width * height; ++i) zBuffer[i] = 1e20; } sRGB16 cImage::CalculatePixel(sRGBfloat pixel) { float R = pixel.R * adj.brightness; float G = pixel.G * adj.brightness; float B = pixel.B * adj.brightness; R = (R - 0.5) * adj.contrast + 0.5; G = (G - 0.5) * adj.contrast + 0.5; B = (B - 0.5) * adj.contrast + 0.5; if (R < 0.0) R = 0.0; if (G < 0.0) G = 0.0; if (B < 0.0) B = 0.0; //R = sqrt(tanh(R*R)); //G = sqrt(tanh(G*G)); //B = sqrt(tanh(B*B)); if(sw.hdrEnabled) { R = tanh(R); G = tanh(G); B = tanh(B); } if (R > 1.0) R = 1.0; if (G > 1.0) G = 1.0; if (B > 1.0) B = 1.0; sRGB16 newPixel16; newPixel16.R = R * 65535.0; newPixel16.G = G * 65535.0; newPixel16.B = B * 65535.0; newPixel16.R = gammaTable[newPixel16.R]; newPixel16.G = gammaTable[newPixel16.G]; newPixel16.B = gammaTable[newPixel16.B]; return newPixel16; } void cImage::CalculateGammaTable(void) { for (int i = 0; i < 65536; i++) { gammaTable[i] = pow(i / 65536.0, 1.0 / adj.imageGamma) * 65535; } } void cImage::CompileImage(void) { if (!lowMem) { CalculateGammaTable(); for (int y = 0; y < height; y += progressiveFactor) { for (int x = 0; x < width; x += progressiveFactor) { unsigned long int address = x + y * width; sRGBfloat pixel = imageFloat[address]; sRGB16 newPixel16 = CalculatePixel(pixel); image16[address] = newPixel16; } for (int x = 0; x <= width - progressiveFactor; x += progressiveFactor) { sRGB16 pixel = image16[x + y * width]; int alpha2 = alphaBuffer[x + y * width]; for (int yy = 0; yy < progressiveFactor; yy++) { for (int xx = 0; xx < progressiveFactor; xx++) { if (xx == 0 && yy == 0) continue; image16[x + xx + (y + yy) * width] = pixel; alphaBuffer[x + xx + (y + yy) * width] = alpha2; } } } } } } int cImage::GetUsedMB(void) { long int mb = 0; long int zBufferSize = (long int) width * height * sizeof(float); long int alphaSize = (long int) width * height * sizeof(unsigned short); long int imageFloatSize = (long int) width * height * sizeof(sRGBfloat); long int image16Size = (long int) width * height * sizeof(sRGB16); long int image8Size = (long int) width * height * sizeof(sRGB8); long int colorSize = (long int) width * height * sizeof(sRGB8); long int opacitySize = (long int) width * height * sizeof(unsigned short); mb = (long int) (zBufferSize + alphaSize + image16Size + image8Size + imageFloatSize + colorSize + opacitySize) / 1024 / 1024; return mb; } void cImage::SetImageParameters(sImageAdjustments adjustments, sImageSwitches switches) { adj = adjustments; sw = switches; } unsigned char* cImage::ConvertTo8bit(void) { for (long int i = 0; i < width * height; i++) { image8[i].R = image16[i].R / 256; image8[i].G = image16[i].G / 256; image8[i].B = image16[i].B / 256; } unsigned char* ptr = (unsigned char*) image8; return ptr; } sRGB8 cImage::Interpolation(float x, float y) { sRGB8 colour = { 0, 0, 0 }; if (x >= 0 && x < width - 1 && y >= 0 && y < height - 1) { int ix = x; int iy = y; int rx = (x - ix) * 256; int ry = (y - iy) * 256; sRGB8 k1 = image8[iy * width + ix]; sRGB8 k2 = image8[iy * width + ix + 1]; sRGB8 k3 = image8[(iy + 1) * width + ix]; sRGB8 k4 = image8[(iy + 1) * width + ix + 1]; colour.R = (k1.R * (255 - rx) * (255 - ry) + k2.R * (rx) * (255 - ry) + k3.R * (255 - rx) * ry + k4.R * (rx * ry)) / 65536; colour.G = (k1.G * (255 - rx) * (255 - ry) + k2.G * (rx) * (255 - ry) + k3.G * (255 - rx) * ry + k4.G * (rx * ry)) / 65536; colour.B = (k1.B * (255 - rx) * (255 - ry) + k2.B * (rx) * (255 - ry) + k3.B * (255 - rx) * ry + k4.B * (rx * ry)) / 65536; } return colour; } unsigned char* cImage::CreatePreview(double scale) { int w = width * scale; int h = height * scale; if (previewAllocated) { delete[] preview; delete[] preview2; } preview = new sRGB8[w * h]; preview2 = new sRGB8[w * h]; memset(preview, 0, (unsigned long int)sizeof(sRGB8) * (w * h)); memset(preview2, 0, (unsigned long int)sizeof(sRGB8) * (w * h)); previewAllocated = true; previewWidth = w; previewHeight = h; previewScale = scale; unsigned char* ptr = (unsigned char*) preview; return ptr; } void cImage::UpdatePreview(void) { if (previewAllocated) { int w = previewWidth; int h = previewHeight; if (width == w && height == h) { memcpy(preview, image8, width * height * sizeof(sRGB8)); } else { float scaleX = (float) width / w; float scaleY = (float) height / h; //number of pixels to sum int countX = (float) width / w + 1; int countY = (float) height / h + 1; int factor = countX * countY; float deltaX = scaleX / countX; float deltaY = scaleY / countY; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { int R = 0; int G = 0; int B = 0; for (int j = 0; j < countY; j++) { float yy = y * scaleY + j * deltaY; for (int i = 0; i < countX; i++) { float xx = x * scaleX + i * deltaX; if (xx > 0 && xx < width - 1 && yy > 0 && yy < height - 1) { sRGB8 oldPixel = Interpolation(xx, yy); R += oldPixel.R; G += oldPixel.G; B += oldPixel.B; } }//next i }//next j sRGB8 newpixel; newpixel.R = R / factor; newpixel.G = G / factor; newpixel.B = B / factor; preview[x + y * w] = newpixel; }//next x }//next y } memcpy(preview2, preview, w * h * sizeof(sRGB8)); } else { fprintf(stderr, "Error! Preview has not been prepared\n"); } } unsigned char* cImage::GetPreviewPtr(void) { unsigned char* ptr = 0; if (previewAllocated) { ptr = (unsigned char*) preview2; } else abort(); return ptr; } bool cImage::IsPreview(void) { if (previewAllocated) { return true; } else { return false; } } void cImage::RedrawInWidget(GtkWidget *dareaWidget) { if (IsPreview()) { gdk_draw_rgb_image(dareaWidget->window, dareaWidget->style->fg_gc[GTK_STATE_NORMAL], 0, 0, GetPreviewWidth(), GetPreviewHeight(), GDK_RGB_DITHER_MAX, GetPreviewPtr(), GetPreviewWidth() * 3); memcpy(preview2, preview, previewWidth * previewHeight * sizeof(sRGB8)); } } void cImage::Squares(int y, int pFactor) { progressiveFactor = pFactor; for (int x = 0; x <= width - pFactor; x += pFactor) { sRGBfloat pixelTemp = imageFloat[x + y * width]; float zBufferTemp = zBuffer[x + y * width]; sRGB8 colourTemp = colourBuffer[x + y * width]; unsigned short alphaTemp = alphaBuffer[x + y * width]; unsigned short opacityTemp = opacityBuffer[x + y * width]; for (int yy = 0; yy < pFactor; yy++) { for (int xx = 0; xx < pFactor; xx++) { if (xx == 0 && yy == 0) continue; imageFloat[x + xx + (y + yy) * width] = pixelTemp; zBuffer[x + xx + (y + yy) * width] = zBufferTemp; colourBuffer[x + xx + (y + yy) * width] = colourTemp; alphaBuffer[x + xx + (y + yy) * width] = alphaTemp; opacityBuffer[x + xx + (y + yy) * width] = opacityTemp; } } } } void cImage::PutPixelAlfa(int x, int y, float z, sRGB8 color, double opacity, int layer) { if (x >= 0 && x < previewWidth && y >= 0 && y < previewHeight) { size_t address = x + y * previewWidth; float zImage = GetPixelZBuffer(x / previewScale, y / previewScale); if (z > zImage) opacity *= 0.03; sRGB8 oldPixel; if(layer == 0) oldPixel = preview[address]; else if (layer == 1) oldPixel = preview2[address]; sRGB8 newPixel; newPixel.R = (oldPixel.R * (1.0 - opacity) + color.R * opacity); newPixel.G = (oldPixel.G * (1.0 - opacity) + color.G * opacity); newPixel.B = (oldPixel.B * (1.0 - opacity) + color.B * opacity); if(layer == 0) { preview[address] = newPixel; preview2[address] = newPixel; } else if (layer == 1) preview2[address] = newPixel; } } void cImage::AntiAliasedPoint(double x, double y, float z, sRGB8 color, double opacity, int layer) { double deltaX = x - (int) x; double deltaY = y - (int) y; double intensity1 = (1.0 - deltaX) * (1.0 - deltaY); double intensity2 = (deltaX) * (1.0 - deltaY); double intensity3 = (1.0 - deltaX) * (deltaY); double intensity4 = (deltaX) * (deltaY); double sum = intensity1 + intensity2 + intensity3 + intensity4; double opacity2; opacity2 = opacity * intensity1 / sum; PutPixelAlfa(x, y, z, color, opacity2, layer); opacity2 = opacity * intensity2 / sum; PutPixelAlfa(x + 1, y, z, color, opacity2, layer); opacity2 = opacity * intensity3 / sum; PutPixelAlfa(x, y + 1, z, color, opacity2, layer); opacity2 = opacity * intensity4 / sum; PutPixelAlfa(x + 1, y + 1, z, color, opacity2, layer); } void cImage::AntiAliasedLine(double x1, double y1, double x2, double y2, float z1, float z2, sRGB8 color, double opacity, int layer) { if ((x1 >= 0 && x1 < previewWidth && y1 >= 0 && y1 < previewHeight) || (x2 >= 0 && x2 < previewWidth && y2 >= 0 && y2 < previewHeight)) { double deltaX = x2 - x1; double deltaY = y2 - y1; if (deltaX != 0 || deltaY != 0) { double a_deltaX = fabs(deltaX); double a_deltaY = fabs(deltaY); double A = y1 - y2; double B = x2 - x1; double C = y2 * x1 - x2 * y1; double denominator = 1.0 / sqrt(A * A + B * B); if (a_deltaX > a_deltaY) { x1 += 0.5; x2 += 0.5; } else { y1 += 0.5; y2 += 0.5; } if (a_deltaX > a_deltaY) { double k = (y2 - y1) / (x2 - x1); float kz = (z2 - z1) / (x2 - x1); double xx1, xx2; if (x1 < x2) { xx1 = x1; xx2 = x2; } else { xx1 = x2; xx2 = x1; } int start = xx1; if(start < 0) start = 0; int end = xx2; if(end > previewWidth) end = previewWidth; for (int intX = start; intX <= end; intX++) { double x = intX; double y = k * (x - x1) + y1; float z = kz * (x - x1) + z1; int xx = 0.5 + x; for (double d = -1; d <= 1; d++) { int yy = 0.5 + y + d; double distance = 1.0 * fabs(A * x + B * yy + C) * denominator; if (distance >= 1.0) distance = 1.0; double opacity2; opacity2 = opacity * (1.0 - distance); if (intX == start) { opacity2 = opacity * (1.0 - (xx1 - x)) * (1.0 - distance); } if (intX == end) { opacity2 = opacity * ((xx2 - x)) * (1.0 - distance); } PutPixelAlfa(xx, yy, z, color, opacity2, layer); } } } else { double k = (x2 - x1) / (y2 - y1); float kz = (z2 - z1) / (y2 - y1); double yy1, yy2; if (y1 < y2) { yy1 = y1; yy2 = y2; } else { yy1 = y2; yy2 = y1; } int start = yy1; if(start < 0) start = 0; int end = yy2; if(end > previewHeight) end = previewHeight; for (int intY = start; intY <= end; intY++) { double y = intY; double x = k * (y - y1) + x1; float z = kz * (y - y1) + z1; int yy = 0.5 + y; for (int d = -1; d <= 1; d++) { int xx = 0.5 + x + d; double distance = fabs(A * xx + B * y + C) * denominator; if (distance >= 1.0) distance = 1.0; double opacity2; opacity2 = opacity * (1.0 - distance); if (intY == start) { opacity2 = opacity * (1.0 - (yy1 - (y))) * (1.0 - distance); } if (intY == end) { opacity2 = opacity * ((yy2 - (y))) * (1.0 - distance); } PutPixelAlfa(xx, yy, z, color, opacity2, layer); } } } } } } void cImage::CircleBorder(double x, double y, float z, double r, sRGB8 border, double borderWidth, double opacity, int layer) { if(borderWidth>0 && r>0) { double r2 = r + borderWidth; double r1 = r - borderWidth; if(r1<0) r1 = 0; int y1 = y - r2; int y2 = y + r2; double wspJ = 1.0/borderWidth * opacity; for (int yy = y1; yy<=y2; yy++) { double dyy = yy - y; double dxx = r2*r2 - dyy*dyy; if(dxx < 0) dxx = 0; double dx = sqrt(dxx); int x1 = x - dx; int x2 = x + dx; double dxx2 = r1*r1 - dyy*dyy; if(dxx2 < 0) dxx2 = 0; double dx2 = sqrt(dxx2); int x12 = x - dx2; int x22 = x + dx2; for(int xx = x1; xx<=x2; xx++) { if(xx<=x12 || xx>=x22) { double deltaX = xx - x; double deltaY = yy - y; double rr = sqrt(deltaX*deltaX + deltaY*deltaY); double deltaR = fabs(rr - r); if(deltaR > borderWidth) deltaR = borderWidth; double opacity2 = wspJ * (borderWidth - deltaR); PutPixelAlfa(xx,yy, z, border, opacity2, layer); } } } } } mandelbulber1.21-1.orig/src/files.h0000644000175000017500000000347312274512437020125 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions for operating on files, image loading and / saving / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef FILES_H_ #define FILES_H_ extern "C" { #include #include #include } #include #include "cimage.hpp" struct my_error_mgr { struct jpeg_error_mgr pub; /* "public" fields */ jmp_buf setjmp_buffer; /* for return to caller */ }; typedef struct my_error_mgr * my_error_ptr; struct sImageRGBA16 { unsigned short R; unsigned short G; unsigned short B; unsigned short A; }; extern std::string logfileName; std::string IndexFilename(const char* filename, const char* extension, int number); //METHODDEF(void) my_error_exit(j_common_ptr cinfo); int LoadJPEG(const char *filename, JSAMPLE *image); bool CheckJPEGsize(const char *filename, int *width, int *height); void SaveJPEG(const char *filename, int quality, int width, int height, JSAMPLE *image); void SavePNG(const char *filename, int quality, int width, int height, png_byte *image); void SavePNG16(const char *filename, int quality, int width, int height, sRGB16* image16); void SavePNG16Alpha(const char *filename, int quality, int width, int height, cImage *image); void SaveFromTilesPNG16(const char *filename, int width, int height, int tiles); bool FileIfExists(const char *filename); void WriteLog(const char *text); void WriteLogDouble(const char *text, double value); int fcopy(const char *source, const char *dest); void BufferNormalize16(sRGB16 *buffer, unsigned int size); //void SaveAllImageLayers(const char *filename, cImage *image); std::string removeFileExtension(const std::string &filename); #endif /* FILES_H_ */ mandelbulber1.21-1.orig/src/shaders.cpp0000644000175000017500000012313212274512437021002 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / shaders for rendering engine / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include "shaders.h" #include "interface.h" sLight *Lights; int lightsPlaced = 0; sShaderOutput ObjectShader(sShaderInputData input, sShaderOutput *surfaceColour, sShaderOutput *specularOut) { sShaderOutput output; //normal vector CVector3 vn = CalculateNormals(input); input.normal = vn; sShaderOutput mainLight; mainLight.R = input.param->doubles.imageAdjustments.mainLightIntensity * input.param->effectColours.mainLightColour.R / 65536.0; mainLight.G = input.param->doubles.imageAdjustments.mainLightIntensity * input.param->effectColours.mainLightColour.G / 65536.0; mainLight.B = input.param->doubles.imageAdjustments.mainLightIntensity * input.param->effectColours.mainLightColour.B / 65536.0; //calculate shading based on angle of incidence sShaderOutput shade = MainShading(input); shade.R = input.param->doubles.imageAdjustments.directLight * ((1.0 - input.param->doubles.imageAdjustments.shading) + input.param->doubles.imageAdjustments.shading * shade.R); shade.G = input.param->doubles.imageAdjustments.directLight * ((1.0 - input.param->doubles.imageAdjustments.shading) + input.param->doubles.imageAdjustments.shading * shade.G); shade.B = input.param->doubles.imageAdjustments.directLight * ((1.0 - input.param->doubles.imageAdjustments.shading) + input.param->doubles.imageAdjustments.shading * shade.B); //calculate shadow sShaderOutput shadow = {1.0, 1.0, 1.0, 0.0}; if(input.param->shadow) shadow = MainShadow(input); //calculate specular highlight sShaderOutput specular = MainSpecular(input); specular.R *= input.param->doubles.imageAdjustments.specular; specular.G *= input.param->doubles.imageAdjustments.specular; specular.B *= input.param->doubles.imageAdjustments.specular; //calculate surface colour sShaderOutput colour = SurfaceColour(input); *surfaceColour = colour; //ambient occlusion sShaderOutput ambient = {0.0, 0.0, 0.0, 0.0}; if(input.param->global_ilumination) { //fast mode if(input.param->fastGlobalIllumination) { ambient = FastAmbientOcclusion2(input); } else { ambient = AmbientOcclusion(input); } } sShaderOutput ambient2; ambient2.R = ambient.R * input.param->doubles.imageAdjustments.globalIlum; ambient2.G = ambient.G * input.param->doubles.imageAdjustments.globalIlum; ambient2.B = ambient.B * input.param->doubles.imageAdjustments.globalIlum; //environment mapping sShaderOutput envMapping = {0.0, 0.0, 0.0, 0.0}; if(!input.param->imageSwitches.raytracedReflections && input.param->doubles.imageAdjustments.reflect > 0) { envMapping = EnvMapping(input); } envMapping.R *= input.param->doubles.imageAdjustments.reflect; envMapping.G *= input.param->doubles.imageAdjustments.reflect; envMapping.B *= input.param->doubles.imageAdjustments.reflect; //additional lights sShaderOutput auxLights; sShaderOutput auxLightsSpecular; auxLights = AuxLightsShader(input, &auxLightsSpecular); //fake orbit trap lights sShaderOutput fakeLights = {0.0, 0.0, 0.0, 0.0}; sShaderOutput fakeLightsSpecular = {0.0, 0.0, 0.0, 0.0}; if(input.param->fakeLightsEnabled) { fakeLights = FakeLights(input, &fakeLightsSpecular); } //total shader output.R = envMapping.R * ambient.R + (ambient2.R + mainLight.R * shade.R * shadow.R) * colour.R; output.G = envMapping.G * ambient.G + (ambient2.G + mainLight.G * shade.G * shadow.G) * colour.G; output.B = envMapping.B * ambient.B + (ambient2.B + mainLight.B * shade.B * shadow.B) * colour.B; output.R += (auxLights.R + fakeLights.R) * colour.R; output.G += (auxLights.G + fakeLights.G) * colour.G; output.B += (auxLights.B + fakeLights.B) * colour.B; output.alpha = 1.0; (*specularOut).R = auxLightsSpecular.R + fakeLightsSpecular.R + mainLight.R * specular.R * shadow.R; (*specularOut).G = auxLightsSpecular.G + fakeLightsSpecular.G + mainLight.G * specular.G * shadow.G; (*specularOut).B = auxLightsSpecular.B + fakeLightsSpecular.B + mainLight.B * specular.B * shadow.B; (*specularOut).alpha = output.alpha; return output; } sShaderOutput BackgroundShader(sShaderInputData input) { sShaderOutput pixel2; if (input.param->texturedBackground) { if(input.param->background_as_fulldome) { double alfaTexture = input.viewVector.GetAlfa(); double betaTexture = input.viewVector.GetBeta(); int texWidth = input.param->backgroundTexture->Width()*0.5; int texHeight = input.param->backgroundTexture->Height(); int offset = 0; if(betaTexture < 0) { betaTexture = -betaTexture; alfaTexture += M_PI; offset = texWidth; } double texX = 0.5 * texWidth + cos(alfaTexture) * (1.0 - betaTexture / (0.5 * M_PI)) * texWidth * 0.5 + offset; double texY = 0.5 * texHeight + sin(alfaTexture) * (1.0 - betaTexture / (0.5 * M_PI)) * texHeight * 0.5; sRGB8 pixel = input.param->backgroundTexture->Pixel(texX, texY); pixel2.R = pixel.R / 256.0; pixel2.G = pixel.G / 256.0; pixel2.B = pixel.B / 256.0; } else { double alfaTexture = fmod(input.viewVector.GetAlfa() + 2.5 * M_PI, 2 * M_PI); double betaTexture = input.viewVector.GetBeta(); if (betaTexture > 0.5 * M_PI) betaTexture = 0.5 * M_PI - betaTexture; if (betaTexture < -0.5 * M_PI) betaTexture = -0.5 * M_PI + betaTexture; double texX = alfaTexture / (2.0 * M_PI) * input.param->backgroundTexture->Width(); double texY = (betaTexture / (M_PI) + 0.5) * input.param->backgroundTexture->Height(); sRGB8 pixel = input.param->backgroundTexture->Pixel(texX, texY); pixel2.R = pixel.R/256.0; pixel2.G = pixel.G/256.0; pixel2.B = pixel.B/256.0; } } else { CVector3 vector(0.0, 0.0, -1.0); vector.Normalize(); double grad = (input.viewVector.Dot(vector)+1.0); sRGB16 pixel; if(grad < 1) { double Ngrad = 1.0 - grad; pixel.R = (input.param->background_color3.R * Ngrad + input.param->background_color2.R * grad); pixel.G = (input.param->background_color3.G * Ngrad + input.param->background_color2.G * grad); pixel.B = (input.param->background_color3.B * Ngrad + input.param->background_color2.B * grad); } else { grad = grad - 1; double Ngrad = 1.0 - grad; pixel.R = (input.param->background_color2.R * Ngrad + input.param->background_color1.R * grad); pixel.G = (input.param->background_color2.G * Ngrad + input.param->background_color1.G * grad); pixel.B = (input.param->background_color2.B * Ngrad + input.param->background_color1.B * grad); } pixel2.R = pixel.R/65536.0; pixel2.G = pixel.G/65536.0; pixel2.B = pixel.B/65536.0; pixel2.alpha = 0.0; } return pixel2; } sShaderOutput VolumetricShader(sShaderInputData input, sShaderOutput oldPixel, sShaderOutput *opacityOut) { sShaderOutput output; float totalOpacity = 0.0; output.R = oldPixel.R; output.G = oldPixel.G; output.B = oldPixel.B; output.alpha = oldPixel.alpha; //basic fog init double fogVisibility = pow(10.0, input.param->doubles.imageAdjustments.fogVisibility / 10 - 16.0); //volumetric fog init double colourThresh = input.param->doubles.fogColour1Distance; double colourThresh2 = input.param->doubles.fogColour2Distance; double fogReduce = input.param->doubles.fogDistanceFactor; double fogIntensity = input.param->doubles.fogDensity; //visible lights init int numberOfLights = lightsPlaced; if (numberOfLights < 4) numberOfLights = 4; //glow init double glow = input.stepCount * input.param->doubles.imageAdjustments.glow_intensity / 512.0 * input.param->doubles.DE_factor; double glowN = 1.0 - glow; if (glowN < 0.0) glowN = 0.0; double glowR = (input.param->effectColours.glow_color1.R * glowN + input.param->effectColours.glow_color2.R * glow) / 65536.0; double glowG = (input.param->effectColours.glow_color1.G * glowN + input.param->effectColours.glow_color2.G * glow) / 65536.0; double glowB = (input.param->effectColours.glow_color1.B * glowN + input.param->effectColours.glow_color2.B * glow) / 65536.0; double totalStep = 0.0; for(int index = input.stepCount-1; index >0; index--) { double step = input.stepBuff[index].step; double distance = input.stepBuff[index].distance; CVector3 point = input.stepBuff[index].point; totalStep += step; input.point = point; input.dist_thresh = input.stepBuff[index].distThresh; if(totalStep < input.dist_thresh * input.param->doubles.quality) { continue; } step = totalStep; totalStep = 0.0; //------------------- glow double glowOpacity = glow * step / input.depth; output.R = glowOpacity * glowR + (1.0 - glowOpacity) * output.R; output.G = glowOpacity * glowG + (1.0 - glowOpacity) * output.G; output.B = glowOpacity * glowB + (1.0 - glowOpacity) * output.B; output.alpha += glowOpacity; //------------------ visible light if (input.param->doubles.auxLightVisibility > 0) { double lowestLightSize = 1e10; double lowestLightDist = 1e10; for (int i = 0; i < numberOfLights; ++i) { if (i < input.param->auxLightNumber || Lights[i].enabled) { CVector3 lightDistVect = point - Lights[i].position; double lightDist = lightDistVect.Length(); double lightSize = Lights[i].intensity * input.param->doubles.auxLightIntensity * input.param->doubles.auxLightVisibility; double r2 = lightDist / lightSize; if (r2 < lowestLightSize) { lowestLightSize = r2; lowestLightDist = lightDist; } } } //small steps close to light source to improve accuracy int smallSteps = 0; int smallStep_start = 0; int smallStep_end = 1; double step2 = step; smallSteps = 10.0 * step / (lowestLightDist + 1.0e-20); if(smallSteps > 50) smallSteps = 50; if (smallSteps > 0) { smallStep_start = 1; smallStep_end = smallSteps + 1; step2 = step / (smallSteps + 1.0); } for (int smallStep = smallStep_start; smallStep < smallStep_end; smallStep++) { CVector3 point2 = point - input.viewVector * step2 * smallStep; for (int i = 0; i < numberOfLights; ++i) { if (i < input.param->auxLightNumber || Lights[i].enabled) { CVector3 lightDistVect = point2 - Lights[i].position; double lightDist = lightDistVect.Length(); double lightSize = Lights[i].intensity * input.param->doubles.auxLightIntensity * input.param->doubles.auxLightVisibility; double r2 = lightDist / lightSize; if (r2 > 1.0) r2 = 1.0; double bellFunction = (cos(r2 * M_PI) + 1.0) / (r2 * r2 + 0.02) * 0.3; double lightDensity = step2 * bellFunction / lightSize; output.R += lightDensity * Lights[i].colour.R / 65536.0; output.G += lightDensity * Lights[i].colour.G / 65536.0; output.B += lightDensity * Lights[i].colour.B / 65536.0; output.alpha += lightDensity; } } } } //fake lights (orbit trap) if(input.param->fakeLightsEnabled) { double r = Compute(point, *input.calcParam); r = sqrt(1.0f/(r + 1.0e-30f)); double fakeLight = 1.0 / (pow(r, 10.0 / input.param->doubles.fakeLightsVisibilitySize) * pow(10.0, 10.0 / input.param->doubles.fakeLightsVisibilitySize) + 1e-100); output.R += fakeLight * step * input.param->doubles.fakeLightsVisibility; output.G += fakeLight * step * input.param->doubles.fakeLightsVisibility; output.B += fakeLight * step * input.param->doubles.fakeLightsVisibility; output.alpha += fakeLight * step * input.param->doubles.fakeLightsVisibility; } //---------------------- volumetric lights with shadows in fog for (int i = 0; i < 5; i++) { if (i == 0 && input.param->volumetricLightEnabled[0]) { sShaderOutput shadowOutputTemp = MainShadow(input); output.R += shadowOutputTemp.R * step * input.param->doubles.volumetricLightIntensity[0] * input.param->effectColours.mainLightColour.R / 65536.0; output.G += shadowOutputTemp.G * step * input.param->doubles.volumetricLightIntensity[0] * input.param->effectColours.mainLightColour.G / 65536.0; output.B += shadowOutputTemp.B * step * input.param->doubles.volumetricLightIntensity[0] * input.param->effectColours.mainLightColour.B / 65536.0; output.alpha += (shadowOutputTemp.R + shadowOutputTemp.G + shadowOutputTemp.B)/3.0 * step * input.param->doubles.volumetricLightIntensity[0]; } if (i > 0) { if (Lights[i - 1].enabled && input.param->volumetricLightEnabled[i]) { CVector3 d = Lights[i - 1].position - point; double distance = d.Length(); double distance2 = distance * distance; CVector3 lightVectorTemp = d; lightVectorTemp.Normalize(); double light = AuxShadow(input, distance, lightVectorTemp); output.R += light * Lights[i - 1].colour.R / 65536.0 * input.param->doubles.volumetricLightIntensity[i] * step / distance2; output.G += light * Lights[i - 1].colour.G / 65536.0 * input.param->doubles.volumetricLightIntensity[i] * step / distance2; output.B += light * Lights[i - 1].colour.B / 65536.0 * input.param->doubles.volumetricLightIntensity[i] * step / distance2; output.alpha += light * input.param->doubles.volumetricLightIntensity[i] * step / distance2; } } } //----------------------- basic fog if(input.param->imageSwitches.fogEnabled) { double fogDensity = step / fogVisibility; if(fogDensity > 1.0) fogDensity = 1.0; output.R = fogDensity * input.param->effectColours.fogColor.R / 65536.0 + (1.0 - fogDensity) * output.R; output.G = fogDensity * input.param->effectColours.fogColor.G / 65536.0 + (1.0 - fogDensity) * output.G; output.B = fogDensity * input.param->effectColours.fogColor.B / 65536.0 + (1.0 - fogDensity) * output.B; totalOpacity = fogDensity + (1.0 - fogDensity) * totalOpacity; output.alpha = fogDensity + (1.0 - fogDensity) * output.alpha; } //-------------------- volumetric fog if(fogIntensity > 0.0) { double densityTemp = (step * fogReduce) / (distance * distance + fogReduce * fogReduce); double k = distance / colourThresh; if (k > 1) k = 1.0; double kn = 1.0 - k; double fogRtemp = (input.param->fogColour1.R * kn + input.param->fogColour2.R * k); double fogGtemp = (input.param->fogColour1.G * kn + input.param->fogColour2.G * k); double fogBtemp = (input.param->fogColour1.B * kn + input.param->fogColour2.B * k); double k2 = distance / colourThresh2 * k; if (k2 > 1) k2 = 1.0; kn = 1.0 - k2; fogRtemp = (fogRtemp * kn + input.param->fogColour3.R * k2); fogGtemp = (fogGtemp * kn + input.param->fogColour3.G * k2); fogBtemp = (fogBtemp * kn + input.param->fogColour3.B * k2); double fogDensity = 0.3 * fogIntensity * densityTemp / (1.0 + fogIntensity * densityTemp); if(fogDensity > 1) fogDensity = 1.0; output.R = fogDensity * fogRtemp / 65536.0 + (1.0 - fogDensity) * output.R; output.G = fogDensity * fogGtemp / 65536.0 + (1.0 - fogDensity) * output.G; output.B = fogDensity * fogBtemp / 65536.0 + (1.0 - fogDensity) * output.B; totalOpacity = fogDensity + (1.0 - fogDensity) * totalOpacity; output.alpha = fogDensity + (1.0 - fogDensity) * output.alpha; } //iter fog if (input.param->imageSwitches.iterFogEnabled) { int L = input.stepBuff[index].iters; double opacity = IterOpacity(step, L, input.param->fractal.doubles.N, input.param->doubles.iterFogOpacityTrim, input.param->doubles.iterFogOpacity); sShaderOutput newColour = { 0.0, 0.0, 0.0 }; if (opacity > 0) { //fog colour double iterFactor = (double) 2.0 * (L - input.param->doubles.iterFogOpacityTrim) / (input.param->fractal.doubles.N - input.param->doubles.iterFogOpacityTrim); double k = iterFactor; if (k > 1.0) k = 1.0; if (k < 0.0) k = 0.0; double kn = 1.0 - k; double fogColR = (input.param->fogColour1.R * kn + input.param->fogColour2.R * k); double fogColG = (input.param->fogColour1.G * kn + input.param->fogColour2.G * k); double fogColB = (input.param->fogColour1.B * kn + input.param->fogColour2.B * k); double k2 = iterFactor - 1.0; if (k2 < 0.0) k2 = 0.0; if (k2 > 1.0) k2 = 1.0; kn = 1.0 - k2; fogColR = (fogColR * kn + input.param->fogColour3.R * k2); fogColG = (fogColG * kn + input.param->fogColour3.G * k2); fogColB = (fogColB * kn + input.param->fogColour3.B * k2); //---- for (int i = 0; i < 5; i++) { if (i == 0) { if (input.param->doubles.imageAdjustments.mainLightIntensity * input.param->doubles.imageAdjustments.directLight > 0.0) { sShaderOutput shadowOutputTemp = MainShadow(input); newColour.R += shadowOutputTemp.R * input.param->effectColours.mainLightColour.R / 65536.0 * input.param->doubles.imageAdjustments.mainLightIntensity * input.param->doubles.imageAdjustments.directLight; newColour.G += shadowOutputTemp.G * input.param->effectColours.mainLightColour.G / 65536.0 * input.param->doubles.imageAdjustments.mainLightIntensity * input.param->doubles.imageAdjustments.directLight; newColour.B += shadowOutputTemp.B * input.param->effectColours.mainLightColour.B / 65536.0 * input.param->doubles.imageAdjustments.mainLightIntensity * input.param->doubles.imageAdjustments.directLight; } } if (i > 0) { if (Lights[i - 1].enabled) { CVector3 d = Lights[i - 1].position - point; double distance = d.Length(); double distance2 = distance * distance; CVector3 lightVectorTemp = d; lightVectorTemp.Normalize(); double light = AuxShadow(input, distance, lightVectorTemp); double intensity = Lights[i - 1].intensity * 100.0; newColour.R += light * Lights[i - 1].colour.R / 65536.0 / distance2 * intensity; newColour.G += light * Lights[i - 1].colour.G / 65536.0 / distance2 * intensity; newColour.B += light * Lights[i - 1].colour.B / 65536.0 / distance2 * intensity; } } } if (input.param->global_ilumination && !input.param->fastGlobalIllumination) { sShaderOutput AO = AmbientOcclusion(input); newColour.R += AO.R * input.param->doubles.imageAdjustments.globalIlum; newColour.G += AO.G * input.param->doubles.imageAdjustments.globalIlum; newColour.B += AO.B * input.param->doubles.imageAdjustments.globalIlum; } if (opacity > 1.0) opacity = 1.0; output.R = output.R * (1.0 - opacity) + newColour.R * opacity * fogColR / 65536.0; output.G = output.G * (1.0 - opacity) + newColour.G * opacity * fogColG / 65536.0; output.B = output.B * (1.0 - opacity) + newColour.B * opacity * fogColB / 65536.0; totalOpacity = opacity + (1.0 - opacity) * totalOpacity; output.alpha = opacity + (1.0 - opacity) * output.alpha; } } if(totalOpacity > 1.0) totalOpacity = 1.0; if(output.alpha > 1.0) output.alpha = 1.0; (*opacityOut).R = totalOpacity; (*opacityOut).G = totalOpacity; (*opacityOut).B = totalOpacity; } //next stepCount return output; } sShaderOutput MainShadow(sShaderInputData &input) { sShaderOutput shadow = { 1.0, 1.0, 1.0 }; //starting point CVector3 point2; bool max_iter; double factor = input.delta / input.param->doubles.resolution; if (!input.param->penetratingLights) factor = input.param->doubles.viewDistanceMax; double dist = input.dist_thresh; input.calcParam->doubles.detailSize = input.dist_thresh; double DE_factor = input.param->doubles.DE_factor; if(input.param->imageSwitches.iterFogEnabled || input.param->imageSwitches.volumetricLightEnabled) DE_factor = 1.0; //double start = input.delta; double start = input.dist_thresh; if (input.calcParam->interiorMode) start = input.dist_thresh * DE_factor; double opacity = 0.0; double shadowTemp = 1.0; double softRange = tan(input.param->doubles.shadowConeAngle / 180.0 * M_PI); double maxSoft = 0.0; double bSoft = (!input.param->imageSwitches.iterFogEnabled && !input.calcParam->limits_enabled && !input.calcParam->iterThresh) && softRange > 0.0; for (double i = start; i < factor; i += dist * DE_factor) { point2 = input.point + input.lightVect * i; float dist_thresh; if(input.param->imageSwitches.iterFogEnabled || input.param->imageSwitches.volumetricLightEnabled) { if(!input.calcParam->constantDEThreshold) dist_thresh = (point2 - input.eyePoint).Length() * input.param->doubles.resolution * input.param->doubles.persp / input.param->doubles.quality; else dist_thresh = input.param->doubles.quality; } else dist_thresh = input.dist_thresh; input.calcParam->doubles.detailSize = dist_thresh; dist = CalculateDistance(point2, *input.calcParam, &max_iter); if (bSoft) { double angle = (dist - dist_thresh) / i; if (angle < 0) angle = 0; if (dist < dist_thresh) angle = 0; double softShadow = (1.0 - angle / softRange); if (input.param->penetratingLights) softShadow *= (factor - i) / factor; if (softShadow < 0) softShadow = 0; if (softShadow > maxSoft) maxSoft = softShadow; } if (input.param->imageSwitches.iterFogEnabled) { opacity = IterOpacity(dist * DE_factor, input.calcParam->itersOut, input.calcParam->doubles.N, input.param->doubles.iterFogOpacityTrim, input.param->doubles.iterFogOpacity); } else { opacity = 0.0; } shadowTemp -= opacity * (factor - i) / factor; if (dist < dist_thresh || shadowTemp < 0.0) { shadowTemp -= (factor - i) / factor; if (!input.param->penetratingLights) shadowTemp = 0.0; if (shadowTemp < 0.0) shadowTemp = 0.0; break; } } if (!bSoft) { shadow.R = shadowTemp; shadow.G = shadowTemp; shadow.B = shadowTemp; } else { shadow.R = (1.0 - maxSoft); shadow.G = (1.0 - maxSoft); shadow.B = (1.0 - maxSoft); } return shadow; } sShaderOutput FastAmbientOcclusion(sShaderInputData &input) { sShaderOutput output; double min_radius = Compute(input.point, *input.calcParam); double j = (min_radius - 0.65) * 1.0; //0.65 if (j > 1.0) j = 1.0; if (j < 0) j = 0; output.R = j; output.G = j; output.B = j; return output; } sShaderOutput FastAmbientOcclusion2(sShaderInputData &input) { //reference: http://www.iquilezles.org/www/material/nvscene2008/rwwtt.pdf (Iñigo Quilez – iq/rgba) double delta = input.dist_thresh; double aoTemp = 0; double quality = input.param->globalIlumQuality; for (int i = 1; i < quality * quality; i++) { double scan = i * i * delta; CVector3 pointTemp = input.point + input.normal * scan; bool max_iter; double dist = CalculateDistance(pointTemp, *input.calcParam, &max_iter); aoTemp += 1.0 / (pow(2.0, i)) * (scan - input.param->doubles.fastAoTune * dist) / input.dist_thresh; //if(dist < 0.5*dist_thresh) break; } double ao = 1.0 - 0.2 * aoTemp; if (ao < 0) ao = 0; sShaderOutput output = { ao, ao, ao }; return output; } sShaderOutput AmbientOcclusion(sShaderInputData &input) { sShaderOutput AO = { 0, 0, 0 }; bool max_iter; double start_dist = input.delta; double end_dist = input.delta / input.param->doubles.resolution; double intense = 0; for (int i = 0; i < input.vectorsCount; i++) { sVectorsAround v = input.vectorsAround[i]; double dist = input.lastDist; double opacity = 0.0; double shadowTemp = 1.0; for (double r = start_dist; r < end_dist; r += dist * 2.0) { CVector3 point2 = input.point + v.v * r; dist = CalculateDistance(point2, *input.calcParam, &max_iter); if (input.param->imageSwitches.iterFogEnabled) { opacity = IterOpacity(dist * 2.0, input.calcParam->itersOut, input.calcParam->doubles.N, input.param->doubles.iterFogOpacityTrim, input.param->doubles.iterFogOpacity); } else { opacity = 0.0; } shadowTemp -= opacity * (end_dist - r) / end_dist; float dist_thresh; if(input.param->imageSwitches.iterFogEnabled || input.param->imageSwitches.volumetricLightEnabled) { if(!input.calcParam->constantDEThreshold) dist_thresh = (point2 - input.eyePoint).Length() * input.param->doubles.resolution * input.param->doubles.persp / input.param->doubles.quality; else dist_thresh = input.param->doubles.quality; } else dist_thresh = input.dist_thresh; if (dist < dist_thresh || max_iter || shadowTemp < 0.0) { shadowTemp -= (end_dist - r) / end_dist; if (shadowTemp < 0.0) shadowTemp = 0.0; break; } } intense = shadowTemp; AO.R += intense * v.R; AO.G += intense * v.G; AO.B += intense * v.B; } AO.R /= (input.vectorsCount * 256.0); AO.G /= (input.vectorsCount * 256.0); AO.B /= (input.vectorsCount * 256.0); return AO; } CVector3 CalculateNormals(sShaderInputData input) { CVector3 normal(0, 0, 0); //calculating normal vector based on distance estimation (gradient of distance function) if (!input.param->slowShading) { //calcParam->DE_threshold = 0; //double delta = param->resolution * param->zoom * wsp_persp; double delta = input.delta * input.param->doubles.smoothness; if(input.calcParam->interiorMode) delta = input.dist_thresh * input.param->doubles.quality * 0.2 * input.param->doubles.smoothness; double s1, s2, s3, s4; input.calcParam->doubles.N = input.param->fractal.doubles.N * 5; input.calcParam->minN = 0; input.calcParam->normalCalculationMode = true; bool maxIter; s1 = CalculateDistance(input.point, *input.calcParam, &maxIter); CVector3 deltax(delta, 0.0, 0.0); s2 = CalculateDistance(input.point + deltax, *input.calcParam, &maxIter); CVector3 deltay(0.0, delta, 0.0); s3 = CalculateDistance(input.point + deltay, *input.calcParam, &maxIter); CVector3 deltaz(0.0, 0.0, delta); s4 = CalculateDistance(input.point + deltaz, *input.calcParam, &maxIter); normal.x = s2 - s1; normal.y = s3 - s1; normal.z = s4 - s1; input.calcParam->doubles.N = input.param->fractal.doubles.N; input.calcParam->minN = input.param->fractal.minN; input.calcParam->normalCalculationMode = false; //calcParam->DE_threshold = DEthreshold_temp; } //calculating normal vector based on average value of binary central difference else { double result2; bool max_iter; CVector3 point2; CVector3 point3; input.calcParam->normalCalculationMode = true; double delta = input.delta * input.param->doubles.smoothness; input.calcParam->doubles.N = input.param->fractal.doubles.N * 5; if(input.calcParam->interiorMode) delta = input.dist_thresh * input.param->doubles.quality * 0.2 * input.param->doubles.smoothness; for (point2.x = -1.0; point2.x <= 1.0; point2.x += 0.2) //+0.2 { for (point2.y = -1.0; point2.y <= 1.0; point2.y += 0.2) { for (point2.z = -1.0; point2.z <= 1.0; point2.z += 0.2) { point3 = input.point + point2 * delta; double dist = CalculateDistance(point3, *input.calcParam, &max_iter); //if (dist < input.dist_thresh || max_iter) result2 = 0.0; //else result2 = 1.0; normal += (point2 * dist); } } } input.calcParam->normalCalculationMode = false; input.calcParam->doubles.N = input.param->fractal.doubles.N; } if(normal.x == 0 && normal.y == 0 && normal.z == 0) { normal.x = 1; } else { normal.Normalize(); } return normal; } sShaderOutput MainShading(sShaderInputData &input) { sShaderOutput shading; double shade = input.normal.Dot(input.lightVect); if (shade < 0) shade = 0; shading.R = shade; shading.G = shade; shading.B = shade; return shading; } sShaderOutput MainSpecular(sShaderInputData &input) { sShaderOutput specular; CVector3 half = input.lightVect - input.viewVector; half.Normalize(); double shade2 = input.normal.Dot(half); if (shade2 < 0.0) shade2 = 0.0; shade2 = pow(shade2, 30.0) * 1.0; if (shade2 > 15.0) shade2 = 15.0; specular.R = shade2; specular.G = shade2; specular.B = shade2; return specular; } sShaderOutput EnvMapping(sShaderInputData &input) { sShaderOutput envReflect; CVector3 reflect; double dot = -input.viewVector.Dot(input.normal); reflect = input.normal * 2.0 * dot + input.viewVector; double alfaTexture = reflect.GetAlfa() + M_PI; double betaTexture = reflect.GetBeta(); double texWidth = input.envMappingTexture->Width(); double texHeight = input.envMappingTexture->Height(); if (betaTexture > 0.5 * M_PI) betaTexture = 0.5 * M_PI - betaTexture; if (betaTexture < -0.5 * M_PI) betaTexture = -0.5 * M_PI + betaTexture; double dtx = (alfaTexture / (2.0 * M_PI)) * texWidth + texWidth * 8.25; double dty = (betaTexture / (M_PI) + 0.5) * texHeight + texHeight * 8.0; dtx = fmod(dtx, texWidth); dty = fmod(dty, texHeight); if (dtx < 0) dtx = 0; if (dty < 0) dty = 0; envReflect.R = input.envMappingTexture->Pixel(dtx, dty).R / 256.0; envReflect.G = input.envMappingTexture->Pixel(dtx, dty).G / 256.0; envReflect.B = input.envMappingTexture->Pixel(dtx, dty).B / 256.0; return envReflect; } sShaderOutput SurfaceColour(sShaderInputData &input) { #ifdef FAST_MAND double zx = point.x; double zy = point.y; int N = calcParam->doubles.N * 10.0; double p = 2.0; double smooth = 0.0; int L = 0; double r = 0.0; int nrKol = 253 * 256; for(L=0; L 1e20) { smooth = (L - log(log(sqrt(r)) / log(N)) / log(p)); nrKol = smooth * 50.0; nrKol = abs(nrKol) % (248*256); break; } } N_counter += L + 1; Loop_counter++; if (L/10 < 64) histogram[L/10]++; else histogram[63]++; return nrKol; #else sShaderOutput out; switch(input.objectType) { case objFractal: { input.calcParam->doubles.N *= 10; int nrCol = floor(Compute(input.point, *input.calcParam)); input.calcParam->doubles.N /= 10; nrCol = abs(nrCol) % (248 * 256); sRGB colour = { 256, 256, 256 }; if (input.param->imageSwitches.coloringEnabled) { int color_number; if (nrCol >= 248 * 256) { color_number = nrCol; } else { color_number = (int) (nrCol * input.param->doubles.imageAdjustments.coloring_speed + 256 * input.param->doubles.imageAdjustments.paletteOffset) % 65536; } colour = IndexToColour(color_number, input.param->palette); } out.R = colour.R / 256.0; out.G = colour.G / 256.0; out.B = colour.B / 256.0; break; } case objWater: { out.R = input.param->primitiveWaterColour.R / 65536.0; out.G = input.param->primitiveWaterColour.G / 65536.0; out.B = input.param->primitiveWaterColour.B / 65536.0; break; } case objBox: { out.R = input.param->primitiveBoxColour.R / 65536.0; out.G = input.param->primitiveBoxColour.G / 65536.0; out.B = input.param->primitiveBoxColour.B / 65536.0; break; } case objBoxInv: { out.R = input.param->primitiveInvertedBoxColour.R / 65536.0; out.G = input.param->primitiveInvertedBoxColour.G / 65536.0; out.B = input.param->primitiveInvertedBoxColour.B / 65536.0; break; } case objSphere: { out.R = input.param->primitiveSphereColour.R / 65536.0; out.G = input.param->primitiveSphereColour.G / 65536.0; out.B = input.param->primitiveSphereColour.B / 65536.0; break; } case objSphereInv: { out.R = input.param->primitiveInvertedSphereColour.R / 65536.0; out.G = input.param->primitiveInvertedSphereColour.G / 65536.0; out.B = input.param->primitiveInvertedSphereColour.B / 65536.0; break; } case objPlane: { out.R = input.param->primitivePlaneColour.R / 65536.0; out.G = input.param->primitivePlaneColour.G / 65536.0; out.B = input.param->primitivePlaneColour.B / 65536.0; break; } }; return out; #endif } sShaderOutput TexturedBackground(sParamRender *param, CVector3 viewVector) { sShaderOutput pixel2; if (param->texturedBackground) { if(param->background_as_fulldome) { double alfaTexture = viewVector.GetAlfa(); double betaTexture = viewVector.GetBeta(); int texWidth = param->backgroundTexture->Width()*0.5; int texHeight = param->backgroundTexture->Height(); int offset = 0; if(betaTexture < 0) { betaTexture = -betaTexture; alfaTexture += M_PI; offset = texWidth; } double texX = 0.5 * texWidth + cos(alfaTexture) * (1.0 - betaTexture / (0.5 * M_PI)) * texWidth * 0.5 + offset; double texY = 0.5 * texHeight + sin(alfaTexture) * (1.0 - betaTexture / (0.5 * M_PI)) * texHeight * 0.5; sRGB8 pixel = param->backgroundTexture->Pixel(texX, texY); pixel2.R = pixel.R / 256.0; pixel2.G = pixel.G / 256.0; pixel2.B = pixel.B / 256.0; } else { double alfaTexture = fmod(viewVector.GetAlfa() + 2.5 * M_PI, 2 * M_PI); double betaTexture = viewVector.GetBeta(); if (betaTexture > 0.5 * M_PI) betaTexture = 0.5 * M_PI - betaTexture; if (betaTexture < -0.5 * M_PI) betaTexture = -0.5 * M_PI + betaTexture; double texX = alfaTexture / (2.0 * M_PI) * param->backgroundTexture->Width(); double texY = (betaTexture / (M_PI) + 0.5) * param->backgroundTexture->Height(); sRGB8 pixel = param->backgroundTexture->Pixel(texX, texY); pixel2.R = pixel.R/256.0; pixel2.G = pixel.G/256.0; pixel2.B = pixel.B/256.0; } } else { CVector3 vector(0.5, 0.5, -0.5); vector.Normalize(); double grad = (viewVector.Dot(vector)+1.0); sRGB16 pixel; if(grad < 1) { double Ngrad = 1.0 - grad; pixel.R = (param->background_color3.R * Ngrad + param->background_color2.R * grad); pixel.G = (param->background_color3.G * Ngrad + param->background_color2.G * grad); pixel.B = (param->background_color3.B * Ngrad + param->background_color2.B * grad); } else { grad = grad - 1; double Ngrad = 1.0 - grad; pixel.R = (param->background_color2.R * Ngrad + param->background_color1.R * grad); pixel.G = (param->background_color2.G * Ngrad + param->background_color1.G * grad); pixel.B = (param->background_color2.B * Ngrad + param->background_color1.B * grad); } pixel2.R = pixel.R/65536.0; pixel2.G = pixel.G/65536.0; pixel2.B = pixel.B/65536.0; } return pixel2; } sShaderOutput LightShading(sShaderInputData &input, sLight light, int number, sShaderOutput *outSpecular) { sShaderOutput shading; CVector3 d = light.position - input.point; double distance = d.Length(); //angle of incidence CVector3 lightVector = d; lightVector.Normalize(); double intensity = input.param->doubles.auxLightIntensity * 100.0 * light.intensity / (distance * distance) / number; double shade = input.normal.Dot(lightVector); if (shade < 0) shade = 0; shade = shade * intensity; if (shade > 500.0) shade = 500.0; //specular CVector3 half = lightVector - input.viewVector; half.Normalize(); double shade2 = input.normal.Dot(half); if (shade2 < 0.0) shade2 = 0.0; shade2 = pow(shade2, 30.0) * 1.0; shade2 *= intensity * input.param->doubles.imageAdjustments.specular; if (shade2 > 15.0) shade2 = 15.0; //calculate shadow if ((shade > 0.01 || shade2 > 0.01) && input.param->shadow) { double light = AuxShadow(input, distance, lightVector); shade *= light; shade2 *= light; } else { if (input.param->shadow) { shade = 0; shade2 = 0; } } shading.R = shade * light.colour.R / 65536.0; shading.G = shade * light.colour.G / 65536.0; shading.B = shade * light.colour.B / 65536.0; outSpecular->R = shade2 * light.colour.R / 65536.0; outSpecular->G = shade2 * light.colour.G / 65536.0; outSpecular->B = shade2 * light.colour.B / 65536.0; return shading; } sShaderOutput AuxLightsShader(sShaderInputData &input, sShaderOutput *specularOut) { int numberOfLights = lightsPlaced; if (numberOfLights < 4) numberOfLights = 4; sShaderOutput shadeAuxSum = { 0, 0, 0 }; sShaderOutput specularAuxSum = { 0, 0, 0 }; for (int i = 0; i < numberOfLights; i++) { if (i < input.param->auxLightNumber || Lights[i].enabled) { sShaderOutput specularAuxOutTemp; sShaderOutput shadeAux = LightShading(input, Lights[i], numberOfLights, &specularAuxOutTemp); shadeAuxSum.R += shadeAux.R; shadeAuxSum.G += shadeAux.G; shadeAuxSum.B += shadeAux.B; specularAuxSum.R += specularAuxOutTemp.R; specularAuxSum.G += specularAuxOutTemp.G; specularAuxSum.B += specularAuxOutTemp.B; } } *specularOut = specularAuxSum; return shadeAuxSum; } double AuxShadow(sShaderInputData &input, double distance, CVector3 lightVector) { double step = input.delta; double dist = step; double light = 1.0; double opacity = 0.0; double shadowTemp = 1.0; double DE_factor = input.param->doubles.DE_factor; if(input.param->imageSwitches.iterFogEnabled || input.param->imageSwitches.volumetricLightEnabled) DE_factor = 1.0; for (double i = input.delta; i < distance; i += dist * DE_factor) { CVector3 point2 = input.point + lightVector * i; bool max_iter; dist = CalculateDistance(point2, *input.calcParam, &max_iter); if (input.param->imageSwitches.iterFogEnabled) { opacity = IterOpacity(dist * DE_factor, input.calcParam->itersOut, input.calcParam->doubles.N, input.param->doubles.iterFogOpacityTrim, input.param->doubles.iterFogOpacity); } else { opacity = 0.0; } shadowTemp -= opacity * (distance - i) / distance; float dist_thresh; if(input.param->imageSwitches.iterFogEnabled || input.param->imageSwitches.volumetricLightEnabled) { if(!input.calcParam->constantDEThreshold) dist_thresh = (point2 - input.eyePoint).Length() * input.param->doubles.resolution * input.param->doubles.persp / input.param->doubles.quality; else dist_thresh = input.param->doubles.quality; } else dist_thresh = input.dist_thresh; if (dist < dist_thresh || max_iter || shadowTemp < 0.0) { if (input.param->penetratingLights) { shadowTemp -= (distance - i) / distance; if (shadowTemp < 0.0) shadowTemp = 0.0; } else { shadowTemp = 0.0; } break; } } light = shadowTemp; return light; } void PlaceRandomLights(sParamRender *fractParams, bool onlyPredefined) { srand(fractParams->auxLightRandomSeed); if(!onlyPredefined) { delete[] Lights; Lights = new sLight[fractParams->auxLightNumber + 4]; } sFractal calcParam = fractParams->fractal; bool max_iter; int trial_number = 0; double radius_multiplier = 1.0; if(!onlyPredefined) { for (int i = 0; i < fractParams->auxLightNumber; i++) { trial_number++; CVector3 random; random.x = (Random(2000000) / 1000000.0 - 1.0) + (Random(1000000) / 1.0e12); random.y = (Random(2000000) / 1000000.0 - 1.0) + (Random(1000000) / 1.0e12); random.z = (Random(2000000) / 1000000.0 - 1.0) + (Random(1000000) / 1.0e12); CVector3 position = fractParams->doubles.auxLightRandomCenter + random * fractParams->doubles.auxLightDistributionRadius * radius_multiplier; double distance = CalculateDistance(position, calcParam, &max_iter); if (trial_number > 1000) { radius_multiplier *= 1.1; trial_number = 0; } if (distance > 0 && !max_iter && distance < fractParams->doubles.auxLightMaxDist * radius_multiplier) { radius_multiplier = 1.0; Lights[i].position = position; sRGB colour = { 20000 + Random(80000), 20000 + Random(80000), 20000 + Random(80000) }; double maxColour = dMax(colour.R, colour.G, colour.B); colour.R = colour.R * 65536.0 / maxColour; colour.G = colour.G * 65536.0 / maxColour; colour.B = colour.B * 65536.0 / maxColour; Lights[i].colour = colour; Lights[i].intensity = distance * distance / fractParams->doubles.auxLightMaxDist; Lights[i].enabled = true; printf("Light no. %d: x=%f, y=%f, z=%f, distance=%f\n", i, position.x, position.y, position.z, distance); } else { i--; } } } for (int i = 0; i < 4; i++) { if (fractParams->auxLightPreEnabled[i]) { Lights[i].position = fractParams->doubles.auxLightPre[i]; Lights[i].intensity = fractParams->doubles.auxLightPreIntensity[i]; Lights[i].colour = fractParams->auxLightPreColour[i]; Lights[i].enabled = true; } else { Lights[i].enabled = false; } } lightsPlaced = fractParams->auxLightNumber; if (lightsPlaced < 4) lightsPlaced = 4; } double IterOpacity(double step, double iters, double maxN, double trim, double opacitySp) { double opacity = ((double)iters - trim) / maxN; if(opacity < 0.0) opacity = 0.0; opacity*=opacity; opacity*=step * opacitySp; if(opacity > 1.0) opacity = 1.0; return opacity; } sShaderOutput FakeLights(sShaderInputData &input, sShaderOutput *fakeSpec) { sShaderOutput fakeLights; double delta = input.dist_thresh * input.param->doubles.smoothness; double rr = Compute(input.point, *input.calcParam); double fakeLight = input.param->doubles.fakeLightsIntensity/rr; double r = 1.0/(rr + 1e-30); CVector3 deltax(delta, 0.0, 0.0); double rx = 1.0/(Compute(input.point + deltax, *input.calcParam) + 1e-30); CVector3 deltay(0.0, delta, 0.0); double ry = 1.0/(Compute(input.point + deltay, *input.calcParam) + 1e-30); CVector3 deltaz(0.0, 0.0, delta); double rz = 1.0/(Compute(input.point + deltaz, *input.calcParam) + 1e-30); CVector3 fakeLightNormal; fakeLightNormal.x = r - rx; fakeLightNormal.y = r - ry; fakeLightNormal.z = r - rz; if(fakeLightNormal.x == 0 && fakeLightNormal.y == 0 && fakeLightNormal.z == 0) { fakeLightNormal.x = 0.0; } else { fakeLightNormal.Normalize(); } double fakeLight2 = fakeLight * input.normal.Dot(fakeLightNormal); if(fakeLight2 < 0) fakeLight2 = 0; fakeLights.R = fakeLight2; fakeLights.G = fakeLight2; fakeLights.B = fakeLight2; CVector3 half = fakeLightNormal - input.viewVector; half.Normalize(); double fakeSpecular = input.normal.Dot(half); if (fakeSpecular < 0.0) fakeSpecular = 0.0; fakeSpecular = pow(fakeSpecular, 30.0) * fakeLight; if (fakeSpecular > 15.0) fakeSpecular = 15.0; fakeSpec->R = fakeSpecular; fakeSpec->G = fakeSpecular; fakeSpec->B = fakeSpecular; return fakeLights; } sRGB IndexToColour(int index, sRGB *palette) { double R1, R2, G1, G2, B1, B2; double RK, GK, BK; sRGB colour = { 255, 255, 255 }; int kol, delta; if (index < 0) { colour = palette[255]; } else { index = index % (255 * 256); kol = index / 256; if (kol < 255) { R1 = palette[kol].R; G1 = palette[kol].G; B1 = palette[kol].B; R2 = palette[kol + 1].R; G2 = palette[kol + 1].G; B2 = palette[kol + 1].B; RK = (R2 - R1) / 256.0; GK = (G2 - G1) / 256.0; BK = (B2 - B1) / 256.0; delta = index % 256; colour.R = R1 + (RK * delta); colour.G = G1 + (GK * delta); colour.B = B1 + (BK * delta); } } return colour; } mandelbulber1.21-1.orig/src/shaders.h0000644000175000017500000000447112274512437020453 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / shaders for rendering engine / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef SHADERS_H_ #define SHADERS_H_ #include "Render3D.h" struct sShaderOutput { double R; double G; double B; double alpha; }; struct sLight { CVector3 position; sRGB colour; double intensity; bool enabled; }; struct sShaderInputData { sParamRender *param; sFractal *calcParam; CVector3 point; CVector3 viewVector; CVector3 eyePoint; CVector3 normal; CVector3 lightVect; double dist_thresh; double lastDist; double delta; sVectorsAround *vectorsAround; int vectorsCount; cTexture *envMappingTexture; double depth; sStep *stepBuff; int stepCount; enumObjectType objectType; }; extern sLight *Lights; extern int lightsPlaced; sShaderOutput ObjectShader(sShaderInputData input, sShaderOutput *surfaceColour, sShaderOutput *specularOut); sShaderOutput BackgroundShader(sShaderInputData input); sShaderOutput VolumetricShader(sShaderInputData input, sShaderOutput oldPixel, sShaderOutput *opacityOut); sShaderOutput MainShadow(sShaderInputData &input); sShaderOutput AmbientOcclusion(sShaderInputData &input); sShaderOutput FastAmbientOcclusion(sShaderInputData &input); sShaderOutput FastAmbientOcclusion2(sShaderInputData &input); CVector3 CalculateNormals(sShaderInputData input); sShaderOutput MainShading(sShaderInputData &input); sShaderOutput MainSpecular(sShaderInputData &input); sShaderOutput EnvMapping(sShaderInputData &input); sShaderOutput SurfaceColour(sShaderInputData &input); sShaderOutput TexturedBackground(sParamRender *param, CVector3 viewVector); sShaderOutput LightShading(sShaderInputData &input, sLight light, int number, sShaderOutput *specular); sShaderOutput AuxLightsShader(sShaderInputData &input, sShaderOutput *specularOut); double AuxShadow(sShaderInputData &input, double distance, CVector3 lightVector); sShaderOutput FakeLights(sShaderInputData &input, sShaderOutput *fakeSpec); void PlaceRandomLights(sParamRender *fractParams, bool onlyPredefined); double IterOpacity(double step, double iters, double maxN, double trim, double opacitySp); sRGB IndexToColour(int index, sRGB *palette); #endif /* SHADERS_H_ */ mandelbulber1.21-1.orig/src/common_math.cpp0000644000175000017500000000625012274512437021653 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / some functions for different calculations / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ /* * common_math.cpp * * Created on: 2010-01-23 * Author: krzysztof */ #include "common_math.h" #include #ifdef __sgi #include #endif //********** Random ****************************** int Random(int max) { #ifdef WIN32 return (rand()+rand()*32768) % (max + 1); #else return rand() % (max + 1); #endif } double dMax(double a, double b, double c) { if(a > b) { if (a > c) return a; return c; } if (b > c) return b; return c; } double dMin(double a, double b, double c) { if(a < b) { if (a < c) return a; return c; } if (b < c) return b; return c; } CVector3 Projection3D(CVector3 point, CVector3 vp, CRotationMatrix mRot, enumPerspectiveType perspectiveType, double fov, double zoom) { double perspFactor = 1.0 + point.y * fov; CVector3 vector1, vector2; if (perspectiveType == fishEye) { double r = sqrt(point.x * point.x + point.z * point.z); if(r == 0) { vector1.x = 0.0; vector1.z = 0.0; vector1.y = point.y; } else { vector1.x = point.x / r * sin(r*fov) * point.y; vector1.z = point.z / r * sin(r*fov) * point.y; vector1.y = cos(r*fov) * point.y; } //vector1.x = sin(fov * point.x) * point.y; //vector1.z = sin(fov * point.z) * point.y; //vector1.y = cos(fov * point.x) * cos(fov * point.z) * point.y; } else if(perspectiveType == equirectangular) { vector1.x = sin(fov * point.x) * cos(fov * point.z) * point.y; vector1.z = sin(fov * point.z) * point.y; vector1.y = cos(fov * point.x) * cos(fov * point.z) * point.y; } else //tree-point perspective { vector1.x = point.x * perspFactor; vector1.y = point.y * zoom; vector1.z = point.z * perspFactor; } vector2 = mRot.RotateVector(vector1); CVector3 result = vector2 + vp; return result; } CVector3 InvProjection3D(CVector3 point, CVector3 vp, CRotationMatrix mRotInv, enumPerspectiveType perspectiveType, double fov, double zoom, double imgWidth, double imgHeight) { CVector3 screenPoint; CVector3 baseZ(0.0, 1.0, 0.0); double aspectRatio = (double) imgWidth / imgHeight; CVector3 start; if (perspectiveType == fishEye || perspectiveType == equirectangular) { start = vp; } else { start = vp - baseZ * (1.0 / fov * zoom); } CVector3 viewVector = point - start; viewVector = mRotInv.RotateVector(viewVector); double x, y, z; if (perspectiveType == fishEye) { z = viewVector.Length(); if(viewVector.y < 0) z = -z; viewVector.Normalize(); double r = sqrt(viewVector.x * viewVector.x + viewVector.z * viewVector.z); double r2 = asin(r) / (M_PI * 0.5); x = (viewVector.x / fov) * r2 / r / 2.0; y = (viewVector.z / fov) * r2 / r / 2.0; } else { viewVector.x /= viewVector.y; viewVector.z /= viewVector.y; x = viewVector.x / fov; y = viewVector.z / fov; z = viewVector.y; } screenPoint.x = (x / aspectRatio + 0.5) * imgWidth; screenPoint.y = (y + 0.5) * imgHeight; screenPoint.z = z; return screenPoint; } mandelbulber1.21-1.orig/src/timeline.cpp0000644000175000017500000004072712274512437021167 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for animation timeline / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include #include "timeline.hpp" using namespace std; smart_ptr timeline; cTimeline::cTimeline() { database.reset(new cDatabase(1)); keyframeCount = 0; isCreated = false; isOpened = false; morphParamRenderGlobal = NULL; } cTimeline::~cTimeline() { } int cTimeline::Initialize(const char *keyframesPath) { int numberOfKeyframes = CheckNumberOfKeyframes(keyframesPath); printf("Found %d keyframes\n", numberOfKeyframes); smart_ptr thumbnail; CreateInterface(numberOfKeyframes); gtk_widget_set_sensitive(timelineInterface.buAnimationDeleteKeyframe, false); gtk_widget_set_sensitive(timelineInterface.buAnimationInsertKeyframe, false); gtk_widget_set_sensitive(timelineInterface.buAnimationRecordKey2, false); smart_ptr record(new sTimelineRecord); for (int i = 0; i < numberOfKeyframes; i++) { if (!database->IsFilled(i)) { thumbnail.reset(new cImage(128, 128)); string filename2=IndexFilename(keyframesPath, "fract", i); ThumbnailRender(filename2.c_str(), thumbnail.ptr(), 1); thumbnail->CreatePreview(1.0); thumbnail->ConvertTo8bit(); thumbnail->UpdatePreview(); memcpy(record->thumbnail, thumbnail->GetPreviewPtr(), sizeof(sRGB8) * 128 * 128); record->index = i; //only for testing database if(isOpened) { if (i == 0) database->SetRecord(0, (char*) record.ptr(), sizeof(sTimelineRecord)); else database->AddRecord((char*) record.ptr(), sizeof(sTimelineRecord)); } } if (isOpened) { DisplayInDrawingArea(i, timelineInterface.darea[i]); while (gtk_events_pending()) gtk_main_iteration(); gtk_signal_connect(GTK_OBJECT(timelineInterface.darea[i]), "expose-event", GTK_SIGNAL_FUNC(thumbnail_expose), NULL); gtk_signal_connect(GTK_OBJECT(timelineInterface.darea[i]), "button_press_event", GTK_SIGNAL_FUNC(PressedKeyframeThumbnail), NULL); gtk_widget_add_events(timelineInterface.darea[i], GDK_BUTTON_PRESS_MASK); } else { isCreated = false; keyframeCount = numberOfKeyframes; return numberOfKeyframes; } gtk_widget_queue_draw(timelineInterface.table); } gtk_widget_set_sensitive(timelineInterface.buAnimationDeleteKeyframe, true); gtk_widget_set_sensitive(timelineInterface.buAnimationInsertKeyframe, true); gtk_widget_set_sensitive(timelineInterface.buAnimationRecordKey2, true); isCreated = true; keyframeCount = numberOfKeyframes; return numberOfKeyframes; } int cTimeline::CheckNumberOfKeyframes(const char *keyframesPath) { string filename2; int maxKeyNumber = 0; do { filename2=IndexFilename(keyframesPath, "fract", maxKeyNumber); maxKeyNumber++; } while (FileIfExists(filename2.c_str())); maxKeyNumber--; return maxKeyNumber; } bool cTimeline::GetImage(int index, sRGB8 *image) { errorCode err; smart_ptr record(new sTimelineRecord); err = database->GetRecord(index, (char*) record.ptr()); if (!err) { memcpy(image, record->thumbnail, sizeof(sRGB8) * 128 * 128); return true; } return false; } void cTimeline::DisplayInDrawingArea(int index, GtkWidget *darea) { smart_array image(new sRGB8[128 * 128]); if (timeline->GetImage(index, image.ptr())) { gdk_draw_rgb_image(darea->window, darea->style->fg_gc[GTK_STATE_NORMAL], 0, 0, 128, 128, GDK_RGB_DITHER_MAX, (unsigned char*) image.ptr(), 128 * 3); } int selectedIndex = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); GdkColor color_black = { 0, 0, 0, 0 }; GdkColor color_white = { 0, 65535, 65535, 65535 }; GdkGC *GC = gdk_gc_new(darea->window); if (selectedIndex == index) { gdk_gc_set_rgb_fg_color(GC, &color_black); gdk_draw_line(darea->window, GC, 0, 0, 127, 0); gdk_draw_line(darea->window, GC, 0, 0, 0, 127); gdk_draw_line(darea->window, GC, 1, 1, 126, 1); gdk_draw_line(darea->window, GC, 1, 1, 1, 126); gdk_gc_set_rgb_fg_color(GC, &color_white); gdk_draw_line(darea->window, GC, 127, 127, 127, 0); gdk_draw_line(darea->window, GC, 127, 127, 0, 127); gdk_draw_line(darea->window, GC, 126, 126, 126, 0); gdk_draw_line(darea->window, GC, 126, 126, 0, 126); } else { gdk_gc_set_rgb_fg_color(GC, &color_white); gdk_draw_line(darea->window, GC, 0, 0, 127, 0); gdk_draw_line(darea->window, GC, 0, 0, 0, 127); gdk_gc_set_rgb_fg_color(GC, &color_black); gdk_draw_line(darea->window, GC, 127, 127, 127, 0); gdk_draw_line(darea->window, GC, 127, 127, 0, 127); } } void cTimeline::CreateInterface(int numberOfKeyframes) { timelineInterface.boxMain = gtk_vbox_new(FALSE, 1); timelineInterface.boxButtons = gtk_hbox_new(FALSE, 1); timelineInterface.buAnimationRecordKey2 = gtk_button_new_with_label("Record"); timelineInterface.buAnimationInsertKeyframe = gtk_button_new_with_label("Insert after"); timelineInterface.buAnimationDeleteKeyframe = gtk_button_new_with_label("Delete"); timelineInterface.buNextKeyframe = gtk_button_new_with_label("Next"); timelineInterface.buPreviousKeyframe = gtk_button_new_with_label("Previous"); timelineInterface.buRefresh = gtk_button_new_with_label("Refresh"); timelineInterface.editAnimationKeyNumber = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), timelineInterface.buAnimationRecordKey2, true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), timelineInterface.buAnimationInsertKeyframe, true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), timelineInterface.buAnimationDeleteKeyframe, true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), timelineInterface.buPreviousKeyframe, true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), timelineInterface.buNextKeyframe, true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), timelineInterface.buRefresh, true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxButtons), CreateEdit("0", "Key no.:", 5, timelineInterface.editAnimationKeyNumber), true, true, 1); gtk_box_pack_start(GTK_BOX(timelineInterface.boxMain), timelineInterface.boxButtons, false, false, 1); timelineInterface.scrolledWindow = gtk_scrolled_window_new(NULL, NULL); timelineInterface.windowHadjustment = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(timelineInterface.scrolledWindow)); timelineInterface.windowVadjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(timelineInterface.scrolledWindow)); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(timelineInterface.scrolledWindow), GTK_POLICY_ALWAYS, GTK_POLICY_NEVER); timelineInterface.boxTable = gtk_hbox_new(false, 1); timelineInterface.table = gtk_table_new(2, numberOfKeyframes + 1, false); gtk_box_pack_start(GTK_BOX(timelineInterface.boxTable), timelineInterface.table, false, false, 1); gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(timelineInterface.scrolledWindow), timelineInterface.boxTable); gtk_box_pack_start(GTK_BOX(timelineInterface.boxMain), timelineInterface.scrolledWindow, true, true, 1); gtk_container_add(GTK_CONTAINER(timeLineWindow), timelineInterface.boxMain); gtk_widget_show_all(timeLineWindow); timelineInterface.darea = new GtkWidget*[numberOfKeyframes]; timelineInterface.label = new GtkWidget*[numberOfKeyframes]; char widgetName[7]; char labelText[20]; for (int i = 0; i < numberOfKeyframes; i++) { timelineInterface.darea[i] = gtk_drawing_area_new(); sprintf(widgetName, "da%d", i); sprintf(labelText, "keyframe %d", i); timelineInterface.label[i] = gtk_label_new(labelText); gtk_widget_set_size_request(timelineInterface.darea[i], 128, 128); gtk_widget_set_name(timelineInterface.darea[i], widgetName); gtk_table_attach(GTK_TABLE(timelineInterface.table), timelineInterface.label[i], i, i + 1, 0, 1, GTK_EXPAND, GTK_EXPAND, 1, 0); gtk_table_attach(GTK_TABLE(timelineInterface.table), timelineInterface.darea[i], i, i + 1, 1, 2, GTK_EXPAND, GTK_EXPAND, 1, 0); gtk_widget_show(timelineInterface.darea[i]); gtk_widget_show(timelineInterface.label[i]); } g_signal_connect(G_OBJECT(timelineInterface.buNextKeyframe), "clicked", G_CALLBACK(PressedNextKeyframe), NULL); g_signal_connect(G_OBJECT(timelineInterface.buPreviousKeyframe), "clicked", G_CALLBACK(PressedPreviousKeyframe), NULL); g_signal_connect(G_OBJECT(timelineInterface.buAnimationRecordKey2), "clicked", G_CALLBACK(PressedRecordKeyframe), NULL); g_signal_connect(G_OBJECT(timelineInterface.buAnimationInsertKeyframe), "clicked", G_CALLBACK(PressedInsertKeyframe), NULL); g_signal_connect(G_OBJECT(timelineInterface.buAnimationDeleteKeyframe), "clicked", G_CALLBACK(PressedDeleteKeyframe), NULL); g_signal_connect(G_OBJECT(timelineInterface.buRefresh), "clicked", G_CALLBACK(PressedTimelineRefresh), NULL); isOpened = true; } void cTimeline::RebulidTimelineWindow(void) { CreateInterface(keyframeCount); for (int i = 0; i < keyframeCount; i++) { DisplayInDrawingArea(i, timelineInterface.darea[i]); gtk_signal_connect(GTK_OBJECT(timelineInterface.darea[i]), "expose-event", GTK_SIGNAL_FUNC(thumbnail_expose), NULL); gtk_signal_connect(GTK_OBJECT(timelineInterface.darea[i]), "button_press_event", GTK_SIGNAL_FUNC(PressedKeyframeThumbnail), NULL); gtk_widget_add_events(timelineInterface.darea[i], GDK_BUTTON_PRESS_MASK); gtk_widget_queue_draw(timelineInterface.table); } } void cTimeline::RecordKeyframe(int index, const char *keyframeFile, bool modeInsert) { smart_ptr record(new sTimelineRecord); smart_ptr thumbnail(new cImage(128, 128)); ThumbnailRender(keyframeFile, thumbnail.ptr(), 1); thumbnail->CreatePreview(1.0); thumbnail->ConvertTo8bit(); thumbnail->UpdatePreview(); memcpy(record->thumbnail, thumbnail->GetPreviewPtr(), sizeof(sRGB8) * 128 * 128); record->index = index; if (index < keyframeCount) { if (modeInsert) { database->InsertRecord(index, (char*) record.ptr(), sizeof(sTimelineRecord)); Resize(keyframeCount + 1); keyframeCount++; } else { database->SetRecord(index, (char*) record.ptr(), sizeof(sTimelineRecord)); } } else { database->AddRecord((char*) record.ptr(), sizeof(sTimelineRecord)); Resize(keyframeCount + 1); keyframeCount++; } DisplayInDrawingArea(index, timelineInterface.darea[index]); gtk_widget_queue_draw(timelineInterface.table); } void cTimeline::DeleteKeyframe(int index, const char *keyframesPath) { string filename, filename2; filename=IndexFilename(keyframesPath, "fract", index); if (remove(filename.c_str()) != 0) { fprintf(stderr, "Error! Cannot delete keyframe file\n"); } else { for (int i = index; i < keyframeCount - 1; i++) { filename=IndexFilename(keyframesPath, "fract", i); filename2=IndexFilename(keyframesPath, "fract", i + 1); rename(filename2.c_str(), filename.c_str()); } database->DeleteRecord(index); Resize(keyframeCount - 1); keyframeCount--; gtk_widget_queue_draw(timelineInterface.table); } } void cTimeline::Resize(int newsize) { gtk_table_resize(GTK_TABLE(timelineInterface.table), 2, newsize + 1); if (newsize < keyframeCount) { for (int i = newsize; i < keyframeCount; i++) { gtk_widget_destroy(timelineInterface.darea[i]); gtk_widget_destroy(timelineInterface.label[i]); } } //resize array with drawing area widgets GtkWidget **darea_new = new GtkWidget*[newsize]; int max; if (newsize < keyframeCount) max = newsize; else max = keyframeCount; for (int i = 0; i < max; i++) { darea_new[i] = timelineInterface.darea[i]; } delete[] timelineInterface.darea; timelineInterface.darea = darea_new; char widgetName[7]; char labelText[20]; if (newsize > keyframeCount) { for (int i = keyframeCount; i < newsize; i++) { timelineInterface.darea[i] = gtk_drawing_area_new(); sprintf(widgetName, "da%d", i); gtk_widget_set_size_request(timelineInterface.darea[i], 128, 128); gtk_widget_set_name(timelineInterface.darea[i], widgetName); sprintf(labelText, "keyframe %d", i); timelineInterface.label[i] = gtk_label_new(labelText); gtk_table_attach(GTK_TABLE(timelineInterface.table), timelineInterface.label[i], i, i + 1, 0, 1, GTK_EXPAND, GTK_EXPAND, 1, 0); gtk_table_attach(GTK_TABLE(timelineInterface.table), timelineInterface.darea[i], i, i + 1, 1, 2, GTK_EXPAND, GTK_EXPAND, 1, 0); gtk_widget_show(timelineInterface.darea[i]); gtk_widget_show(timelineInterface.label[i]); gtk_signal_connect(GTK_OBJECT(timelineInterface.darea[i]), "expose-event", GTK_SIGNAL_FUNC(thumbnail_expose), NULL); gtk_signal_connect(GTK_OBJECT(timelineInterface.darea[i]), "button_press_event", GTK_SIGNAL_FUNC(PressedKeyframeThumbnail), NULL); gtk_widget_add_events(timelineInterface.darea[i], GDK_BUTTON_PRESS_MASK); } } gtk_widget_queue_draw(timelineInterface.table); } void cTimeline::Reset(void) { database.reset(new cDatabase(1)); keyframeCount = 0; isCreated = false; isOpened = false; if (timeLineWindow) { gtk_widget_destroy(timeLineWindow); } } void cTimeline::Refresh(void) { gtk_widget_destroy(timelineInterface.boxMain); database.reset(new cDatabase(1)); keyframeCount = 0; isCreated = false; isOpened = false; Initialize(Interface_data.file_keyframes); } void cTimeline::UpdateGlobalMorph(void) { if(morphParamRenderGlobal) delete morphParamRenderGlobal; morphParamRenderGlobal = new CMorph (keyframeCount, sizeof(sParamRenderD) / sizeof(double)); sParamRender fractParam; ReadInterface(&fractParam); morphParamRenderGlobal->SetFramesPerKey(fractParam.framesPerKeyframe); for (int keyNumber = 0; keyNumber < keyframeCount; keyNumber++) { string filename; filename = IndexFilename(fractParam.file_keyframes, "fract", keyNumber); sParamRender fractParamLoaded; LoadSettings(filename.c_str(), fractParamLoaded, true); morphParamRenderGlobal->AddData(keyNumber, (double*) &fractParamLoaded.doubles); } } void cTimeline::GetFrameParamsInterpolated(int index, int framesPerKey, sParamRenderD *params) { if(index > 0 && index < framesPerKey * keyframeCount) { morphParamRenderGlobal->SetFramesPerKey(framesPerKey); morphParamRenderGlobal->CatmullRom(index, (double*) params); } else { memset(params, 0, sizeof(sParamRenderD)); } } gboolean thumbnail_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { const char* widgetName = gtk_widget_get_name(widget); int number = 0; sscanf(widgetName, "da%d", &number); timeline->DisplayInDrawingArea(number, widget); while (gtk_events_pending()) gtk_main_iteration(); return true; } void PressedKeyframeThumbnail(GtkWidget *widget, GdkEventButton *event) { const char* widgetName = gtk_widget_get_name(widget); int index = 0; sscanf(widgetName, "da%d", &index); gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); gtk_widget_queue_draw(timelineInterface.table); if (event->type == GDK_2BUTTON_PRESS) { string filename2 = IndexFilename(Interface_data.file_keyframes, "fract", index); if (FileIfExists(filename2.c_str())) { sParamRender fractParamLoaded; LoadSettings(filename2.c_str(), fractParamLoaded, true); KeepOtherSettings(&fractParamLoaded); WriteInterface(&fractParamLoaded); last_keyframe_position = fractParamLoaded.doubles.vp; Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } else { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error! Keyframe does not exist: %s", filename2.c_str()); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); } sParamRender params; ReadInterface(¶ms); char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } } mandelbulber1.21-1.orig/src/netrender.hpp0000644000175000017500000000424012274512437021342 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for rendering with several network clients / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef NETRENDER_HPP_ #define NETRENDER_HPP_ #include #include #ifdef WIN32 #undef WINVER #define WINVER WindowsXP #define _WIN32_WINNT 0xFFFF //#include #include #include #define INET6_ADDRSTRLEN 46 #else #include #include #endif #include #include #include using namespace std; class CNetRender { public: CNetRender(int myVersion, int CPUs); ~CNetRender(); bool SetServer(char *portNo, char *statusOut); void DeleteServer(void); bool SetClient(char *portNo, char*name, char *statusOut); void DeleteClient(void); bool WaitForClient(char *statusOut); bool IsServer() {return isServer;} bool IsClient() {return isClient;} int getNoOfClients() {return clientIndex;}; int getCpuCount(int index) {return clients[index].noOfCPU;}; bool sendDataToClient(void *data, size_t size, char *command, int index, int32_t identifier); bool sendDataToServer(void *data, size_t size, char *command); size_t receiveDataFromServer(char *command); size_t receiveDataFromClient(char *command, int index, int32_t reqIdentifier); void GetData(void *data); struct sClients { int socketfd; char ipstr[INET6_ADDRSTRLEN]; int port; int noOfCPU; }; struct sHeader { char command[4]; int32_t identifier; uint64_t size64; }; private: uint16_t CRC_Fletcher16( uint8_t const *data, size_t bytes); int status; struct addrinfo host_info; // The struct that getaddrinfo() fills up with data. struct addrinfo *host_info_list; // Pointer to the to the linked list of host_info's. bool isServer; bool isClient; int socketfd ; // The socket descripter int clientIndex; vector clients; int version; char *dataBuffer; size_t dataSize; int noOfCPUs; int32_t lastIdentifier; }; extern CNetRender *netRender; #endif /* NETRENDER_HPP_ */ mandelbulber1.21-1.orig/src/settings.h0000644000175000017500000000303712274512437020657 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions loading and saving parameters / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / / many improvements done by Rayan Hitchman ********************************************************/ #ifndef SETTINGS_H_ #define SETTINGS_H_ #include "Render3D.h" #include "interface.h" extern char data_directory[1000]; void fprintfDot(FILE *file, const char *string, double value, double defaultVal, bool compare); void fprintfInt(FILE *file, const char *string, int value, int defaultVal, bool compare); double atof2(const char *str, bool locale_dot); void SaveSettings(const char *filename, const sParamRender& params, bool compare); bool LoadSettings(const char *filename, sParamRender ¶ms, bool disableMessages = false); bool LoadSettings2(const char *filename, sParamRender ¶ms, bool disableMessages); bool LoadOneSetting(const char *str1, const char *s2, sParamRender ¶ms, bool disableMessages = false); void LoadSettingsPost(sParamRender ¶ms); void IFSToMorph(double *IFSdouble, const sFractal &fractal); void MorphToIFS(double *IFSdouble, sFractal &fractal); void MakePaletteString(const sRGB *palette, char *paletteString); void GetPaletteFromString(sRGB *palette, const char *paletteString); void KeepOtherSettings(sParamRender *params); void SaveAppSettings(const char *filename, const sAppSettings& appParams); bool LoadAppSettings(char *filename, sAppSettings &appParams); #endif /* SETTINGS_H_ */ mandelbulber1.21-1.orig/src/cl_support.cpp0000644000175000017500000015320212274512437021544 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / classes for OpenCL support / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include "interface.h" #include "settings.h" #include "cl_support.hpp" #include #include #include #include #include "files.h" #include "common_math.h" #ifdef WIN32 #include #endif CclSupport *clSupport; #ifdef CLSUPPORT struct sClParamsSSAO { cl_int width; cl_int height; cl_int quality; cl_float fov; cl_float intensity; }; struct sClParamsDOF { cl_int width; cl_int height; cl_float focus; cl_float radius; }; CclSupport::CclSupport(void) { enabled = false; ready = false; width = 800; height = 600; steps = 10; recompileRequest = true; lastFormula = trig_optim; lastEngineNumber = 0; lastStepSize = 0; inBuffer1 = new sClInBuff; constantsBuffer1 = new sClInConstants; auxReflectBuffer = NULL; buffSize = 0; context = NULL; kernel = NULL; outCL = NULL; rgbbuff = NULL; inCLBuffer1 = NULL; reflectBuffer = NULL; inCLConstBuffer1 = NULL; program = NULL; queue = NULL; reflectBufferSize = 0; maxClockFrequency = 0; maxAllocMemSize = 0; platformIndex = 0; memoryLimitByUser = 0; useCPU = false; deviceIndex = 0; workGroupSize = 0; numberOfComputeUnits = 0; stepSize = 0; memorySize = 0; maxWorkItemDimmensions = 0; maxConstantBufferSize = 0; memset(&lastParams, 0, sizeof(lastParams)); memset(&lastFractal, 0, sizeof(lastFractal)); isNVIDIA = false; customFormulas = NULL; backgroundImage2D = NULL; backgroundImage2DHeight = 10; backgroundImage2DWidth = 10; backgroungImageBuffer = new cl_uchar4[10*10]; backgroundTextureSource = NULL; programSSAO = NULL; kernelSSAO = NULL; queueSSAO = NULL; SSAOprepared = false; programDOF = NULL; kernelDOF = NULL; queueDOF = NULL; DOFprepared = false; } bool CclSupport::checkErr(cl_int err, const char * name) { if (err != CL_SUCCESS) { std::stringstream errorMessageStream; errorMessageStream << "ERROR: " << name << " (" << err << ")"; std::string errorMessage; errorMessage = errorMessageStream.str(); std::cerr << errorMessage << std::endl; GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, errorMessage.c_str()); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); ready = false; enabled = false; recompileRequest = true; #ifdef WIN32 SetCurrentDirectory(data_directory); #else chdir(data_directory); #endif gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClEnable), false); return false; } else return true; } void CclSupport::InitDevice(void) { cl_int err = 0; #ifdef WIN32 const std::wstring opencldll( L"OpenCL.dll" ); err = clewInit(opencldll.c_str()); std::cout << clewErrorString(err) << std::endl; #endif cl::Platform::get(&platformList); if(!checkErr(platformList.size() != 0 ? CL_SUCCESS : -1, "cl::Platform::get")) return; std::cout << "OpenCL Platform number is: " << platformList.size() << std::endl; if(platformIndex > platformList.size()-1) { platformIndex = platformList.size()-1; gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex), platformIndex); } platformList[platformIndex].getInfo((cl_platform_info) CL_PLATFORM_VENDOR, &platformVendor); std::cout << "OpenCL Platform is by: " << platformVendor << "\n"; cl_context_properties cprops[3] = { CL_CONTEXT_PLATFORM, (cl_context_properties) (platformList[platformIndex])(), 0 }; if(platformVendor.find("NVIDIA") != std::string::npos) { isNVIDIA = true; printf("nVidia OpenCL library is detected\n"); } if(platformVendor.find("Advanced") != std::string::npos) { isNVIDIA = false; printf("AMD OpenCL library is detected\n"); } if(useCPU) { context = new cl::Context(CL_DEVICE_TYPE_CPU, cprops, NULL, NULL, &err); } else { context = new cl::Context(CL_DEVICE_TYPE_GPU, cprops, NULL, NULL, &err); } if(!checkErr(err, "Context::Context()")) return; printf("OpenCL contexts created\n"); devices = context->getInfo(); if(deviceIndex > devices.size()-1) { deviceIndex = devices.size()-1; gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex), deviceIndex); } if(!checkErr(devices.size() > 0 ? CL_SUCCESS : -1, "devices.size() > 0")) return; devices[deviceIndex].getInfo(CL_DEVICE_MAX_COMPUTE_UNITS, &numberOfComputeUnits);; printf("OpenCL Number of compute units: %d\n", numberOfComputeUnits); devices[deviceIndex].getInfo(CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, &maxWorkItemDimmensions); printf("OpenCL Max work item dimmensions: %d\n", maxWorkItemDimmensions); devices[deviceIndex].getInfo(CL_DEVICE_MAX_WORK_GROUP_SIZE, &maxMaxWorkGroupSize); printf("OpenCL Max work group size: %d\n", maxMaxWorkGroupSize[0]); devices[deviceIndex].getInfo(CL_DEVICE_MAX_CLOCK_FREQUENCY, &maxClockFrequency); printf("OpenCL Max clock frequency %d MHz\n", maxClockFrequency); devices[deviceIndex].getInfo(CL_DEVICE_GLOBAL_MEM_SIZE, &memorySize); printf("OpenCL Memory size %ld MB\n", memorySize/1024/1024); devices[deviceIndex].getInfo(CL_DEVICE_MAX_MEM_ALLOC_SIZE, &maxAllocMemSize); printf("OpenCL Max size of memory object allocation %ld MB\n", maxAllocMemSize/1024/1024); devices[deviceIndex].getInfo(CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, &maxConstantBufferSize); printf("OpenCL Max constant buffer size %ld kB\n", maxConstantBufferSize/1024); printf("OpenCL Constant buffer used %ld kB\n", sizeof(sClInConstants)/1024); char text[1000]; sprintf(text,"OpenCL platform by: %s", platformVendor.c_str()); gtk_label_set_text(GTK_LABEL(Interface.label_OpenClPlatformBy), text); sprintf(text,"GPU frequency: %d MHz", maxClockFrequency); gtk_label_set_text(GTK_LABEL(Interface.label_OpenClMaxClock), text); sprintf(text,"GPU memory: %ld MB", memorySize/1024/1024); gtk_label_set_text(GTK_LABEL(Interface.label_OpenClMemorySize), text); sprintf(text,"Number of computing units: %d", numberOfComputeUnits); gtk_label_set_text(GTK_LABEL(Interface.label_OpenClComputingUnits), text); clDir = std::string(sharedDir) + "cl/"; } void CclSupport::InitFractal(void) { cl_int err; char text[1000]; ready = false; char progressText[1000]; sprintf(progressText, "OpenCL - initialization"); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 0.0); while (gtk_events_pending()) gtk_main_iteration(); if(!customFormulas) { customFormulas = new CCustomFormulas(data_directory); } useCPU = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLGPUCPU)); deviceIndex = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLDeviceIndex)); platformIndex = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLPlatformIndex)); memoryLimitByUser = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLMaxMem))) * 1024 * 1024; std::string strFormula = "mandelbulb"; if(lastFormula == trig_optim) strFormula = "mandelbulb"; if(lastFormula == trig_DE) strFormula = "mandelbulb2"; if(lastFormula == tglad) { if(lastFractal.mandelbox.rotEnabled) strFormula = "mandelbox_full"; else strFormula = "mandelbox"; } if(lastFormula == menger_sponge) strFormula = "mengersponge"; if(lastFormula == hypercomplex) strFormula = "hypercomplex"; if(lastFormula == quaternion) strFormula = "quaternion"; if(lastFormula == kaleidoscopic) strFormula = "kaleidoscopic"; if(lastFormula == xenodreambuie) strFormula = "xenodreambuie"; std::string strFileEngine = clDir; int engineNumber = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLEngine)); if (engineNumber == 0) strFileEngine += "cl_engine_fast.cl"; else if(engineNumber == 1) strFileEngine += "cl_engine.cl"; else if(engineNumber == 2) strFileEngine += "cl_engine_full.cl"; else if(engineNumber == 3) strFileEngine += "cl_engine_noDE.cl"; std::ifstream fileEngine(strFileEngine.c_str()); if(!checkErr(fileEngine.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileEngine).c_str())) return; std::string strFilePrimitives = clDir + "cl_primitives.cl"; std::ifstream filePrimitives(strFilePrimitives.c_str()); if(!checkErr(filePrimitives.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFilePrimitives).c_str())) return; std::string strFileDistance = clDir; if(lastFormula == ocl_custom) { switch ((enumOCLDEMode) lastFractal.customOCLFormulaDEMode) { case calculated: { strFileDistance += "cl_distance.cl"; break; } case deltaDE: { strFileDistance += "cl_distance_deltaDE.cl"; break; } case noDE: { strFileDistance += "cl_distance_noDE.cl"; break; } } } else { if(lastFormula == xenodreambuie || lastFormula == hypercomplex) strFileDistance += "cl_distance_deltaDE.cl"; else strFileDistance += "cl_distance.cl"; } std::ifstream fileDistance(strFileDistance.c_str()); if(!checkErr(fileDistance.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileDistance).c_str())) return; std::string strFileFormulaBegin; if(lastFractal.juliaMode) strFileFormulaBegin = clDir + "cl_formulaBegin" + "Julia" + ".cl"; else strFileFormulaBegin = clDir + "cl_formulaBegin" + ".cl"; std::ifstream fileFormulaBegin(strFileFormulaBegin.c_str()); if(!checkErr(fileFormulaBegin.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileFormulaBegin).c_str())) return; std::string strFileFormulaInit; std::string strFileFormula; if(lastFormula == ocl_custom) { customFormulas->GetActual(&strFormula, &strFileFormula, &strFileFormulaInit); } else { strFileFormulaInit = clDir + "cl_" + strFormula + "Init.cl"; strFileFormula = clDir + "cl_" + strFormula + ".cl"; } std::ifstream fileFormulaInit(strFileFormulaInit.c_str()); if(!checkErr(fileFormulaInit.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileFormulaInit).c_str())) return; std::string strFileFormulaFor = clDir + "cl_formulaFor.cl"; std::ifstream fileFormulaFor(strFileFormulaFor.c_str()); if(!checkErr(fileFormulaFor.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileFormulaFor).c_str())) return; std::ifstream fileFormula(strFileFormula.c_str()); if(!checkErr(fileFormula.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileFormula).c_str())) return; std::string strFileFormulaEnd = clDir + "cl_formulaEnd.cl"; std::ifstream fileFormulaEnd(strFileFormulaEnd.c_str()); if(!checkErr(fileFormulaEnd.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileFormulaEnd).c_str())) return; std::string progPathHeader("#define INCLUDE_PATH_CL_DATA \""); #ifdef WIN32 progPathHeader += std::string(sharedDir) + "cl\\mandelbulber_cl_data.h\""; #else progPathHeader += std::string(sharedDir) + "cl/mandelbulber_cl_data.h\""; #endif printf("OpenCL progHeader: %s\n", progPathHeader.c_str()); std::string progEngine(std::istreambuf_iterator(fileEngine), (std::istreambuf_iterator())); std::string progPrimitives(std::istreambuf_iterator(filePrimitives), (std::istreambuf_iterator())); std::string progDistance(std::istreambuf_iterator(fileDistance), (std::istreambuf_iterator())); std::string progFormulaBegin(std::istreambuf_iterator(fileFormulaBegin), (std::istreambuf_iterator())); std::string progFormulaInit(std::istreambuf_iterator(fileFormulaInit), (std::istreambuf_iterator())); std::string progFormulaFor(std::istreambuf_iterator(fileFormulaFor), (std::istreambuf_iterator())); std::string progFormula(std::istreambuf_iterator(fileFormula), (std::istreambuf_iterator())); std::string progFormulaEnd(std::istreambuf_iterator(fileFormulaEnd), (std::istreambuf_iterator())); cl::Program::Sources sources; sources.push_back(std::make_pair(progPathHeader.c_str(), progPathHeader.length())); sources.push_back(std::make_pair(progEngine.c_str(), progEngine.length())); sources.push_back(std::make_pair(progPrimitives.c_str(), progPrimitives.length())); sources.push_back(std::make_pair(progDistance.c_str(), progDistance.length())); sources.push_back(std::make_pair(progFormulaBegin.c_str(), progFormulaBegin.length())); sources.push_back(std::make_pair(progFormulaInit.c_str(), progFormulaInit.length())); sources.push_back(std::make_pair(progFormulaFor.c_str(), progFormulaFor.length())); sources.push_back(std::make_pair(progFormula.c_str(), progFormula.length())); sources.push_back(std::make_pair(progFormulaEnd.c_str(), progFormulaEnd.length()+1)); printf("OpenCL Number of loaded sources %ld\n", sources.size()); program = new cl::Program(*context, sources, &err); if(!checkErr(err, "Program()")) return; //program->getInfo(CL_PROGRAM_SOURCE, ) //std::cout << "Program source:\t" << program->getInfo() << std::endl; #ifdef WIN32 SetCurrentDirectory(clDir.c_str()); #else chdir(clDir.c_str()); #endif std::string buildParams; buildParams = "-w -cl-single-precision-constant -cl-denorms-are-zero "; if(lastParams.DOFEnabled && lastParams.DOFmethod == 1) buildParams += "-D_DOFEnabled "; if(lastParams.slowAmbientOcclusionEnabled) buildParams += "-D_SlowAOEnabled "; if(lastParams.fakeLightsEnabled) buildParams += "-D_orbitTrapsEnabled "; if(lastParams.auxLightNumber > 0) buildParams += "-D_AuxLightsEnabled "; if(lastParams.texturedBackground) buildParams += "-D_texturedBackground "; if(lastFractal.limitsEnabled) buildParams += "-D_LimitsEnabled "; if(lastFractal.primitives.planeEnable) buildParams += "-D_primitivePlane "; if(lastFractal.primitives.boxEnable) buildParams += "-D_primitiveBox "; if(lastFractal.primitives.invertedBoxEnable) buildParams += "-D_primitiveInvertedBox "; if(lastFractal.primitives.sphereEnable) buildParams += "-D_primitiveSphere "; if(lastFractal.primitives.invertedSphereEnable) buildParams += "-D_primitiveInvertedSphere "; if(lastFractal.primitives.waterEnable) buildParams += "-D_primitiveWater "; printf("OpenCL build params:%s\n", buildParams.c_str()); err = program->build(devices, buildParams.c_str()); std::stringstream errorMessageStream; errorMessageStream << "OpenCL Build log:\t" << program->getBuildInfo(devices[deviceIndex]) << std::endl; std::string buildLogText; buildLogText = errorMessageStream.str(); std::cout << buildLogText; if(!checkErr(err, "Program::build()")) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Program build log:"); GtkWidget *messageArea = gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(dialog)); GtkTextBuffer *textBuffer = gtk_text_buffer_new(NULL); gtk_text_buffer_set_text(textBuffer, buildLogText.c_str(), buildLogText.length()); GtkWidget *textView = gtk_text_view_new_with_buffer(textBuffer); gtk_box_pack_start(GTK_BOX(messageArea), textView, false, false, 1); gtk_widget_show(textView); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } printf("OpenCL program built done\n"); #ifdef WIN32 SetCurrentDirectory(data_directory); #else chdir(data_directory); #endif kernel = new cl::Kernel(*program, "fractal3D", &err); if(!checkErr(err, "Kernel::Kernel()")) return; printf("OpenCL kernel opened\n"); kernel->getWorkGroupInfo(devices[deviceIndex], CL_KERNEL_WORK_GROUP_SIZE, &workGroupSize); printf("OpenCL workgroup size: %ld\n", workGroupSize); int pixelsPerJob = workGroupSize * numberOfComputeUnits; steps = height * width / pixelsPerJob + 1; stepSize = (width * height / steps / workGroupSize + 1) * workGroupSize; printf("OpenCL Job size: %d\n", stepSize); buffSize = stepSize * sizeof(sClPixel); rgbbuff = new sClPixel[buffSize]; reflectBufferSize = sizeof(sClReflect) * 10 * stepSize; reflectBuffer = new sClReflect[reflectBufferSize]; auxReflectBuffer = new cl::Buffer(*context, CL_MEM_READ_WRITE, reflectBufferSize, NULL, &err); if(!checkErr(err, "Buffer::Buffer(*context, CL_MEM_READ_WRITE, reflectBufferSize, NULL, &err)")) return; inCLConstBuffer1 = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(sClInConstants), constantsBuffer1, &err); if(!checkErr(err, "Buffer::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, sizeof(sClInConstants), constantsBuffer1, &err)")) return; inCLBuffer1 = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(sClInBuff), inBuffer1, &err); if(!checkErr(err, "Buffer::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, sizeof(sClInBuff), inBuffer1, &err)")) return; outCL = new cl::Buffer(*context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, buffSize,rgbbuff,&err); if(!checkErr(err, "*context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, buffSize, rgbbuff, &err")) return; printf("OpenCL buffers created\n"); queue = new cl::CommandQueue(*context, devices[deviceIndex], 0, &err); if(!checkErr(err, "CommandQueue::CommandQueue()"))return; printf("OpenCL command queue prepared\n"); sprintf(progressText, "OpenCL - ready"); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); sprintf(text,"Max workgroup size: %d", maxMaxWorkGroupSize[0]); gtk_label_set_text(GTK_LABEL(Interface.label_OpenClMaxWorkgroup), text); sprintf(text,"Actual workgroup size: %ld", workGroupSize); gtk_label_set_text(GTK_LABEL(Interface.label_OpenClWorkgroupSize), text); ready = true; } void CclSupport::SetParams(sClInBuff *inBuff, sClInConstants *inConstants, enumFractalFormula formula) { if(inConstants->fractal.juliaMode != lastFractal.juliaMode) recompileRequest = true; if(formula != lastFormula) recompileRequest = true; if(inConstants->params.DOFEnabled != lastParams.DOFEnabled) recompileRequest = true; if(inConstants->params.slowAmbientOcclusionEnabled != lastParams.slowAmbientOcclusionEnabled) recompileRequest = true; if(inConstants->params.auxLightNumber != lastParams.auxLightNumber) recompileRequest = true; if(inConstants->fractal.mandelbox.rotEnabled != lastFractal.mandelbox.rotEnabled) recompileRequest = true; if(inConstants->params.fakeLightsEnabled != lastParams.fakeLightsEnabled) recompileRequest = true; if(inConstants->fractal.customOCLFormulaDEMode != lastFractal.customOCLFormulaDEMode) recompileRequest = true; if(inConstants->fractal.limitsEnabled != lastFractal.limitsEnabled) recompileRequest = true; if(inConstants->fractal.primitives.planeEnable != lastFractal.primitives.planeEnable) recompileRequest = true; if(inConstants->fractal.primitives.boxEnable != lastFractal.primitives.boxEnable) recompileRequest = true; if(inConstants->fractal.primitives.invertedBoxEnable != lastFractal.primitives.invertedBoxEnable) recompileRequest = true; if(inConstants->fractal.primitives.sphereEnable != lastFractal.primitives.sphereEnable) recompileRequest = true; if(inConstants->fractal.primitives.invertedSphereEnable != lastFractal.primitives.invertedSphereEnable) recompileRequest = true; if(inConstants->fractal.primitives.waterEnable != lastFractal.primitives.waterEnable) recompileRequest = true; if(inConstants->params.texturedBackground != lastParams.texturedBackground) recompileRequest = true; if(inConstants->params.DOFmethod != lastParams.DOFmethod) recompileRequest = true; int engineNumber = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboOpenCLEngine)); if(engineNumber != lastEngineNumber) recompileRequest = true; lastEngineNumber = engineNumber; lastParams = inConstants->params; lastFractal = inConstants->fractal; lastFormula = formula; } void CclSupport::Recompile(void) { Disable(); Enable(); InitDevice(); InitFractal(); if(ready) { SSAOPrepare(); DOFPrepare(); } recompileRequest = false; } void CclSupport::Render(cImage *image, GtkWidget *outputDarea) { cl_int err; if (recompileRequest) { Recompile(); } if (ready) { stepSize = workGroupSize; int workGroupSizeMultiplier = 1; double startTime = real_clock(); double lastTime = startTime; double lastTimeProcessing = startTime; double lastProcessingTime = 1.0; if(backgroundImage2D) delete backgroundImage2D; backgroundImage2D = NULL; if(lastParams.texturedBackground) PrepareBackgroundTexture(backgroundTextureSource); backgroundImage2D = new cl::Image2D(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, cl::ImageFormat(CL_RGBA, CL_UNORM_INT8), backgroundImage2DWidth, backgroundImage2DHeight, backgroundImage2DWidth * sizeof(cl_uchar4), backgroungImageBuffer, &err); if(!checkErr(err, "cl::Image2D(...backgroundImage...)")) return; int nDof = 1; if (lastParams.DOFEnabled && lastParams.DOFmethod == 1) nDof = 256; size_t sizeOfPixel = sizeof(sClPixel) + sizeof(sClReflect) * 10; //10 because max nuber of reflections is 10 size_t jobSizeLimit; if (maxAllocMemSize > 0) { if (maxAllocMemSize * 0.75 < memoryLimitByUser) { jobSizeLimit = maxAllocMemSize / sizeOfPixel * 0.75; } else { jobSizeLimit = memoryLimitByUser / sizeOfPixel; } } else { jobSizeLimit = memoryLimitByUser / sizeOfPixel; } srand((unsigned int) ((double) clock() * 1000.0 / CLOCKS_PER_SEC)); for (int dofLoop = 1; dofLoop <= nDof; dofLoop++) { for (int pixelIndex = 0; pixelIndex < width * height; pixelIndex += stepSize) { if(outCL) delete outCL; outCL = NULL; if(rgbbuff) delete[] rgbbuff; rgbbuff = NULL; if(auxReflectBuffer) delete auxReflectBuffer; auxReflectBuffer = NULL; if(reflectBuffer) delete[] reflectBuffer; reflectBuffer = NULL; double processingCycleTime = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLProcessingCycleTime))); if (processingCycleTime < 0.02) processingCycleTime = 0.02; workGroupSizeMultiplier *= processingCycleTime / lastProcessingTime; //printf("job size limit: %ld\n", jobSizeLimit); int pixelsLeft = width * height - pixelIndex; int maxWorkGroupSizeMultiplier = pixelsLeft / workGroupSize; if (workGroupSizeMultiplier > maxWorkGroupSizeMultiplier) workGroupSizeMultiplier = maxWorkGroupSizeMultiplier; if (workGroupSizeMultiplier * workGroupSize > jobSizeLimit) workGroupSizeMultiplier = jobSizeLimit / workGroupSize; if (workGroupSizeMultiplier < numberOfComputeUnits) workGroupSizeMultiplier = numberOfComputeUnits; constantsBuffer1->params.randomSeed = rand(); stepSize = workGroupSize * workGroupSizeMultiplier; buffSize = stepSize * sizeof(sClPixel); rgbbuff = new sClPixel[buffSize]; outCL = new cl::Buffer(*context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, buffSize, rgbbuff, &err); char errorText[1000]; sprintf(errorText, "Buffer::Buffer(*context, CL_MEM_WRITE_ONLY | CL_MEM_USE_HOST_PTR, buffSize, rgbbuff, &err), buffSize = %ld", buffSize); if (!checkErr(err, errorText)) return; reflectBufferSize = sizeof(sClReflect) * 10 * stepSize; //printf("reflectBuffer size = %d\n", reflectBufferSize); reflectBuffer = new sClReflect[10 * stepSize]; auxReflectBuffer = new cl::Buffer(*context, CL_MEM_READ_WRITE, reflectBufferSize, NULL, &err); sprintf(errorText, "Buffer::Buffer(*context, CL_MEM_READ_WRITE, reflectBufferSize, NULL, &err), reflectBufferSize = %ld", reflectBufferSize); if (!checkErr(err, errorText)) return; size_t usedGPUdMem = sizeOfPixel * stepSize; err = kernel->setArg(0, *outCL); err = kernel->setArg(1, *inCLBuffer1); err = kernel->setArg(2, *inCLConstBuffer1); err = kernel->setArg(3, *auxReflectBuffer); err = kernel->setArg(4, *backgroundImage2D); err = kernel->setArg(5, pixelIndex); //printf("size of inputs: %ld\n", sizeof(lastParams) + sizeof(lastFractal)); err = queue->enqueueWriteBuffer(*inCLBuffer1, CL_TRUE, 0, sizeof(sClInBuff), inBuffer1); sprintf(errorText, "ComamndQueue::enqueueWriteBuffer(inCLBuffer1), used GPU mem = %ld", usedGPUdMem); if (!checkErr(err, errorText)) return; err = queue->finish(); if (!checkErr(err, "ComamndQueue::finish() - CLBuffer")) return; err = queue->enqueueWriteBuffer(*inCLConstBuffer1, CL_TRUE, 0, sizeof(sClInConstants), constantsBuffer1); if (!checkErr(err, "ComamndQueue::enqueueWriteBuffer(inCLConstBuffer1)")) return; err = queue->finish(); if (!checkErr(err, "ComamndQueue::finish() - ConstBuffer")) return; err = queue->enqueueNDRangeKernel(*kernel, cl::NullRange, cl::NDRange(stepSize), cl::NDRange(workGroupSize)); sprintf(errorText, "ComamndQueue::nqueueNDRangeKernel(jobSize), jobSize = %d", stepSize); if (!checkErr(err, errorText)) return; err = queue->finish(); if (!checkErr(err, "ComamndQueue::finish() - Kernel")) return; err = queue->enqueueReadBuffer(*outCL, CL_TRUE, 0, buffSize, rgbbuff); if (!checkErr(err, "ComamndQueue::enqueueReadBuffer()")) return; err = queue->finish(); if (!checkErr(err, "ComamndQueue::finish() - ReadBuffer")) return; unsigned int offset = pixelIndex; for (unsigned int i = 0; i < stepSize; i++) { unsigned int a = offset + i; sClPixel pixelCl = rgbbuff[i]; sRGBfloat pixel = { pixelCl.R, pixelCl.G, pixelCl.B }; sRGB8 color = {pixelCl.colR, pixelCl.colG, pixelCl.colB}; unsigned short opacity = pixelCl.opacity; unsigned short alpha = pixelCl.alpha; int x = a % width; int y = a / width; if (lastParams.DOFEnabled && lastParams.DOFmethod == 1) { sRGBfloat oldPixel = image->GetPixelImage(x, y); sRGBfloat newPixel; newPixel.R = oldPixel.R * (1.0 - 1.0 / dofLoop) + pixel.R * (1.0 / dofLoop); newPixel.G = oldPixel.G * (1.0 - 1.0 / dofLoop) + pixel.G * (1.0 / dofLoop); newPixel.B = oldPixel.B * (1.0 - 1.0 / dofLoop) + pixel.B * (1.0 / dofLoop); image->PutPixelImage(x, y, newPixel); image->PutPixelZBuffer(x, y, rgbbuff[i].zBuffer); unsigned short oldAlpha = image->GetPixelAlpha(x, y); unsigned short newAlpha = (double)oldAlpha * (1.0 - 1.0 / dofLoop) + alpha * (1.0 / dofLoop); image->PutPixelAlpha(x, y, newAlpha); } else { image->PutPixelImage(x, y, pixel); image->PutPixelZBuffer(x, y, rgbbuff[i].zBuffer); image->PutPixelColour(x, y, color); image->PutPixelOpacity(x, y, opacity); image->PutPixelAlpha(x, y, alpha); } } char progressText[1000]; double percent; if (lastParams.DOFEnabled && lastParams.DOFmethod == 1) { percent = (double) (dofLoop - 1.0) / nDof + (double) (pixelIndex + stepSize) / (width * height) / nDof; } else { percent = (double) (pixelIndex + stepSize) / (width * height); } if (percent > 1.0) percent = 1.0; double time = real_clock() - startTime; double time_to_go = (1.0 - percent) * time / percent; int togo_time_s = (int) time_to_go % 60; int togo_time_min = (int) (time_to_go / 60) % 60; int togo_time_h = time_to_go / 3600; int time_s = (int) time % 60; int time_min = (int) (time / 60) % 60; int time_h = time / 3600; sprintf(progressText, "OpenCL - rendering. Done %.1f%%, to go %dh%dm%ds, elapsed %dh%dm%ds, used GPU mem %ld MB", percent * 100.0, togo_time_h, togo_time_min, togo_time_s, time_h, time_min, time_s, usedGPUdMem / 1024 / 1024); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), percent); lastProcessingTime = time - lastTimeProcessing; lastTimeProcessing = time; if (real_clock() - lastTime > 30.0) { if (image->IsPreview()) { image->CompileImage(); image->ConvertTo8bit(); image->UpdatePreview(); image->RedrawInWidget(outputDarea); while (gtk_events_pending()) gtk_main_iteration(); } lastTime = real_clock(); } if (programClosed) break; while (gtk_events_pending()) gtk_main_iteration(); } if (programClosed) break; } } if(outCL) delete outCL; outCL = NULL; if(rgbbuff) delete[] rgbbuff; rgbbuff = NULL; if(auxReflectBuffer) delete auxReflectBuffer; auxReflectBuffer = NULL; if(reflectBuffer) delete[] reflectBuffer; reflectBuffer = NULL; if(backgroundImage2D) delete backgroundImage2D; backgroundImage2D = NULL; //gdk_draw_rgb_image(outputDarea->window, renderWindow.drawingArea->style->fg_gc[GTK_STATE_NORMAL], 0, 0, clSupport->GetWidth(), clSupport->GetHeight(), GDK_RGB_DITHER_NONE, // clSupport->GetRgbBuff(), clSupport->GetWidth() * 3); } void CclSupport::Enable(void) { if(ready) { enabled = true; } } void CclSupport::Disable(void) { if(context) delete context; context = NULL; if(rgbbuff) delete[] rgbbuff; rgbbuff = NULL; if(outCL) delete outCL; outCL = NULL; if(program) delete program; program = NULL; if(kernel) delete kernel; kernel = NULL; if(queue) delete queue; queue = NULL; if (inCLBuffer1)delete inCLBuffer1; inCLBuffer1 = NULL; if(inCLConstBuffer1) delete inCLConstBuffer1; inCLConstBuffer1 = NULL; if(reflectBuffer) delete[] reflectBuffer; reflectBuffer = NULL; if(backgroungImageBuffer) delete[] backgroungImageBuffer; backgroungImageBuffer = NULL; if(backgroundImage2D) delete backgroundImage2D; backgroundImage2D = NULL; backgroundImage2DHeight = 10; backgroundImage2DWidth = 10; backgroungImageBuffer = new cl_uchar4[10*10]; if(programSSAO) delete programSSAO; programSSAO = NULL; if(kernelSSAO) delete kernelSSAO; kernelSSAO = NULL; if(queueSSAO) delete queueSSAO; queueSSAO = NULL; SSAOprepared = false; if(programDOF) delete programDOF; programDOF = NULL; if(kernelDOF) delete kernelDOF; kernelDOF = NULL; if(queueDOF) delete queueDOF; queueDOF = NULL; DOFprepared = false; enabled = false; ready = false; } void CclSupport::SetSize(int w, int h) { //if(width != w || height != h) recompileRequest = true; width = w; height = h; } void CclSupport::PrepareBackgroundTexture(cTexture *texture) { int width = texture->Width(); int height = texture->Height(); if(backgroungImageBuffer) delete[] backgroungImageBuffer; backgroungImageBuffer = new cl_uchar4[width * height]; backgroundImage2DWidth = width; backgroundImage2DHeight = height; for(int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { sRGB8 pixel = texture->FastPixel(x,y); backgroungImageBuffer[x + y * width].s0 = pixel.R; backgroungImageBuffer[x + y * width].s1 = pixel.G; backgroungImageBuffer[x + y * width].s2 = pixel.B; backgroungImageBuffer[x + y * width].s3 = CL_UCHAR_MAX; } } } void CclSupport::SSAOPrepare(void) { if(!SSAOprepared) { cl_int err; std::string strFileSSAO = clDir + "cl_SSAO.cl"; std::ifstream fileSSAO(strFileSSAO.c_str()); if(!checkErr(fileSSAO.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileSSAO).c_str())) return; std::string progSSAO(std::istreambuf_iterator(fileSSAO), (std::istreambuf_iterator())); cl::Program::Sources sources; sources.push_back(std::make_pair(progSSAO.c_str(), progSSAO.length())); programSSAO = new cl::Program(*context, sources, &err); if(!checkErr(err, "ProgramSSAO()")) return; std::string buildParams = "-w -cl-single-precision-constant -cl-denorms-are-zero "; err = programSSAO->build(devices, buildParams.c_str()); std::stringstream errorMessageStream; errorMessageStream << "OpenCL Build log:\t" << programSSAO->getBuildInfo(devices[deviceIndex]) << std::endl; std::string buildLogText; buildLogText = errorMessageStream.str(); std::cout << buildLogText; if(!checkErr(err, "ProgramSSAO::build()")) return; printf("OpenCL SSAO program built done\n"); kernelSSAO = new cl::Kernel(*programSSAO, "SSAO", &err); if(!checkErr(err, "Kernel::Kernel()")) return; printf("OpenCL SSAO kernel opened\n"); queueSSAO = new cl::CommandQueue(*context, devices[deviceIndex], 0, &err); if(!checkErr(err, "CommandQueueSSAO::CommandQueue()"))return; printf("OpenCL SSAO command queue prepared\n"); } } void CclSupport::DOFPrepare(void) { if(!DOFprepared) { cl_int err; std::string strFileDOF = clDir + "cl_DOF.cl"; std::ifstream fileDOF(strFileDOF.c_str()); if(!checkErr(fileDOF.is_open() ? CL_SUCCESS : -1, ("Can't open file:" + strFileDOF).c_str())) return; std::string progDOF(std::istreambuf_iterator(fileDOF), (std::istreambuf_iterator())); cl::Program::Sources sources; sources.push_back(std::make_pair(progDOF.c_str(), progDOF.length())); programDOF = new cl::Program(*context, sources, &err); if(!checkErr(err, "ProgramDOF()")) return; std::string buildParams = "-w -cl-single-precision-constant -cl-denorms-are-zero "; err = programDOF->build(devices, buildParams.c_str()); std::stringstream errorMessageStream; errorMessageStream << "OpenCL Build log:\t" << programDOF->getBuildInfo(devices[deviceIndex]) << std::endl; std::string buildLogText; buildLogText = errorMessageStream.str(); std::cout << buildLogText; if(!checkErr(err, "ProgramDOF::build()")) return; printf("OpenCL DOF program built done\n"); kernelDOF = new cl::Kernel(*programDOF, "DOF", &err); if(!checkErr(err, "Kernel::Kernel()")) return; printf("OpenCL DOF kernel opened\n"); queueDOF = new cl::CommandQueue(*context, devices[deviceIndex], 0, &err); if(!checkErr(err, "CommandQueueDOF::CommandQueue()"))return; printf("OpenCL DOF command queue prepared\n"); } } void CclSupport::SSAORender(cImage *image, GtkWidget *outputDarea) { cl_int err; char errorText[1000]; char progressText[1000]; sprintf(progressText, "Rendering Screen Space Ambient Occlussion with OpenCL"); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); while (gtk_events_pending()) gtk_main_iteration(); float *zBuffer = image->GetZBufferPtr(); size_t zBufferSize = image->GetZBufferSize(); size_t size = width * height; size_t usedMemForSSAO = (sizeof(cl_ushort3)*size + sizeof(cl_uchar3)*size + sizeof(cl_ushort)*size + zBufferSize) / 1024 / 1024; printf("GPU memory for SSAO effect: %ld MB\n\n", usedMemForSSAO); cl::Buffer *zBufferCl = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, zBufferSize, zBuffer, &err); sprintf(errorText, "zBufferCl = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, zBufferSize, zBuffer, &err)"); if (!checkErr(err, errorText)) return; cl_ushort3 *imageBuffer = new cl_ushort3[size]; cl_uchar3 *colorBuffer = new cl_uchar3[size]; cl_ushort *opacityBuffer = new cl_ushort[size]; sRGB16 *image16 = image->GetImage16Ptr(); sRGB8 *imageColour = image->GetColorPtr(); unsigned short *imageOpacity = image->GetOpacityPtr(); for (size_t i=0; i < size; i++) { sRGB16 pixel = image16[i]; cl_ushort3 pixelCl; pixelCl.s0 = pixel.R; pixelCl.s1 = pixel.G; pixelCl.s2 = pixel.B; imageBuffer[i] = pixelCl; sRGB8 color = imageColour[i]; cl_uchar3 colorCl; colorCl.s0 = color.R; colorCl.s1 = color.G; colorCl.s2 = color.B; colorBuffer[i] = colorCl; opacityBuffer[i] = imageOpacity[i]; } cl::Buffer *imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(cl_ushort3)*size, imageBuffer, &err); sprintf(errorText, "imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(cl_ushort3)*size, imageBuffer, &err)"); if (!checkErr(err, errorText)) return; cl::Buffer *colorBufferCl = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_uchar3)*size, colorBuffer, &err); sprintf(errorText, "imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(cl_ushort3)*size, imageBuffer, &err)"); if (!checkErr(err, errorText)) return; cl::Buffer *opacityBufferCl = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(cl_ushort)*size, opacityBuffer, &err); sprintf(errorText, "imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(cl_ushort3)*size, imageBuffer, &err)"); if (!checkErr(err, errorText)) return; err = queueSSAO->enqueueWriteBuffer(*zBufferCl, CL_TRUE, 0, zBufferSize, zBuffer); sprintf(errorText, "ComamndQueueSSAO(zBuffer)"); if (!checkErr(err, errorText)) return; err = queueSSAO->enqueueWriteBuffer(*imageBufferCl, CL_TRUE, 0, sizeof(cl_ushort3)*size, imageBuffer); sprintf(errorText, "ComamndQueueSSAO(imageBuffer)"); if (!checkErr(err, errorText)) return; err = queueSSAO->enqueueWriteBuffer(*opacityBufferCl, CL_TRUE, 0, sizeof(cl_ushort)*size, opacityBuffer); sprintf(errorText, "ComamndQueueSSAO(opacityBuffer)"); if (!checkErr(err, errorText)) return; sClParamsSSAO paramsSSAO; paramsSSAO.width = width; paramsSSAO.height = height; paramsSSAO.fov = lastParams.persp; paramsSSAO.quality = lastParams.SSAOquality; paramsSSAO.intensity = lastParams.ambientOcclusionIntensity; err = kernelSSAO->setArg(0, *imageBufferCl); err = kernelSSAO->setArg(1, *zBufferCl); err = kernelSSAO->setArg(2, *colorBufferCl); err = kernelSSAO->setArg(3, *opacityBufferCl); err = kernelSSAO->setArg(4, paramsSSAO); stepSize = workGroupSize; int workGroupSizeMultiplier = 1; double startTime = real_clock(); double lastTimeProcessing = startTime; double lastProcessingTime = 1.0; for (int pixelIndex = 0; pixelIndex < width * height; pixelIndex += stepSize) { double processingCycleTime = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLProcessingCycleTime))); if (processingCycleTime < 0.02) processingCycleTime = 0.02; double factor = processingCycleTime / lastProcessingTime; if (factor > 2.0) factor = 2.0; workGroupSizeMultiplier *= factor; //printf("job size limit: %ld\n", jobSizeLimit); int pixelsLeft = width * height - pixelIndex; int maxWorkGroupSizeMultiplier = pixelsLeft / workGroupSize; if (workGroupSizeMultiplier > maxWorkGroupSizeMultiplier) workGroupSizeMultiplier = maxWorkGroupSizeMultiplier; if (workGroupSizeMultiplier > width * height / workGroupSize / 8) workGroupSizeMultiplier = width * height / workGroupSize / 8; if (workGroupSizeMultiplier < numberOfComputeUnits) workGroupSizeMultiplier = numberOfComputeUnits; stepSize = workGroupSize * workGroupSizeMultiplier; //calculation of stepSize to be multiplied workGroupSize size_t limitedWorkgroupSize = workGroupSize; if (stepSize > pixelsLeft) { int mul = pixelsLeft / workGroupSize; if (mul > 0) { stepSize = mul * workGroupSize; } else { //in this case will be limited workGroupSize stepSize = pixelsLeft; limitedWorkgroupSize = pixelsLeft; } } err = queueSSAO->enqueueNDRangeKernel(*kernelSSAO, cl::NDRange(pixelIndex), cl::NDRange(stepSize), cl::NDRange(limitedWorkgroupSize)); sprintf(errorText, "ComamndQueueSSAO::nqueueNDRangeKernel(size)"); if (!checkErr(err, errorText)) return; err = queueSSAO->finish(); if (!checkErr(err, "ComamndQueueSSAO::finish() - Kernel")) return; double time = real_clock() - startTime; char progressText[1000]; double percent; percent = (double) (pixelIndex + stepSize) / (width * height); double time_to_go = (1.0 - percent) * time / percent; int togo_time_s = (int) time_to_go % 60; int togo_time_min = (int) (time_to_go / 60) % 60; int togo_time_h = time_to_go / 3600; int time_s = (int) time % 60; int time_min = (int) (time / 60) % 60; int time_h = time / 3600; sprintf(progressText, "SSAO OpenCL - rendering. Done %.1f%%, to go %dh%dm%ds, elapsed %dh%dm%ds", percent * 100.0, togo_time_h, togo_time_min, togo_time_s, time_h, time_min, time_s); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), percent); if (programClosed) break; while (gtk_events_pending()) gtk_main_iteration(); lastProcessingTime = time - lastTimeProcessing; lastTimeProcessing = time; } err = queueSSAO->enqueueReadBuffer(*imageBufferCl, CL_TRUE, 0, sizeof(cl_ushort3)*size, imageBuffer); if (!checkErr(err, "ComamndQueueSSAO::enqueueReadBuffer()")) return; err = queueSSAO->finish(); for (size_t i=0; i < size; i++) { sRGB16 pixel; cl_ushort3 pixelCl = imageBuffer[i]; pixel.R = pixelCl.s0; pixel.G = pixelCl.s1; pixel.B = pixelCl.s2; image16[i] = pixel; } sprintf(progressText, "Rendering Screen Space Ambient Occlussion done"); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); while (gtk_events_pending()) gtk_main_iteration(); delete zBufferCl; delete[] imageBuffer; delete[] colorBuffer; delete[] opacityBuffer; delete imageBufferCl; delete colorBufferCl; delete opacityBufferCl; } void CclSupport::DOFRender(cImage *image, GtkWidget *outputDarea) { cl_int err; char errorText[1000]; cl_ushort4 *in_image = new cl_ushort4[width * height]; cl_ushort4 *out_image = new cl_ushort4[width * height]; size_t imageSize = sizeof(cl_ushort4) * width * height; sSortZ *temp_sort = new sSortZ [width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { int ptr = x + y * width; sRGB16 pixel16 = image->GetPixelImage16(x, y); in_image[ptr].s0 = pixel16.R; in_image[ptr].s1 = pixel16.G; in_image[ptr].s2 = pixel16.B; in_image[ptr].s3 = image->GetPixelAlpha(x, y); temp_sort[ptr].z = image->GetPixelZBuffer(x, y); temp_sort[ptr].i = ptr; } } memcpy(out_image, in_image, imageSize); if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect. Sorting zBuffer"); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 0.0); while (gtk_events_pending()) gtk_main_iteration(); } //------------ CPU part -------------- QuickSortZBuffer(temp_sort, 1, height * width - 1); if (!noGUI && image->IsPreview()) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect. Randomizing zBuffer"); while (gtk_events_pending()) gtk_main_iteration(); } //Randomize Z-buffer int imgSize = height * width; double neutral = lastParams.DOFFocus; double deep = lastParams.DOFRadius; for (int i = imgSize - 1; i >= 0; i--) { sSortZ temp; temp = temp_sort[i]; double z1 = temp.z; double size1 = (z1 - neutral) / z1 * deep; int randomStep = i; bool done = false; int ii; do { ii = i - Random(randomStep); if (ii <= 0) ii = 0; sSortZ temp2 = temp_sort[ii]; double z2 = temp2.z; double size2 = (z2 - neutral) / z2 * deep; if (size1 == 0 && size2 == 0) done = true; if (size1 * size2 > 0) { double sizeCompare; if (size1 > 0) { sizeCompare = size2 / size1; } else { sizeCompare = size1 / size2; } if (sizeCompare > 0.7) { done = true; } else { done = false; } } else { done = false; } randomStep = randomStep * 0.7 - 1; if (randomStep <= 0) done = true; } while (!done); temp_sort[i] = temp_sort[ii]; temp_sort[ii] = temp; } //------------------ GPU part ------------------ gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect with OpenCL"); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 0.0); while (gtk_events_pending()) gtk_main_iteration(); size_t usedMemForDOF = (imageSize + imageSize + sizeof(sSortZ) * width * height) / 1024 / 1024; printf("GPU memory for DOF effect: %ld MB\n", usedMemForDOF); //cl::Image2D *in_imageBufferCl = new cl::Image2D(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, cl::ImageFormat(CL_RGBA, CL_UNORM_INT16), width, height, // width * sizeof(cl_ushort4), in_image, &err); //if(!checkErr(err, "cl::Image2D(...backgroundImage...)")) return; //cl::Image2D *out_imageBufferCl = new cl::Image2D(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, cl::ImageFormat(CL_RGBA, CL_UNORM_INT16), width, height, // width * sizeof(cl_ushort4), out_image, &err); //if(!checkErr(err, "cl::Image2D(...backgroundImage...)")) return; cl::Buffer *in_imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, imageSize, in_image, &err); sprintf(errorText, "in_imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, imageSize, in_image, &err)"); if (!checkErr(err, errorText)) return; cl::Buffer *out_imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, imageSize, out_image, &err); sprintf(errorText, "out_imageBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, imageSize, out_image, &err)"); if (!checkErr(err, errorText)) return; cl::Buffer *zBufferCl = new cl::Buffer(*context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(sSortZ ) * width * height, temp_sort, &err); sprintf(errorText, "zBufferCl = new cl::Buffer(*context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, sizeof(sSortZ)*width*height, temp_sort, &err)"); if (!checkErr(err, errorText)) return; err = queueDOF->enqueueWriteBuffer(*in_imageBufferCl, CL_TRUE, 0, imageSize, in_image); sprintf(errorText, "ComamndQueueDOF(in_imageBufferCl)"); if (!checkErr(err, errorText)) return; err = queueDOF->enqueueWriteBuffer(*out_imageBufferCl, CL_TRUE, 0, imageSize, out_image); sprintf(errorText, "ComamndQueueDOF(out_imageBufferCl)"); if (!checkErr(err, errorText)) return; err = queueDOF->enqueueWriteBuffer(*zBufferCl, CL_TRUE, 0, sizeof(sSortZ ) * width * height, temp_sort); sprintf(errorText, "ComamndQueueDOF(in_imageBufferCl)"); if (!checkErr(err, errorText)) return; sClParamsDOF paramsDOF; paramsDOF.width = width; paramsDOF.height = height; paramsDOF.focus = lastParams.DOFFocus; paramsDOF.radius = lastParams.DOFRadius * width / 1000.0; err = kernelDOF->setArg(0, *in_imageBufferCl); err = kernelDOF->setArg(1, *out_imageBufferCl); err = kernelDOF->setArg(2, *zBufferCl); err = kernelDOF->setArg(3, paramsDOF); stepSize = workGroupSize; int workGroupSizeMultiplier = 1; double startTime = real_clock(); double lastTime = real_clock(); double lastTimeProcessing = startTime; double lastProcessingTime = 1.0; for (int pixelIndex = 0; pixelIndex < width * height; pixelIndex += stepSize) { double processingCycleTime = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLProcessingCycleTime))); if (processingCycleTime < 0.02) processingCycleTime = 0.02; double factor = processingCycleTime / lastProcessingTime; if (factor > 2.0) factor = 2.0; workGroupSizeMultiplier *= factor; //printf("job size limit: %ld\n", jobSizeLimit); int pixelsLeft = width * height - pixelIndex; int maxWorkGroupSizeMultiplier = pixelsLeft / workGroupSize; if (workGroupSizeMultiplier > maxWorkGroupSizeMultiplier) workGroupSizeMultiplier = maxWorkGroupSizeMultiplier; if (workGroupSizeMultiplier > width * height / workGroupSize / 8) workGroupSizeMultiplier = width * height / workGroupSize / 8; if (workGroupSizeMultiplier < numberOfComputeUnits) workGroupSizeMultiplier = numberOfComputeUnits; stepSize = workGroupSize * workGroupSizeMultiplier; //calculation of stepSize to be multiplied workGroupSize size_t limitedWorkgroupSize = workGroupSize; if (stepSize > pixelsLeft) { int mul = pixelsLeft / workGroupSize; if (mul > 0) { stepSize = mul * workGroupSize; } else { //in this case will be limited workGroupSize stepSize = pixelsLeft; limitedWorkgroupSize = pixelsLeft; } } err = queueDOF->enqueueNDRangeKernel(*kernelDOF, cl::NDRange(pixelIndex), cl::NDRange(stepSize), cl::NDRange(limitedWorkgroupSize)); sprintf(errorText, "ComamndQueueSSAO::nqueueNDRangeKernel(size)"); if (!checkErr(err, errorText)) return; err = queueDOF->finish(); if (!checkErr(err, "ComamndQueueSSAO::finish() - Kernel")) return; double time = real_clock() - startTime; char progressText[1000]; double percent; percent = (double) (pixelIndex + stepSize) / (width * height); double time_to_go = (1.0 - percent) * time / percent; int togo_time_s = (int) time_to_go % 60; int togo_time_min = (int) (time_to_go / 60) % 60; int togo_time_h = time_to_go / 3600; int time_s = (int) time % 60; int time_min = (int) (time / 60) % 60; int time_h = time / 3600; sprintf(progressText, "DOF OpenCL - rendering. Done %.1f%%, to go %dh%dm%ds, elapsed %dh%dm%ds", percent * 100.0, togo_time_h, togo_time_min, togo_time_s, time_h, time_min, time_s); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), percent); if (programClosed) break; if (real_clock() - lastTime > 60.0) { if (image->IsPreview()) { err = queueDOF->enqueueReadBuffer(*out_imageBufferCl, CL_TRUE, 0, imageSize, out_image); sRGB16 *image16 = image->GetImage16Ptr(); size_t size = width * height; for (size_t i = 0; i < size; i++) { sRGB16 pixel; cl_ushort3 pixelCl = out_image[i]; pixel.R = pixelCl.s0; pixel.G = pixelCl.s1; pixel.B = pixelCl.s2; image16[i] = pixel; } image->ConvertTo8bit(); image->UpdatePreview(); image->RedrawInWidget(outputDarea); while (gtk_events_pending()) gtk_main_iteration(); } lastTime = real_clock(); } while (gtk_events_pending()) gtk_main_iteration(); lastProcessingTime = time - lastTimeProcessing; lastTimeProcessing = time; } err = queueDOF->enqueueReadBuffer(*out_imageBufferCl, CL_TRUE, 0, imageSize, out_image); //cl::size_t<3> origin; //cl::size_t<3> region; //origin[0] = 0, origin[1] = 0; origin[1] = 0; //region[0] = width, region[1] = height, origin[2] = 1; //err = queueDOF->enqueueReadImage(*out_imageBufferCl, true, origin, region, width * sizeof(cl_ushort4), 0, out_image); //if (!checkErr(err, "ComamndQueueSSAO::enqueueReadBuffer()")) return; //err = queueDOF->finish(); sRGB16 *image16 = image->GetImage16Ptr(); size_t size = width * height; for (size_t i = 0; i < size; i++) { sRGB16 pixel; cl_ushort3 pixelCl = out_image[i]; pixel.R = pixelCl.s0; pixel.G = pixelCl.s1; pixel.B = pixelCl.s2; image16[i] = pixel; } gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Rendering Depth Of Field effect done"); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); delete[] in_image; delete[] out_image; delete[] temp_sort; delete in_imageBufferCl; delete out_imageBufferCl; delete zBufferCl; } //------------------------------------ custom formulas ----------------------------- CCustomFormulas::CCustomFormulas(std::string dataDir) { customFormulasPath = dataDir + "/custom_ocl_formulas"; actualIndex = 0; count = 1; listOfFiles.clear(); listOfNames.clear(); printf("Custom formulas path: %s\n", customFormulasPath.c_str()); //create directory for custom formulas if not exists DIR *dir; dir = opendir(customFormulasPath.c_str()); if (dir != NULL) (void) closedir(dir); #ifdef WIN32 else mkdir(customFormulasPath.c_str()); #else else mkdir(customFormulasPath.c_str(), (S_IRUSR | S_IWUSR | S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH)); #endif RefreshList(); } void CCustomFormulas::RefreshList(void) { listOfFiles.clear(); listOfNames.clear(); GError *error = NULL; GDir *dir = g_dir_open(customFormulasPath.c_str(), 0, &error); gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model (GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas)))); /* if(count > 0) { for(int i = count -1; count >=0; count--) { gtk_combo_box_remove_text(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), i); } } */ count = 0; int indexTemp = actualIndex; if(!error) { gchar *filename; do { filename = (gchar*)g_dir_read_name(dir); if(filename) { std::string sFilename(filename); if(sFilename.find("Init.c") == std::string::npos) { listOfFiles.push_back(sFilename); std::string name; name = sFilename.substr(3, sFilename.length()-3-2); listOfNames.push_back(name); gtk_combo_box_append_text(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), name.c_str()); count++; } } } while(filename); } if(count > 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), indexTemp); actualIndex = indexTemp; } if(dir) g_dir_close(dir); } void CCustomFormulas::GetActual(std::string *name, std::string *formulaFile, std::string *iniFile) { if(name) *name = listOfNames[actualIndex]; std::string filename = listOfFiles[actualIndex]; if(formulaFile) *formulaFile = customFormulasPath + "/" + filename; if(iniFile) *iniFile = customFormulasPath + "/cl_" + listOfNames[actualIndex] + "Init.c"; } void CCustomFormulas::NewFormula(std::string newName) { std::string formulaFile = customFormulasPath + "/cl_" + newName + ".c"; std::string formulaInitFile = customFormulasPath + "/cl_" + newName + "Init.c"; std::string actualName, actualFormula, actualIni; GetActual(&actualName, &actualFormula, &actualIni); int result = fcopy(actualFormula.c_str(), formulaFile.c_str()); if(result) printf("Cannot create new formula\n"); result = fcopy(actualIni.c_str(), formulaInitFile.c_str()); if(result) printf("Cannot create new formula\n"); RefreshList(); SetActualByName(newName); const char *editor = gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLTextEditor)); #ifdef WIN32 spawnlp(P_NOWAIT, editor, editor, formulaFile.c_str(), NULL); #else if(!fork()) { execlp(editor, editor, formulaFile.c_str(), NULL); _exit(0); } #endif #ifdef WIN32 spawnlp(P_NOWAIT, editor, editor, formulaInitFile.c_str(), NULL); #else if(!fork()) { execlp(editor, editor, formulaInitFile.c_str(), NULL); _exit(0); } #endif } bool CCustomFormulas::SetActualByName(std::string name) { bool result = false; for (int i = 0; i < count; i++) { if (name == listOfNames[i]) { gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), i); actualIndex = i; result = true; } } return result; } void CCustomFormulas::DeleteFormula(void) { std::string actualName, actualFormula, actualIni; GetActual(&actualName, &actualFormula, &actualIni); remove(actualFormula.c_str()); remove(actualIni.c_str()); RefreshList(); actualIndex = 0; gtk_combo_box_set_active(GTK_COMBO_BOX(Interface.comboOpenCLCustomFormulas), actualIndex); } #endif mandelbulber1.21-1.orig/src/clew-cl.hpp0000644000175000017500000033446712274512437020723 0ustar krzysztofkrzysztof/******************************************************************************* * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are 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 Materials. * * THE MATERIALS ARE 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 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. ******************************************************************************/ /*! \file * * \brief C++ bindings for OpenCL 1.0 (rev 48) and OpenCL 1.1 (rev 33) * \author Benedict R. Gaster and Laurent Morichetti * * Additions and fixes from Brian Cole, March 3rd 2010. * * \version 1.1 * \date June 2010 * * Optional extension support * * cl * cl_ext_device_fission * #define USE_CL_DEVICE_FISSION */ /*! \mainpage * \section intro Introduction * For many large applications C++ is the language of choice and so it seems * reasonable to define C++ bindings for OpenCL. * * * The interface is contained with a single C++ header file \em cl.hpp and all * definitions are contained within the namespace \em cl. There is no additional * requirement to include \em cl.h and to use either the C++ or original C * bindings it is enough to simply include \em cl.hpp. * * The bindings themselves are lightweight and correspond closely to the * underlying C API. Using the C++ bindings introduces no additional execution * overhead. * * For detail documentation on the bindings see: * * The OpenCL C++ Wrapper API 1.1 (revision 04) * http://www.khronos.org/registry/cl/specs/opencl-cplusplus-1.1.pdf * * \section example Example * * The following example shows a general use case for the C++ * bindings, including support for the optional exception feature and * also the supplied vector and string classes, see following sections for * decriptions of these features. * * \code * #define __CL_ENABLE_EXCEPTIONS * * #if defined(__APPLE__) || defined(__MACOSX) * #include * #else * #include * #endif * #include * #include * #include * * const char * helloStr = "__kernel void " * "hello(void) " * "{ " * " " * "} "; * * int * main(void) * { * cl_int err = CL_SUCCESS; * try { * * std::vector platforms; * cl::Platform::get(&platforms); * if (platforms.size() == 0) { * std::cout << "Platform size 0\n"; * return -1; * } * * cl_context_properties properties[] = * { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0}; * cl::Context context(CL_DEVICE_TYPE_CPU, properties); * * std::vector devices = context.getInfo(); * * cl::Program::Sources source(1, * std::make_pair(helloStr,strlen(helloStr))); * cl::Program program_ = cl::Program(context, source); * program_.build(devices); * * cl::Kernel kernel(program_, "hello", &err); * * cl::Event event; * cl::CommandQueue queue(context, devices[0], 0, &err); * queue.enqueueNDRangeKernel( * kernel, * cl::NullRange, * cl::NDRange(4,4), * cl::NullRange, * NULL, * &event); * * event.wait(); * } * catch (cl::Error err) { * std::cerr * << "ERROR: " * << err.what() * << "(" * << err.err() * << ")" * << std::endl; * } * * return EXIT_SUCCESS; * } * * \endcode * */ #ifndef CL_HPP_ #define CL_HPP_ #ifdef _WIN32 #include #include #undef USE_DX_INTEROP #if defined(USE_DX_INTEROP) #include #endif #endif // _WIN32 // #if defined(USE_CL_DEVICE_FISSION) #include #endif #if defined(__APPLE__) || defined(__MACOSX) #include #include #else #include #include #endif // !__APPLE__ #if !defined(CL_CALLBACK) #define CL_CALLBACK #endif //CL_CALLBACK #include #if !defined(__NO_STD_VECTOR) #include #endif #if !defined(__NO_STD_STRING) #include #endif #if defined(linux) || defined(__APPLE__) || defined(__MACOSX) # include #endif // linux #include /*! \namespace cl * * \brief The OpenCL C++ bindings are defined within this namespace. * */ namespace cl { #define __INIT_CL_EXT_FCN_PTR(name) \ if(!pfn_##name) { \ pfn_##name = (PFN_##name) \ clGetExtensionFunctionAddress(#name); \ if(!pfn_##name) { \ } \ } class Program; class Device; class Context; class CommandQueue; class Memory; #undef __CL_ENABLE_EXCEPTIONS #if defined(__CL_ENABLE_EXCEPTIONS) #include /*! \class Error * \brief Exception class */ class Error : public std::exception { private: cl_int err_; const char * errStr_; public: /*! Create a new CL error exception for a given error code * and corresponding message. */ Error(cl_int err, const char * errStr = NULL) : err_(err), errStr_(errStr) {} ~Error() throw() {} /*! \brief Get error string associated with exception * * \return A memory pointer to the error message string. */ virtual const char * what() const throw () { if (errStr_ == NULL) { return "empty"; } else { return errStr_; } } /*! \brief Get error code associated with exception * * \return The error code. */ const cl_int err(void) const { return err_; } }; #define __ERR_STR(x) #x #else #define __ERR_STR(x) NULL #endif // __CL_ENABLE_EXCEPTIONS //! \cond DOXYGEN_DETAIL #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) #define __GET_DEVICE_INFO_ERR __ERR_STR(clgetDeviceInfo) #define __GET_PLATFORM_INFO_ERR __ERR_STR(clGetPlatformInfo) #define __GET_DEVICE_IDS_ERR __ERR_STR(clGetDeviceIDs) #define __GET_PLATFORM_IDS_ERR __ERR_STR(clGetPlatformIDs) #define __GET_CONTEXT_INFO_ERR __ERR_STR(clGetContextInfo) #define __GET_EVENT_INFO_ERR __ERR_STR(clGetEventInfo) #define __GET_EVENT_PROFILE_INFO_ERR __ERR_STR(clGetEventProfileInfo) #define __GET_MEM_OBJECT_INFO_ERR __ERR_STR(clGetMemObjectInfo) #define __GET_IMAGE_INFO_ERR __ERR_STR(clGetImageInfo) #define __GET_SAMPLER_INFO_ERR __ERR_STR(clGetSamplerInfo) #define __GET_KERNEL_INFO_ERR __ERR_STR(clGetKernelInfo) #define __GET_KERNEL_WORK_GROUP_INFO_ERR __ERR_STR(clGetKernelWorkGroupInfo) #define __GET_PROGRAM_INFO_ERR __ERR_STR(clGetProgramInfo) #define __GET_PROGRAM_BUILD_INFO_ERR __ERR_STR(clGetProgramBuildInfo) #define __GET_COMMAND_QUEUE_INFO_ERR __ERR_STR(clGetCommandQueueInfo) #define __CREATE_CONTEXT_FROM_TYPE_ERR __ERR_STR(clCreateContextFromType) #define __GET_SUPPORTED_IMAGE_FORMATS_ERR __ERR_STR(clGetSupportedImageFormats) #define __CREATE_BUFFER_ERR __ERR_STR(clCreateBuffer) #define __CREATE_SUBBUFFER_ERR __ERR_STR(clCreateSubBuffer) #define __CREATE_GL_BUFFER_ERR __ERR_STR(clCreateFromGLBuffer) #define __GET_GL_OBJECT_INFO_ERR __ERR_STR(clGetGLObjectInfo) #define __CREATE_IMAGE2D_ERR __ERR_STR(clCreateImage2D) #define __CREATE_IMAGE3D_ERR __ERR_STR(clCreateImage3D) #define __CREATE_SAMPLER_ERR __ERR_STR(clCreateSampler) #define __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR __ERR_STR(clSetMemObjectDestructorCallback) #define __CREATE_USER_EVENT_ERR __ERR_STR(clCreateUserEvent) #define __SET_USER_EVENT_STATUS_ERR __ERR_STR(clSetUserEventStatus) #define __SET_EVENT_CALLBACK_ERR __ERR_STR(clSetEventCallback) #define __WAIT_FOR_EVENTS_ERR __ERR_STR(clWaitForEvents) #define __CREATE_KERNEL_ERR __ERR_STR(clCreateKernel) #define __SET_KERNEL_ARGS_ERR __ERR_STR(clSetKernelArg) #define __CREATE_PROGRAM_WITH_SOURCE_ERR __ERR_STR(clCreateProgramWithSource) #define __CREATE_PROGRAM_WITH_BINARY_ERR __ERR_STR(clCreateProgramWithBinary) #define __BUILD_PROGRAM_ERR __ERR_STR(clBuildProgram) #define __CREATE_KERNELS_IN_PROGRAM_ERR __ERR_STR(clCreateKernelsInProgram) #define __CREATE_COMMAND_QUEUE_ERR __ERR_STR(clCreateCommandQueue) #define __SET_COMMAND_QUEUE_PROPERTY_ERR __ERR_STR(clSetCommandQueueProperty) #define __ENQUEUE_READ_BUFFER_ERR __ERR_STR(clEnqueueReadBuffer) #define __ENQUEUE_READ_BUFFER_RECT_ERR __ERR_STR(clEnqueueReadBufferRect) #define __ENQUEUE_WRITE_BUFFER_ERR __ERR_STR(clEnqueueWriteBuffer) #define __ENQUEUE_WRITE_BUFFER_RECT_ERR __ERR_STR(clEnqueueWriteBufferRect) #define __ENQEUE_COPY_BUFFER_ERR __ERR_STR(clEnqueueCopyBuffer) #define __ENQEUE_COPY_BUFFER_RECT_ERR __ERR_STR(clEnqueueCopyBufferRect) #define __ENQUEUE_READ_IMAGE_ERR __ERR_STR(clEnqueueReadImage) #define __ENQUEUE_WRITE_IMAGE_ERR __ERR_STR(clEnqueueWriteImage) #define __ENQUEUE_COPY_IMAGE_ERR __ERR_STR(clEnqueueCopyImage) #define __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR __ERR_STR(clEnqueueCopyImageToBuffer) #define __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR __ERR_STR(clEnqueueCopyBufferToImage) #define __ENQUEUE_MAP_BUFFER_ERR __ERR_STR(clEnqueueMapBuffer) #define __ENQUEUE_MAP_IMAGE_ERR __ERR_STR(clEnqueueMapImage) #define __ENQUEUE_UNMAP_MEM_OBJECT_ERR __ERR_STR(clEnqueueUnMapMemObject) #define __ENQUEUE_NDRANGE_KERNEL_ERR __ERR_STR(clEnqueueNDRangeKernel) #define __ENQUEUE_TASK_ERR __ERR_STR(clEnqueueTask) #define __ENQUEUE_NATIVE_KERNEL __ERR_STR(clEnqueueNativeKernel) #define __ENQUEUE_MARKER_ERR __ERR_STR(clEnqueueMarker) #define __ENQUEUE_WAIT_FOR_EVENTS_ERR __ERR_STR(clEnqueueWaitForEvents) #define __ENQUEUE_BARRIER_ERR __ERR_STR(clEnqueueBarrier) #define __ENQUEUE_ACQUIRE_GL_ERR __ERR_STR(clEnqueueAcquireGLObjects) #define __ENQUEUE_RELEASE_GL_ERR __ERR_STR(clEnqueueReleaseGLObjects) #define __UNLOAD_COMPILER_ERR __ERR_STR(clUnloadCompiler) #define __FLUSH_ERR __ERR_STR(clFlush) #define __FINISH_ERR __ERR_STR(clFinish) #define __CREATE_SUB_DEVICES __ERR_STR(clCreateSubDevicesEXT) #endif // __CL_USER_OVERRIDE_ERROR_STRINGS //! \endcond /*! \class string * \brief Simple string class, that provides a limited subset of std::string * functionality but avoids many of the issues that come with that class. */ class string { private: ::size_t size_; char * str_; public: string(void) : size_(0), str_(NULL) { } string(char * str, ::size_t size) : size_(size), str_(NULL) { str_ = new char[size_+1]; if (str_ != NULL) { memcpy(str_, str, size_ * sizeof(char)); str_[size_] = '\0'; } else { size_ = 0; } } string(char * str) : str_(NULL) { size_= ::strlen(str); str_ = new char[size_ + 1]; if (str_ != NULL) { memcpy(str_, str, (size_ + 1) * sizeof(char)); } else { size_ = 0; } } string& operator=(const string& rhs) { if (this == &rhs) { return *this; } if (rhs.size_ == 0 || rhs.str_ == NULL) { size_ = 0; str_ = NULL; } else { size_ = rhs.size_; str_ = new char[size_ + 1]; if (str_ != NULL) { memcpy(str_, rhs.str_, (size_ + 1) * sizeof(char)); } else { size_ = 0; } } return *this; } string(const string& rhs) { *this = rhs; } ~string() { if (str_ != NULL) { delete[] str_; } } ::size_t size(void) const { return size_; } ::size_t length(void) const { return size(); } const char * c_str(void) const { return (str_) ? str_ : "";} }; #if !defined(__USE_DEV_STRING) && !defined(__NO_STD_STRING) #include typedef std::string STRING_CLASS; #elif !defined(__USE_DEV_STRING) typedef cl::string STRING_CLASS; #endif #if !defined(__USE_DEV_VECTOR) && !defined(__NO_STD_VECTOR) #include #define VECTOR_CLASS std::vector #elif !defined(__USE_DEV_VECTOR) #define VECTOR_CLASS cl::vector #endif #if !defined(__MAX_DEFAULT_VECTOR_SIZE) #define __MAX_DEFAULT_VECTOR_SIZE 10 #endif /*! \class vector * \brief Fixed sized vector implementation that mirroring * std::vector functionality. */ template class vector { private: T data_[N]; unsigned int size_; bool empty_; public: vector() : size_(-1), empty_(true) {} ~vector() {} unsigned int size(void) const { return size_ + 1; } void clear() { size_ = -1; empty_ = true; } void push_back (const T& x) { if (size() < N) { size_++; data_[size_] = x; empty_ = false; } } void pop_back(void) { if (!empty_) { data_[size_].~T(); size_--; if (size_ == -1) { empty_ = true; } } } vector(const vector& vec) : size_(vec.size_), empty_(vec.empty_) { if (!empty_) { memcpy(&data_[0], &vec.data_[0], size() * sizeof(T)); } } vector(unsigned int size, const T& val = T()) : size_(-1), empty_(true) { for (unsigned int i = 0; i < size; i++) { push_back(val); } } vector& operator=(const vector& rhs) { if (this == &rhs) { return *this; } size_ = rhs.size_; empty_ = rhs.empty_; if (!empty_) { memcpy(&data_[0], &rhs.data_[0], size() * sizeof(T)); } return *this; } bool operator==(vector &vec) { if (empty_ && vec.empty_) { return true; } if (size() != vec.size()) { return false; } return memcmp(&data_[0], &vec.data_[0], size() * sizeof(T)) == 0 ? true : false; } operator T* () { return data_; } operator const T* () const { return data_; } bool empty (void) const { return empty_; } unsigned int max_size (void) const { return N; } unsigned int capacity () const { return sizeof(T) * N; } T& operator[](int index) { return data_[index]; } T operator[](int index) const { return data_[index]; } template void assign(I start, I end) { clear(); while(start < end) { push_back(*start); start++; } } /*! \class iterator * \brief Iterator class for vectors */ class iterator { private: vector vec_; int index_; bool initialized_; public: iterator(void) : index_(-1), initialized_(false) { index_ = -1; initialized_ = false; } ~iterator(void) {} static iterator begin(vector &vec) { iterator i; if (!vec.empty()) { i.index_ = 0; } i.vec_ = vec; i.initialized_ = true; return i; } static iterator end(vector &vec) { iterator i; if (!vec.empty()) { i.index_ = vec.size(); } i.vec_ = vec; i.initialized_ = true; return i; } bool operator==(iterator i) { return ((vec_ == i.vec_) && (index_ == i.index_) && (initialized_ == i.initialized_)); } bool operator!=(iterator i) { return (!(*this==i)); } void operator++() { index_++; } void operator++(int x) { index_ += x; } void operator--() { index_--; } void operator--(int x) { index_ -= x; } T operator *() { return vec_[index_]; } }; iterator begin(void) { return iterator::begin(*this); } iterator end(void) { return iterator::end(*this); } T& front(void) { return data_[0]; } T& back(void) { return data_[size_]; } const T& front(void) const { return data_[0]; } const T& back(void) const { return data_[size_]; } }; /*! * \brief size_t class used to interface between C++ and * OpenCL C calls that require arrays of size_t values, who's * size is known statically. */ template struct size_t : public cl::vector< ::size_t, N> { }; namespace detail { // GetInfo help struct template struct GetInfoHelper { static cl_int get(Functor f, cl_uint name, T* param) { return f(name, sizeof(T), param, NULL); } }; // Specialized GetInfoHelper for VECTOR_CLASS params template struct GetInfoHelper > { static cl_int get(Func f, cl_uint name, VECTOR_CLASS* param) { ::size_t required; cl_int err = f(name, 0, NULL, &required); if (err != CL_SUCCESS) { return err; } T* value = (T*) alloca(required); err = f(name, required, value, NULL); if (err != CL_SUCCESS) { return err; } param->assign(&value[0], &value[required/sizeof(T)]); return CL_SUCCESS; } }; // Specialized for getInfo template struct GetInfoHelper > { static cl_int get(Func f, cl_uint name, VECTOR_CLASS* param) { cl_uint err = f(name, param->size() * sizeof(char *), &(*param)[0], NULL); if (err != CL_SUCCESS) { return err; } return CL_SUCCESS; } }; // Specialized GetInfoHelper for STRING_CLASS params template struct GetInfoHelper { static cl_int get(Func f, cl_uint name, STRING_CLASS* param) { ::size_t required; cl_int err = f(name, 0, NULL, &required); if (err != CL_SUCCESS) { return err; } char* value = (char*) alloca(required); err = f(name, required, value, NULL); if (err != CL_SUCCESS) { return err; } *param = value; return CL_SUCCESS; } }; #define __GET_INFO_HELPER_WITH_RETAIN(CPP_TYPE) \ namespace detail { \ template \ struct GetInfoHelper \ { \ static cl_int get(Func f, cl_uint name, CPP_TYPE* param) \ { \ cl_uint err = f(name, sizeof(CPP_TYPE), param, NULL); \ if (err != CL_SUCCESS) { \ return err; \ } \ \ return ReferenceHandler::retain((*param)()); \ } \ }; \ } #define __PARAM_NAME_INFO_1_0(F) \ F(cl_platform_info, CL_PLATFORM_PROFILE, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_VERSION, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_NAME, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_VENDOR, STRING_CLASS) \ F(cl_platform_info, CL_PLATFORM_EXTENSIONS, STRING_CLASS) \ \ F(cl_device_info, CL_DEVICE_TYPE, cl_device_type) \ F(cl_device_info, CL_DEVICE_VENDOR_ID, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_COMPUTE_UNITS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_WORK_GROUP_SIZE, ::size_t) \ F(cl_device_info, CL_DEVICE_MAX_WORK_ITEM_SIZES, VECTOR_CLASS< ::size_t>) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT, cl_uint) \ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_CLOCK_FREQUENCY, cl_uint) \ F(cl_device_info, CL_DEVICE_ADDRESS_BITS, cl_bitfield) \ F(cl_device_info, CL_DEVICE_MAX_READ_IMAGE_ARGS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_WRITE_IMAGE_ARGS, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_MEM_ALLOC_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_WIDTH, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE2D_MAX_HEIGHT, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_WIDTH, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_HEIGHT, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE3D_MAX_DEPTH, ::size_t) \ F(cl_device_info, CL_DEVICE_IMAGE_SUPPORT, cl_uint) \ F(cl_device_info, CL_DEVICE_MAX_PARAMETER_SIZE, ::size_t) \ F(cl_device_info, CL_DEVICE_MAX_SAMPLERS, cl_uint) \ F(cl_device_info, CL_DEVICE_MEM_BASE_ADDR_ALIGN, cl_uint) \ F(cl_device_info, CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE, cl_uint) \ F(cl_device_info, CL_DEVICE_SINGLE_FP_CONFIG, cl_device_fp_config) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_TYPE, cl_device_mem_cache_type) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, cl_uint)\ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_CACHE_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_GLOBAL_MEM_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_MAX_CONSTANT_ARGS, cl_uint) \ F(cl_device_info, CL_DEVICE_LOCAL_MEM_TYPE, cl_device_local_mem_type) \ F(cl_device_info, CL_DEVICE_LOCAL_MEM_SIZE, cl_ulong) \ F(cl_device_info, CL_DEVICE_ERROR_CORRECTION_SUPPORT, cl_bool) \ F(cl_device_info, CL_DEVICE_PROFILING_TIMER_RESOLUTION, ::size_t) \ F(cl_device_info, CL_DEVICE_ENDIAN_LITTLE, cl_bool) \ F(cl_device_info, CL_DEVICE_AVAILABLE, cl_bool) \ F(cl_device_info, CL_DEVICE_COMPILER_AVAILABLE, cl_bool) \ F(cl_device_info, CL_DEVICE_EXECUTION_CAPABILITIES, cl_device_exec_capabilities) \ F(cl_device_info, CL_DEVICE_QUEUE_PROPERTIES, cl_command_queue_properties) \ F(cl_device_info, CL_DEVICE_PLATFORM, cl_platform_id) \ F(cl_device_info, CL_DEVICE_NAME, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_VENDOR, STRING_CLASS) \ F(cl_device_info, CL_DRIVER_VERSION, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_PROFILE, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_VERSION, STRING_CLASS) \ F(cl_device_info, CL_DEVICE_EXTENSIONS, STRING_CLASS) \ \ F(cl_context_info, CL_CONTEXT_REFERENCE_COUNT, cl_uint) \ F(cl_context_info, CL_CONTEXT_DEVICES, VECTOR_CLASS) \ F(cl_context_info, CL_CONTEXT_PROPERTIES, VECTOR_CLASS) \ \ F(cl_event_info, CL_EVENT_COMMAND_QUEUE, cl::CommandQueue) \ F(cl_event_info, CL_EVENT_COMMAND_TYPE, cl_command_type) \ F(cl_event_info, CL_EVENT_REFERENCE_COUNT, cl_uint) \ F(cl_event_info, CL_EVENT_COMMAND_EXECUTION_STATUS, cl_uint) \ \ F(cl_profiling_info, CL_PROFILING_COMMAND_QUEUED, cl_ulong) \ F(cl_profiling_info, CL_PROFILING_COMMAND_SUBMIT, cl_ulong) \ F(cl_profiling_info, CL_PROFILING_COMMAND_START, cl_ulong) \ F(cl_profiling_info, CL_PROFILING_COMMAND_END, cl_ulong) \ \ F(cl_mem_info, CL_MEM_TYPE, cl_mem_object_type) \ F(cl_mem_info, CL_MEM_FLAGS, cl_mem_flags) \ F(cl_mem_info, CL_MEM_SIZE, ::size_t) \ F(cl_mem_info, CL_MEM_HOST_PTR, void*) \ F(cl_mem_info, CL_MEM_MAP_COUNT, cl_uint) \ F(cl_mem_info, CL_MEM_REFERENCE_COUNT, cl_uint) \ F(cl_mem_info, CL_MEM_CONTEXT, cl::Context) \ \ F(cl_image_info, CL_IMAGE_FORMAT, cl_image_format) \ F(cl_image_info, CL_IMAGE_ELEMENT_SIZE, ::size_t) \ F(cl_image_info, CL_IMAGE_ROW_PITCH, ::size_t) \ F(cl_image_info, CL_IMAGE_SLICE_PITCH, ::size_t) \ F(cl_image_info, CL_IMAGE_WIDTH, ::size_t) \ F(cl_image_info, CL_IMAGE_HEIGHT, ::size_t) \ F(cl_image_info, CL_IMAGE_DEPTH, ::size_t) \ \ F(cl_sampler_info, CL_SAMPLER_REFERENCE_COUNT, cl_uint) \ F(cl_sampler_info, CL_SAMPLER_CONTEXT, cl::Context) \ F(cl_sampler_info, CL_SAMPLER_NORMALIZED_COORDS, cl_addressing_mode) \ F(cl_sampler_info, CL_SAMPLER_ADDRESSING_MODE, cl_filter_mode) \ F(cl_sampler_info, CL_SAMPLER_FILTER_MODE, cl_bool) \ \ F(cl_program_info, CL_PROGRAM_REFERENCE_COUNT, cl_uint) \ F(cl_program_info, CL_PROGRAM_CONTEXT, cl::Context) \ F(cl_program_info, CL_PROGRAM_NUM_DEVICES, cl_uint) \ F(cl_program_info, CL_PROGRAM_DEVICES, VECTOR_CLASS) \ F(cl_program_info, CL_PROGRAM_SOURCE, STRING_CLASS) \ F(cl_program_info, CL_PROGRAM_BINARY_SIZES, VECTOR_CLASS< ::size_t>) \ F(cl_program_info, CL_PROGRAM_BINARIES, VECTOR_CLASS) \ \ F(cl_program_build_info, CL_PROGRAM_BUILD_STATUS, cl_build_status) \ F(cl_program_build_info, CL_PROGRAM_BUILD_OPTIONS, STRING_CLASS) \ F(cl_program_build_info, CL_PROGRAM_BUILD_LOG, STRING_CLASS) \ \ F(cl_kernel_info, CL_KERNEL_FUNCTION_NAME, STRING_CLASS) \ F(cl_kernel_info, CL_KERNEL_NUM_ARGS, cl_uint) \ F(cl_kernel_info, CL_KERNEL_REFERENCE_COUNT, cl_uint) \ F(cl_kernel_info, CL_KERNEL_CONTEXT, cl::Context) \ F(cl_kernel_info, CL_KERNEL_PROGRAM, cl::Program) \ \ F(cl_kernel_work_group_info, CL_KERNEL_WORK_GROUP_SIZE, ::size_t) \ F(cl_kernel_work_group_info, CL_KERNEL_COMPILE_WORK_GROUP_SIZE, cl::size_t<3>) \ F(cl_kernel_work_group_info, CL_KERNEL_LOCAL_MEM_SIZE, cl_ulong) \ \ F(cl_command_queue_info, CL_QUEUE_CONTEXT, cl::Context) \ F(cl_command_queue_info, CL_QUEUE_DEVICE, cl::Device) \ F(cl_command_queue_info, CL_QUEUE_REFERENCE_COUNT, cl_uint) \ F(cl_command_queue_info, CL_QUEUE_PROPERTIES, cl_command_queue_properties) #if defined(CL_VERSION_1_1) #define __PARAM_NAME_INFO_1_1(F) \ F(cl_context_info, CL_CONTEXT_NUM_DEVICES, cl_uint)\ F(cl_device_info, CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_INT, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE, cl_uint) \ F(cl_device_info, CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF, cl_uint) \ F(cl_device_info, CL_DEVICE_DOUBLE_FP_CONFIG, cl_device_fp_config) \ F(cl_device_info, CL_DEVICE_HALF_FP_CONFIG, cl_device_fp_config) \ F(cl_device_info, CL_DEVICE_HOST_UNIFIED_MEMORY, cl_bool) \ \ F(cl_mem_info, CL_MEM_ASSOCIATED_MEMOBJECT, cl::Memory) \ F(cl_mem_info, CL_MEM_OFFSET, ::size_t) \ \ F(cl_kernel_work_group_info, CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, ::size_t) \ F(cl_kernel_work_group_info, CL_KERNEL_PRIVATE_MEM_SIZE, cl_ulong) \ \ F(cl_event_info, CL_EVENT_CONTEXT, cl::Context) #endif // CL_VERSION_1_1 #if defined(USE_CL_DEVICE_FISSION) #define __PARAM_NAME_DEVICE_FISSION(F) \ F(cl_device_info, CL_DEVICE_PARENT_DEVICE_EXT, cl_device_id) \ F(cl_device_info, CL_DEVICE_PARTITION_TYPES_EXT, VECTOR_CLASS) \ F(cl_device_info, CL_DEVICE_AFFINITY_DOMAINS_EXT, VECTOR_CLASS) \ F(cl_device_info, CL_DEVICE_REFERENCE_COUNT_EXT , cl_uint) \ F(cl_device_info, CL_DEVICE_PARTITION_STYLE_EXT, VECTOR_CLASS) #endif // USE_CL_DEVICE_FISSION template struct param_traits {}; #define __DECLARE_PARAM_TRAITS(token, param_name, T) \ struct token; \ template<> \ struct param_traits \ { \ enum { value = param_name }; \ typedef T param_type; \ }; __PARAM_NAME_INFO_1_0(__DECLARE_PARAM_TRAITS); #if defined(CL_VERSION_1_1) __PARAM_NAME_INFO_1_1(__DECLARE_PARAM_TRAITS); #endif // CL_VERSION_1_1 #if defined(USE_CL_DEVICE_FISSION) __PARAM_NAME_DEVICE_FISSION(__DECLARE_PARAM_TRAITS); #endif // USE_CL_DEVICE_FISSION #undef __DECLARE_PARAM_TRAITS // Convenience functions template inline cl_int getInfo(Func f, cl_uint name, T* param) { return GetInfoHelper::get(f, name, param); } template struct GetInfoFunctor0 { Func f_; const Arg0& arg0_; cl_int operator ()( cl_uint param, ::size_t size, void* value, ::size_t* size_ret) { return (*f_)(arg0_, param, size, value, size_ret); } }; template struct GetInfoFunctor1 { Func f_; const Arg0& arg0_; const Arg1& arg1_; cl_int operator ()( cl_uint param, ::size_t size, void* value, ::size_t* size_ret) { return (*f_)(arg0_, arg1_, param, size, value, size_ret); } }; template inline cl_int getInfo(Func f, const Arg0& arg0, cl_uint name, T* param) { GetInfoFunctor0 f0 = { f, arg0 }; return GetInfoHelper, T> ::get(f0, name, param); } template inline cl_int getInfo(Func f, const Arg0& arg0, const Arg1& arg1, cl_uint name, T* param) { GetInfoFunctor1 f0 = { f, arg0, arg1 }; return GetInfoHelper, T> ::get(f0, name, param); } template struct ReferenceHandler { }; template <> struct ReferenceHandler { // cl_device_id does not have retain(). static cl_int retain(cl_device_id) { return CL_INVALID_DEVICE; } // cl_device_id does not have release(). static cl_int release(cl_device_id) { return CL_INVALID_DEVICE; } }; template <> struct ReferenceHandler { // cl_platform_id does not have retain(). static cl_int retain(cl_platform_id) { return CL_INVALID_PLATFORM; } // cl_platform_id does not have release(). static cl_int release(cl_platform_id) { return CL_INVALID_PLATFORM; } }; template <> struct ReferenceHandler { static cl_int retain(cl_context context) { return ::clRetainContext(context); } static cl_int release(cl_context context) { return ::clReleaseContext(context); } }; template <> struct ReferenceHandler { static cl_int retain(cl_command_queue queue) { return ::clRetainCommandQueue(queue); } static cl_int release(cl_command_queue queue) { return ::clReleaseCommandQueue(queue); } }; template <> struct ReferenceHandler { static cl_int retain(cl_mem memory) { return ::clRetainMemObject(memory); } static cl_int release(cl_mem memory) { return ::clReleaseMemObject(memory); } }; template <> struct ReferenceHandler { static cl_int retain(cl_sampler sampler) { return ::clRetainSampler(sampler); } static cl_int release(cl_sampler sampler) { return ::clReleaseSampler(sampler); } }; template <> struct ReferenceHandler { static cl_int retain(cl_program program) { return ::clRetainProgram(program); } static cl_int release(cl_program program) { return ::clReleaseProgram(program); } }; template <> struct ReferenceHandler { static cl_int retain(cl_kernel kernel) { return ::clRetainKernel(kernel); } static cl_int release(cl_kernel kernel) { return ::clReleaseKernel(kernel); } }; template <> struct ReferenceHandler { static cl_int retain(cl_event event) { return ::clRetainEvent(event); } static cl_int release(cl_event event) { return ::clReleaseEvent(event); } }; template class Wrapper { public: typedef T cl_type; protected: cl_type object_; public: Wrapper() : object_(NULL) { } ~Wrapper() { if (object_ != NULL) { release(); } } Wrapper(const Wrapper& rhs) { object_ = rhs.object_; if (object_ != NULL) { retain(); } } Wrapper& operator = (const Wrapper& rhs) { if (object_ != NULL) { release(); } object_ = rhs.object_; if (object_ != NULL) { retain(); } return *this; } cl_type operator ()() const { return object_; } cl_type& operator ()() { return object_; } protected: cl_int retain() const { return ReferenceHandler::retain(object_); } cl_int release() const { return ReferenceHandler::release(object_); } }; #if defined(__CL_ENABLE_EXCEPTIONS) static inline cl_int errHandler ( cl_int err, const char * errStr = NULL) throw(Error) { if (err != CL_SUCCESS) { throw Error(err, errStr); } return err; } #else static inline cl_int errHandler (cl_int err, const char * errStr = NULL) { return err; } #endif // __CL_ENABLE_EXCEPTIONS } // namespace detail //! \endcond /*! \stuct ImageFormat * \brief ImageFormat interface fro cl_image_format. */ struct ImageFormat : public cl_image_format { ImageFormat(){} ImageFormat(cl_channel_order order, cl_channel_type type) { image_channel_order = order; image_channel_data_type = type; } ImageFormat& operator = (const ImageFormat& rhs) { if (this != &rhs) { this->image_channel_data_type = rhs.image_channel_data_type; this->image_channel_order = rhs.image_channel_order; } return *this; } }; /*! \class Device * \brief Device interface for cl_device_id. */ class Device : public detail::Wrapper { public: Device(cl_device_id device) { object_ = device; } Device() : detail::Wrapper() { } Device(const Device& device) : detail::Wrapper(device) { } Device& operator = (const Device& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_device_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetDeviceInfo, object_, name, param), __GET_DEVICE_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_device_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } #if defined(USE_CL_DEVICE_FISSION) cl_int createSubDevices( const cl_device_partition_property_ext * properties, VECTOR_CLASS* devices) { typedef CL_API_ENTRY cl_int ( CL_API_CALL * PFN_clCreateSubDevicesEXT)( cl_device_id /*in_device*/, const cl_device_partition_property_ext * /* properties */, cl_uint /*num_entries*/, cl_device_id * /*out_devices*/, cl_uint * /*num_devices*/ ) CL_EXT_SUFFIX__VERSION_1_1; static PFN_clCreateSubDevicesEXT pfn_clCreateSubDevicesEXT = NULL; __INIT_CL_EXT_FCN_PTR(clCreateSubDevicesEXT); cl_uint n = 0; cl_int err = pfn_clCreateSubDevicesEXT(object_, properties, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_SUB_DEVICES); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = pfn_clCreateSubDevicesEXT(object_, properties, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_SUB_DEVICES); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #endif }; /*! \class Platform * \brief Platform interface. */ class Platform : public detail::Wrapper { public: static const Platform null(); Platform(cl_platform_id platform) { object_ = platform; } Platform() : detail::Wrapper() { } Platform(const Platform& platform) : detail::Wrapper(platform) { } Platform& operator = (const Platform& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } cl_int getInfo(cl_platform_info name, STRING_CLASS* param) const { detail::errHandler( detail::getInfo(&::clGetPlatformInfo, object_, name, param), __GET_PLATFORM_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_platform_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int getDevices( cl_device_type type, VECTOR_CLASS* devices) const { cl_uint n = 0; cl_int err = ::clGetDeviceIDs(object_, type, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = ::clGetDeviceIDs(object_, type, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #if defined(USE_DX_INTEROP) /*! \brief Get the list of available D3D10 devices. * * \param d3d_device_source. * * \param d3d_object. * * \param d3d_device_set. * * \param devices returns a vector of OpenCL D3D10 devices found. The cl::Device * values returned in devices can be used to identify a specific OpenCL * device. If \a devices argument is NULL, this argument is ignored. * * \return One of the following values: * - CL_SUCCESS if the function is executed successfully. * * The application can query specific capabilities of the OpenCL device(s) * returned by cl::getDevices. This can be used by the application to * determine which device(s) to use. * * \note In the case that exceptions are enabled and a return value * other than CL_SUCCESS is generated, then cl::Error exception is * generated. */ cl_int getDevices( cl_d3d10_device_source_khr d3d_device_source, void * d3d_object, cl_d3d10_device_set_khr d3d_device_set, VECTOR_CLASS* devices) const { typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clGetDeviceIDsFromD3D10KHR)( cl_platform_id platform, cl_d3d10_device_source_khr d3d_device_source, void * d3d_object, cl_d3d10_device_set_khr d3d_device_set, cl_uint num_entries, cl_device_id * devices, cl_uint* num_devices); static PFN_clGetDeviceIDsFromD3D10KHR pfn_clGetDeviceIDsFromD3D10KHR = NULL; __INIT_CL_EXT_FCN_PTR(clGetDeviceIDsFromD3D10KHR); cl_uint n = 0; cl_int err = pfn_clGetDeviceIDsFromD3D10KHR( object_, d3d_device_source, d3d_object, d3d_device_set, 0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } cl_device_id* ids = (cl_device_id*) alloca(n * sizeof(cl_device_id)); err = pfn_clGetDeviceIDsFromD3D10KHR( object_, d3d_device_source, d3d_object, d3d_device_set, n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_DEVICE_IDS_ERR); } devices->assign(&ids[0], &ids[n]); return CL_SUCCESS; } #endif static cl_int get( VECTOR_CLASS* platforms) { cl_uint n = 0; cl_int err = ::clGetPlatformIDs(0, NULL, &n); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } cl_platform_id* ids = (cl_platform_id*) alloca( n * sizeof(cl_platform_id)); err = ::clGetPlatformIDs(n, ids, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_PLATFORM_IDS_ERR); } platforms->assign(&ids[0], &ids[n]); return CL_SUCCESS; } }; static inline cl_int UnloadCompiler() { return ::clUnloadCompiler(); } class Context : public detail::Wrapper { public: Context( const VECTOR_CLASS& devices, cl_context_properties* properties = NULL, void (CL_CALLBACK * notifyFptr)( const char *, const void *, ::size_t, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int error; object_ = ::clCreateContext( properties, (cl_uint) devices.size(), (cl_device_id*) &devices.front(), notifyFptr, data, &error); detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); if (err != NULL) { *err = error; } } Context( cl_device_type type, cl_context_properties* properties = NULL, void (CL_CALLBACK * notifyFptr)( const char *, const void *, ::size_t, void *) = NULL, void* data = NULL, cl_int* err = NULL) { cl_int error; object_ = ::clCreateContextFromType( properties, type, notifyFptr, data, &error); detail::errHandler(error, __CREATE_CONTEXT_FROM_TYPE_ERR); if (err != NULL) { *err = error; } } Context() : detail::Wrapper() { } Context(const Context& context) : detail::Wrapper(context) { } Context& operator = (const Context& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_context_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetContextInfo, object_, name, param), __GET_CONTEXT_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_context_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int getSupportedImageFormats( cl_mem_flags flags, cl_mem_object_type type, VECTOR_CLASS* formats) const { cl_uint numEntries; cl_int err = ::clGetSupportedImageFormats( object_, flags, type, 0, NULL, &numEntries); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); } ImageFormat* value = (ImageFormat*) alloca(numEntries * sizeof(ImageFormat)); err = ::clGetSupportedImageFormats( object_, flags, type, numEntries, (cl_image_format*) value, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __GET_SUPPORTED_IMAGE_FORMATS_ERR); } formats->assign(&value[0], &value[numEntries]); return CL_SUCCESS; } }; __GET_INFO_HELPER_WITH_RETAIN(cl::Context) /*! \class Event * \brief Event interface for cl_event. */ class Event : public detail::Wrapper { public: Event() : detail::Wrapper() { } Event(const Event& event) : detail::Wrapper(event) { } Event& operator = (const Event& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_event_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetEventInfo, object_, name, param), __GET_EVENT_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_event_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } template cl_int getProfilingInfo(cl_profiling_info name, T* param) const { return detail::errHandler(detail::getInfo( &::clGetEventProfilingInfo, object_, name, param), __GET_EVENT_PROFILE_INFO_ERR); } template typename detail::param_traits::param_type getProfilingInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_profiling_info, name>::param_type param; cl_int result = getProfilingInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int wait() const { return detail::errHandler( ::clWaitForEvents(1, &object_), __WAIT_FOR_EVENTS_ERR); } #if defined(CL_VERSION_1_1) cl_int setCallback( cl_int type, void (CL_CALLBACK * pfn_notify)(cl_event, cl_int, void *), void * user_data = NULL) { return detail::errHandler( ::clSetEventCallback( object_, type, pfn_notify, user_data), __SET_EVENT_CALLBACK_ERR); } #endif static cl_int waitForEvents(const VECTOR_CLASS& events) { return detail::errHandler( ::clWaitForEvents( (cl_uint) events.size(), (cl_event*)&events.front()), __WAIT_FOR_EVENTS_ERR); } }; __GET_INFO_HELPER_WITH_RETAIN(cl::Event) #if defined(CL_VERSION_1_1) /*! \class UserEvent * \brief User event interface for cl_event. */ class UserEvent : public Event { public: UserEvent( const Context& context, cl_int * err = NULL) { cl_int error; object_ = ::clCreateUserEvent( context(), &error); detail::errHandler(error, __CREATE_USER_EVENT_ERR); if (err != NULL) { *err = error; } } UserEvent() : Event() { } UserEvent(const UserEvent& event) : Event(event) { } UserEvent& operator = (const UserEvent& rhs) { if (this != &rhs) { Event::operator=(rhs); } return *this; } cl_int setStatus(cl_int status) { return detail::errHandler( ::clSetUserEventStatus(object_,status), __SET_USER_EVENT_STATUS_ERR); } }; #endif inline static cl_int WaitForEvents(const VECTOR_CLASS& events) { return detail::errHandler( ::clWaitForEvents( (cl_uint) events.size(), (cl_event*)&events.front()), __WAIT_FOR_EVENTS_ERR); } /*! \class Memory * \brief Memory interface for cl_mem. */ class Memory : public detail::Wrapper { public: Memory() : detail::Wrapper() { } Memory(const Memory& memory) : detail::Wrapper(memory) { } Memory& operator = (const Memory& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_mem_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetMemObjectInfo, object_, name, param), __GET_MEM_OBJECT_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_mem_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } #if defined(CL_VERSION_1_1) cl_int setDestructorCallback( void (CL_CALLBACK * pfn_notify)(cl_mem, void *), void * user_data = NULL) { return detail::errHandler( ::clSetMemObjectDestructorCallback( object_, pfn_notify, user_data), __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR); } #endif }; __GET_INFO_HELPER_WITH_RETAIN(cl::Memory) /*! \class Buffer * \brief Memory buffer interface. */ class Buffer : public Memory { public: Buffer( const Context& context, cl_mem_flags flags, ::size_t size, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; object_ = ::clCreateBuffer(context(), flags, size, host_ptr, &error); detail::errHandler(error, __CREATE_BUFFER_ERR); if (err != NULL) { *err = error; } } Buffer() : Memory() { } Buffer(const Buffer& buffer) : Memory(buffer) { } Buffer& operator = (const Buffer& rhs) { if (this != &rhs) { Memory::operator=(rhs); } return *this; } #if defined(CL_VERSION_1_1) Buffer createSubBuffer( cl_mem_flags flags, cl_buffer_create_type buffer_create_type, const void * buffer_create_info, cl_int * err = NULL) { Buffer result; cl_int error; result.object_ = ::clCreateSubBuffer( object_, flags, buffer_create_type, buffer_create_info, &error); detail::errHandler(error, __CREATE_SUBBUFFER_ERR); if (err != NULL) { *err = error; } return result; } #endif }; #if defined (USE_DX_INTEROP) class BufferD3D10 : public Buffer { public: typedef CL_API_ENTRY cl_mem (CL_API_CALL *PFN_clCreateFromD3D10BufferKHR)( cl_context context, cl_mem_flags flags, ID3D10Buffer* buffer, cl_int* errcode_ret); BufferD3D10( const Context& context, cl_mem_flags flags, ID3D10Buffer* bufobj, cl_int * err = NULL) { static PFN_clCreateFromD3D10BufferKHR pfn_clCreateFromD3D10BufferKHR = NULL; __INIT_CL_EXT_FCN_PTR(clCreateFromD3D10BufferKHR); cl_int error; object_ = pfn_clCreateFromD3D10BufferKHR( context(), flags, bufobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } BufferD3D10() : Buffer() { } BufferD3D10(const BufferD3D10& buffer) : Buffer(buffer) { } BufferD3D10& operator = (const BufferD3D10& rhs) { if (this != &rhs) { Buffer::operator=(rhs); } return *this; } }; #endif /*! \class BufferGL * \brief Memory buffer interface for GL interop. */ class BufferGL : public Buffer { public: BufferGL( const Context& context, cl_mem_flags flags, GLuint bufobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLBuffer( context(), flags, bufobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } BufferGL() : Buffer() { } BufferGL(const BufferGL& buffer) : Buffer(buffer) { } BufferGL& operator = (const BufferGL& rhs) { if (this != &rhs) { Buffer::operator=(rhs); } return *this; } cl_int getObjectInfo( cl_gl_object_type *type, GLuint * gl_object_name) { return detail::errHandler( ::clGetGLObjectInfo(object_,type,gl_object_name), __GET_GL_OBJECT_INFO_ERR); } }; /*! \class BufferRenderGL * \brief Memory buffer interface for GL interop with renderbuffer. */ class BufferRenderGL : public Buffer { public: BufferRenderGL( const Context& context, cl_mem_flags flags, GLuint bufobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLRenderbuffer( context(), flags, bufobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } BufferRenderGL() : Buffer() { } BufferRenderGL(const BufferGL& buffer) : Buffer(buffer) { } BufferRenderGL& operator = (const BufferRenderGL& rhs) { if (this != &rhs) { Buffer::operator=(rhs); } return *this; } cl_int getObjectInfo( cl_gl_object_type *type, GLuint * gl_object_name) { return detail::errHandler( ::clGetGLObjectInfo(object_,type,gl_object_name), __GET_GL_OBJECT_INFO_ERR); } }; /*! \class Image * \brief Base class interface for all images. */ class Image : public Memory { protected: Image() : Memory() { } Image(const Image& image) : Memory(image) { } Image& operator = (const Image& rhs) { if (this != &rhs) { Memory::operator=(rhs); } return *this; } public: template cl_int getImageInfo(cl_image_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetImageInfo, object_, name, param), __GET_IMAGE_INFO_ERR); } template typename detail::param_traits::param_type getImageInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_image_info, name>::param_type param; cl_int result = getImageInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } }; /*! \class Image2D * \brief Image interface for 2D images. */ class Image2D : public Image { public: Image2D( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t width, ::size_t height, ::size_t row_pitch = 0, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; object_ = ::clCreateImage2D( context(), flags,&format, width, height, row_pitch, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE2D_ERR); if (err != NULL) { *err = error; } } Image2D() { } Image2D(const Image2D& image2D) : Image(image2D) { } Image2D& operator = (const Image2D& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } }; /*! \class Image2DGL * \brief 2D image interface for GL interop. */ class Image2DGL : public Image2D { public: Image2DGL( const Context& context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLTexture2D( context(), flags, target, miplevel, texobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } Image2DGL() : Image2D() { } Image2DGL(const Image2DGL& image) : Image2D(image) { } Image2DGL& operator = (const Image2DGL& rhs) { if (this != &rhs) { Image2D::operator=(rhs); } return *this; } }; /*! \class Image3D * \brief Image interface for 3D images. */ class Image3D : public Image { public: Image3D( const Context& context, cl_mem_flags flags, ImageFormat format, ::size_t width, ::size_t height, ::size_t depth, ::size_t row_pitch = 0, ::size_t slice_pitch = 0, void* host_ptr = NULL, cl_int* err = NULL) { cl_int error; object_ = ::clCreateImage3D( context(), flags, &format, width, height, depth, row_pitch, slice_pitch, host_ptr, &error); detail::errHandler(error, __CREATE_IMAGE3D_ERR); if (err != NULL) { *err = error; } } Image3D() { } Image3D(const Image3D& image3D) : Image(image3D) { } Image3D& operator = (const Image3D& rhs) { if (this != &rhs) { Image::operator=(rhs); } return *this; } }; /*! \class Image2DGL * \brief 2D image interface for GL interop. */ class Image3DGL : public Image3D { public: Image3DGL( const Context& context, cl_mem_flags flags, GLenum target, GLint miplevel, GLuint texobj, cl_int * err = NULL) { cl_int error; object_ = ::clCreateFromGLTexture3D( context(), flags, target, miplevel, texobj, &error); detail::errHandler(error, __CREATE_GL_BUFFER_ERR); if (err != NULL) { *err = error; } } Image3DGL() : Image3D() { } Image3DGL(const Image3DGL& image) : Image3D(image) { } Image3DGL& operator = (const Image3DGL& rhs) { if (this != &rhs) { Image3D::operator=(rhs); } return *this; } }; /*! \class Sampler * \brief Sampler interface for cl_sampler. */ class Sampler : public detail::Wrapper { public: Sampler() { } Sampler( const Context& context, cl_bool normalized_coords, cl_addressing_mode addressing_mode, cl_filter_mode filter_mode, cl_int* err = NULL) { cl_int error; object_ = ::clCreateSampler( context(), normalized_coords, addressing_mode, filter_mode, &error); detail::errHandler(error, __CREATE_SAMPLER_ERR); if (err != NULL) { *err = error; } } Sampler(const Sampler& sampler) : detail::Wrapper(sampler) { } Sampler& operator = (const Sampler& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_sampler_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetSamplerInfo, object_, name, param), __GET_SAMPLER_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_sampler_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } }; __GET_INFO_HELPER_WITH_RETAIN(cl::Sampler) class Program; class CommandQueue; class Kernel; /*! \class NDRange * \brief NDRange interface */ class NDRange { private: size_t<3> sizes_; cl_uint dimensions_; public: NDRange() : dimensions_(0) { } NDRange(::size_t size0) : dimensions_(1) { sizes_.push_back(size0); } NDRange(::size_t size0, ::size_t size1) : dimensions_(2) { sizes_.push_back(size0); sizes_.push_back(size1); } NDRange(::size_t size0, ::size_t size1, ::size_t size2) : dimensions_(3) { sizes_.push_back(size0); sizes_.push_back(size1); sizes_.push_back(size2); } operator const ::size_t*() const { return (const ::size_t*) sizes_; } ::size_t dimensions() const { return dimensions_; } }; static const NDRange NullRange; /*! * \struct LocalSpaceArg * \brief Local address raper for use with Kernel::setArg */ struct LocalSpaceArg { ::size_t size_; }; namespace detail { template struct KernelArgumentHandler { static ::size_t size(const T&) { return sizeof(T); } static T* ptr(T& value) { return &value; } }; template <> struct KernelArgumentHandler { static ::size_t size(const LocalSpaceArg& value) { return value.size_; } static void* ptr(LocalSpaceArg&) { return NULL; } }; } //! \endcond inline LocalSpaceArg __local(::size_t size) { LocalSpaceArg ret = { size }; return ret; } class KernelFunctor; /*! \class Kernel * \brief Kernel interface that implements cl_kernel */ class Kernel : public detail::Wrapper { public: inline Kernel(const Program& program, const char* name, cl_int* err = NULL); Kernel() { } Kernel(const Kernel& kernel) : detail::Wrapper(kernel) { } Kernel& operator = (const Kernel& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_kernel_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetKernelInfo, object_, name, param), __GET_KERNEL_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_kernel_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } template cl_int getWorkGroupInfo( const Device& device, cl_kernel_work_group_info name, T* param) const { return detail::errHandler( detail::getInfo( &::clGetKernelWorkGroupInfo, object_, device(), name, param), __GET_KERNEL_WORK_GROUP_INFO_ERR); } template typename detail::param_traits::param_type getWorkGroupInfo(const Device& device, cl_int* err = NULL) const { typename detail::param_traits< detail::cl_kernel_work_group_info, name>::param_type param; cl_int result = getWorkGroupInfo(device, name, ¶m); if (err != NULL) { *err = result; } return param; } template cl_int setArg(cl_uint index, T value) { return detail::errHandler( ::clSetKernelArg( object_, index, detail::KernelArgumentHandler::size(value), detail::KernelArgumentHandler::ptr(value)), __SET_KERNEL_ARGS_ERR); } cl_int setArg(cl_uint index, ::size_t size, void* argPtr) { return detail::errHandler( ::clSetKernelArg(object_, index, size, argPtr), __SET_KERNEL_ARGS_ERR); } KernelFunctor bind( const CommandQueue& queue, const NDRange& offset, const NDRange& global, const NDRange& local); KernelFunctor bind( const CommandQueue& queue, const NDRange& global, const NDRange& local); }; __GET_INFO_HELPER_WITH_RETAIN(cl::Kernel) /*! \class Program * \brief Program interface that implements cl_program. */ class Program : public detail::Wrapper { public: typedef VECTOR_CLASS > Binaries; typedef VECTOR_CLASS > Sources; Program( const Context& context, const Sources& sources, cl_int* err = NULL) { cl_int error; const ::size_t n = (::size_t)sources.size(); ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t)); const char** strings = (const char**) alloca(n * sizeof(const char*)); for (::size_t i = 0; i < n; ++i) { strings[i] = sources[(int)i].first; lengths[i] = sources[(int)i].second; } object_ = ::clCreateProgramWithSource( context(), (cl_uint)n, strings, lengths, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR); if (err != NULL) { *err = error; } } Program( const Context& context, const VECTOR_CLASS& devices, const Binaries& binaries, VECTOR_CLASS* binaryStatus = NULL, cl_int* err = NULL) { cl_int error; const ::size_t n = binaries.size(); ::size_t* lengths = (::size_t*) alloca(n * sizeof(::size_t)); const unsigned char** images = (const unsigned char**) alloca(n * sizeof(const void*)); for (::size_t i = 0; i < n; ++i) { images[i] = (const unsigned char*)binaries[(int)i].first; lengths[i] = binaries[(int)i].second; } object_ = ::clCreateProgramWithBinary( context(), (cl_uint) devices.size(), (cl_device_id*)&devices.front(), lengths, images, binaryStatus != NULL ? (cl_int*) &binaryStatus->front() : NULL, &error); detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR); if (err != NULL) { *err = error; } } Program() { } Program(const Program& program) : detail::Wrapper(program) { } Program& operator = (const Program& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } cl_int build( const VECTOR_CLASS& devices, const char* options = NULL, void (CL_CALLBACK * notifyFptr)(cl_program, void *) = NULL, void* data = NULL) const { return detail::errHandler( ::clBuildProgram( object_, (cl_uint) devices.size(), (cl_device_id*)&devices.front(), options, notifyFptr, data), __BUILD_PROGRAM_ERR); } template cl_int getInfo(cl_program_info name, T* param) const { return detail::errHandler( detail::getInfo(&::clGetProgramInfo, object_, name, param), __GET_PROGRAM_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_program_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } template cl_int getBuildInfo( const Device& device, cl_program_build_info name, T* param) const { return detail::errHandler( detail::getInfo( &::clGetProgramBuildInfo, object_, device(), name, param), __GET_PROGRAM_BUILD_INFO_ERR); } template typename detail::param_traits::param_type getBuildInfo(const Device& device, cl_int* err = NULL) const { typename detail::param_traits< detail::cl_program_build_info, name>::param_type param; cl_int result = getBuildInfo(device, name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int createKernels(VECTOR_CLASS* kernels) { cl_uint numKernels; cl_int err = ::clCreateKernelsInProgram(object_, 0, NULL, &numKernels); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); } Kernel* value = (Kernel*) alloca(numKernels * sizeof(Kernel)); err = ::clCreateKernelsInProgram( object_, numKernels, (cl_kernel*) value, NULL); if (err != CL_SUCCESS) { return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR); } kernels->assign(&value[0], &value[numKernels]); return CL_SUCCESS; } }; __GET_INFO_HELPER_WITH_RETAIN(cl::Program) inline Kernel::Kernel(const Program& program, const char* name, cl_int* err) { cl_int error; object_ = ::clCreateKernel(program(), name, &error); detail::errHandler(error, __CREATE_KERNEL_ERR); if (err != NULL) { *err = error; } } /*! \class CommandQueue * \brief CommandQueue interface for cl_command_queue. */ class CommandQueue : public detail::Wrapper { public: CommandQueue( const Context& context, const Device& device, cl_command_queue_properties properties = 0, cl_int* err = NULL) { cl_int error; object_ = ::clCreateCommandQueue( context(), device(), properties, &error); detail::errHandler(error, __CREATE_COMMAND_QUEUE_ERR); if (err != NULL) { *err = error; } } CommandQueue() { } CommandQueue(const CommandQueue& commandQueue) : detail::Wrapper(commandQueue) { } CommandQueue& operator = (const CommandQueue& rhs) { if (this != &rhs) { detail::Wrapper::operator=(rhs); } return *this; } template cl_int getInfo(cl_command_queue_info name, T* param) const { return detail::errHandler( detail::getInfo( &::clGetCommandQueueInfo, object_, name, param), __GET_COMMAND_QUEUE_INFO_ERR); } template typename detail::param_traits::param_type getInfo(cl_int* err = NULL) const { typename detail::param_traits< detail::cl_command_queue_info, name>::param_type param; cl_int result = getInfo(name, ¶m); if (err != NULL) { *err = result; } return param; } cl_int enqueueReadBuffer( const Buffer& buffer, cl_bool blocking, ::size_t offset, ::size_t size, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueReadBuffer( object_, buffer(), blocking, offset, size, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_READ_BUFFER_ERR); } cl_int enqueueWriteBuffer( const Buffer& buffer, cl_bool blocking, ::size_t offset, ::size_t size, const void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueWriteBuffer( object_, buffer(), blocking, offset, size, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_WRITE_BUFFER_ERR); } cl_int enqueueCopyBuffer( const Buffer& src, const Buffer& dst, ::size_t src_offset, ::size_t dst_offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueCopyBuffer( object_, src(), dst(), src_offset, dst_offset, size, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQEUE_COPY_BUFFER_ERR); } #if defined(CL_VERSION_1_1) cl_int enqueueReadBufferRect( const Buffer& buffer, cl_bool blocking, const size_t<3>& buffer_offset, const size_t<3>& host_offset, const size_t<3>& region, ::size_t buffer_row_pitch, ::size_t buffer_slice_pitch, ::size_t host_row_pitch, ::size_t host_slice_pitch, void *ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueReadBufferRect( object_, buffer(), blocking, (const ::size_t *)buffer_offset, (const ::size_t *)host_offset, (const ::size_t *)region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_READ_BUFFER_RECT_ERR); } cl_int enqueueWriteBufferRect( const Buffer& buffer, cl_bool blocking, const size_t<3>& buffer_offset, const size_t<3>& host_offset, const size_t<3>& region, ::size_t buffer_row_pitch, ::size_t buffer_slice_pitch, ::size_t host_row_pitch, ::size_t host_slice_pitch, void *ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueWriteBufferRect( object_, buffer(), blocking, (const ::size_t *)buffer_offset, (const ::size_t *)host_offset, (const ::size_t *)region, buffer_row_pitch, buffer_slice_pitch, host_row_pitch, host_slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_WRITE_BUFFER_RECT_ERR); } cl_int enqueueCopyBufferRect( const Buffer& src, const Buffer& dst, const size_t<3>& src_origin, const size_t<3>& dst_origin, const size_t<3>& region, ::size_t src_row_pitch, ::size_t src_slice_pitch, ::size_t dst_row_pitch, ::size_t dst_slice_pitch, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueCopyBufferRect( object_, src(), dst(), (const ::size_t *)src_origin, (const ::size_t *)dst_origin, (const ::size_t *)region, src_row_pitch, src_slice_pitch, dst_row_pitch, dst_slice_pitch, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQEUE_COPY_BUFFER_RECT_ERR); } #endif cl_int enqueueReadImage( const Image& image, cl_bool blocking, const size_t<3>& origin, const size_t<3>& region, ::size_t row_pitch, ::size_t slice_pitch, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueReadImage( object_, image(), blocking, (const ::size_t *) origin, (const ::size_t *) region, row_pitch, slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_READ_IMAGE_ERR); } cl_int enqueueWriteImage( const Image& image, cl_bool blocking, const size_t<3>& origin, const size_t<3>& region, ::size_t row_pitch, ::size_t slice_pitch, void* ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueWriteImage( object_, image(), blocking, (const ::size_t *) origin, (const ::size_t *) region, row_pitch, slice_pitch, ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_WRITE_IMAGE_ERR); } cl_int enqueueCopyImage( const Image& src, const Image& dst, const size_t<3>& src_origin, const size_t<3>& dst_origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueCopyImage( object_, src(), dst(), (const ::size_t *) src_origin, (const ::size_t *)dst_origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_COPY_IMAGE_ERR); } cl_int enqueueCopyImageToBuffer( const Image& src, const Buffer& dst, const size_t<3>& src_origin, const size_t<3>& region, ::size_t dst_offset, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueCopyImageToBuffer( object_, src(), dst(), (const ::size_t *) src_origin, (const ::size_t *) region, dst_offset, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR); } cl_int enqueueCopyBufferToImage( const Buffer& src, const Image& dst, ::size_t src_offset, const size_t<3>& dst_origin, const size_t<3>& region, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueCopyBufferToImage( object_, src(), dst(), src_offset, (const ::size_t *) dst_origin, (const ::size_t *) region, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR); } void* enqueueMapBuffer( const Buffer& buffer, cl_bool blocking, cl_map_flags flags, ::size_t offset, ::size_t size, const VECTOR_CLASS* events = NULL, Event* event = NULL, cl_int* err = NULL) const { cl_int error; void * result = ::clEnqueueMapBuffer( object_, buffer(), blocking, flags, offset, size, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event, &error); detail::errHandler(error, __ENQUEUE_MAP_BUFFER_ERR); if (err != NULL) { *err = error; } return result; } void* enqueueMapImage( const Image& buffer, cl_bool blocking, cl_map_flags flags, const size_t<3>& origin, const size_t<3>& region, ::size_t * row_pitch, ::size_t * slice_pitch, const VECTOR_CLASS* events = NULL, Event* event = NULL, cl_int* err = NULL) const { cl_int error; void * result = ::clEnqueueMapImage( object_, buffer(), blocking, flags, (const ::size_t *) origin, (const ::size_t *) region, row_pitch, slice_pitch, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event, &error); detail::errHandler(error, __ENQUEUE_MAP_IMAGE_ERR); if (err != NULL) { *err = error; } return result; } cl_int enqueueUnmapMemObject( const Memory& memory, void* mapped_ptr, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueUnmapMemObject( object_, memory(), mapped_ptr, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_UNMAP_MEM_OBJECT_ERR); } cl_int enqueueNDRangeKernel( const Kernel& kernel, const NDRange& offset, const NDRange& global, const NDRange& local, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueNDRangeKernel( object_, kernel(), (cl_uint) global.dimensions(), offset.dimensions() != 0 ? (const ::size_t*) offset : NULL, (const ::size_t*) global, local.dimensions() != 0 ? (const ::size_t*) local : NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_NDRANGE_KERNEL_ERR); } cl_int enqueueTask( const Kernel& kernel, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueTask( object_, kernel(), (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_TASK_ERR); } cl_int enqueueNativeKernel( void (*userFptr)(void *), std::pair args, const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* mem_locs = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { cl_mem * mems = (mem_objects != NULL && mem_objects->size() > 0) ? (cl_mem*) alloca(mem_objects->size() * sizeof(cl_mem)) : NULL; if (mems != NULL) { for (unsigned int i = 0; i < mem_objects->size(); i++) { mems[i] = ((*mem_objects)[i])(); } } return detail::errHandler( ::clEnqueueNativeKernel( object_, userFptr, args.first, args.second, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, mems, (mem_locs != NULL) ? (const void **) &mem_locs->front() : NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_NATIVE_KERNEL); } cl_int enqueueMarker(Event* event = NULL) const { return detail::errHandler( ::clEnqueueMarker(object_, (cl_event*) event), __ENQUEUE_MARKER_ERR); } cl_int enqueueWaitForEvents(const VECTOR_CLASS& events) const { return detail::errHandler( ::clEnqueueWaitForEvents( object_, (cl_uint) events.size(), (const cl_event*) &events.front()), __ENQUEUE_WAIT_FOR_EVENTS_ERR); } cl_int enqueueAcquireGLObjects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueAcquireGLObjects( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_ACQUIRE_GL_ERR); } cl_int enqueueReleaseGLObjects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { return detail::errHandler( ::clEnqueueReleaseGLObjects( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL && events->size() > 0) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_RELEASE_GL_ERR); } #if defined (USE_DX_INTEROP) typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueAcquireD3D10ObjectsKHR)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem* mem_objects, cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)( cl_command_queue command_queue, cl_uint num_objects, const cl_mem* mem_objects, cl_uint num_events_in_wait_list, const cl_event* event_wait_list, cl_event* event); cl_int enqueueAcquireD3D10Objects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { static PFN_clEnqueueAcquireD3D10ObjectsKHR pfn_clEnqueueAcquireD3D10ObjectsKHR = NULL; __INIT_CL_EXT_FCN_PTR(clEnqueueAcquireD3D10ObjectsKHR); return detail::errHandler( pfn_clEnqueueAcquireD3D10ObjectsKHR( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_ACQUIRE_GL_ERR); } cl_int enqueueReleaseD3D10Objects( const VECTOR_CLASS* mem_objects = NULL, const VECTOR_CLASS* events = NULL, Event* event = NULL) const { static PFN_clEnqueueReleaseD3D10ObjectsKHR pfn_clEnqueueReleaseD3D10ObjectsKHR = NULL; __INIT_CL_EXT_FCN_PTR(clEnqueueReleaseD3D10ObjectsKHR); return detail::errHandler( pfn_clEnqueueReleaseD3D10ObjectsKHR( object_, (mem_objects != NULL) ? (cl_uint) mem_objects->size() : 0, (mem_objects != NULL) ? (const cl_mem *) &mem_objects->front(): NULL, (events != NULL) ? (cl_uint) events->size() : 0, (events != NULL) ? (cl_event*) &events->front() : NULL, (cl_event*) event), __ENQUEUE_RELEASE_GL_ERR); } #endif cl_int enqueueBarrier() const { return detail::errHandler( ::clEnqueueBarrier(object_), __ENQUEUE_BARRIER_ERR); } cl_int flush() const { return detail::errHandler(::clFlush(object_), __FLUSH_ERR); } cl_int finish() const { return detail::errHandler(::clFinish(object_), __FINISH_ERR); } }; __GET_INFO_HELPER_WITH_RETAIN(cl::CommandQueue) /*! \class KernelFunctor * \brief Kernel functor interface * * \note Currently only functors of zero to ten arguments are supported. It * is straightforward to add more and a more general solution, similar to * Boost.Lambda could be followed if required in the future. */ class KernelFunctor { private: Kernel kernel_; CommandQueue queue_; NDRange offset_; NDRange global_; NDRange local_; cl_int err_; public: KernelFunctor() { } KernelFunctor( const Kernel& kernel, const CommandQueue& queue, const NDRange& offset, const NDRange& global, const NDRange& local) : kernel_(kernel), queue_(queue), offset_(offset), global_(global), local_(local), err_(CL_SUCCESS) {} KernelFunctor& operator=(const KernelFunctor& rhs); KernelFunctor(const KernelFunctor& rhs); cl_int getError() { return err_; } inline Event operator()(const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const A13& a13, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const A13& a13, const A14& a14, const VECTOR_CLASS* events = NULL); template inline Event operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const A13& a13, const A14& a14, const A15& a15, const VECTOR_CLASS* events = NULL); }; inline KernelFunctor Kernel::bind( const CommandQueue& queue, const NDRange& offset, const NDRange& global, const NDRange& local) { return KernelFunctor(*this,queue,offset,global,local); } inline KernelFunctor Kernel::bind( const CommandQueue& queue, const NDRange& global, const NDRange& local) { return KernelFunctor(*this,queue,NullRange,global,local); } inline KernelFunctor& KernelFunctor::operator=(const KernelFunctor& rhs) { if (this == &rhs) { return *this; } kernel_ = rhs.kernel_; queue_ = rhs.queue_; offset_ = rhs.offset_; global_ = rhs.global_; local_ = rhs.local_; return *this; } inline KernelFunctor::KernelFunctor(const KernelFunctor& rhs) : kernel_(rhs.kernel_), queue_(rhs.queue_), offset_(rhs.offset_), global_(rhs.global_), local_(rhs.local_) { } Event KernelFunctor::operator()(const VECTOR_CLASS* events) { Event event; err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); kernel_.setArg(9,a10); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); kernel_.setArg(9,a10); kernel_.setArg(10,a11); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); kernel_.setArg(9,a10); kernel_.setArg(10,a11); kernel_.setArg(11,a12); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const A13& a13, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); kernel_.setArg(9,a10); kernel_.setArg(10,a11); kernel_.setArg(11,a12); kernel_.setArg(12,a13); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const A13& a13, const A14& a14, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); kernel_.setArg(9,a10); kernel_.setArg(10,a11); kernel_.setArg(11,a12); kernel_.setArg(12,a13); kernel_.setArg(13,a14); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } template Event KernelFunctor::operator()( const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10, const A11& a11, const A12& a12, const A13& a13, const A14& a14, const A15& a15, const VECTOR_CLASS* events) { Event event; kernel_.setArg(0,a1); kernel_.setArg(1,a2); kernel_.setArg(2,a3); kernel_.setArg(3,a4); kernel_.setArg(4,a5); kernel_.setArg(5,a6); kernel_.setArg(6,a7); kernel_.setArg(7,a8); kernel_.setArg(8,a9); kernel_.setArg(9,a10); kernel_.setArg(10,a11); kernel_.setArg(11,a12); kernel_.setArg(12,a13); kernel_.setArg(13,a14); kernel_.setArg(14,a15); err_ = queue_.enqueueNDRangeKernel( kernel_, offset_, global_, local_, NULL, // bgaster_fixme - do we want to allow wait event lists? &event); return event; } #undef __ERR_STR #if !defined(__CL_USER_OVERRIDE_ERROR_STRINGS) #undef __GET_DEVICE_INFO_ERR #undef __GET_PLATFORM_INFO_ERR #undef __GET_DEVICE_IDS_ERR #undef __GET_CONTEXT_INFO_ERR #undef __GET_EVENT_INFO_ERR #undef __GET_EVENT_PROFILE_INFO_ERR #undef __GET_MEM_OBJECT_INFO_ERR #undef __GET_IMAGE_INFO_ERR #undef __GET_SAMPLER_INFO_ERR #undef __GET_KERNEL_INFO_ERR #undef __GET_KERNEL_WORK_GROUP_INFO_ERR #undef __GET_PROGRAM_INFO_ERR #undef __GET_PROGRAM_BUILD_INFO_ERR #undef __GET_COMMAND_QUEUE_INFO_ERR #undef __CREATE_CONTEXT_FROM_TYPE_ERR #undef __GET_SUPPORTED_IMAGE_FORMATS_ERR #undef __CREATE_BUFFER_ERR #undef __CREATE_SUBBUFFER_ERR #undef __CREATE_IMAGE2D_ERR #undef __CREATE_IMAGE3D_ERR #undef __CREATE_SAMPLER_ERR #undef __SET_MEM_OBJECT_DESTRUCTOR_CALLBACK_ERR #undef __CREATE_USER_EVENT_ERR #undef __SET_USER_EVENT_STATUS_ERR #undef __SET_EVENT_CALLBACK_ERR #undef __WAIT_FOR_EVENTS_ERR #undef __CREATE_KERNEL_ERR #undef __SET_KERNEL_ARGS_ERR #undef __CREATE_PROGRAM_WITH_SOURCE_ERR #undef __CREATE_PROGRAM_WITH_BINARY_ERR #undef __BUILD_PROGRAM_ERR #undef __CREATE_KERNELS_IN_PROGRAM_ERR #undef __CREATE_COMMAND_QUEUE_ERR #undef __SET_COMMAND_QUEUE_PROPERTY_ERR #undef __ENQUEUE_READ_BUFFER_ERR #undef __ENQUEUE_WRITE_BUFFER_ERR #undef __ENQUEUE_READ_BUFFER_RECT_ERR #undef __ENQUEUE_WRITE_BUFFER_RECT_ERR #undef __ENQEUE_COPY_BUFFER_ERR #undef __ENQEUE_COPY_BUFFER_RECT_ERR #undef __ENQUEUE_READ_IMAGE_ERR #undef __ENQUEUE_WRITE_IMAGE_ERR #undef __ENQUEUE_COPY_IMAGE_ERR #undef __ENQUEUE_COPY_IMAGE_TO_BUFFER_ERR #undef __ENQUEUE_COPY_BUFFER_TO_IMAGE_ERR #undef __ENQUEUE_MAP_BUFFER_ERR #undef __ENQUEUE_MAP_IMAGE_ERR #undef __ENQUEUE_UNMAP_MEM_OBJECT_ERR #undef __ENQUEUE_NDRANGE_KERNEL_ERR #undef __ENQUEUE_TASK_ERR #undef __ENQUEUE_NATIVE_KERNEL #undef __UNLOAD_COMPILER_ERR #endif //__CL_USER_OVERRIDE_ERROR_STRINGS #undef __GET_INFO_HELPER_WITH_RETAIN // Extensions #undef __INIT_CL_EXT_FCN_PTR #undef __CREATE_SUB_DEVICES #if defined(USE_CL_DEVICE_FISSION) #undef __PARAM_NAME_DEVICE_FISSION #endif // USE_CL_DEVICE_FISSION } // namespace cl #endif // CL_HPP_ mandelbulber1.21-1.orig/src/database.cpp0000644000175000017500000001031512274512437021113 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class similar to std::vector, but much simplier / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include "database.hpp" cDatabase::cDatabase(int size) { records = new char*[size]; status = new sRecordStatus[size]; //wartosci poczštkowe for (int i = 0; i < size; i++) { status[i].used = false; status[i].index = i; } recordCount = size; indexCount = size - 1; } void cDatabase::ClearDatabase() { for (int i = 0; i < recordCount; i++) { if (status[i].used) { delete[] records[i]; } } delete[] records; delete[] status; } //put data into database errorCode cDatabase::SetRecord(int index, const char *record, int recordSize) { errorCode err; if (index < recordCount) { //delete old data if (status[index].used) delete[] records[index]; //przepisanie danych do rekordu char *data = new char[recordSize]; const char *dataInput = record; for (int i = 0; i < recordSize; i++) { data[i] = dataInput[i]; } records[index] = data; status[index].size = recordSize; status[index].used = true; err = err_ok; } else { err = err_badIndex; } return err; } //get data from database errorCode cDatabase::GetRecord(int index, char *record) { errorCode err; if (index < recordCount) { if (status[index].used) { char *data = (char*) records[index]; char *dataOut = (char*) record; for (int i = 0; i < status[index].size; i++) { dataOut[i] = data[i]; } err = err_ok; } else { err = err_missedRecord; } } else { err = err_badIndex; } return err; } //add new record into the end of database int cDatabase::AddRecord(const char *record, int recordSize) { recordCount++; //database resize char **records_new = new char*[recordCount]; sRecordStatus *status_new = new sRecordStatus[recordCount]; for (int i = 0; i < recordCount - 1; i++) { records_new[i] = records[i]; status_new[i] = status[i]; } delete[] records; delete[] status; records = records_new; status = status_new; //adding new record indexCount++; status[recordCount - 1].index = indexCount; status[recordCount - 1].used = false; SetRecord(recordCount - 1, record, recordSize); return indexCount; } //inserting new record int cDatabase::InsertRecord(int index, const char *record, int recordSize) { recordCount++; //database resize char **records_new = new char*[recordCount]; sRecordStatus *status_new = new sRecordStatus[recordCount]; //copying data into new array and prepare place for new record for (int i = 0; i < recordCount - 1; i++) { if (i < index) { records_new[i] = records[i]; status_new[i] = status[i]; } else { records_new[i + 1] = records[i]; status_new[i + 1] = status[i]; } } delete[] records; delete[] status; records = records_new; status = status_new; //adding new record indexCount++; status[index].index = indexCount; status[index].used = false; SetRecord(index, record, recordSize); return indexCount; } //delete record and decrease size of database errorCode cDatabase::DeleteRecord(int index) { errorCode err; if (index < recordCount) { recordCount--; //delete record data if (status[index].used) delete[] records[index]; //database resize char **records_new = new char*[recordCount]; sRecordStatus *status_new = new sRecordStatus[recordCount]; //copying data into new array for (int i = 0; i < recordCount; i++) { if (i < index) { records_new[i] = records[i]; status_new[i] = status[i]; } else { records_new[i] = records[i + 1]; status_new[i] = status[i + 1]; } } delete[] records; delete[] status; records = records_new; status = status_new; err = err_ok; } else { err = err_badIndex; } return err; } int cDatabase::Count() { return recordCount; } bool cDatabase::IsFilled(int index) { if (index < recordCount) { if (status[index].used) { return true; } else { return false; } } else { return false; } } int cDatabase::GetInternalIndex(int index) { if (index < recordCount) { return status[index].index; } else { return -1; } } mandelbulber1.21-1.orig/src/callbacks.h0000644000175000017500000001654712274512437020750 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / Functions called by UI / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef CALLBACKS_H_ #define CALLBACKS_H_ #include "Render3D.h" extern double last_navigator_step; extern CVector3 last_keyframe_position; extern bool renderRequest; gboolean CallerTimerLoop(void); gboolean CallerTimerLoopWindowRefresh(GtkWidget *widget); gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event); gboolean pressed_button_on_image(GtkWidget *widget, GdkEventButton *event); gboolean pressed_button_on_palette(GtkWidget *widget, GdkEventButton *event); gboolean StopRenderingAndQuit(GtkWidget *widget, GdkEvent *event, gpointer data); gboolean WindowReconfigured(GtkWindow *window, GdkEvent *event, gpointer data); gboolean on_darea_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data); gboolean on_dareaPalette_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data); void StartRendering(GtkWidget *widget, gpointer data); void StopRendering(GtkWidget *widget, gpointer data); void PressedApplyBrigtness(GtkWidget *widget, gpointer data); void PressedLoadSettings(GtkWidget *widget, gpointer data); void PressedSaveSettings(GtkWidget *widget, gpointer data); void PressedSaveImage(GtkWidget *widget, gpointer data); void PressedSaveImagePNG(GtkWidget *widget, gpointer data); void PressedSaveImagePNG16(GtkWidget *widget, gpointer data); void PressedSaveImagePNG16Alpha(GtkWidget *widget, gpointer data); void PressedOkDialogFiles(GtkWidget *widget, gpointer data); void PressedCancelDialogFiles(GtkWidget *widget, gpointer data); void PressedNavigatorUp(GtkWidget *widget, gpointer data); void PressedNavigatorDown(GtkWidget *widget, gpointer data); void PressedNavigatorLeft(GtkWidget *widget, gpointer data); void PressedNavigatorRight(GtkWidget *widget, gpointer data); void PressedNavigatorRotateLeft(GtkWidget *widget, gpointer data); void PressedNavigatorRotateRight(GtkWidget *widget, gpointer data); void PressedNavigatorMoveUp(GtkWidget *widget, gpointer data); void PressedNavigatorMoveDown(GtkWidget *widget, gpointer data); void PressedNavigatorMoveLeft(GtkWidget *widget, gpointer data); void PressedNavigatorMoveRight(GtkWidget *widget, gpointer data); void PressedNavigatorForward(GtkWidget *widget, gpointer data); void PressedNavigatorBackward(GtkWidget *widget, gpointer data); void PressedNavigatorInit(GtkWidget *widget, gpointer data); void PressedAnimationRecord(GtkWidget *widget, gpointer data); void PressedAnimationContinueRecording(GtkWidget *widget, gpointer data); void PressedAnimationRender(GtkWidget *widget, gpointer data); void ChangedComboScale(GtkWidget *widget, gpointer data); void ChangedComboFormula(GtkWidget *widget, gpointer data); void ChangedTgladFoldingMode(GtkWidget *widget, gpointer data); void ChangedJulia(GtkWidget *widget, gpointer data); void ChangedSphericalFoldingMode(GtkWidget *widget, gpointer data); void ChangedLimits(GtkWidget *widget, gpointer data); void ChangedAmbientOcclusion(GtkWidget *widget, gpointer data); void ChangedFastAmbientOcclusion(GtkWidget *widget, gpointer data); void ChangedMandelboxRotations(GtkWidget *widget, gpointer data); void ChangedIFSFoldingMode(GtkWidget *widget, gpointer data); void ChangedSliderFog(GtkWidget *widget, gpointer data); void ChangedSliderDOF(GtkWidget *widget, gpointer data); void PressedSSAOUpdate(GtkWidget *widget, gpointer data); void PressedDOFUpdate(GtkWidget *widget, gpointer data); void PressedDistributeLights(GtkWidget *widget, gpointer data); void RecalculateIFSParams(sFractal& fractal); void PressedIFSNormalizeOffset(GtkWidget *widget, gpointer data); void PressedIFSNormalizeVectors(GtkWidget *widget, gpointer data); void PressedRecordKeyframe(GtkWidget *widget, gpointer data); void PressedInsertKeyframe(GtkWidget *widget, gpointer data); void PressedKeyframeAnimationRender(GtkWidget *widget, gpointer data); void PressedPreviousKeyframe(GtkWidget *widget, gpointer data); void PressedNextKeyframe(GtkWidget *widget, gpointer data); void PressedTimelineRefresh(GtkWidget *widget, gpointer data); void PressedUndo(GtkWidget *widget, gpointer data); void PressedRedo(GtkWidget *widget, gpointer data); void PressedBuddhabrot(GtkWidget *widget, gpointer data); void PressedSelectDestination(GtkWidget *widget, gpointer data); void PressedSelectBackground(GtkWidget *widget, gpointer data); void PressedSelectEnvmap(GtkWidget *widget, gpointer data); void PressedSelectLightmap(GtkWidget *widget, gpointer data); void PressedSelectFlightPath(GtkWidget *widget, gpointer data); void PressedSelectKeyframes(GtkWidget *widget, gpointer data); void ChangedSliderPaletteOffset(GtkWidget *widget, gpointer data); void PressedRandomPalette(GtkWidget *widget, gpointer data); void CreateFormulaSequence(sFractal &fractal); void PressedGetPaletteFromImage(GtkWidget *widget, gpointer data); void PressedTimeline(GtkWidget *widget, gpointer data); void DeleteTimelineWindow(GtkWidget *widget, gpointer data); void PressedDeleteKeyframe(GtkWidget *widget, gpointer widget_pointer); void UpdatePreviewSettingsDialog(GtkFileChooser *file_chooser, gpointer data); void UpdatePreviewImageDialog(GtkFileChooser *file_chooser, gpointer data); void PressedIFSDefaultDodeca(GtkWidget *widget, gpointer widget_pointer); void PressedIFSDefaultIcosa(GtkWidget *widget, gpointer widget_pointer); void PressedIFSDefaultOcta(GtkWidget *widget, gpointer widget_pointer); void PressedIFSDefaultMengerSponge(GtkWidget *widget, gpointer widget_pointer); void PressedIFSReset(GtkWidget *widget, gpointer data); void PressedAutoDEStep(GtkWidget *widget, gpointer widget_pointer); void PressedAutoDEStepHQ(GtkWidget *widget, gpointer widget_pointer); void ChangedConstantDEThreshold(GtkWidget *widget, gpointer data); void ChangedImageProportion(GtkWidget *widget, gpointer data); void PressedCopyToClipboard(GtkWidget *widget, gpointer data); void PressedPasteFromClipboard(GtkWidget *widget, gpointer data); void PressedLoadExample(GtkWidget *widget, gpointer data); void PressedAutoFog(GtkWidget *widget, gpointer data); void PressedMeasureActivation(GtkWidget *widget, gpointer data); void ChangedOpenClEnabled(GtkWidget *widget, gpointer data); void ChangedIterFogEnable(GtkWidget *widget, gpointer data); void PressedSaveAllImageLayers(GtkWidget *widget, gpointer data); void PressedServerEnable(GtkWidget *widget, gpointer data); void PressedClientEnable(GtkWidget *widget, gpointer data); void PressedServerScan(GtkWidget *widget, gpointer data); void ChangedOpenClCustomEnable(GtkWidget *widget, gpointer data); void ChangedComboOpenCLCustomFormulas(GtkWidget *widget, gpointer data); void PressedOpenCLEditFormula(GtkWidget *widget, gpointer data); void PressedOpenCLEditFormulaInit(GtkWidget *widget, gpointer data); void PressedOpenCLNewFormula(GtkWidget *widget, gpointer data); void PressedOpenCLDeleteFormula(GtkWidget *widget, gpointer data); void PressedRecompile(GtkWidget *widget, gpointer data); void PressedPath2Keyframes(GtkWidget *widget, gpointer data); double ScanFractal(sParamRender *params, CVector3 direction); double ScanSizeOfFractal(sParamRender *params); void AutoDEStep(bool highQuality); bool SendSettingsToClients(sParamRender fractParamToSave); bool GetSettingsfromServer(char *data, size_t size); void NoGUIClientEnable(void); #endif /* CALLBACKS_H_ */ mandelbulber1.21-1.orig/src/cl_support.hpp0000644000175000017500000000775712274512437021566 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / classes for OpenCL support / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef CL_SUPPORT_HPP_ #define CL_SUPPORT_HPP_ //#define __NO_STD_VECTOR // Use cl::vector instead of STL version //#define CLSUPPORT #ifdef CLSUPPORT #ifdef WIN32 #include "clew.h" #include "clew-cl.hpp" #else #include #endif #include #include #include #include #include #include //#include "fractal.h" #include "cimage.hpp" #include "texture.hpp" #include "mandelbulber_cl_data.h" class CCustomFormulas { public: CCustomFormulas(std::string dataDir); ~CCustomFormulas(); void SetActual(int index) {actualIndex = index;} bool SetActualByName(std::string name); void GetActual(std::string *name, std::string *formulaFile, std::string *iniFile); void NewFormula(std::string newName); void DeleteFormula(void); private: void RefreshList(void); std::vector listOfFiles; std::vector listOfNames; int count; int actualIndex; std::string customFormulasPath; }; class CclSupport { public: CclSupport(); bool checkErr(cl_int err, const char * name); void InitDevice(void); void InitFractal(void); void SetParams(sClInBuff *inBuff, sClInConstants *inConstants, enumFractalFormula formula); void Render(cImage *image, GtkWidget *outputDarea); sClPixel * GetRgbBuff() {return rgbbuff;} void PrepareBackgroundTexture(cTexture *texture); void AssignBackgroundTexture(cTexture *texture) { backgroundTextureSource = texture;} bool IsReady(void) {return ready;} bool IsEnabled(void) {return enabled;} void Enable(void); void Disable(void); int GetWidth() {return width;} int GetHeight() {return height;} void SetSize(int w, int h); void RecopileRequest(void); void Recompile(void); sClInBuff* GetInBuffer1(void) {return inBuffer1;} sClInConstants* GetInConstantBuffer1(void) {return constantsBuffer1;} CCustomFormulas *customFormulas; void SSAOPrepare(void); void SSAORender(cImage *image, GtkWidget *outputDarea); void DOFPrepare(void); void DOFRender(cImage *image, GtkWidget *outputDarea); private: bool enabled; bool ready; bool recompileRequest; sClPixel *rgbbuff; sClInBuff *inBuffer1; sClReflect *reflectBuffer; sClInConstants *constantsBuffer1; cl_uchar4 *backgroungImageBuffer; std::vector platformList; std::string platformVendor; cl::Context *context; cl::Buffer *outCL; cl::Buffer *inCLBuffer1; cl::Buffer *inCLConstBuffer1; cl::Buffer *auxReflectBuffer; cl::Image2D *backgroundImage2D; size_t backgroundImage2DWidth; size_t backgroundImage2DHeight; std::vector devices; cl::Program *program; cl::Kernel *kernel; cl::CommandQueue *queue; cl::Program *programSSAO; cl::Kernel *kernelSSAO; cl::CommandQueue *queueSSAO; cl::Program *programDOF; cl::Kernel *kernelDOF; cl::CommandQueue *queueDOF; bool SSAOprepared; bool DOFprepared; std::string clDir; int width; int height; unsigned int deviceIndex; unsigned int platformIndex; bool useCPU; size_t buffSize; unsigned int stepSize; unsigned int steps; size_t reflectBufferSize; cl_int numberOfComputeUnits; cl_int maxWorkItemDimmensions; cl_int maxMaxWorkGroupSize[3]; cl_int maxClockFrequency; size_t memorySize; size_t maxAllocMemSize; size_t memoryLimitByUser; size_t workGroupSize; size_t maxConstantBufferSize; cTexture *backgroundTextureSource; bool isNVIDIA; sClParams lastParams; sClFractal lastFractal; enumFractalFormula lastFormula; int lastStepSize; int lastEngineNumber; }; #else //dummy class CclSupport class CclSupport { public: bool IsEnabled(void) {return false;} bool IsReady(void) {return false;} void Enable(void) {return;} void Disable(void) {return;} void Init(void) {return;} void SetSize(int w, int h) {return;}; }; #endif extern CclSupport *clSupport; #endif /* CL_SUPPORT_HPP_ */ mandelbulber1.21-1.orig/src/algebra.hpp0000644000175000017500000000644112274512437020756 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / Vector and matrix algebra / Defenitions of vector and matrix classes / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #ifndef ALGEBRA_H_ #define ALGEBRA_H_ #include /************************* vector 3D **********************/ class CVector3 { public: inline CVector3() { x = 0; y = 0; z = 0; } inline CVector3(double x_init, double y_init, double z_init) { x = x_init; y = y_init; z = z_init; } inline CVector3(double alfa, double beta) { x = cos(beta) * cos(alfa); y = cos(beta) * sin(alfa); z = sin(beta); } inline CVector3(const CVector3 &vector) { x = vector.x; y = vector.y; z = vector.z; } inline CVector3 operator+(const CVector3 &vector) const { return CVector3(x + vector.x, y + vector.y, z + vector.z); } inline CVector3 operator-(const CVector3 &vector) const { return CVector3(x - vector.x, y - vector.y, z - vector.z); } inline CVector3 operator*(const double &scalar) const { return CVector3(x * scalar, y * scalar, z * scalar); } inline CVector3& operator=(const CVector3 &vector) { x = vector.x; y = vector.y; z = vector.z; return *this; } inline CVector3& operator+=(const CVector3 &vector) { x += vector.x; y += vector.y; z += vector.z; return *this; } inline CVector3& operator-=(const CVector3 &vector) { x -= vector.x; y -= vector.y; z -= vector.z; return *this; } inline CVector3& operator*=(const double &scalar) { x *= scalar; y *= scalar; z *= scalar; return *this; } inline double Length() const { return sqrt(x * x + y * y + z * z); } inline double Dot(const CVector3& vector) const { return x * vector.x + y * vector.y + z * vector.z; } inline CVector3 Cross(const CVector3& v) { CVector3 c; c.x = y*v.z - z*v.y; c.y = -x*v.z + z*v.x; c.z = x*v.y - y*v.x; return c; } inline double Normalize() //returns normalization factor { double norm = 1.0 / Length(); x = x * norm; y = y * norm; z = z * norm; return norm; } inline double GetAlfa() const { return atan2(y, x); } inline double GetBeta() const { return atan2(z, sqrt(x * x + y * y)); } double x; double y; double z; }; /************************* matrix 3x3 (fast) *****************/ class CMatrix33 { public: CMatrix33(); CMatrix33(const CMatrix33 &matrix); CMatrix33 operator*(const CMatrix33 &matrix) const; CVector3 operator*(const CVector3 &vector) const; CMatrix33& operator=(const CMatrix33&); double m11; double m12; double m13; double m21; double m22; double m23; double m31; double m32; double m33; }; /************************* rotation matrix *******************/ class CRotationMatrix { public: CRotationMatrix(); void RotateX(double angle); void RotateY(double angle); void RotateZ(double angle); void Null(); CVector3 RotateVector(const CVector3& vector) const; double GetAlfa() const; double GetBeta() const; double GetGamma() const; void SetRotation(double angles[3]); void SetRotation(double alfa, double beta, double gamma); CRotationMatrix Transpose(void) const; CMatrix33 GetMatrix() {return matrix;} private: CMatrix33 matrix; bool zero; }; #endif /* ALGEBRA_H_ */ mandelbulber1.21-1.orig/src/clew.cpp0000644000175000017500000005060712315324731020303 0ustar krzysztofkrzysztof////////////////////////////////////////////////////////////////////////// // Copyright (c) 2009 Organic Vectory B.V. // Written by George van Venrooij // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) ////////////////////////////////////////////////////////////////////////// #include "clew.h" #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #define VC_EXTRALEAN #include typedef HMODULE CLEW_DYNLIB_HANDLE; #define CLEW_DYNLIB_OPEN LoadLibraryW #define CLEW_DYNLIB_CLOSE FreeLibrary #define CLEW_DYNLIB_IMPORT GetProcAddress #else #include typedef void* CLEW_DYNLIB_HANDLE; #define CLEW_DYNLIB_OPEN(path) dlopen(path, RTLD_NOW | RTLD_GLOBAL) #define CLEW_DYNLIB_CLOSE dlclose #define CLEW_DYNLIB_IMPORT dlsym #endif #include //! \brief module handle static CLEW_DYNLIB_HANDLE module = NULL; // Variables holding function entry points PFNCLGETPLATFORMIDS __clewGetPlatformIDs = NULL; PFNCLGETPLATFORMINFO __clewGetPlatformInfo = NULL; PFNCLGETDEVICEIDS __clewGetDeviceIDs = NULL; PFNCLGETDEVICEINFO __clewGetDeviceInfo = NULL; PFNCLCREATECONTEXT __clewCreateContext = NULL; PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType = NULL; PFNCLRETAINCONTEXT __clewRetainContext = NULL; PFNCLRELEASECONTEXT __clewReleaseContext = NULL; PFNCLGETCONTEXTINFO __clewGetContextInfo = NULL; PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue = NULL; PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue = NULL; PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue = NULL; PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo = NULL; #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty = NULL; #endif PFNCLCREATEBUFFER __clewCreateBuffer = NULL; PFNCLCREATESUBBUFFER __clewCreateSubBuffer = NULL; PFNCLCREATEIMAGE2D __clewCreateImage2D = NULL; PFNCLCREATEIMAGE3D __clewCreateImage3D = NULL; PFNCLRETAINMEMOBJECT __clewRetainMemObject = NULL; PFNCLRELEASEMEMOBJECT __clewReleaseMemObject = NULL; PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats = NULL; PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo = NULL; PFNCLGETIMAGEINFO __clewGetImageInfo = NULL; PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback = NULL; PFNCLCREATESAMPLER __clewCreateSampler = NULL; PFNCLRETAINSAMPLER __clewRetainSampler = NULL; PFNCLRELEASESAMPLER __clewReleaseSampler = NULL; PFNCLGETSAMPLERINFO __clewGetSamplerInfo = NULL; PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource = NULL; PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary = NULL; PFNCLRETAINPROGRAM __clewRetainProgram = NULL; PFNCLRELEASEPROGRAM __clewReleaseProgram = NULL; PFNCLBUILDPROGRAM __clewBuildProgram = NULL; PFNCLUNLOADCOMPILER __clewUnloadCompiler = NULL; PFNCLGETPROGRAMINFO __clewGetProgramInfo = NULL; PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo = NULL; PFNCLCREATEKERNEL __clewCreateKernel = NULL; PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram = NULL; PFNCLRETAINKERNEL __clewRetainKernel = NULL; PFNCLRELEASEKERNEL __clewReleaseKernel = NULL; PFNCLSETKERNELARG __clewSetKernelArg = NULL; PFNCLGETKERNELINFO __clewGetKernelInfo = NULL; PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo = NULL; PFNCLWAITFOREVENTS __clewWaitForEvents = NULL; PFNCLGETEVENTINFO __clewGetEventInfo = NULL; PFNCLCREATEUSEREVENT __clewCreateUserEvent = NULL; PFNCLRETAINEVENT __clewRetainEvent = NULL; PFNCLRELEASEEVENT __clewReleaseEvent = NULL; PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus = NULL; PFNCLSETEVENTCALLBACK __clewSetEventCallback = NULL; PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo = NULL; PFNCLFLUSH __clewFlush = NULL; PFNCLFINISH __clewFinish = NULL; PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer = NULL; PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect = NULL; PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer = NULL; PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect = NULL; PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer = NULL; PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage = NULL; PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage = NULL; PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage = NULL; PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect = NULL; PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer = NULL; PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage = NULL; PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer = NULL; PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage = NULL; PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject = NULL; PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel = NULL; PFNCLENQUEUETASK __clewEnqueueTask = NULL; PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel = NULL; PFNCLENQUEUEMARKER __clewEnqueueMarker = NULL; PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents = NULL; PFNCLENQUEUEBARRIER __clewEnqueueBarrier = NULL; PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress = NULL; static void clewExit(void) { if (module != NULL) { // Ignore errors CLEW_DYNLIB_CLOSE(module); module = NULL; } } int clewInit(const wchar_t* path) { //int error = 0; // Check if already initialized if (module != NULL) { return CLEW_SUCCESS; } // Load library module = CLEW_DYNLIB_OPEN(path); // Check for errors if (module == NULL) { return CLEW_ERROR_OPEN_FAILED; } /* Set unloading error = atexit(clewExit); if (error) { // Failure queuing atexit, shutdown with error CLEW_DYNLIB_CLOSE(module); module = NULL; return CLEW_ERROR_ATEXIT_FAILED; }*/ // Determine function entry-points __clewGetPlatformIDs = (PFNCLGETPLATFORMIDS )CLEW_DYNLIB_IMPORT(module, "clGetPlatformIDs"); __clewGetPlatformInfo = (PFNCLGETPLATFORMINFO )CLEW_DYNLIB_IMPORT(module, "clGetPlatformInfo"); __clewGetDeviceIDs = (PFNCLGETDEVICEIDS )CLEW_DYNLIB_IMPORT(module, "clGetDeviceIDs"); __clewGetDeviceInfo = (PFNCLGETDEVICEINFO )CLEW_DYNLIB_IMPORT(module, "clGetDeviceInfo"); __clewCreateContext = (PFNCLCREATECONTEXT )CLEW_DYNLIB_IMPORT(module, "clCreateContext"); __clewCreateContextFromType = (PFNCLCREATECONTEXTFROMTYPE )CLEW_DYNLIB_IMPORT(module, "clCreateContextFromType"); __clewRetainContext = (PFNCLRETAINCONTEXT )CLEW_DYNLIB_IMPORT(module, "clRetainContext"); __clewReleaseContext = (PFNCLRELEASECONTEXT )CLEW_DYNLIB_IMPORT(module, "clReleaseContext"); __clewGetContextInfo = (PFNCLGETCONTEXTINFO )CLEW_DYNLIB_IMPORT(module, "clGetContextInfo"); __clewCreateCommandQueue = (PFNCLCREATECOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clCreateCommandQueue"); __clewRetainCommandQueue = (PFNCLRETAINCOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clRetainCommandQueue"); __clewReleaseCommandQueue = (PFNCLRELEASECOMMANDQUEUE )CLEW_DYNLIB_IMPORT(module, "clReleaseCommandQueue"); __clewGetCommandQueueInfo = (PFNCLGETCOMMANDQUEUEINFO )CLEW_DYNLIB_IMPORT(module, "clGetCommandQueueInfo"); #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS __clewSetCommandQueueProperty = (PFNCLSETCOMMANDQUEUEPROPERTY )CLEW_DYNLIB_IMPORT(module, "clSetCommandQueueProperty"); #endif __clewCreateBuffer = (PFNCLCREATEBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateBuffer"); __clewCreateSubBuffer = (PFNCLCREATESUBBUFFER )CLEW_DYNLIB_IMPORT(module, "clCreateBuffer"); __clewCreateImage2D = (PFNCLCREATEIMAGE2D )CLEW_DYNLIB_IMPORT(module, "clCreateImage2D"); __clewCreateImage3D = (PFNCLCREATEIMAGE3D )CLEW_DYNLIB_IMPORT(module, "clCreateImage3D"); __clewRetainMemObject = (PFNCLRETAINMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clRetainMemObject"); __clewReleaseMemObject = (PFNCLRELEASEMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clReleaseMemObject"); __clewGetSupportedImageFormats = (PFNCLGETSUPPORTEDIMAGEFORMATS )CLEW_DYNLIB_IMPORT(module, "clGetSupportedImageFormats"); __clewGetMemObjectInfo = (PFNCLGETMEMOBJECTINFO )CLEW_DYNLIB_IMPORT(module, "clGetMemObjectInfo"); __clewGetImageInfo = (PFNCLGETIMAGEINFO )CLEW_DYNLIB_IMPORT(module, "clGetImageInfo"); __clewSetMemObjectDestructorCallback = (PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)CLEW_DYNLIB_IMPORT(module, "clSetMemObjectDestructorCallback"); __clewCreateSampler = (PFNCLCREATESAMPLER )CLEW_DYNLIB_IMPORT(module, "clCreateSampler"); __clewRetainSampler = (PFNCLRETAINSAMPLER )CLEW_DYNLIB_IMPORT(module, "clRetainSampler"); __clewReleaseSampler = (PFNCLRELEASESAMPLER )CLEW_DYNLIB_IMPORT(module, "clReleaseSampler"); __clewGetSamplerInfo = (PFNCLGETSAMPLERINFO )CLEW_DYNLIB_IMPORT(module, "clGetSamplerInfo"); __clewCreateProgramWithSource = (PFNCLCREATEPROGRAMWITHSOURCE )CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithSource"); __clewCreateProgramWithBinary = (PFNCLCREATEPROGRAMWITHBINARY )CLEW_DYNLIB_IMPORT(module, "clCreateProgramWithBinary"); __clewRetainProgram = (PFNCLRETAINPROGRAM )CLEW_DYNLIB_IMPORT(module, "clRetainProgram"); __clewReleaseProgram = (PFNCLRELEASEPROGRAM )CLEW_DYNLIB_IMPORT(module, "clReleaseProgram"); __clewBuildProgram = (PFNCLBUILDPROGRAM )CLEW_DYNLIB_IMPORT(module, "clBuildProgram"); __clewUnloadCompiler = (PFNCLUNLOADCOMPILER )CLEW_DYNLIB_IMPORT(module, "clUnloadCompiler"); __clewGetProgramInfo = (PFNCLGETPROGRAMINFO )CLEW_DYNLIB_IMPORT(module, "clGetProgramInfo"); __clewGetProgramBuildInfo = (PFNCLGETPROGRAMBUILDINFO )CLEW_DYNLIB_IMPORT(module, "clGetProgramBuildInfo"); __clewCreateKernel = (PFNCLCREATEKERNEL )CLEW_DYNLIB_IMPORT(module, "clCreateKernel"); __clewCreateKernelsInProgram = (PFNCLCREATEKERNELSINPROGRAM )CLEW_DYNLIB_IMPORT(module, "clCreateKernelsInProgram"); __clewRetainKernel = (PFNCLRETAINKERNEL )CLEW_DYNLIB_IMPORT(module, "clRetainKernel"); __clewReleaseKernel = (PFNCLRELEASEKERNEL )CLEW_DYNLIB_IMPORT(module, "clReleaseKernel"); __clewSetKernelArg = (PFNCLSETKERNELARG )CLEW_DYNLIB_IMPORT(module, "clSetKernelArg"); __clewGetKernelInfo = (PFNCLGETKERNELINFO )CLEW_DYNLIB_IMPORT(module, "clGetKernelInfo"); __clewGetKernelWorkGroupInfo = (PFNCLGETKERNELWORKGROUPINFO )CLEW_DYNLIB_IMPORT(module, "clGetKernelWorkGroupInfo"); __clewWaitForEvents = (PFNCLWAITFOREVENTS )CLEW_DYNLIB_IMPORT(module, "clWaitForEvents"); __clewGetEventInfo = (PFNCLGETEVENTINFO )CLEW_DYNLIB_IMPORT(module, "clGetEventInfo"); __clewCreateUserEvent = (PFNCLCREATEUSEREVENT )CLEW_DYNLIB_IMPORT(module, "clCreateUserEvent"); __clewRetainEvent = (PFNCLRETAINEVENT )CLEW_DYNLIB_IMPORT(module, "clRetainEvent"); __clewReleaseEvent = (PFNCLRELEASEEVENT )CLEW_DYNLIB_IMPORT(module, "clReleaseEvent"); __clewSetUserEventStatus = (PFNCLSETUSEREVENTSTATUS )CLEW_DYNLIB_IMPORT(module, "clSetUserEventStatus"); __clewSetEventCallback = (PFNCLSETEVENTCALLBACK )CLEW_DYNLIB_IMPORT(module, "clSetEventCallback"); __clewGetEventProfilingInfo = (PFNCLGETEVENTPROFILINGINFO )CLEW_DYNLIB_IMPORT(module, "clGetEventProfilingInfo"); __clewFlush = (PFNCLFLUSH )CLEW_DYNLIB_IMPORT(module, "clFlush"); __clewFinish = (PFNCLFINISH )CLEW_DYNLIB_IMPORT(module, "clFinish"); __clewEnqueueReadBuffer = (PFNCLENQUEUEREADBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBuffer"); __clewEnqueueReadBufferRect = (PFNCLENQUEUEREADBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadBufferRect"); __clewEnqueueWriteBuffer = (PFNCLENQUEUEWRITEBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBuffer"); __clewEnqueueWriteBufferRect = (PFNCLENQUEUEWRITEBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteBufferRect"); __clewEnqueueCopyBuffer = (PFNCLENQUEUECOPYBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBuffer"); __clewEnqueueCopyBufferRect = (PFNCLENQUEUECOPYBUFFERRECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferRect"); __clewEnqueueReadImage = (PFNCLENQUEUEREADIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueReadImage"); __clewEnqueueWriteImage = (PFNCLENQUEUEWRITEIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueWriteImage"); __clewEnqueueCopyImage = (PFNCLENQUEUECOPYIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImage"); __clewEnqueueCopyImageToBuffer = (PFNCLENQUEUECOPYIMAGETOBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyImageToBuffer"); __clewEnqueueCopyBufferToImage = (PFNCLENQUEUECOPYBUFFERTOIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueCopyBufferToImage"); __clewEnqueueMapBuffer = (PFNCLENQUEUEMAPBUFFER )CLEW_DYNLIB_IMPORT(module, "clEnqueueMapBuffer"); __clewEnqueueMapImage = (PFNCLENQUEUEMAPIMAGE )CLEW_DYNLIB_IMPORT(module, "clEnqueueMapImage"); __clewEnqueueUnmapMemObject = (PFNCLENQUEUEUNMAPMEMOBJECT )CLEW_DYNLIB_IMPORT(module, "clEnqueueUnmapMemObject"); __clewEnqueueNDRangeKernel = (PFNCLENQUEUENDRANGEKERNEL )CLEW_DYNLIB_IMPORT(module, "clEnqueueNDRangeKernel"); __clewEnqueueTask = (PFNCLENQUEUETASK )CLEW_DYNLIB_IMPORT(module, "clEnqueueTask"); __clewEnqueueNativeKernel = (PFNCLENQUEUENATIVEKERNEL )CLEW_DYNLIB_IMPORT(module, "clEnqueueNativeKernel"); __clewEnqueueMarker = (PFNCLENQUEUEMARKER )CLEW_DYNLIB_IMPORT(module, "clEnqueueMarker"); __clewEnqueueWaitForEvents = (PFNCLENQUEUEWAITFOREVENTS )CLEW_DYNLIB_IMPORT(module, "clEnqueueWaitForEvents"); __clewEnqueueBarrier = (PFNCLENQUEUEBARRIER )CLEW_DYNLIB_IMPORT(module, "clEnqueueBarrier"); __clewGetExtensionFunctionAddress = (PFNCLGETEXTENSIONFUNCTIONADDRESS )CLEW_DYNLIB_IMPORT(module, "clGetExtensionFunctionAddress"); return CLEW_SUCCESS; } const char* clewErrorString(cl_int error) { static const char* strings[] = { // Error Codes "CL_SUCCESS" // 0 , "CL_DEVICE_NOT_FOUND" // -1 , "CL_DEVICE_NOT_AVAILABLE" // -2 , "CL_COMPILER_NOT_AVAILABLE" // -3 , "CL_MEM_OBJECT_ALLOCATION_FAILURE" // -4 , "CL_OUT_OF_RESOURCES" // -5 , "CL_OUT_OF_HOST_MEMORY" // -6 , "CL_PROFILING_INFO_NOT_AVAILABLE" // -7 , "CL_MEM_COPY_OVERLAP" // -8 , "CL_IMAGE_FORMAT_MISMATCH" // -9 , "CL_IMAGE_FORMAT_NOT_SUPPORTED" // -10 , "CL_BUILD_PROGRAM_FAILURE" // -11 , "CL_MAP_FAILURE" // -12 , "" // -13 , "" // -14 , "" // -15 , "" // -16 , "" // -17 , "" // -18 , "" // -19 , "" // -20 , "" // -21 , "" // -22 , "" // -23 , "" // -24 , "" // -25 , "" // -26 , "" // -27 , "" // -28 , "" // -29 , "CL_INVALID_VALUE" // -30 , "CL_INVALID_DEVICE_TYPE" // -31 , "CL_INVALID_PLATFORM" // -32 , "CL_INVALID_DEVICE" // -33 , "CL_INVALID_CONTEXT" // -34 , "CL_INVALID_QUEUE_PROPERTIES" // -35 , "CL_INVALID_COMMAND_QUEUE" // -36 , "CL_INVALID_HOST_PTR" // -37 , "CL_INVALID_MEM_OBJECT" // -38 , "CL_INVALID_IMAGE_FORMAT_DESCRIPTOR" // -39 , "CL_INVALID_IMAGE_SIZE" // -40 , "CL_INVALID_SAMPLER" // -41 , "CL_INVALID_BINARY" // -42 , "CL_INVALID_BUILD_OPTIONS" // -43 , "CL_INVALID_PROGRAM" // -44 , "CL_INVALID_PROGRAM_EXECUTABLE" // -45 , "CL_INVALID_KERNEL_NAME" // -46 , "CL_INVALID_KERNEL_DEFINITION" // -47 , "CL_INVALID_KERNEL" // -48 , "CL_INVALID_ARG_INDEX" // -49 , "CL_INVALID_ARG_VALUE" // -50 , "CL_INVALID_ARG_SIZE" // -51 , "CL_INVALID_KERNEL_ARGS" // -52 , "CL_INVALID_WORK_DIMENSION" // -53 , "CL_INVALID_WORK_GROUP_SIZE" // -54 , "CL_INVALID_WORK_ITEM_SIZE" // -55 , "CL_INVALID_GLOBAL_OFFSET" // -56 , "CL_INVALID_EVENT_WAIT_LIST" // -57 , "CL_INVALID_EVENT" // -58 , "CL_INVALID_OPERATION" // -59 , "CL_INVALID_GL_OBJECT" // -60 , "CL_INVALID_BUFFER_SIZE" // -61 , "CL_INVALID_MIP_LEVEL" // -62 , "CL_INVALID_GLOBAL_WORK_SIZE" // -63 }; return strings[-error]; } mandelbulber1.21-1.orig/src/morph.cpp0000644000175000017500000000545412274512437020504 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for animation keyframe interpolation / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include #include "morph.hpp" CMorph::CMorph(int size, int recordSize) { count = size; dataSize = recordSize; dataSets.resize(count); for (int i = 0; i < count; i++) dataSets[i].resize(dataSize); output.resize(dataSize); } void CMorph::AddData(int index, double *data) { if (index < count) { for (int i = 0; i < dataSize; i++) { dataSets[index][i] = data[i]; } } } void CMorph::Linear(int frame, double *destData) { int key = frame / framesPerKey; double factor = (frame % framesPerKey) / (double) framesPerKey; for (int i = 0; i < dataSize; i++) { double delta = dataSets[key + 1][i] - dataSets[key][i]; output[i] = dataSets[key][i] + delta * factor; destData[i] = output[i]; } } void CMorph::CatmullRom(int frame, double *destData) { double v1, v2, v3, v4; int key = frame / framesPerKey; double factor = (frame % framesPerKey) / (double) framesPerKey; double factor2 = factor*factor; double factor3 = factor2*factor; for (int i = 0; i < dataSize; i++) { if (key >= 1) v1 = dataSets[key - 1][i]; else v1 = dataSets[key][i]; if (key < count) v2 = dataSets[key][i]; else v2 = dataSets[count - 1][i]; if (key < count - 1) v3 = dataSets[key + 1][i]; else v3 = dataSets[count - 1][i]; if (key < count - 2) v4 = dataSets[key + 2][i]; else v4 = dataSets[count - 1][i]; bool logaritmic = false; bool negative = false; if ((v1 > 0 && v2 > 0 && v3 > 0 && v4 > 0) || (v1 < 0 && v2 < 0 && v3 < 0 && v4 < 0)) { if(v1<0) negative = true; //double totalVariation = (fabs(v2 - v1) + fabs(v3 - v2) + fabs(v4 - v3)) / 3.0; double average = (v1 + v2 + v3 + v4)/4.0; if (average > 0) { //double var1 = fabs(v2 - v1) / totalVariation; //double var2 = fabs(v3 - v2) / totalVariation; //double var3 = fabs(v4 - v3) / totalVariation; double deviation = (fabs(v2 - v1) + fabs(v3 - v2) + fabs(v4 - v3))/average; //if (var1 < 0.2 || var2 < 0.2 || var3 < 0.2) if(deviation>0.1) { v1 = log(fabs(v1)); v2 = log(fabs(v2)); v3 = log(fabs(v3)); v4 = log(fabs(v4)); logaritmic = true; } } } double value = 0.5 * ((2 * v2) + (-v1 + v3) * factor + (2 * v1 - 5 * v2 + 4 * v3 - v4) * factor2 + (-v1 + 3 * v2 - 3 * v3 + v4) * factor3); if(logaritmic) { if(negative) value = -exp(value); else value = exp(value); } if(value > 1e20) value = 1e20; if(value < -1e20) value = 1e20; if(fabs(value) < 1e-20) value = 0.0; //printf("Morph value = %g\n", value); output[i]=value; destData[i] = output[i]; } } mandelbulber1.21-1.orig/src/clew.h0000644000175000017500000031027212274512437017753 0ustar krzysztofkrzysztof#ifndef CLEW_HPP_INCLUDED #define CLEW_HPP_INCLUDED ////////////////////////////////////////////////////////////////////////// // Copyright (c) 2009-2011 Organic Vectory B.V., KindDragon // Written by George van Venrooij // // Distributed under the MIT License. ////////////////////////////////////////////////////////////////////////// //! \file clew.h //! \brief OpenCL run-time loader header //! //! This file contains a copy of the contents of CL.H and CL_PLATFORM.H from the //! official OpenCL spec. The purpose of this code is to load the OpenCL dynamic //! library at run-time and thus allow the executable to function on many //! platforms regardless of the vendor of the OpenCL driver actually installed. //! Some of the techniques used here were inspired by work done in the GLEW //! library (http://glew.sourceforge.net/) // Run-time dynamic linking functionality based on concepts used in GLEW #ifdef __OPENCL_CL_H #error cl.h included before clew.h #endif #ifdef __OPENCL_CL_PLATFORM_H #error cl_platform.h included before clew.h #endif // Prevent cl.h inclusion #define __OPENCL_CL_H // Prevent cl_platform.h inclusion #define __CL_PLATFORM_H /******************************************************************************* * Copyright (c) 2008-2010 The Khronos Group Inc. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and/or associated documentation files (the * "Materials"), to deal in the Materials without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Materials, and to * permit persons to whom the Materials are 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 Materials. * * THE MATERIALS ARE 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 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. ******************************************************************************/ #ifdef __APPLE__ /* Contains #defines for AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER below */ #include #endif #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32) #define CL_API_ENTRY #define CL_API_CALL __stdcall #define CL_CALLBACK __stdcall #else #define CL_API_ENTRY #define CL_API_CALL #define CL_CALLBACK #endif #ifdef __APPLE__ #define CL_EXTENSION_WEAK_LINK __attribute__((weak_import)) #define CL_API_SUFFIX__VERSION_1_0 AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER #define CL_EXT_SUFFIX__VERSION_1_0 CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER #define CL_API_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK #define CL_EXT_SUFFIX__VERSION_1_1 CL_EXTENSION_WEAK_LINK #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED CL_EXTENSION_WEAK_LINK AVAILABLE_MAC_OS_X_VERSION_10_6_AND_LATER #else #define CL_EXTENSION_WEAK_LINK #define CL_API_SUFFIX__VERSION_1_0 #define CL_EXT_SUFFIX__VERSION_1_0 #define CL_API_SUFFIX__VERSION_1_1 #define CL_EXT_SUFFIX__VERSION_1_1 #define CL_EXT_SUFFIX__VERSION_1_0_DEPRECATED #endif #if (defined (_WIN32) && defined(_MSC_VER)) /* scalar types */ typedef signed __int8 cl_char; typedef unsigned __int8 cl_uchar; typedef signed __int16 cl_short; typedef unsigned __int16 cl_ushort; typedef signed __int32 cl_int; typedef unsigned __int32 cl_uint; typedef signed __int64 cl_long; typedef unsigned __int64 cl_ulong; typedef unsigned __int16 cl_half; typedef float cl_float; typedef double cl_double; /* Macro names and corresponding values defined by OpenCL */ #define CL_CHAR_BIT 8 #define CL_SCHAR_MAX 127 #define CL_SCHAR_MIN (-127-1) #define CL_CHAR_MAX CL_SCHAR_MAX #define CL_CHAR_MIN CL_SCHAR_MIN #define CL_UCHAR_MAX 255 #define CL_SHRT_MAX 32767 #define CL_SHRT_MIN (-32767-1) #define CL_USHRT_MAX 65535 #define CL_INT_MAX 2147483647 #define CL_INT_MIN (-2147483647-1) #define CL_UINT_MAX 0xffffffffU #define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) #define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) #define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) #define CL_FLT_DIG 6 #define CL_FLT_MANT_DIG 24 #define CL_FLT_MAX_10_EXP +38 #define CL_FLT_MAX_EXP +128 #define CL_FLT_MIN_10_EXP -37 #define CL_FLT_MIN_EXP -125 #define CL_FLT_RADIX 2 #define CL_FLT_MAX 340282346638528859811704183484516925440.0f #define CL_FLT_MIN 1.175494350822287507969e-38f #define CL_FLT_EPSILON 0x1.0p-23f #define CL_DBL_DIG 15 #define CL_DBL_MANT_DIG 53 #define CL_DBL_MAX_10_EXP +308 #define CL_DBL_MAX_EXP +1024 #define CL_DBL_MIN_10_EXP -307 #define CL_DBL_MIN_EXP -1021 #define CL_DBL_RADIX 2 #define CL_DBL_MAX 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0 #define CL_DBL_MIN 2.225073858507201383090e-308 #define CL_DBL_EPSILON 2.220446049250313080847e-16 #define CL_M_E 2.718281828459045090796 #define CL_M_LOG2E 1.442695040888963387005 #define CL_M_LOG10E 0.434294481903251816668 #define CL_M_LN2 0.693147180559945286227 #define CL_M_LN10 2.302585092994045901094 #define CL_M_PI 3.141592653589793115998 #define CL_M_PI_2 1.570796326794896557999 #define CL_M_PI_4 0.785398163397448278999 #define CL_M_1_PI 0.318309886183790691216 #define CL_M_2_PI 0.636619772367581382433 #define CL_M_2_SQRTPI 1.128379167095512558561 #define CL_M_SQRT2 1.414213562373095145475 #define CL_M_SQRT1_2 0.707106781186547572737 #define CL_M_E_F 2.71828174591064f #define CL_M_LOG2E_F 1.44269502162933f #define CL_M_LOG10E_F 0.43429449200630f #define CL_M_LN2_F 0.69314718246460f #define CL_M_LN10_F 2.30258512496948f #define CL_M_PI_F 3.14159274101257f #define CL_M_PI_2_F 1.57079637050629f #define CL_M_PI_4_F 0.78539818525314f #define CL_M_1_PI_F 0.31830987334251f #define CL_M_2_PI_F 0.63661974668503f #define CL_M_2_SQRTPI_F 1.12837922573090f #define CL_M_SQRT2_F 1.41421353816986f #define CL_M_SQRT1_2_F 0.70710676908493f #define CL_NAN (CL_INFINITY - CL_INFINITY) #define CL_HUGE_VALF ((cl_float) 1e50) #define CL_HUGE_VAL ((cl_double) 1e500) #define CL_MAXFLOAT CL_FLT_MAX #define CL_INFINITY CL_HUGE_VALF #else #include /* scalar types */ typedef int8_t cl_char; typedef uint8_t cl_uchar; typedef int16_t cl_short __attribute__((aligned(2))); typedef uint16_t cl_ushort __attribute__((aligned(2))); typedef int32_t cl_int __attribute__((aligned(4))); typedef uint32_t cl_uint __attribute__((aligned(4))); typedef int64_t cl_long __attribute__((aligned(8))); typedef uint64_t cl_ulong __attribute__((aligned(8))); typedef uint16_t cl_half __attribute__((aligned(2))); typedef float cl_float __attribute__((aligned(4))); typedef double cl_double __attribute__((aligned(8))); /* Macro names and corresponding values defined by OpenCL */ #define CL_CHAR_BIT 8 #define CL_SCHAR_MAX 127 #define CL_SCHAR_MIN (-127-1) #define CL_CHAR_MAX CL_SCHAR_MAX #define CL_CHAR_MIN CL_SCHAR_MIN #define CL_UCHAR_MAX 255 #define CL_SHRT_MAX 32767 #define CL_SHRT_MIN (-32767-1) #define CL_USHRT_MAX 65535 #define CL_INT_MAX 2147483647 #define CL_INT_MIN (-2147483647-1) #define CL_UINT_MAX 0xffffffffU #define CL_LONG_MAX ((cl_long) 0x7FFFFFFFFFFFFFFFLL) #define CL_LONG_MIN ((cl_long) -0x7FFFFFFFFFFFFFFFLL - 1LL) #define CL_ULONG_MAX ((cl_ulong) 0xFFFFFFFFFFFFFFFFULL) #define CL_FLT_DIG 6 #define CL_FLT_MANT_DIG 24 #define CL_FLT_MAX_10_EXP +38 #define CL_FLT_MAX_EXP +128 #define CL_FLT_MIN_10_EXP -37 #define CL_FLT_MIN_EXP -125 #define CL_FLT_RADIX 2 #define CL_FLT_MAX 0x1.fffffep127f #define CL_FLT_MIN 0x1.0p-126f #define CL_FLT_EPSILON 0x1.0p-23f #define CL_DBL_DIG 15 #define CL_DBL_MANT_DIG 53 #define CL_DBL_MAX_10_EXP +308 #define CL_DBL_MAX_EXP +1024 #define CL_DBL_MIN_10_EXP -307 #define CL_DBL_MIN_EXP -1021 #define CL_DBL_RADIX 2 #define CL_DBL_MAX 0x1.fffffffffffffp1023 #define CL_DBL_MIN 0x1.0p-1022 #define CL_DBL_EPSILON 0x1.0p-52 #define CL_M_E 2.718281828459045090796 #define CL_M_LOG2E 1.442695040888963387005 #define CL_M_LOG10E 0.434294481903251816668 #define CL_M_LN2 0.693147180559945286227 #define CL_M_LN10 2.302585092994045901094 #define CL_M_PI 3.141592653589793115998 #define CL_M_PI_2 1.570796326794896557999 #define CL_M_PI_4 0.785398163397448278999 #define CL_M_1_PI 0.318309886183790691216 #define CL_M_2_PI 0.636619772367581382433 #define CL_M_2_SQRTPI 1.128379167095512558561 #define CL_M_SQRT2 1.414213562373095145475 #define CL_M_SQRT1_2 0.707106781186547572737 #define CL_M_E_F 2.71828174591064f #define CL_M_LOG2E_F 1.44269502162933f #define CL_M_LOG10E_F 0.43429449200630f #define CL_M_LN2_F 0.69314718246460f #define CL_M_LN10_F 2.30258512496948f #define CL_M_PI_F 3.14159274101257f #define CL_M_PI_2_F 1.57079637050629f #define CL_M_PI_4_F 0.78539818525314f #define CL_M_1_PI_F 0.31830987334251f #define CL_M_2_PI_F 0.63661974668503f #define CL_M_2_SQRTPI_F 1.12837922573090f #define CL_M_SQRT2_F 1.41421353816986f #define CL_M_SQRT1_2_F 0.70710676908493f #if defined( __GNUC__ ) #define CL_HUGE_VALF __builtin_huge_valf() #define CL_HUGE_VAL __builtin_huge_val() #define CL_NAN __builtin_nanf( "" ) #else #define CL_HUGE_VALF ((cl_float) 1e50) #define CL_HUGE_VAL ((cl_double) 1e500) float nanf( const char * ); #define CL_NAN nanf( "" ) #endif #define CL_MAXFLOAT CL_FLT_MAX #define CL_INFINITY CL_HUGE_VALF #endif #include /* Mirror types to GL types. Mirror types allow us to avoid deciding which headers to load based on whether we are using GL or GLES here. */ typedef unsigned int cl_GLuint; typedef int cl_GLint; typedef unsigned int cl_GLenum; /* * Vector types * * Note: OpenCL requires that all types be naturally aligned. * This means that vector types must be naturally aligned. * For example, a vector of four floats must be aligned to * a 16 byte boundary (calculated as 4 * the natural 4-byte * alignment of the float). The alignment qualifiers here * will only function properly if your compiler supports them * and if you don't actively work to defeat them. For example, * in order for a cl_float4 to be 16 byte aligned in a struct, * the start of the struct must itself be 16-byte aligned. * * Maintaining proper alignment is the user's responsibility. */ #ifdef _MSC_VER #if defined(_M_IX86) #if _M_IX86_FP >= 0 #define __SSE__ #endif #if _M_IX86_FP >= 1 #define __SSE2__ #endif #elif defined(_M_X64) #define __SSE__ #define __SSE2__ #endif #endif /* Define basic vector types */ #if defined( __VEC__ ) #include /* may be omitted depending on compiler. AltiVec spec provides no way to detect whether the header is required. */ typedef vector unsigned char __cl_uchar16; typedef vector signed char __cl_char16; typedef vector unsigned short __cl_ushort8; typedef vector signed short __cl_short8; typedef vector unsigned int __cl_uint4; typedef vector signed int __cl_int4; typedef vector float __cl_float4; #define __CL_UCHAR16__ 1 #define __CL_CHAR16__ 1 #define __CL_USHORT8__ 1 #define __CL_SHORT8__ 1 #define __CL_UINT4__ 1 #define __CL_INT4__ 1 #define __CL_FLOAT4__ 1 #endif #if defined( __SSE__ ) #if defined( __MINGW64__ ) #include #else #include #endif #if defined( __GNUC__ ) && !defined( __ICC ) typedef float __cl_float4 __attribute__((vector_size(16))); #else typedef __m128 __cl_float4; #endif #define __CL_FLOAT4__ 1 #endif #if defined( __SSE2__ ) #if defined( __MINGW64__ ) #include #else #include #endif #if defined( __GNUC__ ) && !defined( __ICC ) typedef cl_uchar __cl_uchar16 __attribute__((vector_size(16))); typedef cl_char __cl_char16 __attribute__((vector_size(16))); typedef cl_ushort __cl_ushort8 __attribute__((vector_size(16))); typedef cl_short __cl_short8 __attribute__((vector_size(16))); typedef cl_uint __cl_uint4 __attribute__((vector_size(16))); typedef cl_int __cl_int4 __attribute__((vector_size(16))); typedef cl_ulong __cl_ulong2 __attribute__((vector_size(16))); typedef cl_long __cl_long2 __attribute__((vector_size(16))); typedef cl_double __cl_double2 __attribute__((vector_size(16))); #else typedef __m128i __cl_uchar16; typedef __m128i __cl_char16; typedef __m128i __cl_ushort8; typedef __m128i __cl_short8; typedef __m128i __cl_uint4; typedef __m128i __cl_int4; typedef __m128i __cl_ulong2; typedef __m128i __cl_long2; typedef __m128d __cl_double2; #endif #define __CL_UCHAR16__ 1 #define __CL_CHAR16__ 1 #define __CL_USHORT8__ 1 #define __CL_SHORT8__ 1 #define __CL_INT4__ 1 #define __CL_UINT4__ 1 #define __CL_ULONG2__ 1 #define __CL_LONG2__ 1 #define __CL_DOUBLE2__ 1 #endif #if defined( __MMX__ ) #include #if defined( __GNUC__ ) && !defined( __ICC ) typedef cl_uchar __cl_uchar8 __attribute__((vector_size(8))); typedef cl_char __cl_char8 __attribute__((vector_size(8))); typedef cl_ushort __cl_ushort4 __attribute__((vector_size(8))); typedef cl_short __cl_short4 __attribute__((vector_size(8))); typedef cl_uint __cl_uint2 __attribute__((vector_size(8))); typedef cl_int __cl_int2 __attribute__((vector_size(8))); typedef cl_ulong __cl_ulong1 __attribute__((vector_size(8))); typedef cl_long __cl_long1 __attribute__((vector_size(8))); typedef cl_float __cl_float2 __attribute__((vector_size(8))); #else typedef __m64 __cl_uchar8; typedef __m64 __cl_char8; typedef __m64 __cl_ushort4; typedef __m64 __cl_short4; typedef __m64 __cl_uint2; typedef __m64 __cl_int2; typedef __m64 __cl_ulong1; typedef __m64 __cl_long1; typedef __m64 __cl_float2; #endif #define __CL_UCHAR8__ 1 #define __CL_CHAR8__ 1 #define __CL_USHORT4__ 1 #define __CL_SHORT4__ 1 #define __CL_INT2__ 1 #define __CL_UINT2__ 1 #define __CL_ULONG1__ 1 #define __CL_LONG1__ 1 #define __CL_FLOAT2__ 1 #endif #if defined( __AVX__ ) #if defined( __MINGW64__ ) #include #else #include #endif #if defined( __GNUC__ ) && !defined( __ICC ) typedef cl_float __cl_float8 __attribute__((vector_size(32))); typedef cl_double __cl_double4 __attribute__((vector_size(32))); #else typedef __m256 __cl_float8; typedef __m256d __cl_double4; #endif #define __CL_FLOAT8__ 1 #define __CL_DOUBLE4__ 1 #endif /* Define alignment keys */ #if defined( __GNUC__ ) #define CL_ALIGNED(_x) __attribute__ ((aligned(_x))) #elif defined( _WIN32) && (_MSC_VER) /* Alignment keys neutered on windows because MSVC can't swallow function arguments with alignment requirements */ /* http://msdn.microsoft.com/en-us/library/373ak2y1%28VS.71%29.aspx */ /* #include */ /* #define CL_ALIGNED(_x) _CRT_ALIGN(_x) */ #define CL_ALIGNED(_x) #else #warning Need to implement some method to align data here #define CL_ALIGNED(_x) #endif /* Indicate whether .xyzw, .s0123 and .hi.lo are supported */ #if (defined( __GNUC__) && ! defined( __STRICT_ANSI__ )) || (defined( _MSC_VER ) && ! defined( __STDC__ )) /* .xyzw and .s0123...{f|F} are supported */ #define CL_HAS_NAMED_VECTOR_FIELDS 1 /* .hi and .lo are supported */ #define CL_HAS_HI_LO_VECTOR_FIELDS 1 #define CL_NAMED_STRUCT_SUPPORTED #endif #if defined( CL_NAMED_STRUCT_SUPPORTED) && defined( _MSC_VER ) #define __extension__ __pragma(warning(suppress:4201)) #endif /* Define cl_vector types */ /* ---- cl_charn ---- */ typedef union { cl_char CL_ALIGNED(2) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_char x, y; }; __extension__ struct{ cl_char s0, s1; }; __extension__ struct{ cl_char lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2; #endif }cl_char2; typedef union { cl_char CL_ALIGNED(4) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_char x, y, z, w; }; __extension__ struct{ cl_char s0, s1, s2, s3; }; __extension__ struct{ cl_char2 lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2[2]; #endif #if defined( __CL_CHAR4__) __cl_char4 v4; #endif }cl_char4; /* cl_char3 is identical in size, alignment and behavior to cl_char4. See section 6.1.5. */ typedef cl_char4 cl_char3; typedef union { cl_char CL_ALIGNED(8) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_char x, y, z, w; }; __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_char4 lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2[4]; #endif #if defined( __CL_CHAR4__) __cl_char4 v4[2]; #endif #if defined( __CL_CHAR8__ ) __cl_char8 v8; #endif }cl_char8; typedef union { cl_char CL_ALIGNED(16) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_char x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_char s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_char8 lo, hi; }; #endif #if defined( __CL_CHAR2__) __cl_char2 v2[8]; #endif #if defined( __CL_CHAR4__) __cl_char4 v4[4]; #endif #if defined( __CL_CHAR8__ ) __cl_char8 v8[2]; #endif #if defined( __CL_CHAR16__ ) __cl_char16 v16; #endif }cl_char16; /* ---- cl_ucharn ---- */ typedef union { cl_uchar CL_ALIGNED(2) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uchar x, y; }; __extension__ struct{ cl_uchar s0, s1; }; __extension__ struct{ cl_uchar lo, hi; }; #endif #if defined( __cl_uchar2__) __cl_uchar2 v2; #endif }cl_uchar2; typedef union { cl_uchar CL_ALIGNED(4) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uchar x, y, z, w; }; __extension__ struct{ cl_uchar s0, s1, s2, s3; }; __extension__ struct{ cl_uchar2 lo, hi; }; #endif #if defined( __CL_UCHAR2__) __cl_uchar2 v2[2]; #endif #if defined( __CL_UCHAR4__) __cl_uchar4 v4; #endif }cl_uchar4; /* cl_uchar3 is identical in size, alignment and behavior to cl_uchar4. See section 6.1.5. */ typedef cl_uchar4 cl_uchar3; typedef union { cl_uchar CL_ALIGNED(8) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uchar x, y, z, w; }; __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_uchar4 lo, hi; }; #endif #if defined( __CL_UCHAR2__) __cl_uchar2 v2[4]; #endif #if defined( __CL_UCHAR4__) __cl_uchar4 v4[2]; #endif #if defined( __CL_UCHAR8__ ) __cl_uchar8 v8; #endif }cl_uchar8; typedef union { cl_uchar CL_ALIGNED(16) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uchar x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_uchar s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_uchar8 lo, hi; }; #endif #if defined( __CL_UCHAR2__) __cl_uchar2 v2[8]; #endif #if defined( __CL_UCHAR4__) __cl_uchar4 v4[4]; #endif #if defined( __CL_UCHAR8__ ) __cl_uchar8 v8[2]; #endif #if defined( __CL_UCHAR16__ ) __cl_uchar16 v16; #endif }cl_uchar16; /* ---- cl_shortn ---- */ typedef union { cl_short CL_ALIGNED(4) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_short x, y; }; __extension__ struct{ cl_short s0, s1; }; __extension__ struct{ cl_short lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2; #endif }cl_short2; typedef union { cl_short CL_ALIGNED(8) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_short x, y, z, w; }; __extension__ struct{ cl_short s0, s1, s2, s3; }; __extension__ struct{ cl_short2 lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2[2]; #endif #if defined( __CL_SHORT4__) __cl_short4 v4; #endif }cl_short4; /* cl_short3 is identical in size, alignment and behavior to cl_short4. See section 6.1.5. */ typedef cl_short4 cl_short3; typedef union { cl_short CL_ALIGNED(16) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_short x, y, z, w; }; __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_short4 lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2[4]; #endif #if defined( __CL_SHORT4__) __cl_short4 v4[2]; #endif #if defined( __CL_SHORT8__ ) __cl_short8 v8; #endif }cl_short8; typedef union { cl_short CL_ALIGNED(32) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_short x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_short s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_short8 lo, hi; }; #endif #if defined( __CL_SHORT2__) __cl_short2 v2[8]; #endif #if defined( __CL_SHORT4__) __cl_short4 v4[4]; #endif #if defined( __CL_SHORT8__ ) __cl_short8 v8[2]; #endif #if defined( __CL_SHORT16__ ) __cl_short16 v16; #endif }cl_short16; /* ---- cl_ushortn ---- */ typedef union { cl_ushort CL_ALIGNED(4) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ushort x, y; }; __extension__ struct{ cl_ushort s0, s1; }; __extension__ struct{ cl_ushort lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2; #endif }cl_ushort2; typedef union { cl_ushort CL_ALIGNED(8) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ushort x, y, z, w; }; __extension__ struct{ cl_ushort s0, s1, s2, s3; }; __extension__ struct{ cl_ushort2 lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2[2]; #endif #if defined( __CL_USHORT4__) __cl_ushort4 v4; #endif }cl_ushort4; /* cl_ushort3 is identical in size, alignment and behavior to cl_ushort4. See section 6.1.5. */ typedef cl_ushort4 cl_ushort3; typedef union { cl_ushort CL_ALIGNED(16) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ushort x, y, z, w; }; __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_ushort4 lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2[4]; #endif #if defined( __CL_USHORT4__) __cl_ushort4 v4[2]; #endif #if defined( __CL_USHORT8__ ) __cl_ushort8 v8; #endif }cl_ushort8; typedef union { cl_ushort CL_ALIGNED(32) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ushort x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_ushort s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_ushort8 lo, hi; }; #endif #if defined( __CL_USHORT2__) __cl_ushort2 v2[8]; #endif #if defined( __CL_USHORT4__) __cl_ushort4 v4[4]; #endif #if defined( __CL_USHORT8__ ) __cl_ushort8 v8[2]; #endif #if defined( __CL_USHORT16__ ) __cl_ushort16 v16; #endif }cl_ushort16; /* ---- cl_intn ---- */ typedef union { cl_int CL_ALIGNED(8) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_int x, y; }; __extension__ struct{ cl_int s0, s1; }; __extension__ struct{ cl_int lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2; #endif }cl_int2; typedef union { cl_int CL_ALIGNED(16) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_int x, y, z, w; }; __extension__ struct{ cl_int s0, s1, s2, s3; }; __extension__ struct{ cl_int2 lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2[2]; #endif #if defined( __CL_INT4__) __cl_int4 v4; #endif }cl_int4; /* cl_int3 is identical in size, alignment and behavior to cl_int4. See section 6.1.5. */ typedef cl_int4 cl_int3; typedef union { cl_int CL_ALIGNED(32) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_int x, y, z, w; }; __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_int4 lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2[4]; #endif #if defined( __CL_INT4__) __cl_int4 v4[2]; #endif #if defined( __CL_INT8__ ) __cl_int8 v8; #endif }cl_int8; typedef union { cl_int CL_ALIGNED(64) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_int x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_int8 lo, hi; }; #endif #if defined( __CL_INT2__) __cl_int2 v2[8]; #endif #if defined( __CL_INT4__) __cl_int4 v4[4]; #endif #if defined( __CL_INT8__ ) __cl_int8 v8[2]; #endif #if defined( __CL_INT16__ ) __cl_int16 v16; #endif }cl_int16; /* ---- cl_uintn ---- */ typedef union { cl_uint CL_ALIGNED(8) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uint x, y; }; __extension__ struct{ cl_uint s0, s1; }; __extension__ struct{ cl_uint lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2; #endif }cl_uint2; typedef union { cl_uint CL_ALIGNED(16) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uint x, y, z, w; }; __extension__ struct{ cl_uint s0, s1, s2, s3; }; __extension__ struct{ cl_uint2 lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2[2]; #endif #if defined( __CL_UINT4__) __cl_uint4 v4; #endif }cl_uint4; /* cl_uint3 is identical in size, alignment and behavior to cl_uint4. See section 6.1.5. */ typedef cl_uint4 cl_uint3; typedef union { cl_uint CL_ALIGNED(32) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uint x, y, z, w; }; __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_uint4 lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2[4]; #endif #if defined( __CL_UINT4__) __cl_uint4 v4[2]; #endif #if defined( __CL_UINT8__ ) __cl_uint8 v8; #endif }cl_uint8; typedef union { cl_uint CL_ALIGNED(64) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_uint x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_uint s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_uint8 lo, hi; }; #endif #if defined( __CL_UINT2__) __cl_uint2 v2[8]; #endif #if defined( __CL_UINT4__) __cl_uint4 v4[4]; #endif #if defined( __CL_UINT8__ ) __cl_uint8 v8[2]; #endif #if defined( __CL_UINT16__ ) __cl_uint16 v16; #endif }cl_uint16; /* ---- cl_longn ---- */ typedef union { cl_long CL_ALIGNED(16) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_long x, y; }; __extension__ struct{ cl_long s0, s1; }; __extension__ struct{ cl_long lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2; #endif }cl_long2; typedef union { cl_long CL_ALIGNED(32) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_long x, y, z, w; }; __extension__ struct{ cl_long s0, s1, s2, s3; }; __extension__ struct{ cl_long2 lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2[2]; #endif #if defined( __CL_LONG4__) __cl_long4 v4; #endif }cl_long4; /* cl_long3 is identical in size, alignment and behavior to cl_long4. See section 6.1.5. */ typedef cl_long4 cl_long3; typedef union { cl_long CL_ALIGNED(64) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_long x, y, z, w; }; __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_long4 lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2[4]; #endif #if defined( __CL_LONG4__) __cl_long4 v4[2]; #endif #if defined( __CL_LONG8__ ) __cl_long8 v8; #endif }cl_long8; typedef union { cl_long CL_ALIGNED(128) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_long x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_long s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_long8 lo, hi; }; #endif #if defined( __CL_LONG2__) __cl_long2 v2[8]; #endif #if defined( __CL_LONG4__) __cl_long4 v4[4]; #endif #if defined( __CL_LONG8__ ) __cl_long8 v8[2]; #endif #if defined( __CL_LONG16__ ) __cl_long16 v16; #endif }cl_long16; /* ---- cl_ulongn ---- */ typedef union { cl_ulong CL_ALIGNED(16) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ulong x, y; }; __extension__ struct{ cl_ulong s0, s1; }; __extension__ struct{ cl_ulong lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2; #endif }cl_ulong2; typedef union { cl_ulong CL_ALIGNED(32) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ulong x, y, z, w; }; __extension__ struct{ cl_ulong s0, s1, s2, s3; }; __extension__ struct{ cl_ulong2 lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2[2]; #endif #if defined( __CL_ULONG4__) __cl_ulong4 v4; #endif }cl_ulong4; /* cl_ulong3 is identical in size, alignment and behavior to cl_ulong4. See section 6.1.5. */ typedef cl_ulong4 cl_ulong3; typedef union { cl_ulong CL_ALIGNED(64) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ulong x, y, z, w; }; __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_ulong4 lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2[4]; #endif #if defined( __CL_ULONG4__) __cl_ulong4 v4[2]; #endif #if defined( __CL_ULONG8__ ) __cl_ulong8 v8; #endif }cl_ulong8; typedef union { cl_ulong CL_ALIGNED(128) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_ulong x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_ulong s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_ulong8 lo, hi; }; #endif #if defined( __CL_ULONG2__) __cl_ulong2 v2[8]; #endif #if defined( __CL_ULONG4__) __cl_ulong4 v4[4]; #endif #if defined( __CL_ULONG8__ ) __cl_ulong8 v8[2]; #endif #if defined( __CL_ULONG16__ ) __cl_ulong16 v16; #endif }cl_ulong16; /* --- cl_floatn ---- */ typedef union { cl_float CL_ALIGNED(8) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_float x, y; }; __extension__ struct{ cl_float s0, s1; }; __extension__ struct{ cl_float lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2; #endif }cl_float2; typedef union { cl_float CL_ALIGNED(16) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_float x, y, z, w; }; __extension__ struct{ cl_float s0, s1, s2, s3; }; __extension__ struct{ cl_float2 lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2[2]; #endif #if defined( __CL_FLOAT4__) __cl_float4 v4; #endif }cl_float4; /* cl_float3 is identical in size, alignment and behavior to cl_float4. See section 6.1.5. */ typedef cl_float4 cl_float3; typedef union { cl_float CL_ALIGNED(32) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_float x, y, z, w; }; __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_float4 lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2[4]; #endif #if defined( __CL_FLOAT4__) __cl_float4 v4[2]; #endif #if defined( __CL_FLOAT8__ ) __cl_float8 v8; #endif }cl_float8; typedef union { cl_float CL_ALIGNED(64) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_float x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_float s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_float8 lo, hi; }; #endif #if defined( __CL_FLOAT2__) __cl_float2 v2[8]; #endif #if defined( __CL_FLOAT4__) __cl_float4 v4[4]; #endif #if defined( __CL_FLOAT8__ ) __cl_float8 v8[2]; #endif #if defined( __CL_FLOAT16__ ) __cl_float16 v16; #endif }cl_float16; /* --- cl_doublen ---- */ typedef union { cl_double CL_ALIGNED(16) s[2]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_double x, y; }; __extension__ struct{ cl_double s0, s1; }; __extension__ struct{ cl_double lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2; #endif }cl_double2; typedef union { cl_double CL_ALIGNED(32) s[4]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_double x, y, z, w; }; __extension__ struct{ cl_double s0, s1, s2, s3; }; __extension__ struct{ cl_double2 lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2[2]; #endif #if defined( __CL_DOUBLE4__) __cl_double4 v4; #endif }cl_double4; /* cl_double3 is identical in size, alignment and behavior to cl_double4. See section 6.1.5. */ typedef cl_double4 cl_double3; typedef union { cl_double CL_ALIGNED(64) s[8]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_double x, y, z, w; }; __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7; }; __extension__ struct{ cl_double4 lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2[4]; #endif #if defined( __CL_DOUBLE4__) __cl_double4 v4[2]; #endif #if defined( __CL_DOUBLE8__ ) __cl_double8 v8; #endif }cl_double8; typedef union { cl_double CL_ALIGNED(128) s[16]; #if defined( CL_NAMED_STRUCT_SUPPORTED ) __extension__ struct{ cl_double x, y, z, w, __spacer4, __spacer5, __spacer6, __spacer7, __spacer8, __spacer9, sa, sb, sc, sd, se, sf; }; __extension__ struct{ cl_double s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, sA, sB, sC, sD, sE, sF; }; __extension__ struct{ cl_double8 lo, hi; }; #endif #if defined( __CL_DOUBLE2__) __cl_double2 v2[8]; #endif #if defined( __CL_DOUBLE4__) __cl_double4 v4[4]; #endif #if defined( __CL_DOUBLE8__ ) __cl_double8 v8[2]; #endif #if defined( __CL_DOUBLE16__ ) __cl_double16 v16; #endif }cl_double16; /* Macro to facilitate debugging * Usage: * Place CL_PROGRAM_STRING_DEBUG_INFO on the line before the first line of your source. * The first line ends with: CL_PROGRAM_STRING_BEGIN \" * Each line thereafter of OpenCL C source must end with: \n\ * The last line ends in "; * * Example: * * const char *my_program = CL_PROGRAM_STRING_BEGIN "\ * kernel void foo( int a, float * b ) \n\ * { \n\ * // my comment \n\ * *b[ get_global_id(0)] = a; \n\ * } \n\ * "; * * This should correctly set up the line, (column) and file information for your source * string so you can do source level debugging. */ #define __CL_STRINGIFY( _x ) # _x #define _CL_STRINGIFY( _x ) __CL_STRINGIFY( _x ) #define CL_PROGRAM_STRING_DEBUG_INFO "#line " _CL_STRINGIFY(__LINE__) " \"" __FILE__ "\" \n\n" // CL.h contents /******************************************************************************/ typedef struct _cl_platform_id * cl_platform_id; typedef struct _cl_device_id * cl_device_id; typedef struct _cl_context * cl_context; typedef struct _cl_command_queue * cl_command_queue; typedef struct _cl_mem * cl_mem; typedef struct _cl_program * cl_program; typedef struct _cl_kernel * cl_kernel; typedef struct _cl_event * cl_event; typedef struct _cl_sampler * cl_sampler; typedef cl_uint cl_bool; /* WARNING! Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ typedef cl_ulong cl_bitfield; typedef cl_bitfield cl_device_type; typedef cl_uint cl_platform_info; typedef cl_uint cl_device_info; typedef cl_bitfield cl_device_fp_config; typedef cl_uint cl_device_mem_cache_type; typedef cl_uint cl_device_local_mem_type; typedef cl_bitfield cl_device_exec_capabilities; typedef cl_bitfield cl_command_queue_properties; typedef intptr_t cl_context_properties; typedef cl_uint cl_context_info; typedef cl_uint cl_command_queue_info; typedef cl_uint cl_channel_order; typedef cl_uint cl_channel_type; typedef cl_bitfield cl_mem_flags; typedef cl_uint cl_mem_object_type; typedef cl_uint cl_mem_info; typedef cl_uint cl_image_info; typedef cl_uint cl_buffer_create_type; typedef cl_uint cl_addressing_mode; typedef cl_uint cl_filter_mode; typedef cl_uint cl_sampler_info; typedef cl_bitfield cl_map_flags; typedef cl_uint cl_program_info; typedef cl_uint cl_program_build_info; typedef cl_int cl_build_status; typedef cl_uint cl_kernel_info; typedef cl_uint cl_kernel_work_group_info; typedef cl_uint cl_event_info; typedef cl_uint cl_command_type; typedef cl_uint cl_profiling_info; typedef struct _cl_image_format { cl_channel_order image_channel_order; cl_channel_type image_channel_data_type; } cl_image_format; typedef struct _cl_buffer_region { size_t origin; size_t size; } cl_buffer_region; /******************************************************************************/ /* Error Codes */ #define CL_SUCCESS 0 #define CL_DEVICE_NOT_FOUND -1 #define CL_DEVICE_NOT_AVAILABLE -2 #define CL_COMPILER_NOT_AVAILABLE -3 #define CL_MEM_OBJECT_ALLOCATION_FAILURE -4 #define CL_OUT_OF_RESOURCES -5 #define CL_OUT_OF_HOST_MEMORY -6 #define CL_PROFILING_INFO_NOT_AVAILABLE -7 #define CL_MEM_COPY_OVERLAP -8 #define CL_IMAGE_FORMAT_MISMATCH -9 #define CL_IMAGE_FORMAT_NOT_SUPPORTED -10 #define CL_BUILD_PROGRAM_FAILURE -11 #define CL_MAP_FAILURE -12 #define CL_MISALIGNED_SUB_BUFFER_OFFSET -13 #define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14 #define CL_INVALID_VALUE -30 #define CL_INVALID_DEVICE_TYPE -31 #define CL_INVALID_PLATFORM -32 #define CL_INVALID_DEVICE -33 #define CL_INVALID_CONTEXT -34 #define CL_INVALID_QUEUE_PROPERTIES -35 #define CL_INVALID_COMMAND_QUEUE -36 #define CL_INVALID_HOST_PTR -37 #define CL_INVALID_MEM_OBJECT -38 #define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR -39 #define CL_INVALID_IMAGE_SIZE -40 #define CL_INVALID_SAMPLER -41 #define CL_INVALID_BINARY -42 #define CL_INVALID_BUILD_OPTIONS -43 #define CL_INVALID_PROGRAM -44 #define CL_INVALID_PROGRAM_EXECUTABLE -45 #define CL_INVALID_KERNEL_NAME -46 #define CL_INVALID_KERNEL_DEFINITION -47 #define CL_INVALID_KERNEL -48 #define CL_INVALID_ARG_INDEX -49 #define CL_INVALID_ARG_VALUE -50 #define CL_INVALID_ARG_SIZE -51 #define CL_INVALID_KERNEL_ARGS -52 #define CL_INVALID_WORK_DIMENSION -53 #define CL_INVALID_WORK_GROUP_SIZE -54 #define CL_INVALID_WORK_ITEM_SIZE -55 #define CL_INVALID_GLOBAL_OFFSET -56 #define CL_INVALID_EVENT_WAIT_LIST -57 #define CL_INVALID_EVENT -58 #define CL_INVALID_OPERATION -59 #define CL_INVALID_GL_OBJECT -60 #define CL_INVALID_BUFFER_SIZE -61 #define CL_INVALID_MIP_LEVEL -62 #define CL_INVALID_GLOBAL_WORK_SIZE -63 #define CL_INVALID_PROPERTY -64 /* OpenCL Version */ #define CL_VERSION_1_0 1 #define CL_VERSION_1_1 1 /* cl_bool */ #define CL_FALSE 0 #define CL_TRUE 1 /* cl_platform_info */ #define CL_PLATFORM_PROFILE 0x0900 #define CL_PLATFORM_VERSION 0x0901 #define CL_PLATFORM_NAME 0x0902 #define CL_PLATFORM_VENDOR 0x0903 #define CL_PLATFORM_EXTENSIONS 0x0904 /* cl_device_type - bitfield */ #define CL_DEVICE_TYPE_DEFAULT (1 << 0) #define CL_DEVICE_TYPE_CPU (1 << 1) #define CL_DEVICE_TYPE_GPU (1 << 2) #define CL_DEVICE_TYPE_ACCELERATOR (1 << 3) #define CL_DEVICE_TYPE_ALL 0xFFFFFFFF /* cl_device_info */ #define CL_DEVICE_TYPE 0x1000 #define CL_DEVICE_VENDOR_ID 0x1001 #define CL_DEVICE_MAX_COMPUTE_UNITS 0x1002 #define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS 0x1003 #define CL_DEVICE_MAX_WORK_GROUP_SIZE 0x1004 #define CL_DEVICE_MAX_WORK_ITEM_SIZES 0x1005 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR 0x1006 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT 0x1007 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT 0x1008 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG 0x1009 #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT 0x100A #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE 0x100B #define CL_DEVICE_MAX_CLOCK_FREQUENCY 0x100C #define CL_DEVICE_ADDRESS_BITS 0x100D #define CL_DEVICE_MAX_READ_IMAGE_ARGS 0x100E #define CL_DEVICE_MAX_WRITE_IMAGE_ARGS 0x100F #define CL_DEVICE_MAX_MEM_ALLOC_SIZE 0x1010 #define CL_DEVICE_IMAGE2D_MAX_WIDTH 0x1011 #define CL_DEVICE_IMAGE2D_MAX_HEIGHT 0x1012 #define CL_DEVICE_IMAGE3D_MAX_WIDTH 0x1013 #define CL_DEVICE_IMAGE3D_MAX_HEIGHT 0x1014 #define CL_DEVICE_IMAGE3D_MAX_DEPTH 0x1015 #define CL_DEVICE_IMAGE_SUPPORT 0x1016 #define CL_DEVICE_MAX_PARAMETER_SIZE 0x1017 #define CL_DEVICE_MAX_SAMPLERS 0x1018 #define CL_DEVICE_MEM_BASE_ADDR_ALIGN 0x1019 #define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE 0x101A #define CL_DEVICE_SINGLE_FP_CONFIG 0x101B #define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE 0x101C #define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE 0x101D #define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE 0x101E #define CL_DEVICE_GLOBAL_MEM_SIZE 0x101F #define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE 0x1020 #define CL_DEVICE_MAX_CONSTANT_ARGS 0x1021 #define CL_DEVICE_LOCAL_MEM_TYPE 0x1022 #define CL_DEVICE_LOCAL_MEM_SIZE 0x1023 #define CL_DEVICE_ERROR_CORRECTION_SUPPORT 0x1024 #define CL_DEVICE_PROFILING_TIMER_RESOLUTION 0x1025 #define CL_DEVICE_ENDIAN_LITTLE 0x1026 #define CL_DEVICE_AVAILABLE 0x1027 #define CL_DEVICE_COMPILER_AVAILABLE 0x1028 #define CL_DEVICE_EXECUTION_CAPABILITIES 0x1029 #define CL_DEVICE_QUEUE_PROPERTIES 0x102A #define CL_DEVICE_NAME 0x102B #define CL_DEVICE_VENDOR 0x102C #define CL_DRIVER_VERSION 0x102D #define CL_DEVICE_PROFILE 0x102E #define CL_DEVICE_VERSION 0x102F #define CL_DEVICE_EXTENSIONS 0x1030 #define CL_DEVICE_PLATFORM 0x1031 /* 0x1032 reserved for CL_DEVICE_DOUBLE_FP_CONFIG */ /* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */ #define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF 0x1034 #define CL_DEVICE_HOST_UNIFIED_MEMORY 0x1035 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR 0x1036 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT 0x1037 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT 0x1038 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG 0x1039 #define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT 0x103A #define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE 0x103B #define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF 0x103C #define CL_DEVICE_OPENCL_C_VERSION 0x103D /* cl_device_fp_config - bitfield */ #define CL_FP_DENORM (1 << 0) #define CL_FP_INF_NAN (1 << 1) #define CL_FP_ROUND_TO_NEAREST (1 << 2) #define CL_FP_ROUND_TO_ZERO (1 << 3) #define CL_FP_ROUND_TO_INF (1 << 4) #define CL_FP_FMA (1 << 5) #define CL_FP_SOFT_FLOAT (1 << 6) /* cl_device_mem_cache_type */ #define CL_NONE 0x0 #define CL_READ_ONLY_CACHE 0x1 #define CL_READ_WRITE_CACHE 0x2 /* cl_device_local_mem_type */ #define CL_LOCAL 0x1 #define CL_GLOBAL 0x2 /* cl_device_exec_capabilities - bitfield */ #define CL_EXEC_KERNEL (1 << 0) #define CL_EXEC_NATIVE_KERNEL (1 << 1) /* cl_command_queue_properties - bitfield */ #define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE (1 << 0) #define CL_QUEUE_PROFILING_ENABLE (1 << 1) /* cl_context_info */ #define CL_CONTEXT_REFERENCE_COUNT 0x1080 #define CL_CONTEXT_DEVICES 0x1081 #define CL_CONTEXT_PROPERTIES 0x1082 #define CL_CONTEXT_NUM_DEVICES 0x1083 /* cl_context_info + cl_context_properties */ #define CL_CONTEXT_PLATFORM 0x1084 /* cl_command_queue_info */ #define CL_QUEUE_CONTEXT 0x1090 #define CL_QUEUE_DEVICE 0x1091 #define CL_QUEUE_REFERENCE_COUNT 0x1092 #define CL_QUEUE_PROPERTIES 0x1093 /* cl_mem_flags - bitfield */ #define CL_MEM_READ_WRITE (1 << 0) #define CL_MEM_WRITE_ONLY (1 << 1) #define CL_MEM_READ_ONLY (1 << 2) #define CL_MEM_USE_HOST_PTR (1 << 3) #define CL_MEM_ALLOC_HOST_PTR (1 << 4) #define CL_MEM_COPY_HOST_PTR (1 << 5) /* cl_channel_order */ #define CL_R 0x10B0 #define CL_A 0x10B1 #define CL_RG 0x10B2 #define CL_RA 0x10B3 #define CL_RGB 0x10B4 #define CL_RGBA 0x10B5 #define CL_BGRA 0x10B6 #define CL_ARGB 0x10B7 #define CL_INTENSITY 0x10B8 #define CL_LUMINANCE 0x10B9 #define CL_Rx 0x10BA #define CL_RGx 0x10BB #define CL_RGBx 0x10BC /* cl_channel_type */ #define CL_SNORM_INT8 0x10D0 #define CL_SNORM_INT16 0x10D1 #define CL_UNORM_INT8 0x10D2 #define CL_UNORM_INT16 0x10D3 #define CL_UNORM_SHORT_565 0x10D4 #define CL_UNORM_SHORT_555 0x10D5 #define CL_UNORM_INT_101010 0x10D6 #define CL_SIGNED_INT8 0x10D7 #define CL_SIGNED_INT16 0x10D8 #define CL_SIGNED_INT32 0x10D9 #define CL_UNSIGNED_INT8 0x10DA #define CL_UNSIGNED_INT16 0x10DB #define CL_UNSIGNED_INT32 0x10DC #define CL_HALF_FLOAT 0x10DD #define CL_FLOAT 0x10DE /* cl_mem_object_type */ #define CL_MEM_OBJECT_BUFFER 0x10F0 #define CL_MEM_OBJECT_IMAGE2D 0x10F1 #define CL_MEM_OBJECT_IMAGE3D 0x10F2 /* cl_mem_info */ #define CL_MEM_TYPE 0x1100 #define CL_MEM_FLAGS 0x1101 #define CL_MEM_SIZE 0x1102 #define CL_MEM_HOST_PTR 0x1103 #define CL_MEM_MAP_COUNT 0x1104 #define CL_MEM_REFERENCE_COUNT 0x1105 #define CL_MEM_CONTEXT 0x1106 #define CL_MEM_ASSOCIATED_MEMOBJECT 0x1107 #define CL_MEM_OFFSET 0x1108 /* cl_image_info */ #define CL_IMAGE_FORMAT 0x1110 #define CL_IMAGE_ELEMENT_SIZE 0x1111 #define CL_IMAGE_ROW_PITCH 0x1112 #define CL_IMAGE_SLICE_PITCH 0x1113 #define CL_IMAGE_WIDTH 0x1114 #define CL_IMAGE_HEIGHT 0x1115 #define CL_IMAGE_DEPTH 0x1116 /* cl_addressing_mode */ #define CL_ADDRESS_NONE 0x1130 #define CL_ADDRESS_CLAMP_TO_EDGE 0x1131 #define CL_ADDRESS_CLAMP 0x1132 #define CL_ADDRESS_REPEAT 0x1133 #define CL_ADDRESS_MIRRORED_REPEAT 0x1134 /* cl_filter_mode */ #define CL_FILTER_NEAREST 0x1140 #define CL_FILTER_LINEAR 0x1141 /* cl_sampler_info */ #define CL_SAMPLER_REFERENCE_COUNT 0x1150 #define CL_SAMPLER_CONTEXT 0x1151 #define CL_SAMPLER_NORMALIZED_COORDS 0x1152 #define CL_SAMPLER_ADDRESSING_MODE 0x1153 #define CL_SAMPLER_FILTER_MODE 0x1154 /* cl_map_flags - bitfield */ #define CL_MAP_READ (1 << 0) #define CL_MAP_WRITE (1 << 1) /* cl_program_info */ #define CL_PROGRAM_REFERENCE_COUNT 0x1160 #define CL_PROGRAM_CONTEXT 0x1161 #define CL_PROGRAM_NUM_DEVICES 0x1162 #define CL_PROGRAM_DEVICES 0x1163 #define CL_PROGRAM_SOURCE 0x1164 #define CL_PROGRAM_BINARY_SIZES 0x1165 #define CL_PROGRAM_BINARIES 0x1166 /* cl_program_build_info */ #define CL_PROGRAM_BUILD_STATUS 0x1181 #define CL_PROGRAM_BUILD_OPTIONS 0x1182 #define CL_PROGRAM_BUILD_LOG 0x1183 /* cl_build_status */ #define CL_BUILD_SUCCESS 0 #define CL_BUILD_NONE -1 #define CL_BUILD_ERROR -2 #define CL_BUILD_IN_PROGRESS -3 /* cl_kernel_info */ #define CL_KERNEL_FUNCTION_NAME 0x1190 #define CL_KERNEL_NUM_ARGS 0x1191 #define CL_KERNEL_REFERENCE_COUNT 0x1192 #define CL_KERNEL_CONTEXT 0x1193 #define CL_KERNEL_PROGRAM 0x1194 /* cl_kernel_work_group_info */ #define CL_KERNEL_WORK_GROUP_SIZE 0x11B0 #define CL_KERNEL_COMPILE_WORK_GROUP_SIZE 0x11B1 #define CL_KERNEL_LOCAL_MEM_SIZE 0x11B2 #define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3 #define CL_KERNEL_PRIVATE_MEM_SIZE 0x11B4 /* cl_event_info */ #define CL_EVENT_COMMAND_QUEUE 0x11D0 #define CL_EVENT_COMMAND_TYPE 0x11D1 #define CL_EVENT_REFERENCE_COUNT 0x11D2 #define CL_EVENT_COMMAND_EXECUTION_STATUS 0x11D3 #define CL_EVENT_CONTEXT 0x11D4 /* cl_command_type */ #define CL_COMMAND_NDRANGE_KERNEL 0x11F0 #define CL_COMMAND_TASK 0x11F1 #define CL_COMMAND_NATIVE_KERNEL 0x11F2 #define CL_COMMAND_READ_BUFFER 0x11F3 #define CL_COMMAND_WRITE_BUFFER 0x11F4 #define CL_COMMAND_COPY_BUFFER 0x11F5 #define CL_COMMAND_READ_IMAGE 0x11F6 #define CL_COMMAND_WRITE_IMAGE 0x11F7 #define CL_COMMAND_COPY_IMAGE 0x11F8 #define CL_COMMAND_COPY_IMAGE_TO_BUFFER 0x11F9 #define CL_COMMAND_COPY_BUFFER_TO_IMAGE 0x11FA #define CL_COMMAND_MAP_BUFFER 0x11FB #define CL_COMMAND_MAP_IMAGE 0x11FC #define CL_COMMAND_UNMAP_MEM_OBJECT 0x11FD #define CL_COMMAND_MARKER 0x11FE #define CL_COMMAND_ACQUIRE_GL_OBJECTS 0x11FF #define CL_COMMAND_RELEASE_GL_OBJECTS 0x1200 #define CL_COMMAND_READ_BUFFER_RECT 0x1201 #define CL_COMMAND_WRITE_BUFFER_RECT 0x1202 #define CL_COMMAND_COPY_BUFFER_RECT 0x1203 #define CL_COMMAND_USER 0x1204 /* command execution status */ #define CL_COMPLETE 0x0 #define CL_RUNNING 0x1 #define CL_SUBMITTED 0x2 #define CL_QUEUED 0x3 /* cl_buffer_create_type */ #define CL_BUFFER_CREATE_TYPE_REGION 0x1220 /* cl_profiling_info */ #define CL_PROFILING_COMMAND_QUEUED 0x1280 #define CL_PROFILING_COMMAND_SUBMIT 0x1281 #define CL_PROFILING_COMMAND_START 0x1282 #define CL_PROFILING_COMMAND_END 0x1283 /********************************************************************************************************/ /********************************************************************************************************/ /* Function signature typedef's */ /* Platform API */ typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETPLATFORMIDS)(cl_uint /* num_entries */, cl_platform_id * /* platforms */, cl_uint * /* num_platforms */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETPLATFORMINFO)(cl_platform_id /* platform */, cl_platform_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Device APIs */ typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETDEVICEIDS)(cl_platform_id /* platform */, cl_device_type /* device_type */, cl_uint /* num_entries */, cl_device_id * /* devices */, cl_uint * /* num_devices */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETDEVICEINFO)(cl_device_id /* device */, cl_device_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; // Context APIs typedef CL_API_ENTRY cl_context (CL_API_CALL * PFNCLCREATECONTEXT)(const cl_context_properties * /* properties */, cl_uint /* num_devices */, const cl_device_id * /* devices */, void (CL_CALLBACK * /* pfn_notify */)(const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_context (CL_API_CALL * PFNCLCREATECONTEXTFROMTYPE)(const cl_context_properties * /* properties */, cl_device_type /* device_type */, void (CL_CALLBACK * /* pfn_notify*/ )(const char *, const void *, size_t, void *), void * /* user_data */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINCONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASECONTEXT)(cl_context /* context */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETCONTEXTINFO)(cl_context /* context */, cl_context_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Command Queue APIs */ typedef CL_API_ENTRY cl_command_queue (CL_API_CALL * PFNCLCREATECOMMANDQUEUE)(cl_context /* context */, cl_device_id /* device */, cl_command_queue_properties /* properties */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINCOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASECOMMANDQUEUE)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETCOMMANDQUEUEINFO)(cl_command_queue /* command_queue */, cl_command_queue_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLSETCOMMANDQUEUEPROPERTY)(cl_command_queue /* command_queue */, cl_command_queue_properties /* properties */, cl_bool /* enable */, cl_command_queue_properties * /* old_properties */) CL_API_SUFFIX__VERSION_1_0; /* Memory Object APIs */ typedef CL_API_ENTRY cl_mem (CL_API_CALL * PFNCLCREATEBUFFER)(cl_context /* context */, cl_mem_flags /* flags */, size_t /* size */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_mem (CL_API_CALL * PFNCLCREATESUBBUFFER)(cl_mem /* buffer */, cl_mem_flags /* flags */, cl_buffer_create_type /* buffer_create_type */, const void * /* buffer_create_info */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_mem (CL_API_CALL * PFNCLCREATEIMAGE2D)(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_row_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_mem (CL_API_CALL * PFNCLCREATEIMAGE3D)(cl_context /* context */, cl_mem_flags /* flags */, const cl_image_format * /* image_format */, size_t /* image_width */, size_t /* image_height */, size_t /* image_depth */, size_t /* image_row_pitch */, size_t /* image_slice_pitch */, void * /* host_ptr */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASEMEMOBJECT)(cl_mem /* memobj */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETSUPPORTEDIMAGEFORMATS)(cl_context /* context */, cl_mem_flags /* flags */, cl_mem_object_type /* image_type */, cl_uint /* num_entries */, cl_image_format * /* image_formats */, cl_uint * /* num_image_formats */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETMEMOBJECTINFO)(cl_mem /* memobj */, cl_mem_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETIMAGEINFO)(cl_mem /* image */, cl_image_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLSETMEMOBJECTDESTRUCTORCALLBACK)( cl_mem /* memobj */, void (CL_CALLBACK * /*pfn_notify*/)( cl_mem /* memobj */, void* /*user_data*/), void * /*user_data */ ) CL_API_SUFFIX__VERSION_1_1; /* Sampler APIs */ typedef CL_API_ENTRY cl_sampler (CL_API_CALL * PFNCLCREATESAMPLER)(cl_context /* context */, cl_bool /* normalized_coords */, cl_addressing_mode /* addressing_mode */, cl_filter_mode /* filter_mode */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINSAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASESAMPLER)(cl_sampler /* sampler */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETSAMPLERINFO)(cl_sampler /* sampler */, cl_sampler_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Program Object APIs */ typedef CL_API_ENTRY cl_program (CL_API_CALL * PFNCLCREATEPROGRAMWITHSOURCE)(cl_context /* context */, cl_uint /* count */, const char ** /* strings */, const size_t * /* lengths */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_program (CL_API_CALL * PFNCLCREATEPROGRAMWITHBINARY)(cl_context /* context */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const size_t * /* lengths */, const unsigned char ** /* binaries */, cl_int * /* binary_status */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASEPROGRAM)(cl_program /* program */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLBUILDPROGRAM)(cl_program /* program */, cl_uint /* num_devices */, const cl_device_id * /* device_list */, const char * /* options */, void (CL_CALLBACK * /* pfn_notify */)(cl_program /* program */, void * /* user_data */), void * /* user_data */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLUNLOADCOMPILER)(void) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETPROGRAMINFO)(cl_program /* program */, cl_program_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETPROGRAMBUILDINFO)(cl_program /* program */, cl_device_id /* device */, cl_program_build_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; /* Kernel Object APIs */ typedef CL_API_ENTRY cl_kernel (CL_API_CALL * PFNCLCREATEKERNEL)(cl_program /* program */, const char * /* kernel_name */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLCREATEKERNELSINPROGRAM)(cl_program /* program */, cl_uint /* num_kernels */, cl_kernel * /* kernels */, cl_uint * /* num_kernels_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASEKERNEL)(cl_kernel /* kernel */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLSETKERNELARG)(cl_kernel /* kernel */, cl_uint /* arg_index */, size_t /* arg_size */, const void * /* arg_value */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETKERNELINFO)(cl_kernel /* kernel */, cl_kernel_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETKERNELWORKGROUPINFO)(cl_kernel /* kernel */, cl_device_id /* device */, cl_kernel_work_group_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; // Event Object APIs typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLWAITFOREVENTS)(cl_uint /* num_events */, const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETEVENTINFO)(cl_event /* event */, cl_event_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_event (CL_API_CALL * PFNCLCREATEUSEREVENT)(cl_context /* context */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRETAINEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLRELEASEEVENT)(cl_event /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLSETUSEREVENTSTATUS)(cl_event /* event */, cl_int /* execution_status */) CL_API_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLSETEVENTCALLBACK)( cl_event /* event */, cl_int /* command_exec_callback_type */, void (CL_CALLBACK * /* pfn_notify */)(cl_event, cl_int, void *), void * /* user_data */) CL_API_SUFFIX__VERSION_1_1; /* Profiling APIs */ typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLGETEVENTPROFILINGINFO)(cl_event /* event */, cl_profiling_info /* param_name */, size_t /* param_value_size */, void * /* param_value */, size_t * /* param_value_size_ret */) CL_API_SUFFIX__VERSION_1_0; // Flush and Finish APIs typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLFLUSH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLFINISH)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; /* Enqueued Commands APIs */ typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEREADBUFFER)(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, size_t /* offset */, size_t /* cb */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEREADBUFFERRECT)(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_read */, const size_t * /* buffer_origin */, const size_t * /* host_origin */, const size_t * /* region */, size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */, size_t /* host_row_pitch */, size_t /* host_slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEWRITEBUFFER)(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, size_t /* offset */, size_t /* cb */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEWRITEBUFFERRECT)(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_write */, const size_t * /* buffer_origin */, const size_t * /* host_origin */, const size_t * /* region */, size_t /* buffer_row_pitch */, size_t /* buffer_slice_pitch */, size_t /* host_row_pitch */, size_t /* host_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUECOPYBUFFER)(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, size_t /* src_offset */, size_t /* dst_offset */, size_t /* cb */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUECOPYBUFFERRECT)(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_buffer */, const size_t * /* src_origin */, const size_t * /* dst_origin */, const size_t * /* region */, size_t /* src_row_pitch */, size_t /* src_slice_pitch */, size_t /* dst_row_pitch */, size_t /* dst_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_1; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEREADIMAGE)(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_read */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* row_pitch */, size_t /* slice_pitch */, void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEWRITEIMAGE)(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_write */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t /* input_row_pitch */, size_t /* input_slice_pitch */, const void * /* ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUECOPYIMAGE)(cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_image */, const size_t * /* src_origin[3] */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUECOPYIMAGETOBUFFER)(cl_command_queue /* command_queue */, cl_mem /* src_image */, cl_mem /* dst_buffer */, const size_t * /* src_origin[3] */, const size_t * /* region[3] */, size_t /* dst_offset */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUECOPYBUFFERTOIMAGE)(cl_command_queue /* command_queue */, cl_mem /* src_buffer */, cl_mem /* dst_image */, size_t /* src_offset */, const size_t * /* dst_origin[3] */, const size_t * /* region[3] */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLENQUEUEMAPBUFFER)(cl_command_queue /* command_queue */, cl_mem /* buffer */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, size_t /* offset */, size_t /* cb */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLENQUEUEMAPIMAGE)(cl_command_queue /* command_queue */, cl_mem /* image */, cl_bool /* blocking_map */, cl_map_flags /* map_flags */, const size_t * /* origin[3] */, const size_t * /* region[3] */, size_t * /* image_row_pitch */, size_t * /* image_slice_pitch */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */, cl_int * /* errcode_ret */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEUNMAPMEMOBJECT)(cl_command_queue /* command_queue */, cl_mem /* memobj */, void * /* mapped_ptr */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUENDRANGEKERNEL)(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* work_dim */, const size_t * /* global_work_offset */, const size_t * /* global_work_size */, const size_t * /* local_work_size */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUETASK)(cl_command_queue /* command_queue */, cl_kernel /* kernel */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUENATIVEKERNEL)(cl_command_queue /* command_queue */, void (*user_func)(void *), void * /* args */, size_t /* cb_args */, cl_uint /* num_mem_objects */, const cl_mem * /* mem_list */, const void ** /* args_mem_loc */, cl_uint /* num_events_in_wait_list */, const cl_event * /* event_wait_list */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEMARKER)(cl_command_queue /* command_queue */, cl_event * /* event */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEWAITFOREVENTS)(cl_command_queue /* command_queue */, cl_uint /* num_events */, const cl_event * /* event_list */) CL_API_SUFFIX__VERSION_1_0; typedef CL_API_ENTRY cl_int (CL_API_CALL * PFNCLENQUEUEBARRIER)(cl_command_queue /* command_queue */) CL_API_SUFFIX__VERSION_1_0; // Extension function access // // Returns the extension function address for the given function name, // or NULL if a valid function can not be found. The client must // check to make sure the address is not NULL, before using or // calling the returned function address. // typedef CL_API_ENTRY void * (CL_API_CALL * PFNCLGETEXTENSIONFUNCTIONADDRESS)(const char * /* func_name */) CL_API_SUFFIX__VERSION_1_0; #define CLEW_STATIC #ifdef CLEW_STATIC # define CLEWAPI extern #else # ifdef CLEW_BUILD # define CLEWAPI extern __declspec(dllexport) # else # define CLEWAPI extern __declspec(dllimport) # endif #endif #if defined(_WIN32) #define CLEW_FUN_EXPORT extern #else #define CLEW_FUN_EXPORT CLEWAPI #endif #define CLEW_GET_FUN(x) x // Variables holding function entry points CLEW_FUN_EXPORT PFNCLGETPLATFORMIDS __clewGetPlatformIDs ; CLEW_FUN_EXPORT PFNCLGETPLATFORMINFO __clewGetPlatformInfo ; CLEW_FUN_EXPORT PFNCLGETDEVICEIDS __clewGetDeviceIDs ; CLEW_FUN_EXPORT PFNCLGETDEVICEINFO __clewGetDeviceInfo ; CLEW_FUN_EXPORT PFNCLCREATECONTEXT __clewCreateContext ; CLEW_FUN_EXPORT PFNCLCREATECONTEXTFROMTYPE __clewCreateContextFromType ; CLEW_FUN_EXPORT PFNCLRETAINCONTEXT __clewRetainContext ; CLEW_FUN_EXPORT PFNCLRELEASECONTEXT __clewReleaseContext ; CLEW_FUN_EXPORT PFNCLGETCONTEXTINFO __clewGetContextInfo ; CLEW_FUN_EXPORT PFNCLCREATECOMMANDQUEUE __clewCreateCommandQueue ; CLEW_FUN_EXPORT PFNCLRETAINCOMMANDQUEUE __clewRetainCommandQueue ; CLEW_FUN_EXPORT PFNCLRELEASECOMMANDQUEUE __clewReleaseCommandQueue ; CLEW_FUN_EXPORT PFNCLGETCOMMANDQUEUEINFO __clewGetCommandQueueInfo ; #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS CLEW_FUN_EXPORT PFNCLSETCOMMANDQUEUEPROPERTY __clewSetCommandQueueProperty ; #endif CLEW_FUN_EXPORT PFNCLCREATEBUFFER __clewCreateBuffer ; CLEW_FUN_EXPORT PFNCLCREATESUBBUFFER __clewCreateSubBuffer ; CLEW_FUN_EXPORT PFNCLCREATEIMAGE2D __clewCreateImage2D ; CLEW_FUN_EXPORT PFNCLCREATEIMAGE3D __clewCreateImage3D ; CLEW_FUN_EXPORT PFNCLRETAINMEMOBJECT __clewRetainMemObject ; CLEW_FUN_EXPORT PFNCLRELEASEMEMOBJECT __clewReleaseMemObject ; CLEW_FUN_EXPORT PFNCLGETSUPPORTEDIMAGEFORMATS __clewGetSupportedImageFormats ; CLEW_FUN_EXPORT PFNCLGETMEMOBJECTINFO __clewGetMemObjectInfo ; CLEW_FUN_EXPORT PFNCLGETIMAGEINFO __clewGetImageInfo ; CLEW_FUN_EXPORT PFNCLSETMEMOBJECTDESTRUCTORCALLBACK __clewSetMemObjectDestructorCallback; CLEW_FUN_EXPORT PFNCLCREATESAMPLER __clewCreateSampler ; CLEW_FUN_EXPORT PFNCLRETAINSAMPLER __clewRetainSampler ; CLEW_FUN_EXPORT PFNCLRELEASESAMPLER __clewReleaseSampler ; CLEW_FUN_EXPORT PFNCLGETSAMPLERINFO __clewGetSamplerInfo ; CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHSOURCE __clewCreateProgramWithSource ; CLEW_FUN_EXPORT PFNCLCREATEPROGRAMWITHBINARY __clewCreateProgramWithBinary ; CLEW_FUN_EXPORT PFNCLRETAINPROGRAM __clewRetainProgram ; CLEW_FUN_EXPORT PFNCLRELEASEPROGRAM __clewReleaseProgram ; CLEW_FUN_EXPORT PFNCLBUILDPROGRAM __clewBuildProgram ; CLEW_FUN_EXPORT PFNCLUNLOADCOMPILER __clewUnloadCompiler ; CLEW_FUN_EXPORT PFNCLGETPROGRAMINFO __clewGetProgramInfo ; CLEW_FUN_EXPORT PFNCLGETPROGRAMBUILDINFO __clewGetProgramBuildInfo ; CLEW_FUN_EXPORT PFNCLCREATEKERNEL __clewCreateKernel ; CLEW_FUN_EXPORT PFNCLCREATEKERNELSINPROGRAM __clewCreateKernelsInProgram ; CLEW_FUN_EXPORT PFNCLRETAINKERNEL __clewRetainKernel ; CLEW_FUN_EXPORT PFNCLRELEASEKERNEL __clewReleaseKernel ; CLEW_FUN_EXPORT PFNCLSETKERNELARG __clewSetKernelArg ; CLEW_FUN_EXPORT PFNCLGETKERNELINFO __clewGetKernelInfo ; CLEW_FUN_EXPORT PFNCLGETKERNELWORKGROUPINFO __clewGetKernelWorkGroupInfo ; CLEW_FUN_EXPORT PFNCLWAITFOREVENTS __clewWaitForEvents ; CLEW_FUN_EXPORT PFNCLGETEVENTINFO __clewGetEventInfo ; CLEW_FUN_EXPORT PFNCLCREATEUSEREVENT __clewCreateUserEvent ; CLEW_FUN_EXPORT PFNCLRETAINEVENT __clewRetainEvent ; CLEW_FUN_EXPORT PFNCLRELEASEEVENT __clewReleaseEvent ; CLEW_FUN_EXPORT PFNCLSETUSEREVENTSTATUS __clewSetUserEventStatus ; CLEW_FUN_EXPORT PFNCLSETEVENTCALLBACK __clewSetEventCallback ; CLEW_FUN_EXPORT PFNCLGETEVENTPROFILINGINFO __clewGetEventProfilingInfo ; CLEW_FUN_EXPORT PFNCLFLUSH __clewFlush ; CLEW_FUN_EXPORT PFNCLFINISH __clewFinish ; CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFER __clewEnqueueReadBuffer ; CLEW_FUN_EXPORT PFNCLENQUEUEREADBUFFERRECT __clewEnqueueReadBufferRect ; CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFER __clewEnqueueWriteBuffer ; CLEW_FUN_EXPORT PFNCLENQUEUEWRITEBUFFERRECT __clewEnqueueWriteBufferRect ; CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFER __clewEnqueueCopyBuffer ; CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERRECT __clewEnqueueCopyBufferRect ; CLEW_FUN_EXPORT PFNCLENQUEUEREADIMAGE __clewEnqueueReadImage ; CLEW_FUN_EXPORT PFNCLENQUEUEWRITEIMAGE __clewEnqueueWriteImage ; CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGE __clewEnqueueCopyImage ; CLEW_FUN_EXPORT PFNCLENQUEUECOPYIMAGETOBUFFER __clewEnqueueCopyImageToBuffer ; CLEW_FUN_EXPORT PFNCLENQUEUECOPYBUFFERTOIMAGE __clewEnqueueCopyBufferToImage ; CLEW_FUN_EXPORT PFNCLENQUEUEMAPBUFFER __clewEnqueueMapBuffer ; CLEW_FUN_EXPORT PFNCLENQUEUEMAPIMAGE __clewEnqueueMapImage ; CLEW_FUN_EXPORT PFNCLENQUEUEUNMAPMEMOBJECT __clewEnqueueUnmapMemObject ; CLEW_FUN_EXPORT PFNCLENQUEUENDRANGEKERNEL __clewEnqueueNDRangeKernel ; CLEW_FUN_EXPORT PFNCLENQUEUETASK __clewEnqueueTask ; CLEW_FUN_EXPORT PFNCLENQUEUENATIVEKERNEL __clewEnqueueNativeKernel ; CLEW_FUN_EXPORT PFNCLENQUEUEMARKER __clewEnqueueMarker ; CLEW_FUN_EXPORT PFNCLENQUEUEWAITFOREVENTS __clewEnqueueWaitForEvents ; CLEW_FUN_EXPORT PFNCLENQUEUEBARRIER __clewEnqueueBarrier ; CLEW_FUN_EXPORT PFNCLGETEXTENSIONFUNCTIONADDRESS __clewGetExtensionFunctionAddress ; #define clGetPlatformIDs CLEW_GET_FUN(__clewGetPlatformIDs ) #define clGetPlatformInfo CLEW_GET_FUN(__clewGetPlatformInfo ) #define clGetDeviceIDs CLEW_GET_FUN(__clewGetDeviceIDs ) #define clGetDeviceInfo CLEW_GET_FUN(__clewGetDeviceInfo ) #define clCreateContext CLEW_GET_FUN(__clewCreateContext ) #define clCreateContextFromType CLEW_GET_FUN(__clewCreateContextFromType ) #define clRetainContext CLEW_GET_FUN(__clewRetainContext ) #define clReleaseContext CLEW_GET_FUN(__clewReleaseContext ) #define clGetContextInfo CLEW_GET_FUN(__clewGetContextInfo ) #define clCreateCommandQueue CLEW_GET_FUN(__clewCreateCommandQueue ) #define clRetainCommandQueue CLEW_GET_FUN(__clewRetainCommandQueue ) #define clReleaseCommandQueue CLEW_GET_FUN(__clewReleaseCommandQueue ) #define clGetCommandQueueInfo CLEW_GET_FUN(__clewGetCommandQueueInfo ) #ifdef CL_USE_DEPRECATED_OPENCL_1_0_APIS #warning CL_USE_DEPRECATED_OPENCL_1_0_APIS is defined. These APIs are unsupported and untested in OpenCL 1.1! /* * WARNING: * This API introduces mutable state into the OpenCL implementation. It has been REMOVED * to better facilitate thread safety. The 1.0 API is not thread safe. It is not tested by the * OpenCL 1.1 conformance test, and consequently may not work or may not work dependably. * It is likely to be non-performant. Use of this API is not advised. Use at your own risk. * * Software developers previously relying on this API are instructed to set the command queue * properties when creating the queue, instead. */ #define clSetCommandQueueProperty CLEW_GET_FUN(__clewSetCommandQueueProperty ) #endif /* CL_USE_DEPRECATED_OPENCL_1_0_APIS */ #define clCreateBuffer CLEW_GET_FUN(__clewCreateBuffer ) #define clCreateSubBuffer CLEW_GET_FUN(__clewCreateSubBuffer ) #define clCreateImage2D CLEW_GET_FUN(__clewCreateImage2D ) #define clCreateImage3D CLEW_GET_FUN(__clewCreateImage3D ) #define clRetainMemObject CLEW_GET_FUN(__clewRetainMemObject ) #define clReleaseMemObject CLEW_GET_FUN(__clewReleaseMemObject ) #define clGetSupportedImageFormats CLEW_GET_FUN(__clewGetSupportedImageFormats ) #define clGetMemObjectInfo CLEW_GET_FUN(__clewGetMemObjectInfo ) #define clGetImageInfo CLEW_GET_FUN(__clewGetImageInfo ) #define clSetMemObjectDestructorCallback CLEW_GET_FUN(__clewSetMemObjectDestructorCallback) #define clCreateSampler CLEW_GET_FUN(__clewCreateSampler ) #define clRetainSampler CLEW_GET_FUN(__clewRetainSampler ) #define clReleaseSampler CLEW_GET_FUN(__clewReleaseSampler ) #define clGetSamplerInfo CLEW_GET_FUN(__clewGetSamplerInfo ) #define clCreateProgramWithSource CLEW_GET_FUN(__clewCreateProgramWithSource ) #define clCreateProgramWithBinary CLEW_GET_FUN(__clewCreateProgramWithBinary ) #define clRetainProgram CLEW_GET_FUN(__clewRetainProgram ) #define clReleaseProgram CLEW_GET_FUN(__clewReleaseProgram ) #define clBuildProgram CLEW_GET_FUN(__clewBuildProgram ) #define clUnloadCompiler CLEW_GET_FUN(__clewUnloadCompiler ) #define clGetProgramInfo CLEW_GET_FUN(__clewGetProgramInfo ) #define clGetProgramBuildInfo CLEW_GET_FUN(__clewGetProgramBuildInfo ) #define clCreateKernel CLEW_GET_FUN(__clewCreateKernel ) #define clCreateKernelsInProgram CLEW_GET_FUN(__clewCreateKernelsInProgram ) #define clRetainKernel CLEW_GET_FUN(__clewRetainKernel ) #define clReleaseKernel CLEW_GET_FUN(__clewReleaseKernel ) #define clSetKernelArg CLEW_GET_FUN(__clewSetKernelArg ) #define clGetKernelInfo CLEW_GET_FUN(__clewGetKernelInfo ) #define clGetKernelWorkGroupInfo CLEW_GET_FUN(__clewGetKernelWorkGroupInfo ) #define clWaitForEvents CLEW_GET_FUN(__clewWaitForEvents ) #define clGetEventInfo CLEW_GET_FUN(__clewGetEventInfo ) #define clCreateUserEvent CLEW_GET_FUN(__clewCreateUserEvent ) #define clRetainEvent CLEW_GET_FUN(__clewRetainEvent ) #define clReleaseEvent CLEW_GET_FUN(__clewReleaseEvent ) #define clSetUserEventStatus CLEW_GET_FUN(__clewSetUserEventStatus ) #define clSetEventCallback CLEW_GET_FUN(__clewSetEventCallback ) #define clGetEventProfilingInfo CLEW_GET_FUN(__clewGetEventProfilingInfo ) #define clFlush CLEW_GET_FUN(__clewFlush ) #define clFinish CLEW_GET_FUN(__clewFinish ) #define clEnqueueReadBuffer CLEW_GET_FUN(__clewEnqueueReadBuffer ) #define clEnqueueReadBufferRect CLEW_GET_FUN(__clewEnqueueReadBufferRect ) #define clEnqueueWriteBuffer CLEW_GET_FUN(__clewEnqueueWriteBuffer ) #define clEnqueueWriteBufferRect CLEW_GET_FUN(__clewEnqueueWriteBufferRect ) #define clEnqueueCopyBuffer CLEW_GET_FUN(__clewEnqueueCopyBuffer ) #define clEnqueueCopyBufferRect CLEW_GET_FUN(__clewEnqueueCopyBufferRect ) #define clEnqueueReadImage CLEW_GET_FUN(__clewEnqueueReadImage ) #define clEnqueueWriteImage CLEW_GET_FUN(__clewEnqueueWriteImage ) #define clEnqueueCopyImage CLEW_GET_FUN(__clewEnqueueCopyImage ) #define clEnqueueCopyImageToBuffer CLEW_GET_FUN(__clewEnqueueCopyImageToBuffer ) #define clEnqueueCopyBufferToImage CLEW_GET_FUN(__clewEnqueueCopyBufferToImage ) #define clEnqueueMapBuffer CLEW_GET_FUN(__clewEnqueueMapBuffer ) #define clEnqueueMapImage CLEW_GET_FUN(__clewEnqueueMapImage ) #define clEnqueueUnmapMemObject CLEW_GET_FUN(__clewEnqueueUnmapMemObject ) #define clEnqueueNDRangeKernel CLEW_GET_FUN(__clewEnqueueNDRangeKernel ) #define clEnqueueTask CLEW_GET_FUN(__clewEnqueueTask ) #define clEnqueueNativeKernel CLEW_GET_FUN(__clewEnqueueNativeKernel ) #define clEnqueueMarker CLEW_GET_FUN(__clewEnqueueMarker ) #define clEnqueueWaitForEvents CLEW_GET_FUN(__clewEnqueueWaitForEvents ) #define clEnqueueBarrier CLEW_GET_FUN(__clewEnqueueBarrier ) #define clGetExtensionFunctionAddress CLEW_GET_FUN(__clewGetExtensionFunctionAddress ) #define CLEW_SUCCESS 0 //!< Success error code #define CLEW_ERROR_OPEN_FAILED -1 //!< Error code for failing to open the dynamic library #define CLEW_ERROR_ATEXIT_FAILED -2 //!< Error code for failing to queue the closing of the dynamic library to atexit() //! \brief Load OpenCL dynamic library and set function entry points int clewInit (const wchar_t*); //! \brief Convert an OpenCL error code to its string equivalent const char* clewErrorString (cl_int error); #ifdef __cplusplus } #endif #endif // CLEW_HPP_INCLUDED mandelbulber1.21-1.orig/src/callbacks.cpp0000644000175000017500000032034212274512437021272 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / Functions called by UI / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ /* * callbacks.cpp * * Created on: 2010-01-23 * Author: krzysztof */ #include #include #include "callbacks.h" #include "interface.h" #include "settings.h" #include "shaders.h" #include "files.h" #include "undo.hpp" #include "timeline.hpp" #include "cl_support.hpp" #include "netrender.hpp" using namespace std; double last_navigator_step; CVector3 last_keyframe_position; bool renderRequest = false; bool refreshNeeded = false; bool imageCompileNeeded = false; bool refreshInNextLoop = false; gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event) { g_signal_handlers_block_by_func(widget, (GCallback*)motion_notify_event, NULL); while (gtk_events_pending()) gtk_main_iteration(); x_mouse = event->x; y_mouse = event->y; int x = event->x; int y = event->y; int xs = x / mainImage.GetPreviewScale(); int ys = y / mainImage.GetPreviewScale(); if (!Interface_data.animMode) { double z = mainImage.GetPixelZBuffer(xs, ys); if (z < 1e10) { smooth_last_z_mouse = smooth_last_z_mouse + (z - smooth_last_z_mouse) * 0.01; //preparing rotation matrix double alpha = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_alfa))) / 180.0 * M_PI; double beta = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_beta))) / 180.0 * M_PI; double gamma = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_gammaAngle))) / 180.0 * M_PI; CVector3 vp; vp.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_va))); vp.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_vb))); vp.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_vc))); enumPerspectiveType perspectiveType = (enumPerspectiveType) gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboPerspectiveType)); double zoom = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_zoom))); double persp = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_persp))); CRotationMatrix mRot; mRot.RotateZ(alpha); mRot.RotateX(beta); mRot.RotateY(gamma); CRotationMatrix mRotInv; mRotInv.RotateY(-gamma); mRotInv.RotateX(-beta); mRotInv.RotateZ(-alpha); double closeUpRatio = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mouse_click_distance))); double lightPlacementDistance = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPlacementDistance))); int mode = gtk_combo_box_get_active(GTK_COMBO_BOX(renderWindow.comboMouseClickMode)); double sw = mainImage.GetPreviewWidth(); double sh = mainImage.GetPreviewHeight(); float aspectRatio = sw / sh; double x2 = (x / sw - 0.5) * aspectRatio; double y2 = (y / sh - 0.5); if (mode >= 5 && mode < 10) { z = z - lightPlacementDistance; //lights placement } double scale = smooth_last_z_mouse / z; double boxWidth = 10.0 / sw * scale; double boxHeight = 10.0 / sw * scale; double boxDepth = 10.0 / sw * scale; double boxWidth2 = boxWidth * z * persp; double boxHeigth2 = boxHeight * z * persp; double boxDepth2 = boxHeight * z * persp; double n = 3.0; for (int iz = -n; iz <= n; iz++) { double yy1 = ((y2 + n * boxHeight) / (1.0 - boxDepth * iz * persp) + 0.5) * sh; double yy2 = ((y2 - n * boxHeight) / (1.0 - boxDepth * iz * persp) + 0.5) * sh; for (int ix = -3.0; ix <= 3.0; ix++) { double xx1 = ((x2 + boxWidth * ix) / (1.0 - boxDepth * iz * persp) / aspectRatio + 0.5) * sw; unsigned char R = 128 + iz * 40; unsigned char G = 128 - iz * 40; unsigned char B = 0; double opacity = 0.8; if (iz == 0 && ix == 0) { R = G = B = 255; opacity = 1.0; } mainImage.AntiAliasedLine(xx1, yy1, xx1, yy2, z - iz * boxDepth2, z - iz * boxDepth2, (sRGB8 ) { R, G, B }, opacity, 1); } double xx1 = ((x2 + n * boxWidth) / (1.0 - boxDepth * iz * persp) / aspectRatio + 0.5) * sw; double xx2 = ((x2 - n * boxWidth) / (1.0 - boxDepth * iz * persp) / aspectRatio + 0.5) * sw; for (int iy = -n; iy <= n; iy++) { double yy1 = ((y2 + boxWidth * iy) / (1.0 - boxDepth * iz * persp) + 0.5) * sh; unsigned char R = 128 + iz * 40; unsigned char G = 128 - iz * 40; unsigned char B = 0; double opacity = 0.8; if (iz == 0 && iy == 0) { R = G = B = 255; opacity = 1.0; } mainImage.AntiAliasedLine(xx1, yy1, xx2, yy1, z - iz * boxDepth2, z - iz * boxDepth2, (sRGB8 ) { R, G, B }, opacity, 1); } if (iz < n) { for (int ix = -n; ix <= n; ix++) { for (int iy = -n; iy <= n; iy++) { double xx1 = ((x2 + boxWidth * ix) / (1.0 - boxDepth * iz * persp) / aspectRatio + 0.5) * sw; double yy1 = ((y2 + boxWidth * iy) / (1.0 - boxDepth * iz * persp) + 0.5) * sh; double xx2 = ((x2 + boxWidth * ix) / (1.0 - boxDepth * (iz + 1) * persp) / aspectRatio + 0.5) * sw; double yy2 = ((y2 + boxWidth * iy) / (1.0 - boxDepth * (iz + 1) * persp) + 0.5) * sh; double opacity = 0.8; unsigned char R = 128 + iz * 40; unsigned char G = 128 - iz * 40; unsigned char B = 0; if (ix == 0 && iy == 0) { R = G = B = 255; opacity = 1.0; } mainImage.AntiAliasedLine(xx1, yy1, xx2, yy2, z - iz * boxDepth2, z - (iz + 1) * boxDepth2, (sRGB8 ) { R, G, B }, opacity, 1); } } } if (iz == 0) { mainImage.AntiAliasedLine(x - sw * 0.3, y, x + sw * 0.3, y, z, z, (sRGB8 ) { 255, 255, 255 }, 1.0, 1); mainImage.AntiAliasedLine(x, y - sh * 0.3, x, y + sh * 0.3, z, z, (sRGB8 ) { 255, 255, 255 }, 1.0, 1); if (mode >= 5 && mode < 10) { double r = 1.5 * (boxWidth * n / aspectRatio); if (r > 1.0) r = 1.0; mainImage.CircleBorder(x, y, z, r * sw, (sRGB8 ) { 0, 100, 255 }, r * 0.1 * sw, 1.0, 1); } } } mainImage.AntiAliasedLine(sw / 2, 0, sw / 2, sh, -1, -1, (sRGB8 ) { 255, 255, 255 }, 0.2, 1); mainImage.AntiAliasedLine(0, sh / 2, sw, sh / 2, -1, -1, (sRGB8 ) { 255, 255, 255 }, 0.2, 1); last_z_mouse = z; } mainImage.RedrawInWidget(renderWindow.drawingArea); } g_signal_handlers_unblock_by_func(widget, (GCallback*)motion_notify_event, NULL); return TRUE; } gboolean CallerTimerLoop(void) { if (isRendering && renderRequest && !Interface_data.animMode) { programClosed = true; isPostRendering = false; } if (!isRendering && renderRequest && !Interface_data.animMode) { renderRequest = false; Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; gdk_threads_enter(); printf("Starting\n"); MainRender(); gdk_threads_leave(); } return true; } gboolean CallerTimerLoopWindowRefresh(GtkWidget *widget) { if(refreshInNextLoop && !refreshNeeded) { refreshInNextLoop = false; if(imageCompileNeeded) { imageCompileNeeded = false; mainImage.CompileImage(); } gtk_widget_set_size_request(renderWindow.drawingArea, mainImage.GetPreviewWidth(), mainImage.GetPreviewHeight()); gtk_widget_queue_resize (renderWindow.scrolled_window); mainImage.CreatePreview(Interface_data.imageScale); mainImage.ConvertTo8bit(); mainImage.UpdatePreview(); mainImage.RedrawInWidget(renderWindow.drawingArea); gtk_widget_set_size_request(renderWindow.drawingArea, mainImage.GetPreviewWidth(), mainImage.GetPreviewHeight()); } if(refreshNeeded) { refreshInNextLoop = true; refreshNeeded = false; } return true; } gboolean pressed_button_on_image(GtkWidget *widget, GdkEventButton *event) { int clickMode = gtk_combo_box_get_active(GTK_COMBO_BOX(renderWindow.comboMouseClickMode)); if (Interface_data.animMode && Interface_data.recordMode) { double DESpeed = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_animationDESpeed))); if (event-> button == 1) { DESpeed *= 1.1; } if (event-> button == 3) { DESpeed *= 0.9; } gtk_entry_set_text(GTK_ENTRY(Interface.edit_animationDESpeed), DoubleToString(DESpeed)); } else { if (clickMode == 0) //none { //nothing } else { //------------ calculation of 3D pixel position int x = event->x; int z = event->y; x = x / mainImage.GetPreviewScale(); z = z / mainImage.GetPreviewScale(); double y = mainImage.GetPixelZBuffer(x, z); sParamRender params; ReadInterface(¶ms); int width = mainImage.GetWidth(); int height = mainImage.GetHeight(); //rotation matrix CRotationMatrix mRot; mRot.RotateZ(params.doubles.alpha); mRot.RotateX(params.doubles.beta); mRot.RotateY(params.doubles.gamma); CVector3 baseY(0.0, 1.0, 0.0); baseY = mRot.RotateVector(baseY); double x2, z2; double aspectRatio = (double) width / height; enumPerspectiveType perspectiveType = (enumPerspectiveType)gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboPerspectiveType)); if(perspectiveType == fishEyeCut) perspectiveType = fishEye; CVector3 viewVector; if (perspectiveType == fishEye) { x2 = M_PI * ((double) x / width - 0.5) * aspectRatio; // --------- do sprawdzenia z2 = M_PI * ((double) z / height - 0.5); double r = sqrt(x2 * x2 + z2 * z2); if(r == 0) { viewVector.x = 0.0; viewVector.z = 0.0; viewVector.y = 1.0; } else { viewVector.x = x2 / r * sin(r * params.doubles.persp); viewVector.z = z2 / r * sin(r * params.doubles.persp); viewVector.y = cos(r * params.doubles.persp); } viewVector.Normalize(); } else if (perspectiveType == equirectangular) { x2 = M_PI * ((double) x / width - 0.5) * aspectRatio; // --------- do sprawdzenia z2 = M_PI * ((double) z / height - 0.5); viewVector.x = sin(params.doubles.persp * x2) * cos(params.doubles.persp * z2); viewVector.z = sin(params.doubles.persp * z2); viewVector.y = cos(params.doubles.persp * x2) * cos(params.doubles.persp * z2); viewVector.Normalize(); } else { x2 = ((double) x / width - 0.5) * aspectRatio; z2 = ((double) z / height - 0.5); viewVector.x = x2 * params.doubles.persp; viewVector.y = 1.0; viewVector.z = z2 * params.doubles.persp; } CVector3 viewVectorNotRotated = viewVector; viewVector = mRot.RotateVector(viewVector); CVector3 start; if (perspectiveType == fishEye || perspectiveType == equirectangular) { start = params.doubles.vp; } else { start = params.doubles.vp - baseY * (1.0 / params.doubles.persp * params.doubles.zoom); } CVector3 point = start + viewVector * y; //difference behavior depends on selected mode if(clickMode ==1 || clickMode >= 5) //camera move or light position setup { double closeUpRatio = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_mouse_click_distance))); double lightPlacementDistance = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_auxLightPlacementDistance))); if(clickMode == 9) lightPlacementDistance = 0; //random light center if (event->button == 3) //right mouse button { closeUpRatio = 1.0 / closeUpRatio; } undoBuffer.SaveUndo(¶ms); if (y < 1e19) { CVector3 vector, vector2; double delta_y; if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorAbsoluteDistance))) { delta_y = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_NavigatorAbsoluteDistance))); } else { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorGoToSurface) )) delta_y = y; else delta_y = y * (1.0 - 1.0/closeUpRatio); } if (clickMode == 1) { point = start + viewVector * delta_y; } else if (clickMode >= 5 && clickMode < 10) { point = start + viewVector * (y - lightPlacementDistance); //lights placement } else if (clickMode == 10 || clickMode == 11) //julia constant, measurements { point = start + viewVector * y; } if(clickMode == 1) //move the camera { params.doubles.vp = point; params.doubles.zoom /= closeUpRatio; char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe-1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); double rotationX = atan2(viewVectorNotRotated.z, viewVectorNotRotated.y); double rotationZ = -atan2(viewVectorNotRotated.x, viewVectorNotRotated.y); double alfa_old = params.doubles.alpha; double beta_old = params.doubles.beta; double gamma_old = params.doubles.gamma; CRotationMatrix mRot2; mRot2.RotateZ(params.doubles.alpha); mRot2.RotateX(params.doubles.beta); mRot2.RotateY(params.doubles.gamma); mRot2.RotateX(rotationX); mRot2.RotateZ(rotationZ); params.doubles.alpha = -mRot2.GetAlfa(); params.doubles.beta = -mRot2.GetBeta(); params.doubles.gamma = -mRot2.GetGamma(); //Fix view angle jumps +180°/-180° due to asin and atan functions. These are nasty with keyframes. This test may not be accurate in every case. (Mintaka 20111005) //Fix by mintaka (fractalforums.com/mandelbulber/mandelbulber-1-06-patch/) if ((alfa_old - params.doubles.alpha) > M_PI) //angle jump over +180° to negative value { params.doubles.alpha = params.doubles.alpha + 2 * M_PI; } if ((params.doubles.alpha - alfa_old) > M_PI) //angle jump over -180° to positive value { params.doubles.alpha = params.doubles.alpha - 2 * M_PI; } if ((beta_old - params.doubles.beta) > M_PI) { params.doubles.beta = params.doubles.beta + 2 * M_PI; } if ((params.doubles.beta - beta_old) > M_PI) { params.doubles.beta = params.doubles.beta - 2 * M_PI; } if ((gamma_old - params.doubles.gamma) > M_PI) { params.doubles.gamma = params.doubles.gamma + 2 * M_PI; } if ((params.doubles.gamma - gamma_old) > M_PI) { params.doubles.gamma = params.doubles.gamma - 2 * M_PI; } WriteInterface(¶ms); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; programClosed = true; isPostRendering = false; renderRequest = true; } if(clickMode >= 5) { double distance = CalculateDistance(point, params.fractal); if (clickMode == 5) { params.doubles.auxLightPre[0] = point; params.doubles.auxLightPreIntensity[0] = distance * distance; } if (clickMode == 6) { params.doubles.auxLightPre[1] = point; params.doubles.auxLightPreIntensity[1] = distance * distance; } if (clickMode == 7) { params.doubles.auxLightPre[2] = point; params.doubles.auxLightPreIntensity[2] = distance * distance; } if (clickMode == 8) { params.doubles.auxLightPre[3] = point; params.doubles.auxLightPreIntensity[3] = distance * distance; } if (clickMode == 9) { params.doubles.auxLightRandomCenter = point; } if (clickMode == 10) { params.fractal.doubles.julia = point; } if (clickMode == 11) { CVector3 tempPoint; tempPoint.x = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_measureX))); tempPoint.y = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_measureY))); tempPoint.z = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_measureZ))); double distanceFromLast = (point - tempPoint).Length(); char distanceString[1000]; sprintf(distanceString, "Distance from last point: %g\n", distanceFromLast); gtk_label_set_text(GTK_LABEL(Interface.label_measureDistance), distanceString); gtk_entry_set_text(GTK_ENTRY(Interface.edit_measureX), DoubleToString(point.x)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_measureY), DoubleToString(point.y)); gtk_entry_set_text(GTK_ENTRY(Interface.edit_measureZ), DoubleToString(point.z)); } WriteInterface(¶ms); PlaceRandomLights(¶ms, false); } } } else if(clickMode == 2) //fog distance front { } else if(clickMode == 3) //fog visibility distance { double fog = (log10(y*0.5) + 16.0) * 10.0; gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentFogDepth), fog); } else if(clickMode == 4) //DOF point { double dof = (log10(y) + 16.0) * 10.0; gtk_adjustment_set_value(GTK_ADJUSTMENT(Interface.adjustmentDOFFocus), dof); } } } return true; } gboolean pressed_button_on_palette(GtkWidget *widget, GdkEventButton *event) { int x = event->x; int y = event->y; double colWidth = 10; double paletteOffset = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentPaletteOffset)); int index = (int) ((x + colWidth/2) / colWidth + paletteOffset); if(index < 0) index = 0; if(index < 256) { char text[100]; sprintf(text, "Please edit color #%d", index); GtkWidget *colorDialog = gtk_color_selection_dialog_new(text); GtkColorSelection *colorSel = GTK_COLOR_SELECTION(gtk_color_selection_dialog_get_color_selection(GTK_COLOR_SELECTION_DIALOG(colorDialog))); sRGB color16 = Interface_data.palette[index]; GdkColor color; color.red = color16.R*256; color.green = color16.G*256; color.blue = color16.B*256; gtk_color_selection_set_current_color(colorSel, &color); gint result; result = gtk_dialog_run(GTK_DIALOG(colorDialog)); if (result == GTK_RESPONSE_OK) { gtk_color_selection_get_current_color(colorSel, &color); color16.R = color.red/256; color16.G = color.green/256; color16.B = color.blue/256; Interface_data.palette[index] = color16; DrawPalette(Interface_data.palette); } gtk_widget_destroy(colorDialog); } return TRUE; } //----------- close program gboolean StopRenderingAndQuit(GtkWidget *widget, GdkEvent *event, gpointer data) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Do you really want to close Mandelbulber?"); gint result = gtk_dialog_run(GTK_DIALOG(dialog)); if(result == GTK_RESPONSE_YES) { gtk_widget_destroy(dialog); programClosed = true; StopRendering(widget, data); if (netRender->IsClient()) { netRender->DeleteClient(); } sAppSettings appParams; ReadInterfaceAppSettings(&appParams); #ifdef CLSUPPORT SaveAppSettings("mandelbulber_ocl_settings", appParams); #else SaveAppSettings("mandelbulber_settings", appParams); #endif gtk_main_quit(); printf("Quitting\n"); } else { gtk_widget_destroy(dialog); } return true; } gboolean WindowReconfigured(GtkWindow *window, GdkEvent *event, gpointer data) { int width = event->configure.width; int height = event->configure.height; if (width != renderWindow.lastWindowWidth || height != renderWindow.lastWindowHeight) { ChangedComboScale(renderWindow.comboImageScale, NULL); renderWindow.lastWindowWidth = width; renderWindow.lastWindowHeight = height; } return false; } gboolean on_darea_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { if (mainImage.IsPreview()) { mainImage.RedrawInWidget(renderWindow.drawingArea); return TRUE; } else return false; } gboolean on_dareaPalette_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { paletteViewCreated = true; //srand(Interface_data.coloring_seed); //NowaPaleta(paleta, 1.0); DrawPalette(Interface_data.palette); return TRUE; } void StartRendering(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); char distanceString[1000]; double distance = CalculateDistance(params.doubles.vp, params.fractal); sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\n", distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); if (clSupport->IsEnabled()) { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = false; gdk_threads_enter(); MainRender(); gdk_threads_leave(); } else { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } } void PressedAnimationRecord(GtkWidget *widget, gpointer data) { if (!isRendering) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); Interface_data.animMode = true; Interface_data.playMode = false; Interface_data.recordMode = true; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), "Waiting 3 seconds"); while (gtk_events_pending()) gtk_main_iteration(); g_usleep(3000000); MainRender(); } } void PressedAnimationContinueRecording(GtkWidget *widget, gpointer data) { if (!isRendering) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); Interface_data .animMode = true; Interface_data.playMode = false; Interface_data.recordMode = true; Interface_data.continueRecord = true; MainRender(); } } void PressedAnimationRender(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); if (!isRendering) { Interface_data .animMode = true; Interface_data.playMode = true; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; MainRender(); } } void StopRendering(GtkWidget *widget, gpointer data) { programClosed = true; isPostRendering = false; printf("Rendering terminated\n"); if (netRender->IsServer()) { for (int i = 0; i < netRender->getNoOfClients(); i++) { netRender->sendDataToClient(NULL, 0, (char*)"stp", i, 0); } } } void PressedApplyBrigtness(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); GdkColor color; gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorGlow1), &color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorGlow2), &color); gtk_color_button_get_color(GTK_COLOR_BUTTON(Interface.buColorMainLight), &color); //generating color palette //srand(Interface_data.coloring_seed); //NowaPaleta(paleta, 1.0); //DrawPalette(mainImage.GetPalettePtr()); -------------- do poprawienia //if (!isRendering) //{ if(!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled))) { mainImage.CompileImage(); mainImage.ConvertTo8bit(); mainImage.UpdatePreview(); mainImage.RedrawInWidget(renderWindow.drawingArea); while (gtk_events_pending()) gtk_main_iteration(); } else { PressedSSAOUpdate(widget, data); } //} } void PressedLoadSettings(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Load fractal settings", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); GtkWidget *preview; GtkWidget *checkBox = gtk_check_button_new_with_label("Render preview of settings file"); preview = gtk_drawing_area_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), checkBox); gtk_widget_set_size_request(preview, 128, 128); g_signal_connect(dialog, "update-preview", G_CALLBACK(UpdatePreviewSettingsDialog), preview); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameSettings); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); sParamRender fractParamLoaded; LoadSettings(filename, fractParamLoaded); Params2InterfaceData(&fractParamLoaded); WriteInterface(&fractParamLoaded); strcpy(lastFilenameSettings, filename); string windowTitle= string("Mandelbulber (")+filename+")"; gtk_window_set_title(GTK_WINDOW(window_interface), windowTitle.c_str()); timeline->Reset(); } gtk_widget_destroy(dialog); } void PressedSaveSettings(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Save fractal settings", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameSettings); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); sParamRender fractParamToSave; ReadInterface(&fractParamToSave); SaveSettings(filename, fractParamToSave, true); strcpy(lastFilenameSettings, filename); string windowTitle= string("Mandelbulber (")+filename+")"; gtk_window_set_title(GTK_WINDOW(window_interface), windowTitle.c_str()); } gtk_widget_destroy(dialog); } void PressedSaveImage(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Save image as...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameImage); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); SaveJPEG(filename, 98, mainImage.GetWidth(), mainImage.GetHeight(), (JSAMPLE*) mainImage.ConvertTo8bit()); strcpy(lastFilenameImage, filename); } gtk_widget_destroy(dialog); } void PressedSaveImagePNG(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Save image as...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameImage); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); SavePNG(filename, 100, mainImage.GetWidth(), mainImage.GetHeight(), (JSAMPLE*) mainImage.ConvertTo8bit()); strcpy(lastFilenameImage, filename); } gtk_widget_destroy(dialog); } void PressedSaveImagePNG16(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Save image as...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameImage); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); SavePNG16(filename, 100, mainImage.GetWidth(), mainImage.GetHeight(), mainImage.GetImage16Ptr()); strcpy(lastFilenameImage, filename); } gtk_widget_destroy(dialog); } void PressedSaveImagePNG16Alpha(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Save image as...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameImage); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); SavePNG16Alpha(filename, 100, mainImage.GetWidth(), mainImage.GetHeight(), &mainImage); strcpy(lastFilenameImage, filename); } gtk_widget_destroy(dialog); } void PressedOkDialogFiles(GtkWidget *widget, gpointer data) { sDialogFiles *dialog = (sDialogFiles*) data; printf("Files OK\n"); strcpy(Interface_data.file_destination, gtk_entry_get_text(GTK_ENTRY(dialog->edit_destination))); strcpy(Interface_data.file_background, gtk_entry_get_text(GTK_ENTRY(dialog->edit_background))); strcpy(Interface_data.file_envmap, gtk_entry_get_text(GTK_ENTRY(dialog->edit_envmap))); strcpy(Interface_data.file_lightmap, gtk_entry_get_text(GTK_ENTRY(dialog->edit_lightmap))); strcpy(Interface_data.file_path, gtk_entry_get_text(GTK_ENTRY(dialog->edit_path))); strcpy(Interface_data.file_keyframes, gtk_entry_get_text(GTK_ENTRY(dialog->edit_keyframes))); gtk_widget_destroy(dialog->window_files); delete dialog; timeline->Reset(); } void PressedCancelDialogFiles(GtkWidget *widget, gpointer data) { sDialogFiles *dialog = (sDialogFiles*) data; printf("Files cancel\n"); gtk_widget_destroy(dialog->window_files); } static void Navigate(int x, int y, int r) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); double rotation_step = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_step_rotation))) / 180.0 * M_PI; params.doubles.gamma += r * rotation_step; if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkStraightRotation))) { params.doubles.alpha += x * rotation_step; params.doubles.beta += y * rotation_step; } else { double alfa_old = params.doubles.alpha; double beta_old = params.doubles.beta; double gamma_old = params.doubles.gamma; CRotationMatrix mRot; mRot.RotateZ(params.doubles.alpha); mRot.RotateX(params.doubles.beta); mRot.RotateY(params.doubles.gamma); mRot.RotateX(y * rotation_step); mRot.RotateZ(x * rotation_step); params.doubles.alpha = -mRot.GetAlfa(); params.doubles.beta = -mRot.GetBeta(); params.doubles.gamma = -mRot.GetGamma(); //Fix view angle jumps +180°/-180° due to asin and atan functions. These are nasty with keyframes. This test may not be accurate in every case. (Mintaka 20111005) //Fix by mintaka (fractalforums.com/mandelbulber/mandelbulber-1-06-patch/) if (rotation_step < M_PI) //does not work if we turn more than 180° { if ((alfa_old - params.doubles.alpha) > M_PI) //angle jump over +180° to negative value { params.doubles.alpha = params.doubles.alpha + 2 * M_PI; } if ((params.doubles.alpha - alfa_old) > M_PI) //angle jump over -180° to positive value { params.doubles.alpha = params.doubles.alpha - 2 * M_PI; } if ((beta_old - params.doubles.beta) > M_PI) { params.doubles.beta = params.doubles.beta + 2 * M_PI; } if ((params.doubles.beta - beta_old) > M_PI) { params.doubles.beta = params.doubles.beta - 2 * M_PI; } if ((gamma_old - params.doubles.gamma) > M_PI) { params.doubles.gamma = params.doubles.gamma + 2 * M_PI; } if ((params.doubles.gamma - gamma_old) > M_PI) { params.doubles.gamma = params.doubles.gamma - 2 * M_PI; } } } WriteInterface(¶ms); if (clSupport->IsEnabled()) { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = false; gdk_threads_enter(); MainRender(); gdk_threads_leave(); } else { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } } void PressedNavigatorUp(GtkWidget *widget, gpointer data) { Navigate(0, -1, 0); } void PressedNavigatorDown(GtkWidget *widget, gpointer data) { Navigate(0, 1, 0); } void PressedNavigatorLeft(GtkWidget *widget, gpointer data) { Navigate(1, 0, 0); } void PressedNavigatorRight(GtkWidget *widget, gpointer data) { Navigate(-1, 0, 0); } void PressedNavigatorRotateLeft(GtkWidget *widget, gpointer data) { Navigate(0, 0, 1); } void PressedNavigatorRotateRight(GtkWidget *widget, gpointer data) { Navigate(0, 0, -1); } static void Move(int x, int y, int z) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); double distance = 0; double speed = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_step_forward))); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNavigatorAbsoluteDistance))) { distance = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_NavigatorAbsoluteDistance))); } else { distance = CalculateDistance(params.doubles.vp, params.fractal) * speed; } if (z > 0) last_navigator_step = distance; CVector3 vDelta; CRotationMatrix mRot; mRot.RotateZ(params.doubles.alpha); mRot.RotateX(params.doubles.beta); mRot.RotateY(params.doubles.gamma); CVector3 directionVector(x * distance, abs(z) * distance, y * distance); vDelta = mRot.RotateVector(directionVector); if (z >= 0) params.doubles.vp += vDelta; else params.doubles.vp -= vDelta; char distanceString[1000]; distance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe-1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", distance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); WriteInterface(¶ms); if (clSupport->IsEnabled()) { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = false; gdk_threads_enter(); MainRender(); gdk_threads_leave(); } else { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } } void PressedNavigatorMoveUp(GtkWidget *widget, gpointer data) { Move(0, -1, 0); } void PressedNavigatorMoveDown(GtkWidget *widget, gpointer data) { Move(0, 1, 0); } void PressedNavigatorMoveLeft(GtkWidget *widget, gpointer data) { Move(-1, 0, 0); } void PressedNavigatorMoveRight(GtkWidget *widget, gpointer data) { Move(1, 0, 0); } void PressedNavigatorForward(GtkWidget *widget, gpointer data) { Move(0, 0, 1); } void PressedNavigatorBackward(GtkWidget *widget, gpointer data) { Move(0, 0, -1); } void PressedNavigatorInit(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); double objectSize; if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClCustomEnable))) { objectSize = 10.0; } else { objectSize = ScanSizeOfFractal(¶ms); } double initCameraDistance = objectSize + objectSize / params.doubles.persp * 1.2 * params.image_width/params.image_height; CVector3 initVector(0,-initCameraDistance,0); CRotationMatrix mRot; mRot.RotateZ(params.doubles.alpha); mRot.RotateX(params.doubles.beta); initVector = mRot.RotateVector(initVector); params.doubles.zoom = 1e-7; params.doubles.vp = initVector; params.doubles.viewDistanceMax = initCameraDistance + objectSize; char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); WriteInterface(¶ms); if (clSupport->IsEnabled()) { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = false; gdk_threads_enter(); MainRender(); gdk_threads_leave(); } else { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } } void ChangedComboScale(GtkWidget *widget, gpointer data) { GtkComboBox *combo = GTK_COMBO_BOX(widget); int scale = gtk_combo_box_get_active(combo); double imageScale; if (scale == 0) imageScale = 1.0 / 10.0; if (scale == 1) imageScale = 1.0 / 8.0; if (scale == 2) imageScale = 1.0 / 6.0; if (scale == 3) imageScale = 1.0 / 4.0; if (scale == 4) imageScale = 1.0 / 3.0; if (scale == 5) imageScale = 1.0 / 2.0; if (scale == 6) imageScale = 1.0; if (scale == 7) imageScale = 2.0; if (scale == 8) imageScale = 4.0; if (scale == 9) imageScale = 6.0; if (scale == 10) imageScale = 8.0; if (scale == 11) { int winWidth = renderWindow.scrolled_window->allocation.width; int winHeight = renderWindow.scrolled_window->allocation.height;; //gtk_window_get_size(GTK_WINDOW(renderWindow.scrolled_window), &winWidth, &winHeight); winWidth -= renderWindow.scrollbarSize; winHeight -= renderWindow.scrollbarSize; imageScale = (double) winWidth / mainImage.GetWidth(); if (mainImage.GetHeight() * imageScale > winHeight) imageScale = (double) winHeight / mainImage.GetHeight(); } Interface_data.imageScale = imageScale; refreshNeeded = true; } void ChangedComboFormula(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); enumFractalFormula formula = params.fractal.formula; /* if (formula == trig_DE || formula == trig_optim) { gtk_widget_set_sensitive(Interface.checkFastAmbientOcclusion, true); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(Interface.checkFastAmbientOcclusion), false); gtk_widget_set_sensitive(Interface.checkFastAmbientOcclusion, false); } */ gtk_widget_set_sensitive(Interface.tab_box_mandelbox, formula == tglad || formula == smoothMandelbox || formula == mandelboxVaryScale4D || formula == generalizedFoldBox || formula == hybrid); gtk_widget_set_sensitive(Interface.tab_box_IFS, formula == kaleidoscopic || params.fractal.IFS.foldingMode || formula == hybrid); gtk_widget_set_sensitive(Interface.edit_power, formula == trig_DE || formula == trig_optim || formula == xenodreambuie || formula == mandelbulb4); gtk_widget_set_sensitive(Interface.edit_cadd, formula == aexion || formula == hybrid); gtk_widget_set_sensitive(Interface.tab_box_hybrid, formula == hybrid); gtk_widget_set_sensitive(Interface.edit_mandelboxSharpness, formula == smoothMandelbox); gtk_widget_set_sensitive(Interface.comboGeneralizedFoldBoxType, formula == generalizedFoldBox); gtk_widget_set_sensitive(Interface.edit_mandelboxSolid, formula == generalizedFoldBox); gtk_widget_set_sensitive(Interface.edit_mandelboxMelt, formula == generalizedFoldBox); gtk_widget_set_sensitive(Interface.comboFractType, true); } void ChangedTgladFoldingMode(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkTgladMode))) { gtk_widget_set_sensitive(Interface.edit_tglad_folding_1, true); gtk_widget_set_sensitive(Interface.edit_tglad_folding_2, true); } else { gtk_widget_set_sensitive(Interface.edit_tglad_folding_1, false); gtk_widget_set_sensitive(Interface.edit_tglad_folding_2, false); } } void ChangedSphericalFoldingMode(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSphericalFoldingMode))) { gtk_widget_set_sensitive(Interface.edit_spherical_folding_1, true); gtk_widget_set_sensitive(Interface.edit_spherical_folding_2, true); } else { gtk_widget_set_sensitive(Interface.edit_spherical_folding_1, false); gtk_widget_set_sensitive(Interface.edit_spherical_folding_2, false); } } void ChangedIFSFoldingMode(GtkWidget *widget, gpointer data) { int formula = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboFractType)); if ((formula == 9) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIFSFoldingMode))) { gtk_widget_set_sensitive(Interface.tab_box_IFS, true); } else { gtk_widget_set_sensitive(Interface.tab_box_IFS, false); } } void ChangedJulia(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkJulia))) { gtk_widget_set_sensitive(Interface.edit_julia_a, true); gtk_widget_set_sensitive(Interface.edit_julia_b, true); gtk_widget_set_sensitive(Interface.edit_julia_c, true); } else { gtk_widget_set_sensitive(Interface.edit_julia_a, false); gtk_widget_set_sensitive(Interface.edit_julia_b, false); gtk_widget_set_sensitive(Interface.edit_julia_c, false); } } void ChangedLimits(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkLimits))) { gtk_widget_set_sensitive(Interface.edit_amin, true); gtk_widget_set_sensitive(Interface.edit_amax, true); gtk_widget_set_sensitive(Interface.edit_bmin, true); gtk_widget_set_sensitive(Interface.edit_bmax, true); gtk_widget_set_sensitive(Interface.edit_cmin, true); gtk_widget_set_sensitive(Interface.edit_cmax, true); } else { gtk_widget_set_sensitive(Interface.edit_amin, false); gtk_widget_set_sensitive(Interface.edit_amax, false); gtk_widget_set_sensitive(Interface.edit_bmin, false); gtk_widget_set_sensitive(Interface.edit_bmax, false); gtk_widget_set_sensitive(Interface.edit_cmin, false); gtk_widget_set_sensitive(Interface.edit_cmax, false); } } void ChangedAmbientOcclusion(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkAmbientOcclusion))) { gtk_widget_set_sensitive(Interface.edit_AmbientOcclusionQuality, true); gtk_widget_set_sensitive(Interface.checkFastAmbientOcclusion, true); } else { gtk_widget_set_sensitive(Interface.edit_AmbientOcclusionQuality, false); gtk_widget_set_sensitive(Interface.checkFastAmbientOcclusion, false); } } void ChangedFastAmbientOcclusion(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkFastAmbientOcclusion))) { gtk_widget_set_sensitive(Interface.edit_fastAoTune, true); } else { gtk_widget_set_sensitive(Interface.edit_fastAoTune, false); } } void ChangedMandelboxRotations(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkMandelboxRotationsEnable))) { gtk_widget_set_sensitive(Interface.tableMandelboxRotations, true); } else { gtk_widget_set_sensitive(Interface.tableMandelboxRotations, false); } } void ChangedSliderFog(GtkWidget *widget, gpointer data) { double visibility = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentFogDepth)); char text[100]; sprintf(text, "visibility = %g", pow(10.0, visibility / 10 - 16.0)); gtk_label_set_text(GTK_LABEL(Interface.label_sliderFog), text); } void ChangedSliderDOF(GtkWidget *widget, gpointer data) { double focus = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentDOFFocus)); char text[100]; sprintf(text, "DOF focus distance = %g", pow(10.0, focus / 10 - 16.0)); gtk_label_set_text(GTK_LABEL(Interface.label_sliderDOF), text); } void PressedSSAOUpdate(GtkWidget *widget, gpointer data) { if (Interface_data.disableInitRefresh) return; double SSAOQuality = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentSSAOQuality)); bool SSAOEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled)); double persp = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_persp))); enumPerspectiveType perspectiveType = (enumPerspectiveType)gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboPerspectiveType)); double intensity = atofData(gtk_entry_get_text(GTK_ENTRY(Interface.edit_ambient_occlusion))); sImageAdjustments *adj = mainImage.GetImageAdjustments(); adj->globalIlum = intensity; if (!isRendering) { mainImage.CompileImage(); if (SSAOEnabled) { if(clSupport->IsReady()) { #ifdef CLSUPPORT clSupport->SetSize(mainImage.GetWidth(), mainImage.GetHeight()); sClInBuff *inCLBuff = clSupport->GetInBuffer1(); sClInConstants *inCLConstants = clSupport->GetInConstantBuffer1(); sParamRender param; ReadInterface(¶m); Params2Cl(¶m, inCLBuff, inCLConstants); clSupport->SetParams(inCLBuff, inCLConstants, param.fractal.formula); clSupport->SSAORender(&mainImage, renderWindow.drawingArea); #endif } else { PostRendering_SSAO(&mainImage, persp, SSAOQuality, perspectiveType, false); } } mainImage.ConvertTo8bit(); mainImage.UpdatePreview(); mainImage.RedrawInWidget(renderWindow.drawingArea); while (gtk_events_pending()) gtk_main_iteration(); } } void PressedDOFUpdate(GtkWidget *widget, gpointer data) { if (Interface_data.disableInitRefresh) return; double SSAOQuality = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentSSAOQuality)); bool SSAOEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkSSAOEnabled)); double persp = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_persp))); enumPerspectiveType perspectiveType = (enumPerspectiveType)gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboPerspectiveType)); double DOFFocus = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentDOFFocus)); double DOFRadius = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentDOFRadius)); bool DOFEnabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkDOFEnabled)); if (!isRendering) { mainImage.CompileImage(); if (clSupport->IsReady()) { #ifdef CLSUPPORT clSupport->SetSize(mainImage.GetWidth(), mainImage.GetHeight()); sClInBuff *inCLBuff = clSupport->GetInBuffer1(); sClInConstants *inCLConstants = clSupport->GetInConstantBuffer1(); sParamRender param; ReadInterface(¶m); Params2Cl(¶m, inCLBuff, inCLConstants); clSupport->SetParams(inCLBuff, inCLConstants, param.fractal.formula); if(SSAOEnabled) { clSupport->SSAORender(&mainImage, renderWindow.drawingArea); } if (DOFEnabled) { clSupport->DOFRender(&mainImage, renderWindow.drawingArea); } #endif } else { if (SSAOEnabled) { PostRendering_SSAO(&mainImage, persp, SSAOQuality, perspectiveType, false); } if (DOFEnabled) { double DOF_focus = pow(10, DOFFocus / 10.0 - 16.0); PostRendering_DOF(&mainImage, DOFRadius * mainImage.GetWidth() / 1000.0, DOF_focus); } } mainImage.ConvertTo8bit(); mainImage.UpdatePreview(); mainImage.RedrawInWidget(renderWindow.drawingArea); while (gtk_events_pending()) gtk_main_iteration(); } } void PressedDistributeLights(GtkWidget *widget, gpointer data) { sParamRender fractParams; ReadInterface(&fractParams); undoBuffer.SaveUndo(&fractParams); PlaceRandomLights(&fractParams, false); } void RecalculateIFSParams(sFractal &fractal) { fractal.IFS.mainRot.SetRotation(fractal.IFS.doubles.rotationAlfa, fractal.IFS.doubles.rotationBeta, fractal.IFS.doubles.rotationGamma); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { fractal.IFS.rot[i].SetRotation(fractal.IFS.doubles.alfa[i], fractal.IFS.doubles.beta[i], fractal.IFS.doubles.gamma[i]); fractal.IFS.doubles.direction[i].Normalize(); } fractal.mandelbox.mainRot.SetRotation(fractal.mandelbox.doubles.rotationMain); for (int fold = 0; fold < MANDELBOX_FOLDS; ++fold) for (int axis = 0; axis < 3; ++axis) { fractal.mandelbox.rot[fold][axis].SetRotation(fractal.mandelbox.doubles.rotation[fold][axis]); fractal.mandelbox.rotinv[fold][axis] = fractal.mandelbox.rot[fold][axis].Transpose(); } //Generalized Fold Box precalculated vectors double sqrt_i3 = 1.0/sqrt(3.0); fractal.genFoldBox.Nv_tet[0] = CVector3( sqrt_i3, sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_tet[1] = CVector3( sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_tet[2] = CVector3(-sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_tet[3] = CVector3(-sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.sides_tet = 4; fractal.genFoldBox.Nv_cube[0] = CVector3( 1, 0, 0); fractal.genFoldBox.Nv_cube[1] = CVector3(-1, 0, 0); fractal.genFoldBox.Nv_cube[2] = CVector3( 0, 1, 0); fractal.genFoldBox.Nv_cube[3] = CVector3( 0,-1, 0); fractal.genFoldBox.Nv_cube[4] = CVector3( 0, 0, 1); fractal.genFoldBox.Nv_cube[5] = CVector3( 0, 0,-1); fractal.genFoldBox.sides_cube = 6; fractal.genFoldBox.Nv_oct[0] = CVector3( sqrt_i3, sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct[1] = CVector3( sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct[2] = CVector3(-sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct[3] = CVector3(-sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct[4] = CVector3( sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct[5] = CVector3(-sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct[6] = CVector3(-sqrt_i3, sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct[7] = CVector3( sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.sides_oct = 8; fractal.genFoldBox.Nv_oct_cube[0] = CVector3( sqrt_i3, sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct_cube[1] = CVector3( sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct_cube[2] = CVector3(-sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct_cube[3] = CVector3(-sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct_cube[4] = CVector3( sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct_cube[5] = CVector3(-sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_oct_cube[6] = CVector3(-sqrt_i3, sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct_cube[7] = CVector3( sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_oct_cube[8] = CVector3( 1, 0, 0); fractal.genFoldBox.Nv_oct_cube[9] = CVector3(-1, 0, 0); fractal.genFoldBox.Nv_oct_cube[10] = CVector3( 0, 1, 0); fractal.genFoldBox.Nv_oct_cube[11] = CVector3( 0,-1, 0); fractal.genFoldBox.Nv_oct_cube[12] = CVector3( 0, 0, 1); fractal.genFoldBox.Nv_oct_cube[13] = CVector3( 0, 0,-1); fractal.genFoldBox.sides_oct_cube = 14; double aa = ((1.0+sqrt(5.0))/2.0); double bb = (1.0/sqrt(aa*aa+1.0)); fractal.genFoldBox.Nv_dodeca[0] = CVector3(0, bb, aa * bb); fractal.genFoldBox.Nv_dodeca[1] = CVector3(0, bb, -aa * bb); fractal.genFoldBox.Nv_dodeca[2] = CVector3(0, -bb, aa * bb); fractal.genFoldBox.Nv_dodeca[3] = CVector3(0, -bb, -aa * bb); fractal.genFoldBox.Nv_dodeca[4] = CVector3(bb, aa * bb, 0); fractal.genFoldBox.Nv_dodeca[5] = CVector3(bb, -aa * bb, 0); fractal.genFoldBox.Nv_dodeca[6] = CVector3(-bb, aa * bb, 0); fractal.genFoldBox.Nv_dodeca[7] = CVector3(-bb, -aa * bb, 0); fractal.genFoldBox.Nv_dodeca[8] = CVector3(aa * bb, 0, bb); fractal.genFoldBox.Nv_dodeca[9] = CVector3(-aa * bb, 0, bb); fractal.genFoldBox.Nv_dodeca[10] = CVector3(aa * bb, 0, -bb); fractal.genFoldBox.Nv_dodeca[11] = CVector3(-aa * bb, 0, -bb); fractal.genFoldBox.sides_dodeca = 12; double ff = sqrt(aa*aa+1.0/(aa*aa)); double cc = aa/ff; double dd = 1.0/aa/ff; fractal.genFoldBox.Nv_icosa[0] = CVector3( sqrt_i3, sqrt_i3, -sqrt_i3); fractal.genFoldBox.Nv_icosa[1] = CVector3( sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_icosa[2] = CVector3( -sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_icosa[3] = CVector3( -sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_icosa[4] = CVector3( sqrt_i3, sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_icosa[5] = CVector3( -sqrt_i3,-sqrt_i3, sqrt_i3); fractal.genFoldBox.Nv_icosa[6] = CVector3( -sqrt_i3, sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_icosa[7] = CVector3( sqrt_i3,-sqrt_i3,-sqrt_i3); fractal.genFoldBox.Nv_icosa[8] = CVector3( 0, dd, cc); fractal.genFoldBox.Nv_icosa[9] = CVector3( 0, dd,-cc); fractal.genFoldBox.Nv_icosa[10] = CVector3( 0,-dd, cc); fractal.genFoldBox.Nv_icosa[11] = CVector3( 0,-dd,-cc); fractal.genFoldBox.Nv_icosa[12] = CVector3( cc, 0, dd); fractal.genFoldBox.Nv_icosa[13] = CVector3( cc, 0,-dd); fractal.genFoldBox.Nv_icosa[14] = CVector3( -cc, 0, dd); fractal.genFoldBox.Nv_icosa[15] = CVector3( -cc, 0,-dd); fractal.genFoldBox.Nv_icosa[16] = CVector3( dd, cc, 0); fractal.genFoldBox.Nv_icosa[17] = CVector3( dd,-cc, 0); fractal.genFoldBox.Nv_icosa[18] = CVector3( -dd, cc, 0); fractal.genFoldBox.Nv_icosa[19] = CVector3( -dd,-cc, 0); fractal.genFoldBox.sides_icosa = 20; double tha = 3.14159*2.0/6.0; fractal.genFoldBox.Nv_box6[0] = CVector3(0, 0, 1); fractal.genFoldBox.Nv_box6[1] = CVector3(0, 0, -1); fractal.genFoldBox.Nv_box6[2] = CVector3(cos(tha * 0), sin(tha * 0), 0); fractal.genFoldBox.Nv_box6[3] = CVector3(cos(tha * 1), sin(tha * 1), 0); fractal.genFoldBox.Nv_box6[4] = CVector3(cos(tha * 2), sin(tha * 2), 0); fractal.genFoldBox.Nv_box6[5] = CVector3(cos(tha * 3), sin(tha * 3), 0); fractal.genFoldBox.Nv_box6[6] = CVector3(cos(tha * 4), sin(tha * 4), 0); fractal.genFoldBox.Nv_box6[7] = CVector3(cos(tha * 5), sin(tha * 5), 0); fractal.genFoldBox.sides_box6 = 8; double tha5 = 3.14159*2.0/5.0; fractal.genFoldBox.Nv_box5[0] = CVector3(0, 0, 1); fractal.genFoldBox.Nv_box5[1] = CVector3(0, 0, -1); fractal.genFoldBox.Nv_box5[2] = CVector3(cos(tha5 * 0), sin(tha5 * 0), 0); fractal.genFoldBox.Nv_box5[3] = CVector3(cos(tha5 * 1), sin(tha5 * 1), 0); fractal.genFoldBox.Nv_box5[4] = CVector3(cos(tha5 * 2), sin(tha5 * 2), 0); fractal.genFoldBox.Nv_box5[5] = CVector3(cos(tha5 * 3), sin(tha5 * 3), 0); fractal.genFoldBox.Nv_box5[6] = CVector3(cos(tha5 * 4), sin(tha5 * 4), 0); fractal.genFoldBox.sides_box5 = 7; } void CreateFormulaSequence(sFractal &fractal) { fractal.formulaSequence.resize(fractal.doubles.N); fractal.hybridPowerSequence.resize(fractal.doubles.N); int number = 0; while (number < (int)fractal.doubles.N) { for (int hybrid_n = 0; hybrid_n < HYBRID_COUNT - 1; ++hybrid_n) { if (fractal.hybridFormula[hybrid_n] == none) continue; for (int i = 0; i < fractal.hybridIters[hybrid_n]; ++i) { if (number < fractal.doubles.N) { fractal.formulaSequence[number] = fractal.hybridFormula[hybrid_n]; fractal.hybridPowerSequence[number] = fractal.doubles.hybridPower[hybrid_n]; } number++; } } int temp_end = (int)fractal.doubles.N; if (fractal.hybridCyclic) temp_end = fractal.hybridIters[HYBRID_COUNT - 1]; if (fractal.hybridFormula[HYBRID_COUNT - 1] != none) for (int i = 0; i < temp_end; i++) { if (number < (int)fractal.doubles.N) { fractal.formulaSequence[number] = fractal.hybridFormula[HYBRID_COUNT - 1]; fractal.hybridPowerSequence[number] = fractal.doubles.hybridPower[HYBRID_COUNT - 1]; } number++; } if (!fractal.hybridCyclic) break; } } void PressedIFSNormalizeOffset(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); params.fractal.IFS.doubles.offset.Normalize(); WriteInterface(¶ms); } void PressedIFSNormalizeVectors(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); for (int i = 0; i < IFS_VECTOR_COUNT; i++) { params.fractal.IFS.doubles.direction[i].Normalize(); } WriteInterface(¶ms); } void PressedRecordKeyframe(GtkWidget *widget, gpointer data) { string filename2; int index = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); filename2=IndexFilename(Interface_data.file_keyframes, "fract", index); sParamRender fractParamToSave; ReadInterface(&fractParamToSave); SaveSettings(filename2.c_str(), fractParamToSave, true); last_keyframe_position = fractParamToSave.doubles.vp; timeline->RecordKeyframe(index, filename2.c_str(), false); gtk_widget_queue_draw(timelineInterface.table); index++; gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); //loading next keyframe if exists filename2=IndexFilename(Interface_data.file_keyframes, "fract", index); if (FileIfExists(filename2.c_str())) { sParamRender fractParamLoaded; LoadSettings(filename2.c_str(), fractParamLoaded, true); KeepOtherSettings(&fractParamLoaded); WriteInterface(&fractParamLoaded); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } timeline->UpdateGlobalMorph(); sParamRender params; ReadInterface(¶ms); char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } void PressedInsertKeyframe(GtkWidget *widget, gpointer data) { string filename1,filename2; int index = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))) + 1; int maxIndex = timeline->CheckNumberOfKeyframes(Interface_data.file_keyframes) - 1; printf("Maxindex = %d\n", maxIndex); if (index > maxIndex) index = maxIndex + 1; for (int i = maxIndex; i >= index; i--) { filename1=IndexFilename(Interface_data.file_keyframes, "fract", i); filename2=IndexFilename(Interface_data.file_keyframes, "fract", i + 1); rename(filename1.c_str(), filename2.c_str()); } filename2=IndexFilename(Interface_data.file_keyframes, "fract", index); sParamRender fractParamToSave; ReadInterface(&fractParamToSave); SaveSettings(filename2.c_str(), fractParamToSave, true); last_keyframe_position = fractParamToSave.doubles.vp; timeline->RecordKeyframe(index, filename2.c_str(), true); gtk_widget_queue_draw(timelineInterface.table); index++; gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); //loading next keyframe if exists filename2=IndexFilename(Interface_data.file_keyframes, "fract", index); if (FileIfExists(filename2.c_str())) { sParamRender fractParamLoaded; LoadSettings(filename2.c_str(), fractParamLoaded, true); KeepOtherSettings(&fractParamLoaded); WriteInterface(&fractParamLoaded); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } timeline->UpdateGlobalMorph(); sParamRender params; ReadInterface(¶ms); char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } void PressedKeyframeAnimationRender(GtkWidget *widget, gpointer data) { if (!isRendering) { if (clSupport->IsEnabled()) { Interface_data.animMode = true; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = true; programClosed = false; gdk_threads_enter(); MainRender(); gdk_threads_leave(); } else { Interface_data.animMode = true; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = true; MainRender(); } } } void PressedNextKeyframe(GtkWidget *widget, gpointer data) { int index = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); index++; gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); string filename2; filename2=IndexFilename(Interface_data.file_keyframes, "fract", index); if (FileIfExists(filename2.c_str())) { sParamRender fractParamLoaded; LoadSettings(filename2.c_str(), fractParamLoaded, true); KeepOtherSettings(&fractParamLoaded); WriteInterface(&fractParamLoaded); last_keyframe_position = fractParamLoaded.doubles.vp; gtk_widget_queue_draw(timelineInterface.table); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } else { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error! Keyframe does not exist: %s", filename2.c_str()); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); index--; gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); } sParamRender params; ReadInterface(¶ms); char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } void PressedPreviousKeyframe(GtkWidget *widget, gpointer data) { int index = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); index--; gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); string filename2=IndexFilename(Interface_data.file_keyframes, "fract", index); if (FileIfExists(filename2.c_str())) { sParamRender fractParamLoaded; LoadSettings(filename2.c_str(), fractParamLoaded, true); KeepOtherSettings(&fractParamLoaded); last_keyframe_position = fractParamLoaded.doubles.vp; WriteInterface(&fractParamLoaded); gtk_widget_queue_draw(timelineInterface.table); Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } else { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CANCEL, "Error! Keyframe does not exist: %s", filename2.c_str()); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); index++; gtk_entry_set_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber), IntToString(index)); } sParamRender params; ReadInterface(¶ms); char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } void PressedTimelineRefresh(GtkWidget *widget, gpointer data) { timeline->Refresh(); } void PressedUndo(GtkWidget *widget, gpointer data) { sParamRender undoParams; if (undoBuffer.GetUndo(&undoParams)) { WriteInterface(&undoParams); } Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } void PressedRedo(GtkWidget *widget, gpointer data) { sParamRender undoParams; if (undoBuffer.GetRedo(&undoParams)) { WriteInterface(&undoParams); } Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } void PressedBuddhabrot(GtkWidget *widget, gpointer data) { /* if (!isRendering) { CompileImage(); sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); RenderBuddhabrot(¶ms); } */ } void PressedSelectDestination(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Select destination for image sequence...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "images"); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "image"); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("filename: %s\n", filename); sDialogFiles *dialogFiles = (sDialogFiles*) data; gtk_entry_set_text(GTK_ENTRY(dialogFiles->edit_destination), filename); } gtk_widget_destroy(dialog); } void PressedSelectBackground(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Select background image...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); GtkWidget *preview; preview = gtk_drawing_area_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_widget_set_size_request(preview, 256, 256); g_signal_connect(dialog, "update-preview", G_CALLBACK(UpdatePreviewImageDialog), preview); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), Interface_data.file_background); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("filename: %s\n", filename); sDialogFiles *dialogFiles = (sDialogFiles*) data; gtk_entry_set_text(GTK_ENTRY(dialogFiles->edit_background), filename); } gtk_widget_destroy(dialog); } void PressedSelectEnvmap(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Select environment map image...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); GtkWidget *preview; preview = gtk_drawing_area_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_widget_set_size_request(preview, 256, 256); g_signal_connect(dialog, "update-preview", G_CALLBACK(UpdatePreviewImageDialog), preview); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), Interface_data.file_envmap); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("filename: %s\n", filename); sDialogFiles *dialogFiles = (sDialogFiles*) data; gtk_entry_set_text(GTK_ENTRY(dialogFiles->edit_envmap), filename); } gtk_widget_destroy(dialog); } void PressedSelectLightmap(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Select image with light map for ambient occlusion...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); GtkWidget *preview; preview = gtk_drawing_area_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_widget_set_size_request(preview, 256, 256); g_signal_connect(dialog, "update-preview", G_CALLBACK(UpdatePreviewImageDialog), preview); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), Interface_data.file_lightmap); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("filename: %s\n", filename); sDialogFiles *dialogFiles = (sDialogFiles*) data; gtk_entry_set_text(GTK_ENTRY(dialogFiles->edit_lightmap), filename); } gtk_widget_destroy(dialog); } void PressedSelectFlightPath(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Select file with flight path...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "paths"); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "path.txt"); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("filename: %s\n", filename); sDialogFiles *dialogFiles = (sDialogFiles*) data; gtk_entry_set_text(GTK_ENTRY(dialogFiles->edit_path), filename); } gtk_widget_destroy(dialog); } void PressedSelectKeyframes(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Select first file with key-frame sequence...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "keyframes"); gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog), "keyframe"); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); if (FileIfExists(filename)) { filename[strlen(filename) - 11] = 0; } printf("filename: %s\n", filename); sDialogFiles *dialogFiles = (sDialogFiles*) data; gtk_entry_set_text(GTK_ENTRY(dialogFiles->edit_keyframes), filename); } gtk_widget_destroy(dialog); } void ChangedSliderPaletteOffset(GtkWidget *widget, gpointer data) { if (!interfaceCreated) return; sImageAdjustments *adj = mainImage.GetImageAdjustments(); adj->paletteOffset = gtk_adjustment_get_value(GTK_ADJUSTMENT(Interface.adjustmentPaletteOffset)); //srand(Interface_data.coloring_seed); //NowaPaleta(paleta, 1.0); DrawPalette(Interface_data.palette); //imageCompileNeeded = true; //refreshNeeded = true; } void PressedRandomPalette(GtkWidget *widget, gpointer data) { //srand(clock()); srand((unsigned int) ((double) clock() * 1000.0 / CLOCKS_PER_SEC)); int coloring_seed = Random(999999); gtk_entry_set_text(GTK_ENTRY(Interface.edit_color_seed), IntToString(coloring_seed)); srand(coloring_seed); double saturation = atof(gtk_entry_get_text(GTK_ENTRY(Interface.edit_colour_saturation))); NewPalette(Interface_data.palette, saturation); DrawPalette(Interface_data.palette); if (!isRendering && !Interface_data.disableInitRefresh) { mainImage.CompileImage(); mainImage.ConvertTo8bit(); mainImage.UpdatePreview(); mainImage.RedrawInWidget(renderWindow.drawingArea); while (gtk_events_pending()) gtk_main_iteration(); } } void PressedGetPaletteFromImage(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Please select image to grab colour palette...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); GtkWidget *preview; preview = gtk_drawing_area_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_widget_set_size_request(preview, 256, 256); g_signal_connect(dialog, "update-preview", G_CALLBACK(UpdatePreviewImageDialog), preview); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenamePalette); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("filename: %s\n", filename); cTexture paletteImage(filename); sRGB palette[256]; if (paletteImage.IsLoaded()) { int width = paletteImage.Width(); int height = paletteImage.Height(); for (int i = 0; i < 256; i++) { double angle = i / 256.0 * M_PI * 2.0; double x = width / 2 + cos(angle) * width * 0.4; double y = height / 2 + sin(angle) * height * 0.4; sRGB8 pixel = paletteImage.Pixel(x, y); palette[i].R = pixel.R; palette[i].G = pixel.G; palette[i].B = pixel.B; } DrawPalette(palette); memcpy(Interface_data.palette, palette, sizeof(sRGB)*256); } strcpy(lastFilenamePalette, filename); } gtk_widget_destroy(dialog); } void PressedTimeline(GtkWidget *widget, gpointer data) { if (!timeLineWindow) { timeLineWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(timeLineWindow), "Timeline"); gtk_widget_set_size_request(timeLineWindow, 4 * (128 + 2) + 4, 230); gtk_widget_show(timeLineWindow); g_signal_connect(G_OBJECT(timeLineWindow), "destroy", G_CALLBACK(DeleteTimelineWindow), &timeLineWindow); if (timeline->IsCreated()) { timeline->RebulidTimelineWindow(); } else { timeline->Initialize(Interface_data.file_keyframes); } timeline->UpdateGlobalMorph(); } else { gtk_window_present(GTK_WINDOW(timeLineWindow)); } } void DeleteTimelineWindow(GtkWidget *widget, gpointer widget_pointer) { gtk_widget_destroyed(widget, (GtkWidget**) widget_pointer); timeline->isOpened = false; } void PressedDeleteKeyframe(GtkWidget *widget, gpointer widget_pointer) { int index = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->DeleteKeyframe(index, Interface_data.file_keyframes); timeline->UpdateGlobalMorph(); sParamRender params; ReadInterface(¶ms); char distanceString[1000]; double actDistance = CalculateDistance(params.doubles.vp, params.fractal); double key_distance = 0.0; if (timeline->isOpened) { sParamRenderD paramsD; int keyframe = atoi(gtk_entry_get_text(GTK_ENTRY(timelineInterface.editAnimationKeyNumber))); timeline->GetFrameParamsInterpolated((keyframe - 1) * 100, 100, ¶msD); key_distance = (params.doubles.vp - paramsD.vp).Length(); } sprintf(distanceString, "Estimated viewpoint distance to the surface: %g\nDistance from last keyframe: %g", actDistance, key_distance); gtk_label_set_text(GTK_LABEL(Interface.label_NavigatorEstimatedDistance), distanceString); } void UpdatePreviewSettingsDialog(GtkFileChooser *file_chooser, gpointer data) { GtkWidget *preview; preview = GTK_WIDGET(data); GtkWidget *checkBox = gtk_file_chooser_get_extra_widget(file_chooser); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkBox))) { const char *filename = gtk_file_chooser_get_preview_filename(file_chooser); char string[13]; FILE *fileSettings = fopen(filename, "r"); if (fileSettings) { fgets(string, 13, fileSettings); //printf("%s*\n", string); if (!strcmp(string, "Mandelbulber") || !strcmp(string, "locale_test ")) { smart_ptr thumbnail; thumbnail.reset(new cImage(128, 128)); ThumbnailRender(filename, thumbnail.ptr(), 0); thumbnail->CreatePreview(1.0); thumbnail->ConvertTo8bit(); thumbnail->UpdatePreview(); thumbnail->RedrawInWidget(preview); gtk_file_chooser_set_preview_widget_active(file_chooser, true); } fclose(fileSettings); } } } void UpdatePreviewImageDialog(GtkFileChooser *file_chooser, gpointer data) { GtkWidget *preview; preview = GTK_WIDGET(data); int size = 256; const char *filename = gtk_file_chooser_get_preview_filename(file_chooser); if (FileIfExists(filename)) { cTexture *image = new cTexture(filename); if (image->IsLoaded()) { int iw = image->Width(); int ih = image->Height(); double scale; if (iw > ih) { scale = (double)iw / size; } else { scale = (double)ih / size; } sRGB8 *smallImage = new sRGB8[size * size]; memset(smallImage, 0, sizeof(sRGB8) * size * size); for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { double x2 = (x - size / 2) * scale + iw / 2.0; double y2 = (y - size / 2) * scale + ih / 2.0; sRGB8 pixel = image->Pixel(x2, y2); smallImage[x + y * size] = pixel; } } gdk_draw_rgb_image(preview->window, preview->style->fg_gc[GTK_STATE_NORMAL], 0, 0, size, size, GDK_RGB_DITHER_MAX, (guchar*) smallImage, size * 3); delete[] smallImage; } delete image; } } void PressedIFSDefaultDodeca(GtkWidget *widget, gpointer widget_pointer) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); double phi = (1 + sqrt(5.0))/2.0; params.fractal.IFS.doubles.direction[0].x = phi*phi; params.fractal.IFS.doubles.direction[0].y = 1.0; params.fractal.IFS.doubles.direction[0].z = -phi; params.fractal.IFS.doubles.direction[1].x = -phi; params.fractal.IFS.doubles.direction[1].y = phi*phi; params.fractal.IFS.doubles.direction[1].z = 1.0; params.fractal.IFS.doubles.direction[2].x = 1.0; params.fractal.IFS.doubles.direction[2].y = -phi; params.fractal.IFS.doubles.direction[2].z = phi*phi; params.fractal.IFS.enabled[0] = true; params.fractal.IFS.enabled[1] = true; params.fractal.IFS.enabled[2] = true; params.fractal.IFS.doubles.offset.x = 1.0; params.fractal.IFS.doubles.offset.y = 1.0; params.fractal.IFS.doubles.offset.z = 1.0; params.fractal.IFS.absX = true; params.fractal.IFS.absY = true; params.fractal.IFS.absZ = true; params.fractal.IFS.doubles.scale = phi*phi; params.fractal.IFS.mengerSpongeMode = false; WriteInterface(¶ms); } void PressedIFSDefaultIcosa(GtkWidget *widget, gpointer widget_pointer) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); double phi = (1 + sqrt(5.0))/2.0; params.fractal.IFS.doubles.direction[3].x = -phi*phi; params.fractal.IFS.doubles.direction[3].y = 1.0; params.fractal.IFS.doubles.direction[3].z = phi; params.fractal.IFS.doubles.direction[4].x = phi; params.fractal.IFS.doubles.direction[4].y = -phi*phi; params.fractal.IFS.doubles.direction[4].z = 1.0; params.fractal.IFS.enabled[3] = true; params.fractal.IFS.enabled[4] = true; params.fractal.IFS.doubles.offset.x = 1.0; params.fractal.IFS.doubles.offset.y = 0; params.fractal.IFS.doubles.offset.z = phi; params.fractal.IFS.absX = true; params.fractal.IFS.absY = true; params.fractal.IFS.absZ = true; params.fractal.IFS.doubles.scale = 2.0; params.fractal.IFS.mengerSpongeMode = false; WriteInterface(¶ms); } void PressedIFSDefaultOcta(GtkWidget *widget, gpointer widget_pointer) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); params.fractal.IFS.doubles.direction[5].x = 1.0; params.fractal.IFS.doubles.direction[5].y = -1.0; params.fractal.IFS.doubles.direction[5].z = 0; params.fractal.IFS.doubles.direction[6].x = 1.0; params.fractal.IFS.doubles.direction[6].y = 0; params.fractal.IFS.doubles.direction[6].z = -1.0; params.fractal.IFS.doubles.direction[7].x = 0; params.fractal.IFS.doubles.direction[7].y = 1.0; params.fractal.IFS.doubles.direction[7].z = -1.0; params.fractal.IFS.enabled[5] = true; params.fractal.IFS.enabled[6] = true; params.fractal.IFS.enabled[7] = true; params.fractal.IFS.doubles.offset.x = 1.0; params.fractal.IFS.doubles.offset.y = 0.0; params.fractal.IFS.doubles.offset.z = 0.0; params.fractal.IFS.absX = true; params.fractal.IFS.absY = true; params.fractal.IFS.absZ = true; params.fractal.IFS.doubles.scale = 2.0; params.fractal.IFS.mengerSpongeMode = false; WriteInterface(¶ms); } void PressedIFSDefaultMengerSponge(GtkWidget *widget, gpointer widget_pointer) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); params.fractal.IFS.doubles.direction[5].x = 1.0; params.fractal.IFS.doubles.direction[5].y = -1.0; params.fractal.IFS.doubles.direction[5].z = 0; params.fractal.IFS.doubles.direction[6].x = 1.0; params.fractal.IFS.doubles.direction[6].y = 0; params.fractal.IFS.doubles.direction[6].z = -1.0; params.fractal.IFS.doubles.direction[7].x = 0; params.fractal.IFS.doubles.direction[7].y = 1.0; params.fractal.IFS.doubles.direction[7].z = -1.0; params.fractal.IFS.enabled[5] = true; params.fractal.IFS.enabled[6] = true; params.fractal.IFS.enabled[7] = true; params.fractal.IFS.doubles.offset.x = 1.0; params.fractal.IFS.doubles.offset.y = 1.0; params.fractal.IFS.doubles.offset.z = 1.0; params.fractal.IFS.absX = true; params.fractal.IFS.absY = true; params.fractal.IFS.absZ = true; params.fractal.IFS.doubles.scale = 3.0; params.fractal.IFS.mengerSpongeMode = true; WriteInterface(¶ms); } void PressedIFSReset(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); for(int i=0; i<=8; i++) { params.fractal.IFS.doubles.direction[i].x = 1.0; params.fractal.IFS.doubles.direction[i].y = 0; params.fractal.IFS.doubles.direction[i].z = 0; params.fractal.IFS.enabled[i] = false; params.fractal.IFS.doubles.distance[i] = 0; params.fractal.IFS.doubles.alfa[i] = 0; params.fractal.IFS.doubles.beta[i] = 0; params.fractal.IFS.doubles.gamma[i] = 0; params.fractal.IFS.doubles.intensity[i] = 1; } params.fractal.IFS.absX = false; params.fractal.IFS.absY = false; params.fractal.IFS.absZ = false; params.fractal.IFS.mengerSpongeMode = false; WriteInterface(¶ms); } double ScanFractal(sParamRender *params, CVector3 direction) { double result = 0; double distStep; sFractal calcParams = params->fractal; for (double scan = 100.0; scan > 0; scan -= distStep) { CVector3 point = direction * scan; double dist = CalculateDistance(point, calcParams); if (dist < params->doubles.resolution / params->doubles.quality) { result = scan; return result; } distStep = dist * 0.1; if(distStep>1) distStep = 1.0; } return 0.0; } double ScanSizeOfFractal(sParamRender *params) { double maxDist = 0.0; double dist; for(int i=0; i<100; i++) { CVector3 direction(Random(1000)/500.0-1.0, Random(1000)/500.0-1.0, Random(1000)/500.0-1.0); direction.Normalize(); dist = ScanFractal(params, direction); maxDist = (dist > maxDist) ? dist : maxDist; } return maxDist; } void PressedAutoDEStep(GtkWidget *widget, gpointer widget_pointer) { AutoDEStep(false); } void PressedAutoDEStepHQ(GtkWidget *widget, gpointer widget_pointer) { AutoDEStep(true); } void AutoDEStep(bool highQuality) { char progressText[1000]; sParamRender fractParams; ReadInterface(&fractParams); smart_ptr testImage; testImage.reset(new cImage(64, 64)); fractParams.doubles.quality = fractParams.doubles.quality * fractParams.image_width / 64.0; fractParams.shadow = false; fractParams.auxLightNumber = 0; fractParams.global_ilumination = false; fractParams.SSAOEnabled = false; fractParams.DOFEnabled = false; for(int i = 0; i<4; i++) fractParams.auxLightPreEnabled[i] = false; fractParams.fractal.iterThresh = false; for(int i=0; i<5; i++) fractParams.volumetricLightEnabled[i] = false; fractParams.imageSwitches.raytracedReflections = false; if (fractParams.fractal.doubles.N < 200) fractParams.fractal.doubles.N = 200; if (fractParams.fractal.limits_enabled) return; int scanCount = 0; double DEfactor = 1.0; double step = 1.0; double limit = 1.0; if(highQuality) limit = 0.01; programClosed = false; for (int i = 0; i < 100; i++) { scanCount++; fractParams.doubles.DE_factor = DEfactor; ThumbnailRender2(fractParams, testImage.ptr()); double avgMissedDE = (double) Missed_DE_counter / Pixel_counter * 100.0; printf("DE factor = %f, Missed DE = %f%%\n", DEfactor, avgMissedDE); if (avgMissedDE < limit) { if (scanCount == 1) { if (step < 10000) { DEfactor = DEfactor * 10.0; step = step * 10.0; scanCount = 0; continue; } else { return; } } else { if (step < 0.05 * DEfactor) break; DEfactor += step; } } step /= 2.0; DEfactor -= step; DrawHistogram(); DrawHistogram2(); while (gtk_events_pending()) gtk_main_iteration(); sprintf(progressText, "Scanning for the best DE factor: DE factor = %f, Missed DE = %f%%", DEfactor, avgMissedDE); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); double progress; if(highQuality) { progress = 1.0 - (log10(avgMissedDE + (step / DEfactor)/10.0) + 3.0) / 5.0; } else { progress = 1.0 - (log10(avgMissedDE + (step / DEfactor)/1.0) + 2.0) / 4.0; } printf("progress = %f, log = %f\n", progress, log10(avgMissedDE + (step / DEfactor))); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), progress); if (programClosed) break; } sprintf(progressText, "Optimal DE factor found: DE factor = %f", DEfactor); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(Interface.progressBar), progressText); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(Interface.progressBar), 1.0); ReadInterface(&fractParams); fractParams.doubles.DE_factor = DEfactor; WriteInterface(&fractParams); } void ChangedConstantDEThreshold(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkConstantDEThreshold))) { gtk_label_set_text(GTK_LABEL(Interface.label_DE_threshold),"DE threshold:"); } else { gtk_label_set_text(GTK_LABEL(Interface.label_DE_threshold),"Detail level:"); } } void ChangedImageProportion(GtkWidget *widget, gpointer data) { int selection = gtk_combo_box_get_active(GTK_COMBO_BOX(Interface.comboImageProportion)); if (selection > 0) { gtk_widget_set_sensitive(Interface.edit_imageWidth, false); int imageHeight = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_imageHeight))); if(selection == 1) gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageWidth), IntToString(imageHeight)); else if(selection == 2) gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageWidth), IntToString(imageHeight*5/4)); else if(selection == 3) gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageWidth), IntToString(imageHeight*4/3)); else if(selection == 4) gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageWidth), IntToString(imageHeight*16/10)); else if(selection == 5) gtk_entry_set_text(GTK_ENTRY(Interface.edit_imageWidth), IntToString(imageHeight*16/9)); } else { gtk_widget_set_sensitive(Interface.edit_imageWidth, true); } } void PressedCopyToClipboard(GtkWidget *widget, gpointer data) { sParamRender fractParamToSave; ReadInterface(&fractParamToSave); SaveSettings("settings/.clipboard", fractParamToSave, true); FILE * pFile; pFile = fopen("settings/.clipboard", "rb"); if (pFile != NULL) { // obtain file size: fseek(pFile, 0, SEEK_END); unsigned int lSize = ftell(pFile); rewind(pFile); char *buffer = new char[lSize]; // copy the file into the buffer: size_t result = fread(buffer, 1, lSize, pFile); if (result != lSize) { printf("Reading error of clipboard temporary file"); fclose(pFile); delete [] buffer; return; } gtk_clipboard_set_text(clipboard, buffer, lSize); fclose(pFile); delete [] buffer; remove("settings/.clipboard"); } } void PressedPasteFromClipboard(GtkWidget *widget, gpointer data) { char *buffer = gtk_clipboard_wait_for_text(clipboard); unsigned int len = strlen(buffer); if (len < 15) { printf("text in clipboard is to short\n"); GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Error! Text in clipboard is too short"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } if(strncmp(buffer, "Mandelbulber", 12)) { printf("text in clipboard doesn't contain settings for Mandelbulber\n"); GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Error! Text in clipboard doesn't contain settings for Mandelbulber\n"); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return; } FILE * pFile; pFile = fopen("settings/.clipboard", "wb"); if (pFile != NULL) { fwrite(buffer, 1, len, pFile); fclose(pFile); sParamRender fractParamLoaded; LoadSettings("settings/.clipboard", fractParamLoaded); Params2InterfaceData(&fractParamLoaded); WriteInterface(&fractParamLoaded); delete buffer; remove("settings/.clipboard"); } } void PressedLoadExample(GtkWidget *widget, gpointer data) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Load fractal settings", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); GtkWidget *preview; GtkWidget *checkBox = gtk_check_button_new_with_label("Render preview of settings file"); preview = gtk_drawing_area_new(); gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(dialog), preview); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), checkBox); gtk_widget_set_size_request(preview, 128, 128); g_signal_connect(dialog, "update-preview", G_CALLBACK(UpdatePreviewSettingsDialog), preview); string exampleFile = string(sharedDir) + "examples/default.fract"; gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), exampleFile.c_str()); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); sParamRender fractParamLoaded; LoadSettings(filename, fractParamLoaded); Params2InterfaceData(&fractParamLoaded); WriteInterface(&fractParamLoaded); string file = string(filename); int length = file.length(); #ifdef WIN32 int start = file.rfind("\\"); #else int start = file.rfind("/"); #endif string onlyFile(file, start+1, length); string fileWithPath = "settings/" + onlyFile; strcpy(lastFilenameSettings, fileWithPath.c_str()); string windowTitle = string("Mandelbulber (") + fileWithPath.c_str() + ")"; gtk_window_set_title(GTK_WINDOW(window_interface), windowTitle.c_str()); timeline->Reset(); } gtk_widget_destroy(dialog); } void PressedAutoFog(GtkWidget *widget, gpointer data) { sParamRender params; ReadInterface(¶ms); undoBuffer.SaveUndo(¶ms); double distance = CalculateDistance(params.doubles.vp, params.fractal); double distance2 = distance + 1.0/params.doubles.persp*params.doubles.zoom; params.doubles.fogDensity = 0.5; params.doubles.fogDistanceFactor = distance2; params.doubles.fogColour1Distance = distance2*0.5; params.doubles.fogColour2Distance = distance2; WriteInterface(¶ms); } void PressedMeasureActivation(GtkWidget *widget, gpointer data) { gtk_combo_box_set_active(GTK_COMBO_BOX(renderWindow.comboMouseClickMode), 11); } void ChangedOpenClEnabled(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkOpenClEnable))) { clSupport->SetSize(atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_imageWidth))), atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_imageHeight)))); clSupport->InitDevice(); clSupport->InitFractal(); if(clSupport->IsReady()) { clSupport->SSAOPrepare(); clSupport->DOFPrepare(); } clSupport->Enable(); } else { clSupport->Disable(); } #endif } void ChangedOpenClCustomEnable(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { gtk_widget_set_sensitive(Interface.tab_box_mandelbox, true); gtk_widget_set_sensitive(Interface.tab_box_IFS, true); gtk_widget_set_sensitive(Interface.edit_power, true); gtk_widget_set_sensitive(Interface.edit_cadd, true); gtk_widget_set_sensitive(Interface.tab_box_hybrid, false); gtk_widget_set_sensitive(Interface.edit_mandelboxSharpness, false); gtk_widget_set_sensitive(Interface.comboGeneralizedFoldBoxType, false); gtk_widget_set_sensitive(Interface.edit_mandelboxSolid, false); gtk_widget_set_sensitive(Interface.edit_mandelboxMelt, false); gtk_widget_set_sensitive(Interface.comboFractType, false); } else { ChangedComboFormula(Interface.comboFractType, NULL); } } void ChangedComboOpenCLCustomFormulas(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if(clSupport->customFormulas) { clSupport->customFormulas->SetActual(gtk_combo_box_get_active(GTK_COMBO_BOX(widget))); } #endif } void ChangedIterFogEnable(GtkWidget *widget, gpointer data) { bool active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkIterFogEnable)); gtk_widget_set_sensitive(Interface.edit_iterFogOpacity, active); gtk_widget_set_sensitive(Interface.edit_iterFogOpacityTrim, active); } void PressedSaveAllImageLayers(GtkWidget *widget, gpointer data) { /* GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new("Save all layers image as...", GTK_WINDOW(window_interface), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(dialog), TRUE); gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), lastFilenameImage); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { const char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); SaveAllImageLayers(filename, &mainImage); strcpy(lastFilenameImage, filename); } gtk_widget_destroy(dialog); */ } void PressedServerEnable(GtkWidget *widget, gpointer data) { if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNetRenderServerEnable))) { char status[1000]; bool result = netRender->SetServer((char*)gtk_entry_get_text(GTK_ENTRY(Interface.edit_netRenderServerPort)), status); gtk_label_set_text(GTK_LABEL(Interface.label_serverStatus),status); if(result) { gtk_widget_set_sensitive(Interface.checkNetRenderServerScan, true); } } else { netRender->DeleteServer(); gtk_label_set_text(GTK_LABEL(Interface.label_serverStatus),"status: not enabled"); gtk_widget_set_sensitive(Interface.checkNetRenderServerScan, false); } } void PressedClientEnable(GtkWidget *widget, gpointer data) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNetRenderClientEnable) )) { char status[1000]; bool result = netRender->SetClient((char*) gtk_entry_get_text(GTK_ENTRY(Interface.edit_netRenderClientPort) ), (char*) gtk_entry_get_text(GTK_ENTRY(Interface.edit_netRenderClientName) ), status); gtk_label_set_text(GTK_LABEL(Interface.label_clientStatus), status); if (result) { while (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNetRenderClientEnable) )) { while (gtk_events_pending()) gtk_main_iteration(); if(!isRendering && !renderRequest) { char command[4]; size_t size = netRender->receiveDataFromServer(command); if (!strcmp(command, "set")) { char *buffer = new char[size]; netRender->GetData(buffer); GetSettingsfromServer(buffer, size); while (gtk_events_pending()) gtk_main_iteration(); delete[] buffer; } if (!strcmp(command, "run")) { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } } } } } else { netRender->DeleteClient(); gtk_label_set_text(GTK_LABEL(Interface.label_clientStatus),"status: not enabled"); } } void NoGUIClientEnable(void) { char status[1000]; bool result = false; while(!result) { g_usleep(1000000); result = netRender->SetClient(noGUIdata.netRenderPortString, noGUIdata.netRenderIPString, status); printf("NetRender status: %s\n", status); } if (result) { g_timeout_add (100,(GSourceFunc)CallerTimerLoop,NULL); while (true) { while (gtk_events_pending()) gtk_main_iteration(); if (!isRendering && !renderRequest) { char command[4]; size_t size = netRender->receiveDataFromServer(command); if (!strcmp(command, "set")) { char *buffer = new char[size]; netRender->GetData(buffer); GetSettingsfromServer(buffer, size); delete[] buffer; } if (!strcmp(command, "run")) { Interface_data.animMode = false; Interface_data.playMode = false; Interface_data.recordMode = false; Interface_data.continueRecord = false; Interface_data.keyframeMode = false; programClosed = true; isPostRendering = false; renderRequest = true; } } } } } void PressedServerScan(GtkWidget *widget, gpointer data) { char status[1000]; if (netRender->IsServer()) { if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNetRenderServerScan))) { gtk_label_set_text(GTK_LABEL(Interface.label_serverStatus), "status: waiting for clients"); while (gtk_events_pending()) gtk_main_iteration(); while (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Interface.checkNetRenderServerScan))) { bool result = netRender->WaitForClient(status); if (result) { gtk_label_set_text(GTK_LABEL(Interface.label_serverStatus), status); } while (gtk_events_pending()) gtk_main_iteration(); } } else { sprintf(status, "status: %d clients connected", netRender->getNoOfClients()); gtk_label_set_text(GTK_LABEL(Interface.label_serverStatus), status); } } } bool SendSettingsToClients(sParamRender fractParamToSend) { printf("Sending settings to clients\n"); SaveSettings("settings/.temp_send", fractParamToSend, true); FILE * pFile; pFile = fopen("settings/.temp_send", "rb"); if (pFile != NULL) { // obtain file size: fseek(pFile, 0, SEEK_END); unsigned int lSize = ftell(pFile); rewind(pFile); char *buffer = new char[lSize]; // copy the file into the buffer: size_t result = fread(buffer, 1, lSize, pFile); if (result != lSize) { printf("Reading error of clipboard temporary file"); fclose(pFile); delete [] buffer; return false; } for(int i=0; igetNoOfClients(); i++) { netRender->sendDataToClient(buffer, lSize, (char*)"set", i, 0); } fclose(pFile); delete [] buffer; remove("settings/.temp_send"); printf("Settings sent\n"); } return true; } bool GetSettingsfromServer(char *data, size_t size) { FILE * pFile; pFile = fopen("settings/.temp_rcv", "wb"); if (pFile != NULL) { fwrite(data, 1, size, pFile); fclose(pFile); sParamRender fractParamLoaded; if(noGUI) { LoadSettings("settings/.temp_rcv", noGUIdata.fractparams); Params2InterfaceData(&noGUIdata.fractparams); } else { LoadSettings("settings/.temp_rcv", fractParamLoaded); Params2InterfaceData(&fractParamLoaded); WriteInterface(&fractParamLoaded); } //remove("settings/.temp_rcv"); } return true; } void PressedOpenCLEditFormula(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if(clSupport->customFormulas) { const char *editor = gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLTextEditor)); std::string fileToEdit; clSupport->customFormulas->GetActual(NULL, &fileToEdit, NULL); #ifdef WIN32 spawnlp(P_NOWAIT, editor, editor, fileToEdit.c_str(), NULL); #else if(!fork()) { execlp(editor, editor, fileToEdit.c_str(), NULL); _exit(0); } #endif } #endif } void PressedOpenCLEditFormulaInit(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if(clSupport->customFormulas) { const char *editor = gtk_entry_get_text(GTK_ENTRY(Interface.edit_OpenCLTextEditor)); std::string fileToEdit; clSupport->customFormulas->GetActual(NULL, NULL, &fileToEdit); #ifdef WIN32 spawnlp(P_NOWAIT, editor, editor, fileToEdit.c_str(), NULL); #else if(!fork()) { execlp(editor, editor, fileToEdit.c_str(), NULL); _exit(0); } #endif } #endif } void PressedOpenCLNewFormula(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if(clSupport->customFormulas) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Enter name of new formula:"); GtkWidget *messageArea = gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(dialog)); GtkWidget *editField = gtk_entry_new(); gtk_box_pack_start(GTK_BOX(messageArea), CreateEdit("newfractal", "name: ", 50, editField), false, false, 1); gtk_widget_show_all(messageArea); gtk_dialog_run(GTK_DIALOG(dialog)); const char *newName = gtk_entry_get_text(GTK_ENTRY(editField)); clSupport->customFormulas->NewFormula(std::string(newName)); gtk_widget_destroy(dialog); } #endif } void PressedOpenCLDeleteFormula(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if(clSupport->customFormulas) { std::string name; clSupport->customFormulas->GetActual(&name, NULL, NULL); std::string text("Do you really want to delete custom formula \""); text += name + "\"?"; GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, text.c_str()); gint result = gtk_dialog_run(GTK_DIALOG(dialog)); if(result == GTK_RESPONSE_YES) { clSupport->customFormulas->DeleteFormula(); } gtk_widget_destroy(dialog); } #endif } void PressedRecompile(GtkWidget *widget, gpointer data) { #ifdef CLSUPPORT if(clSupport->customFormulas) { clSupport->Recompile(); } #endif } void PressedPath2Keyframes(GtkWidget *widget, gpointer data) { GtkWidget *dialog = gtk_message_dialog_new(GTK_WINDOW(window_interface), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, "Are you sure to convert flight path to keyframes?\nThis will overwrite existing keyframes!"); gint result = gtk_dialog_run(GTK_DIALOG(dialog)); if(result == GTK_RESPONSE_YES) { sParamRender fractParam; ReadInterface(&fractParam); FILE *pFile_coordinates = NULL; pFile_coordinates = fopen(Interface_data.file_path, "r"); int framesPerKey = atoi(gtk_entry_get_text(GTK_ENTRY(Interface.edit_animationFramesPerKey))); if (pFile_coordinates) { int n; int index = 0; string filenameKeyframe; double alphaCorrection = 0.0; double betaCorrection = 0.0; double gammaCorrection = 0.0; double alfa_old = 0.0; double beta_old = 0.0; double gamma_old = 0.0; do { n = fscanf(pFile_coordinates, "%lf %lf %lf %lf %lf %lf", &fractParam.doubles.vp.x, &fractParam.doubles.vp.y, &fractParam.doubles.vp.z, &fractParam.doubles.alpha, &fractParam.doubles.beta, &fractParam.doubles.gamma); fractParam.doubles.zoom = 1e-15; if ((alfa_old - fractParam.doubles.alpha) > M_PI) //angle jump over +180° to negative value { alphaCorrection += 2.0 * M_PI; } if ((fractParam.doubles.alpha - alfa_old) > M_PI) //angle jump over -180° to positive value { alphaCorrection -= 2.0 * M_PI; } if ((beta_old - fractParam.doubles.beta) > M_PI) { betaCorrection += 2.0 * M_PI; } if ((fractParam.doubles.beta - beta_old) > M_PI) { betaCorrection -= 2.0 * M_PI; } if ((gamma_old - fractParam.doubles.gamma) > M_PI) { gammaCorrection += 2.0 * M_PI; } if ((fractParam.doubles.gamma - gamma_old) > M_PI) { gammaCorrection -= 2 * M_PI; } alfa_old = fractParam.doubles.alpha; beta_old = fractParam.doubles.beta; gamma_old = fractParam.doubles.gamma; fractParam.doubles.alpha += alphaCorrection; fractParam.doubles.beta += betaCorrection; fractParam.doubles.gamma += gammaCorrection; if(index % framesPerKey == 0) { int keyframeIndex = index / framesPerKey; filenameKeyframe = IndexFilename(Interface_data.file_keyframes, "fract", keyframeIndex); SaveSettings(filenameKeyframe.c_str(), fractParam, true); } if (n <= 0) { fclose(pFile_coordinates); break; } index++; } while (n > 0); printf("Created %d keyframes\n", index / framesPerKey); } } gtk_widget_destroy(dialog); } mandelbulber1.21-1.orig/src/files.cpp0000644000175000017500000005043012274512437020453 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / functions for operating on files, image loading and / saving / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include #define PNG_DEBUG 3 //#include #include "files.h" using namespace std; string logfileName; //***************************** Index filename ************************* //funkcja numerująca pliki //we: filename - nazwa pliku bez rozszerzenia // extension - rozszerzenie // number - numer do dodania //wy: fullname - nazwa pliku z numerem i rozszerzeniem // return - ilość znaków std::string IndexFilename(const char* filename, const char* extension, int number) { char tmp[10]; sprintf(tmp,"%.5i",number); return std::string(filename)+tmp+"."+extension; } METHODDEF(void) my_error_exit(j_common_ptr cinfo) { /* cinfo->err really points to a my_error_mgr struct, so coerce pointer */ my_error_ptr myerr = (my_error_ptr) cinfo->err; /* Always display the message. */ /* We could postpone this until after returning, if we chose. */ (*cinfo->err->output_message)(cinfo); /* Return control to the setjmp point */ longjmp(myerr->setjmp_buffer, 1); } int LoadJPEG(const char *filename, JSAMPLE *image) { struct jpeg_decompress_struct cinfo; struct my_error_mgr jerr; FILE * infile; /* source file */ JSAMPARRAY buffer; /* Output row buffer */ int row_stride; /* physical row width in output buffer */ if ((infile = fopen(filename, "rb")) == NULL) { fprintf(stderr, "can't open %s\n", filename); return 0; } /* Step 1: allocate and initialize JPEG decompression object */ cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); fclose(infile); return 0; } jpeg_create_decompress(&cinfo); /* Step 2: specify data source (eg, a file) */ jpeg_stdio_src(&cinfo, infile); /* Step 3: read file parameters with jpeg_read_header() */ (void) jpeg_read_header(&cinfo, TRUE); /* Step 4: set parameters for decompression */ /* Step 5: Start decompressor */ (void) jpeg_start_decompress(&cinfo); /* JSAMPLEs per row in output buffer */ row_stride = cinfo.output_width * cinfo.output_components; /* Make a one-row-high sample array that will go away when done with image */ buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); /* Step 6: while (scan lines remain to be read) */ /* jpeg_read_scanlines(...); */ while (cinfo.output_scanline < cinfo.output_height) { (void) jpeg_read_scanlines(&cinfo, buffer, 1); //put_scanline_someplace(buffer[0], row_stride); memcpy(&image[(cinfo.output_scanline - 1) * row_stride], buffer[0], (int) row_stride); } /* Step 7: Finish decompression */ (void) jpeg_finish_decompress(&cinfo); /* Step 8: Release JPEG decompression object */ jpeg_destroy_decompress(&cinfo); fclose(infile); return 1; } //************************** CheckJPEGsize ******************************* bool CheckJPEGsize(const char *filename, int *width, int *height) { struct jpeg_decompress_struct cinfo; struct my_error_mgr jerr; FILE * infile; /* source file */ if ((infile = fopen(filename, "rb")) == NULL) { fprintf(stderr, "can't open %s\n", filename); return false; } /* Step 1: allocate and initialize JPEG decompression object */ cinfo.err = jpeg_std_error(&jerr.pub); jerr.pub.error_exit = my_error_exit; if (setjmp(jerr.setjmp_buffer)) { jpeg_destroy_decompress(&cinfo); fclose(infile); return 0; } jpeg_create_decompress(&cinfo); /* Step 2: specify data source (eg, a file) */ jpeg_stdio_src(&cinfo, infile); /* Step 3: read file parameters with jpeg_read_header() */ (void) jpeg_read_header(&cinfo, TRUE); *width = cinfo.image_width; *height = cinfo.image_height; /* Step 8: Release JPEG decompression object */ jpeg_destroy_decompress(&cinfo); fclose(infile); return true; } //************************** Save JPEG *********************************** void SaveJPEG(const char *filename, int quality, int width, int height, JSAMPLE *image) { struct jpeg_compress_struct cinfo; struct jpeg_error_mgr jerr; FILE * outfile; JSAMPROW row_pointer[1]; long int row_stride; cinfo.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo); if ((outfile = fopen(filename, "wb")) == NULL) { fprintf(stderr, "can't open %s\n", filename); return; } jpeg_stdio_dest(&cinfo, outfile); cinfo.image_width = width; cinfo.image_height = height; cinfo.input_components = 3; /* # of color components per pixel */ cinfo.in_color_space = JCS_RGB; /* colorspace of input image */ jpeg_set_defaults(&cinfo); jpeg_set_quality(&cinfo, quality, TRUE); jpeg_start_compress(&cinfo, TRUE); row_stride = width * 3; /* JSAMPLEs per row in image_buffer */ while (cinfo.next_scanline < cinfo.image_height) { row_pointer[0] = &image[(long int)row_stride * cinfo.next_scanline]; (void) jpeg_write_scanlines(&cinfo, row_pointer, 1); } jpeg_finish_compress(&cinfo); fclose(outfile); jpeg_destroy_compress(&cinfo); } void SavePNG(const char *filename, int /*quality*/, int width, int height, png_byte *image) { /* create file */ FILE *fp = fopen(filename, "wb"); if (!fp) { fprintf(stderr, "[write_png_file] File %s could not be opened for writing", filename); return; } /* initialize stuff */ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fprintf(stderr, "[write_png_file] png_create_write_struct failed"); fclose(fp); return; } png_info *info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { fprintf(stderr, "[write_png_file] png_create_info_struct failed"); fclose(fp); return; } if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during init_io"); fclose(fp); return; } png_init_io(png_ptr, fp); /* write header */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing header"); fclose(fp); return; } png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); /* write bytes */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing bytes"); fclose(fp); return; } png_bytep *row_pointers = new png_bytep[height]; for (int y = 0; y < height; y++) { row_pointers[y] = &image[y * width * 3]; } png_write_image(png_ptr, row_pointers); /* end write */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during end of write"); delete[] row_pointers; fclose(fp); return; } png_write_end(png_ptr, NULL); delete[] row_pointers; fclose(fp); } void SaveFromTilesPNG16(const char *filename, int width, int height, int tiles) { /* create file */ string filenamePNG(filename); filenamePNG += "_fromTiles.png"; FILE *fp = fopen(filenamePNG.c_str(), "wb"); if (!fp) { fprintf(stderr, "[write_png_file] File %s could not be opened for writing", filename); return; } /* initialize stuff */ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fprintf(stderr, "[write_png_file] png_create_write_struct failed"); fclose(fp); return; } png_info *info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { fprintf(stderr, "[write_png_file] png_create_info_struct failed"); fclose(fp); return; } if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during init_io"); fclose(fp); return; } png_init_io(png_ptr, fp); /* write header */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing header"); fclose(fp); return; } png_set_IHDR(png_ptr, info_ptr, width * tiles, height * tiles, 16, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); png_set_swap(png_ptr); /* write bytes */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing bytes"); fclose(fp); return; } FILE **files = new FILE*[tiles]; sRGB16 *rowBuffer = new sRGB16[width * tiles]; for (int tileRow = 0; tileRow < tiles; tileRow++) { printf("Compiling image from tiles, row %d\n", tileRow); for (int tile = 0; tile < tiles; tile++) { int fileNumber = tile + tileRow * tiles; string filename2 = IndexFilename(filename, "tile", fileNumber); files[tile] = fopen(filename2.c_str(), "rb"); } for (int y = 0; y < height; y++) { for (int tile = 0; tile < tiles; tile++) { size_t result = fread(&rowBuffer[tile * width], 1, sizeof(sRGB16) * width, files[tile]); if (result != sizeof(sRGB16) * width) { printf("Reading error of image tile files"); for (int tile2 = 0; tile2 < tiles; tile2++) fclose(files[tile2]); return; } } png_write_rows(png_ptr, (png_bytep*) &rowBuffer, 1); } for (int tile = 0; tile < tiles; tile++) { fclose(files[tile]); int fileNumber = tile + tileRow * tiles; string filename2 = IndexFilename(filename, "tile", fileNumber); remove(filename2.c_str()); } } /* end write */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during end of write"); delete[] rowBuffer; fclose(fp); return; } png_write_end(png_ptr, NULL); delete[] rowBuffer; delete[] files; fclose(fp); } void SavePNG16(const char *filename, int /*quality*/, int width, int height, sRGB16* image16) { /* create file */ FILE *fp = fopen(filename, "wb"); if (!fp) { fprintf(stderr, "[write_png_file] File %s could not be opened for writing", filename); return; } /* initialize stuff */ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fprintf(stderr, "[write_png_file] png_create_write_struct failed"); fclose(fp); return; } png_info *info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { fprintf(stderr, "[write_png_file] png_create_info_struct failed"); fclose(fp); return; } if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during init_io"); fclose(fp); return; } png_init_io(png_ptr, fp); /* write header */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing header"); fclose(fp); return; } png_set_IHDR(png_ptr, info_ptr, width, height, 16, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); png_set_swap(png_ptr); /* write bytes */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing bytes"); fclose(fp); return; } png_bytep *row_pointers = new png_bytep[height]; for (int y = 0; y < height; y++) { row_pointers[y] = (png_byte*) &image16[y * width]; } png_write_image(png_ptr, row_pointers); /* end write */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during end of write"); delete [] row_pointers; fclose(fp); return; } png_write_end(png_ptr, NULL); delete[] row_pointers; fclose(fp); } void SavePNG16Alpha(const char *filename, int /*quality*/, int width, int height, cImage *image) { /* create file */ FILE *fp = fopen(filename, "wb"); if (!fp) { fprintf(stderr, "[write_png_file] File %s could not be opened for writing", filename); return; } /* initialize stuff */ png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { fprintf(stderr, "[write_png_file] png_create_write_struct failed"); fclose(fp); return; } png_info *info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { fprintf(stderr, "[write_png_file] png_create_info_struct failed"); fclose(fp); return; } if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during init_io"); fclose(fp); return; } png_init_io(png_ptr, fp); /* write header */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing header"); fclose(fp); return; } png_set_IHDR(png_ptr, info_ptr, width, height, 16, PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); png_write_info(png_ptr, info_ptr); png_set_swap(png_ptr); /* write bytes */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during writing bytes"); fclose(fp); return; } png_bytep *row_pointers = new png_bytep[height]; sImageRGBA16 *image16 = new sImageRGBA16[(unsigned long int)width * height]; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { unsigned long int ptr = x+y*width; sRGB16 pixel = image->GetPixelImage16(x,y); image16[ptr].R = pixel.R; image16[ptr].G = pixel.G; image16[ptr].B = pixel.B; image16[ptr].A = image->GetPixelAlpha(x,y); } } for (int y = 0; y < height; y++) { row_pointers[y] = (png_byte*) &image16[y * width]; } png_write_image(png_ptr, row_pointers); /* end write */ if (setjmp(png_jmpbuf(png_ptr))) { fprintf(stderr, "[write_png_file] Error during end of write"); delete[] row_pointers; delete[] image16; fclose(fp); return; } png_write_end(png_ptr, NULL); delete[] row_pointers; delete[] image16; fclose(fp); } bool FileIfExists(const char *filename) { FILE *file; file = fopen(filename, "r"); if (file) { fclose(file); return true; } else return false; } void WriteLog(const char *text) { FILE *logfile = fopen(logfileName.c_str(), "a"); fprintf(logfile, "%ld: %s\n", (unsigned long int) clock(), text); fclose(logfile); } void WriteLogDouble(const char *text, double value) { FILE *logfile = fopen(logfileName.c_str(), "a"); fprintf(logfile, "%ld: %s, value = %g\n", (unsigned long int) clock(), text, value); fclose(logfile); } int fcopy(const char *source, const char *dest) { // ------ file reading FILE * pFile; unsigned long lSize; char *buffer; size_t result; pFile = fopen(source, "rb"); if (pFile == NULL) { printf("Can't open source file for copying: %s\n", source); return 1; } // obtain file size: fseek(pFile, 0, SEEK_END); lSize = ftell(pFile); rewind(pFile); // allocate memory to contain the whole file: buffer = new char[lSize]; // copy the file into the buffer: result = fread(buffer, 1, lSize, pFile); if (result != lSize) { printf("Can't read source file for copying: %s\n", source); delete[] buffer; fclose(pFile); return 2; } fclose(pFile); // ----- file writing pFile = fopen(dest, "wb"); if (pFile == NULL) { printf("Can't open destination file for copying: %s\n", dest); delete[] buffer; return 3; } fwrite(buffer, 1, lSize, pFile); fclose(pFile); delete [] buffer; return 0; } void BufferNormalize16(sRGB16 *buffer, unsigned int size) { int maxR = 0; int maxG = 0; int maxB = 0; for(unsigned int i = 0; i maxR) maxR = R; int G = buffer[i].G; if(G > maxG) maxG = G; int B = buffer[i].B; if(B > maxB) maxB = B; } int max; max = (maxR > maxG) ? maxR : maxG; max = (maxB > max) ? maxB : max; double factor = 65535.0 / max; if(max == 0) factor = 1.0; for(unsigned int i = 0; iGetWidth(); unsigned int height = image->GetHeight(); unsigned int size = width*height; sRGB16 *buffer16 = new sRGB16[width*height]; sComplexImage *ci = image->GetComplexImagePtr(); string file(filename); file = removeFileExtension(file); for(unsigned int i = 0; iGetImageAdjustments(); unsigned short *colours = image->GetColourIndexBufPtr(); for (unsigned int i = 0; i < size; i++) { int colorIndex = colours[i]; int color_number; if (colorIndex >= 248 * 256) { color_number = colorIndex; } else { color_number = (int) (colorIndex * imageAdjustments->coloring_speed + 256 * imageAdjustments->paletteOffset) % 65536; } sRGB color = image->IndexToColour(color_number); buffer16[i].R = color.R; buffer16[i].G = color.G; buffer16[i].B = color.B; } BufferNormalize16(buffer16, size); SavePNG16((file+"_col.png").c_str(), 100, width, height, buffer16); unsigned short *alpha = image->GetAlphaBufPtr(); for(unsigned int i = 0; iGetZBufferPtr(); float minZ = 1.0e50; float maxZ = 0.0; for (unsigned int i = 0; i < size; i++) { float z = zbuffer[i]; if(z > maxZ && z < 1e19) maxZ = z; if(z < minZ) minZ = z; } float zRange = maxZ - minZ; float zFactor = 65000.0 / zRange; for(unsigned int i = 0; i 1e19) z = 65535; buffer16[i].R = buffer16[i].G = buffer16[i].B = z; } SavePNG16((file+"_zBuffer.png").c_str(), 100, width, height, buffer16); SavePNG16((file+"_image16.png").c_str(), 100, width, height, image->GetImage16Ptr()); delete [] buffer16; } */ string removeFileExtension(const string &filename) { size_t lastdot = filename.find_last_of("."); size_t lastSlash = filename.find_last_of("/"); size_t lastBackSlash = filename.find_last_of("\\"); if (lastdot == string::npos) { return filename; } else { if((lastdot > lastSlash || lastSlash == string::npos) && (lastdot > lastBackSlash || lastBackSlash == string::npos)) { return filename.substr(0, lastdot); } else { return filename; } } } mandelbulber1.21-1.orig/src/texture.cpp0000644000175000017500000000472612274512437021060 0ustar krzysztofkrzysztof/********************************************************* / MANDELBULBER / class for bitmap textures / / / author: Krzysztof Marczak / contact: buddhi1980@gmail.com / licence: GNU GPL v3.0 / ********************************************************/ #include #include #include "texture.hpp" #include "files.h" //constructor cTexture::cTexture(const char *filename) { bitmap = NULL; if (CheckJPEGsize(filename, &width, &height)) { JSAMPLE *jbitmap = new JSAMPLE[width * height * 3]; bitmap = new sRGB8[width * height]; if (!LoadJPEG(filename, jbitmap)) { printf("Error during JPEG loading: %s\n", filename); loaded = false; } else { printf("Image %s loaded\n", filename); printf("Width = %d, Height = %d\n", width, height); if (width > 0 && height > 0) { for (int i = 0; i < width * height; i++) { int adres = 3 * i; bitmap[i].R = jbitmap[adres]; bitmap[i].G = jbitmap[adres + 1]; bitmap[i].B = jbitmap[adres + 2]; } loaded = true; } else { loaded = false; } } delete[] jbitmap; } else { printf("Can't load texture: %s\n", filename); width = 100; height = 100; loaded = false; bitmap = new sRGB8[100 * 100]; memset(bitmap,255,sizeof(sRGB8)*100*100); } } cTexture::cTexture(void) { width = 100; height = 100; loaded = false; bitmap = new sRGB8[100 * 100]; memset(bitmap,255,sizeof(sRGB8)*100*100); } //destructor cTexture::~cTexture(void) { if (bitmap) delete[] bitmap; } //read pixel sRGB8 cTexture::Pixel(double x, double y) { sRGB8 black = { 0, 0, 0 }; if (x >= 0 && x < width && y >= 0 && y < height - 1.0) { return Interpolation(x, y); } else { return black; } } sRGB8 cTexture::Interpolation(double x, double y) { sRGB8 kolor = { 0, 0, 0 }; int ix = x; int iy = y; double rx = (x - (int) x); double ry = (y - (int) y); sRGB8 k1 = bitmap[iy * width + ix]; sRGB8 k2 = bitmap[iy * width + ix + 1]; sRGB8 k3 = bitmap[(iy + 1) * width + ix]; sRGB8 k4 = bitmap[(iy + 1) * width + ix + 1]; kolor.R = (k1.R * (1.0 - rx) * (1.0 - ry) + k2.R * (rx) * (1.0 - ry) + k3.R * (1.0 - rx) * ry + k4.R * (rx * ry)); kolor.G = (k1.G * (1.0 - rx) * (1.0 - ry) + k2.G * (rx) * (1.0 - ry) + k3.G * (1.0 - rx) * ry + k4.G * (rx * ry)); kolor.B = (k1.B * (1.0 - rx) * (1.0 - ry) + k2.B * (rx) * (1.0 - ry) + k3.B * (1.0 - rx) * ry + k4.B * (rx * ry)); return kolor; } sRGB8 cTexture::FastPixel(int x, int y) { return bitmap[x + y * width]; } mandelbulber1.21-1.orig/NEWS0000644000175000017500000006507212274512437016565 0ustar krzysztofkrzysztofVersion history v1.21-1 - fixed bug: OpenCL - SSAO kernel coudn't be compiled on nVidia - fixed bug: OpenCL - there was error -54 during rendering of SSAO and DOF (caused by not matched localWorkSize with GlobalWorkSize) v1.21 - Added color palette editor - Added function to convert flight path into keyframes - improved water algorithm - less visible pattern - added setting for water animation speed - in flight path recording function added switching between using gamma rotation or not (use "Rotate without using gamma angle") - in flight path recording function added switching between constant flight speed and based on estimated distance (use "Absolute distance mode") - added arrows in HUD for flight path recording - Added low quality SSAO effect during progressive rendering (better looking fast preview) - optimized binary searching algorithm in RayMarching() function - OpenCL - added kernel for Screen Space Ambient Occlusion (SSAO) effect - OpenCL - added kernel for Depth Of Field (DOF) effect. There is possible to switch between Monte-Carlo DOF and post-effect DOF - OpenCL - improved quality of "fake lights" based on orbit traps - OpenCL - implemented textured background - OpenCL - added alpha channel in "Full" kernel (possible to save image as PNG-16 + Alpha) - fixed bug: flight path rendering didn't worked properly when rendering was continued from the middle - fixed bug: eliminated memory leaks in OpenCL rendering functions - fixed bug: corrected calculation of viewVector and z value for 3-point perspective - fixed bug: sometimes 3D cursor was jerky. Added temporary disabling for event handler during rendering of cursor v1.20 - OpenCL - added NoDE rendering engine - OpenCL - added "limits" feature to rendering engine - OpenCL - added "interior mode" - OpecCL - added primitive objects - OpenCL - next trial to fix the problem with -I option for OpenCL compiler (spaces in path were not passed properly) - OpenCL - added setting for delta for deltaDE algorythm - added HUD for flight path recording - simplified code and corrected for "limits" and "interior mode" - fixed bug: NetRender didn't worked under Windows 7 and Windows Vista. Now connection is limited to IPv4 and works properly. - fixed problem with visibility of 3D cursor during flight path recording - fixed resource leaks v1.19 - OpenCL - added management for user defined formulas - added showing of light animation paths in image window - improved algorithm for fake lights based on orbit traps - OpenCL - implemented fake lights in "full" kernel - OpenCL - added error handling and messages for most of errors. Program is not terminated when error occurs - OpenCL - added setting for max GPU memory intented to use with OpenCL. Can be helpful when program cannot detect avilable memomy. - added quit confirmation dialog - OpenCL - added selection for OpenCL platform, device and switching between use of GPU or CPU - added loading at program startup and saving at program exit of several application settings - added error handling for lack of memory errors - fixed bug: when in NetRender the client was enabled there was not possible to close the program - fixed bug: applied patches for memory leaks v1.18 - added 3D pointer in image preview window - added showing of animation path in image preview window - OpenCL - improved rendering performance of DOF - iteration loop moved out of OpenCL kernel - OpenCL - image buffer changer to float type - possible to adjust image brightness and gamma after rendering - OpenCL - implemented full Mandelbox formula - fixed bug: lights were placed in wrong position on fish-eye mode - fixed bug: OpenCL - under Windows with nVidia gfx card the program couldn't find mandelbulber_cl_data.h file - fixed bug: OpenCL - main volumetric light wasn't rendered when no aux lights were enabled - fixed bug: OpenCL - wrong calculation of focus point for DOF - fixed bug: OpenCL - reduced noise on depth zooms - linited "delta" from very small values v1.17.2 - fixed bug: OpenCL - include path compatible with nVidia-win32 driver requirements - fixed bug: OpenCL - changed all M_PI to M_PI_F - there were problems with compilation kernel code on some machines - fixed bug: OpenCL - some frames of animation were incomplette - fixed bug: OpenCL - removed #pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable - fixed bug: on Arch Linux there was problem with missing system incudes v1.17.1 - release for Win32 v1.17 - OpenCL - rewritten most of OpenCL kernel. Implemented almost all shaders including ray-traced reflections and volumetric effects - animation record mode works now like flight simulator. There is also recorded camera gamma angle. - added HDR filter - fixed bug: there was vissible different detail level between 3-point perspective and fish-eye - fixed bug: Netrender didn't work with number of tiles > 1 v1.16 - all shaders and rendering engine rewritten from the beginning - light sources are rendered as a volumetric objects - introduced soft shadows - raytracing works with all shaders and is much more accurate - glow and all fog shaders now are volumetric effects and can be used simultanously - possible to set different reflection factor for each primitive object - zoom by click works much more accurate and rotates the camera towards to selected point - added option for using constant step length for zoom by click (useful for animations) - added contrast adjustment for image - user interface reorganized - internal image buffer is now floating point type (better HDR efects) - fixed bug: crashed when animation keyframe thumbnail was refrshed during image rendering - fixed bug: NetRender client saved partially rendered images - fixed bug: animated water wasn't rendered properly with NetRender - remark: some shaders settings are not compatible with older setting files (fog and DOF distance, reflection factor) v1.15 - added light sources based on orbit traps - added NetRender client in noGUI mode v1.14 - not released - trial to activate again OpenCL rendering - a lot of stability problems v1.13-1 - NetRender works also under Windows - improved CRC checking in NetRender message frame v1.13 - added NetRender (possible to create render farms) - fixed bug: program crashed when in lowMem mode "iter fog" was used - fixed bug: program crashed when DOF was used on very big images - fixed memoryleaks v1.12-1 - fixed bug: background texture was not seamless - fixed bug: some of shadows in volumatric iteration fog weren't calculated properly v1.12 - added saving of all image layers in separate PNG 16-bit files - improved fish eye perspective projection - now is compatible with full-dome projectors - added "fish eye 180 degree cut" mode to limit rendering area to hemisphere v1.11 - added iteration fog effect (fog which density depends on interation count). This fog cast shadows on fractal surface and on itself. Can be also iluminated by auxiliary lights and ambiet occlusion. - improved water animation effect - disabling of SSAO and DOF when tile rendering is enabled - OpenCL: added ambient occlusion effect - OpenCL: added colouring algorithms - OpenCL: added setting for OpenCL job size - OpenCL: added new rendering engine "Crazy: iteration fog count" - OpebCL: added Quaternion and Xonodreambuie formulas - OpenCL: added volumetric fog effect - fixed bug: thumbanils weren't rendered properly - fixed bug: weird colour gradients (http://www.fractalforums.com/index.php?topic=10305.msg41172#msg41172) - added few example files for "iteration fog" effect v1.10 - added tile renderig (without any image resolution limitations) - fixed bug: water animation worked only in flight mode v1.09 - Implemented OpenCL support (now only under linux) for image preview. Works only for few formulas. - Added formula General Fold Box (reference: http://www.fractalforums.com/new-theories-and-research/generalized-box-fold/msg36503/#msg36503) - Fixed rotation problems in aminations. Patch by mintaka (http://www.fractalforums.com/mandelbulber/mandelbulber-1-06-patch/) - Added animation effect for water v1.08 - Impelemnted primitive objects like plane, box, sphere and water - Improved raytraced reflections algorithm - better reflections with ambient occlusion - Added fast ambient occlusion effect. Reference: http://www.iquilezles.org/www/material/nvscene2008/rwwtt.pdf (Iñigo Quilez – iq/rgba) - Added possibility to turn off "penetrating light" for the main light source - Added function for auto-calculate of fog parameters - Added coordinates and distance measurement tool v1.07 - Added reset button on IFS tab - Removed some further limitations for image size - Image brightness adjustment affects now on all image layers - Added saturation adjustment for random colour palette - Added volumetric fog effect - Corrected displaying of image size in MegaBytes when size is greater than 2GB - Changed shaders sequence. Glow looks better when fog (from post-processing) is enabled. v1.061 - Cretated 64-bit version for Windows (based on experimental versio of GTK+ libraries) - Fixed bug: Removed many uninitialised variables (found using valgrind) - Fixed problem with -lowmem mode (reported on http://www.fractalforums.com/mandelbulber/(1-06)-lowmem-switch-causes-segfaults-when-increasing-resolution/msg34210/#msg34210) - Fixed bug: overflow in UpdatePreviewSettingsDialog() v1.06 - Added possibility to render MengerKoch formula. It is added as an option for IFS formula (Menger Sponge mode; edge x,y,z) - Corrected ray-tracing algorithm. Fog and specular highlights weren't calculated properly in reflections. - Fixed problem in CalculateNormals() function. Sometimes when all deltas were zero, it produced NaN value. It caused white dots in raytraced reflections. - Added many simple formulas for hybryd sequence: x^2/(x + p); y^2/(y + p); z^2/(z + p); r^2/(r + p); spherical fold; x^p, y^p, z^p; x * p; y * p; z * p; x + p; y + p; z + p; axis X angle multiply by p; axis Y angle multiply by p; axis Z angle multiply by p - Improved quality of raytraced reflections by adding binary searching in DE algorithm v1.05 - Created Windows installer - Changed file structure. Now example and other files are located in (on Linux) /usr/share/mandelbulber directory or (on Windows) C:\Program files\mandelbulber. User data is stored in ".mandelbulber" directory located in $HOME folder - textures are loaded when necessary - backgrond gradient is defined using 3 colours - added "Load Example" button v1.04 - Setting files consists only parameters different than default. Files are much shorter and easier to paste on internet forums. - Settings can be pasted/copied using clipboard from/to text editor or internet browser - Added "Benesi" formula - Added "MandelboxVaryScale4D" formula - Added "Aexion" formula - Added "Bistorbrot" formula - Added offset value for spherical folding in Mandelbox formula - Added image proportion selection on Image tab - Added Random() function into raymarching process. When there are some render artifacts, random noise looks better. Added the same into volumetric lighting shader. - Corrected some typos in messages and labels - Added disabling of raytraced reflections in AutoDEStep() fuction - Replaced "char *" by "const char *" where possible (This avoids explicit casts of string literals to "char *", which are potentially dangerous. - Improved adjustments for raytraced reflections - Eliminated all compiler errors and warnings generated by new GCC 4.6 v1.03 - added ray-traced reflections - fixed problem with very high intensity of glow effect after use of Auto DE factor - resizing of render window works better on slow computers v1.02 - added volumetric light effect v1.01 - added Smooth Mandelbox formula - added function which scans for optimal DE factor - possible to stop program during rendering visible lights - shadows for auxiliary lights can be disabled - rendering time is displayed as a real time instead of a cpu time - command line: possible to set image resolution ("-res WIDTHxHEIGHT") and frames per key value ("-fpk N") - command line: possible to override value ("-o key=value") of any parameter (names from settings files) - fixed bug: there was high CPU load during moving of main render window - fixed bug: memory access violation in fractal.cpp (hybrid formula sequence) v1.0 - Fixed memory leak in ThumbnailRender() - Improved Catmull-Rom Splines - automatic switching between linear and logarithmic scale - Lights are placed more precisely when the FOV value is high - Added checking of some parameters - more "idiot resistant" - Fixed problems with displaying first keyframe in Timeline window - Small improvement for 3D Navigator / Backward button - Corrected "ambient" effect in shading algorithm in CalculatePilex() function - Added displaying of "Distance from last keyframe" also after zooming by mouse pointer - Added image preview in FileChoosers for loading textures - Fixed missed delete[] in KeepOtherSettings() function - Fixed uninitialised variable param.qiet in MainThread() function - Improved DE calculation for Mandelbox formula. Reference: http://www.fractalforums.com/3d-fractal-generation/a-mandelbox-distance-estimate-formula/msg15354/#msg15354 - Mandelbulb formula (without DE) exchanged to optimised version of formula. Reference: http://www.fractalforums.com/mandelbulb-implementation/realtime-renderingoptimisations/ - Improved dynamic DE correction - Improved rendering of visible auxiliary lights v0.991 - fixed problem with decreased quality of images. Added "smoothness" parameter. v0.99 - added equirectangular projection for making 360 degree panoramic views - much improved function "Init 3D navigator". It checks real size of fractal and moves the camera according to actual rotation angle and FOV, so there will be visible whole fractal. The function was renamed to "Reset view" - position of auxiliary lights can be set using mouse pointer - added possibility of rendering flying light sources in keyframe animation mode - fixed bug: possible to change visibility of lightsources after rendering. Lights didn't disappear after pressing "Apply changes" button - fixed bug: in Windows version default folder was renamed from ".mandelbulber" to "mandelbulber". There was problem with dot in file name on Win7 v0.98 - added preview for settings files in Load Settings dialog window - improved quality of Depth of Field effect - added FoldingIntPow2 formula - improved calculation of raytracing steps. Added dynamic correction of estimated distance. Added possibility to switch between logaritmic and linear fuction for distance estimation. - moved Image Scale combo into main Render Window - added possibility to adjust fog visibility and focus point for Depth of Field effect using mouse pointer (added combo box for change function of mouse click) - source code: cleaned up, refractioned, optimised (thanks to Ryan Hitchman) v0.97 - Improved rendering of timeline thumbnails. Now thumbnails show what exactly will be rendered during animation rendering. The same was changed for loading settings by Next/Previous - Added refresh button in timeline window - Added rendering of interiors of fractals (Interior mode). When it's enabled the fractal is rendered as a thin crust. - Added edit fields for changing distance of minimum and maximum distance of view - Improved accuracy of raymarching - After image rendering there is visible "failed DE" value on progress bar. This value informs how many oversteppings were occurred during rendering. - Added "Fractal constant factor" which modifies constant value in all fractal formulas by multiplying by this factor. - fixed bug: program crashed when path for keyframe files was changed and Timeline window was opened v0.96 - added 3 new mandelbulb-like formulas - fixed bug: spherical fording used wrong parameters - fixed bug: when IFS folding mode was activated, there was not possible to set IFS parameters - fixed big: rendering of Flight animation didn't working - wrong calculation of last frame number v0.95 - added many new options for Mandelbox formula (rotations of folding planes) - improved coloring algorithm for Mandelbox formula - added zoom out by right mouse button - needless buttons and edit fields are dinamically disabled - fixed bug: removed "record keyframe" button which caused program crash - fixed bug: adding new keyframs during timeline initializadion causes program crash - now it's blocked during timeline initialization - fixed bug: program generated many errors during program closing - applied patch proposed by jwm-art (http://www.fractalforums.com/mandelbulber/mandelbulber-0-94/msg23134/#msg23134) v0.94 - Added lowMem mode. When active, the program uses about 3 times less memory. Possible to render much larger images on 32-bit systems. To activate it please start the program with -lowmem parameter. - Added Timeline window with keyframes thumbnails - Buttons "Record keyframe", "Next keyframe", "Previous keyframe" and edit field "Key no." moved into Timeline window - Added "Delete keyframe" function - Added "Insert keyframe" function - Keyframe can be selected and loaded (double click) from Timeline window - "Next keyframe" and "Previous keyframe" buttons also starts rendering. - Progressive rendering now is disabled in noGUI mode - Fixed bug: program crashed during stereo rendering in noGUI mode - Fixed bug: SSAO sometimes generates atrifacts during progressive rendering - Fixed bug: images was dark in noGUI mode (colour palette was black) - Fixed bug: visible auxiliary lights in very high image resolution was rendered with visible square artifacts - Fixed bug: scale of visible auxiliary lights was not correct (size of lights wasn't proportional to square of distance) - Fixed bug: Program crashed when start_frame in keyframe mode was greater than zero - Fixed memory leaks and uninitialised variables - Source code: many changes in program structure. Now there is possible to simultaneous render two different fractals. v0.93 - added switch for zooming mode - enable old zooming behavior - start frame and end frame are used also for render animation in path mode - fixed bug: rendering was progressive during recording flight path - now progressive mode is disabled - fixed bug: added proper gdk threading guards in timer callback - fixed bug: program crashed during saving image in PNG 16-bit format v0.92 - progressive rendering of image (first in very low resolution and then in higher and higer) - all camarea changes (zoom by click, 3D navigator) immediately stop rendering and start with new settings - better environment mapping effect - added "Fit to window" zoom option. In this mode the image is scaled with window. - added front distance for fog effect - source code: created cImage class - most of code was changed to use this class v0.91 - added stereoscopic rendering - added displaying value of camera distance between actual position and from last keyframe - added displaying value of estimated camera distance from fractal surface - added spherical perspective (fish eye effect) - added roll (y axis) rotation of view - moving and rotation camera tools cane use also roll rotation angle (disable by "Rotation without using gamma angle") - when SSAO and Ambient occlusion based on rays are enabled the program displays warning message and disables SSAO - fixed bug in ambient occlusion algorithm (before used only part of lightmap texture) and small optimization (elimination of dark rays) - fixed bug: rgbbuf32 was not used at all and consumes a lot of memory - fixed bug: in keyframe animation mode colour palette was taken from last keyframe file - now from actual settings (from GUI) v0.90 - added hybrid formula - all formulas can be used in sequence - added "Hybrid formula" tab to GUI for all hybrid formula parameters - added "Absolute distance mode" option in 3D Navigator - actual distance between camera and viewpoint in displayed in 3D Navigator - program remembers last selected files in file choosers - on title bar is displayed name of last saved/loaded settings file - all colour palette is stored in settings file (not only random seed) - colour palette can be grabbed from selected image - added logfile - all important program step are recorded in file - Menger Sponge formula was changed to IFS Kaleidoscopic vesrion (a little slower but compatible with other formulas) - fixed bug: fixed problem with compiling program on Crux Linux - source files: fractal formulas was cleaned up v0.85 - added animation of different parameters by sound envelope, and envelope of selected sound frequency bands - added command-line mode. Program can work without GUI on enviromnents without any display drivers - after pressing "Record key-frame" button, program tries to load next keyframe if exists - GUI redesign: image tab was divided into image and shaders tabs - animation can be rendered also into PNG and PNG with alpha channel image sequence v0.80 - added colour palette view - added offset slider for colour palette (real time image update) - added "Random palette" button for creating random palette (real time image update) - added edit field for keyframe files in "Select file paths" window - added "intensity" parameter for each IFS symetry vector. 0.0 -> no reflection, 1.0 -> normal reflection - added file choosers for all file paths in "Select file paths" window - added xenodreambuie's fractal formula (http://www.fractalforums.com/3d-fractal-generation/true-3d-mandlebrot-type-fractal/msg8246/#msg8246) - more accurate calculation of new view-point position after "zoom by click" - improved coloring method for Tglad's formula (Mandelbox) - auto-saving of images now is disabled by default - can be activaded using "Auto-save" checkbox on "Image" tab - removed limitaions for size of env-map texture and light-map textures (was 512x512) - all parameters for IFS symetry vectors can be also animated using key-frames - fixed bug: exp10(x) function was implemented as pow(x,10) - should be pow(10,x) - wrong calculation of fog distance and depth of field focus v0.72 - added undo and redo buttons (100 levels of undo) - undo buffer in saved in files and is available after restarting the program - fixed bug: IFS_distance parameter was not saved and loaded - fixed bug: missed libpng-14-14.dll in package for Windows - fixed bug: backgroud image disappeared when close-up was lower than 1e-10 v0.71 - reorganized buttons for key-frames - now are on bottom of window - fixed bug: start_frame and end_frame parameters weren't refreshed in edit fields after loading parameters - fixed memory leak: missed deallocation memory for fractalParams - fixed memory leak: missed g_thread_join() function in PostRendering_SSAO() (8MB per each thread creation!!!) v0.70 - added key-frame animation mode - added catmull-rom interpolation for key-frame animation - added saving images in PNG format - added saving images in PNG 16-bit format - added saving images in PNG format with alpha channel - all fractal formulas can be mixed with IFS Kaleidoscopic formula (Kaleidoscopic IFS Folding mode) - rendering of fractal and all shaders generate alpha channel - fixed bug in CRotationMatrix::Null(void) v0.60 - added Kaleidoscopic IFS formula - added "Kaleidoscopic IFS" tab in GUI for all IFS parameters - fixed problem with loading settigns files generated in older versions of program (all missing parameters are filled by default values) - rewritten all algebraic functions in whole program (all use new CVector3 and CMatrix33 classes) v0.51 - fixed Random() function (problem on Windows) v0.50 - added "Light sorces" tab in GUI - main light is configurable (colour, angle) - added random auxilaty lightsources - added 4 configurable lightsources - improved environment mapping reflection. Now is calculated real reflection vector - improved specular highlight effect - all shaders in C source was moved to separate file v0.43 - added possibility to move camera up, down, left and right in 3D navigator - zooming by mouse click can be disabled - changed default camera position in "Init 3D navigator" function - changed coloring algorithm for Mandelbox (Tglad's) formula. Now color in not depended on number of iterations and distance. - added spherical folding mode to modify all fractal formulas - modified shading formula - Screen Space Ambient Occlusion (SSAO) is rendered using mutiple CPU cores v0.42 - fixed fatal bug with updating fog effect during interface initialisation v0.41 - added post rendering effect based on z-buffer: Depth Of Field - improved coloring method for Mandelbulbs - slider for fog visibility changed to logarytmic scale - added information on progress bar about rendering post effects - stop button is able to terminate rendering post effects - added "About..." tab in GUI - fixed problem with g_thread initialization v0.40 - flight speed is adjustable during record mode by mouse clicking (left/right button) - flight path record can be continued from last position stored in path file ("Continue recording" button) - each shading effect is rendered into separate layer (higher memory consumption) - shaders can be adjusted after finishing rendering - compiling of all image layers is on-fly - changed default folders in file requsters - added "Save image as..." button for saving image after adjustments - added post rendering effect based on z-buffer: fog - added post rendering effect based on z-buffer: screen space ambient occlusion - added "Post effects" tab in GUI - added analytic distance estimation for Tglad's Mandelbox formula (faster rendering) - added analytic distance estimation for Menger sponge formula (faster rendering) - fixed bug in Przekolor() function (coloring formula) - fixed bug in memory allocation for colour palette - added error handling for missed textures (error messages) - settings file was expanded for post rendering effect settings v0.30 - added Tglad's "folding" algorithm for all formulas - added edit fields for changing formula folding parameters - added edit field for changing color frequency - added scrolls in main render window - changing image scale in window is possible during rendering - added closing-up by mouse clicking on image - fake ambient occusion mode is only enabled in trigonometric formulas - rebuided all settings files v0.21 - added "sphere" formula - shaders testing mode - added tool-tips - fixed bug with hanging refreshing of image in window after using Stop button - created windows port - all textures are loaded using cTexture class - optimised conditions in CalculateInterations() funsction - added fractal coloring algorithm v0.20 - added simple animation mode (record flight path in low lesolution and render) - added fractal formulas: Menger Sponge, Tglad's and z=-sin(theta) version of z^2+c - added spherical wrapped textured background - added gradient background - fixed some memory leaks - fixed bug with arrow icons v0.11 - added detecting of number of CPU cores - code was little cleaned up - GUI was grouped into tabs - added 3D navigator tool v0.1 (04.02.2010) - first alfa release mandelbulber1.21-1.orig/mandelbulber.desktop0000644000175000017500000000060012274512437022077 0ustar krzysztofkrzysztof[Desktop Entry] Categories=Graphics;3DGraphics;Math;Science; Comment=Visit 3D Fractal World Exec=mandelbulber GenericName=Mandelbulber - Advanced 3D fractal generator Icon=/usr/share/mandelbulber/icons/mandelbulber.png MimeType= Name=Mandelbulber StartupNotify=true Terminal=false Type=Application X-DBUS-ServiceName= X-DBUS-StartupType=none X-KDE-SubstituteUID=false X-KDE-Username= mandelbulber1.21-1.orig/README0000644000175000017500000000413412274512437016736 0ustar krzysztofkrzysztofMANDELBULBER 1.21-1 project leader: Krzysztof Marczak project members: knighty, makemeunsee, Marius Schilder, Ryan Hitchman, Jeff Epler, Martin Reinecke, Quazgaa contact: buddhi1980@gmail.com www: http://www.mandelbulber.com download site: http://sourceforge.net/projects/mandelbulber/ SVN: http://code.google.com/p/mandelbulber/ LICENCE: GNU GPL v3.0 1. REQUIREMENTS - Linux OS with installed GTK+2.0 libraries (version >2.20), libjpeg - very fast CPU (recomended 2GHz, 4 cores) - 2GB RAM 2. COMPILING libgtk2.0, libjpeg8 are required to compile Mandelbulber. On Ubuntu or Debian: sudo apt-get install libgtk2.0-dev libjpeg8-dev openCl version needs additionaly ocl-icd-opencl-dev and ocl-icd-libopencl1 Then: cd makefiles make all cd .. 3. INSTALLATION please type: ./install 4. TESTED ON: - Ubuntu x86 - Debian Wheeze x64 (there is also available Windows and Mac version) - gcc 4.7 5. USAGE Please visit: http://wiki.mandelbulber.com/index.php?title=Main_Page command-line mode: Syntax: mandelbulber [options...] [settings_file] options: -nogui - start program without GUI -flight - render flight animation -keyframe - render keyframe animation -start N - start renderig from frame number N -end N - rendering will end on frame number N -o key=value - override item 'key' from settings file with new value 'value' -res WIDTHxHEIGHT - override image resolution -fpk N - override frames per key parameter -ip N.N.N.N - set application as a client connected to server of given IP address -port - set network port number for Netrender (default 5555) -format FORMAT - image output format jpg - JPEG format png - PNG format png16 - 16-bit PNG format png16alpha - 16-bit PNG with alpha channel format [settings_file] - file with fractal settings (program also tries to find file in ./mandelbulber/settings directory) When settings_file is put as command argument then program will start in noGUI mode mandelbulber1.21-1.orig/makefiles/0000755000175000017500000000000012274512437020014 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/makefiles/sources.mk0000644000175000017500000000102012274512437022021 0ustar krzysztofkrzysztof################################################################################ # Automatically-generated file. Do not edit! ################################################################################ O_SRCS := CPP_SRCS := C_UPPER_SRCS := C_SRCS := S_UPPER_SRCS := OBJ_SRCS := ASM_SRCS := CXX_SRCS := C++_SRCS := CC_SRCS := OBJS := C++_DEPS := C_DEPS := CC_DEPS := CPP_DEPS := EXECUTABLES := CXX_DEPS := C_UPPER_DEPS := # Every subdirectory with source files must be described here SUBDIRS := \ src \ mandelbulber1.21-1.orig/makefiles/src/0000755000175000017500000000000012274512437020603 5ustar krzysztofkrzysztofmandelbulber1.21-1.orig/makefiles/src/subdir.mk0000644000175000017500000000342712274512437022432 0ustar krzysztofkrzysztof################################################################################ # Automatically-generated file. Do not edit! ################################################################################ # Add inputs and outputs from these tool invocations to the build variables CPP_SRCS += \ ../src/Render3D.cpp \ ../src/algebra.cpp \ ../src/callbacks.cpp \ ../src/cimage.cpp \ ../src/common_math.cpp \ ../src/database.cpp \ ../src/files.cpp \ ../src/fractal.cpp \ ../src/image.cpp \ ../src/interface.cpp \ ../src/morph.cpp \ ../src/primitives.cpp \ ../src/settings.cpp \ ../src/shaders.cpp \ ../src/texture.cpp \ ../src/timeline.cpp \ ../src/undo.cpp \ ../src/cl_support.cpp \ ../src/netrender.cpp OBJS += \ ./src/Render3D.o \ ./src/algebra.o \ ./src/callbacks.o \ ./src/cimage.o \ ./src/common_math.o \ ./src/database.o \ ./src/files.o \ ./src/fractal.o \ ./src/image.o \ ./src/interface.o \ ./src/morph.o \ ./src/primitives.o \ ./src/settings.o \ ./src/shaders.o \ ./src/texture.o \ ./src/timeline.o \ ./src/undo.o \ ./src/cl_support.o \ ./src/netrender.o CPP_DEPS += \ ./src/Render3D.d \ ./src/algebra.d \ ./src/callbacks.d \ ./src/cimage.d \ ./src/common_math.d \ ./src/database.d \ ./src/files.d \ ./src/fractal.d \ ./src/image.d \ ./src/interface.d \ ./src/morph.d \ ./src/primitives.d \ ./src/settings.d \ ./src/shaders.d \ ./src/texture.d \ ./src/timeline.d \ ./src/undo.d \ ./src/cl_support.d \ ./src/netrender.d # Each subdirectory must supply rules for building sources it contributes src/%.o: ../src/%.cpp @echo 'Building file: $<' @echo 'Invoking: GCC C++ Compiler' g++ -O3 -ffast-math -Wall -c -fmessage-length=0 `pkg-config --cflags gtk+-2.0 gthread-2.0;` -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" $(CXXFLAGS) $(CPPFLAGS) -o"$@" "$<" @echo 'Finished building: $<' @echo ' ' mandelbulber1.21-1.orig/makefiles/makefile0000644000175000017500000000260612274512437021520 0ustar krzysztofkrzysztof################################################################################ # Automatically-generated file. Do not edit! ################################################################################ -include ../makefile.init RM := rm -rf # All of the sources participating in the build are defined here -include sources.mk -include src/subdir.mk -include subdir.mk -include objects.mk ifneq ($(MAKECMDGOALS),clean) ifneq ($(strip $(C++_DEPS)),) -include $(C++_DEPS) endif ifneq ($(strip $(C_DEPS)),) -include $(C_DEPS) endif ifneq ($(strip $(CC_DEPS)),) -include $(CC_DEPS) endif ifneq ($(strip $(CPP_DEPS)),) -include $(CPP_DEPS) endif ifneq ($(strip $(CXX_DEPS)),) -include $(CXX_DEPS) endif ifneq ($(strip $(C_UPPER_DEPS)),) -include $(C_UPPER_DEPS) endif endif -include ../makefile.defs # Add inputs and outputs from these tool invocations to the build variables # All Target all: mandelbulber # Tool invocations mandelbulber: $(OBJS) $(USER_OBJS) @echo 'Building target: $@' @echo 'Invoking: GCC C++ Linker' g++ -o"mandelbulber" -L/usr/lib/x86_64-linux-gnu/ $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(OBJS) $(USER_OBJS) $(LIBS) @echo 'Finished building target: $@' @echo ' ' # Other Targets clean: -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) mandelbulber -@echo ' ' .PHONY: all clean dependents .SECONDARY: -include ../makefile.targets mandelbulber1.21-1.orig/makefiles/objects.mk0000644000175000017500000000113512274512437021776 0ustar krzysztofkrzysztof################################################################################ # Automatically-generated file. Do not edit! ################################################################################ USER_OBJS := LIBS := -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0 -lgthread-2.0 -lglib-2.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lpthread -lrt -lpng -ljpeg mandelbulber1.21-1.orig/uninstall0000755000175000017500000000061212274512437020012 0ustar krzysztofkrzysztof#!/bin/bash echo Do you want to uninstall Mandelbulber program now? [y/n] read answer if [ "$answer" = "y" ] ; then sudo rm /usr/share/mandelbulber -r sudo rm /usr/bin/mandelbulber echo Do you want to uninstall also Mandelbulber user files? [y/n] read answer if [ "$answer" = "y" ] ; then rm $HOME/.mandelbulber -r fi echo mandelbulber uninstalled else echo Uninstall aborted fi