From 8cd77c01ead8c58fa683b2f01ad5013f230fc1ca Mon Sep 17 00:00:00 2001 From: Austin Haas Date: Thu, 18 Jun 2026 10:31:21 -0600 Subject: [PATCH] Add Linux SFML 3 port (linux folder) --- linux/.gitignore | 6 + linux/LICENSE | 21 + linux/LICENSE-FONT.txt | 202 +++++++++ linux/LinuxAudio.cpp | 58 +++ linux/LinuxAudio.h | 30 ++ linux/LinuxAudio.o | Bin 0 -> 9600 bytes linux/Main.cpp | 597 ++++++++++++++++++++++++++ linux/Main.o | Bin 0 -> 52896 bytes linux/Makefile | 19 + linux/MandelbrotMusic.vcxproj | 140 ++++++ linux/MandelbrotMusic.vcxproj.filters | 38 ++ linux/MandelbrotMusic.vcxproj.user | 4 + linux/README.md | 36 ++ linux/RobotoMono-Medium.ttf | Bin 0 -> 86820 bytes linux/fractal | Bin 0 -> 56624 bytes linux/frag.glsl | 160 +++++++ linux/vert.glsl | 6 + 17 files changed, 1317 insertions(+) create mode 100644 linux/.gitignore create mode 100644 linux/LICENSE create mode 100644 linux/LICENSE-FONT.txt create mode 100644 linux/LinuxAudio.cpp create mode 100644 linux/LinuxAudio.h create mode 100644 linux/LinuxAudio.o create mode 100644 linux/Main.cpp create mode 100644 linux/Main.o create mode 100644 linux/Makefile create mode 100644 linux/MandelbrotMusic.vcxproj create mode 100644 linux/MandelbrotMusic.vcxproj.filters create mode 100644 linux/MandelbrotMusic.vcxproj.user create mode 100644 linux/README.md create mode 100644 linux/RobotoMono-Medium.ttf create mode 100644 linux/fractal create mode 100644 linux/frag.glsl create mode 100644 linux/vert.glsl diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..6b20e91 --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1,6 @@ +*.bin +*.idb +*.log +*.obj +*.pdb +*.tlog \ No newline at end of file diff --git a/linux/LICENSE b/linux/LICENSE new file mode 100644 index 0000000..718b616 --- /dev/null +++ b/linux/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 HackerPoet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/linux/LICENSE-FONT.txt b/linux/LICENSE-FONT.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/linux/LICENSE-FONT.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/linux/LinuxAudio.cpp b/linux/LinuxAudio.cpp new file mode 100644 index 0000000..00e6b06 --- /dev/null +++ b/linux/LinuxAudio.cpp @@ -0,0 +1,58 @@ +#include "LinuxAudio.h" +#include +#include + +struct WinAudio::Impl { + class Stream : public sf::SoundStream { + public: + Stream(WinAudio* parent, unsigned int sampleRate) + : m_parent(parent) { + std::vector channelMap = { + sf::SoundChannel::FrontLeft, + sf::SoundChannel::FrontRight + }; + initialize(2, sampleRate, channelMap); + } + + bool onGetData(sf::SoundStream::Chunk& chunk) override { + WinAudio::Chunk c; + c.samples = m_parent->m_samples; + c.sampleCount = WinAudio::AUDIO_BUFF_SIZE; + if (!m_parent->onGetData(c)) + return false; + + chunk.samples = c.samples; + chunk.sampleCount = c.sampleCount; + return true; + } + + void onSeek(sf::Time) override {} + + private: + WinAudio* m_parent; + }; + + Impl(WinAudio* parent, int sampleRate) + : stream(parent, static_cast(sampleRate)) {} + + Stream stream; +}; + +WinAudio::WinAudio(int sample_rate) { + impl = std::make_unique(this, sample_rate); + std::memset(m_samples, 0, sizeof(m_samples)); +} + +WinAudio::~WinAudio() { + stop(); +} + +bool WinAudio::play() { + impl->stream.play(); + return true; +} + +bool WinAudio::stop() { + impl->stream.stop(); + return true; +} diff --git a/linux/LinuxAudio.h b/linux/LinuxAudio.h new file mode 100644 index 0000000..03a61c7 --- /dev/null +++ b/linux/LinuxAudio.h @@ -0,0 +1,30 @@ +#pragma once + +#include +#include +#include + +class WinAudio { +public: + static constexpr int AUDIO_BUFF_SIZE = 4096; + + struct Chunk { + int16_t* samples = nullptr; + std::size_t sampleCount = 0; + }; + + explicit WinAudio(int sample_rate); + virtual ~WinAudio(); + + virtual bool onGetData(Chunk& data) = 0; + + bool play(); + bool stop(); + +protected: + int16_t m_samples[AUDIO_BUFF_SIZE]; + +private: + struct Impl; + std::unique_ptr impl; +}; diff --git a/linux/LinuxAudio.o b/linux/LinuxAudio.o new file mode 100644 index 0000000000000000000000000000000000000000..437a52e91ec1f14f8fd7d06f9fc6897d8348c038 GIT binary patch literal 9600 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 h6}4LQ +#include +#include +#include +#include +#include +#include +#include +#include + +static const int target_fps = 60; +static const int sample_rate = 48000; +static const int max_freq = 4000; +static const int window_w_init = 1280; +static const int window_h_init = 720; +static const int starting_fractal = 0; +static const int max_iters = 1200; +static const double escape_radius_sq = 1000.0; +static const char window_name[] = "Fractal Sound Explorer"; + +static int window_w = window_w_init; +static int window_h = window_h_init; +static double cam_x = 0.0; +static double cam_y = 0.0; +static double cam_zoom = 100.0; +static int cam_x_fp = 0; +static int cam_y_fp = 0; +static double cam_x_dest = cam_x; +static double cam_y_dest = cam_y; +static double cam_zoom_dest = cam_zoom; +static bool sustain = true; +static bool normalized = true; +static bool use_color = false; +static bool hide_orbit = true; +static double jx = 1e8; +static double jy = 1e8; +static int frame = 0; + +typedef void (*Fractal)(double&, double&, double, double); +static Fractal fractal = nullptr; + +const sf::BlendMode BlendAlpha = sf::BlendAlpha; +const sf::BlendMode BlendIgnoreAlpha = sf::BlendNone; + +void ScreenToPt(int x, int y, double& px, double& py) { + px = double(x - window_w / 2) / cam_zoom - cam_x; + py = double(y - window_h / 2) / cam_zoom - cam_y; +} + +void PtToScreen(double px, double py, int& x, int& y) { + x = int(cam_zoom * (px + cam_x)) + window_w / 2; + y = int(cam_zoom * (py + cam_y)) + window_h / 2; +} + +void mandelbrot(double& x, double& y, double cx, double cy) { + double nx = x * x - y * y + cx; + double ny = 2.0 * x * y + cy; + x = nx; + y = ny; +} + +void burning_ship(double& x, double& y, double cx, double cy) { + double nx = x * x - y * y + cx; + double ny = 2.0 * std::abs(x * y) + cy; + x = nx; + y = ny; +} + +void feather(double& x, double& y, double cx, double cy) { + std::complex z(x, y); + std::complex z2(x * x, y * y); + std::complex c(cx, cy); + std::complex one(1.0, 0.0); + z = z * z * z / (one + z2) + c; + x = z.real(); + y = z.imag(); +} + +void sfx(double& x, double& y, double cx, double cy) { + std::complex z(x, y); + std::complex c2(cx * cx, cy * cy); + z = z * (x * x + y * y) - (z * c2); + x = z.real(); + y = z.imag(); +} + +void henon(double& x, double& y, double cx, double cy) { + double nx = 1.0 - cx * x * x + y; + double ny = cy * x; + x = nx; + y = ny; +} + +void duffing(double& x, double& y, double cx, double cy) { + double nx = y; + double ny = -cy * x + cx * y - y * y * y; + x = nx; + y = ny; +} + +void ikeda(double& x, double& y, double cx, double cy) { + double t = 0.4 - 6.0 / (1.0 + x * x + y * y); + double st = std::sin(t); + double ct = std::cos(t); + double nx = 1.0 + cx * (x * ct - y * st); + double ny = cy * (x * st + y * ct); + x = nx; + y = ny; +} + +void chirikov(double& x, double& y, double cx, double cy) { + y += cy * std::sin(x); + x += cx * y; +} + +static const Fractal all_fractals[] = { + mandelbrot, + burning_ship, + feather, + sfx, + henon, + duffing, + ikeda, + chirikov, +}; + +class Synth : public WinAudio { +public: + bool audio_reset; + bool audio_pause; + double volume; + double play_x, play_y; + double play_cx, play_cy; + double play_nx, play_ny; + double play_px, play_py; + + Synth() : WinAudio(sample_rate) { + audio_reset = true; + audio_pause = false; + volume = 8000.0; + play_x = 0.0; + play_y = 0.0; + play_cx = 0.0; + play_cy = 0.0; + play_nx = 0.0; + play_ny = 0.0; + play_px = 0.0; + play_py = 0.0; + } + + void SetPoint(double x, double y) { + play_nx = x; + play_ny = y; + audio_reset = true; + audio_pause = false; + } + + virtual bool onGetData(Chunk& data) override { + data.samples = m_samples; + data.sampleCount = AUDIO_BUFF_SIZE; + std::memset(m_samples, 0, sizeof(m_samples)); + + if (audio_reset) { + m_audio_time = 0; + play_cx = (jx < 1e8 ? jx : play_nx); + play_cy = (jy < 1e8 ? jy : play_ny); + play_x = play_nx; + play_y = play_ny; + play_px = play_nx; + play_py = play_ny; + mean_x = play_nx; + mean_y = play_ny; + volume = 8000.0; + audio_reset = false; + } + + if (audio_pause) { + return true; + } + + const int steps = sample_rate / max_freq; + for (int i = 0; i < AUDIO_BUFF_SIZE; i += 2) { + const int j = m_audio_time % steps; + if (j == 0) { + play_px = play_x; + play_py = play_y; + fractal(play_x, play_y, play_cx, play_cy); + if (play_x * play_x + play_y * play_y > escape_radius_sq) { + audio_pause = true; + return true; + } + + if (normalized) { + dpx = play_px - play_cx; + dpy = play_py - play_cy; + dx = play_x - play_cx; + dy = play_y - play_cy; + if (dx != 0.0 || dy != 0.0) { + double dpmag = 1.0 / std::sqrt(1e-12 + dpx * dpx + dpy * dpy); + double dmag = 1.0 / std::sqrt(1e-12 + dx * dx + dy * dy); + dpx *= dpmag; + dpy *= dpmag; + dx *= dmag; + dy *= dmag; + } + } else { + dx = play_x - mean_x; + dy = play_y - mean_y; + dpx = play_px - mean_x; + dpy = play_py - mean_y; + } + + mean_x = mean_x * 0.99 + play_x * 0.01; + mean_y = mean_y * 0.99 + play_y * 0.01; + + double m = dx * dx + dy * dy; + if (m > 2.0) { + dx *= 2.0 / m; + dy *= 2.0 / m; + } + m = dpx * dpx + dpy * dpy; + if (m > 2.0) { + dpx *= 2.0 / m; + dpy *= 2.0 / m; + } + + if (!sustain) { + volume *= 0.9992; + } + } + + double t = double(j) / double(steps); + t = 0.5 - 0.5 * std::cos(t * 3.14159); + double wx = t * dx + (1.0 - t) * dpx; + double wy = t * dy + (1.0 - t) * dpy; + + m_samples[i] = (int16_t)std::min(std::max(wx * volume, -32000.0), 32000.0); + m_samples[i + 1] = (int16_t)std::min(std::max(wy * volume, -32000.0), 32000.0); + m_audio_time += 1; + } + + return !audio_reset; + } + + int16_t m_samples[AUDIO_BUFF_SIZE]; + int32_t m_audio_time; + double mean_x; + double mean_y; + double dx; + double dy; + double dpx; + double dpy; +}; + +void SetFractal(sf::Shader& shader, int type, Synth& synth) { + shader.setUniform("iType", type); + jx = jy = 1e8; + fractal = all_fractals[type]; + normalized = (type == 0); + synth.audio_pause = true; + hide_orbit = true; + frame = 0; +} + +void resize_window(sf::RenderWindow& window, sf::RenderTexture& rt, const sf::ContextSettings&, int w, int h) { + window_w = w; + window_h = h; + rt = sf::RenderTexture(sf::Vector2u((unsigned)w, (unsigned)h)); + window.setView(sf::View(sf::FloatRect(sf::Vector2f(0.f, 0.f), sf::Vector2f((float)w, (float)h)))); + frame = 0; +} + +void make_window(sf::RenderWindow& window, sf::RenderTexture& rt, const sf::ContextSettings& settings, bool is_fullscreen) { + window.close(); + sf::VideoMode screenSize; + if (is_fullscreen) { + screenSize = sf::VideoMode::getDesktopMode(); + window.create(screenSize, window_name, sf::State::Fullscreen, settings); + } else { + screenSize = sf::VideoMode(sf::Vector2u(window_w_init, window_h_init), 24); + window.create(screenSize, window_name, sf::State::Windowed, settings); + } + resize_window(window, rt, settings, (int)screenSize.size.x, (int)screenSize.size.y); + window.setFramerateLimit(target_fps); + window.setKeyRepeatEnabled(false); + window.requestFocus(); +} + +#if _WIN32 +INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, INT nCmdShow) { +#else +int main(int argc, char *argv[]) { +#endif + if (!sf::Shader::isAvailable()) { + std::cerr << "Graphics card does not support shaders" << std::endl; + return 1; + } + + sf::Shader shader; + if (!shader.loadFromFile("vert.glsl", sf::Shader::Type::Vertex)) { + std::cerr << "Failed to compile vertex shader" << std::endl; + return 1; + } + if (!shader.loadFromFile("frag.glsl", sf::Shader::Type::Fragment)) { + std::cerr << "Failed to compile fragment shader" << std::endl; + return 1; + } + + sf::Font font; + if (!font.openFromFile("RobotoMono-Medium.ttf")) { + std::cerr << "Failed to load font" << std::endl; + return 1; + } + + sf::RectangleShape rect; + rect.setPosition(sf::Vector2f(0.f, 0.f)); + + sf::ContextSettings settings; + settings.depthBits = 24; + settings.stencilBits = 8; + settings.antiAliasingLevel = 4; + settings.majorVersion = 3; + settings.minorVersion = 0; + + sf::RenderWindow window; + sf::RenderTexture renderTexture; + bool is_fullscreen = false; + bool toggle_fullscreen = false; + make_window(window, renderTexture, settings, is_fullscreen); + + Synth synth{}; + + shader.setUniform("iCam", sf::Vector2f((float)cam_x, (float)cam_y)); + shader.setUniform("iZoom", (float)cam_zoom); + SetFractal(shader, starting_fractal, synth); + synth.play(); + + double px = 0.0, py = 0.0, orbit_x = 0.0, orbit_y = 0.0; + bool leftPressed = false; + bool dragging = false; + bool juliaDrag = false; + bool takeScreenshot = false; + bool showHelpMenu = false; + sf::Vector2i prevDrag; + + while (window.isOpen()) { + while (auto eventOpt = window.pollEvent()) { + const auto& event = *eventOpt; + + if (event.is()) { + window.close(); + break; + } else if (event.is()) { + auto resized = event.getIf(); + if (resized) { + resize_window(window, renderTexture, settings, (int)resized->size.x, (int)resized->size.y); + } + } else if (event.is()) { + auto keyEvent = event.getIf(); + if (keyEvent) { + const sf::Keyboard::Key keycode = keyEvent->code; + if (keycode == sf::Keyboard::Key::Escape) { + window.close(); + break; + } else if (keycode >= sf::Keyboard::Key::Num1 && keycode <= sf::Keyboard::Key::Num8) { + SetFractal(shader, int(keycode) - int(sf::Keyboard::Key::Num1), synth); + } else if (keycode == sf::Keyboard::Key::F11) { + toggle_fullscreen = true; + } else if (keycode == sf::Keyboard::Key::D) { + sustain = !sustain; + } else if (keycode == sf::Keyboard::Key::C) { + use_color = !use_color; + frame = 0; + } else if (keycode == sf::Keyboard::Key::R) { + cam_x = cam_x_dest = 0.0; + cam_y = cam_y_dest = 0.0; + cam_zoom = cam_zoom_dest = 100.0; + frame = 0; + } else if (keycode == sf::Keyboard::Key::J) { + if (jx < 1e8) { + jx = jy = 1e8; + } else { + juliaDrag = true; + const sf::Vector2i mousePos = sf::Mouse::getPosition(window); + ScreenToPt(mousePos.x, mousePos.y, jx, jy); + } + synth.audio_pause = true; + hide_orbit = true; + frame = 0; + } else if (keycode == sf::Keyboard::Key::S) { + takeScreenshot = true; + } else if (keycode == sf::Keyboard::Key::H) { + showHelpMenu = !showHelpMenu; + } + } + } else if (event.is()) { + auto keyEvent = event.getIf(); + if (keyEvent && keyEvent->code == sf::Keyboard::Key::J) { + juliaDrag = false; + frame = 0; + } + } else if (event.is()) { + auto wheel = event.getIf(); + if (wheel) { + cam_zoom_dest *= std::pow(1.1f, wheel->delta); + const sf::Vector2i mouse_pos = sf::Mouse::getPosition(window); + cam_x_fp = mouse_pos.x; + cam_y_fp = mouse_pos.y; + } + } else if (event.is()) { + auto mouse = event.getIf(); + if (mouse) { + if (mouse->button == sf::Mouse::Button::Left) { + leftPressed = true; + hide_orbit = false; + ScreenToPt(mouse->position.x, mouse->position.y, px, py); + synth.SetPoint(px, py); + orbit_x = px; + orbit_y = py; + } else if (mouse->button == sf::Mouse::Button::Middle) { + prevDrag = sf::Vector2i(mouse->position.x, mouse->position.y); + dragging = true; + } else if (mouse->button == sf::Mouse::Button::Right) { + synth.audio_pause = true; + hide_orbit = true; + } + } + } else if (event.is()) { + auto mouse = event.getIf(); + if (mouse) { + if (mouse->button == sf::Mouse::Button::Left) { + leftPressed = false; + } else if (mouse->button == sf::Mouse::Button::Middle) { + dragging = false; + } + } + } else if (event.is()) { + auto move = event.getIf(); + if (move) { + if (leftPressed) { + ScreenToPt(move->position.x, move->position.y, px, py); + synth.SetPoint(px, py); + orbit_x = px; + orbit_y = py; + } + if (dragging) { + sf::Vector2i curDrag = sf::Vector2i(move->position.x, move->position.y); + cam_x_dest += (curDrag.x - prevDrag.x) / cam_zoom; + cam_y_dest += (curDrag.y - prevDrag.y) / cam_zoom; + prevDrag = curDrag; + frame = 0; + } + if (juliaDrag) { + ScreenToPt(move->position.x, move->position.y, jx, jy); + frame = 0; + } + } + } + } + + double fpx, fpy, delta_cam_x, delta_cam_y; + + // World coords at zoom focus before zoom + ScreenToPt(cam_x_fp, cam_y_fp, fpx, fpy); + + // Smooth zoom toward target + cam_zoom = cam_zoom * 0.9 + cam_zoom_dest * 0.1; + + // World coords at zoom focus after zoom + ScreenToPt(cam_x_fp, cam_y_fp, delta_cam_x, delta_cam_y); + + // Adjust destination so the zoom focus stays roughly under the cursor + cam_x_dest += delta_cam_x - fpx; + cam_y_dest += delta_cam_y - fpy; + + // Smooth camera position toward destination + cam_x = cam_x * 0.9 + cam_x_dest * 0.1; + cam_y = cam_y * 0.9 + cam_y_dest * 0.1; + + const bool hasJulia = (jx < 1e8); + const bool drawMset = (juliaDrag || !hasJulia); + const bool drawJset = (juliaDrag || hasJulia); + const int flags = (drawMset ? 0x01 : 0) | (drawJset ? 0x02 : 0) | (use_color ? 0x04 : 0); + + const sf::Glsl::Vec2 window_res((float)window_w, (float)window_h); + shader.setUniform("iResolution", window_res); + shader.setUniform("iCam", sf::Vector2f((float)cam_x, (float)cam_y)); + shader.setUniform("iZoom", (float)cam_zoom); + shader.setUniform("iFlags", flags); + shader.setUniform("iJulia", sf::Vector2f((float)jx, (float)jy)); + shader.setUniform("iIters", max_iters); + shader.setUniform("iTime", frame); + + sf::RenderStates states = sf::RenderStates::Default; + states.blendMode = (frame > 0 ? BlendAlpha : BlendIgnoreAlpha); + states.shader = &shader; + rect.setSize(window_res); + renderTexture.clear(sf::Color::Transparent); + renderTexture.draw(rect, states); + renderTexture.display(); + + sf::Sprite sprite(renderTexture.getTexture()); + window.clear(); + window.draw(sprite, sf::RenderStates(BlendIgnoreAlpha)); + + if (takeScreenshot) { + window.display(); + const time_t t = std::time(0); + const tm* now = std::localtime(&t); + char buffer[128]; + std::strftime(buffer, sizeof(buffer), "pic_%m-%d-%y_%H-%M-%S.png", now); + sf::Texture texture; + texture = sf::Texture(sf::Vector2u(window.getSize())); + texture.update(window); + texture.copyToImage().saveToFile(buffer); + takeScreenshot = false; + } + + if (!hide_orbit) { + glLineWidth(1.0f); + glColor3f(1.0f, 0.0f, 0.0f); + glBegin(GL_LINE_STRIP); + int sx, sy; + double x = orbit_x; + double y = orbit_y; + PtToScreen(x, y, sx, sy); + glVertex2i(sx, sy); + double cx = (hasJulia ? jx : px); + double cy = (hasJulia ? jy : py); + for (int i = 0; i < 200; ++i) { + fractal(x, y, cx, cy); + PtToScreen(x, y, sx, sy); + glVertex2i(sx, sy); + if (x * x + y * y > escape_radius_sq) { + break; + } else if (i < max_freq / target_fps) { + orbit_x = x; + orbit_y = y; + } + } + glEnd(); + } + + if (showHelpMenu) { + sf::RectangleShape dimRect(sf::Vector2f((float)window_w, (float)window_h)); + dimRect.setFillColor(sf::Color(0, 0, 0, 128)); + window.draw(dimRect, sf::RenderStates(BlendAlpha)); + + sf::Text helpMenu(font, "", 24); + helpMenu.setFillColor(sf::Color::White); + helpMenu.setString( + " H - Toggle Help Menu Left Mouse - Click or drag to hear orbits\n" + " D - Toggle Audio Dampening Middle Mouse - Drag to pan view\n" + " C - Toggle Color Right Mouse - Stop orbit and sound\n" + "F11 - Toggle Fullscreen Scroll Wheel - Zoom in and out\n" + " S - Save Snapshot\n" + " R - Reset View\n" + " J - Hold down, move mouse, and\n" + " release to make Julia sets.\n" + " Press again to switch back.\n" + " 1 - Mandelbrot Set\n" + " 2 - Burning Ship\n" + " 3 - Feather Fractal\n" + " 4 - SFX Fractal\n" + " 5 - Hénon Map\n" + " 6 - Duffing Map\n" + " 7 - Ikeda Map\n" + " 8 - Chirikov Map\n" + ); + helpMenu.setPosition(sf::Vector2f(20.f, 20.f)); + window.draw(helpMenu); + } + + window.display(); + + const double xSpeed = std::abs(cam_x - cam_x_dest) * cam_zoom_dest; + const double ySpeed = std::abs(cam_y - cam_y_dest) * cam_zoom_dest; + const double zoomSpeed = std::abs(cam_zoom / cam_zoom_dest - 1.0); + if (xSpeed < 0.2 && ySpeed < 0.2 && zoomSpeed < 0.002) { + frame += 1; + } else { + frame = 1; + } + + if (toggle_fullscreen) { + toggle_fullscreen = false; + is_fullscreen = !is_fullscreen; + make_window(window, renderTexture, settings, is_fullscreen); + } + } + + synth.stop(); + return 0; +} diff --git a/linux/Main.o b/linux/Main.o new file mode 100644 index 0000000000000000000000000000000000000000..639d7ab6ee68de0059dba017804d71a014f6820b GIT binary patch literal 52896 zcmdUY3w%_?`SwXdB!Xr`MWt2iN>>{cF&n~7ZB1YUClY8R0YT9ak`0M2*)-WGc#Q^- zZHUs=wp4A4{;jo@wzOL71u-Z$uf;oFs%W((qJq%BqP6CGp1Ew^oaCsq{(j&0jh>yE zXWn_=ciy?rnH;VxE}fj7mgZQO=6u`fiCNTfR^QtbE>yunr@|>$v_~M$JVzRTnDM^~ z|7#|E6#S#{9E0cU1{)6l8+bx^jyKo|@V{xox$sBeIT6oE1{(?gWD_0*{}dAr!_PP2 z(eMjQcntipCVYnR3*i@;@I?5NOn55%Qap5f136!>4dm{CKM?*dJlpmL=HQv#34a%! zhxZ2NK8N@QJkRb83^@|dK@SIxZT;;0I&W>DB2&|mU%z|`o!Z(_fn%4D%$Zpm*!_W< z{CByV+~>BvGoJe4q09jx1inQgDETm+H>fZYN<&#%%{gzte;aDjsQ(S)3Gh4DvuS2XD+nwX`eIQeXYaO2-Kpb%klS%tDA(;su<~V6mN90?F=A#bG41LXmU<|;6~B*??^X>ywSRA5Sx>zrRCC>ZF6wj2W%_aymUwqQ_yCWmgXjvzeWAh zRA^KxZ2iFXD#}iK?s-LXi_Ux4O+Kuusb~BsnpImAXh2_X*ie%Epa{e7{D+cH7FFyE zT+ul*aBgR<8@OVVY7|$!)0*x$5iPVf5LX5(*{~y6dhlj9`3Bp65Jem21V$VZN~%;A zIfpZ*E*3jSY4Sr80l5w(|E}`7$yg}M-7nW#u)kdnK%T#oJul`wd zcG0YoRQRy)}P)(`C9k`P209{Hb`vw ziz;=U29Aw5&V5{z7(H3G^$yy=HdxC@i9ns??g-V2wAX|RRN1-19I=9Q});wGZr`mxXoB ztkRA@&kH(ExU*utXhVF+YsAtAPG$H%S1htLm>SQ+ba);|?aj4C$;ns_j(muLPa{cXrfC!Y z8CWto!*NQg-;E@9y7lkg@tfbAxMBaX?uLIKH)2yqWFZE-cQ@=vAF(O0^np*gJj-cg zZ9-BzZSQv6$(nRK?k9>0VMQWQ)n2z!23hVfS$;?#iv1gpTB+0q4(Eywv)CLi0#Kk+ z)Swx-W>q>W_FE1e7_=Ll64V{7Fhn94<9ER+pI&Czt zWCz%z054(!$$f|lsg8nTy^N=m8gO0wA_Ln|NJCeQ1?%1-uJjOk8KK#K<#_7Q#oj_i1QIQ?g;8_aaNHyQY&zv`4)BjPu50OWh_A-8EKZZ=FJaN&{$Z>ub*kbuM z2hC(Cb}n^+5?2CZfv@GVCl?Hy1PNH%7VV961xfk_UzAYRBA)7=b-ystnYK$ z8d;Fyz+7zS&5(Q%Vhw z)Y=0xb#j+tf^`f=BDWpuu;gC@Bkl^#gL;}hrbw(lw6@7zZgNSe5dAZima9XCpkrNV z+aTx;D*7p^d00n9LS=y?BB9xV5lccj7^Y3)x=<_Zp(3TpZVlR^K(^jDQnM8OcFE^@%Ap(_KZrYl&-A*HUbGp|0DuvyiKUvaZo; zO7ADP+X16s)M2q%n64B2D7y|}3PjD5Hq<(F{Tpq|TSr~<0orv?S6oJVrOcEmu8f=} zBco*GI1x$JaIX?~|GP(c{}g`(MR#{v=J?Ftr8x);7>t%e0RQX257JHGQ;W14B)d5C zw`tC_%s-|%SI$(#!DEIvPJQOm45uS4{bw1@*0foU^VjsuA7wb7rl)sgC<%vS=>iEi zrw=*aaXv`P{4mdHOV9i$>^zvx@L$q1uM0cR4aj^k?EEG(^YyUv$IQ&Gu=8|g=KEo1 z*+ImAa!|p#u=C@CkGw1FyfrBECt)W!_{fj)oy~`2zMt>Ba7boXzO(93hJSr%=Ii;+ zGlxErhR8dCLm}X|oV>T@F!f)DWxkm2yf!rRseI?*!!sYrckVbMb3?v!(~+6?<~yGr znfZr&=apfZzs`3yeeJL0@SCG^Z_alX^(I z@|=Gk^Hm@ZeEo4sxG8if^xbrVi|~)WS@K$*vn@Ascb@ZNZstGooVRl`uL(Ohob;0n z@;)WAJJ0#(6dK_VdCbguSVOC`Y3_I1AI!p3#hz25#+~-H!x-nv-u589ifzAV2eW_> zrxt7XFpR+nG-^Cj>uUlyi@-WGMLX2eN;-R9q2=?~P|D|~s9*WEi&H*(l(HHf=mPkWyG+Obpnq*)xN}92^+5oMooJ#Q63phjf&6C(k~lZGT!~ zkf{yqdsH5@Pln2dxf3338H24%774m{puX;5cij`%Fy)Y4n>dfDnMd!>vUc6vvmaI& z-k{y=Q1~xwfg856yco+>o2m`OuvnkMhIPBC*i+s1v$Nce?_{}ZRs`y}6CMgIc>n>U zdteD$Vf&OUrGFOm4=g!?+1u}5Zn&@tRxxa=p#6TDX&*j8zs3*I}<~& zIOWdgJ}h%lf}+h7oPQW zKh4P`i{_`@J9HJm{G+dRNDXs(AOW6oy^h%dq#CiKKbGlX6AU_+CkEIVwq4 z2YXDf>R3ym9c`WTP#v>S9V*;Ub@XoMz3ZdpJWmCDixn^m74SLsPiGyi)b{R9*&Fq- zS4WmWF{swNvUmMJp*XL%{iGwlzg+i}q&jT<4?4>>@J!XtVA!d5?Hord{$K7a7;ANB z>2-#~Ng}y>J-hz7=c%rf+INd_sds&SUjI3P)puyB|Mc{iJ*<}0`9JDur>rMkkI$v* z@yqEqn`O;eLs`8X3- zdEAc6_4?dxKQBntj+5^}U{$yMsP%=&pe?=h<(6G;`{g*rE>>rqL)`Xa%m)RVK%q(2 zuSN*{MA1{5r5D4LCGD5HB^||!IQ9)GX)iA8l?SOoq~fi?mc*e*#aXI3Brj<{FN<1@ z?bl$56H~_eDWvu`mKt%}HfGsFah!UZd27q0EKu7iF0k|$IwIz^z|vb3rj{02u!3gN zy@O|`{c>r!KsGFx4U^*}wyjch(w=5DAGYX;eG_S5u1wYS4Mw1EN}6iP==p;*73biL zt_m;!g^KK2(Tl$O4HRjdyYz!ZmYLX7=c)6nn(M18n-fj-4GT^UR>vC6mjQQ+>Oq2=Z1my@zKM>3J6ZDWvD#FDvCtyt{fC90 zMuF5iS#xX0iJ+UzaFd(3UI*hz;Ii9IK3bamyP+W5e$uX6+>UQiO@%U$dJmZV5GvW)j1|1|2S^rVtgl#=1V-7_7dquX&|aPxqHsg`T21#089N@|^t)z(wH@G{k$w^DIi z1bY(dru5$;^ncV%z9*GGZC4Tn-1QYzvYxDbIbx3oOdn#o)OdC_7s&~XfC%6{Mn}Pq z1|UgQwLLe-K@Ln!dgbA$$oK}(Qt%s_|@YAKq4{V9tj+@k(2b!#@J$nkJ-bCGb5IEp1 zxvLATOKK?;CV3@aOKwskEQR868SbU9aE;KWIQ&6z_)YekC82rL68JsvY188HyM&h` ziqgUIJgF*8-WB3`GyT={sSL^1BEsBdSkW`i!!K1C`p9Q9Qb3Vbn!GhMTjgI9s)G-l zdN{Q(St|p0>9QoW5+P&9+Z70-1EvBzCnx___&gyiL^{n$t?6$y{&x7Ln_RCl;^0&O0Uu9;ec>f)o=RD*rV zXogzQ!uzj+qXVEuE*|gE)GB8rG*9P2V;^P`6ks(+eISWOfYr95{E)aN)M*UCSxS)y za#cA4xyJx;!Z=;u{YW5Jy<8|;^@L|ANkI%waePB5f$erK{6%LG86ACi>h+9L2%D*X8ru^$e^OV0L z)N1gR248LPPWnUEgtjaH*3f?C-xSJHYFr;0ru-G5@yfp`rqtFs)J?9slc zVCAAI+IV`vhU|OpQ@>=HgfJyZnv+AiYoC& zNL7+qpeb^d(K6Wes9Fcg^56}XUZ&`d%6dmbQbvZa>l`G9(mZ@Ww>7!dULu4xewR`C?ZQl7KJmbws_gp8Y!F$5Uk{;*QbWhw=Oi zxnE5ciWdRvfRc}D(sl_3D*58^J*00h3j72Yo`$GdBCzbngHeT-p)CcLu0*hCJ;od- zaJT6gS72~p>*oz0)zfq*EA6;d)%5ZRu8G`JKO@>4kF_K?7_k01*R%VhwQhmOO#)l) zJqTmy<|OtQf@Y9y#|jUz(h2{-DI}VdYCv}LriG)JN*&AB4hmqzmWjdV94^zCvwl+5 zLMw}FTis$lQwCd!mSg!Fz6Z={3UW^%K_CdaBG2k*7=zM!1-^;N1<^|2UMZ8R06TjNQio!JtTf~+cEzWQ!P#8)G}^yw?`LPIrmEL5<>t_jU6MI*T#X?RJI)1w#O z73bhhsG5C|s49v}(p=6;_Tt?2p**Bv%WEO8?THD*9tcR>jYa2IZC!Vi??Fzq+k_k=e4=yOKS5|px=OVsj`jiF-Gm7Zw$iw za(3Tj?h4@bcq=IG9j3_MuydaG9kW^h_9SZi_GJf4_Yi3bR<>GKv;W=WIID~JaCfQ8 z=c+Q8_gKkSwY^g-mpE^U;^jUU&|H9->d@N(6+vG&vxOcdF%1|q+Z*-v!V|BzoU$#j zY!%+}*b$;HwWVt6Ma5ak%IVD?JhujxML?~O4B9%=#64ksUVv6`30lFGA9i=QCPG)H zxws42Xjh`Xa`t(V9}}9M+XO% z)*{5+2G@L%q?)QiS$t5y6>ZHA(R%l_H>;m6u2fIp_HOq-Rc2XyJ_3_j=Dt zTk;FEhN8Bvw7}9eAjKGc*2&n|oBPOJtAJ6yTh#I0x9k$I>uRFC)_mG*a=qwcCa3yZ z(e=oI=5$3`*JOs&`Yx^ORD{EwCT1*o0x;X+arEJeJHnqAj3o8CF?A5855&5j`DYJH zbOBYJfn~GcW64|-T5PM<`Z!hb*ddaHQ9!;N)Ll!!j_X;zfpEGu<6;)NKm@6S5~0P# zfxADL(vcXO)>Vy4MJu?>=_*GC+oY5^!rgYn({{tiz8btZN6Aal_vZ>K749|Z!}tU!Z7 z2o2_9gt(F5qHwv%f@Ps1ZO37OVNnO4r!r*QsxY zpBqz(W7ju7qPbV7?U&nez1osRl3R3>*2XoPU)JYkXl&~g4Fb2SOm_3DSNr(;mqOg! z!#)7lV8?S}Z$)G1x?-;xX0#v-FcECva;!k5iWSq21jU`ZLj=}%#gKVSiNO{C0(-># z@#F4ptO)hkXa-MceRwnZrp(iN)pA#lBF zov2CPAjXYi-bkJUe>UzP>yhB%Ba7NTDZ1jgqPC4`MOS^Y6-5p#EwtxIU4Q4;tUALe~xE$-R!_cz}cVa+=8oeE&I0%%cdd>B^E81R+R~0xpxn6Z`Oe8#T zdUfBeT_xaxsh~1&eP`%^2PmBzCH&r=!s=sreBE2WU`#C zum8lRM^i6u)2(mQzbwD!&aFLaN|lf;OuH#fRgHD^)y=``s-~J?O+2b!@in(JHpZJ0 z!RETEnke^xldI}u(VAc)j(39#8xam(6m3dG7a59v(rcTl7A%Z5SRO`RFz5zP4pzh$ zEC35P8fy$ri#D_bJ+3rbn+Q&ew=_pVJSkRRePJ-(6s!S9YET!gYC?Q|eWH0#Fc|6K zSJYBd9}h;V7B)s3@E+4JomO8{17Vh3#Bgb>Y6xCbAH5hXCiSqG6puktA2*|ZL0ykV z<%xKsRv=i_P!nv9w=~oYnj8-Iu$he4rOnk%(P)EYRbJf`$7|HH>!Q&ZXmQ@KFj(K9 zc*I*0P^27adDTVHV0lATV{=`c*bHDefQcr8v$VEn0&wFo*4D)hBZCX$pkGK^jU*@J zplgc8qE#>-%(bxU!e|gj0QFTtaA_W8D9W0m&CS881y#@hRLvLHC#vg$^Q)>aBn8Vd z4eX+^`AzXeusljt@&Qh4X;QW=ud8naG#b$4XjP&v+7z7JR8^g*iUBPET0VKUK*j)Z zAO3X%-X~A1V#cumA}zJGtS60(15$Efw5H0$$0I(euD+@M!uUlBa@gcXEr>P895yZ; z>S>sr$kOY&FeJct@iN?Pd>ipmBbslt$r)3=xFJ#Z|3KOJZUyd2tIDNAe>dgzOO~8rea43VZuc41w{-Nm zROZ$_3l9(bxGr&=k0wvl+OvvG;ZG<{lyV+`de&xWn95(*zIR6c%Y z#OKEo@oDjf_{r0vc-yG)Jx1oR!W(`{_o9m1ziV>}uPYq#_Q_ZM^e5l_mf=&ldwlVf zrjK@;e7S`U%Z}Rf(QyYC>hv8NFMO?2#S33E_#DIk-ZP$fobH`7w7f^o_~h5`KRs>! zJj2g%o_KskDy(=+nKbFtU~VKjzaHaWc+9B$QF$ka3r3irGgJ}5=9kQH(iY{U9d*dS zES_QI0OxlM=(PPcmZu?AM+}nAR>lOAMr^hT7a2bne$0eVpuvl>bC#vM*~8j0rev3; z|6)+~Fd#+QSw(|Y-E+M_w~jwyX!CHBjGa7)Bl8p5l+BD@%XK5>_Co(9qq^)!W4EoNLpkW)JJgD9#S97*Ld* zyDYOPJFo4a>Dlu#sxk*<=S|MeEy@l~%pL~Pi7e36>^zVGE4G-n=_h|solcjFnr01DUvJ%+8wK;f3r7Hyf6 zQPV#jq>5W)i;MbZJF8(HIO?SGXP32QE*r2Sqa$6V>uUp!vzSEX*}+CMhiQXRKtwrK z@R|Uf%O7Qfbl6w7;WtfMe|af;fN9|8r}DzM>5=T5lI*M?u#ib##`K6XZPw($=R$+x z!7&KQBaNv89;qn(l@3re{S8zE+Vxq3(@S+|Dyqa8iD$OSbA!mUEWMQNu@o(SH~K`0 z$~%3qqF-+4zc1+9(kbJ0&3VS)%dChH_^UGq_4vaoS1M8ycgm zw@7wg#>HuUD(+GsFh{B?Ck{@p_CUph=l7;z{U(e&{LPDUwBK@rtsw#(R-}XNGWMgk z0g>#&^htx1AXpXE3cYDR-dmx27LUq~)McnQ*zZhanUWe)+`+0{y<=n?r*fJ0uXbII zbD_Zs;SV*~Mq<$A+Vtt{(=PjTG5d50`}CRFYctc^ZTC%eX=EwIQ()T6FKu0c&vj^$ z!>(nSItEP4&RxN=Vc9{Gvd6a#oRYmVE&b_1+2dhqbd`x>jF>t&2!2ZpzXF6+F_58c z;Ie~OWOfX=HsiYVGT^rxnje4F(DcXzLn*UJ%Upd^TE-^>A$3w8spytYE_i-oc=C>q zmWxbMFlau@vB?f_-tX>@Cd2tke=z17j#zzNhPo`&AC4PP{kRPErJlYC8EVAn4~OAA z4p%WS*9}!`5hiiGp<~-6Zk@$B7NtSY@g~9IA%zcB`Itnz(6K(r$6CVTOv`YNqSwb| zsILq4fkA(4AFvQeI=J&@5}leO;9rd=UC^5*?>qvW`cPjwlg)V^Vd5+woh{ej5GEcZ z2xsZ{AWS%GI^L4(_N!F%egmog7M{@_vJ z22Qo3hYjv}=$}{kx13IcA8Gu50B1cOZsP1e)@3+$nQalrIXzv=tuc^oCnW}-=fP(g zJYsN&Q?3R$<(8N@$3yEfM7yH!DWAA+8qYB?Z(otHF%)~ zjDNSmZ9B2a>kMw&o5de8xNWx<*XzV7&O8ek|4Bn1^x)4JJlBKsIx6kvE!V3C4|?eJ z8gzV$H1Z(=ikF zc9$4Fb-iJy)zEuqhGhyrtgEC&+3EUukeHW;EyTX+d3U5 zs0L*2hL6JO`o5`=dV;_;9CZovhA1K!30geSxCy zS;yM*jETUHb0!+?^j?FJX+C_;_u&&$_%SIyCz;SCK76kB!LRkfZ}Pz(@WJa)udJ_? zXm@n>T;(~?6W?QSd$#hn!3$9jbUZ(y%f>3=C#3i+Goh=1_gAh}ias|* z&+`?!-}=z6Q}iclBK-1fh3+ZChi98~JQJaN-3Nc)@LBDlPs7kQT%A7X{OZgE!6Cr= z(?8@xU!d@wb-q0dN&4`4!iRo1hScF=U$922<Xk`-{^xs=!3uDgTLZ~ABl}cfA&1s2S3aQKiUUB#Rvb65B^;r z{2Cwp4j=qcAAA4~koqex?^O4Pf6WIU?t`D~gOB#Xr}*G=fFI|ak?N;dhACI0@In*Q z@4y&|`|w%igC7ot{gv05hWjC-sv8@f%5zHdFIc3##q`GE5(e*kFdWWnh&L_7cL6Sm z)~K}RmgWR%~nrNlEhNN;KabXmpa2_tpm}?m`rsp@;jxAT0sEX@n=vx^^ zpDCr^nOIa>S=rn&zp|uK}iD&l2{`uZ6)<&|2D(x$Q|+MLkwi7}Y7DArh4)sw!s zCw;6+FIj;4i1tv8wx#VM3>#}S7`4N^Cse6HrFS@g1|&tB&Q?|{o-w_=GCW#C712eB zmZoU&jHv|2Ov0rbASibN*Lj+Y=l7UgYhSCH&v-@_SL(N-R)`iX^N6{;23!hQj(+Webm2h+>qlaw|Z^!zv!mR}_k8 zSc_HR(JFPcN*$}jj8>_mRo()fsw9n8EDN+MioQVM1xka_3eQ(GV^pp&3K^rMj8Qzt zDEcwFpt{g1wLs@mJV%d4bx+qVC^Dw_BF50T#-MREMg>s7x{>k8s2m$dcgt&OsQ+$D zw6ZbLR5G3MT3qI9Ufi6BE*w``S-ogcI9$+(`&?rxOY55xV=7A)HpYslmybr>t1uc+ zESiWm6&Lp~wHd?t@-rg+_4x8CcKbnzJLw!OSX=-_5Om$*$V-%9d*Tm7n zYoZOs)kfx+%JN1u!xl8)8fBA6L+SJhm6Zz`T9h&JD@)_m7gjdLaS3s8aei?z6q#08 zQ{UVeZ;q;32IV$OXz!YmCd*(mx9OD>Z@`V0Hcd)s!_9*3tM6;aL(xF z+C?_`oH2D#+?Y#6$JOWyb18sU8!Jmd6O??B0$@04iZ50L7+-BJ*%`LYYSMTB{HrCQyr|D(oqJd7+wW}&$5h(jqChD3n?9Z>N zsjRMQR;?nOSC*)V<31*CXx7xss8@sS=Z@S?|!bT zdc-qI&7z(PVLSBD7!@srZGx$IPx&=ZL9a&99)pcDGhjqyQ6whL(d^3`XpLMn_Rkrv zJ!5orthj7?d48oC#dU-FG8Ide_CQP-XSP#zeCo7C%d?@aJmfQ<;%^uru>o%xQOU?-O6UsH+xli@psDe z)FP#Cq8tEtKOeFb^MVs9Y}3xRgmWRGS}dyFcW5By@LzO zHPLVZBuApn7virM7`IJjY%E?~6^q)&hBA&VSKomHqE~1MLqeA2HX=$sR&No)EEaY? z3!_cwi>37o>l4KnSexc)nu%DTgeQP*YIO08Xd^mpaYNO7{Ao$?{QfBOo1$2(HYX;> zt6NOlhJHO|>RYuJsO^N|Wwu`7aD8*pMfeLAO47w zqN%E(S*?Rnu5cJuEsHnT^Lre<8hlR{Q&Fb06>75V-7arxt=xhP(|6PvI>STPgqjvPzBw!Z3P|{v|BiYFUk`!WA^e zs`M&*`c&2AdV0aw`sVMTb%^HJlQseSjaczT`0FW^j3bn4OkLnyo`^M; ztqYRyw_7B|nE|%`wt9P072prO%+NRa}{v?xk8PckdQ9j=QtoX75c9&ci@x zk1*^;dTe=PQ+I<>rfU3uAt-a-Blrr637^X3Pv1+K)Sp8vKI1HPlMh|UlF=Q7zYLZCQ zV-JC)TCED`5?f25IC{U$c5bYtTl6@vR!zj(T4a&k5fihW1T01Gx!0m&TN-QBYLC;n zDV(Y(_AyI@rAoYUaYejjVbuaN=rehYild|B&+IDVUu0}|7Q{;H8=_~|*WfRz7U(J+ zU5n7f=mKn&7sO_%zl6-MN3ghoTNBa$n=#p@y0}r*>^myTQ`_Q-lAhqK>Da>Y?4fFY z{YBw?gq!OttFbL=uH-2O_O`Wg7Pg`!HOk<;x5k_R^STFbh2igWmHUIhd3tQ|ZukB;Ema)VoYeufDVjj5tLF@zDLu@Ub{v zLn!w<4}P@4pAa~MF@yizgVz}RpB~)Oe%py_iw#a5 z*Ws~tSSfJc>9F_>g3lO%-zxBl0@oiX>#-+Z_bazv&{KAS!8dwvdyjIPz*#P<&vp+^ zUUaW{aJ)uWZnSwHZ|l+8;WUAN84Y(R|x!10$(L?-W9TP zZxi^R1-{1Mw%)CMJ{I)%3i=bw3nuD$pTNf$oP6@|tiwZhs-V9gajOsSBhiu1GCUSv zB5?As_)i7?M}gla@CO9GR^aOe{EahOE1eck__NT&-Z3l z|EUJ2w_MU{T!hW>Fv$ADi3}V(&*|vIQtmgcRe^>qbpZqeCp5k zY1B@QH^e96vE^EYFdgx+cr5;Rf^e3P#m_SZBreC>O9eg&X_h`I@QA=~GdT5Y75Ke^ zzF6Q-2z;`@52qq<^rqmka&HkhW!UlLd4aov{tbcCZnzGloSctJfLQ)7kqD02q#Ys@ z21oo%JeGczz^4lQT7j1ee6PSM%8pk#qPSNSY`dkfqTP{29QcRoR<42#G zXFT-ZM4XO%qY%xd_U#-o)5hoXJkA4AMl`~eI(8~h|Y`0HQWc^;)Cz@ z!R2@;<#O((^U7VM;Xb&X_r3HHANt?;;J7BN9L@J#Jhoq(YoKZzqpW|KeJj_}bfo7P zXz8g39q}9R*!g-GK{(>$@mP904ilIBuR@&8Tdtcl+z01cn$Am~ZTbcI%W_Q+xYYkD z(T{$DJXTLT4tUFTyWk_s^@_k{xpK$=&a3B1KKNuG{O1OzC(EV&Eec@7Wx3uLd}O)g zcrM%Fb%I{ve)VhrvV+;A9cCa-M_k&0Jn6i4xLLz}a5>*eef;#d^A6=o`@ zN9iNWdzjJRtLGXYxpur_vaH_=H2Xf~{kacr*Ey8C8jtOFT=UR*_3;~5KhflU=;e8u zY(L-fDX%?e^OnoD6XMd&e-QO9?finkCH+2uOZsmLJIi|cwhu1X;hf8?-G&Q0+$Qiw zfz#%eo@+%q+WB@o7Ps>w#ZMPFY3NA*Ydn@dhaenrDR;6$HNFO6OHZD3r2j1*i?dC!79qDhyWBF_)2uED5f3_)9ac`dWdL-r`pqoY+GGzeV5=3!G<1bhOWR@K`YSh;Hjy_DN2a4GjuflIkh3tY_XP>qBdO?4xz&8oJT;NX&oPEync~Rip<6C@(z#jo_`^8>?&l2=+u%K|%pMAmd z`B>ny1wPQ6=P>zEfqzxtj|p6!=bt8Uc@Fjfm_i-rhaSAf;D0ta zX}OoNa<>Y6o51bg>5*Qx+t&qusn1Snwwl&$$Ah zE%4_AexBg-yuhP^p1cmBAh;$${{rGxZik?sEAZCWzpn+v~ySDHLCXFbhHIPI}vqhI;TCLqA;L z)ZfnIB?2cO+LUgFz-4(a6*%cR=F%U4BAN&P@PXxWS z^DcptPYoWrgU!K*wOgS=VLyYDR*om%6ZkTuS^ld$d~CUH_uy78|Lr(BFaP%hF8Sw} zg(mfs_Af9v`N(l*hQKACn*@Fx@>u=v6S$;*)ZkVw<F@v`WoaM6m+--1TFX6G} z+9dFo1-@P2uLyjH!2c@nodSPV;QIysn!vx3jR+j|k#fIkaIgK36ZAWf$Le1oaH(gp z;KP1onz2*q!GlPnTj0U1-L4hJ6yuhWNrx={|I8V@z6ZBHg zi2{F9(4Q&r-wS+(z@?rI0^cI&FEP07ch(M93wmk)?+N^8g3rwY=UIy7^E-jRCGfiq zZrgJNX>{v7xb452J-D4`pA`7%$ZzF7FYqdXzawzgeGMMEe|m5`&U_+p$^R=kIv@3y z^U>D@J|AgTpA!UrhQLP&T=M_6z^NzG=w|rfR~VeMa=&w%pqF~C7r5lV(}P<(@A1J0 z3{h&O&V{Vq4)MW{6FBv;_R00&)QK+7;EcE9vGk`3dZ~Y@z^euQEWzjR0>41elTQQ> zU6T)fvEcI$&{=&h_t4KH6S!+U_*@M;zx3d?exDL}9%yq7{ig<}j(@~s<(~f)O<>!h z9nV_~PWlc(f0dxG5%_X}%l$%!;3M}7KN9qmZTBg^67)9<{_6xi>)lL$&Z7dSuIw9h zPkC@_pH~GQ1)a6SPJxq88JWQC^Wb$Fc0TpsuE7sB2bU}p`OGu;P!DePIog9q41Gx8 zEbmZ*hXp=!n0I$Lcd&;O`0iM1ijs_^ATlE$}l1 zzDM9Q1b&;qHwb)|%$z)|i5JXX)a2B-de1%9Lt{jq|6pP(Nh z@P7(?uE19aJTCD675K#lr=GGuwhLVL#~*lbTdunV&axHYq1)uaYc%XUA#gc9JmbNS zHuP_L@Swr}C2-1(8T{}gb%2;G?<9k>yd3ka{#Anh1A+fc;2#S7R>9|L;D_L$yIat= zA#VA13j9w3-y--t4&3s2MbPgT^!o(<1A!kk3=ue%_g8qV-1802@-7f~RN&7E`~tz} zd4b;|a5?X<5qwyWR_>i1oO;o%7kp&DJM^nMoqGNSPpOVN`9An=AN(;PHwQe54WDN` zxV<0nvIl3~)BVkZ+j|DPJUG`!RH(L zVh_GflRMKq_=^Ug>A~&2mh(Kgz3&_K;CC9i3q82K*W2R3ry04Id+?bCU+TfT4F3)f z{=UI~a68^xJ~ajpD(*e}%gp*Uts|T+z_!19p-&Za7;ByWA3J*Td;43|Njlr+?;B^LH z<-wmd^?Q>C-)`{L9{d%9-|E4482ok*{-(j#cyPOKTvXpzVpbwfb`7aW9uD}-yJWt@43w*r5FBP~AlK%~OtbP*zw~fFL znlQ(cOcSP8V8X-?GGThI2@~gI-CPr}c%g|mdhnGdF55ZtbW&lsd$gx`6K^#_9{1q( zJL@|HKG1~e{Zrs%vBU5=+Q?y)kNuu{MBuir$>Jt~o1=8Xj=ldw9_ENt;r5=t%(ED0g#@L?eud!xV=vk z6*%QiVIH_O0%yBAT%nHhCxMgxLW9e{|D`^S27l2*Z^zt_8H}hS`Ii{_lLb!xKQ;B@ zjA~xIFi|xhexgbHbvA@gnpKVBhcTT|_*_AiGirWwv!j4f_(p*Ibe;SzVTu5s`S@?Y zPAGZ(m){A*hwn^jsJ#AM!DoL4u)iGY(+B+~@LOvlp`{^)4-m!{JEIm<kp5@=Sq9ElK-A>ABMi4VEXK@t$jhg4&W1Kf+N0k z+>~f(G`jM`qm@-nO;u>S#>6S(Xp5^TJ_4(3rAbnx_^yZjEQn55bp%TALRFqV&FBI$W~)z#l*#xct8IDKlz8Qyd2T65M2r>vpb|>G<5Pd`E54}yH74Isk-zQ$^4qk%Gzm$K$ z0pwrPk9@8XzNr1|zCr3AJAnKf`;ou!0P=6^Cx62MOR-(n3w5H3f1sb8)Q$+Iwp z=)m@b_VWy5_Fo=#Sa!p7vRX@1lv(Z@6nD$bMkzOi=zz^{;gJXs^X9+D}`=uF_4j@+FAy zN+W-(>9CZ~eY{tGm67ie<5ZY)#alcAJyBTmYd zn$t?dkophD{oY0T_Y*bu-^7D?+`H%AqKwkL=BY%JP?=VHKTZVXl^^kuzw&6E-~KyuI@Y)S@%>Iv~qG0g%mS@nevg z?a$jzbBz4oqJ2we^D__KNT2)PyRh7zm;R@t$Z6l7x}4T zp(p=#UKWINwWstiMA+uHd@uKrpLK@Lm}~M|&*ryrp1b!aKWHZId4`bon~2BexAIq8 z`G(GVc}9Mr1&kl`#Ba3nJ$S2;-)V5lkKpmjzthM!%OyjNvl1hJM+(sa+kULS!6$!N zp{8Hy$#3Ob{~43t+kbbM{FctL@y4G-e*Etka!ckE{$2;IomqYtkIirK9X|T+EY$hQ zTRI!JKEKDuHr=QF7V2D9p5@_Oj!M zt!Mk6^}lKI+jQ#>E3%>9zRhRR(@lO)_j7E1*Rz4M`rG{DkYAPG0>*DNaI OrKzT&eA0RC_kREh7Y-l* literal 0 HcmV?d00001 diff --git a/linux/Makefile b/linux/Makefile new file mode 100644 index 0000000..c8b587c --- /dev/null +++ b/linux/Makefile @@ -0,0 +1,19 @@ +CXX=g++ +CXXFLAGS=-std=c++17 -O2 -Wall $(shell pkg-config --cflags sfml-graphics sfml-window sfml-system sfml-audio) +LDFLAGS=$(shell pkg-config --libs sfml-graphics sfml-window sfml-system sfml-audio) -lGL +SRCS=$(wildcard *.cpp) +OBJS=$(SRCS:.cpp=.o) +TARGET=fractal + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) -c $< -o $@ + +clean: + rm -f $(OBJS) $(TARGET) + +.PHONY: all clean diff --git a/linux/MandelbrotMusic.vcxproj b/linux/MandelbrotMusic.vcxproj new file mode 100644 index 0000000..581158e --- /dev/null +++ b/linux/MandelbrotMusic.vcxproj @@ -0,0 +1,140 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {22F2085E-A7FC-448F-B674-172B2D20AE70} + Clusters + 8.1 + MandelbrotSound + + + + Application + true + v140 + MultiByte + + + Application + false + v140 + true + MultiByte + + + Application + true + v140 + MultiByte + + + Application + false + v140 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + + + + + Level3 + Disabled + true + C:\Program Files\SFML\include + SFML_STATIC;%(PreprocessorDefinitions) + MultiThreadedDebug + + + C:\Program Files\SFML\lib;%(AdditionalLibraryDirectories) + sfml-graphics-s-d.lib;sfml-system-s-d.lib;sfml-window-s-d.lib;opengl32.lib;winmm.lib;gdi32.lib;glu32.lib;freetype.lib;%(AdditionalDependencies) + Windows + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + C:\Program Files\SFML\include + SFML_STATIC;%(PreprocessorDefinitions) + MultiThreaded + + + true + true + C:\Program Files\SFML\lib;%(AdditionalLibraryDirectories) + sfml-graphics-s.lib;sfml-system-s.lib;sfml-window-s.lib;opengl32.lib;winmm.lib;gdi32.lib;glu32.lib;freetype.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/linux/MandelbrotMusic.vcxproj.filters b/linux/MandelbrotMusic.vcxproj.filters new file mode 100644 index 0000000..193eba9 --- /dev/null +++ b/linux/MandelbrotMusic.vcxproj.filters @@ -0,0 +1,38 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + + + Header Files + + + \ No newline at end of file diff --git a/linux/MandelbrotMusic.vcxproj.user b/linux/MandelbrotMusic.vcxproj.user new file mode 100644 index 0000000..abe8dd8 --- /dev/null +++ b/linux/MandelbrotMusic.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/linux/README.md b/linux/README.md new file mode 100644 index 0000000..3cc4a17 --- /dev/null +++ b/linux/README.md @@ -0,0 +1,36 @@ +# Fractal Sound Explorer +Explore fractals in an audio-visual sandbox + +Download executable on my itch.io page: +https://codeparade.itch.io/fractal-sound-explorer + +YouTube video explanation: +https://youtu.be/GiAj9WW1OfQ + +![](https://img.itch.zone/aW1hZ2UvOTM1NzMzLzUzMTU0MzEucG5n/original/ay7ju0.png) + +Notes +--------------- +The fractals are designed to run in real time on a GPU. If the program is going too slow, you can simply shrink the size of the window to make it run faster. The rendering is also designed to increase the image quality over time. So keep still for a bit before taking screenshots to get higher quality. + +Controls +--------------- +* H - Toggle Help Menu +* Left Mouse - Click or drag to hear orbits +* Middle Mouse - Drag to pan view +* Right Mouse - Stop orbit and sound +* Scroll Wheel - Zoom in and out +* D - Toggle Audio Dampening +* C - Toggle Color +* F11 - Toggle Fullscreen +* S - Save Snapshot +* R - Reset View +* J - Hold down, move mouse, and release to make Julia sets. Press again to switch back. +* 1 - Mandelbrot Set +* 2 - Burning Ship +* 3 - Feather Fractal +* 4 - SFX Fractal +* 5 - Hénon Map +* 6 - Duffing Map +* 7 - Ikeda Map +* 8 - Chirikov Map diff --git a/linux/RobotoMono-Medium.ttf b/linux/RobotoMono-Medium.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8461be77a38bdc0e47b678f1623df33379535d8f GIT binary patch literal 86820 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 Ce6P0v literal 0 HcmV?d00001 diff --git a/linux/fractal b/linux/fractal new file mode 100644 index 0000000000000000000000000000000000000000..10e16ba5762a96dd3970295c14d2b339f46bb41b GIT binary patch literal 56624 zcmeIb3v^q>wLX6AM8qW6a)5w&3#z0J5Fja`h{J)Nq(1=_IpUOy;M;mN<%`H%XBrKt>-AHTsBaatNDpeueonH zY$O9N1(iLiBR@6Lp6SraLbwzpFE2uV8m}jID6|NwhMv~1^!nOlxpb)b6;$=ry%}rz zpVU_)%k{3+^+<=0NC#0+)prrf(VqY6CEZ1c?56TZCn@h>N~95s93f#*K^?vm4< zzw`V%XI?+!j_V_9t55o`3-(HHV4>mHgD}w1!$|@Qz#m7V7sKyHqQ8YwBhhD|=8@=Y z#*9q2!k#1XcfjFBqBk5lGX3GBMy8L=(B1$5EWa!RJ&-~FCo<^yR0ccK zA4amn&oi`ZUj{pm${ktGa~bqmm7yOW&A@+0hW5Ub!Jdz2@V9$2@Q=cv7|9M1*k4Y? z!@T;Z8T7PduxCjI`y7*jZq497w`b6^93455{y)xOhea9eKQ@Ct-^@U-fSx1S=b{Y# zm6t)zUoy1o*$jTTH$%JfGxW>!4E-`8!}#JvIg&kBWvF*m20eFVu=5ES#?d!2&^;OK zvm`@%pU>bwXJpWSV+KF}Wd?n|%piYj2D>rL8_AwqGRXfdgFQ!Q=&!3Y%x{x3$Z=(; zwmi_|+LB(AR-x8G-(JhVi%wyd(K} zRR%vS%FwR<4EAwn@PAi^{&m9+r)$S+{den)*eu&J5%cg!?G0cYk-zUAozW@z--VsW zYbR^Hztah*PF!1|59$4qo-Z>x(O$~gDCLw%ehcK2Uz7X=l0F}Ll5R<(p9X)RoPv9G z#zx71is-Lg&EnDtU=!Da_)j_IQcjyr)->0W1;tU{w7OWtA6!1$?x>mPshw9Bn-&Op z+ySr5w%g_gYQ51=YsBN7UF=w)N?q&^HicFmN~sh)RrT{-P2Pxixj!27M(XF!4upc< zdiOGlbuDiR1zpjYI}&rbG#6P%X4KWwD=PH_LQ!w3dV6uLH;4-AV(yqXI=#~CbGHU! z4y9aOvm2R}_96bMI)A-)Rjf7Q&71=>s3w+>8F=ly1$C~HIiX<8frK=d<8szD5B8fb zW!mkYPdFy;A2Zt3;AU(^18z zH(HfeHMr{>7uMNeP+>Nq{EVnKruVL_S0Y9pdoh^i_yd92p+G3Y7MAKM$uwhD0G3{W z?h_TV#igQ&c3afF!do9gSzW)F-R46&x*A>HGTr6!tXgHamxSH1W|pj9L}wFfDb1(p z-2_42*utRS7mBn9J!7h{y?B{B>i57`=%H1fx)_Yy?2fo%5w|}Ut@1eP-1z5k_@uJ` zIf?$1%J!04uP5dXE)RI2Z&)`2o3hC7U72zZ@>Ka8s%ffIkPnMaUxeIHq`2yGhhv#k zRduG`>2Pnadj#v3iYotEAE{;+2SVO)2Ju2LYqX=%MW)F``6jFyT(xY^CZ!&{X$ z>ZjI6+`%Zlp4!{(sJ|u@^~e07;7B&($V=-3yAAV&oPJWKu@~3Hyg`pYu*e-~WpC1z zIra|85K|a3lrjJJa`b#!rtJ& z>f3Cwu$NpWbjweNwS-5e9A&s-!)MSLi~LRA5dFnof`XOa=oPV0Son`BFXwSPU1v_j z-Qta4im&#!_+vxMgWaZAKFb~TPV+}EL@S26%8+O0WIfNjy4D-^x?_$YeWEEfTgaLY z8FZ!dL#I(#Cv6{HyWE0 z^0Y=%V(j+1P;0OWOO4mvQWAyDM$S^9gXkw?nKE`0MT}goH0(x`N6xd`{6P#LcYyQG z<(G?SW`&r0tKga#02DjB*&Pge16(`mie0HGd$``ir#7Q{(?Y@OkZe?al^9sYY+>v} z+BAc0LadU>PI}a&4^yKwdl|gK;q##lHIb0V8;xR(u8WoVT7w==6jgIp)XekMUS8v? zD{)~YY0CqPyb+9|Vn32%A)o3)s@fm)UhHp*H6uL>QCSes5p3c(NdA3R97RZ6%dU_!LpL}=h%=3imAbEOZs zqfr;@aruM3keoJ+T*W96^^e3@7c232BN4=uo>gvF7?GW8g+CH&bq8bv{)w9QsjjM) zZ~&odz>7H56L8clfKQYPDm6jGG0o+QHAg}#UCZ1}E{{7JW5eoV#dd!v3R=|b!WnbK z9a#I<|+n?>=uSRh(;Xt3m{1#PMxQiTvxVSHA3>RpbyQWrvh=onln zI==4T4!~wWB@g5=z-{>-%0Q1}&w!vp#raTnhO&Jiv>b6Dx;hl0s!=#FKAuoi3x`%B z`g66k2AVumk!bR-5Q&AsmDr)Uuytu|@q&&{LLiBCCE#U$da*%h(qIHcw*iMM0#lYp+~H=wC(2t3Q;X~=I+X~mOsBeA zoBW}4q8>OKsB^1{=(1u>p0my(I*p=RQmN%0v?|5s(dl!mt7gr16&Fn{)>P77l1fe; zN){KDYIA4Lc1X*3se)4>rN_Izrr4)N}PRV>H4eG#nU+3ma@;I3^H~|FZ=LHpUtb zjZzmj?x5qi%Ww^8k*Ap@eTXApV;ObnIt=BKu9wFVh?XnUq;l(@g?9AeY=QT?YVf)L z`kTO(tGz5~Hwyen?M;b4An+V*K;o?@`q88#w9kO^%7XlDGS3FQX3}ajE?*myr`OTA zZUrKUL((I z6un0tpfse>8zp~p8r^oEE+?Eu*StD?RT@2C(%aJLHS&CAQyP8KB3;g%Y4mGHeN=oU%8GmXAp z;yr0}n{4mqGT+-R^>MD@-Aw8ssg!259 z^cDkMozIdUG|<&~E9qAn=)DFxmmBE)2Kp5Sy4Is3TyNNBb>$f7L#r43)Ie8jDa#ZX z=v*n)WiimHtGWseboQ~jYzDe<4Jz8R$*}-EN@Q80f_YdV_&J)j)4F&`S*TW&^#{Ko1+}(+u=g z20EV&P*1N|EY`ke;)Oar~gKtJC=-)x|l z8|b|TdWC_$$3UNDp!XT*vkmmU270A|-fy5g4D^J7KF2^GFwo~3=m!mSr-81?^^X2u zWuWI6=oc91`38EmfnH#s&o|I52KoX6z0g3fG0<%W`b7qMnSowwpqCry^#;1rK$jt) z$gMHZWe6zf4F&z+nsg-?f0V{oNdAr|D1E;D}>w zZ!CMT&)L2sXM0NF!P3W(H8}A}{5PLgjudgRvr6_4;+nXPIJW@FK7l_(oS}cRSK#*( zXUL!I5%}H28R{oD3H)~A4DplQ0>7C!L;GZ#z;7VVWhNOG_;-ot5N{OtcZhQjD;1LsyeSuXJX#2I=gZ32IXI79BFMc}U!XQ-Xb7x>G> zPbIDi{2Ah>5g+)1?SGuOg?PWfw-INEo$M3%L&O7C!L+xanz;7VV5IY$b_;-mjv`#h({5!-MQYUK!eidv(c zH{e06;}Mw?OXWN+b8eS8OOQj+_k&&?|2Xkoo$ie9OWcNG;WLL~)_iB@H>}S1U(J&r zur^}uPy8MO&e^%f>V(cOMOoE8XS~B&j(It84| zs99nTvpOHK?ghVd?O+W0K447{nfztqF1Q662=xgH zpigqr5a;zN&g-bwQOtpr8fnAURNfWL`$G0n9_9)5(OV=gW0%4nRYXD(`Gzs)93l&4 z&KX3U5}82cJc;BGDU!%%aN^|Y5_t~@TKvA~;bAQvl-~2C&hgZt9DfCeuY12a-?VuR z4Qjd)17p8=yy<$NB>$M?xM_)=J5}ahA#*=lEpks5=y+2#;D_dr>142(Cz~cn^zYyT z`qtH&w%vRhW~qvcD;8BOtf*gD=e+ja1g43^rw0ZHJ9^C>pCcxzhJAYw`&4&5Abgc> zb@Rc&!OgJ!pwIk%??ViPoLl=Xu(GqO^d8Jp&fV}>l)<0q#$F`Ytp^Fwt$P6Ny-e+u zl>QWDfE4iBAlBzJ2M^kNAuRzac7*4%Og?kWf!$0OAPq_2$U%xsNLr9o%!Npkk>aZ3 zF{{%&Ue_Zr0Sk`(nd<3J0U@D za98OQn4#%ePl8j>q^x@>EBvMQcE;? zGazm1u>YOp^+3@&Sf1m*I{tulBPfKM2&oL&dVsKW4Tb@6PAQ@@^ntVsIpD~uj^ANz z5asW+GI|A_dT2hFtc?lLZ{0{qJKiaXFgh5h03$fcZv*7KQ;vL^lUft*k#H|yVh$&= z&KpHROo*nN=oc98e{Ax%wiLx;KBcKMexuObJRbSZTxX|V8OyREWOD-U8l9~rPX7nz zrH>Pf;h=i+(QK;Wj0<<5X6S{)3CP#Gz*Qn_k+}F{*###f&ZV(9Y0}i9WTmw+;r)m% z@QAfQW+ZL|ftpvNpV1%4q7h)VJ*WjW-fQgzq#=3$6JFG5E;M};+~&elE@q)uP{Cv7 z!U;P}^2`}vvXYy_5n+qqN$b87*o3gBDGh%o90aC)Ch#ClC;)H~S;2_Q@ zpB5?ro&ES6ppd>E85{#7ZV+kn-r1uhz zzt_rFoy_C!upSifR%?z><3?+NfE%o30^VwMN_vB&uL6wUYV8J~MVBDffgNuIDq68o z(rZCytL_Az@S?|Pj7NZM;bfC|_QS!!&fISyaB|o&L>_b4pK;hQ&UjCb@T$$n3d%cK zt$))etU|hEmuX`_w>vAun%1WJz}}0BZGs1#mqR8vW~H?-;S=tq`-&4Ix6uBWaw%tg z8+pQsZKt9@XTa**()KWmzMmMtm_v1UT>(uo4KR?v;%}M(8_-Yr=~)`DtMu21 znD?8Pm@2UlerO&K87WV~{_(HX|IHjy|< zw9zke-cOTz$+76~-d&Z}Z$phK^PvW;vH@)ZSPuY^wqYVMhE#OQxp1RsKU}!dx|;vK z#eZusdsbS@nZ*Qx5y5Z`Yz!N9`+P;_(>h3mczq^Gw4)hZX1g&ZLBiGica_$y=6klZ zdth*|(){2Z)*a|eN5>oHj$0t1vU7vz+)B)q4GV{t)tp(0 z!G0L}2iV#;yJkKY!Kk|J1DbAk;zuWF+QXdZ#d^-3x^@TG{`lTYF0EKvacRY66|U_l zdyZaqBgzW)#AQ;zA_&;`IL}K`?cw;`UkSH~T&ZcDxvTJ>{SHT(QUD(WEENzexxYcD z`zp+Zd*XXKCu{+--@N$GTN9`G%)zI@IPni8Rhkz+m9+=xDVu;keQ@%&{pK^bbxt@D zl9Ac)m=6L_;?sEF{tEMDy`ucG7g6b8R$u1?k1k_;?(5-H=}*b{*nacU9r!$nO5Xy6 zjKbaf%?-JeSpp1O5p?CAOavMr<2B$Dtupf9WYx(>M* zQJ5U){pL%0^^v9zvg)ooL{G1;wA!4T{d`p@&>G`p!2ai2&*2Ym-3`D;R_VE$k;c@` z$@d8)wM5T*=y~h{$Xh+*?bvuOzrumK!dZ#i->0*%ax}nXg*r+uCxxScLl8X^4O_x6 zjV1lF-7TsvETvka`YY@BChDM<==CW1Qf>?92dlnb3fW6SAtf7AA*ud3lT)ZaPb6Li7I((C;#kVN5LrT?&wx$P^ZS3o+qC_iq&gfZa< ztfk9T4IrW+Oi#?*fK1}$X?RT<-k64m)9|)5ygLow1bpo?-yQ=MlA?D)2(g>2jn#0H zJCWz?EYBa(3p?<9u|?JuOT2}yU`SfXRq5lz7`D6XMym}4tK)Bx^c)&XxJE)NS>n4m zeGXv6Cq}=6d@S;e<+h-Q$jmK^E%6X?Fc(jSR$LUG5Cvc6I>CaJxe78dgLfRHBjVn^avH1B{~;pC(iiGV)IjCO}vK@!dCR54Ckl;LKHn9TD>2o zpFfY3w-Yx)G7lZv!12cd!S*_(zDo(nuRl{Sc{Xqn05bD8BJ<or-<&U$NDwZi;hwe=bil_tK4;3&BmTs{@ApyV3()!Ue1ko=Yw z3sR5o`59ef<>YSlnX~lBsWLv{&#)m@>0atv8Sh2L26QdsaE4ZuGScEA`H0{gZ+ZYw zj}!D#%-bmQx&cusmd1`ZvA?S1aLN6wnf9OXIY4FnzY^8s#fG3VZmI=$@=x4{@mvF; zqiHnu<_I%_dlJ*c7}6uJ53yRIFHC33TFwAW`~v?56QQ>`6m}<;n`HpVRhH@}es~5-Y(WXQ)3>vdbC@cw@gnu0i08M4DpWMoywr<@AOmFvNs?0`7NvzuXR zEx8LPm*@icQRUc}b+yC%;DNbav1wUJ4?0!E`^h@7rIW$@BpAw$nNOeb5@X(?DIc+J zf-DAQgo((TH0G;Y+DPo0@H;rCGrl!(56GOse(;7~hMUU73nXHC<^jX!2BsV%r2wY<2S!SN}Jv;~De)tQT!aDYW%< z5_pch8{Q*$wou1R=g_B%Hou*y0!)5g9F1=f+b=Gy-B7(UzI&JH(Qk!2r+8^I!E%%v^#XeyC8fzIB_BM==QY~b=$ zg^9l%C90XqYC4f2q*E0n?oF?T!ULijYynW=P&N1C5Ev1mJ~ztA6Iy>O`6c#OoVl`5 zL1H{Q7*pdjBz%CwM04TeiJyS>D0)as{P%0Z|FPLb-PP7|5fC6lnHyE=9gT#(VNA3^ zd(0OD;DXJClgvjap?v8ns1TzFyBPDjcQFJ=`>_XWYiH?q0U!f6HE?3d^Jy9c9qg+z z2mg!(b8teRR}|2Fh77ivhA|m9toe4@EHkTl<+SSz9!*k67FYD#&N=8 z+PRqiF|38`=ArW<``@eLPhaMYzwT^*W1yxUXP-Peoaw+kFgW4GrJDB95U+k7Gc&7^ z-D3LG1u)}aYyxg2JqSiV{&Hk0{=nUzHgq+;;b}4=t|yrMr87Q&t~?)M&?sltF6Yx< z#*T%6wNgONV81?YRQV6hr+(Ttb1hszYdveBvwh~d;6#(&j2-3docT@2Oq>9RNi;#< zU8YOHmvt%1^6pa`7!jwP`e||{GE@4P+^|WVGya(~KE~PkXpRLUe)%^TZ0OGKnP}d# z4Xox>-uYeMPjkL1?h{{$Kf|Lz7&@ssW{El;W_`RR`ZX|y zL>+6aIbchi!CEkIb3{FfcCxqcfP`1KCua6lS?fO zs2|M%k2CHN2a@?LWu83Rnz)yRx@yp(*Kow_jE}~7b2c(Dfq}c8lZj0bh~!kp-$~qz zR*2~cM!^jl-rUAb;tt5E?)ZS)jzZPy%sE6+|cAgGq$B7`R*{s=hkk zxqCKs6SwZ#HI(G#Y=8UUF29iW$wA9Qw}PY1%d3)57|#mIxQ z9ipA-^6Gaa34NAZhRg%7P*G!FgG8M&k<_;WG=6l=){qte7?xc z7n%7YGas2Kj0vqUnY?t6omBV~K8)L9qBLXGC-#aJQV>u&KgpSF$Z4STV;rC`%_Mxz z0p1H4f5qoHd_Dq>Bkjd|@qtm6z6=`rlC*{w(9V~yvV*b{A09^|PFxJgo?e{52j*J} z122VH$3yb?NgNYw@Jsmgv5+$k#gM>VYv=}+Cicbnv#p6^pf^Wr0X-Et`64I(Y%93; z;`8*rbzCoyfxgW@W%Swfk;OP;7a!=i6goGc@5i5p&v6ESI}SW%osYhl>O6KJK1-qf zkbf?8#{VHEa||HRg%6EE0v(yqUZiOkW6+`|(Wm^kSakF#@QmWnLJu47pFp0`H>o>y z#6a&t_~q=1vGemyrDq8*{S*!TZ)BsVA^20ImI_}bt(sljz!Q6Pc>ct3D1l>(ewH31 z(o1(F76=XLC?Gcp(E<7x94H5(_d_Uq_<5vv;qxKVf5GP;5c(`&J*!xX!+yO@rrXYB z9lHA-Bi)ysFl>Di6Fz1uEKKDIY>vh-UdM!D?wI)scG=gIX|WT`TUO4-!jrh{d33T^ zgmzz&-1-6#F+q(Heb1!|;V0Ji3CA&T6%uXE8GW%GfQ%MlLlCVqwJ{l<}evI6&mN70$z$VIH5g zy&IM>?G;%51gEH`A-5NJXYL$;T_)C!)I!Ffa}B1Wq4}d?5l^TvmV;ZX;s+`){Vv-U|8qq> z4`CPbu8-6F?VVx(UHdMd)4)O336P0xMDEYNj#pFo=*^M47$3s_EofQ+*7>8X@!XFW zLTR==3z{VyY!(LxPYw#`9%N5^^I4?0SORgz16UY$kG8TYi4x{?U5)3}P$+Q|itjeP zi_YMMyMx8y@z?9Xpx~<<72>wHOatqW3vUeLt~BxI&555$~^ze}dcS z99o_)nfdCLZ;`aD<1*H6Xfw70qRmdW7Ag()CC6fU zqMMx~Otw8aUBVd><^m46Uw3?9SVW=?!z$_bV+I>@h6+?Hs_yzjqlM91#lq_N2P#Ir zc6T#~SP5;_@oCQ8bM!cD_uPXp2mJ85fzy~E$J+;;lRvq3D+510&}(~`@v~;`_!a(h zyjki5oU$HG-re3<4l*v}+){24@CQ!7UG1V6rrkZ*pjg4X-@NUqEa05oZ?S;I8E-ED zz(EgJ&>s|vbUlKNg-@8r|GY+^i?$-!T+Y(t+if6GgPUqust_}gkSK~g?lUjq($-!E zrnZMU6W~nY3V2dw=RH)iy6fizNoy7h%Xkmc?x7BVKUjraz~8Oc;ltg8xF6o$rV~!N z24j!&Eoxb6Ev#tYnN`)kYcwWO1O}IxeuiA+1h@<>Hr=9QF|q0&i`WQpPXVOiQHq?z zaqw5v1R?m(%>3M_;71h1rA)}kpSWDmczUuFO)_=pI_XP&@F53AQ=F8*lHIk}U* z20_>H`MS25ch_h_K&KS@I|(0dU^VP6;YUaaw=s8&M=|P1=V5gF{6krg0EKQ56h2{4 zX>~Zt>PI?6*!aj7N@D%gSy=KR@j^5T|P`s#Dq2`W$ zh(`ln;u93xsL+(q8Kg|W6K4~8sR85Rmzda#MoK;h0#&Tdi0+Vj1*wL=^50GfXm|p; zosvx_2Onr&ev5%qp#gB>FAmXw;vIWe4nwo88 zJ@ANQsnOz8t9<6gQ})nMJiJ3~l(2Z>EbI^a^N=RhIh^5@8R$y^&K?u?`RS} zP#g{a_UV*#&dwE+DCAHg5C?2vpE4R6VC;!Z@j`+;$3THw zgxb*SdFal^P4e5rY>30W6x%pB0XtuLf;6A%d@!GKr3I78lNbOD5qGtV&;v`4O{{Nf z@!4*EP|SnOxa89Ifh_&`9fa#0P@AK~fGGVD#3_dN6!G$5XL?5!jwD^cqHQ- z;>G!r&I`UNicjq~oZL@8s-@M>pe9xSCr=L5zt>QI!chP7;F0GqsrnT!>leJJ|31a1 z>K73VPNAd%W@qQ`MB~x!Yel^e_sc4oC7O&ZAF~iVI8p49WP=c@_Xp%1bauH8!jOpZ zQw=)-It*)+RS2hrJ2xvuQG-%6F`D@z@>jL&e*#k_&!1p>JjO7g_#n+vo{xaP^`f?! z_g6#DSXt-Xqq=Ga;};**elROGmfeGvR>GPrlba{X)D$>pJl={k=yD#C6!6SY+l;Vc zaKOBE?os=8igQM8H1zl?XW!3;;sa6O^&y<+ZEchv|BScX_psfFZB6&W3Go~^7T>w- zVDX3r{N`L|=fyeBt_yRV!pmVkoMCP=cl-&7wwdqE12A{6Gdkzyh<4uTRjfZ)>W?9|ifl}l8NnOq7%!d}9@KRp0tcF)a05$IckzIhzV3R6BKMj*SP z6ZY@QZ6_X)qKhg>SV2cOXsYWyemeSvecezAk3;&S z^-|dZ*~~)+%wz`?!TZ(xk-`4iVDWV)uExTU98B38{jpz1I-nTs&T*6K?0q*34HY4u z$G)#qQn0xg>qxNKHQwA4}`1@Np1zd7z@&u4l@w7fqEyBa5|Kd10kF4m% zN$kd4_K~pj(6||3_oSZBMSmrX{gt=}ce9eur}~rQr{{e3i@bG!9b)g(b4>6DH2|Hkt8b?F+AIm;T**|d}ZuI{f zZ`;Hs;AKI~WH|EgnwP$?`~*JMHuHyAjW9-@;~1GO7M41FVd(>RgQMT#T#IIRe+{aV#G^44f_u;08+Mhsi)dWPliKB+;zuTby z&uUH|D z-`~`P%9J?#T%wQ?b_Xph@KbIOF?&da_%)<7ZGhJLmp2b-REOWI(iO0{gH0Cv?q#rP z>>Rs&NX#6VJBlB>@dk~u>O2wrpqAz0X0JB@Uc4XPV(|xsj8JO~iqwHxhaXI|)CJw) zXmg0PTF~&qyf+FOwD|DzaN@0g%}?`c zVf-S{#Fi-&o2E=$?V9MEGI9QtiFHNc;Bx8z1AiJEEX09*IiUIs;LN%YpY{0g9zhL0 zeKIzOVX_e+NF&<`(gzWfsS( zFn*uY8_`PZRtNDrUU)BCzpjzZ)viAF*K=RHs^feGi5>gv_s>^Q@e$%ISu4ON2Ol0d z;TafQpU&1lSK;)SALG@AI}QA(OW{VEF^|7k!(V;TFV?5h3W}WaN6U2%O{)zp3&rq* zd%@6@`CfcGlTIIybrzK0{9|4(3B2RQA64k(zh6H7ohjG;_(xaHlyb`7FLTU|eDc05 zS6CigchbNoryp6a=lARM@>hEWUjC}2FP8HEc>YsQ@_P4ty}rlJ|NO2Go|(U_@%*fl zMxFNv8Zr$98}A+*qCBaAq|2VbRv1JYW+(J;U=K>lw1O@Oxo4&0Bv zhtV5nyj2H>^?_yIS) zgGT}YdjUs7pD^BrF9WQ37j^>Vg?HP;m339EmbEHB>!hQ`SA3>@##aK zmy=kLm*1W}H_x&nFTWyBJgum$0hvC*al`Zqw|ltyP8>OpUYzNeEP*EjIt zy_y@rdnWQmM^O*NcV$=S6>Jz)k!M*qx+1Tz-846^Ci~;Dd4-@<%Wai-_Z58WFqiq09gRW?uxY&Q2Ksy_J^f6tBN?iwAtI|O9^B(Zk zgYW5dzMAZ9im@Jf{0@(MG4AiAPs76B%bu54&^5}DXW76$SZAupv$Y?wAg^(h+cY-M zHb->Etf9`BmuCYTI>@1DdV8EO`skO3`|VP81ZYOTwSW`@eLZxIAg%iw#zk;!UVdd> zj$@oYhWVWpTQUDqO)byTPSenCJ)l2{vh-J8r0oE$0CVAmf};DI1+;q59t3Ul*G5Z! zn>*a!=Ab8UI@I4dwi;1>4(g};(eDB=_#5-fAhI6w-fE<^x;#r5-93LC8UU33(183B zw4LKiZzBd2GFdi;yp0*kGXF;8J5lzsR9OuAYz#b%M+<12yVoOs9rG)N>2l_by963I z#syG`4P*;=J^~NF%3*W~^cUkAie|qKL&I+`8kb$Ir{=-r8eYfI>QQFkuY-d(v&@lt znROha?W3yU(eK0Ot3=ra;{<;P_$_$Z?0WLQjvh+Y@tQ8VcHA0Og%$Ftw+(B8;D6Z2 z{~p-TICOphd^e)g@5CArVyBCF0?uZfCo1!7qgG}e(s5UV0&}FMj#=ZfJ!vGzxMjn6 zME_#I-HDe*$D=x4v|j;e4}f+r3D99fHpH&uIB6eUnOB}Yd#tDkEk?IOZ`zM~+pvZ` zhxF(-U=-x8L%+d(7of=8)SThe=Y=(>qaXaIvkqL;r5m&W{O$@t!I}zq2WU>rEjvgP zV|D?@tdnEb!7*FKF?&H?k14xT4bRk&MUiTJY>@FBWc-4CwFLhl=lgKUg72|SU885^ z6>i|zUw6dpyt4K&bMv~hvY#27R|ZpKywA$Bqy)|zXMsGf-_w4D^&aWbMUaOA?PJy* zvBA_e`g^0kpIrkw_0C6IZaM)xM-QtL0*!T6=yh(oHEY!8V^HhtLu$oTD&{%H1^a)A zxB$K(Y@CNe#)?rdFUSXXLpSfHB2~7@ct}&{6tMVkY)PVrnP6AKCx?$W;6X?*{1K?wdY5hUb1U< zn@q3Swfjw`q+NT)Wct9atviDBA01Khh+Vts$m1WdYj2J<{m8Dx#~uGkv9{|d(+9=c zi$|G~#oESPrtiu%y;iI}oBLE2kax|wsNlYQe2u^!e9uF%_SrF}mx{Glk2O7AtZkoQ zdaPKx=Qz{WV(r%BO@A!bzC7Oa+hXl61*W@-wVfyal@jhgx$tMj+Q%oGeq5}5{}j{p z#oE26nBu7T6w|fE+S8|)UbJanoN@vve>(L^)^Mve7y9m;bZyi|6jF0PTO$JENQsP zRljeoe#g69`h&{z&T8;(C7J9xsJonubTy@bziPvS@EYUqaqNK3L-A`Y`O4O?Atso%FhN#fkw^AcyMfDLyGG7wj zE-xIji|cp^%dC1r(F?JG<)!q-w^oRYw>x;L`tj2>qCFr9Ry;E;@PnraHf-;7oclIj z0}?-0=6@n_WjCGc|NH+n_l>N>G#(z|nj_&N34Ic-kZ_%ZH%a(Q2_KYjmxM1!_?CnR zBs{{d*K?eNlO&ub;T#DUN$8Vsg@o%Qyh*}eO8B6JyCi%;!nY(mAmI_kvVI9CNjOcy zIT9|C&?n&v3D-$@lZ3yN@IeW8N%(?7NVrHspM)zUTqog8 z68=)c2PNDk;R_PJCE)=HkKn-N#J^@0ap{itAD-r(DWWdM*c@?K)bvD_`<= zOS+10)p_>=QcgpfK074cBI#;e@)u11(5Cgm^ z1O3+-=!p#UY&gKtuupfrE?mVc{3f(BKyM7|^zpK8evi-T+VNVy9ABFyySS%3O z!#)FawrfDjUnk473VwqCnfxi}Z12WwAae*$_w)`f#|{?w)D_sT}n z=i>}=&Osnf`>Xv|xfB!teIz*@f{yXKRA<~F`CrVy|BjSzbLos~ez0Mo8A<+)SePwn z*XFc#eFyxszuIrAdHbiJkH>tgwdwNVe&V_hbhgWOrH(%*>B$WB<{(fYf4S5X<`UO@ zNe?g5@zW*!TF^(-U-GMSl(QuN?HTyD3Vz9C0DsBA|Gt#pwp?fCeR*D^v4Nxh>GQ*4 z(8ai$q4V(`DzD2VzdGj;&vAghR?_n$f(|7fUf3zS)~APX5i1mfx<}j zP6S=}x%B6=q_A1!&(2GoKd3tRE0!b4xhwJ0Ra8R*Y|PJMbV*K6c6BfQ?uz<&hJ zC&-^Z9?u1RBt5SJeLUm0-|2GIys<&jEot;k8RTrsKz|W*&P#pw=<=O9(B8_xe-QMM z`q7LjjN_|E`Wv5b<7EMz?X}1Ohp<6h=Lvp^7{DUQpYPX+YJK08K_6cRIqL)+^StyE zIelmwF+Wq!-dbJ$8M5wMGRWDUfj$Nc=t%u_f}rPW>fCs;lz%4Z!f$;#LD~7d407g6 ze$A`%Lk)3Vl7T-AI{lMgp@PTqGyU{ zl8}4_bk39M>-gIl#huPp3Fdh zKLfo8%8#V~wHfFeGSGWKXMgp|{*uE*dq&Wu(gtvZ@LK~xCQr>kw`QQ93p(xG7S;va zE9JCh;J*QM#%byC%xxL?pOo@@rQfQ!`gI}aWNnq)_oBt`Yp02QJnL;+bP4yEDl7y_A#g&!1)BKMe;OtXJKqQRD6cNl)Jo zULxt~^WGJpW2hc-T@SkD5UQr#C-`%<{CYi8#h+U;$ay{ky$~HSQoSV^=-@XE{wdNYlbWsNWD>BGm4?5@1{@>|R_!V`$ewu;*feiHj z7W6~o>W?z;ACCi#k=lDY=p0`Kazbqs+GyH&8TcDA&^5eU7qb_IG?&Z0%{o@kz!@9H>T=Dgt(fm{ITlp9&?PQB^y+dr zCDB<~tGOx{FQ}MbHCuDZF1>KhoH_^mxMEhdgPmw_0=wNGtyqCqh26^nUdIY%)`g~q zTVoDS`P}NNS+g4&TvLlmNS_DSDXnU8FZbGQQM~e6ADV-=iiOEzcAF3B=xUg!WxC7d zS+&Y;FA3u%Q-`cBt)nXKdR;^BMo006uB;!@T7&*8TfMGuEK;=qLo$=}Qdc#4q|{Xf zdpj1?O@%**G@Od|k2oB%qWVQ_bD9H5)k^r5?rgj6J0-PVPpr!4Pz(IaUF!|wMO;Uawr_GQ zgTT^eFJ8D!$!FWAx$463%T{=FlM7Rmx2k%<43}$puvM73*i{|!T;U3b@XqyWN3p|E zT;iJVk}ngx0`6$cB^|qINEgvccMxxM3%${J44dhT(DYEGShjw+$?Dya<=z;rQol&P zsw!Q=ZWnK|>aVqzfk~jEuKGo({-v$yK*P9akUQp%wMKRJsv-8MKdAeks~C3{OIaMH zr`3fc{+L&F)^s)Ok!`ot#Ogy>Q}70NQ&X)Uv(@szER0xA`J(fu)<@jIsE^A6>}|KB z4{AbDKYzUZ(B|W%<{0O*1@r!?`=$AuC*Y`AP*?1dUTGXfMa9!7@}EjX`&NulE@d6# z7YWP=1?PHWmCzOwV!DA#XE(P7uTZ``%=TDNIoj=0@lrV!$^Xne>-S?mYH1BLd8U@* z{;;d0$R-v{Ho4U3#~j#|!LN2?yA6)q)4C+ z~{^{?u+*~L{A(AHCDcOitB zSMOSY)HLB~V#w&OD-=T4*39$N!mFkQLLPU(D@Fgiqg*!**5F8JwLY$4;$oLRg!O4c zctf!mjkBBG!Js$bK+}bel|%EA8bkCs>Y@*B!%SwJxMpCQ2{=|@$s#l6A2(Mr5oHY< ztxyX=!7!3xvef5PSsw?(e{QyCySRD}wPe`%NR1%Fz^IF5aGgp&bQ=~RR{Ci{{C6DU zoA&=?v;xyMMMExh8omYtO{uR-Db6haibKX12fmDs^qIQUgKv|Fa9%?&gqVhN0A}=* zoZ;S%+13+^ruEklv%y`4%^{^>H%5oO!TyKx?#l_!P(-v3?8>`0O?;A!-#6{`()DBSu^m z(f3?=v1wUhx6^m9$VOeU)nPAUHDAb4j+m)pR+YO1qkCgHiSRg1W9aC6iw+3 z?=(8YEzH@!*!nweqh91>zr(*tTX zPUOO+J4jQYW<`r(AQsI~MjO_s>6KoeyEULM(kb%~8)!lv_h3rE@CisQn>0FyjK1G+ z)z6=;_GiPp5y9eoy&uKKF3maZc3F#ZyF>R$-0H~hkWw9ty5*MMUd*r5`Bw+*f;yY4 z1ixFS4}etj(IgQY)eXh@sA0w;I3K>orO9hAf%{Z?qgPS4zm)(vY zPwkcTE;4LqMQo9_6Bfe;J25Fo%_VwpLI>fdTW+~U5{wAl^{=XOMe$WtLxVpRD^p8j zFH*Q1_Co=!F}nPxM_-Uo>gP9DrD~fR^{q-FqHpxmvj4!2!v`N)hEPE)%E~aq2ZX@` zIRA6R7z{nlAH5I@vc7B%xs8|y!l9MElrt7jhxoc!vE3hvip>ChH{y=07L(2}8y4w~ zTQzL34~z0jq)Rdm9XT3Ni{Lq$_Mnc-FBd!O72+TZCxSATS)}Z)S#;Q3hYUcTBFR$^{mADZ9Ng2A?ztUr%^3dvu z4uD>%vo;74yB;>HxNi7%2pIULAPs#KN4$o2ZoIX_MbYVPVYU+ zA3oI#ttPl3;=!gQeP%@wxh`QdX*`3mryU=1Iv3%jv0?HEb;xUm9Md?Z*^47yob*Ox zb3z_*47gk$bW<@|%1AoBI$`JKzc!S`+!`Em9d32TDd?2a~TMNO-Nkf6g@M9;x@9Y%4MI1F(i z4`;D%7LciMAV!G@D2tFRS{_0ohP{GTB(`%!k&rlgEb=zX+W^f?5TYQ+iIdV{T6~=iAu8~s)ss7Q`{|n4=M=7s2M0c0xiOd zrQ!BT3%?mu-s<~bfs;_0&#K_Db8*$k2c;CWO1c8-IZ=fdA;DXqsyx42ikE_Tf^66& zZ=&8!%cC)zn zJQP({`m6W+6jbl^>D;;ul_sQqe1}ezSMSX!_=aRw`YS#K`S>T_$y2y`FHb?6G#K@# z45hymE55IZbX8ux7pS0mFHqI5%B%LTkaA~9f$BX&1=V|rERS2qsrpsLrEcNsP=GL`Smm?E(M=St3M6Zo&v9N{%O2k6xS5A=xFMH zdj0*#F_u^Ft0`znmDCgI?SBtsJmM+l0CK4JXq-0_)4%ITPwD?v{R(~xGM{af(_ZSm zod#K6@hKS!SMUfJgf>y-)q5C?vOK>p(0Eyl2-3%(Fvp%MuinS0`H9ZhD9bB1QuQi7 z{w~;z_4oWnFV}OM4hwaV`mf3>cygNl>b>TKEHBwWPnrgo$pUXKY%kz64jhDrUAkFy|f2nCpWvlY1DT0LL ESCAPE) { break; } \ + sumz.x += dot(z - pz, pz - ppz); \ + sumz.y += dot(z - pz, z - pz); \ + sumz.z += dot(z - ppz, z - ppz); \ + } +#else +#define DO_LOOP(name) \ + for (i = 0; i < iIters; ++i) { \ + z = name(z, c); \ + if (dot(z, z) > ESCAPE) { break; } \ + } +#endif + +vec3 fractal(VEC2 z, VEC2 c) { + VEC2 pz = z; + VEC3 sumz = VEC3(0.0, 0.0, 0.0); + int i; + switch (iType) { + case 0: DO_LOOP(mandelbrot); break; + case 1: DO_LOOP(burning_ship); break; + case 2: DO_LOOP(feather); break; + case 3: DO_LOOP(sfx); break; + case 4: DO_LOOP(henon); break; + case 5: DO_LOOP(duffing); break; + case 6: DO_LOOP(ikeda); break; + case 7: DO_LOOP(chirikov); break; + } + + if (i != iIters) { + float n1 = sin(float(i) * 0.1) * 0.5 + 0.5; + float n2 = cos(float(i) * 0.1) * 0.5 + 0.5; + return vec3(n1, n2, 1.0) * (1.0 - float(FLAG_USE_COLOR)*0.85); + } else if (FLAG_USE_COLOR) { + sumz = abs(sumz) / iIters; + vec3 n1 = sin(abs(sumz * 5.0)) * 0.45 + 0.5; + return n1; + } else { + return vec3(0.0, 0.0, 0.0); + } +} + +float rand(float s) { + return fract(sin(s*12.9898) * 43758.5453); +} + +void main() { + //Get normalized screen coordinate + vec2 screen_pos = gl_FragCoord.xy - (iResolution.xy * 0.5); + + vec3 col = vec3(0.0, 0.0, 0.0); + for (int i = 0; i < AA_LEVEL; ++i) { + vec2 dxy = vec2(rand(i*0.54321 + iTime), rand(i*0.12345 + iTime)); + VEC2 c = VEC2((screen_pos + dxy) * vec2(1.0, -1.0) / iZoom - iCam); + + if (FLAG_DRAW_MSET) { + col += fractal(c, c); + } + if (FLAG_DRAW_JSET) { + col += fractal(c, iJulia); + } + } + + col /= AA_LEVEL; + if (FLAG_DRAW_MSET && FLAG_DRAW_JSET) { + col *= 0.5; + } + gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0); +} \ No newline at end of file diff --git a/linux/vert.glsl b/linux/vert.glsl new file mode 100644 index 0000000..e467528 --- /dev/null +++ b/linux/vert.glsl @@ -0,0 +1,6 @@ +#version 400 compatibility +uniform vec2 iResolution; +void main() { + vec2 pos = (gl_Vertex.xy / iResolution) * 2.0 - vec2(1.0, 1.0); + gl_Position = vec4(pos, 0.0, 1.0); +}