diff --git a/olcCodeJam2023Entry.sln b/olcCodeJam2023Entry.sln new file mode 100644 index 0000000..779dc01 --- /dev/null +++ b/olcCodeJam2023Entry.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.33516.290 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "olcCodeJam2023Entry", "olcCodeJam2023Entry\olcCodeJam2023Entry.vcxproj", "{FA5243BE-6446-44B1-ADE6-EB26118F6B3E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Debug|x64.ActiveCfg = Debug|x64 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Debug|x64.Build.0 = Debug|x64 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Debug|x86.ActiveCfg = Debug|Win32 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Debug|x86.Build.0 = Debug|Win32 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Release|x64.ActiveCfg = Release|x64 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Release|x64.Build.0 = Release|x64 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Release|x86.ActiveCfg = Release|Win32 + {FA5243BE-6446-44B1-ADE6-EB26118F6B3E}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {59D77397-F63B-47B2-B936-7BB19452CD50} + EndGlobalSection +EndGlobal diff --git a/olcCodeJam2023Entry/VirusAttack.cpp b/olcCodeJam2023Entry/VirusAttack.cpp new file mode 100644 index 0000000..4edb02b --- /dev/null +++ b/olcCodeJam2023Entry/VirusAttack.cpp @@ -0,0 +1,32 @@ +#define OLC_PGE_APPLICATION +#include "olcPixelGameEngine.h" +#define OLC_SOUNDWAVE +#include "olcSoundWaveEngine.h" +#include "VirusAttack.h" + +VirusAttack::VirusAttack() +{ + // Name your application + sAppName = "olcCodeJam 2023 Entry"; +} + +bool VirusAttack::OnUserCreate(){ + // Called once at the start, so create things here + return true; +} + +bool VirusAttack::OnUserUpdate(float fElapsedTime){ + // Called once per frame, draws random coloured pixels + for (int x = 0; x < ScreenWidth(); x++) + for (int y = 0; y < ScreenHeight(); y++) + Draw(x, y, olc::Pixel(rand() % 256, rand() % 256, rand() % 256)); + return true; +} + +int main() +{ + VirusAttack app; + if (app.Construct(256, 240, 4, 4)) + app.Start(); + return 0; +} \ No newline at end of file diff --git a/olcCodeJam2023Entry/VirusAttack.h b/olcCodeJam2023Entry/VirusAttack.h new file mode 100644 index 0000000..1aca66e --- /dev/null +++ b/olcCodeJam2023Entry/VirusAttack.h @@ -0,0 +1,13 @@ +#include "olcPixelGameEngine.h" +#include "olcSoundWaveEngine.h" + +class VirusAttack : public olc::PixelGameEngine +{ +public: + VirusAttack(); + +public: + bool OnUserCreate() override; + + bool OnUserUpdate(float fElapsedTime) override; +}; \ No newline at end of file diff --git a/olcCodeJam2023Entry/assets/MAINICON.ico b/olcCodeJam2023Entry/assets/MAINICON.ico new file mode 100644 index 0000000..fb37210 Binary files /dev/null and b/olcCodeJam2023Entry/assets/MAINICON.ico differ diff --git a/olcCodeJam2023Entry/assets/Vast Horizons.wav b/olcCodeJam2023Entry/assets/Vast Horizons.wav new file mode 100644 index 0000000..5e8e58d Binary files /dev/null and b/olcCodeJam2023Entry/assets/Vast Horizons.wav differ diff --git a/olcCodeJam2023Entry/emscripten_build.ps1 b/olcCodeJam2023Entry/emscripten_build.ps1 new file mode 100644 index 0000000..da29d72 --- /dev/null +++ b/olcCodeJam2023Entry/emscripten_build.ps1 @@ -0,0 +1,2 @@ +~\Documents\emsdk\emsdk_env.ps1 activate latest +em++ -std=c++20 -gsource-map -s ALLOW_MEMORY_GROWTH=1 -s MAX_WEBGL_VERSION=2 -s MIN_WEBGL_VERSION=2 -s USE_LIBPNG=1 -s USE_SDL_MIXER=2 $(Get-ChildItem *.cpp) -o pge.html --preload-file assets \ No newline at end of file diff --git a/olcCodeJam2023Entry/icon.png b/olcCodeJam2023Entry/icon.png new file mode 100644 index 0000000..d9c3b3e Binary files /dev/null and b/olcCodeJam2023Entry/icon.png differ diff --git a/olcCodeJam2023Entry/olcCodeJam2023Entry.rc b/olcCodeJam2023Entry/olcCodeJam2023Entry.rc new file mode 100644 index 0000000..fdb2919 Binary files /dev/null and b/olcCodeJam2023Entry/olcCodeJam2023Entry.rc differ diff --git a/olcCodeJam2023Entry/olcCodeJam2023Entry.vcxproj b/olcCodeJam2023Entry/olcCodeJam2023Entry.vcxproj new file mode 100644 index 0000000..a4e3b34 --- /dev/null +++ b/olcCodeJam2023Entry/olcCodeJam2023Entry.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {fa5243be-6446-44b1-ade6-eb26118f6b3e} + olcCodeJam2023Entry + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp17 + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp17 + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp17 + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + stdcpp17 + + + Console + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/olcCodeJam2023Entry/olcCodeJam2023Entry.vcxproj.filters b/olcCodeJam2023Entry/olcCodeJam2023Entry.vcxproj.filters new file mode 100644 index 0000000..05d87c1 --- /dev/null +++ b/olcCodeJam2023Entry/olcCodeJam2023Entry.vcxproj.filters @@ -0,0 +1,67 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;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 + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/olcCodeJam2023Entry/olcPGEX_PopUpMenu.h b/olcCodeJam2023Entry/olcPGEX_PopUpMenu.h new file mode 100644 index 0000000..860b55f --- /dev/null +++ b/olcCodeJam2023Entry/olcPGEX_PopUpMenu.h @@ -0,0 +1,585 @@ +/* + olcPGEX_PopUp.h + + +-------------------------------------------------------------+ + | OneLoneCoder Pixel Game Engine Extension | + | Retro PopUp Menu 1.0 | + +-------------------------------------------------------------+ + + What is this? + ~~~~~~~~~~~~~ + This is an extension to the olcPixelGameEngine, which provides + a quick and easy to use, flexible, skinnable context pop-up + menu system. + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2020 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions or derivations of source code must retain the above + copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce + the above copyright notice. This list of conditions and the following + disclaimer must be reproduced in the documentation and/or other + materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + + Author + ~~~~~~ + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020 +*/ + + +/* + Example + ~~~~~~~ + + #define OLC_PGEX_POPUPMENU + #include "olcPGEX_PopUpMenu.h" + + NOTE: Requires a 9-patch sprite, by default each patch is + 8x8 pixels, patches are as follows: + + | PANEL TL | PANEL T | PANEL TR | SCROLL UP | CURSOR TL | CURSOR TR | + | PANEL L | PANEL M | PANEL R | SUBMENU | CURSOR BL | CURSOR BR | + | PANEL BL | PANEL B | PANEL BR | SCROLL DOWN | UNUSED | UNUSED | + + You can find an example sprite here: + https://github.com/OneLoneCoder/olcPixelGameEngine/blob/master/Videos/RetroMenu.png + + Constructing A Menu + ~~~~~~~~~~~~~~~~~~~ + + // Declaration (presumably inside class) + olc::popup::Menu m; + + // Construction (root menu is a 1x5 table) + m.SetTable(1, 5); + + // Add first item to root menu (A 1x5 submenu) + m["Menu1"].SetTable(1, 5); + + // Add items to first item + m["Menu1"]["Item1"]; + m["Menu1"]["Item2"]; + + // Add a 4x3 submenu + m["Menu1"]["Item3"].SetTable(4, 3); + m["Menu1"]["Item3"]["Option1"]; + m["Menu1"]["Item3"]["Option2"]; + + // Set properties of specific item + m["Menu1"]["Item3"]["Option3"].Enable(false); + m["Menu1"]["Item3"]["Option4"]; + m["Menu1"]["Item3"]["Option5"]; + m["Menu1"]["Item4"]; + + // Add second item to root menu + m["Menu2"].SetTable(3, 3); + m["Menu2"]["Item1"]; + m["Menu2"]["Item2"].SetID(1001).Enable(true); + m["Menu2"]["Item3"]; + + // Construct the menu structure + m.Build(); + + + Displaying a Menu + ~~~~~~~~~~~~~~~~~ + + // Declaration of menu manager (presumably inside class) + olc::popup::Manager man; + + // Set the Menu object to the MenuManager (call once per pop) + man.Open(&m); + + // Draw Menu at position (30, 30), using "patch sprite" + man.Draw(sprGFX, { 30,30 }); + + + Interacting with menu + ~~~~~~~~~~~~~~~~~~~~~ + + // Send key events to menu + if (GetKey(olc::Key::UP).bPressed) man.OnUp(); + if (GetKey(olc::Key::DOWN).bPressed) man.OnDown(); + if (GetKey(olc::Key::LEFT).bPressed) man.OnLeft(); + if (GetKey(olc::Key::RIGHT).bPressed) man.OnRight(); + if (GetKey(olc::Key::Z).bPressed) man.OnBack(); + + // "Confirm/Action" Key does something, if it returns non-null + // then a menu item has been selected. The specific item will + // be returned + olc::popup::Menu* command = nullptr; + if (GetKey(olc::Key::SPACE).bPressed) command = man.OnConfirm(); + if (command != nullptr) + { + std::string sLastAction = + "Selected: " + command->GetName() + + " ID: " + std::to_string(command->GetID()); + + // Optionally close menu? + man.Close(); + } + +*/ + +#ifndef OLC_PGEX_POPUPMENU_H +#define OLC_PGEX_POPUPMENU_H + +#include + +namespace olc +{ + namespace popup + { + constexpr int32_t nPatch = 8; + + class Menu + { + public: + Menu(); + Menu(const std::string n); + + Menu& SetTable(int32_t nColumns, int32_t nRows); + Menu& SetID(int32_t id); + Menu& Enable(bool b); + + int32_t GetID(); + std::string& GetName(); + bool Enabled(); + bool HasChildren(); + olc::vi2d GetSize(); + olc::vi2d& GetCursorPosition(); + Menu& operator[](const std::string& name); + void Build(); + void DrawSelf(olc::PixelGameEngine& pge, olc::Sprite* sprGFX, olc::vi2d vScreenOffset); + void ClampCursor(); + void OnUp(); + void OnDown(); + void OnLeft(); + void OnRight(); + Menu* OnConfirm(); + Menu* GetSelectedItem(); + + protected: + int32_t nID = -1; + olc::vi2d vCellTable = { 1, 0 }; + std::unordered_map itemPointer; + std::vector items; + olc::vi2d vSizeInPatches = { 0, 0 }; + olc::vi2d vCellSize = { 0, 0 }; + olc::vi2d vCellPadding = { 2, 0 }; + olc::vi2d vCellCursor = { 0, 0 }; + int32_t nCursorItem = 0; + int32_t nTopVisibleRow = 0; + int32_t nTotalRows = 0; + const olc::vi2d vPatchSize = { nPatch, nPatch }; + std::string sName; + olc::vi2d vCursorPos = { 0, 0 }; + bool bEnabled = true; + }; + + class Manager : public olc::PGEX + { + public: + Manager(); + void Open(Menu* mo); + void Close(); + void OnUp(); + void OnDown(); + void OnLeft(); + void OnRight(); + void OnBack(); + Menu* OnConfirm(); + void Draw(olc::Sprite* sprGFX, olc::vi2d vScreenOffset); + + private: + std::list panels; + }; + + } +}; + + + + +#ifdef OLC_PGEX_POPUPMENU +#undef OLC_PGEX_POPUPMENU + +namespace olc +{ + namespace popup + { + Menu::Menu() + { + } + + Menu::Menu(const std::string n) + { + sName = n; + } + + + Menu& Menu::SetTable(int32_t nColumns, int32_t nRows) + { + vCellTable = { nColumns, nRows }; + return *this; + } + + Menu& Menu::SetID(int32_t id) + { + nID = id; + return *this; + } + + Menu& Menu::Enable(bool b) + { + bEnabled = b; + return *this; + } + + int32_t Menu::GetID() + { + return nID; + } + + std::string& Menu::GetName() + { + return sName; + } + + bool Menu::Enabled() + { + return bEnabled; + } + + bool Menu::HasChildren() + { + return !items.empty(); + } + + olc::vi2d Menu::GetSize() + { + return { int32_t(sName.size()), 1 }; + } + + olc::vi2d& Menu::GetCursorPosition() + { + return vCursorPos; + } + + Menu& Menu::operator[](const std::string& name) + { + if (itemPointer.count(name) == 0) + { + itemPointer[name] = items.size(); + items.push_back(Menu(name)); + } + + return items[itemPointer[name]]; + } + + void Menu::Build() + { + // Recursively build all children, so they can determine their size, use + // that size to indicate cell sizes if this object contains more than + // one item + for (auto& m : items) + { + if (m.HasChildren()) + { + m.Build(); + } + + // Longest child name determines cell width + vCellSize.x = std::max(m.GetSize().x, vCellSize.x); + vCellSize.y = std::max(m.GetSize().y, vCellSize.y); + } + + // Adjust size of this object (in patches) if it were rendered as a panel + vSizeInPatches.x = vCellTable.x * vCellSize.x + (vCellTable.x - 1) * vCellPadding.x + 2; + vSizeInPatches.y = vCellTable.y * vCellSize.y + (vCellTable.y - 1) * vCellPadding.y + 2; + + // Calculate how many rows this item has to hold + nTotalRows = (items.size() / vCellTable.x) + (((items.size() % vCellTable.x) > 0) ? 1 : 0); + } + + void Menu::DrawSelf(olc::PixelGameEngine& pge, olc::Sprite* sprGFX, olc::vi2d vScreenOffset) + { + // === Draw Panel + + // Record current pixel mode user is using + olc::Pixel::Mode currentPixelMode = pge.GetPixelMode(); + pge.SetPixelMode(olc::Pixel::MASK); + + // Draw Panel & Border + olc::vi2d vPatchPos = { 0,0 }; + for (vPatchPos.x = 0; vPatchPos.x < vSizeInPatches.x; vPatchPos.x++) + { + for (vPatchPos.y = 0; vPatchPos.y < vSizeInPatches.y; vPatchPos.y++) + { + // Determine position in screen space + olc::vi2d vScreenLocation = vPatchPos * nPatch + vScreenOffset; + + // Calculate which patch is needed + olc::vi2d vSourcePatch = { 0, 0 }; + if (vPatchPos.x > 0) vSourcePatch.x = 1; + if (vPatchPos.x == vSizeInPatches.x - 1) vSourcePatch.x = 2; + if (vPatchPos.y > 0) vSourcePatch.y = 1; + if (vPatchPos.y == vSizeInPatches.y - 1) vSourcePatch.y = 2; + + // Draw Actual Patch + pge.DrawPartialSprite(vScreenLocation, sprGFX, vSourcePatch * nPatch, vPatchSize); + } + } + + // === Draw Panel Contents + olc::vi2d vCell = { 0,0 }; + vPatchPos = { 1,1 }; + + // Work out visible items + int32_t nTopLeftItem = nTopVisibleRow * vCellTable.x; + int32_t nBottomRightItem = vCellTable.y * vCellTable.x + nTopLeftItem; + + // Clamp to size of child item vector + nBottomRightItem = std::min(int32_t(items.size()), nBottomRightItem); + int32_t nVisibleItems = nBottomRightItem - nTopLeftItem; + + // Draw Scroll Markers (if required) + if (nTopVisibleRow > 0) + { + vPatchPos = { vSizeInPatches.x - 2, 0 }; + olc::vi2d vScreenLocation = vPatchPos * nPatch + vScreenOffset; + olc::vi2d vSourcePatch = { 3, 0 }; + pge.DrawPartialSprite(vScreenLocation, sprGFX, vSourcePatch * nPatch, vPatchSize); + } + + if ((nTotalRows - nTopVisibleRow) > vCellTable.y) + { + vPatchPos = { vSizeInPatches.x - 2, vSizeInPatches.y - 1 }; + olc::vi2d vScreenLocation = vPatchPos * nPatch + vScreenOffset; + olc::vi2d vSourcePatch = { 3, 2 }; + pge.DrawPartialSprite(vScreenLocation, sprGFX, vSourcePatch * nPatch, vPatchSize); + } + + // Draw Visible Items + for (int32_t i = 0; i < nVisibleItems; i++) + { + // Cell location + vCell.x = i % vCellTable.x; + vCell.y = i / vCellTable.x; + + // Patch location (including border offset and padding) + vPatchPos.x = vCell.x * (vCellSize.x + vCellPadding.x) + 1; + vPatchPos.y = vCell.y * (vCellSize.y + vCellPadding.y) + 1; + + // Actual screen location in pixels + olc::vi2d vScreenLocation = vPatchPos * nPatch + vScreenOffset; + + // Display Item Header + pge.DrawString(vScreenLocation, items[nTopLeftItem + i].sName, items[nTopLeftItem + i].bEnabled ? olc::WHITE : olc::DARK_GREY); + + if (items[nTopLeftItem + i].HasChildren()) + { + // Display Indicator that panel has a sub panel + vPatchPos.x = vCell.x * (vCellSize.x + vCellPadding.x) + 1 + vCellSize.x; + vPatchPos.y = vCell.y * (vCellSize.y + vCellPadding.y) + 1; + olc::vi2d vSourcePatch = { 3, 1 }; + vScreenLocation = vPatchPos * nPatch + vScreenOffset; + pge.DrawPartialSprite(vScreenLocation, sprGFX, vSourcePatch * nPatch, vPatchSize); + } + } + + // Calculate cursor position in screen space in case system draws it + vCursorPos.x = (vCellCursor.x * (vCellSize.x + vCellPadding.x)) * nPatch + vScreenOffset.x - nPatch; + vCursorPos.y = ((vCellCursor.y - nTopVisibleRow) * (vCellSize.y + vCellPadding.y)) * nPatch + vScreenOffset.y + nPatch; + } + + void Menu::ClampCursor() + { + // Find item in children + nCursorItem = vCellCursor.y * vCellTable.x + vCellCursor.x; + + // Clamp Cursor + if (nCursorItem >= int32_t(items.size())) + { + vCellCursor.y = (items.size() / vCellTable.x); + vCellCursor.x = (items.size() % vCellTable.x) - 1; + nCursorItem = items.size() - 1; + } + } + + void Menu::OnUp() + { + vCellCursor.y--; + if (vCellCursor.y < 0) vCellCursor.y = 0; + + if (vCellCursor.y < nTopVisibleRow) + { + nTopVisibleRow--; + if (nTopVisibleRow < 0) nTopVisibleRow = 0; + } + + ClampCursor(); + } + + void Menu::OnDown() + { + vCellCursor.y++; + if (vCellCursor.y == nTotalRows) vCellCursor.y = nTotalRows - 1; + + if (vCellCursor.y > (nTopVisibleRow + vCellTable.y - 1)) + { + nTopVisibleRow++; + if (nTopVisibleRow > (nTotalRows - vCellTable.y)) + nTopVisibleRow = nTotalRows - vCellTable.y; + } + + ClampCursor(); + } + + void Menu::OnLeft() + { + vCellCursor.x--; + if (vCellCursor.x < 0) vCellCursor.x = 0; + ClampCursor(); + } + + void Menu::OnRight() + { + vCellCursor.x++; + if (vCellCursor.x == vCellTable.x) vCellCursor.x = vCellTable.x - 1; + ClampCursor(); + } + + Menu* Menu::OnConfirm() + { + // Check if selected item has children + if (items[nCursorItem].HasChildren()) + { + return &items[nCursorItem]; + } + else + return this; + } + + Menu* Menu::GetSelectedItem() + { + return &items[nCursorItem]; + } + + // ===================================================================== + + Manager::Manager() + { + } + + void Manager::Open(Menu* mo) + { + Close(); + panels.push_back(mo); + } + + void Manager::Close() + { + panels.clear(); + } + + void Manager::OnUp() + { + if (!panels.empty()) panels.back()->OnUp(); + } + + void Manager::OnDown() + { + if (!panels.empty()) panels.back()->OnDown(); + } + + void Manager::OnLeft() + { + if (!panels.empty()) panels.back()->OnLeft(); + } + + void Manager::OnRight() + { + if (!panels.empty()) panels.back()->OnRight(); + } + + void Manager::OnBack() + { + if (!panels.empty()) panels.pop_back(); + } + + Menu* Manager::OnConfirm() + { + if (panels.empty()) return nullptr; + + Menu* next = panels.back()->OnConfirm(); + if (next == panels.back()) + { + if (panels.back()->GetSelectedItem()->Enabled()) + return panels.back()->GetSelectedItem(); + } + else + { + if (next->Enabled()) + panels.push_back(next); + } + + return nullptr; + } + + void Manager::Draw(olc::Sprite* sprGFX, olc::vi2d vScreenOffset) + { + if (panels.empty()) return; + + // Draw Visible Menu System + for (auto& p : panels) + { + p->DrawSelf(*pge, sprGFX, vScreenOffset); + vScreenOffset += {10, 10}; + } + + // Draw Cursor + olc::Pixel::Mode currentPixelMode = pge->GetPixelMode(); + pge->SetPixelMode(olc::Pixel::ALPHA); + pge->DrawPartialSprite(panels.back()->GetCursorPosition(), sprGFX, olc::vi2d(4, 0) * nPatch, { nPatch * 2, nPatch * 2 }); + pge->SetPixelMode(currentPixelMode); + } + } +}; + + +#endif +#endif diff --git a/olcCodeJam2023Entry/olcPGEX_QuickGUI.h b/olcCodeJam2023Entry/olcPGEX_QuickGUI.h new file mode 100644 index 0000000..6b0c4ef --- /dev/null +++ b/olcCodeJam2023Entry/olcPGEX_QuickGUI.h @@ -0,0 +1,1170 @@ +/* + OneLoneCoder - QuickGUI v1.02 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + A semi-immediate mode GUI for very simple GUI stuff. + Includes: + Label - Displays a single-line string + TextBox - Click to enter/edit single-line text + Button - A clickable labelled rectangle + CheckBox - A clickable labelled rectangle that retains state + ImageButton - A Button with an image instead of text + ImageCheckBox- A CheckBox with an image instead of text + Slider - An omnidirectional draggable handle between two values + ListBox - A list of strings, that can be scrolled and an item selected + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2021 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions or derivations of source code must retain the above + copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce + the above copyright notice. This list of conditions and the following + disclaimer must be reproduced in the documentation and/or other + materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + + Author + ~~~~~~ + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021, 2022 + + Changes + ~~~~~~~ + v1.01 +Moved Slider::fGrabRad into "theme" + +Manager::CopyThemeFrom() - copies theme attributes from a different manager + +ListBox - Displays a vector of strings + v1.02 +ImageButton + +ImageCheckBox + +ListBox::bSelectionChanged flag, true when list selected item changes + =Fix - Text box mouse behaviours, mouse release is now meaningless + +CheckBox Fix for decal display + +*/ + +#ifndef OLC_PGEX_QUICKGUI_H +#define OLC_PGEX_QUICKGUI_H + +#include "olcPixelGameEngine.h" + + +namespace olc::QuickGUI +{ + class Manager; + + // Virtual base class for all controls + class BaseControl + { + public: + BaseControl(olc::QuickGUI::Manager& manager); + virtual ~BaseControl(); + + public: + // Switches the control on/off + void Enable(const bool bEnable); + // Sets whether or not the control is interactive/displayed + bool bVisible = true; + + // True on single frame control begins being manipulated + bool bPressed = false; + // True on all frames control is under user manipulation + bool bHeld = false; + // True on single frame control ceases being manipulated + bool bReleased = false; + + public: + // Updates the controls behvaiour + virtual void Update(olc::PixelGameEngine* pge) = 0; + // Draws the control using "sprite" based CPU operations + virtual void Draw(olc::PixelGameEngine* pge) = 0; + // Draws the control using "decal" based GPU operations + virtual void DrawDecal(olc::PixelGameEngine* pge) = 0; + + protected: + // Controls are related to a manager, where the theme resides + // and control groups can be implemented + olc::QuickGUI::Manager& m_manager; + + // All controls exists in one of four states + // Disabled - Greyed out and not interactive + // Normal - interactive and operational + // Hover - currently under the users mouse focus + // Click - user is interacting with the control + enum class State { Disabled, Normal, Hover, Click } m_state = State::Normal; + + // To add a "swish" to things, controls can fade between states + float m_fTransition = 0.0; + }; + + + // A QuickGUI::Manager acts as a convenient grouping of controls + class Manager + { + public: + // Construct Manager, bCleanUpForMe will automatically DELETE any controls + // given to this manager via AddControl() if true + Manager(const bool bCleanUpForMe = true); + virtual ~Manager(); + + public: + // Add a gui element derived form BaseControl to this manager + void AddControl(BaseControl* control); + // Updates all controls this manager operates + void Update(olc::PixelGameEngine* pge); + // Draws as "sprite" all controls this manager operates + void Draw(olc::PixelGameEngine* pge); + // Draws as "decal" all controls this manager operates + void DrawDecal(olc::PixelGameEngine* pge); + + public: // This managers "Theme" can be set here + // Various element colours + olc::Pixel colNormal = olc::DARK_BLUE; + olc::Pixel colHover = olc::BLUE; + olc::Pixel colClick = olc::CYAN; + olc::Pixel colDisable = olc::DARK_GREY; + olc::Pixel colBorder = olc::WHITE; + olc::Pixel colText = olc::WHITE; + // Speed to transiton from Normal -> Hover + float fHoverSpeedOn = 10.0f; + // Speed to transiton from Hover -> Normal + float fHoverSpeedOff = 4.0f; + // Size of grab handle + float fGrabRad = 8.0f; + // Copy all theme attributes into a different manager object + void CopyThemeFrom(const Manager& manager); + + private: + // Should this manager call delete on the controls it opeerates? + bool m_bEraseControlsOnDestroy = true; + // Container of controls + std::vector m_vControls; + }; + + + // Creates a Label Control - it's just text! + class Label : public BaseControl + { + public: + Label(olc::QuickGUI::Manager& manager, // Associate with a Manager + const std::string& text, // Text to display + const olc::vf2d& pos, // Location of label top-left + const olc::vf2d& size); // Size of label + + public: + // Position of button + olc::vf2d vPos; + // Size of button + olc::vf2d vSize; + // Text displayed on button + std::string sText; + // Show a border? + bool bHasBorder = false; + // Show a background? + bool bHasBackground = false; + // Where should the text be positioned? + enum class Alignment + {Left, Centre, Right} nAlign = Alignment::Centre; + + public: // BaseControl overrides + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + class TextBox : public Label + { + public: + TextBox(olc::QuickGUI::Manager& manager, // Associate with a Manager + const std::string& text, // Text to display + const olc::vf2d& pos, // Location of text box top-left + const olc::vf2d& size); // Size of text box + + public: // BaseControl overrides + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + + protected: + bool m_bTextEdit = false; + + }; + + // Creates a Button Control - a clickable, labelled rectangle + class Button : public BaseControl + { + public: + Button(olc::QuickGUI::Manager& manager, // Associate with a Manager + const std::string& text, // Text to display + const olc::vf2d& pos, // Location of button top-left + const olc::vf2d& size); // Size of button + + public: + // Position of button + olc::vf2d vPos; + // Size of button + olc::vf2d vSize; + // Text displayed on button + std::string sText; + + public: // BaseControl overrides + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + // Creates a Button Control - a clickable, labelled rectangle + class CheckBox : public Button + { + public: + CheckBox(olc::QuickGUI::Manager& manager, // Associate with a Manager + const std::string& text, // Text to display + const bool check, // Is checked or not? + const olc::vf2d& pos, // Location of button top-left + const olc::vf2d& size); // Size of button + + public: + bool bChecked = false; + + public: // BaseControl overrides + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + class ImageButton : public Button + { + public: + ImageButton(olc::QuickGUI::Manager& manager, // Associate with a Manager + const olc::Renderable &icon, // Text to display + const olc::vf2d& pos, // Location of button top-left + const olc::vf2d& size); // Size of button + + public: + const olc::Renderable& pIcon; + + public: + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + class ImageCheckBox : public ImageButton + { + public: + ImageCheckBox(olc::QuickGUI::Manager& manager, // Associate with a Manager + const olc::Renderable& icon, // Text to display + const bool check, // Is checked or not? + const olc::vf2d& pos, // Location of button top-left + const olc::vf2d& size); // Size of button + + public: + bool bChecked = false; + + public: + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + + // Creates a Slider Control - a grabbable handle that slides between two locations + class Slider : public BaseControl + { + public: + Slider(olc::QuickGUI::Manager& manager, // Associate with a Manager + const olc::vf2d& posmin, // Screen location of "minimum" + const olc::vf2d& posmax, // Screen location of "maximum" + const float valmin, // Value of minimum + const float valmax, // Value of maximum + const float value); // Starting value + + public: + // Minium value + float fMin = -100.0f; + // Maximum value + float fMax = +100.0f; + // Current value + float fValue = 0.0f; + + // Location of minimum/start + olc::vf2d vPosMin; + // Location of maximum/end + olc::vf2d vPosMax; + + public: // BaseControl overrides + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + + class ListBox : public BaseControl + { + public: + ListBox(olc::QuickGUI::Manager& manager, // Associate with a Manager + std::vector& vList, + const olc::vf2d& pos, // Location of list top-left + const olc::vf2d& size); // Size of list + + // Position of list + olc::vf2d vPos; + // Size of list + olc::vf2d vSize; + // Show a border? + bool bHasBorder = true; + // Show a background? + bool bHasBackground = true; + + public: + Slider *m_pSlider = nullptr; + Manager m_group; + size_t m_nVisibleItems = 0; + std::vector& m_vList; + + public: + // Item currently selected + size_t nSelectedItem = 0; + size_t nPreviouslySelectedItem = 0; + // Has selection changed? + bool bSelectionChanged = false; + + public: // BaseControl overrides + void Update(olc::PixelGameEngine* pge) override; + void Draw(olc::PixelGameEngine* pge) override; + void DrawDecal(olc::PixelGameEngine* pge) override; + }; + + + class ModalDialog : public olc::PGEX + { + public: + ModalDialog(); + + public: + void ShowFileOpen(const std::string& sPath); + + protected: + virtual bool OnBeforeUserUpdate(float& fElapsedTime) override; + + private: + bool m_bShowDialog = false; + + Manager m_manFileSelect; + ListBox* m_listVolumes = nullptr; + ListBox* m_listDirectory = nullptr; + ListBox* m_listFiles = nullptr; + + std::vector m_vVolumes; + std::vector m_vDirectory; + std::vector m_vFiles; + std::filesystem::path m_path; + }; +} + + +#ifdef OLC_PGEX_QUICKGUI +#undef OLC_PGEX_QUICKGUI +namespace olc::QuickGUI +{ + +#pragma region BaseControl + BaseControl::BaseControl(olc::QuickGUI::Manager& manager) : m_manager(manager) + { + m_manager.AddControl(this); + } + + BaseControl::~BaseControl() + { + + } + + void BaseControl::Enable(const bool bEnable) + { + m_state = bEnable ? State::Normal : State::Disabled; + } +#pragma endregion + +#pragma region Manager + Manager::Manager(const bool bCleanUpForMe) + { + m_bEraseControlsOnDestroy = bCleanUpForMe; + } + + Manager::~Manager() + { + if (m_bEraseControlsOnDestroy) + for (auto& p : m_vControls) + delete p; + + m_vControls.clear(); + } + + void Manager::AddControl(BaseControl* control) + { + m_vControls.push_back(control); + } + + void Manager::Update(olc::PixelGameEngine* pge) + { + for (auto& p : m_vControls) p->Update(pge); + } + + void Manager::Draw(olc::PixelGameEngine* pge) + { + for (auto& p : m_vControls) p->Draw(pge); + } + + void Manager::DrawDecal(olc::PixelGameEngine* pge) + { + for (auto& p : m_vControls) p->DrawDecal(pge); + } + + void Manager::CopyThemeFrom(const Manager& manager) + { + this->colBorder = manager.colBorder; + this->colClick = manager.colClick; + this->colDisable = manager.colDisable; + this->colHover = manager.colHover; + this->colNormal = manager.colNormal; + this->colText = manager.colText; + this->fGrabRad = manager.fGrabRad; + this->fHoverSpeedOff = manager.fHoverSpeedOff; + this->fHoverSpeedOn = manager.fHoverSpeedOn; + } +#pragma endregion + +#pragma region Label + Label::Label(olc::QuickGUI::Manager& manager, const std::string& text, const olc::vf2d& pos, const olc::vf2d& size) + : BaseControl(manager) + { + vPos = pos; vSize = size; sText = text; + } + + void Label::Update(olc::PixelGameEngine* pge) + { + + } + + void Label::Draw(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + if (bHasBackground) + { + pge->FillRect(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colNormal); + } + + if(bHasBorder) + pge->DrawRect(vPos, vSize - olc::vf2d(1, 1), m_manager.colBorder); + + olc::vf2d vText = pge->GetTextSizeProp(sText); + switch (nAlign) + { + case Alignment::Left: + pge->DrawStringProp(olc::vf2d( vPos.x + 2.0f, vPos.y + (vSize.y - vText.y) * 0.5f ), sText, m_manager.colText); + break; + case Alignment::Centre: + pge->DrawStringProp(vPos + (vSize - vText) * 0.5f, sText, m_manager.colText); + break; + case Alignment::Right: + pge->DrawStringProp(olc::vf2d{ vPos.x + vSize.x - vText.x - 2.0f, vPos.y + (vSize.y - vText.y) * 0.5f }, sText, m_manager.colText); + break; + } + } + + void Label::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + if (bHasBackground) + { + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colNormal); + } + + if (bHasBorder) + { + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2,2), m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + } + + olc::vf2d vText = pge->GetTextSizeProp(sText); + switch (nAlign) + { + case Alignment::Left: + pge->DrawStringPropDecal({ vPos.x + 2.0f, vPos.y + (vSize.y - vText.y) * 0.5f }, sText, m_manager.colText); + break; + case Alignment::Centre: + pge->DrawStringPropDecal(vPos + (vSize - vText) * 0.5f, sText, m_manager.colText); + break; + case Alignment::Right: + pge->DrawStringPropDecal({ vPos.x + vSize.x - vText.x - 2.0f, vPos.y + (vSize.y - vText.y) * 0.5f }, sText, m_manager.colText); + break; + } + } +#pragma endregion + + +#pragma region TextBox + TextBox::TextBox(olc::QuickGUI::Manager& manager, const std::string& text, const olc::vf2d& pos, const olc::vf2d& size) + : Label(manager, text, pos, size) + { + nAlign = Alignment::Left; + bHasBorder = true; + bHasBackground = false; + } + + void TextBox::Update(olc::PixelGameEngine* pge) + { + if (m_state == State::Disabled || !bVisible) + return; + + bPressed = false; + bReleased = false; + + olc::vf2d vMouse = pge->GetMousePos(); + + if (vMouse.x >= vPos.x && vMouse.x < vPos.x + vSize.x && + vMouse.y >= vPos.y && vMouse.y < vPos.y + vSize.y) + { + // Released inside box does nothing to me, but i may have + // to finish off the neighbours... oo err + bPressed = pge->GetMouse(olc::Mouse::LEFT).bPressed; + bReleased = pge->GetMouse(olc::Mouse::LEFT).bReleased; + + if (bPressed && pge->IsTextEntryEnabled() && !m_bTextEdit) + { + pge->TextEntryEnable(false); + } + + + if (bPressed && !pge->IsTextEntryEnabled() && !m_bTextEdit) + { + pge->TextEntryEnable(true, sText); + m_bTextEdit = true; + } + + bHeld = pge->GetMouse(olc::Mouse::LEFT).bHeld; + + + } + else + { + // Released outside box + bPressed = pge->GetMouse(olc::Mouse::LEFT).bPressed; + bReleased = pge->GetMouse(olc::Mouse::LEFT).bReleased; + bHeld = pge->GetMouse(olc::Mouse::LEFT).bHeld; + + if (bPressed && m_bTextEdit) + { + sText = pge->TextEntryGetString(); + pge->TextEntryEnable(false); + m_bTextEdit = false; + } + } + + if (m_bTextEdit && pge->IsTextEntryEnabled()) + sText = pge->TextEntryGetString(); + } + + void TextBox::Draw(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + if (bHasBackground) + { + pge->FillRect(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colNormal); + } + + if (bHasBorder) + pge->DrawRect(vPos, vSize - olc::vf2d(1, 1), m_manager.colBorder); + + if (m_bTextEdit && pge->IsTextEntryEnabled()) + { + // Draw Cursor + int32_t i = pge->TextEntryGetCursor(); + olc::vf2d vCursorPos = pge->GetTextSizeProp(sText.substr(0, i)); + pge->FillRect(olc::vf2d(vPos.x + 2.0f + vCursorPos.x, (vPos.y + (vSize.y - 10.0f) * 0.5f)), { 2, 10 }, m_manager.colText); + } + + // Draw Text + olc::vf2d vText = pge->GetTextSizeProp(sText); + pge->DrawStringProp(olc::vf2d(vPos.x + 2.0f, vPos.y + (vSize.y - vText.y) * 0.5f), sText, m_manager.colText); + + } + + void TextBox::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + if (bHasBackground) + { + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colNormal); + } + + if (bHasBorder) + { + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + } + + if (m_bTextEdit && pge->IsTextEntryEnabled()) + { + // Draw Cursor + int32_t i = pge->TextEntryGetCursor(); + olc::vf2d vCursorPos = pge->GetTextSizeProp(sText.substr(0, i)); + pge->FillRectDecal(olc::vf2d(vPos.x + 2.0f + vCursorPos.x, (vPos.y + (vSize.y - 10.0f) * 0.5f)), { 2, 10 }, m_manager.colText); + } + + // Draw Text + olc::vf2d vText = pge->GetTextSizeProp(sText); + pge->DrawStringPropDecal(olc::vf2d(vPos.x + 2.0f, vPos.y + (vSize.y - vText.y) * 0.5f), sText, m_manager.colText); + } +#pragma endregion + +#pragma region Button + Button::Button(olc::QuickGUI::Manager& manager, const std::string& text, const olc::vf2d& pos, const olc::vf2d& size) + : BaseControl(manager) + { + vPos = pos; vSize = size; sText = text; + } + + void Button::Update(olc::PixelGameEngine* pge) + { + if (m_state == State::Disabled || !bVisible) + return; + + bPressed = false; + bReleased = false; + float fElapsedTime = pge->GetElapsedTime(); + + olc::vf2d vMouse = pge->GetMousePos(); + if (m_state != State::Click) + { + if (vMouse.x >= vPos.x && vMouse.x < vPos.x + vSize.x && + vMouse.y >= vPos.y && vMouse.y < vPos.y + vSize.y) + { + m_fTransition += fElapsedTime * m_manager.fHoverSpeedOn; + m_state = State::Hover; + + bPressed = pge->GetMouse(olc::Mouse::LEFT).bPressed; + if (bPressed) + { + m_state = State::Click; + } + + bHeld = pge->GetMouse(olc::Mouse::LEFT).bHeld; + } + else + { + m_fTransition -= fElapsedTime * m_manager.fHoverSpeedOff; + m_state = State::Normal; + } + } + else + { + bHeld = pge->GetMouse(olc::Mouse::LEFT).bHeld; + bReleased = pge->GetMouse(olc::Mouse::LEFT).bReleased; + if (bReleased) m_state = State::Normal; + } + + m_fTransition = std::clamp(m_fTransition, 0.0f, 1.0f); + } + + void Button::Draw(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + switch (m_state) + { + case State::Disabled: + pge->FillRect(vPos, vSize, m_manager.colDisable); + break; + case State::Normal: + case State::Hover: + pge->FillRect(vPos, vSize, olc::PixelLerp(m_manager.colNormal, m_manager.colHover, m_fTransition)); + break; + case State::Click: + pge->FillRect(vPos, vSize, m_manager.colClick); + break; + } + + pge->DrawRect(vPos, vSize - olc::vf2d(1, 1), m_manager.colBorder); + olc::vf2d vText = pge->GetTextSizeProp(sText); + pge->DrawStringProp(vPos + (vSize - vText) * 0.5f, sText, m_manager.colText); + } + + void Button::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + switch (m_state) + { + case State::Disabled: + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colDisable); + break; + case State::Normal: + case State::Hover: + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), olc::PixelLerp(m_manager.colNormal, m_manager.colHover, m_fTransition)); + break; + case State::Click: + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colClick); + break; + } + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + + olc::vf2d vText = pge->GetTextSizeProp(sText); + pge->DrawStringPropDecal(vPos + (vSize - vText) * 0.5f, sText, m_manager.colText); + } +#pragma endregion + + +#pragma region ImageButton + ImageButton::ImageButton(olc::QuickGUI::Manager& manager, const olc::Renderable& icon, const olc::vf2d& pos, const olc::vf2d& size) + : Button(manager, "", pos, size), pIcon(icon) + { + + } + + void ImageButton::Draw(olc::PixelGameEngine* pge) + { + Button::Draw(pge); + pge->DrawSprite(vPos + olc::vi2d(4, 4), pIcon.Sprite()); + } + + void ImageButton::DrawDecal(olc::PixelGameEngine* pge) + { + Button::DrawDecal(pge); + pge->DrawDecal(vPos + olc::vi2d(4, 4), pIcon.Decal()); + } +#pragma endregion + + +#pragma region ImageCheckBox + ImageCheckBox::ImageCheckBox(olc::QuickGUI::Manager& manager, const olc::Renderable& gfx, const bool check, const olc::vf2d& pos, const olc::vf2d& size) + : ImageButton(manager, gfx, pos, size) + { + bChecked = check; + } + + void ImageCheckBox::Update(olc::PixelGameEngine* pge) + { + if (m_state == State::Disabled || !bVisible) + return; + + ImageButton::Update(pge); + if (bPressed) bChecked = !bChecked; + } + + void ImageCheckBox::Draw(olc::PixelGameEngine* pge) + { + ImageButton::Draw(pge); + + if (bChecked) + pge->DrawRect(vPos + olc::vf2d(2, 2), vSize - olc::vi2d(5, 5), m_manager.colBorder); + } + + void ImageCheckBox::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + ImageButton::DrawDecal(pge); + + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vPos + olc::vf2d(2, 2), vSize - olc::vf2d(4, 4), m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + + olc::vf2d vText = pge->GetTextSizeProp(sText); + pge->DrawStringPropDecal(vPos + (vSize - vText) * 0.5f, sText, m_manager.colText); + } +#pragma endregion + + +#pragma region CheckBox + CheckBox::CheckBox(olc::QuickGUI::Manager& manager, const std::string& text, const bool check, const olc::vf2d& pos, const olc::vf2d& size) + : Button(manager, text, pos, size) + { + bChecked = check; + } + + void CheckBox::Update(olc::PixelGameEngine* pge) + { + if (m_state == State::Disabled || !bVisible) + return; + + Button::Update(pge); + if (bPressed) + bChecked = !bChecked; + } + + void CheckBox::Draw(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + Button::Draw(pge); + + if (bChecked) + pge->DrawRect(vPos + olc::vf2d(2, 2), vSize - olc::vi2d(5, 5), m_manager.colBorder); + } + + void CheckBox::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + Button::DrawDecal(pge); + + if (bChecked) + { + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vPos + olc::vf2d(2, 2), vSize - olc::vf2d(4, 4), m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + } + + olc::vf2d vText = pge->GetTextSizeProp(sText); + pge->DrawStringPropDecal(vPos + (vSize - vText) * 0.5f, sText, m_manager.colText); + } +#pragma endregion + +#pragma region Slider + Slider::Slider(olc::QuickGUI::Manager& manager, const olc::vf2d& posmin, const olc::vf2d& posmax, const float valmin, const float valmax, const float value) + : BaseControl(manager) + { + vPosMin = posmin; vPosMax = posmax; fMin = valmin; fMax = valmax; fValue = value; + } + + void Slider::Update(olc::PixelGameEngine* pge) + { + if (m_state == State::Disabled || !bVisible) + return; + + float fElapsedTime = pge->GetElapsedTime(); + + olc::vf2d vMouse = pge->GetMousePos(); + bHeld = false; + if (m_state == State::Click) + { + olc::vf2d d = vPosMax - vPosMin; + float u = d.dot(vMouse - vPosMin) / d.mag2(); + fValue = u * (fMax - fMin) + fMin; + bHeld = true; + } + else + { + olc::vf2d vSliderPos = vPosMin + (vPosMax - vPosMin) * ((fValue - fMin) / (fMax - fMin)); + if ((vMouse - vSliderPos).mag2() <= int32_t(m_manager.fGrabRad) * int32_t(m_manager.fGrabRad)) + { + m_fTransition += fElapsedTime * m_manager.fHoverSpeedOn; + m_state = State::Hover; + if (pge->GetMouse(olc::Mouse::LEFT).bPressed) + { + m_state = State::Click; + bPressed = true; + } + } + else + m_state = State::Normal; + } + + if (pge->GetMouse(olc::Mouse::LEFT).bReleased) + { + m_state = State::Normal; + bReleased = true; + } + + if (m_state == State::Normal) + { + m_fTransition -= fElapsedTime * m_manager.fHoverSpeedOff; + m_state = State::Normal; + bHeld = false; + } + + fValue = std::clamp(fValue, fMin, fMax); + m_fTransition = std::clamp(m_fTransition, 0.0f, 1.0f); + } + + void Slider::Draw(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + pge->DrawLine(vPosMin, vPosMax, m_manager.colBorder); + olc::vf2d vSliderPos = vPosMin + (vPosMax - vPosMin) * ((fValue - fMin) / (fMax - fMin)); + + switch (m_state) + { + case State::Disabled: + pge->FillCircle(vSliderPos, int32_t(m_manager.fGrabRad), m_manager.colDisable); + break; + case State::Normal: + case State::Hover: + pge->FillCircle(vSliderPos, int32_t(m_manager.fGrabRad), olc::PixelLerp(m_manager.colNormal, m_manager.colHover, m_fTransition)); + break; + case State::Click: + pge->FillCircle(vSliderPos, int32_t(m_manager.fGrabRad), m_manager.colClick); + break; + } + + + pge->DrawCircle(vSliderPos, int32_t(m_manager.fGrabRad), m_manager.colBorder); + } + + void Slider::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + pge->DrawLineDecal(vPosMin, vPosMax, m_manager.colBorder); + olc::vf2d vSliderPos = vPosMin + (vPosMax - vPosMin) * ((fValue - fMin) / (fMax - fMin)); + + switch (m_state) + { + case State::Disabled: + pge->FillRectDecal(vSliderPos - olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad), olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad) * 2.0f, m_manager.colDisable); + break; + case State::Normal: + case State::Hover: + pge->FillRectDecal(vSliderPos - olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad), olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad) * 2.0f, olc::PixelLerp(m_manager.colNormal, m_manager.colHover, m_fTransition)); + break; + case State::Click: + pge->FillRectDecal(vSliderPos - olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad), olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad) * 2.0f, m_manager.colClick); + break; + } + + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vSliderPos - olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad), olc::vf2d(m_manager.fGrabRad, m_manager.fGrabRad) * 2.0f, m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + } + + +#pragma endregion + +#pragma region ListBox + ListBox::ListBox(olc::QuickGUI::Manager& manager, std::vector& vList, const olc::vf2d& pos, const olc::vf2d& size) + : BaseControl(manager), m_vList(vList) + { + m_group.CopyThemeFrom(m_manager); + vPos = pos; + vSize = size; + m_pSlider = new Slider(m_group, { pos.x + size.x - m_manager.fGrabRad - 1, pos.y + m_manager.fGrabRad + 1 }, + { pos.x + size.x - m_manager.fGrabRad - 1, pos.y + size.y - m_manager.fGrabRad - 1 }, 0, float(m_vList.size()), 0); + } + + void ListBox::Update(olc::PixelGameEngine* pge) + { + if (m_state == State::Disabled || !bVisible) + return; + + + nPreviouslySelectedItem = nSelectedItem; + olc::vf2d vMouse = pge->GetMousePos() - vPos + olc::vi2d(2,0); + if (pge->GetMouse(olc::Mouse::LEFT).bPressed) + { + if (vMouse.x >= 0 && vMouse.x < vSize.x - (m_group.fGrabRad * 2) && vMouse.y >= 0 && vMouse.y < vSize.y) + { + + nSelectedItem = size_t(m_pSlider->fValue + vMouse.y / 10); + } + } + + nSelectedItem = std::clamp(nSelectedItem, size_t(0), m_vList.size()-1); + + bSelectionChanged = nSelectedItem != nPreviouslySelectedItem; + + + m_pSlider->fMax = float(m_vList.size()); + m_group.Update(pge); + } + + void ListBox::Draw(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + if (bHasBackground) + { + pge->FillRect(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colNormal); + } + + if (bHasBorder) + pge->DrawRect(vPos, vSize - olc::vf2d(1, 1), m_manager.colBorder); + + + size_t idx0 = size_t(m_pSlider->fValue); + size_t idx1 = std::min(idx0 + size_t((vSize.y - 4) / 10), m_vList.size()); + + olc::vf2d vTextPos = vPos + olc::vf2d(2,2); + for (size_t idx = idx0; idx < idx1; idx++) + { + if (idx == nSelectedItem) + pge->FillRect(vTextPos - olc::vi2d(1,1), {int32_t(vSize.x - m_group.fGrabRad * 2), 10}, m_group.colHover); + pge->DrawStringProp(vTextPos, m_vList[idx]); + vTextPos.y += 10; + } + + m_group.Draw(pge); + } + + void ListBox::DrawDecal(olc::PixelGameEngine* pge) + { + if (!bVisible) + return; + + if (bHasBackground) + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colNormal); + + size_t idx0 = size_t(m_pSlider->fValue); + size_t idx1 = std::min(idx0 + size_t((vSize.y - 4) / 10), m_vList.size()); + + olc::vf2d vTextPos = vPos + olc::vf2d(2, 2); + for (size_t idx = idx0; idx < idx1; idx++) + { + if (idx == nSelectedItem) + pge->FillRectDecal(vTextPos - olc::vi2d(1, 1), { vSize.x - m_group.fGrabRad * 2.0f, 10.0f }, m_group.colHover); + pge->DrawStringPropDecal(vTextPos, m_vList[idx]); + vTextPos.y += 10; + } + + if (bHasBorder) + { + pge->SetDecalMode(olc::DecalMode::WIREFRAME); + pge->FillRectDecal(vPos + olc::vf2d(1, 1), vSize - olc::vf2d(2, 2), m_manager.colBorder); + pge->SetDecalMode(olc::DecalMode::NORMAL); + } + + m_group.DrawDecal(pge); + } +#pragma endregion + + + +#pragma region Modal + ModalDialog::ModalDialog() : olc::PGEX(true) + { + + // Create File Open Dialog + olc::vi2d vScreenSize = pge->GetScreenSize(); + + m_listDirectory = new ListBox(m_manFileSelect, m_vDirectory, olc::vf2d(20, 20), olc::vf2d(300, 500)); + m_listFiles = new ListBox(m_manFileSelect, m_vFiles, olc::vf2d(330, 20), olc::vf2d(300, 500)); + + m_path = "/"; + for (auto const& dir_entry : std::filesystem::directory_iterator{ m_path }) + { + if(dir_entry.is_directory()) + m_vDirectory.push_back(dir_entry.path().filename().string()); + else + m_vFiles.push_back(dir_entry.path().filename().string()); + } + } + + void ModalDialog::ShowFileOpen(const std::string& sPath) + { + m_bShowDialog = true; + } + + bool ModalDialog::OnBeforeUserUpdate(float& fElapsedTime) + { + if(!m_bShowDialog) return false; + + m_manFileSelect.Update(this->pge); + + if (pge->GetKey(olc::Key::BACK).bPressed) + { + m_path = m_path.parent_path().string() + "/"; + //m_listDirectory->bSelectionChanged = true; + //m_listDirectory->nSelectedItem = 0; + } + + if (m_listDirectory->bSelectionChanged) + { + std::string sDirectory = m_vDirectory[m_listDirectory->nSelectedItem]; + /*if (sDirectory == "..") + m_path = m_path.parent_path().string() + "/"; + else + m_path += sDirectory+ "/";*/ + + + m_path += sDirectory + "/"; + // Reconstruct Lists + m_vDirectory.clear(); + + m_vFiles.clear(); + + + for (auto const& dir_entry : std::filesystem::directory_iterator{ m_path }) + { + if (dir_entry.is_directory() || dir_entry.is_other()) + m_vDirectory.push_back(dir_entry.path().filename().string()); + else + m_vFiles.push_back(dir_entry.path().filename().string()); + } + + //m_vDirectory.push_back(".."); + + //m_listFiles->nSelectedItem = 0; + //m_listDirectory->nSelectedItem = 0; + + } + + pge->DrawStringDecal({ 0,0 }, m_path.string()); + + + + + m_manFileSelect.DrawDecal(this->pge); + + + + if (pge->GetKey(olc::Key::ESCAPE).bPressed) + { + m_bShowDialog = false; + return false; + } + + return true; + } +#pragma endregion + +} +#endif // OLC_PGEX_QUICKGUI +#endif // OLC_PGEX_QUICKGUI_H \ No newline at end of file diff --git a/olcCodeJam2023Entry/olcPGEX_SplashScreen.h b/olcCodeJam2023Entry/olcPGEX_SplashScreen.h new file mode 100644 index 0000000..2759970 --- /dev/null +++ b/olcCodeJam2023Entry/olcPGEX_SplashScreen.h @@ -0,0 +1,220 @@ +/* + olcPGEX_SplashScreen.h + + +-------------------------------------------------------------+ + | OneLoneCoder Pixel Game Engine Extension | + | Splash Screen v1.0 | + +-------------------------------------------------------------+ + + NOTE: UNDER ACTIVE DEVELOPMENT - THERE ARE BUGS/GLITCHES + + What is this? + ~~~~~~~~~~~~~ + This extension produces an animated splashscreen and copyright notice + at the beginning of a PGE application, for the purposes of remaining + OLC-3 compliant should it be ambiguous in your deployment. + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2022 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions or derivations of source code must retain the above + copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce + the above copyright notice. This list of conditions and the following + disclaimer must be reproduced in the documentation and/or other + materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + + Author + ~~~~~~ + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021, 2022 + + Revisions: + 1.00: Initial Release +*/ + +#pragma once + +#include "olcPixelGameEngine.h" + +namespace olc +{ + class SplashScreen : public olc::PGEX + { + public: + SplashScreen(); + + protected: + virtual void OnAfterUserCreate() override; + virtual bool OnBeforeUserUpdate(float& fElapsedTime) override; + + private: + olc::Renderable spr; + std::vector> vBoom; + olc::vf2d vScale; + olc::vf2d vPosition; + float fParticleTime = 0.0f; + float fAspect = 0.0f; + bool bComplete = false; + }; + + +} + +#ifdef OLC_PGEX_SPLASHSCREEN +#undef OLC_PGEX_SPLASHSCREEN + +namespace olc +{ + SplashScreen::SplashScreen() : olc::PGEX(true) + { + } + + void SplashScreen::OnAfterUserCreate() + { + const char logo[] = + "000000000000000000000000000000000000000000000000000000000000000000005" + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED1EE" + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED5EEE" + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE@E@000" + "0000000000000000000000000000000000000000000000000000000000001E1D:ZZZZ" + "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ1D5BZZZZZZ" + "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ5@E:P0002Z0" + "02ZZX000000000000ZP0000000000000000000000000000ZX000Z002XE1DX?o`o:Poo" + "800SooaE5@E1ED5BX?ol5E@E0E1ED?oo5@E1ED5DE1D5E@ZQEEBPEE2QD5BSooclZ?olQ" + "AB?oo5DEEDEEDE:SooaEEAE5DEEDoolEADEEDEAE5AEEBZ5EE:5EE:5@E:?oo?bXoob55" + "8o3lEAEEAD5ADZ?oo5@E5EEAD5Cl01E5AD5AE5DE5@E:X01DXEEDXE1DXo3lo:Sl0800S" + "ooaE1ED5EE5BXo00EEDEEE5EE?oo5EE5EE5DEEDEEDZQEEBQD5BQD5BSl?cl0?`0ZZZ?o" + "o5D5E@EEDE03loaEEAEEDEEDoolEED5EDEAEEAEEBZ5EE:5@E:5@E:?oo?oloob008o00" + "EAEEAD01EE?co5EE5EEAD03l01DE@05AE5AE5@0:XE000EEDXE1DXooloocoo8DDSlZQE" + "5EE5EE5EDoolE1DE4E5EE?oo5AE5EE5DE5DEEDZQEEAAEEBQD5BPoo3oo3olQAB?bZ5DE" + "1D5EDEE@ooaD5AD1D5EDoolE1DEE@EAD5@EEBZ5EE51ED:5@E:P000000020080:X0000" + "00000000000000000000000000000000000:X0000002XE1DZZZZZZZZZZZZZZZZZZZZZ" + "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZQD5@ZZZZZZZZZZZZZZZZZZZZZZ" + "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZX5@E@00000000000000000000000" + "00000000000000000000000000000000000000001E1EEEEEEEEEEEEEEEEEEEEEEEEEE" + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED5EEEEEEEEEEEEEEEEEEEEEEEEEEE" + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE@5EEEEEEEEEEEEEEEEEEEEEEEEEEEE" + "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEED0000000000000000000000000000000" + "0000000000000000000000000000000000000"; + + spr.Create(203, 24); + int px = 0, py = 0; + for (size_t b = 0; b < 1624; b += 4) + { + uint32_t sym1 = (uint32_t)logo[b + 0] - 48; + uint32_t sym2 = (uint32_t)logo[b + 1] - 48; + uint32_t sym3 = (uint32_t)logo[b + 2] - 48; + uint32_t sym4 = (uint32_t)logo[b + 3] - 48; + uint32_t r = sym1 << 18 | sym2 << 12 | sym3 << 6 | sym4; + + for (int i = 0; i < 12; i++) + { + olc::Pixel p = olc::RED; + switch ((r & 0xC00000) >> 22) + { + case 0: p = olc::Pixel(0, 0, 0, 255); break; + case 1: p = olc::Pixel(255, 255, 255, 255); break; + case 2: p = olc::Pixel(255, 120, 26, 255); break; + case 3: p = olc::Pixel(79, 193, 255, 255); break; + } + spr.Sprite()->SetPixel(px, py, p); + if (++px == 203) { py++; px = 0; } + r <<= 2; + } + } + + spr.Decal()->Update(); + vBoom.resize(spr.Sprite()->width * spr.Sprite()->height); + vScale = { float(pge->ScreenWidth()) / 500.0f, float(pge->ScreenWidth()) / 500.0f }; + fAspect = float(pge->ScreenWidth()) / float(pge->ScreenHeight()); + vPosition = olc::vf2d( + (250 - spr.Sprite()->width) / 2.0f, + (250 - spr.Sprite()->height) / 2.0f / fAspect); + for (int y = 0; y < spr.Sprite()->height; y++) + for (int x = 0; x < spr.Sprite()->width; x++) + vBoom[y * spr.Sprite()->width + x] = std::make_pair( + vPosition + olc::vf2d(x, y), + olc::vf2d( + (float(rand()) / float(RAND_MAX)) * 10.0f - 5.0f, + (float(rand()) / float(RAND_MAX)) * 10.0f - 5.0f) + ); + } + + bool SplashScreen::OnBeforeUserUpdate(float& fElapsedTime) + { + if (bComplete) return false; + + fParticleTime += fElapsedTime; + + for (int y = 0; y < spr.Sprite()->height; y++) + for (int x = 0; x < spr.Sprite()->width; x++) + { + + + if (fParticleTime < 1.0f) + { + + } + else if (fParticleTime < 2.0f) + { + vBoom[y * spr.Sprite()->width + x].first = + olc::vf2d( + (250 - spr.Sprite()->width) / 2.0f + float(x), + (250 - spr.Sprite()->height) / 2.0f / fAspect + float(y) + ) + + olc::vf2d( + (float(rand()) / float(RAND_MAX)) * 0.5f - 0.25f, + (float(rand()) / float(RAND_MAX)) * 0.5f - 0.25f); + } + else if(fParticleTime < 5.0f) + { + vBoom[y * spr.Sprite()->width + x].first += vBoom[y * spr.Sprite()->width + x].second * fElapsedTime * 20.0f; + } + else + { + bComplete = true; + } + + pge->DrawPartialDecal(vScale * vBoom[y * spr.Sprite()->width + x].first * 2.0f, spr.Decal(), olc::vf2d(x, y), { 1, 1 }, vScale * 2.0f, olc::PixelF(1.0f, 1.0f, 1.0f, std::min(1.0f, std::max(4.0f - fParticleTime, 0.0f)))); + } + + olc::vi2d vSize = pge->GetTextSizeProp("Copyright OneLoneCoder.com 2022"); + pge->DrawStringPropDecal(olc::vf2d(float(pge->ScreenWidth()/2) - vSize.x/2, float(pge->ScreenHeight()) - vSize.y * 3.0f), "Copyright OneLoneCoder.com 2022", olc::PixelF(1.0f, 1.0f, 1.0f, 0.5f), olc::vf2d(1.0, 2.0f)); + return true; + } + +} + +#endif \ No newline at end of file diff --git a/olcCodeJam2023Entry/olcPGEX_TransformedView.h b/olcCodeJam2023Entry/olcPGEX_TransformedView.h new file mode 100644 index 0000000..e37af85 --- /dev/null +++ b/olcCodeJam2023Entry/olcPGEX_TransformedView.h @@ -0,0 +1,746 @@ +/* + olcPGEX_TransformedView.h + + +-------------------------------------------------------------+ + | OneLoneCoder Pixel Game Engine Extension | + | Transformed View v1.08 | + +-------------------------------------------------------------+ + + NOTE: UNDER ACTIVE DEVELOPMENT - THERE ARE BUGS/GLITCHES + + What is this? + ~~~~~~~~~~~~~ + This extension provides drawing routines that are compatible with + changeable world and screen spaces. For example you can pan and + zoom, and all PGE drawing routines will automatically adopt the current + world scales and offsets. + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2022 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions or derivations of source code must retain the above + copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce + the above copyright notice. This list of conditions and the following + disclaimer must be reproduced in the documentation and/or other + materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + + Author + ~~~~~~ + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021, 2022 + + Revisions: + 1.00: Initial Release + 1.01: Fix for rounding error when scaling to screen + 1.02: Added DrawLineDecal for convenience + 1.03: Removed std::floor from WorldToScreen() + Added HandlePanAndZoom(...) convenience function + Removed unused "range" facility in TileTransformView + 1.04: Added DrawPolygonDecal() for arbitrary polygons + 1.05: Clipped DrawSprite() to visible area, massive performance increase + 1.06: Fixed error in DrawLine() - Thanks CraisyDaisyRecords (& Fern)! + 1.07: +DrawRectDecal() + +GetPGE() + 1.08: +DrawPolygonDecal() with tint overload, akin to PGE +*/ + +#pragma once +#ifndef OLC_PGEX_TRANSFORMEDVIEW_H +#define OLC_PGEX_TRANSFORMEDVIEW_H + +#include "olcPixelGameEngine.h" + + + +namespace olc +{ + class TransformedView : public olc::PGEX + { + public: + TransformedView() = default; + virtual void Initialise(const olc::vi2d& vViewArea, const olc::vf2d& vPixelScale = { 1.0f, 1.0f }); + + olc::PixelGameEngine* GetPGE(); + + public: + void SetWorldOffset(const olc::vf2d& vOffset); + void MoveWorldOffset(const olc::vf2d& vDeltaOffset); + void SetWorldScale(const olc::vf2d& vScale); + void SetViewArea(const olc::vi2d& vViewArea); + olc::vf2d GetWorldTL() const; + olc::vf2d GetWorldBR() const; + olc::vf2d GetWorldVisibleArea() const; + void ZoomAtScreenPos(const float fDeltaZoom, const olc::vi2d& vPos); + void SetZoom(const float fZoom, const olc::vf2d& vPos); + void StartPan(const olc::vi2d& vPos); + void UpdatePan(const olc::vi2d& vPos); + void EndPan(const olc::vi2d& vPos); + const olc::vf2d& GetWorldOffset() const; + const olc::vf2d& GetWorldScale() const; + virtual olc::vf2d WorldToScreen(const olc::vf2d& vWorldPos) const; + virtual olc::vf2d ScreenToWorld(const olc::vf2d& vScreenPos) const; + virtual olc::vf2d ScaleToWorld(const olc::vf2d& vScreenSize) const; + virtual olc::vf2d ScaleToScreen(const olc::vf2d& vWorldSize) const; + virtual bool IsPointVisible(const olc::vf2d& vPos) const; + virtual bool IsRectVisible(const olc::vf2d& vPos, const olc::vf2d& vSize) const; + virtual void HandlePanAndZoom(const int nMouseButton = 2, const float fZoomRate = 0.1f, const bool bPan = true, const bool bZoom = true); + protected: + olc::vf2d m_vWorldOffset = { 0.0f, 0.0f }; + olc::vf2d m_vWorldScale = { 1.0f, 1.0f }; + olc::vf2d m_vRecipPixel = { 1.0f, 1.0f }; + olc::vf2d m_vPixelScale = { 1.0f, 1.0f }; + bool m_bPanning = false; + olc::vf2d m_vStartPan = { 0.0f, 0.0f }; + olc::vi2d m_vViewArea; + + public: // Hopefully, these should look familiar! + // Plots a single point + virtual bool Draw(float x, float y, olc::Pixel p = olc::WHITE); + bool Draw(const olc::vf2d& pos, olc::Pixel p = olc::WHITE); + // Draws a line from (x1,y1) to (x2,y2) + void DrawLine(float x1, float y1, float x2, float y2, olc::Pixel p = olc::WHITE, uint32_t pattern = 0xFFFFFFFF); + void DrawLine(const olc::vf2d& pos1, const olc::vf2d& pos2, olc::Pixel p = olc::WHITE, uint32_t pattern = 0xFFFFFFFF); + // Draws a circle located at (x,y) with radius + void DrawCircle(float x, float y, float radius, olc::Pixel p = olc::WHITE, uint8_t mask = 0xFF); + void DrawCircle(const olc::vf2d& pos, float radius, olc::Pixel p = olc::WHITE, uint8_t mask = 0xFF); + // Fills a circle located at (x,y) with radius + void FillCircle(float x, float y, float radius, olc::Pixel p = olc::WHITE); + void FillCircle(const olc::vf2d& pos, float radius, olc::Pixel p = olc::WHITE); + // Draws a rectangle at (x,y) to (x+w,y+h) + void DrawRect(float x, float y, float w, float h, olc::Pixel p = olc::WHITE); + void DrawRect(const olc::vf2d& pos, const olc::vf2d& size, olc::Pixel p = olc::WHITE); + // Fills a rectangle at (x,y) to (x+w,y+h) + void FillRect(float x, float y, float w, float h, olc::Pixel p = olc::WHITE); + void FillRect(const olc::vf2d& pos, const olc::vf2d& size, olc::Pixel p = olc::WHITE); + // Draws a triangle between points (x1,y1), (x2,y2) and (x3,y3) + void DrawTriangle(float x1, float y1, float x2, float y2, float x3, float y3, olc::Pixel p = olc::WHITE); + void DrawTriangle(const olc::vf2d& pos1, const olc::vf2d& pos2, const olc::vf2d& pos3, olc::Pixel p = olc::WHITE); + // Flat fills a triangle between points (x1,y1), (x2,y2) and (x3,y3) + void FillTriangle(float x1, float y1, float x2, float y2, float x3, float y3, olc::Pixel p = olc::WHITE); + void FillTriangle(const olc::vf2d& pos1, const olc::vf2d& pos2, const olc::vf2d& pos3, olc::Pixel p = olc::WHITE); + // Draws an entire sprite at location (x,y) + void DrawSprite(float x, float y, olc::Sprite* sprite, float scalex = 1, float scaley = 1, uint8_t flip = olc::Sprite::NONE); + void DrawSprite(const olc::vf2d& pos, olc::Sprite* sprite, const olc::vf2d& scale = { 1.0f, 1.0f }, uint8_t flip = olc::Sprite::NONE); + // Draws an area of a sprite at location (x,y), where the + // selected area is (ox,oy) to (ox+w,oy+h) + void DrawPartialSprite(float x, float y, Sprite* sprite, int32_t ox, int32_t oy, int32_t w, int32_t h, float scalex = 1, float scaley = 1, uint8_t flip = olc::Sprite::NONE); + void DrawPartialSprite(const olc::vf2d& pos, Sprite* sprite, const olc::vi2d& sourcepos, const olc::vi2d& size, const olc::vf2d& scale = { 1.0f, 1.0f }, uint8_t flip = olc::Sprite::NONE); + void DrawString(float x, float y, const std::string& sText, Pixel col, const olc::vf2d& scale); + void DrawString(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale); + + + // Draws a whole decal, with optional scale and tinting + void DrawDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + // Draws a region of a decal, with optional scale and tinting + void DrawPartialDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + // Draws fully user controlled 4 vertices, pos(pixels), uv(pixels), colours + void DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements = 4); + //// Draws a decal with 4 arbitrary points, warping the texture to look "correct" + void DrawWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::Pixel& tint = olc::WHITE); + void DrawWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::Pixel& tint = olc::WHITE); + void DrawWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::Pixel& tint = olc::WHITE); + //// As above, but you can specify a region of a decal source sprite + void DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + void DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + void DrawPartialWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + //// Draws a decal rotated to specified angle, wit point of rotation offset + void DrawRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f, 1.0f }, const olc::Pixel& tint = olc::WHITE); + // Draws a multiline string as a decal, with tiniting and scaling + void DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + // Draws a single shaded filled rectangle as a decal + void FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); + void DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); + + // Draws a corner shaded rectangle as a decal + void GradientFillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel colTL, const olc::Pixel colBL, const olc::Pixel colBR, const olc::Pixel colTR); + // Draws an arbitrary convex textured polygon using GPU + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const olc::Pixel tint = olc::WHITE); + void DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p = olc::WHITE); + void DrawPolygonDecal(olc::Decal* decal, const std::vector&pos, const std::vector&uv, const std::vector &tint); + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector& colours, const olc::Pixel tint); + + +#if defined(OLC_PGEX_SHADER) + // Shader Specific + void DrawDecal(olc::Shade& shader, const olc::vf2d & pos, olc::Decal * decal, const olc::vf2d & scale = { 1.0f,1.0f }, const olc::Pixel & tint = olc::WHITE); + void DrawPartialDecal(olc::Shade& shader, const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialDecal(olc::Shade& shader, const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); +#endif + + + + }; + + class TileTransformedView : public TransformedView + { + public: + TileTransformedView() = default; + TileTransformedView(const olc::vi2d& vViewArea, const olc::vi2d& vTileSize); + + public: + olc::vi2d GetTopLeftTile() const; + olc::vi2d GetBottomRightTile() const; + olc::vi2d GetVisibleTiles() const; + olc::vi2d GetTileUnderScreenPos(const olc::vi2d& vPos) const; + const olc::vi2d GetTileOffset() const; + + }; +} + +#ifdef OLC_PGEX_TRANSFORMEDVIEW +#undef OLC_PGEX_TRANSFORMEDVIEW + +namespace olc +{ + olc::PixelGameEngine* TransformedView::GetPGE() + { + return pge; + } + + void TransformedView::Initialise(const olc::vi2d& vViewArea, const olc::vf2d& vPixelScale) + { + SetViewArea(vViewArea); + SetWorldScale(vPixelScale); + m_vPixelScale = vPixelScale; + m_vRecipPixel = 1.0f / m_vPixelScale; + } + + void TransformedView::SetWorldOffset(const olc::vf2d& vOffset) + { + m_vWorldOffset = vOffset; + } + + void TransformedView::MoveWorldOffset(const olc::vf2d& vDeltaOffset) + { + m_vWorldOffset += vDeltaOffset; + } + + void TransformedView::SetWorldScale(const olc::vf2d& vScale) + { + m_vWorldScale = vScale; + } + + void TransformedView::SetViewArea(const olc::vi2d& vViewArea) + { + m_vViewArea = vViewArea; + } + + olc::vf2d TransformedView::GetWorldTL() const + { + return TransformedView::ScreenToWorld({ 0,0 }); + } + + olc::vf2d TransformedView::GetWorldBR() const + { + return TransformedView::ScreenToWorld(m_vViewArea); + } + + olc::vf2d TransformedView::GetWorldVisibleArea() const + { + return GetWorldBR() - GetWorldTL(); + } + + void TransformedView::ZoomAtScreenPos(const float fDeltaZoom, const olc::vi2d& vPos) + { + olc::vf2d vOffsetBeforeZoom = ScreenToWorld(vPos); + m_vWorldScale *= fDeltaZoom; + olc::vf2d vOffsetAfterZoom = ScreenToWorld(vPos); + m_vWorldOffset += vOffsetBeforeZoom - vOffsetAfterZoom; + } + + void TransformedView::SetZoom(const float fZoom, const olc::vf2d& vPos) + { + olc::vf2d vOffsetBeforeZoom = ScreenToWorld(vPos); + m_vWorldScale = { fZoom, fZoom }; + olc::vf2d vOffsetAfterZoom = ScreenToWorld(vPos); + m_vWorldOffset += vOffsetBeforeZoom - vOffsetAfterZoom; + } + + void TransformedView::StartPan(const olc::vi2d& vPos) + { + m_bPanning = true; + m_vStartPan = olc::vf2d(vPos); + } + + void TransformedView::UpdatePan(const olc::vi2d& vPos) + { + if (m_bPanning) + { + m_vWorldOffset -= (olc::vf2d(vPos) - m_vStartPan) / m_vWorldScale; + m_vStartPan = olc::vf2d(vPos); + } + } + + void TransformedView::EndPan(const olc::vi2d& vPos) + { + UpdatePan(vPos); + m_bPanning = false; + } + + const olc::vf2d& TransformedView::GetWorldOffset() const + { + return m_vWorldOffset; + } + + const olc::vf2d& TransformedView::GetWorldScale() const + { + return m_vWorldScale; + } + + olc::vf2d TransformedView::WorldToScreen(const olc::vf2d& vWorldPos) const + { + olc::vf2d vFloat = ((vWorldPos - m_vWorldOffset) * m_vWorldScale); + //vFloat = { std::floor(vFloat.x + 0.5f), std::floor(vFloat.y + 0.5f) }; + return vFloat; + } + + olc::vf2d TransformedView::ScreenToWorld(const olc::vf2d& vScreenPos) const + { + return (olc::vf2d(vScreenPos) / m_vWorldScale) + m_vWorldOffset; + } + + olc::vf2d TransformedView::ScaleToWorld(const olc::vf2d& vScreenSize) const + { + return (olc::vf2d(vScreenSize) / m_vWorldScale); + } + + olc::vf2d TransformedView::ScaleToScreen(const olc::vf2d& vWorldSize) const + { + //olc::vf2d vFloat = (vWorldSize * m_vWorldScale) + olc::vf2d(0.5f, 0.5f); + //return vFloat.floor(); + return (vWorldSize * m_vWorldScale); + } + + bool TransformedView::IsPointVisible(const olc::vf2d & vPos) const + { + olc::vi2d vScreen = WorldToScreen(vPos); + return vScreen.x >= 0 && vScreen.x < m_vViewArea.x&& vScreen.y >= 0 && vScreen.y < m_vViewArea.y; + } + + bool TransformedView::IsRectVisible(const olc::vf2d& vPos, const olc::vf2d& vSize) const + { + olc::vi2d vScreenPos = WorldToScreen(vPos); + olc::vi2d vScreenSize = vSize * m_vWorldScale; + return (vScreenPos.x < 0 + m_vViewArea.x && vScreenPos.x + vScreenSize.x > 0 && vScreenPos.y < m_vViewArea.y&& vScreenPos.y + vScreenSize.y > 0); + } + + void TransformedView::HandlePanAndZoom(const int nMouseButton, const float fZoomRate, const bool bPan, const bool bZoom) + { + const auto& vMousePos = pge->GetMousePos(); + if (bPan) + { + if (pge->GetMouse(nMouseButton).bPressed) StartPan(vMousePos); + if (pge->GetMouse(nMouseButton).bHeld) UpdatePan(vMousePos); + if (pge->GetMouse(nMouseButton).bReleased) EndPan(vMousePos); + } + + if (bZoom) + { + if (pge->GetMouseWheel() > 0) ZoomAtScreenPos(1.0f + fZoomRate, vMousePos); + if (pge->GetMouseWheel() < 0) ZoomAtScreenPos(1.0f - fZoomRate, vMousePos); + } + } + + bool TransformedView::Draw(float x, float y, olc::Pixel p) + { + return Draw({ x, y }, p); + } + + bool TransformedView::Draw(const olc::vf2d & pos, olc::Pixel p) + { + return pge->Draw(WorldToScreen(pos), p); + } + + void TransformedView::DrawLine(float x1, float y1, float x2, float y2, olc::Pixel p, uint32_t pattern) + { + DrawLine({ x1, y1 }, { x2, y2 }, p, pattern); + } + + void TransformedView::DrawLine(const olc::vf2d & pos1, const olc::vf2d & pos2, olc::Pixel p, uint32_t pattern) + { + pge->DrawLine(WorldToScreen(pos1), WorldToScreen(pos2), p, pattern); + } + + void TransformedView::DrawCircle(float x, float y, float radius, olc::Pixel p, uint8_t mask) + { + DrawCircle({ x,y }, radius, p, mask); + } + + void TransformedView::DrawCircle(const olc::vf2d & pos, float radius, olc::Pixel p, uint8_t mask) + { + pge->DrawCircle(WorldToScreen(pos), int32_t(radius * m_vWorldScale.x), p, mask); + } + + void TransformedView::FillCircle(float x, float y, float radius, olc::Pixel p) + { + FillCircle({ x,y }, radius, p); + } + + void TransformedView::FillCircle(const olc::vf2d & pos, float radius, olc::Pixel p) + { + pge->FillCircle(WorldToScreen(pos), int32_t(radius * m_vWorldScale.x), p); + } + + void TransformedView::DrawRect(float x, float y, float w, float h, olc::Pixel p) + { + DrawRect({ x, y }, { w, h }, p); + } + + void TransformedView::DrawRect(const olc::vf2d & pos, const olc::vf2d & size, olc::Pixel p) + { + pge->DrawRect(WorldToScreen(pos), ((size * m_vWorldScale) + olc::vf2d(0.5f, 0.5f)).floor(), p); + } + + void TransformedView::FillRect(float x, float y, float w, float h, olc::Pixel p) + { + FillRect({ x, y }, { w, h }, p); + } + + void TransformedView::FillRect(const olc::vf2d & pos, const olc::vf2d & size, olc::Pixel p) + { + pge->FillRect(WorldToScreen(pos), size * m_vWorldScale, p); + } + + void TransformedView::DrawTriangle(float x1, float y1, float x2, float y2, float x3, float y3, olc::Pixel p) + { + DrawTriangle({ x1, y1 }, { x2, y2 }, { x3, y3 }, p); + } + + void TransformedView::DrawTriangle(const olc::vf2d & pos1, const olc::vf2d & pos2, const olc::vf2d & pos3, olc::Pixel p) + { + pge->DrawTriangle(WorldToScreen(pos1), WorldToScreen(pos2), WorldToScreen(pos3), p); + } + + void TransformedView::FillTriangle(float x1, float y1, float x2, float y2, float x3, float y3, olc::Pixel p) + { + FillTriangle({ x1, y1 }, { x2, y2 }, { x3, y3 }, p); + } + + void TransformedView::FillTriangle(const olc::vf2d & pos1, const olc::vf2d & pos2, const olc::vf2d & pos3, olc::Pixel p) + { + pge->FillTriangle(WorldToScreen(pos1), WorldToScreen(pos2), WorldToScreen(pos3), p); + } + + void TransformedView::DrawSprite(float x, float y, olc::Sprite* sprite, float scalex, float scaley, uint8_t flip) + { + DrawSprite({ x, y }, sprite, { scalex, scaley }, flip); + } + + void TransformedView::DrawSprite(const olc::vf2d & pos, olc::Sprite * sprite, const olc::vf2d & scale, uint8_t flip) + { + olc::vf2d vSpriteSize = olc::vf2d(float(sprite->width), float(sprite->height)); + if (IsRectVisible(pos, vSpriteSize * scale)) + { + olc::vf2d vSpriteScaledSize = vSpriteSize * m_vRecipPixel * m_vWorldScale * scale; + olc::vi2d vPixel; + olc::vi2d vSpritePixelStart = WorldToScreen(pos); + olc::vi2d vSpritePixelEnd = WorldToScreen((vSpriteSize * scale) + pos); + + olc::vi2d vScreenPixelStart = (vSpritePixelStart).max({0,0}); + olc::vi2d vScreenPixelEnd = (vSpritePixelEnd).min({ pge->ScreenWidth(),pge->ScreenHeight() }); + + olc::vf2d vPixelStep = 1.0f / vSpriteScaledSize; + + for (vPixel.y = vScreenPixelStart.y; vPixel.y < vScreenPixelEnd.y; vPixel.y++) + { + for (vPixel.x = vScreenPixelStart.x; vPixel.x < vScreenPixelEnd.x; vPixel.x++) + { + olc::vf2d vSample = olc::vf2d(vPixel - vSpritePixelStart) * vPixelStep; + pge->Draw(vPixel, sprite->Sample(vSample.x, vSample.y)); + } + } + } + } + + + void TransformedView::DrawPartialSprite(float x, float y, Sprite* sprite, int32_t ox, int32_t oy, int32_t w, int32_t h, float scalex, float scaley, uint8_t flip) + { + DrawPartialSprite({ x,y }, sprite, { ox,oy }, { w, h }, { scalex, scaley }, flip); + } + + void TransformedView::DrawPartialSprite(const olc::vf2d& pos, Sprite* sprite, const olc::vi2d& sourcepos, const olc::vi2d& size, const olc::vf2d& scale, uint8_t flip) + { + olc::vf2d vSpriteSize = size; + if (IsRectVisible(pos, size * scale)) + { + olc::vf2d vSpriteScaledSize = olc::vf2d(size) * m_vRecipPixel * m_vWorldScale * scale; + olc::vf2d vSpritePixelStep = 1.0f / olc::vf2d(float(sprite->width), float(sprite->height)); + olc::vi2d vPixel, vStart = WorldToScreen(pos), vEnd = vSpriteScaledSize + vStart; + olc::vf2d vScreenPixelStep = 1.0f / vSpriteScaledSize; + + for (vPixel.y = vStart.y; vPixel.y < vEnd.y; vPixel.y++) + { + for (vPixel.x = vStart.x; vPixel.x < vEnd.x; vPixel.x++) + { + olc::vf2d vSample = ((olc::vf2d(vPixel - vStart) * vScreenPixelStep) * size * vSpritePixelStep) + olc::vf2d(sourcepos) * vSpritePixelStep; + pge->Draw(vPixel, sprite->Sample(vSample.x, vSample.y)); + } + } + } + } + + void TransformedView::DrawString(float x, float y, const std::string& sText, Pixel col, const olc::vf2d& scale) + { + DrawString({ x, y }, sText, col, scale); + } + + void TransformedView::DrawString(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d vOffset = { 0.0f, 0.0f }; + Pixel::Mode m = pge->GetPixelMode(); + + auto StringPlot = [&col](const int x, const int y, const olc::Pixel& pSource, const olc::Pixel& pDest) + { + return pSource.r > 1 ? col : pDest; + }; + + pge->SetPixelMode(StringPlot); + + for (auto c : sText) + { + if (c == '\n') + { + vOffset.x = 0.0f; vOffset.y += 8.0f * m_vRecipPixel.y * scale.y; + } + else + { + int32_t ox = ((c - 32) % 16) * 8; + int32_t oy = ((c - 32) / 16) * 8; + DrawPartialSprite(pos + vOffset, pge->GetFontSprite(), { ox, oy }, { 8, 8 }, scale); + vOffset.x += 8.0f * m_vRecipPixel.x * scale.x; + } + } + pge->SetPixelMode(m); + } + + + void TransformedView::DrawDecal(const olc::vf2d & pos, olc::Decal * decal, const olc::vf2d & scale, const olc::Pixel & tint) + { + pge->DrawDecal(WorldToScreen(pos), decal, scale * m_vWorldScale * m_vRecipPixel, tint); + } + + void TransformedView::DrawPartialDecal(const olc::vf2d & pos, olc::Decal * decal, const olc::vf2d & source_pos, const olc::vf2d & source_size, const olc::vf2d & scale, const olc::Pixel & tint) + { + pge->DrawPartialDecal(WorldToScreen(pos), decal, source_pos, source_size, scale * m_vWorldScale * m_vRecipPixel, tint); + } + + void TransformedView::DrawPartialDecal(const olc::vf2d & pos, const olc::vf2d & size, olc::Decal * decal, const olc::vf2d & source_pos, const olc::vf2d & source_size, const olc::Pixel & tint) + { + pge->DrawPartialDecal(WorldToScreen(pos), size * m_vWorldScale * m_vRecipPixel, decal, source_pos, source_size, tint); + } + + void TransformedView::DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements) + { + std::vector vTransformed(elements); + for (uint32_t n = 0; n < elements; n++) + vTransformed[n] = WorldToScreen(pos[n]); + pge->DrawExplicitDecal(decal, vTransformed.data(), uv, col, elements); + } + + void TransformedView::DrawWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::Pixel& tint) + { + std::array vTransformed = + { { + WorldToScreen(pos[0]), WorldToScreen(pos[1]), + WorldToScreen(pos[2]), WorldToScreen(pos[3]), + } }; + + pge->DrawWarpedDecal(decal, vTransformed, tint); + } + + void TransformedView::DrawWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::Pixel& tint) + { + DrawWarpedDecal(decal, &pos[0], tint); + } + + void TransformedView::DrawWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::Pixel& tint) + { + DrawWarpedDecal(decal, pos.data(), tint); + } + + void TransformedView::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + DrawPartialWarpedDecal(decal, &pos[0], source_pos, source_size, tint); + } + + void TransformedView::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + std::array vTransformed = + { { + WorldToScreen(pos[0]), WorldToScreen(pos[1]), + WorldToScreen(pos[2]), WorldToScreen(pos[3]), + } }; + + pge->DrawPartialWarpedDecal(decal, vTransformed, source_pos, source_size, tint); + } + + void TransformedView::DrawPartialWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + DrawPartialWarpedDecal(decal, pos.data(), source_pos, source_size, tint); + } + + void TransformedView::DrawRotatedDecal(const olc::vf2d & pos, olc::Decal * decal, const float fAngle, const olc::vf2d & center, const olc::vf2d & scale, const olc::Pixel & tint) + { + pge->DrawRotatedDecal(WorldToScreen(pos), decal, fAngle, center, scale * m_vWorldScale * m_vRecipPixel, tint); + } + + void TransformedView::DrawPartialRotatedDecal(const olc::vf2d & pos, olc::Decal * decal, const float fAngle, const olc::vf2d & center, const olc::vf2d & source_pos, const olc::vf2d & source_size, const olc::vf2d & scale, const olc::Pixel & tint) + { + pge->DrawPartialRotatedDecal(WorldToScreen(pos), decal, fAngle, center, source_pos, source_size, scale * m_vWorldScale * m_vRecipPixel, tint); + } + + void TransformedView::DrawStringDecal(const olc::vf2d & pos, const std::string & sText, const olc::Pixel col, const olc::vf2d & scale) + { + pge->DrawStringDecal(WorldToScreen(pos), sText, col, scale * m_vWorldScale * m_vRecipPixel); + } + + void TransformedView::DrawStringPropDecal(const olc::vf2d & pos, const std::string & sText, const olc::Pixel col, const olc::vf2d & scale ) + { + pge->DrawStringPropDecal(WorldToScreen(pos), sText, col, scale * m_vWorldScale * m_vRecipPixel); + } + + void TransformedView::FillRectDecal(const olc::vf2d & pos, const olc::vf2d & size, const olc::Pixel col) + { + pge->FillRectDecal(WorldToScreen(pos), (size * m_vWorldScale).ceil(), col); + } + + void TransformedView::DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col) + { + pge->DrawRectDecal(WorldToScreen(pos), (size * m_vWorldScale).ceil(), col); + } + + void TransformedView::DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p) + { + pge->DrawLineDecal(WorldToScreen(pos1), WorldToScreen(pos2), p); + } + + void TransformedView::GradientFillRectDecal(const olc::vf2d & pos, const olc::vf2d & size, const olc::Pixel colTL, const olc::Pixel colBL, const olc::Pixel colBR, const olc::Pixel colTR) + { + pge->GradientFillRectDecal(WorldToScreen(pos), size * m_vWorldScale, colTL, colBL, colBR, colTR); + } + + void TransformedView::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const olc::Pixel tint) + { + std::vector vTransformed(pos.size()); + for (uint32_t n = 0; n < pos.size(); n++) + vTransformed[n] = WorldToScreen(pos[n]); + pge->DrawPolygonDecal(decal, vTransformed, uv, tint); + } + + void TransformedView::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector &tint) + { + std::vector vTransformed(pos.size()); + for (uint32_t n = 0; n < pos.size(); n++) + vTransformed[n] = WorldToScreen(pos[n]); + pge->DrawPolygonDecal(decal, vTransformed, uv, tint); + } + + void TransformedView::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector& colours, const olc::Pixel tint) + { + std::vector vTransformed(pos.size()); + for (uint32_t n = 0; n < pos.size(); n++) + vTransformed[n] = WorldToScreen(pos[n]); + pge->DrawPolygonDecal(decal, vTransformed, uv, colours, tint); + } + + + +#if defined (OLC_PGEX_SHADER) + + void TransformedView::DrawDecal(olc::Shade &shade, const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& scale, const olc::Pixel& tint) + { + shade.DrawDecal(WorldToScreen(pos), decal, scale * m_vWorldScale * m_vRecipPixel, tint); + } + + void TransformedView::DrawPartialDecal(olc::Shade& shade, const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale, const olc::Pixel& tint) + { + shade.DrawPartialDecal(WorldToScreen(pos), decal, source_pos, source_size, scale * m_vWorldScale * m_vRecipPixel, tint); + } + + void TransformedView::DrawPartialDecal(olc::Shade& shade, const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + shade.DrawPartialDecal(WorldToScreen(pos), size * m_vWorldScale * m_vRecipPixel, decal, source_pos, source_size, tint); + } + +#endif + + + + + + + + ///////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////// + + + TileTransformedView::TileTransformedView(const olc::vi2d& vViewArea, const olc::vi2d& vTileSize) + { + Initialise(vViewArea, vTileSize); + } + + + olc::vi2d TileTransformedView::GetTopLeftTile() const + { + return ScreenToWorld({ 0,0 }).floor(); + } + + olc::vi2d TileTransformedView::GetBottomRightTile() const + { + return ScreenToWorld(m_vViewArea).ceil(); + } + + olc::vi2d TileTransformedView::GetVisibleTiles() const + { + return GetBottomRightTile() - GetTopLeftTile(); + } + + olc::vi2d TileTransformedView::GetTileUnderScreenPos(const olc::vi2d& vPos) const + { + return ScreenToWorld(vPos).floor(); + } + + const olc::vi2d TileTransformedView::GetTileOffset() const + { + return { int32_t((m_vWorldOffset.x - std::floor(m_vWorldOffset.x)) * m_vWorldScale.x), + int32_t((m_vWorldOffset.y - std::floor(m_vWorldOffset.y)) * m_vWorldScale.y) }; + } +} + +#endif +#endif diff --git a/olcCodeJam2023Entry/olcPixelGameEngine.h b/olcCodeJam2023Entry/olcPixelGameEngine.h new file mode 100644 index 0000000..174d8c9 --- /dev/null +++ b/olcCodeJam2023Entry/olcPixelGameEngine.h @@ -0,0 +1,6701 @@ +#pragma region license_and_help +/* +olcPixelGameEngine.h + ++-------------------------------------------------------------+ +| OneLoneCoder Pixel Game Engine v2.23 | +| "What do you need? Pixels... Lots of Pixels..." - javidx9 | ++-------------------------------------------------------------+ + +What is this? +~~~~~~~~~~~~~ +olc::PixelGameEngine is a single file, cross platform graphics and userinput +framework used for games, visualisations, algorithm exploration and learning. +It was developed by YouTuber "javidx9" as an assistive tool for many of his +videos. The goal of this project is to provide high speed graphics with +minimal project setup complexity, to encourage new programmers, younger people, +and anyone else that wants to make fun things. + +However, olc::PixelGameEngine is not a toy! It is a powerful and fast utility +capable of delivering high resolution, high speed, high quality applications +which behave the same way regardless of the operating system or platform. + +This file provides the core utility set of the olc::PixelGameEngine, including +window creation, keyboard/mouse input, main game thread, timing, pixel drawing +routines, image/sprite loading and drawing routines, and a bunch of utility +types to make rapid development of games/visualisations possible. + + +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2018 - 2022 OneLoneCoder.com + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Links +~~~~~ +YouTube: https://www.youtube.com/javidx9 +https://www.youtube.com/javidx9extra +Discord: https://discord.gg/WhwHUMV +Twitter: https://www.twitter.com/javidx9 +Twitch: https://www.twitch.tv/javidx9 +GitHub: https://www.github.com/onelonecoder +Homepage: https://www.onelonecoder.com +Patreon: https://www.patreon.com/javidx9 +Community: https://community.onelonecoder.com + + + +Compiling in Linux +~~~~~~~~~~~~~~~~~~ +You will need a modern C++ compiler, so update yours! +To compile use the command: + +g++ -o YourProgName YourSource.cpp -lX11 -lGL -lpthread -lpng -lstdc++fs -std=c++17 + +On some Linux configurations, the frame rate is locked to the refresh +rate of the monitor. This engine tries to unlock it but may not be +able to, in which case try launching your program like this: + +vblank_mode=0 ./YourProgName + + + +Compiling in Code::Blocks on Windows +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Well I wont judge you, but make sure your Code::Blocks installation +is really up to date - you may even consider updating your C++ toolchain +to use MinGW32-W64. + +Guide for installing recent GCC for Windows: +https://www.msys2.org/ +Guide for configuring code::blocks: +https://solarianprogrammer.com/2019/11/05/install-gcc-windows/ +https://solarianprogrammer.com/2019/11/16/install-codeblocks-gcc-windows-build-c-cpp-fortran-programs/ + +Add these libraries to "Linker Options": +user32 gdi32 opengl32 gdiplus Shlwapi dwmapi stdc++fs + +Set these compiler options: -std=c++17 + + + +Compiling on Mac - EXPERIMENTAL! PROBABLY HAS BUGS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Yes yes, people use Macs for C++ programming! Who knew? Anyway, enough +arguing, thanks to Mumflr the PGE is now supported on Mac. Now I know nothing +about Mac, so if you need support, I suggest checking out the instructions +here: https://github.com/MumflrFumperdink/olcPGEMac + +clang++ -arch x86_64 -std=c++17 -mmacosx-version-min=10.15 -Wall -framework OpenGL +-framework GLUT -framework Carbon -lpng YourSource.cpp -o YourProgName + + + +Compiling with Emscripten (New & Experimental) +~~~~~~~~~~~~~~~~~~~~~~~~~ +Emscripten compiler will turn your awesome C++ PixelGameEngine project into WASM! +This means you can run your application in teh browser, great for distributing +and submission in to jams and things! It's a bit new at the moment. + +em++ -std=c++17 -O2 -s ALLOW_MEMORY_GROWTH=1 -s MAX_WEBGL_VERSION=2 -s MIN_WEBGL_VERSION=2 -s USE_LIBPNG=1 ./YourSource.cpp -o pge.html + + + +Using stb_image.h +~~~~~~~~~~~~~~~~~ +The PGE will load png images by default (with help from libpng on non-windows systems). +However, the excellent "stb_image.h" can be used instead, supporting a variety of +image formats, and has no library dependence - something we like at OLC studios ;) +To use stb_image.h, make sure it's in your code base, and simply: + +#define OLC_IMAGE_STB + +Before including the olcPixelGameEngine.h header file. stb_image.h works on many systems +and can be downloaded here: https://github.com/nothings/stb/blob/master/stb_image.h + + + +Multiple cpp file projects? +~~~~~~~~~~~~~~~~~~~~~~~~~~~ +As a single header solution, the OLC_PGE_APPLICATION definition is used to +insert the engine implementation at a project location of your choosing. +The simplest way to setup multifile projects is to create a file called +"olcPixelGameEngine.cpp" which includes the following: + +#define OLC_PGE_APPLICATION +#include "olcPixelGameEngine.h" + +That's all it should include. You can also include PGEX includes and +defines in here too. With this in place, you dont need to +#define OLC_PGE_APPLICATION anywhere, and can simply include this +header file as an when you need to. + + + +Ports +~~~~~ +olc::PixelGameEngine has been ported and tested with varying degrees of +success to: WinXP, Win7, Win8, Win10, Various Linux, Raspberry Pi, +Chromebook, Playstation Portable (PSP) and Nintendo Switch. If you are +interested in the details of these ports, come and visit the Discord! + + + +Thanks +~~~~~~ +I'd like to extend thanks to Ian McKay, Bispoo, Eremiell, slavka, Kwizatz77, gurkanctn, Phantim, +IProgramInCPP, JackOJC, KrossX, Huhlig, Dragoneye, Appa, JustinRichardsMusic, SliceNDice, +dandistine, Ralakus, Gorbit99, raoul, joshinils, benedani, Moros1138, Alexio, SaladinAkara +& MagetzUb for advice, ideas and testing, and I'd like to extend my appreciation to the +250K YouTube followers, 80+ Patreons, 4.8K Twitch followers and 10K Discord server members +who give me the motivation to keep going with all this :D + +Significant Contributors: @Moros1138, @SaladinAkara, @MaGetzUb, @slavka, +@Dragoneye, @Gorbit99, @dandistine & @Mumflr + +Special thanks to those who bring gifts! +GnarGnarHead.......Domina +Gorbit99...........Bastion, Ori & The Blind Forest, Terraria, Spelunky 2, Skully +Marti Morta........Gris +Danicron...........Terraria +SaladinAkara.......Aseprite, Inside, Quern: Undying Thoughts, Outer Wilds +AlterEgo...........Final Fantasy XII - The Zodiac Age +SlicEnDicE.........Noita, Inside +TGD................Voucher Gift +Dragoneye..........Lucas Arts Adventure Game Pack +Anonymous Pirate...Return To Monkey Island + +Special thanks to my Patreons too - I wont name you on here, but I've +certainly enjoyed my tea and flapjacks :D + + + +Author +~~~~~~ +David Barr, aka javidx9, (c) OneLoneCoder 2018, 2019, 2020, 2021, 2022 +*/ +#pragma endregion + +#pragma region version_history +/* +2.01: Made renderer and platform static for multifile projects +2.02: Added Decal destructor, optimised Pixel constructor +2.03: Added FreeBSD flags, Added DrawStringDecal() +2.04: Windows Full-Screen bug fixed +2.05: +DrawPartialWarpedDecal() - draws a warped decal from a subset image ++DrawPartialRotatedDecal() - draws a rotated decal from a subset image +2.06: +GetTextSize() - returns area occupied by multiline string ++GetWindowSize() - returns actual window size ++GetElapsedTime() - returns last calculated fElapsedTime ++GetWindowMouse() - returns actual mouse location in window ++DrawExplicitDecal() - bow-chikka-bow-bow ++DrawPartialDecal(pos, size) - draws a partial decal to specified area ++FillRectDecal() - draws a flat shaded rectangle as a decal ++GradientFillRectDecal() - draws a rectangle, with unique colour corners ++Modified DrawCircle() & FillCircle() - Thanks IanM-Matrix1 (#PR121) ++Gone someway to appeasing pedants +2.07: +GetPixelSize() - returns user specified pixel size ++GetScreenPixelSize() - returns actual size in monitor pixels ++Pixel Cohesion Mode (flag in Construct()) - disallows arbitrary window scaling ++Working VSYNC in Windows windowed application - now much smoother ++Added string conversion for olc::vectors ++Added comparator operators for olc::vectors ++Added DestroyWindow() on windows platforms for serial PGE launches ++Added GetMousePos() to stop TarriestPython whinging +2.08: Fix SetScreenSize() aspect ratio pre-calculation +Fix DrawExplicitDecal() - stupid oversight with multiple decals +Disabled olc::Sprite copy constructor ++olc::Sprite Duplicate() - produces a new clone of the sprite ++olc::Sprite Duplicate(pos, size) - produces a new sprite from the region defined ++Unary operators for vectors ++More pedant mollification - Thanks TheLandfill ++ImageLoader modules - user selectable image handling core, gdi+, libpng, stb_image ++Mac Support via GLUT - thanks Mumflr! +2.09: Fix olc::Renderable Image load error - Thanks MaGetzUb & Zij-IT for finding and moaning about it +Fix file rejection in image loaders when using resource packs +Tidied Compiler defines per platform - Thanks slavka ++Pedant fixes, const correctness in parts ++DecalModes - Normal, Additive, Multiplicative blend modes ++Pixel Operators & Lerping ++Filtered Decals - If you hate pixels, then erase this file ++DrawStringProp(), GetTextSizeProp(), DrawStringPropDecal() - Draws non-monospaced font +2.10: Fix PixelLerp() - oops my bad, lerped the wrong way :P +Fix "Shader" support for strings - thanks Megarev for crying about it +Fix GetTextSizeProp() - Height was just plain wrong... ++vec2d operator overloads (element wise *=, /=) ++vec2d comparison operators... :| yup... hmmmm... ++vec2d ceil(), floor(), min(), max() functions - surprising how often I do it manually ++DrawExplicitDecal(... uint32_t elements) - complete control over convex polygons and lines ++DrawPolygonDecal() - to keep Bispoo happy, required significant rewrite of EVERYTHING, but hey ho ++Complete rewrite of decal renderer ++OpenGL 3.3 Renderer (also supports Raspberry Pi) ++PGEX Break-In Hooks - with a push from Dandistine ++Wireframe Decal Mode - For debug overlays +2.11: Made PGEX hooks optional - (provide true to super constructor) +2.12: Fix for MinGW compiler non-compliance :( - why is its sdk structure different?? why??? +2.13: +GetFontSprite() - allows access to font data +2.14: Fix WIN32 Definition reshuffle +Fix DrawPartialDecal() - messed up dimension during renderer experiment, didnt remove junk code, thanks Alexio +Fix? Strange error regarding GDI+ Image Loader not knowing about COM, SDK change? +2.15: Big Reformat ++WASM Platform (via Emscripten) - Big Thanks to OLC Community - See Platform for details ++Sample Mode for Decals ++Made olc_ConfigureSystem() accessible ++Added OLC_----_CUSTOM_EX for externalised platforms, renderers and image loaders +=Refactored olc::Sprite pixel data store +-Deprecating LoadFromPGESprFile() +-Deprecating SaveToPGESprFile() +Fix Pixel -= operator (thanks Au Lit) +2.16: FIX Emscripten JS formatting in VS IDE (thanks Moros) ++"Headless" Mode ++DrawLineDecal() ++Mouse Button Constants ++Move Constructor for olc::Renderable ++Polar/Cartesian conversion for v2d_generic ++DrawRotatedStringDecal()/DrawRotatedStringPropDecal() (thanks Oso-Grande/Sopadeoso (PR #209)) +=Using olc::Renderable for layer surface ++Major Mac and GLUT Update (thanks Mumflr) +2.17: +Clipping for DrawLine() functions ++Reintroduced sub-pixel decals ++Modified DrawPartialDecal() to quantise and correctly sample from tile atlasses ++olc::Sprite::GetPixel() - Clamp Mode +2.18: +Option to not "dirty" layers with SetDrawTarget() - Thanks TerasKasi! +=Detection for Mac M1, fix for scroll wheel interrogation - Thanks ruarq! +2.19: Textual Input(of)course Edition! +=Built in font is now olc::Renderable ++EnablePixelTransfer() - Gate if layer content transfers occur (speedup in decal only apps) ++TextEntryEnable() - Enables/Disables text entry mode ++TextEntryGetString() - Gets the current accumulated string in text entry mode ++TextEntryGetCursor() - Gets the current cursor position in text entry mode ++IsTextEntryEnabled() - Returns true if text entry mode is activated ++OnTextEntryComplete() - Override is called when user presses "ENTER" in text entry mode ++Potential for regional keyboard mappings - needs volunteers to do this ++ConsoleShow() - Opens built in command console ++ConsoleClear() - Clears built in command console output ++ConsoleOut() - Stream strings to command console output ++ConsoleCaptureStdOut() - Capture std::cout by redirecting to built-in console ++OnConsoleCommand() - Override is called when command is entered into built in console +2.20: +DrawRectDecal() - Keeps OneSketchyGuy quiet ++GetScreenSize() ++olc::Sprite::Size() - returns size of sprite in vector format +2.21: Emscripten Overhaul - Thanks Moros! ++DrawPolygonDecal() tint overload, can now tint a polygon accounting for vertex colours ++Multiplicative Pixel overload ++v2d_generic clamp() ++v2d_generic lerp() ++GetDroppedFiles() - returns files dropped onto engine window for that frame (MSW only) ++GetDroppedFilesPoint() - returns location of dropped files (MSW only) ++Exposed OpenGL33 Loader interface so the typedefs can be shared with PGEX & user ++Fix OGL33 DecalStructure types - wow, how did that one get missed?? lol ++FillTexturedTriangle() - Software rasterizes a textured, coloured, triangle ++FillTexturedPolygon() - Hijacks DecalStructure for configuration ++olc::vf2d arguments for Sprite::Sample() functions +2.22: = Fix typo on dragged file buffers for unicode builds +2.23: Fixed Emscripten host sizing errors - Thanks Moros +Fixed v2d_generic.clamp() function + +!! Apple Platforms will not see these updates immediately - Sorry, I dont have a mac to test... !! +!! Volunteers willing to help appreciated, though PRs are manually integrated with credit !! +*/ +#pragma endregion + +#pragma region hello_world_example +// O------------------------------------------------------------------------------O +// | Example "Hello World" Program (main.cpp) | +// O------------------------------------------------------------------------------O +/* + +#define OLC_PGE_APPLICATION +#include "olcPixelGameEngine.h" + +// Override base class with your custom functionality +class Example : public olc::PixelGameEngine +{ +public: +Example() +{ +// Name your application +sAppName = "Example"; +} + +public: +bool OnUserCreate() override +{ +// Called once at the start, so create things here +return true; +} + +bool OnUserUpdate(float fElapsedTime) override +{ +// Called once per frame, draws random coloured pixels +for (int x = 0; x < ScreenWidth(); x++) +for (int y = 0; y < ScreenHeight(); y++) +Draw(x, y, olc::Pixel(rand() % 256, rand() % 256, rand() % 256)); +return true; +} +}; + +int main() +{ +Example demo; +if (demo.Construct(256, 240, 4, 4)) +demo.Start(); +return 0; +} + +*/ +#pragma endregion + +#ifndef OLC_PGE_DEF +#define OLC_PGE_DEF + +#pragma region std_includes +// O------------------------------------------------------------------------------O +// | STANDARD INCLUDES | +// O------------------------------------------------------------------------------O +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#pragma endregion + +#define PGE_VER 223 + +// O------------------------------------------------------------------------------O +// | COMPILER CONFIGURATION ODDITIES | +// O------------------------------------------------------------------------------O +#pragma region compiler_config +#define USE_EXPERIMENTAL_FS +#if defined(_WIN32) +#if _MSC_VER >= 1920 && _MSVC_LANG >= 201703L +#undef USE_EXPERIMENTAL_FS +#endif +#endif +#if defined(__linux__) || defined(__MINGW32__) || defined(__EMSCRIPTEN__) || defined(__FreeBSD__) || defined(__APPLE__) +#if __cplusplus >= 201703L +#undef USE_EXPERIMENTAL_FS +#endif +#endif + +#if !defined(OLC_KEYBOARD_UK) +#define OLC_KEYBOARD_UK +#endif + + +#if defined(USE_EXPERIMENTAL_FS) || defined(FORCE_EXPERIMENTAL_FS) +// C++14 +#define _SILENCE_EXPERIMENTAL_FILESYSTEM_DEPRECATION_WARNING +#include +namespace _gfs = std::experimental::filesystem::v1; +#else +// C++17 +#include +namespace _gfs = std::filesystem; +#endif + +#if defined(UNICODE) || defined(_UNICODE) +#define olcT(s) L##s +#else +#define olcT(s) s +#endif + +#define UNUSED(x) (void)(x) + +// O------------------------------------------------------------------------------O +// | PLATFORM SELECTION CODE, Thanks slavka! | +// O------------------------------------------------------------------------------O + +#if defined(OLC_PGE_HEADLESS) +#define OLC_PLATFORM_HEADLESS +#define OLC_GFX_HEADLESS +#if !defined(OLC_IMAGE_STB) && !defined(OLC_IMAGE_GDI) && !defined(OLC_IMAGE_LIBPNG) +#define OLC_IMAGE_HEADLESS +#endif +#endif + +// Platform +#if !defined(OLC_PLATFORM_WINAPI) && !defined(OLC_PLATFORM_X11) && !defined(OLC_PLATFORM_GLUT) && !defined(OLC_PLATFORM_EMSCRIPTEN) && !defined(OLC_PLATFORM_HEADLESS) +#if !defined(OLC_PLATFORM_CUSTOM_EX) +#if defined(_WIN32) +#define OLC_PLATFORM_WINAPI +#endif +#if defined(__linux__) || defined(__FreeBSD__) +#define OLC_PLATFORM_X11 +#endif +#if defined(__APPLE__) +#define GL_SILENCE_DEPRECATION +#define OLC_PLATFORM_GLUT +#endif +#if defined(__EMSCRIPTEN__) +#define OLC_PLATFORM_EMSCRIPTEN +#endif +#endif +#endif + +// Start Situation +#if defined(OLC_PLATFORM_GLUT) || defined(OLC_PLATFORM_EMSCRIPTEN) +#define PGE_USE_CUSTOM_START +#endif + + + +// Renderer +#if !defined(OLC_GFX_OPENGL10) && !defined(OLC_GFX_OPENGL33) && !defined(OLC_GFX_DIRECTX10) && !defined(OLC_GFX_HEADLESS) +#if !defined(OLC_GFX_CUSTOM_EX) +#if defined(OLC_PLATFORM_EMSCRIPTEN) +#define OLC_GFX_OPENGL33 +#else +#define OLC_GFX_OPENGL10 +#endif +#endif +#endif + +// Image loader +#if !defined(OLC_IMAGE_STB) && !defined(OLC_IMAGE_GDI) && !defined(OLC_IMAGE_LIBPNG) && !defined(OLC_IMAGE_HEADLESS) +#if !defined(OLC_IMAGE_CUSTOM_EX) +#if defined(_WIN32) +#define OLC_IMAGE_GDI +#endif +#if defined(__linux__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) +#define OLC_IMAGE_LIBPNG +#endif +#endif +#endif + + +// O------------------------------------------------------------------------------O +// | PLATFORM-SPECIFIC DEPENDENCIES | +// O------------------------------------------------------------------------------O +#if !defined(OLC_PGE_HEADLESS) +#if defined(OLC_PLATFORM_WINAPI) +#define _WINSOCKAPI_ // Thanks Cornchipss +#if !defined(VC_EXTRALEAN) +#define VC_EXTRALEAN +#endif +#if !defined(NOMINMAX) +#define NOMINMAX +#endif + +// In Code::Blocks +#if !defined(_WIN32_WINNT) +#ifdef HAVE_MSMF +#define _WIN32_WINNT 0x0600 // Windows Vista +#else +#define _WIN32_WINNT 0x0500 // Windows 2000 +#endif +#endif + +#include +#undef _WINSOCKAPI_ +#endif + +#if defined(OLC_PLATFORM_X11) +namespace X11 +{ +#include +#include +} +#endif + +#if defined(OLC_PLATFORM_GLUT) +#if defined(__linux__) +#include +#include +#endif +#if defined(__APPLE__) +#include +#include +#include +#endif +#endif +#endif + +#if defined(OLC_PGE_HEADLESS) +#if defined max +#undef max +#endif +#if defined min +#undef min +#endif +#endif +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine INTERFACE DECLARATION | +// O------------------------------------------------------------------------------O +#pragma region pge_declaration +namespace olc +{ + class PixelGameEngine; + class Sprite; + + // Pixel Game Engine Advanced Configuration + constexpr uint8_t nMouseButtons = 5; + constexpr uint8_t nDefaultAlpha = 0xFF; + constexpr uint32_t nDefaultPixel = (nDefaultAlpha << 24); + constexpr uint8_t nTabSizeInSpaces = 4; + constexpr size_t OLC_MAX_VERTS = 128; + enum rcode { FAIL = 0, OK = 1, NO_FILE = -1 }; + + // O------------------------------------------------------------------------------O + // | olc::Pixel - Represents a 32-Bit RGBA colour | + // O------------------------------------------------------------------------------O + struct Pixel + { + union + { + uint32_t n = nDefaultPixel; + struct { uint8_t r; uint8_t g; uint8_t b; uint8_t a; }; + }; + + enum Mode { NORMAL, MASK, ALPHA, CUSTOM }; + + Pixel(); + Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = nDefaultAlpha); + Pixel(uint32_t p); + Pixel& operator = (const Pixel& v) = default; + bool operator ==(const Pixel& p) const; + bool operator !=(const Pixel& p) const; + Pixel operator * (const float i) const; + Pixel operator / (const float i) const; + Pixel& operator *=(const float i); + Pixel& operator /=(const float i); + Pixel operator + (const Pixel& p) const; + Pixel operator - (const Pixel& p) const; + Pixel& operator +=(const Pixel& p); + Pixel& operator -=(const Pixel& p); + Pixel operator * (const Pixel& p) const; + Pixel& operator *=(const Pixel& p); + Pixel inv() const; + }; + + Pixel PixelF(float red, float green, float blue, float alpha = 1.0f); + Pixel PixelLerp(const olc::Pixel& p1, const olc::Pixel& p2, float t); + + + // O------------------------------------------------------------------------------O + // | USEFUL CONSTANTS | + // O------------------------------------------------------------------------------O + static const Pixel + GREY(192, 192, 192), DARK_GREY(128, 128, 128), VERY_DARK_GREY(64, 64, 64), + RED(255, 0, 0), DARK_RED(128, 0, 0), VERY_DARK_RED(64, 0, 0), + YELLOW(255, 255, 0), DARK_YELLOW(128, 128, 0), VERY_DARK_YELLOW(64, 64, 0), + GREEN(0, 255, 0), DARK_GREEN(0, 128, 0), VERY_DARK_GREEN(0, 64, 0), + CYAN(0, 255, 255), DARK_CYAN(0, 128, 128), VERY_DARK_CYAN(0, 64, 64), + BLUE(0, 0, 255), DARK_BLUE(0, 0, 128), VERY_DARK_BLUE(0, 0, 64), + MAGENTA(255, 0, 255), DARK_MAGENTA(128, 0, 128), VERY_DARK_MAGENTA(64, 0, 64), + WHITE(255, 255, 255), BLACK(0, 0, 0), BLANK(0, 0, 0, 0); + + // Thanks to scripticuk and others for updating the key maps + // NOTE: The GLUT platform will need updating, open to contributions ;) + enum Key + { + NONE, + A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z, + K0, K1, K2, K3, K4, K5, K6, K7, K8, K9, + F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, + UP, DOWN, LEFT, RIGHT, + SPACE, TAB, SHIFT, CTRL, INS, DEL, HOME, END, PGUP, PGDN, + BACK, ESCAPE, RETURN, ENTER, PAUSE, SCROLL, + NP0, NP1, NP2, NP3, NP4, NP5, NP6, NP7, NP8, NP9, + NP_MUL, NP_DIV, NP_ADD, NP_SUB, NP_DECIMAL, PERIOD, + EQUALS, COMMA, MINUS, + OEM_1, OEM_2, OEM_3, OEM_4, OEM_5, OEM_6, OEM_7, OEM_8, + CAPS_LOCK, ENUM_END + }; + + namespace Mouse + { + static constexpr int32_t LEFT = 0; + static constexpr int32_t RIGHT = 1; + static constexpr int32_t MIDDLE = 2; + }; + + // O------------------------------------------------------------------------------O + // | olc::HWButton - Represents the state of a hardware button (mouse/key/joy) | + // O------------------------------------------------------------------------------O + struct HWButton + { + bool bPressed = false; // Set once during the frame the event occurs + bool bReleased = false; // Set once during the frame the event occurs + bool bHeld = false; // Set true for all frames between pressed and released events + }; + + + + + // O------------------------------------------------------------------------------O + // | olc::vX2d - A generic 2D vector type | + // O------------------------------------------------------------------------------O +#if !defined(OLC_IGNORE_VEC2D) + template + struct v2d_generic + { + T x = 0; + T y = 0; + v2d_generic() : x(0), y(0) {} + v2d_generic(T _x, T _y) : x(_x), y(_y) {} + v2d_generic(const v2d_generic& v) : x(v.x), y(v.y) {} + v2d_generic& operator=(const v2d_generic& v) = default; + T mag() const { return T(std::sqrt(x * x + y * y)); } + T mag2() const { return x * x + y * y; } + v2d_generic norm() const { T r = 1 / mag(); return v2d_generic(x * r, y * r); } + v2d_generic perp() const { return v2d_generic(-y, x); } + v2d_generic floor() const { return v2d_generic(std::floor(x), std::floor(y)); } + v2d_generic ceil() const { return v2d_generic(std::ceil(x), std::ceil(y)); } + v2d_generic max(const v2d_generic& v) const { return v2d_generic(std::max(x, v.x), std::max(y, v.y)); } + v2d_generic min(const v2d_generic& v) const { return v2d_generic(std::min(x, v.x), std::min(y, v.y)); } + v2d_generic cart() { return { std::cos(y) * x, std::sin(y) * x }; } + v2d_generic polar() { return { mag(), std::atan2(y, x) }; } + v2d_generic clamp(const v2d_generic& v1, const v2d_generic& v2) const { return this->max(v1).min(v2); } + v2d_generic lerp(const v2d_generic& v1, const double t) { return this->operator*(T(1.0 - t)) + (v1 * T(t)); } + T dot(const v2d_generic& rhs) const { return this->x * rhs.x + this->y * rhs.y; } + T cross(const v2d_generic& rhs) const { return this->x * rhs.y - this->y * rhs.x; } + v2d_generic operator + (const v2d_generic& rhs) const { return v2d_generic(this->x + rhs.x, this->y + rhs.y); } + v2d_generic operator - (const v2d_generic& rhs) const { return v2d_generic(this->x - rhs.x, this->y - rhs.y); } + v2d_generic operator * (const T& rhs) const { return v2d_generic(this->x * rhs, this->y * rhs); } + v2d_generic operator * (const v2d_generic& rhs) const { return v2d_generic(this->x * rhs.x, this->y * rhs.y); } + v2d_generic operator / (const T& rhs) const { return v2d_generic(this->x / rhs, this->y / rhs); } + v2d_generic operator / (const v2d_generic& rhs) const { return v2d_generic(this->x / rhs.x, this->y / rhs.y); } + v2d_generic& operator += (const v2d_generic& rhs) { this->x += rhs.x; this->y += rhs.y; return *this; } + v2d_generic& operator -= (const v2d_generic& rhs) { this->x -= rhs.x; this->y -= rhs.y; return *this; } + v2d_generic& operator *= (const T& rhs) { this->x *= rhs; this->y *= rhs; return *this; } + v2d_generic& operator /= (const T& rhs) { this->x /= rhs; this->y /= rhs; return *this; } + v2d_generic& operator *= (const v2d_generic& rhs) { this->x *= rhs.x; this->y *= rhs.y; return *this; } + v2d_generic& operator /= (const v2d_generic& rhs) { this->x /= rhs.x; this->y /= rhs.y; return *this; } + v2d_generic operator + () const { return { +x, +y }; } + v2d_generic operator - () const { return { -x, -y }; } + bool operator == (const v2d_generic& rhs) const { return (this->x == rhs.x && this->y == rhs.y); } + bool operator != (const v2d_generic& rhs) const { return (this->x != rhs.x || this->y != rhs.y); } + const std::string str() const { return std::string("(") + std::to_string(this->x) + "," + std::to_string(this->y) + ")"; } + friend std::ostream& operator << (std::ostream& os, const v2d_generic& rhs) { os << rhs.str(); return os; } + operator v2d_generic() const { return { static_cast(this->x), static_cast(this->y) }; } + operator v2d_generic() const { return { static_cast(this->x), static_cast(this->y) }; } + operator v2d_generic() const { return { static_cast(this->x), static_cast(this->y) }; } + }; + + // Note: joshinils has some good suggestions here, but they are complicated to implement at this moment, + // however they will appear in a future version of PGE + template inline v2d_generic operator * (const float& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs * (float)rhs.x), (T)(lhs * (float)rhs.y)); } + template inline v2d_generic operator * (const double& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs * (double)rhs.x), (T)(lhs * (double)rhs.y)); } + template inline v2d_generic operator * (const int& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs * (int)rhs.x), (T)(lhs * (int)rhs.y)); } + template inline v2d_generic operator / (const float& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs / (float)rhs.x), (T)(lhs / (float)rhs.y)); } + template inline v2d_generic operator / (const double& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs / (double)rhs.x), (T)(lhs / (double)rhs.y)); } + template inline v2d_generic operator / (const int& lhs, const v2d_generic& rhs) + { return v2d_generic((T)(lhs / (int)rhs.x), (T)(lhs / (int)rhs.y)); } + + // To stop dandistine crying... + template inline bool operator < (const v2d_generic& lhs, const v2d_generic& rhs) + { return lhs.y < rhs.y || (lhs.y == rhs.y && lhs.x < rhs.x); } + template inline bool operator > (const v2d_generic& lhs, const v2d_generic& rhs) + { return lhs.y > rhs.y || (lhs.y == rhs.y && lhs.x > rhs.x); } + + typedef v2d_generic vi2d; + typedef v2d_generic vu2d; + typedef v2d_generic vf2d; + typedef v2d_generic vd2d; +#endif + + + + + + + // O------------------------------------------------------------------------------O + // | olc::ResourcePack - A virtual scrambled filesystem to pack your assets into | + // O------------------------------------------------------------------------------O + struct ResourceBuffer : public std::streambuf + { + ResourceBuffer(std::ifstream& ifs, uint32_t offset, uint32_t size); + std::vector vMemory; + }; + + class ResourcePack : public std::streambuf + { + public: + ResourcePack(); + ~ResourcePack(); + bool AddFile(const std::string& sFile); + bool LoadPack(const std::string& sFile, const std::string& sKey); + bool SavePack(const std::string& sFile, const std::string& sKey); + ResourceBuffer GetFileBuffer(const std::string& sFile); + bool Loaded(); + private: + struct sResourceFile { uint32_t nSize; uint32_t nOffset; }; + std::map mapFiles; + std::ifstream baseFile; + std::vector scramble(const std::vector& data, const std::string& key); + std::string makeposix(const std::string& path); + }; + + + class ImageLoader + { + public: + ImageLoader() = default; + virtual ~ImageLoader() = default; + virtual olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) = 0; + virtual olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) = 0; + }; + + + // O------------------------------------------------------------------------------O + // | olc::Sprite - An image represented by a 2D array of olc::Pixel | + // O------------------------------------------------------------------------------O + class Sprite + { + public: + Sprite(); + Sprite(const std::string& sImageFile, olc::ResourcePack* pack = nullptr); + Sprite(int32_t w, int32_t h); + Sprite(const olc::Sprite&) = delete; + ~Sprite(); + + public: + olc::rcode LoadFromFile(const std::string& sImageFile, olc::ResourcePack* pack = nullptr); + + public: + int32_t width = 0; + int32_t height = 0; + enum Mode { NORMAL, PERIODIC, CLAMP }; + enum Flip { NONE = 0, HORIZ = 1, VERT = 2 }; + + public: + void SetSampleMode(olc::Sprite::Mode mode = olc::Sprite::Mode::NORMAL); + Pixel GetPixel(int32_t x, int32_t y) const; + bool SetPixel(int32_t x, int32_t y, Pixel p); + Pixel GetPixel(const olc::vi2d& a) const; + bool SetPixel(const olc::vi2d& a, Pixel p); + Pixel Sample(float x, float y) const; + Pixel Sample(const olc::vf2d& uv) const; + Pixel SampleBL(float u, float v) const; + Pixel SampleBL(const olc::vf2d& uv) const; + Pixel* GetData(); + olc::Sprite* Duplicate(); + olc::Sprite* Duplicate(const olc::vi2d& vPos, const olc::vi2d& vSize); + olc::vi2d Size() const; + std::vector pColData; + Mode modeSample = Mode::NORMAL; + + static std::unique_ptr loader; + }; + + // O------------------------------------------------------------------------------O + // | olc::Decal - A GPU resident storage of an olc::Sprite | + // O------------------------------------------------------------------------------O + class Decal + { + public: + Decal(olc::Sprite* spr, bool filter = false, bool clamp = true); + Decal(const uint32_t nExistingTextureResource, olc::Sprite* spr); + virtual ~Decal(); + void Update(); + void UpdateSprite(); + + public: // But dont touch + int32_t id = -1; + olc::Sprite* sprite = nullptr; + olc::vf2d vUVScale = { 1.0f, 1.0f }; + }; + + enum class DecalMode + { + NORMAL, + ADDITIVE, + MULTIPLICATIVE, + STENCIL, + ILLUMINATE, + WIREFRAME, + MODEL3D, + }; + + enum class DecalStructure + { + LINE, + FAN, + STRIP, + LIST + }; + + // O------------------------------------------------------------------------------O + // | olc::Renderable - Convenience class to keep a sprite and decal together | + // O------------------------------------------------------------------------------O + class Renderable + { + public: + Renderable() = default; + Renderable(Renderable&& r) : pSprite(std::move(r.pSprite)), pDecal(std::move(r.pDecal)) {} + Renderable(const Renderable&) = delete; + olc::rcode Load(const std::string& sFile, ResourcePack* pack = nullptr, bool filter = false, bool clamp = true); + void Create(uint32_t width, uint32_t height, bool filter = false, bool clamp = true); + olc::Decal* Decal() const; + olc::Sprite* Sprite() const; + + private: + std::unique_ptr pSprite = nullptr; + std::unique_ptr pDecal = nullptr; + }; + + + // O------------------------------------------------------------------------------O + // | Auxilliary components internal to engine | + // O------------------------------------------------------------------------------O + + struct DecalInstance + { + olc::Decal* decal = nullptr; + std::vector pos; + std::vector uv; + std::vector w; + std::vector tint; + olc::DecalMode mode = olc::DecalMode::NORMAL; + olc::DecalStructure structure = olc::DecalStructure::FAN; + uint32_t points = 0; + }; + + struct LayerDesc + { + olc::vf2d vOffset = { 0, 0 }; + olc::vf2d vScale = { 1, 1 }; + bool bShow = false; + bool bUpdate = false; + olc::Renderable pDrawTarget; + uint32_t nResID = 0; + std::vector vecDecalInstance; + olc::Pixel tint = olc::WHITE; + std::function funcHook = nullptr; + }; + + class Renderer + { + public: + virtual ~Renderer() = default; + virtual void PrepareDevice() = 0; + virtual olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) = 0; + virtual olc::rcode DestroyDevice() = 0; + virtual void DisplayFrame() = 0; + virtual void PrepareDrawing() = 0; + virtual void SetDecalMode(const olc::DecalMode& mode) = 0; + virtual void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) = 0; + virtual void DrawDecal(const olc::DecalInstance& decal) = 0; + virtual uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered = false, const bool clamp = true) = 0; + virtual void UpdateTexture(uint32_t id, olc::Sprite* spr) = 0; + virtual void ReadTexture(uint32_t id, olc::Sprite* spr) = 0; + virtual uint32_t DeleteTexture(const uint32_t id) = 0; + virtual void ApplyTexture(uint32_t id) = 0; + virtual void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) = 0; + virtual void ClearBuffer(olc::Pixel p, bool bDepth) = 0; + static olc::PixelGameEngine* ptrPGE; + }; + + class Platform + { + public: + virtual ~Platform() = default; + virtual olc::rcode ApplicationStartUp() = 0; + virtual olc::rcode ApplicationCleanUp() = 0; + virtual olc::rcode ThreadStartUp() = 0; + virtual olc::rcode ThreadCleanUp() = 0; + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) = 0; + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) = 0; + virtual olc::rcode SetWindowTitle(const std::string& s) = 0; + virtual olc::rcode StartSystemEventLoop() = 0; + virtual olc::rcode HandleSystemEvent() = 0; + static olc::PixelGameEngine* ptrPGE; + }; + + class PGEX; + + // The Static Twins (plus one) + static std::unique_ptr renderer; + static std::unique_ptr platform; + static std::map mapKeys; + + // O------------------------------------------------------------------------------O + // | olc::PixelGameEngine - The main BASE class for your application | + // O------------------------------------------------------------------------------O + class PixelGameEngine + { + public: + PixelGameEngine(); + virtual ~PixelGameEngine(); + public: + olc::rcode Construct(int32_t screen_w, int32_t screen_h, int32_t pixel_w, int32_t pixel_h, + bool full_screen = false, bool vsync = false, bool cohesion = false); + olc::rcode Start(); + + public: // User Override Interfaces + // Called once on application startup, use to load your resources + virtual bool OnUserCreate(); + // Called every frame, and provides you with a time per frame value + virtual bool OnUserUpdate(float fElapsedTime); + // Called once on application termination, so you can be one clean coder + virtual bool OnUserDestroy(); + + // Called when a text entry is confirmed with "enter" key + virtual void OnTextEntryComplete(const std::string& sText); + // Called when a console command is executed + virtual bool OnConsoleCommand(const std::string& sCommand); + + + public: // Hardware Interfaces + // Returns true if window is currently in focus + bool IsFocused() const; + // Get the state of a specific keyboard button + HWButton GetKey(Key k) const; + // Get the state of a specific mouse button + HWButton GetMouse(uint32_t b) const; + // Get Mouse X coordinate in "pixel" space + int32_t GetMouseX() const; + // Get Mouse Y coordinate in "pixel" space + int32_t GetMouseY() const; + // Get Mouse Wheel Delta + int32_t GetMouseWheel() const; + // Get the mouse in window space + const olc::vi2d& GetWindowMouse() const; + // Gets the mouse as a vector to keep Tarriest happy + const olc::vi2d& GetMousePos() const; + + static const std::map& GetKeyMap() { return mapKeys; } + + public: // Utility + // Returns the width of the screen in "pixels" + int32_t ScreenWidth() const; + // Returns the height of the screen in "pixels" + int32_t ScreenHeight() const; + // Returns the width of the currently selected drawing target in "pixels" + int32_t GetDrawTargetWidth() const; + // Returns the height of the currently selected drawing target in "pixels" + int32_t GetDrawTargetHeight() const; + // Returns the currently active draw target + olc::Sprite* GetDrawTarget() const; + // Resize the primary screen sprite + void SetScreenSize(int w, int h); + // Specify which Sprite should be the target of drawing functions, use nullptr + // to specify the primary screen + void SetDrawTarget(Sprite* target); + // Gets the current Frames Per Second + uint32_t GetFPS() const; + // Gets last update of elapsed time + float GetElapsedTime() const; + // Gets Actual Window size + const olc::vi2d& GetWindowSize() const; + // Gets pixel scale + const olc::vi2d& GetPixelSize() const; + // Gets actual pixel scale + const olc::vi2d& GetScreenPixelSize() const; + // Gets "screen" size + const olc::vi2d& GetScreenSize() const; + // Gets any files dropped this frame + const std::vector& GetDroppedFiles() const; + const olc::vi2d& GetDroppedFilesPoint() const; + + public: // CONFIGURATION ROUTINES + // Layer targeting functions + void SetDrawTarget(uint8_t layer, bool bDirty = true); + void EnableLayer(uint8_t layer, bool b); + void SetLayerOffset(uint8_t layer, const olc::vf2d& offset); + void SetLayerOffset(uint8_t layer, float x, float y); + void SetLayerScale(uint8_t layer, const olc::vf2d& scale); + void SetLayerScale(uint8_t layer, float x, float y); + void SetLayerTint(uint8_t layer, const olc::Pixel& tint); + void SetLayerCustomRenderFunction(uint8_t layer, std::function f); + + std::vector& GetLayers(); + uint32_t CreateLayer(); + + // Change the pixel mode for different optimisations + // olc::Pixel::NORMAL = No transparency + // olc::Pixel::MASK = Transparent if alpha is < 255 + // olc::Pixel::ALPHA = Full transparency + void SetPixelMode(Pixel::Mode m); + Pixel::Mode GetPixelMode(); + // Use a custom blend function + void SetPixelMode(std::function pixelMode); + // Change the blend factor from between 0.0f to 1.0f; + void SetPixelBlend(float fBlend); + + + + public: // DRAWING ROUTINES + // Draws a single Pixel + virtual bool Draw(int32_t x, int32_t y, Pixel p = olc::WHITE); + bool Draw(const olc::vi2d& pos, Pixel p = olc::WHITE); + // Draws a line from (x1,y1) to (x2,y2) + void DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p = olc::WHITE, uint32_t pattern = 0xFFFFFFFF); + void DrawLine(const olc::vi2d& pos1, const olc::vi2d& pos2, Pixel p = olc::WHITE, uint32_t pattern = 0xFFFFFFFF); + // Draws a circle located at (x,y) with radius + void DrawCircle(int32_t x, int32_t y, int32_t radius, Pixel p = olc::WHITE, uint8_t mask = 0xFF); + void DrawCircle(const olc::vi2d& pos, int32_t radius, Pixel p = olc::WHITE, uint8_t mask = 0xFF); + // Fills a circle located at (x,y) with radius + void FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p = olc::WHITE); + void FillCircle(const olc::vi2d& pos, int32_t radius, Pixel p = olc::WHITE); + // Draws a rectangle at (x,y) to (x+w,y+h) + void DrawRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p = olc::WHITE); + void DrawRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p = olc::WHITE); + // Fills a rectangle at (x,y) to (x+w,y+h) + void FillRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p = olc::WHITE); + void FillRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p = olc::WHITE); + // Draws a triangle between points (x1,y1), (x2,y2) and (x3,y3) + void DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p = olc::WHITE); + void DrawTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p = olc::WHITE); + // Flat fills a triangle between points (x1,y1), (x2,y2) and (x3,y3) + void FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p = olc::WHITE); + void FillTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p = olc::WHITE); + // Fill a textured and coloured triangle + void FillTexturedTriangle(const std::vector& vPoints, std::vector vTex, std::vector vColour, olc::Sprite* sprTex); + void FillTexturedPolygon(const std::vector& vPoints, const std::vector& vTex, const std::vector& vColour, olc::Sprite* sprTex, olc::DecalStructure structure = olc::DecalStructure::LIST); + // Draws an entire sprite at location (x,y) + void DrawSprite(int32_t x, int32_t y, Sprite* sprite, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + void DrawSprite(const olc::vi2d& pos, Sprite* sprite, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + // Draws an area of a sprite at location (x,y), where the + // selected area is (ox,oy) to (ox+w,oy+h) + void DrawPartialSprite(int32_t x, int32_t y, Sprite* sprite, int32_t ox, int32_t oy, int32_t w, int32_t h, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + void DrawPartialSprite(const olc::vi2d& pos, Sprite* sprite, const olc::vi2d& sourcepos, const olc::vi2d& size, uint32_t scale = 1, uint8_t flip = olc::Sprite::NONE); + // Draws a single line of text - traditional monospaced + void DrawString(int32_t x, int32_t y, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + void DrawString(const olc::vi2d& pos, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + olc::vi2d GetTextSize(const std::string& s); + // Draws a single line of text - non-monospaced + void DrawStringProp(int32_t x, int32_t y, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + void DrawStringProp(const olc::vi2d& pos, const std::string& sText, Pixel col = olc::WHITE, uint32_t scale = 1); + olc::vi2d GetTextSizeProp(const std::string& s); + + // Decal Quad functions + void SetDecalMode(const olc::DecalMode& mode); + void SetDecalStructure(const olc::DecalStructure& structure); + // Draws a whole decal, with optional scale and tinting + void DrawDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + // Draws a region of a decal, with optional scale and tinting + void DrawPartialDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + // Draws fully user controlled 4 vertices, pos(pixels), uv(pixels), colours + void DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements = 4); + // Draws a decal with 4 arbitrary points, warping the texture to look "correct" + void DrawWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::Pixel& tint = olc::WHITE); + void DrawWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::Pixel& tint = olc::WHITE); + void DrawWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::Pixel& tint = olc::WHITE); + // As above, but you can specify a region of a decal source sprite + void DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + void DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + void DrawPartialWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint = olc::WHITE); + // Draws a decal rotated to specified angle, wit point of rotation offset + void DrawRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::vf2d& scale = { 1.0f,1.0f }, const olc::Pixel& tint = olc::WHITE); + void DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale = { 1.0f, 1.0f }, const olc::Pixel& tint = olc::WHITE); + // Draws a multiline string as a decal, with tiniting and scaling + void DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + // Draws a single shaded filled rectangle as a decal + void DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); + void FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col = olc::WHITE); + // Draws a corner shaded rectangle as a decal + void GradientFillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel colTL, const olc::Pixel colBL, const olc::Pixel colBR, const olc::Pixel colTR); + // Draws an arbitrary convex textured polygon using GPU + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const olc::Pixel tint = olc::WHITE); + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& depth, const std::vector& uv, const olc::Pixel tint = olc::WHITE); + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector& tint); + void DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector& colours, const olc::Pixel tint); + // Draws a line in Decal Space + void DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p = olc::WHITE); + void DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + void DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center = { 0.0f, 0.0f }, const olc::Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }); + // Clears entire draw target to Pixel + void Clear(Pixel p); + // Clears the rendering back buffer + void ClearBuffer(Pixel p, bool bDepth = true); + // Returns the font image + olc::Sprite* GetFontSprite(); + + // Clip a line segment to visible area + bool ClipLineToScreen(olc::vi2d& in_p1, olc::vi2d& in_p2); + + // Dont allow PGE to mark layers as dirty, so pixel graphics don't update + void EnablePixelTransfer(const bool bEnable = true); + + // Command Console Routines + void ConsoleShow(const olc::Key &keyExit, bool bSuspendTime = true); + bool IsConsoleShowing() const; + void ConsoleClear(); + std::stringstream& ConsoleOut(); + void ConsoleCaptureStdOut(const bool bCapture); + + // Text Entry Routines + void TextEntryEnable(const bool bEnable, const std::string& sText = ""); + std::string TextEntryGetString() const; + int32_t TextEntryGetCursor() const; + bool IsTextEntryEnabled() const; + + + + private: + void UpdateTextEntry(); + void UpdateConsole(); + + public: + + // Experimental Lightweight 3D Routines ================ +#ifdef OLC_ENABLE_EXPERIMENTAL + // Set Manual View Matrix + void LW3D_View(const std::array& m); + // Set Manual World Matrix + void LW3D_World(const std::array& m); + // Set Manual Projection Matrix + void LW3D_Projection(const std::array& m); + + // Draws a vector of vertices, interprted as individual triangles + void LW3D_DrawTriangles(olc::Decal* decal, const std::vector>& pos, const std::vector& tex, const std::vector& col); + + void LW3D_ModelTranslate(const float x, const float y, const float z); + + // Camera convenience functions + void LW3D_SetCameraAtTarget(const float fEyeX, const float fEyeY, const float fEyeZ, + const float fTargetX, const float fTargetY, const float fTargetZ, + const float fUpX = 0.0f, const float fUpY = 1.0f, const float fUpZ = 0.0f); + void LW3D_SetCameraAlongDirection(const float fEyeX, const float fEyeY, const float fEyeZ, + const float fDirX, const float fDirY, const float fDirZ, + const float fUpX = 0.0f, const float fUpY = 1.0f, const float fUpZ = 0.0f); + + // 3D Rendering Flags + void LW3D_EnableDepthTest(const bool bEnableDepth); + void LW3D_EnableBackfaceCulling(const bool bEnableCull); +#endif + public: // Branding + std::string sAppName; + + private: // Inner mysterious workings + olc::Sprite* pDrawTarget = nullptr; + Pixel::Mode nPixelMode = Pixel::NORMAL; + float fBlendFactor = 1.0f; + olc::vi2d vScreenSize = { 256, 240 }; + olc::vf2d vInvScreenSize = { 1.0f / 256.0f, 1.0f / 240.0f }; + olc::vi2d vPixelSize = { 4, 4 }; + olc::vi2d vScreenPixelSize = { 4, 4 }; + olc::vi2d vMousePos = { 0, 0 }; + int32_t nMouseWheelDelta = 0; + olc::vi2d vMousePosCache = { 0, 0 }; + olc::vi2d vMouseWindowPos = { 0, 0 }; + int32_t nMouseWheelDeltaCache = 0; + olc::vi2d vWindowSize = { 0, 0 }; + olc::vi2d vViewPos = { 0, 0 }; + olc::vi2d vViewSize = { 0,0 }; + bool bFullScreen = false; + olc::vf2d vPixel = { 1.0f, 1.0f }; + bool bHasInputFocus = false; + bool bHasMouseFocus = false; + bool bEnableVSYNC = false; + float fFrameTimer = 1.0f; + float fLastElapsed = 0.0f; + int nFrameCount = 0; + bool bSuspendTextureTransfer = false; + Renderable fontRenderable; + std::vector vLayers; + uint8_t nTargetLayer = 0; + uint32_t nLastFPS = 0; + bool bPixelCohesion = false; + DecalMode nDecalMode = DecalMode::NORMAL; + DecalStructure nDecalStructure = DecalStructure::FAN; + std::function funcPixelMode; + std::chrono::time_point m_tp1, m_tp2; + std::vector vFontSpacing; + std::vector vDroppedFiles; + std::vector vDroppedFilesCache; + olc::vi2d vDroppedFilesPoint; + olc::vi2d vDroppedFilesPointCache; + + // Command Console Specific + bool bConsoleShow = false; + bool bConsoleSuspendTime = false; + olc::Key keyConsoleExit = olc::Key::F1; + std::stringstream ssConsoleOutput; + std::streambuf* sbufOldCout = nullptr; + olc::vi2d vConsoleSize; + olc::vi2d vConsoleCursor = { 0,0 }; + olc::vf2d vConsoleCharacterScale = { 1.0f, 2.0f }; + std::vector sConsoleLines; + std::list sCommandHistory; + std::list::iterator sCommandHistoryIt; + + // Text Entry Specific + bool bTextEntryEnable = false; + std::string sTextEntryString = ""; + int32_t nTextEntryCursor = 0; + std::vector> vKeyboardMap; + + + + // State of keyboard + bool pKeyNewState[256] = { 0 }; + bool pKeyOldState[256] = { 0 }; + HWButton pKeyboardState[256] = { 0 }; + + // State of mouse + bool pMouseNewState[nMouseButtons] = { 0 }; + bool pMouseOldState[nMouseButtons] = { 0 }; + HWButton pMouseState[nMouseButtons] = { 0 }; + + // The main engine thread + void EngineThread(); + + + // If anything sets this flag to false, the engine + // "should" shut down gracefully + static std::atomic bAtomActive; + + public: + // "Break In" Functions + void olc_UpdateMouse(int32_t x, int32_t y); + void olc_UpdateMouseWheel(int32_t delta); + void olc_UpdateWindowSize(int32_t x, int32_t y); + void olc_UpdateViewport(); + void olc_ConstructFontSheet(); + void olc_CoreUpdate(); + void olc_PrepareEngine(); + void olc_UpdateMouseState(int32_t button, bool state); + void olc_UpdateKeyState(int32_t key, bool state); + void olc_UpdateMouseFocus(bool state); + void olc_UpdateKeyFocus(bool state); + void olc_Terminate(); + void olc_DropFiles(int32_t x, int32_t y, const std::vector& vFiles); + void olc_Reanimate(); + bool olc_IsRunning(); + + // At the very end of this file, chooses which + // components to compile + virtual void olc_ConfigureSystem(); + + // NOTE: Items Here are to be deprecated, I have left them in for now + // in case you are using them, but they will be removed. + // olc::vf2d vSubPixelOffset = { 0.0f, 0.0f }; + + public: // PGEX Stuff + friend class PGEX; + void pgex_Register(olc::PGEX* pgex); + + private: + std::vector vExtensions; + }; + + + + // O------------------------------------------------------------------------------O + // | PGE EXTENSION BASE CLASS - Permits access to PGE functions from extension | + // O------------------------------------------------------------------------------O + class PGEX + { + friend class olc::PixelGameEngine; + public: + PGEX(bool bHook = false); + + protected: + virtual void OnBeforeUserCreate(); + virtual void OnAfterUserCreate(); + virtual bool OnBeforeUserUpdate(float &fElapsedTime); + virtual void OnAfterUserUpdate(float fElapsedTime); + + protected: + static PixelGameEngine* pge; + }; +} + +#pragma endregion + + +#pragma region opengl33_iface +// In order to facilitate more advanced graphics features, some PGEX +// will rely on shaders. Instead of having each PGEX responsible for +// managing this, for convenience, this interface exists. + +#if defined(OLC_GFX_OPENGL33) + +#if defined(OLC_PLATFORM_WINAPI) +#include +#define CALLSTYLE __stdcall +#endif + +#if defined(__linux__) || defined(__FreeBSD__) +#include +#endif + +#if defined(OLC_PLATFORM_X11) +namespace X11 { +#include +} +#define CALLSTYLE +#endif + +#if defined(__APPLE__) +#define GL_SILENCE_DEPRECATION +#include +#include +#include +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) +#include +#include +#define GL_GLEXT_PROTOTYPES +#include +#include +#define CALLSTYLE +#define GL_CLAMP GL_CLAMP_TO_EDGE +#endif + +namespace olc +{ + typedef char GLchar; + typedef ptrdiff_t GLsizeiptr; + + typedef GLuint CALLSTYLE locCreateShader_t(GLenum type); + typedef GLuint CALLSTYLE locCreateProgram_t(void); + typedef void CALLSTYLE locDeleteShader_t(GLuint shader); + typedef void CALLSTYLE locCompileShader_t(GLuint shader); + typedef void CALLSTYLE locLinkProgram_t(GLuint program); + typedef void CALLSTYLE locDeleteProgram_t(GLuint program); + typedef void CALLSTYLE locAttachShader_t(GLuint program, GLuint shader); + typedef void CALLSTYLE locBindBuffer_t(GLenum target, GLuint buffer); + typedef void CALLSTYLE locBufferData_t(GLenum target, GLsizeiptr size, const void* data, GLenum usage); + typedef void CALLSTYLE locGenBuffers_t(GLsizei n, GLuint* buffers); + typedef void CALLSTYLE locVertexAttribPointer_t(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + typedef void CALLSTYLE locEnableVertexAttribArray_t(GLuint index); + typedef void CALLSTYLE locUseProgram_t(GLuint program); + typedef void CALLSTYLE locBindVertexArray_t(GLuint array); + typedef void CALLSTYLE locGenVertexArrays_t(GLsizei n, GLuint* arrays); + typedef void CALLSTYLE locGetShaderInfoLog_t(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); + typedef GLint CALLSTYLE locGetUniformLocation_t(GLuint program, const GLchar* name); + typedef void CALLSTYLE locUniform1f_t(GLint location, GLfloat v0); + typedef void CALLSTYLE locUniform1i_t(GLint location, GLint v0); + typedef void CALLSTYLE locUniform2fv_t(GLint location, GLsizei count, const GLfloat* value); + typedef void CALLSTYLE locActiveTexture_t(GLenum texture); + typedef void CALLSTYLE locGenFrameBuffers_t(GLsizei n, GLuint* ids); + typedef void CALLSTYLE locBindFrameBuffer_t(GLenum target, GLuint fb); + typedef GLenum CALLSTYLE locCheckFrameBufferStatus_t(GLenum target); + typedef void CALLSTYLE locDeleteFrameBuffers_t(GLsizei n, const GLuint* fbs); + typedef void CALLSTYLE locFrameBufferTexture2D_t(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + typedef void CALLSTYLE locDrawBuffers_t(GLsizei n, const GLenum* bufs); + typedef void CALLSTYLE locBlendFuncSeparate_t(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + +#if defined(OLC_PLATFORM_WINAPI) + typedef void __stdcall locSwapInterval_t(GLsizei n); +#endif + +#if defined(OLC_PLATFORM_X11) + typedef int(locSwapInterval_t)(X11::Display* dpy, X11::GLXDrawable drawable, int interval); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + typedef void CALLSTYLE locShaderSource_t(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); + typedef EGLBoolean(locSwapInterval_t)(EGLDisplay display, EGLint interval); +#else + typedef void CALLSTYLE locShaderSource_t(GLuint shader, GLsizei count, const GLchar** string, const GLint* length); +#endif + +} // olc namespace +#endif // OpenGL33 Definitions +#pragma endregion + + +#endif // OLC_PGE_DEF + + + // O------------------------------------------------------------------------------O + // | START OF OLC_PGE_APPLICATION | + // O------------------------------------------------------------------------------O +#ifdef OLC_PGE_APPLICATION +#undef OLC_PGE_APPLICATION + + // O------------------------------------------------------------------------------O + // | olcPixelGameEngine INTERFACE IMPLEMENTATION (CORE) | + // | Note: The core implementation is platform independent | + // O------------------------------------------------------------------------------O +#pragma region pge_implementation +namespace olc +{ + // O------------------------------------------------------------------------------O + // | olc::Pixel IMPLEMENTATION | + // O------------------------------------------------------------------------------O + Pixel::Pixel() + { r = 0; g = 0; b = 0; a = nDefaultAlpha; } + + Pixel::Pixel(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha) + { n = red | (green << 8) | (blue << 16) | (alpha << 24); } // Thanks jarekpelczar + + Pixel::Pixel(uint32_t p) + { n = p; } + + bool Pixel::operator==(const Pixel& p) const + { return n == p.n; } + + bool Pixel::operator!=(const Pixel& p) const + { return n != p.n; } + + Pixel Pixel::operator * (const float i) const + { + float fR = std::min(255.0f, std::max(0.0f, float(r) * i)); + float fG = std::min(255.0f, std::max(0.0f, float(g) * i)); + float fB = std::min(255.0f, std::max(0.0f, float(b) * i)); + return Pixel(uint8_t(fR), uint8_t(fG), uint8_t(fB), a); + } + + Pixel Pixel::operator / (const float i) const + { + float fR = std::min(255.0f, std::max(0.0f, float(r) / i)); + float fG = std::min(255.0f, std::max(0.0f, float(g) / i)); + float fB = std::min(255.0f, std::max(0.0f, float(b) / i)); + return Pixel(uint8_t(fR), uint8_t(fG), uint8_t(fB), a); + } + + Pixel& Pixel::operator *=(const float i) + { + this->r = uint8_t(std::min(255.0f, std::max(0.0f, float(r) * i))); + this->g = uint8_t(std::min(255.0f, std::max(0.0f, float(g) * i))); + this->b = uint8_t(std::min(255.0f, std::max(0.0f, float(b) * i))); + return *this; + } + + Pixel& Pixel::operator /=(const float i) + { + this->r = uint8_t(std::min(255.0f, std::max(0.0f, float(r) / i))); + this->g = uint8_t(std::min(255.0f, std::max(0.0f, float(g) / i))); + this->b = uint8_t(std::min(255.0f, std::max(0.0f, float(b) / i))); + return *this; + } + + Pixel Pixel::operator + (const Pixel& p) const + { + uint8_t nR = uint8_t(std::min(255, std::max(0, int(r) + int(p.r)))); + uint8_t nG = uint8_t(std::min(255, std::max(0, int(g) + int(p.g)))); + uint8_t nB = uint8_t(std::min(255, std::max(0, int(b) + int(p.b)))); + return Pixel(nR, nG, nB, a); + } + + Pixel Pixel::operator - (const Pixel& p) const + { + uint8_t nR = uint8_t(std::min(255, std::max(0, int(r) - int(p.r)))); + uint8_t nG = uint8_t(std::min(255, std::max(0, int(g) - int(p.g)))); + uint8_t nB = uint8_t(std::min(255, std::max(0, int(b) - int(p.b)))); + return Pixel(nR, nG, nB, a); + } + + Pixel& Pixel::operator += (const Pixel& p) + { + this->r = uint8_t(std::min(255, std::max(0, int(r) + int(p.r)))); + this->g = uint8_t(std::min(255, std::max(0, int(g) + int(p.g)))); + this->b = uint8_t(std::min(255, std::max(0, int(b) + int(p.b)))); + return *this; + } + + Pixel& Pixel::operator -= (const Pixel& p) // Thanks Au Lit + { + this->r = uint8_t(std::min(255, std::max(0, int(r) - int(p.r)))); + this->g = uint8_t(std::min(255, std::max(0, int(g) - int(p.g)))); + this->b = uint8_t(std::min(255, std::max(0, int(b) - int(p.b)))); + return *this; + } + + Pixel Pixel::operator * (const Pixel& p) const + { + uint8_t nR = uint8_t(std::min(255.0f, std::max(0.0f, float(r) * float(p.r) / 255.0f))); + uint8_t nG = uint8_t(std::min(255.0f, std::max(0.0f, float(g) * float(p.g) / 255.0f))); + uint8_t nB = uint8_t(std::min(255.0f, std::max(0.0f, float(b) * float(p.b) / 255.0f))); + uint8_t nA = uint8_t(std::min(255.0f, std::max(0.0f, float(a) * float(p.a) / 255.0f))); + return Pixel(nR, nG, nB, nA); + } + + Pixel& Pixel::operator *=(const Pixel& p) + { + this->r = uint8_t(std::min(255.0f, std::max(0.0f, float(r) * float(p.r) / 255.0f))); + this->g = uint8_t(std::min(255.0f, std::max(0.0f, float(g) * float(p.g) / 255.0f))); + this->b = uint8_t(std::min(255.0f, std::max(0.0f, float(b) * float(p.b) / 255.0f))); + this->a = uint8_t(std::min(255.0f, std::max(0.0f, float(a) * float(p.a) / 255.0f))); + return *this; + } + + Pixel Pixel::inv() const + { + uint8_t nR = uint8_t(std::min(255, std::max(0, 255 - int(r)))); + uint8_t nG = uint8_t(std::min(255, std::max(0, 255 - int(g)))); + uint8_t nB = uint8_t(std::min(255, std::max(0, 255 - int(b)))); + return Pixel(nR, nG, nB, a); + } + + Pixel PixelF(float red, float green, float blue, float alpha) + { return Pixel(uint8_t(red * 255.0f), uint8_t(green * 255.0f), uint8_t(blue * 255.0f), uint8_t(alpha * 255.0f)); } + + Pixel PixelLerp(const olc::Pixel& p1, const olc::Pixel& p2, float t) + { return (p2 * t) + p1 * (1.0f - t); } + + // O------------------------------------------------------------------------------O + // | olc::Sprite IMPLEMENTATION | + // O------------------------------------------------------------------------------O + Sprite::Sprite() + { width = 0; height = 0; } + + Sprite::Sprite(const std::string& sImageFile, olc::ResourcePack* pack) + { LoadFromFile(sImageFile, pack); } + + Sprite::Sprite(int32_t w, int32_t h) + { + width = w; height = h; + pColData.resize(width * height); + pColData.resize(width * height, nDefaultPixel); + } + + Sprite::~Sprite() + { pColData.clear(); } + + void Sprite::SetSampleMode(olc::Sprite::Mode mode) + { modeSample = mode; } + + Pixel Sprite::GetPixel(const olc::vi2d& a) const + { return GetPixel(a.x, a.y); } + + bool Sprite::SetPixel(const olc::vi2d& a, Pixel p) + { return SetPixel(a.x, a.y, p); } + + Pixel Sprite::GetPixel(int32_t x, int32_t y) const + { + if (modeSample == olc::Sprite::Mode::NORMAL) + { + if (x >= 0 && x < width && y >= 0 && y < height) + return pColData[y * width + x]; + else + return Pixel(0, 0, 0, 0); + } + else + { + if (modeSample == olc::Sprite::Mode::PERIODIC) + return pColData[abs(y % height) * width + abs(x % width)]; + else + return pColData[std::max(0, std::min(y, height-1)) * width + std::max(0, std::min(x, width-1))]; + } + } + + bool Sprite::SetPixel(int32_t x, int32_t y, Pixel p) + { + if (x >= 0 && x < width && y >= 0 && y < height) + { + pColData[y * width + x] = p; + return true; + } + else + return false; + } + + Pixel Sprite::Sample(float x, float y) const + { + int32_t sx = std::min((int32_t)((x * (float)width)), width - 1); + int32_t sy = std::min((int32_t)((y * (float)height)), height - 1); + return GetPixel(sx, sy); + } + + Pixel Sprite::Sample(const olc::vf2d& uv) const + { + return Sample(uv.x, uv.y); + } + + Pixel Sprite::SampleBL(float u, float v) const + { + u = u * width - 0.5f; + v = v * height - 0.5f; + int x = (int)floor(u); // cast to int rounds toward zero, not downward + int y = (int)floor(v); // Thanks @joshinils + float u_ratio = u - x; + float v_ratio = v - y; + float u_opposite = 1 - u_ratio; + float v_opposite = 1 - v_ratio; + + olc::Pixel p1 = GetPixel(std::max(x, 0), std::max(y, 0)); + olc::Pixel p2 = GetPixel(std::min(x + 1, (int)width - 1), std::max(y, 0)); + olc::Pixel p3 = GetPixel(std::max(x, 0), std::min(y + 1, (int)height - 1)); + olc::Pixel p4 = GetPixel(std::min(x + 1, (int)width - 1), std::min(y + 1, (int)height - 1)); + + return olc::Pixel( + (uint8_t)((p1.r * u_opposite + p2.r * u_ratio) * v_opposite + (p3.r * u_opposite + p4.r * u_ratio) * v_ratio), + (uint8_t)((p1.g * u_opposite + p2.g * u_ratio) * v_opposite + (p3.g * u_opposite + p4.g * u_ratio) * v_ratio), + (uint8_t)((p1.b * u_opposite + p2.b * u_ratio) * v_opposite + (p3.b * u_opposite + p4.b * u_ratio) * v_ratio)); + } + + Pixel Sprite::SampleBL(const olc::vf2d& uv) const + { + return SampleBL(uv.x, uv.y); + } + + Pixel* Sprite::GetData() + { return pColData.data(); } + + + olc::rcode Sprite::LoadFromFile(const std::string& sImageFile, olc::ResourcePack* pack) + { + UNUSED(pack); + return loader->LoadImageResource(this, sImageFile, pack); + } + + olc::Sprite* Sprite::Duplicate() + { + olc::Sprite* spr = new olc::Sprite(width, height); + std::memcpy(spr->GetData(), GetData(), width * height * sizeof(olc::Pixel)); + spr->modeSample = modeSample; + return spr; + } + + olc::Sprite* Sprite::Duplicate(const olc::vi2d& vPos, const olc::vi2d& vSize) + { + olc::Sprite* spr = new olc::Sprite(vSize.x, vSize.y); + for (int y = 0; y < vSize.y; y++) + for (int x = 0; x < vSize.x; x++) + spr->SetPixel(x, y, GetPixel(vPos.x + x, vPos.y + y)); + return spr; + } + + olc::vi2d olc::Sprite::Size() const + { + return { width, height }; + } + + // O------------------------------------------------------------------------------O + // | olc::Decal IMPLEMENTATION | + // O------------------------------------------------------------------------------O + Decal::Decal(olc::Sprite* spr, bool filter, bool clamp) + { + id = -1; + if (spr == nullptr) return; + sprite = spr; + id = renderer->CreateTexture(sprite->width, sprite->height, filter, clamp); + Update(); + } + + Decal::Decal(const uint32_t nExistingTextureResource, olc::Sprite* spr) + { + if (spr == nullptr) return; + id = nExistingTextureResource; + } + + void Decal::Update() + { + if (sprite == nullptr) return; + vUVScale = { 1.0f / float(sprite->width), 1.0f / float(sprite->height) }; + renderer->ApplyTexture(id); + renderer->UpdateTexture(id, sprite); + } + + void Decal::UpdateSprite() + { + if (sprite == nullptr) return; + renderer->ApplyTexture(id); + renderer->ReadTexture(id, sprite); + } + + Decal::~Decal() + { + if (id != -1) + { + renderer->DeleteTexture(id); + id = -1; + } + } + + void Renderable::Create(uint32_t width, uint32_t height, bool filter, bool clamp) + { + pSprite = std::make_unique(width, height); + pDecal = std::make_unique(pSprite.get(), filter, clamp); + } + + olc::rcode Renderable::Load(const std::string& sFile, ResourcePack* pack, bool filter, bool clamp) + { + pSprite = std::make_unique(); + if (pSprite->LoadFromFile(sFile, pack) == olc::rcode::OK) + { + pDecal = std::make_unique(pSprite.get(), filter, clamp); + return olc::rcode::OK; + } + else + { + pSprite.release(); + pSprite = nullptr; + return olc::rcode::NO_FILE; + } + } + + olc::Decal* Renderable::Decal() const + { return pDecal.get(); } + + olc::Sprite* Renderable::Sprite() const + { return pSprite.get(); } + + // O------------------------------------------------------------------------------O + // | olc::ResourcePack IMPLEMENTATION | + // O------------------------------------------------------------------------------O + + + //============================================================= + // Resource Packs - Allows you to store files in one large + // scrambled file - Thanks MaGetzUb for debugging a null char in std::stringstream bug + ResourceBuffer::ResourceBuffer(std::ifstream& ifs, uint32_t offset, uint32_t size) + { + vMemory.resize(size); + ifs.seekg(offset); ifs.read(vMemory.data(), vMemory.size()); + setg(vMemory.data(), vMemory.data(), vMemory.data() + size); + } + + ResourcePack::ResourcePack() { } + ResourcePack::~ResourcePack() { baseFile.close(); } + + bool ResourcePack::AddFile(const std::string& sFile) + { + const std::string file = makeposix(sFile); + + if (_gfs::exists(file)) + { + sResourceFile e; + e.nSize = (uint32_t)_gfs::file_size(file); + e.nOffset = 0; // Unknown at this stage + mapFiles[file] = e; + return true; + } + return false; + } + + bool ResourcePack::LoadPack(const std::string& sFile, const std::string& sKey) + { + // Open the resource file + baseFile.open(sFile, std::ifstream::binary); + if (!baseFile.is_open()) return false; + + // 1) Read Scrambled index + uint32_t nIndexSize = 0; + baseFile.read((char*)&nIndexSize, sizeof(uint32_t)); + + std::vector buffer(nIndexSize); + for (uint32_t j = 0; j < nIndexSize; j++) + buffer[j] = baseFile.get(); + + std::vector decoded = scramble(buffer, sKey); + size_t pos = 0; + auto read = [&decoded, &pos](char* dst, size_t size) { + memcpy((void*)dst, (const void*)(decoded.data() + pos), size); + pos += size; + }; + + auto get = [&read]() -> int { char c; read(&c, 1); return c; }; + + // 2) Read Map + uint32_t nMapEntries = 0; + read((char*)&nMapEntries, sizeof(uint32_t)); + for (uint32_t i = 0; i < nMapEntries; i++) + { + uint32_t nFilePathSize = 0; + read((char*)&nFilePathSize, sizeof(uint32_t)); + + std::string sFileName(nFilePathSize, ' '); + for (uint32_t j = 0; j < nFilePathSize; j++) + sFileName[j] = get(); + + sResourceFile e; + read((char*)&e.nSize, sizeof(uint32_t)); + read((char*)&e.nOffset, sizeof(uint32_t)); + mapFiles[sFileName] = e; + } + + // Don't close base file! we will provide a stream + // pointer when the file is requested + return true; + } + + bool ResourcePack::SavePack(const std::string& sFile, const std::string& sKey) + { + // Create/Overwrite the resource file + std::ofstream ofs(sFile, std::ofstream::binary); + if (!ofs.is_open()) return false; + + // Iterate through map + uint32_t nIndexSize = 0; // Unknown for now + ofs.write((char*)&nIndexSize, sizeof(uint32_t)); + uint32_t nMapSize = uint32_t(mapFiles.size()); + ofs.write((char*)&nMapSize, sizeof(uint32_t)); + for (auto& e : mapFiles) + { + // Write the path of the file + size_t nPathSize = e.first.size(); + ofs.write((char*)&nPathSize, sizeof(uint32_t)); + ofs.write(e.first.c_str(), nPathSize); + + // Write the file entry properties + ofs.write((char*)&e.second.nSize, sizeof(uint32_t)); + ofs.write((char*)&e.second.nOffset, sizeof(uint32_t)); + } + + // 2) Write the individual Data + std::streampos offset = ofs.tellp(); + nIndexSize = (uint32_t)offset; + for (auto& e : mapFiles) + { + // Store beginning of file offset within resource pack file + e.second.nOffset = (uint32_t)offset; + + // Load the file to be added + std::vector vBuffer(e.second.nSize); + std::ifstream i(e.first, std::ifstream::binary); + i.read((char*)vBuffer.data(), e.second.nSize); + i.close(); + + // Write the loaded file into resource pack file + ofs.write((char*)vBuffer.data(), e.second.nSize); + offset += e.second.nSize; + } + + // 3) Scramble Index + std::vector stream; + auto write = [&stream](const char* data, size_t size) { + size_t sizeNow = stream.size(); + stream.resize(sizeNow + size); + memcpy(stream.data() + sizeNow, data, size); + }; + + // Iterate through map + write((char*)&nMapSize, sizeof(uint32_t)); + for (auto& e : mapFiles) + { + // Write the path of the file + size_t nPathSize = e.first.size(); + write((char*)&nPathSize, sizeof(uint32_t)); + write(e.first.c_str(), nPathSize); + + // Write the file entry properties + write((char*)&e.second.nSize, sizeof(uint32_t)); + write((char*)&e.second.nOffset, sizeof(uint32_t)); + } + std::vector sIndexString = scramble(stream, sKey); + uint32_t nIndexStringLen = uint32_t(sIndexString.size()); + // 4) Rewrite Map (it has been updated with offsets now) + // at start of file + ofs.seekp(0, std::ios::beg); + ofs.write((char*)&nIndexStringLen, sizeof(uint32_t)); + ofs.write(sIndexString.data(), nIndexStringLen); + ofs.close(); + return true; + } + + ResourceBuffer ResourcePack::GetFileBuffer(const std::string& sFile) + { return ResourceBuffer(baseFile, mapFiles[sFile].nOffset, mapFiles[sFile].nSize); } + + bool ResourcePack::Loaded() + { return baseFile.is_open(); } + + std::vector ResourcePack::scramble(const std::vector& data, const std::string& key) + { + if (key.empty()) return data; + std::vector o; + size_t c = 0; + for (auto s : data) o.push_back(s ^ key[(c++) % key.size()]); + return o; + }; + + std::string ResourcePack::makeposix(const std::string& path) + { + std::string o; + for (auto s : path) o += std::string(1, s == '\\' ? '/' : s); + return o; + }; + + // O------------------------------------------------------------------------------O + // | olc::PixelGameEngine IMPLEMENTATION | + // O------------------------------------------------------------------------------O + PixelGameEngine::PixelGameEngine() + { + sAppName = "Undefined"; + olc::PGEX::pge = this; + + // Bring in relevant Platform & Rendering systems depending + // on compiler parameters + olc_ConfigureSystem(); + } + + PixelGameEngine::~PixelGameEngine() + {} + + + olc::rcode PixelGameEngine::Construct(int32_t screen_w, int32_t screen_h, int32_t pixel_w, int32_t pixel_h, bool full_screen, bool vsync, bool cohesion) + { + bPixelCohesion = cohesion; + vScreenSize = { screen_w, screen_h }; + vInvScreenSize = { 1.0f / float(screen_w), 1.0f / float(screen_h) }; + vPixelSize = { pixel_w, pixel_h }; + vWindowSize = vScreenSize * vPixelSize; + bFullScreen = full_screen; + bEnableVSYNC = vsync; + vPixel = 2.0f / vScreenSize; + + if (vPixelSize.x <= 0 || vPixelSize.y <= 0 || vScreenSize.x <= 0 || vScreenSize.y <= 0) + return olc::FAIL; + return olc::OK; + } + + + void PixelGameEngine::SetScreenSize(int w, int h) + { + vScreenSize = { w, h }; + vInvScreenSize = { 1.0f / float(w), 1.0f / float(h) }; + for (auto& layer : vLayers) + { + layer.pDrawTarget.Create(vScreenSize.x, vScreenSize.y); + layer.bUpdate = true; + } + SetDrawTarget(nullptr); + renderer->ClearBuffer(olc::BLACK, true); + renderer->DisplayFrame(); + renderer->ClearBuffer(olc::BLACK, true); + renderer->UpdateViewport(vViewPos, vViewSize); + } + +#if !defined(PGE_USE_CUSTOM_START) + olc::rcode PixelGameEngine::Start() + { + if (platform->ApplicationStartUp() != olc::OK) return olc::FAIL; + + // Construct the window + if (platform->CreateWindowPane({ 30,30 }, vWindowSize, bFullScreen) != olc::OK) return olc::FAIL; + olc_UpdateWindowSize(vWindowSize.x, vWindowSize.y); + + // Start the thread + bAtomActive = true; + std::thread t = std::thread(&PixelGameEngine::EngineThread, this); + + // Some implementations may form an event loop here + platform->StartSystemEventLoop(); + + // Wait for thread to be exited + t.join(); + + if (platform->ApplicationCleanUp() != olc::OK) return olc::FAIL; + + return olc::OK; + } +#endif + + void PixelGameEngine::SetDrawTarget(Sprite* target) + { + if (target) + { + pDrawTarget = target; + } + else + { + nTargetLayer = 0; + pDrawTarget = vLayers[0].pDrawTarget.Sprite(); + } + } + + void PixelGameEngine::SetDrawTarget(uint8_t layer, bool bDirty) + { + if (layer < vLayers.size()) + { + pDrawTarget = vLayers[layer].pDrawTarget.Sprite(); + vLayers[layer].bUpdate = bDirty; + nTargetLayer = layer; + } + } + + void PixelGameEngine::EnableLayer(uint8_t layer, bool b) + { if (layer < vLayers.size()) vLayers[layer].bShow = b; } + + void PixelGameEngine::SetLayerOffset(uint8_t layer, const olc::vf2d& offset) + { SetLayerOffset(layer, offset.x, offset.y); } + + void PixelGameEngine::SetLayerOffset(uint8_t layer, float x, float y) + { if (layer < vLayers.size()) vLayers[layer].vOffset = { x, y }; } + + void PixelGameEngine::SetLayerScale(uint8_t layer, const olc::vf2d& scale) + { SetLayerScale(layer, scale.x, scale.y); } + + void PixelGameEngine::SetLayerScale(uint8_t layer, float x, float y) + { if (layer < vLayers.size()) vLayers[layer].vScale = { x, y }; } + + void PixelGameEngine::SetLayerTint(uint8_t layer, const olc::Pixel& tint) + { if (layer < vLayers.size()) vLayers[layer].tint = tint; } + + void PixelGameEngine::SetLayerCustomRenderFunction(uint8_t layer, std::function f) + { if (layer < vLayers.size()) vLayers[layer].funcHook = f; } + + std::vector& PixelGameEngine::GetLayers() + { return vLayers; } + + uint32_t PixelGameEngine::CreateLayer() + { + LayerDesc ld; + ld.pDrawTarget.Create(vScreenSize.x, vScreenSize.y); + vLayers.push_back(std::move(ld)); + return uint32_t(vLayers.size()) - 1; + } + + Sprite* PixelGameEngine::GetDrawTarget() const + { return pDrawTarget; } + + int32_t PixelGameEngine::GetDrawTargetWidth() const + { + if (pDrawTarget) + return pDrawTarget->width; + else + return 0; + } + + int32_t PixelGameEngine::GetDrawTargetHeight() const + { + if (pDrawTarget) + return pDrawTarget->height; + else + return 0; + } + + uint32_t PixelGameEngine::GetFPS() const + { return nLastFPS; } + + bool PixelGameEngine::IsFocused() const + { return bHasInputFocus; } + + HWButton PixelGameEngine::GetKey(Key k) const + { return pKeyboardState[k]; } + + HWButton PixelGameEngine::GetMouse(uint32_t b) const + { return pMouseState[b]; } + + int32_t PixelGameEngine::GetMouseX() const + { return vMousePos.x; } + + int32_t PixelGameEngine::GetMouseY() const + { return vMousePos.y; } + + const olc::vi2d& PixelGameEngine::GetMousePos() const + { return vMousePos; } + + int32_t PixelGameEngine::GetMouseWheel() const + { return nMouseWheelDelta; } + + int32_t PixelGameEngine::ScreenWidth() const + { return vScreenSize.x; } + + int32_t PixelGameEngine::ScreenHeight() const + { return vScreenSize.y; } + + float PixelGameEngine::GetElapsedTime() const + { return fLastElapsed; } + + const olc::vi2d& PixelGameEngine::GetWindowSize() const + { return vWindowSize; } + + const olc::vi2d& PixelGameEngine::GetPixelSize() const + { return vPixelSize; } + + const olc::vi2d& PixelGameEngine::GetScreenPixelSize() const + { return vScreenPixelSize; } + + const olc::vi2d& PixelGameEngine::GetScreenSize() const + { return vScreenSize; } + + const olc::vi2d& PixelGameEngine::GetWindowMouse() const + { return vMouseWindowPos; } + + bool PixelGameEngine::Draw(const olc::vi2d& pos, Pixel p) + { return Draw(pos.x, pos.y, p); } + + // This is it, the critical function that plots a pixel + bool PixelGameEngine::Draw(int32_t x, int32_t y, Pixel p) + { + if (!pDrawTarget) return false; + + if (nPixelMode == Pixel::NORMAL) + { + return pDrawTarget->SetPixel(x, y, p); + } + + if (nPixelMode == Pixel::MASK) + { + if (p.a == 255) + return pDrawTarget->SetPixel(x, y, p); + } + + if (nPixelMode == Pixel::ALPHA) + { + Pixel d = pDrawTarget->GetPixel(x, y); + float a = (float)(p.a / 255.0f) * fBlendFactor; + float c = 1.0f - a; + float r = a * (float)p.r + c * (float)d.r; + float g = a * (float)p.g + c * (float)d.g; + float b = a * (float)p.b + c * (float)d.b; + return pDrawTarget->SetPixel(x, y, Pixel((uint8_t)r, (uint8_t)g, (uint8_t)b/*, (uint8_t)(p.a * fBlendFactor)*/)); + } + + if (nPixelMode == Pixel::CUSTOM) + { + return pDrawTarget->SetPixel(x, y, funcPixelMode(x, y, p, pDrawTarget->GetPixel(x, y))); + } + + return false; + } + + + void PixelGameEngine::DrawLine(const olc::vi2d& pos1, const olc::vi2d& pos2, Pixel p, uint32_t pattern) + { DrawLine(pos1.x, pos1.y, pos2.x, pos2.y, p, pattern); } + + void PixelGameEngine::DrawLine(int32_t x1, int32_t y1, int32_t x2, int32_t y2, Pixel p, uint32_t pattern) + { + int x, y, dx, dy, dx1, dy1, px, py, xe, ye, i; + dx = x2 - x1; dy = y2 - y1; + + auto rol = [&](void) { pattern = (pattern << 1) | (pattern >> 31); return pattern & 1; }; + + olc::vi2d p1(x1, y1), p2(x2, y2); + //if (!ClipLineToScreen(p1, p2)) + // return; + x1 = p1.x; y1 = p1.y; + x2 = p2.x; y2 = p2.y; + + // straight lines idea by gurkanctn + if (dx == 0) // Line is vertical + { + if (y2 < y1) std::swap(y1, y2); + for (y = y1; y <= y2; y++) if (rol()) Draw(x1, y, p); + return; + } + + if (dy == 0) // Line is horizontal + { + if (x2 < x1) std::swap(x1, x2); + for (x = x1; x <= x2; x++) if (rol()) Draw(x, y1, p); + return; + } + + // Line is Funk-aye + dx1 = abs(dx); dy1 = abs(dy); + px = 2 * dy1 - dx1; py = 2 * dx1 - dy1; + if (dy1 <= dx1) + { + if (dx >= 0) + { + x = x1; y = y1; xe = x2; + } + else + { + x = x2; y = y2; xe = x1; + } + + if (rol()) Draw(x, y, p); + + for (i = 0; x < xe; i++) + { + x = x + 1; + if (px < 0) + px = px + 2 * dy1; + else + { + if ((dx < 0 && dy < 0) || (dx > 0 && dy > 0)) y = y + 1; else y = y - 1; + px = px + 2 * (dy1 - dx1); + } + if (rol()) Draw(x, y, p); + } + } + else + { + if (dy >= 0) + { + x = x1; y = y1; ye = y2; + } + else + { + x = x2; y = y2; ye = y1; + } + + if (rol()) Draw(x, y, p); + + for (i = 0; y < ye; i++) + { + y = y + 1; + if (py <= 0) + py = py + 2 * dx1; + else + { + if ((dx < 0 && dy < 0) || (dx > 0 && dy > 0)) x = x + 1; else x = x - 1; + py = py + 2 * (dx1 - dy1); + } + if (rol()) Draw(x, y, p); + } + } + } + + void PixelGameEngine::DrawCircle(const olc::vi2d& pos, int32_t radius, Pixel p, uint8_t mask) + { DrawCircle(pos.x, pos.y, radius, p, mask); } + + void PixelGameEngine::DrawCircle(int32_t x, int32_t y, int32_t radius, Pixel p, uint8_t mask) + { // Thanks to IanM-Matrix1 #PR121 + if (radius < 0 || x < -radius || y < -radius || x - GetDrawTargetWidth() > radius || y - GetDrawTargetHeight() > radius) + return; + + if (radius > 0) + { + int x0 = 0; + int y0 = radius; + int d = 3 - 2 * radius; + + while (y0 >= x0) // only formulate 1/8 of circle + { + // Draw even octants + if (mask & 0x01) Draw(x + x0, y - y0, p);// Q6 - upper right right + if (mask & 0x04) Draw(x + y0, y + x0, p);// Q4 - lower lower right + if (mask & 0x10) Draw(x - x0, y + y0, p);// Q2 - lower left left + if (mask & 0x40) Draw(x - y0, y - x0, p);// Q0 - upper upper left + if (x0 != 0 && x0 != y0) + { + if (mask & 0x02) Draw(x + y0, y - x0, p);// Q7 - upper upper right + if (mask & 0x08) Draw(x + x0, y + y0, p);// Q5 - lower right right + if (mask & 0x20) Draw(x - y0, y + x0, p);// Q3 - lower lower left + if (mask & 0x80) Draw(x - x0, y - y0, p);// Q1 - upper left left + } + + if (d < 0) + d += 4 * x0++ + 6; + else + d += 4 * (x0++ - y0--) + 10; + } + } + else + Draw(x, y, p); + } + + void PixelGameEngine::FillCircle(const olc::vi2d& pos, int32_t radius, Pixel p) + { FillCircle(pos.x, pos.y, radius, p); } + + void PixelGameEngine::FillCircle(int32_t x, int32_t y, int32_t radius, Pixel p) + { // Thanks to IanM-Matrix1 #PR121 + if (radius < 0 || x < -radius || y < -radius || x - GetDrawTargetWidth() > radius || y - GetDrawTargetHeight() > radius) + return; + + if (radius > 0) + { + int x0 = 0; + int y0 = radius; + int d = 3 - 2 * radius; + + auto drawline = [&](int sx, int ex, int y) + { + for (int x = sx; x <= ex; x++) + Draw(x, y, p); + }; + + while (y0 >= x0) + { + drawline(x - y0, x + y0, y - x0); + if (x0 > 0) drawline(x - y0, x + y0, y + x0); + + if (d < 0) + d += 4 * x0++ + 6; + else + { + if (x0 != y0) + { + drawline(x - x0, x + x0, y - y0); + drawline(x - x0, x + x0, y + y0); + } + d += 4 * (x0++ - y0--) + 10; + } + } + } + else + Draw(x, y, p); + } + + void PixelGameEngine::DrawRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p) + { DrawRect(pos.x, pos.y, size.x, size.y, p); } + + void PixelGameEngine::DrawRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p) + { + DrawLine(x, y, x + w, y, p); + DrawLine(x + w, y, x + w, y + h, p); + DrawLine(x + w, y + h, x, y + h, p); + DrawLine(x, y + h, x, y, p); + } + + void PixelGameEngine::Clear(Pixel p) + { + int pixels = GetDrawTargetWidth() * GetDrawTargetHeight(); + Pixel* m = GetDrawTarget()->GetData(); + for (int i = 0; i < pixels; i++) m[i] = p; + } + + void PixelGameEngine::ClearBuffer(Pixel p, bool bDepth) + { renderer->ClearBuffer(p, bDepth); } + + olc::Sprite* PixelGameEngine::GetFontSprite() + { return fontRenderable.Sprite(); } + + bool PixelGameEngine::ClipLineToScreen(olc::vi2d& in_p1, olc::vi2d& in_p2) + { + // https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm + static constexpr int SEG_I = 0b0000, SEG_L = 0b0001, SEG_R = 0b0010, SEG_B = 0b0100, SEG_T = 0b1000; + auto Segment = [&vScreenSize = vScreenSize](const olc::vi2d& v) + { + int i = SEG_I; + if (v.x < 0) i |= SEG_L; else if (v.x > vScreenSize.x) i |= SEG_R; + if (v.y < 0) i |= SEG_B; else if (v.y > vScreenSize.y) i |= SEG_T; + return i; + }; + + int s1 = Segment(in_p1), s2 = Segment(in_p2); + + while (true) + { + if (!(s1 | s2)) return true; + else if (s1 & s2) return false; + else + { + int s3 = s2 > s1 ? s2 : s1; + olc::vi2d n; + if (s3 & SEG_T) { n.x = in_p1.x + (in_p2.x - in_p1.x) * (vScreenSize.y - in_p1.y) / (in_p2.y - in_p1.y); n.y = vScreenSize.y; } + else if (s3 & SEG_B) { n.x = in_p1.x + (in_p2.x - in_p1.x) * (0 - in_p1.y) / (in_p2.y - in_p1.y); n.y = 0; } + else if (s3 & SEG_R) { n.x = vScreenSize.x; n.y = in_p1.y + (in_p2.y - in_p1.y) * (vScreenSize.x - in_p1.x) / (in_p2.x - in_p1.x); } + else if (s3 & SEG_L) { n.x = 0; n.y = in_p1.y + (in_p2.y - in_p1.y) * (0 - in_p1.x) / (in_p2.x - in_p1.x); } + if (s3 == s1) { in_p1 = n; s1 = Segment(in_p1); } + else { in_p2 = n; s2 = Segment(in_p2); } + } + } + return true; + } + + void PixelGameEngine::EnablePixelTransfer(const bool bEnable) + { + bSuspendTextureTransfer = !bEnable; + } + + + void PixelGameEngine::FillRect(const olc::vi2d& pos, const olc::vi2d& size, Pixel p) + { FillRect(pos.x, pos.y, size.x, size.y, p); } + + void PixelGameEngine::FillRect(int32_t x, int32_t y, int32_t w, int32_t h, Pixel p) + { + int32_t x2 = x + w; + int32_t y2 = y + h; + + if (x < 0) x = 0; + if (x >= (int32_t)GetDrawTargetWidth()) x = (int32_t)GetDrawTargetWidth(); + if (y < 0) y = 0; + if (y >= (int32_t)GetDrawTargetHeight()) y = (int32_t)GetDrawTargetHeight(); + + if (x2 < 0) x2 = 0; + if (x2 >= (int32_t)GetDrawTargetWidth()) x2 = (int32_t)GetDrawTargetWidth(); + if (y2 < 0) y2 = 0; + if (y2 >= (int32_t)GetDrawTargetHeight()) y2 = (int32_t)GetDrawTargetHeight(); + + for (int i = x; i < x2; i++) + for (int j = y; j < y2; j++) + Draw(i, j, p); + } + + void PixelGameEngine::DrawTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p) + { DrawTriangle(pos1.x, pos1.y, pos2.x, pos2.y, pos3.x, pos3.y, p); } + + void PixelGameEngine::DrawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p) + { + DrawLine(x1, y1, x2, y2, p); + DrawLine(x2, y2, x3, y3, p); + DrawLine(x3, y3, x1, y1, p); + } + + void PixelGameEngine::FillTriangle(const olc::vi2d& pos1, const olc::vi2d& pos2, const olc::vi2d& pos3, Pixel p) + { FillTriangle(pos1.x, pos1.y, pos2.x, pos2.y, pos3.x, pos3.y, p); } + + // https://www.avrfreaks.net/sites/default/files/triangles.c + void PixelGameEngine::FillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, int32_t y3, Pixel p) + { + auto drawline = [&](int sx, int ex, int ny) { for (int i = sx; i <= ex; i++) Draw(i, ny, p); }; + + int t1x, t2x, y, minx, maxx, t1xp, t2xp; + bool changed1 = false; + bool changed2 = false; + int signx1, signx2, dx1, dy1, dx2, dy2; + int e1, e2; + // Sort vertices + if (y1 > y2) { std::swap(y1, y2); std::swap(x1, x2); } + if (y1 > y3) { std::swap(y1, y3); std::swap(x1, x3); } + if (y2 > y3) { std::swap(y2, y3); std::swap(x2, x3); } + + t1x = t2x = x1; y = y1; // Starting points + dx1 = (int)(x2 - x1); + if (dx1 < 0) { dx1 = -dx1; signx1 = -1; } + else signx1 = 1; + dy1 = (int)(y2 - y1); + + dx2 = (int)(x3 - x1); + if (dx2 < 0) { dx2 = -dx2; signx2 = -1; } + else signx2 = 1; + dy2 = (int)(y3 - y1); + + if (dy1 > dx1) { std::swap(dx1, dy1); changed1 = true; } + if (dy2 > dx2) { std::swap(dy2, dx2); changed2 = true; } + + e2 = (int)(dx2 >> 1); + // Flat top, just process the second half + if (y1 == y2) goto next; + e1 = (int)(dx1 >> 1); + + for (int i = 0; i < dx1;) { + t1xp = 0; t2xp = 0; + if (t1x < t2x) { minx = t1x; maxx = t2x; } + else { minx = t2x; maxx = t1x; } + // process first line until y value is about to change + while (i < dx1) { + i++; + e1 += dy1; + while (e1 >= dx1) { + e1 -= dx1; + if (changed1) t1xp = signx1;//t1x += signx1; + else goto next1; + } + if (changed1) break; + else t1x += signx1; + } + // Move line + next1: + // process second line until y value is about to change + while (1) { + e2 += dy2; + while (e2 >= dx2) { + e2 -= dx2; + if (changed2) t2xp = signx2;//t2x += signx2; + else goto next2; + } + if (changed2) break; + else t2x += signx2; + } + next2: + if (minx > t1x) minx = t1x; + if (minx > t2x) minx = t2x; + if (maxx < t1x) maxx = t1x; + if (maxx < t2x) maxx = t2x; + drawline(minx, maxx, y); // Draw line from min to max points found on the y + // Now increase y + if (!changed1) t1x += signx1; + t1x += t1xp; + if (!changed2) t2x += signx2; + t2x += t2xp; + y += 1; + if (y == y2) break; + } + next: + // Second half + dx1 = (int)(x3 - x2); if (dx1 < 0) { dx1 = -dx1; signx1 = -1; } + else signx1 = 1; + dy1 = (int)(y3 - y2); + t1x = x2; + + if (dy1 > dx1) { // swap values + std::swap(dy1, dx1); + changed1 = true; + } + else changed1 = false; + + e1 = (int)(dx1 >> 1); + + for (int i = 0; i <= dx1; i++) { + t1xp = 0; t2xp = 0; + if (t1x < t2x) { minx = t1x; maxx = t2x; } + else { minx = t2x; maxx = t1x; } + // process first line until y value is about to change + while (i < dx1) { + e1 += dy1; + while (e1 >= dx1) { + e1 -= dx1; + if (changed1) { t1xp = signx1; break; }//t1x += signx1; + else goto next3; + } + if (changed1) break; + else t1x += signx1; + if (i < dx1) i++; + } + next3: + // process second line until y value is about to change + while (t2x != x3) { + e2 += dy2; + while (e2 >= dx2) { + e2 -= dx2; + if (changed2) t2xp = signx2; + else goto next4; + } + if (changed2) break; + else t2x += signx2; + } + next4: + + if (minx > t1x) minx = t1x; + if (minx > t2x) minx = t2x; + if (maxx < t1x) maxx = t1x; + if (maxx < t2x) maxx = t2x; + drawline(minx, maxx, y); + if (!changed1) t1x += signx1; + t1x += t1xp; + if (!changed2) t2x += signx2; + t2x += t2xp; + y += 1; + if (y > y3) return; + } + } + + void PixelGameEngine::FillTexturedTriangle(const std::vector& vPoints, std::vector vTex, std::vector vColour, olc::Sprite* sprTex) + { + olc::vi2d p1 = vPoints[0]; + olc::vi2d p2 = vPoints[1]; + olc::vi2d p3 = vPoints[2]; + + if (p2.y < p1.y){std::swap(p1.y, p2.y); std::swap(p1.x, p2.x); std::swap(vTex[0].x, vTex[1].x); std::swap(vTex[0].y, vTex[1].y); std::swap(vColour[0], vColour[1]);} + if (p3.y < p1.y){std::swap(p1.y, p3.y); std::swap(p1.x, p3.x); std::swap(vTex[0].x, vTex[2].x); std::swap(vTex[0].y, vTex[2].y); std::swap(vColour[0], vColour[2]);} + if (p3.y < p2.y){std::swap(p2.y, p3.y); std::swap(p2.x, p3.x); std::swap(vTex[1].x, vTex[2].x); std::swap(vTex[1].y, vTex[2].y); std::swap(vColour[1], vColour[2]);} + + olc::vi2d dPos1 = p2 - p1; + olc::vf2d dTex1 = vTex[1] - vTex[0]; + int dcr1 = vColour[1].r - vColour[0].r; + int dcg1 = vColour[1].g - vColour[0].g; + int dcb1 = vColour[1].b - vColour[0].b; + int dca1 = vColour[1].a - vColour[0].a; + + olc::vi2d dPos2 = p3 - p1; + olc::vf2d dTex2 = vTex[2] - vTex[0]; + int dcr2 = vColour[2].r - vColour[0].r; + int dcg2 = vColour[2].g - vColour[0].g; + int dcb2 = vColour[2].b - vColour[0].b; + int dca2 = vColour[2].a - vColour[0].a; + + float dax_step = 0, dbx_step = 0, dcr1_step = 0, dcr2_step = 0, dcg1_step = 0, dcg2_step = 0, dcb1_step = 0, dcb2_step = 0, dca1_step = 0, dca2_step = 0; + olc::vf2d vTex1Step, vTex2Step; + + if (dPos1.y) + { + dax_step = dPos1.x / (float)abs(dPos1.y); + vTex1Step = dTex1 / (float)abs(dPos1.y); + dcr1_step = dcr1 / (float)abs(dPos1.y); + dcg1_step = dcg1 / (float)abs(dPos1.y); + dcb1_step = dcb1 / (float)abs(dPos1.y); + dca1_step = dca1 / (float)abs(dPos1.y); + } + + if (dPos2.y) + { + dbx_step = dPos2.x / (float)abs(dPos2.y); + vTex2Step = dTex2 / (float)abs(dPos2.y); + dcr2_step = dcr2 / (float)abs(dPos2.y); + dcg2_step = dcg2 / (float)abs(dPos2.y); + dcb2_step = dcb2 / (float)abs(dPos2.y); + dca2_step = dca2 / (float)abs(dPos2.y); + } + + olc::vi2d vStart; + olc::vi2d vEnd; + int vStartIdx; + + for (int pass = 0; pass < 2; pass++) + { + if (pass == 0) + { + vStart = p1; vEnd = p2; vStartIdx = 0; + } + else + { + dPos1 = p3 - p2; + dTex1 = vTex[2] - vTex[1]; + dcr1 = vColour[2].r - vColour[1].r; + dcg1 = vColour[2].g - vColour[1].g; + dcb1 = vColour[2].b - vColour[1].b; + dca1 = vColour[2].a - vColour[1].a; + dcr1_step = 0; dcg1_step = 0; dcb1_step = 0; dca1_step = 0; + + if (dPos2.y) dbx_step = dPos2.x / (float)abs(dPos2.y); + if (dPos1.y) + { + dax_step = dPos1.x / (float)abs(dPos1.y); + vTex1Step = dTex1 / (float)abs(dPos1.y); + dcr1_step = dcr1 / (float)abs(dPos1.y); + dcg1_step = dcg1 / (float)abs(dPos1.y); + dcb1_step = dcb1 / (float)abs(dPos1.y); + dca1_step = dca1 / (float)abs(dPos1.y); + } + + vStart = p2; vEnd = p3; vStartIdx = 1; + } + + if (dPos1.y) + { + for (int i = vStart.y; i <= vEnd.y; i++) + { + int ax = int(vStart.x + (float)(i - vStart.y) * dax_step); + int bx = int(p1.x + (float)(i - p1.y) * dbx_step); + + olc::vf2d tex_s(vTex[vStartIdx].x + (float)(i - vStart.y) * vTex1Step.x, vTex[vStartIdx].y + (float)(i - vStart.y) * vTex1Step.y); + olc::vf2d tex_e(vTex[0].x + (float)(i - p1.y) * vTex2Step.x, vTex[0].y + (float)(i - p1.y) * vTex2Step.y); + + olc::Pixel col_s(vColour[vStartIdx].r + uint8_t((float)(i - vStart.y) * dcr1_step), vColour[vStartIdx].g + uint8_t((float)(i - vStart.y) * dcg1_step), + vColour[vStartIdx].b + uint8_t((float)(i - vStart.y) * dcb1_step), vColour[vStartIdx].a + uint8_t((float)(i - vStart.y) * dca1_step)); + + olc::Pixel col_e(vColour[0].r + uint8_t((float)(i - p1.y) * dcr2_step), vColour[0].g + uint8_t((float)(i - p1.y) * dcg2_step), + vColour[0].b + uint8_t((float)(i - p1.y) * dcb2_step), vColour[0].a + uint8_t((float)(i - p1.y) * dca2_step)); + + if (ax > bx) { std::swap(ax, bx); std::swap(tex_s, tex_e); std::swap(col_s, col_e); } + + float tstep = 1.0f / ((float)(bx - ax)); + float t = 0.0f; + + for (int j = ax; j < bx; j++) + { + olc::Pixel pixel = PixelLerp(col_s, col_e, t); + if (sprTex != nullptr) pixel *= sprTex->Sample(tex_s.lerp(tex_e, t)); + Draw(j, i, pixel); + t += tstep; + } + } + } + } + } + + void PixelGameEngine::FillTexturedPolygon(const std::vector& vPoints, const std::vector& vTex, const std::vector& vColour, olc::Sprite* sprTex, olc::DecalStructure structure) + { + if (structure == olc::DecalStructure::LINE) + { + return; // Meaningless, so do nothing + } + + if (vPoints.size() < 3 || vTex.size() < 3 || vColour.size() < 3) + return; + + if (structure == olc::DecalStructure::LIST) + { + for (int tri = 0; tri < vPoints.size() / 3; tri++) + { + std::vector vP = { vPoints[tri * 3 + 0], vPoints[tri * 3 + 1], vPoints[tri * 3 + 2] }; + std::vector vT = { vTex[tri * 3 + 0], vTex[tri * 3 + 1], vTex[tri * 3 + 2] }; + std::vector vC = { vColour[tri * 3 + 0], vColour[tri * 3 + 1], vColour[tri * 3 + 2] }; + FillTexturedTriangle(vP, vT, vC, sprTex); + } + return; + } + + if (structure == olc::DecalStructure::STRIP) + { + for (int tri = 2; tri < vPoints.size(); tri++) + { + std::vector vP = { vPoints[tri - 2], vPoints[tri-1], vPoints[tri] }; + std::vector vT = { vTex[tri - 2], vTex[tri - 1], vTex[tri] }; + std::vector vC = { vColour[tri - 2], vColour[tri - 1], vColour[tri] }; + FillTexturedTriangle(vP, vT, vC, sprTex); + } + return; + } + + if (structure == olc::DecalStructure::FAN) + { + for (int tri = 2; tri < vPoints.size(); tri++) + { + std::vector vP = { vPoints[0], vPoints[tri - 1], vPoints[tri] }; + std::vector vT = { vTex[0], vTex[tri - 1], vTex[tri] }; + std::vector vC = { vColour[0], vColour[tri - 1], vColour[tri] }; + FillTexturedTriangle(vP, vT, vC, sprTex); + } + return; + } + } + + + void PixelGameEngine::DrawSprite(const olc::vi2d& pos, Sprite* sprite, uint32_t scale, uint8_t flip) + { DrawSprite(pos.x, pos.y, sprite, scale, flip); } + + void PixelGameEngine::DrawSprite(int32_t x, int32_t y, Sprite* sprite, uint32_t scale, uint8_t flip) + { + if (sprite == nullptr) + return; + + int32_t fxs = 0, fxm = 1, fx = 0; + int32_t fys = 0, fym = 1, fy = 0; + if (flip & olc::Sprite::Flip::HORIZ) { fxs = sprite->width - 1; fxm = -1; } + if (flip & olc::Sprite::Flip::VERT) { fys = sprite->height - 1; fym = -1; } + + if (scale > 1) + { + fx = fxs; + for (int32_t i = 0; i < sprite->width; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < sprite->height; j++, fy += fym) + for (uint32_t is = 0; is < scale; is++) + for (uint32_t js = 0; js < scale; js++) + Draw(x + (i * scale) + is, y + (j * scale) + js, sprite->GetPixel(fx, fy)); + } + } + else + { + fx = fxs; + for (int32_t i = 0; i < sprite->width; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < sprite->height; j++, fy += fym) + Draw(x + i, y + j, sprite->GetPixel(fx, fy)); + } + } + } + + void PixelGameEngine::DrawPartialSprite(const olc::vi2d& pos, Sprite* sprite, const olc::vi2d& sourcepos, const olc::vi2d& size, uint32_t scale, uint8_t flip) + { DrawPartialSprite(pos.x, pos.y, sprite, sourcepos.x, sourcepos.y, size.x, size.y, scale, flip); } + + void PixelGameEngine::DrawPartialSprite(int32_t x, int32_t y, Sprite* sprite, int32_t ox, int32_t oy, int32_t w, int32_t h, uint32_t scale, uint8_t flip) + { + if (sprite == nullptr) + return; + + int32_t fxs = 0, fxm = 1, fx = 0; + int32_t fys = 0, fym = 1, fy = 0; + if (flip & olc::Sprite::Flip::HORIZ) { fxs = w - 1; fxm = -1; } + if (flip & olc::Sprite::Flip::VERT) { fys = h - 1; fym = -1; } + + if (scale > 1) + { + fx = fxs; + for (int32_t i = 0; i < w; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < h; j++, fy += fym) + for (uint32_t is = 0; is < scale; is++) + for (uint32_t js = 0; js < scale; js++) + Draw(x + (i * scale) + is, y + (j * scale) + js, sprite->GetPixel(fx + ox, fy + oy)); + } + } + else + { + fx = fxs; + for (int32_t i = 0; i < w; i++, fx += fxm) + { + fy = fys; + for (int32_t j = 0; j < h; j++, fy += fym) + Draw(x + i, y + j, sprite->GetPixel(fx + ox, fy + oy)); + } + } + } + + void PixelGameEngine::SetDecalMode(const olc::DecalMode& mode) + { nDecalMode = mode; } + + void PixelGameEngine::SetDecalStructure(const olc::DecalStructure& structure) + { nDecalStructure = structure; } + + void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale, const olc::Pixel& tint) + { + olc::vf2d vScreenSpacePos = + { + (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, + -((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) + }; + + + olc::vf2d vScreenSpaceDim = + { + ((pos.x + source_size.x * scale.x) * vInvScreenSize.x) * 2.0f - 1.0f, + -(((pos.y + source_size.y * scale.y) * vInvScreenSize.y) * 2.0f - 1.0f) + }; + + olc::vf2d vWindow = olc::vf2d(vViewSize); + olc::vf2d vQuantisedPos = ((vScreenSpacePos * vWindow) + olc::vf2d(0.5f, 0.5f)).floor() / vWindow; + olc::vf2d vQuantisedDim = ((vScreenSpaceDim * vWindow) + olc::vf2d(0.5f, -0.5f)).ceil() / vWindow; + + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.pos = { { vQuantisedPos.x, vQuantisedPos.y }, { vQuantisedPos.x, vQuantisedDim.y }, { vQuantisedDim.x, vQuantisedDim.y }, { vQuantisedDim.x, vQuantisedPos.y } }; + olc::vf2d uvtl = (source_pos + olc::vf2d(0.0001f, 0.0001f)) * decal->vUVScale; + olc::vf2d uvbr = (source_pos + source_size - olc::vf2d(0.0001f, 0.0001f)) * decal->vUVScale; + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + di.w = { 1,1,1,1 }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPartialDecal(const olc::vf2d& pos, const olc::vf2d& size, olc::Decal* decal, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + olc::vf2d vScreenSpacePos = + { + (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, + ((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f + }; + + olc::vf2d vScreenSpaceDim = + { + vScreenSpacePos.x + (2.0f * size.x * vInvScreenSize.x), + vScreenSpacePos.y - (2.0f * size.y * vInvScreenSize.y) + }; + + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.pos = { { vScreenSpacePos.x, vScreenSpacePos.y }, { vScreenSpacePos.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpacePos.y } }; + olc::vf2d uvtl = (source_pos) * decal->vUVScale; + olc::vf2d uvbr = uvtl + ((source_size) * decal->vUVScale); + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + di.w = { 1,1,1,1 }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + + void PixelGameEngine::DrawDecal(const olc::vf2d& pos, olc::Decal* decal, const olc::vf2d& scale, const olc::Pixel& tint) + { + olc::vf2d vScreenSpacePos = + { + (pos.x * vInvScreenSize.x) * 2.0f - 1.0f, + ((pos.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f + }; + + olc::vf2d vScreenSpaceDim = + { + vScreenSpacePos.x + (2.0f * (float(decal->sprite->width) * vInvScreenSize.x)) * scale.x, + vScreenSpacePos.y - (2.0f * (float(decal->sprite->height) * vInvScreenSize.y)) * scale.y + }; + + DecalInstance di; + di.decal = decal; + di.points = 4; + di.tint = { tint, tint, tint, tint }; + di.pos = { { vScreenSpacePos.x, vScreenSpacePos.y }, { vScreenSpacePos.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpaceDim.y }, { vScreenSpaceDim.x, vScreenSpacePos.y } }; + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + di.w = { 1, 1, 1, 1 }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawExplicitDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d* uv, const olc::Pixel* col, uint32_t elements) + { + DecalInstance di; + di.decal = decal; + di.pos.resize(elements); + di.uv.resize(elements); + di.w.resize(elements); + di.tint.resize(elements); + di.points = elements; + for (uint32_t i = 0; i < elements; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = col[i]; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const olc::Pixel tint) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = tint; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector &tint) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = tint[i]; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& uv, const std::vector& colours, const olc::Pixel tint) + { + std::vector newColours(colours.size(), olc::WHITE); + std::transform(colours.begin(), colours.end(), newColours.begin(), + [&tint](const olc::Pixel pin) { return pin * tint; }); + DrawPolygonDecal(decal, pos, uv, newColours); + } + + + void PixelGameEngine::DrawPolygonDecal(olc::Decal* decal, const std::vector& pos, const std::vector& depth, const std::vector& uv, const olc::Pixel tint) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[i] = uv[i]; + di.tint[i] = tint; + di.w[i] = 1.0f; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + +#ifdef OLC_ENABLE_EXPERIMENTAL + // Lightweight 3D + void PixelGameEngine::LW3D_DrawTriangles(olc::Decal* decal, const std::vector>& pos, const std::vector& tex, const std::vector& col) + { + DecalInstance di; + di.decal = decal; + di.points = uint32_t(pos.size()); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + for (uint32_t i = 0; i < di.points; i++) + { + di.pos[i] = { pos[i][0], pos[i][1] }; + di.w[i] = pos[i][2]; + di.uv[i] = tex[i]; + di.tint[i] = col[i]; + } + di.mode = DecalMode::MODEL3D; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } +#endif + + void PixelGameEngine::DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p) + { + auto m = nDecalMode; + nDecalMode = olc::DecalMode::WIREFRAME; + DrawPolygonDecal(nullptr, { pos1, pos2 }, { {0, 0}, {0,0} }, p); + nDecalMode = m; + + /*DecalInstance di; + di.decal = nullptr; + di.points = uint32_t(2); + di.pos.resize(di.points); + di.uv.resize(di.points); + di.w.resize(di.points); + di.tint.resize(di.points); + di.pos[0] = { (pos1.x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos1.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[0] = { 0.0f, 0.0f }; + di.tint[0] = p; + di.w[0] = 1.0f; + di.pos[1] = { (pos2.x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos2.y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + di.uv[1] = { 0.0f, 0.0f }; + di.tint[1] = p; + di.w[1] = 1.0f; + di.mode = olc::DecalMode::WIREFRAME; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di);*/ + } + + void PixelGameEngine::DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col) + { + auto m = nDecalMode; + SetDecalMode(olc::DecalMode::WIREFRAME); + olc::vf2d vNewSize = size;// (size - olc::vf2d(0.375f, 0.375f)).ceil(); + std::array points = { { {pos}, {pos.x, pos.y + vNewSize.y}, {pos + vNewSize}, {pos.x + vNewSize.x, pos.y} } }; + std::array uvs = { {{0,0},{0,0},{0,0},{0,0}} }; + std::array cols = { {col, col, col, col} }; + DrawExplicitDecal(nullptr, points.data(), uvs.data(), cols.data(), 4); + SetDecalMode(m); + + } + + void PixelGameEngine::FillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col) + { + olc::vf2d vNewSize = size;// (size - olc::vf2d(0.375f, 0.375f)).ceil(); + std::array points = { { {pos}, {pos.x, pos.y + vNewSize.y}, {pos + vNewSize}, {pos.x + vNewSize.x, pos.y} } }; + std::array uvs = { {{0,0},{0,0},{0,0},{0,0}} }; + std::array cols = { {col, col, col, col} }; + DrawExplicitDecal(nullptr, points.data(), uvs.data(), cols.data(), 4); + } + + void PixelGameEngine::GradientFillRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel colTL, const olc::Pixel colBL, const olc::Pixel colBR, const olc::Pixel colTR) + { + std::array points = { { {pos}, {pos.x, pos.y + size.y}, {pos + size}, {pos.x + size.x, pos.y} } }; + std::array uvs = { {{0,0},{0,0},{0,0},{0,0}} }; + std::array cols = { {colTL, colBL, colBR, colTR} }; + DrawExplicitDecal(nullptr, points.data(), uvs.data(), cols.data(), 4); + } + + void PixelGameEngine::DrawRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& scale, const olc::Pixel& tint) + { + DecalInstance di; + di.decal = decal; + di.pos.resize(4); + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + di.w = { 1, 1, 1, 1 }; + di.tint = { tint, tint, tint, tint }; + di.points = 4; + di.pos[0] = (olc::vf2d(0.0f, 0.0f) - center) * scale; + di.pos[1] = (olc::vf2d(0.0f, float(decal->sprite->height)) - center) * scale; + di.pos[2] = (olc::vf2d(float(decal->sprite->width), float(decal->sprite->height)) - center) * scale; + di.pos[3] = (olc::vf2d(float(decal->sprite->width), 0.0f) - center) * scale; + float c = cos(fAngle), s = sin(fAngle); + for (int i = 0; i < 4; i++) + { + di.pos[i] = pos + olc::vf2d(di.pos[i].x * c - di.pos[i].y * s, di.pos[i].x * s + di.pos[i].y * c); + di.pos[i] = di.pos[i] * vInvScreenSize * 2.0f - olc::vf2d(1.0f, 1.0f); + di.pos[i].y *= -1.0f; + di.w[i] = 1; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + + void PixelGameEngine::DrawPartialRotatedDecal(const olc::vf2d& pos, olc::Decal* decal, const float fAngle, const olc::vf2d& center, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::vf2d& scale, const olc::Pixel& tint) + { + DecalInstance di; + di.decal = decal; + di.points = 4; + di.tint = { tint, tint, tint, tint }; + di.w = { 1, 1, 1, 1 }; + di.pos.resize(4); + di.pos[0] = (olc::vf2d(0.0f, 0.0f) - center) * scale; + di.pos[1] = (olc::vf2d(0.0f, source_size.y) - center) * scale; + di.pos[2] = (olc::vf2d(source_size.x, source_size.y) - center) * scale; + di.pos[3] = (olc::vf2d(source_size.x, 0.0f) - center) * scale; + float c = cos(fAngle), s = sin(fAngle); + for (int i = 0; i < 4; i++) + { + di.pos[i] = pos + olc::vf2d(di.pos[i].x * c - di.pos[i].y * s, di.pos[i].x * s + di.pos[i].y * c); + di.pos[i] = di.pos[i] * vInvScreenSize * 2.0f - olc::vf2d(1.0f, 1.0f); + di.pos[i].y *= -1.0f; + } + + olc::vf2d uvtl = source_pos * decal->vUVScale; + olc::vf2d uvbr = uvtl + (source_size * decal->vUVScale); + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + + void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.w = { 1, 1, 1, 1 }; + di.pos.resize(4); + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + olc::vf2d center; + float rd = ((pos[2].x - pos[0].x) * (pos[3].y - pos[1].y) - (pos[3].x - pos[1].x) * (pos[2].y - pos[0].y)); + if (rd != 0) + { + olc::vf2d uvtl = source_pos * decal->vUVScale; + olc::vf2d uvbr = uvtl + (source_size * decal->vUVScale); + di.uv = { { uvtl.x, uvtl.y }, { uvtl.x, uvbr.y }, { uvbr.x, uvbr.y }, { uvbr.x, uvtl.y } }; + + rd = 1.0f / rd; + float rn = ((pos[3].x - pos[1].x) * (pos[0].y - pos[1].y) - (pos[3].y - pos[1].y) * (pos[0].x - pos[1].x)) * rd; + float sn = ((pos[2].x - pos[0].x) * (pos[0].y - pos[1].y) - (pos[2].y - pos[0].y) * (pos[0].x - pos[1].x)) * rd; + if (!(rn < 0.f || rn > 1.f || sn < 0.f || sn > 1.f)) center = pos[0] + rn * (pos[2] - pos[0]); + float d[4]; for (int i = 0; i < 4; i++) d[i] = (pos[i] - center).mag(); + for (int i = 0; i < 4; i++) + { + float q = d[i] == 0.0f ? 1.0f : (d[i] + d[(i + 2) & 3]) / d[(i + 2) & 3]; + di.uv[i] *= q; di.w[i] *= q; + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + } + + void PixelGameEngine::DrawWarpedDecal(olc::Decal* decal, const olc::vf2d* pos, const olc::Pixel& tint) + { + // Thanks Nathan Reed, a brilliant article explaining whats going on here + // http://www.reedbeta.com/blog/quadrilateral-interpolation-part-1/ + DecalInstance di; + di.points = 4; + di.decal = decal; + di.tint = { tint, tint, tint, tint }; + di.w = { 1, 1, 1, 1 }; + di.pos.resize(4); + di.uv = { { 0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f} }; + olc::vf2d center; + float rd = ((pos[2].x - pos[0].x) * (pos[3].y - pos[1].y) - (pos[3].x - pos[1].x) * (pos[2].y - pos[0].y)); + if (rd != 0) + { + rd = 1.0f / rd; + float rn = ((pos[3].x - pos[1].x) * (pos[0].y - pos[1].y) - (pos[3].y - pos[1].y) * (pos[0].x - pos[1].x)) * rd; + float sn = ((pos[2].x - pos[0].x) * (pos[0].y - pos[1].y) - (pos[2].y - pos[0].y) * (pos[0].x - pos[1].x)) * rd; + if (!(rn < 0.f || rn > 1.f || sn < 0.f || sn > 1.f)) center = pos[0] + rn * (pos[2] - pos[0]); + float d[4]; for (int i = 0; i < 4; i++) d[i] = (pos[i] - center).mag(); + for (int i = 0; i < 4; i++) + { + float q = d[i] == 0.0f ? 1.0f : (d[i] + d[(i + 2) & 3]) / d[(i + 2) & 3]; + di.uv[i] *= q; di.w[i] *= q; + di.pos[i] = { (pos[i].x * vInvScreenSize.x) * 2.0f - 1.0f, ((pos[i].y * vInvScreenSize.y) * 2.0f - 1.0f) * -1.0f }; + } + di.mode = nDecalMode; + di.structure = nDecalStructure; + vLayers[nTargetLayer].vecDecalInstance.push_back(di); + } + } + + void PixelGameEngine::DrawWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::Pixel& tint) + { DrawWarpedDecal(decal, pos.data(), tint); } + + void PixelGameEngine::DrawWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::Pixel& tint) + { DrawWarpedDecal(decal, &pos[0], tint); } + + void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const std::array& pos, const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { DrawPartialWarpedDecal(decal, pos.data(), source_pos, source_size, tint); } + + void PixelGameEngine::DrawPartialWarpedDecal(olc::Decal* decal, const olc::vf2d(&pos)[4], const olc::vf2d& source_pos, const olc::vf2d& source_size, const olc::Pixel& tint) + { DrawPartialWarpedDecal(decal, &pos[0], source_pos, source_size, tint); } + + void PixelGameEngine::DrawStringDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = { 0.0f, 0.0f }; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = 0; spos.y += 8.0f * scale.y; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialDecal(pos + spos, fontRenderable.Decal(), {float(ox) * 8.0f, float(oy) * 8.0f}, {8.0f, 8.0f}, scale, col); + spos.x += 8.0f * scale.x; + } + } + } + + void PixelGameEngine::DrawStringPropDecal(const olc::vf2d& pos, const std::string& sText, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = { 0.0f, 0.0f }; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = 0; spos.y += 8.0f * scale.y; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialDecal(pos + spos, fontRenderable.Decal(), { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col); + spos.x += float(vFontSpacing[c - 32].y) * scale.x; + } + } + } + // Thanks Oso-Grande/Sopadeoso For these awesom and stupidly clever Text Rotation routines... duh XD + void PixelGameEngine::DrawRotatedStringDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = center; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = center.x; spos.y -= 8.0f; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialRotatedDecal(pos, fontRenderable.Decal(), fAngle, spos, { float(ox) * 8.0f, float(oy) * 8.0f }, { 8.0f, 8.0f }, scale, col); + spos.x -= 8.0f; + } + } + } + + void PixelGameEngine::DrawRotatedStringPropDecal(const olc::vf2d& pos, const std::string& sText, const float fAngle, const olc::vf2d& center, const Pixel col, const olc::vf2d& scale) + { + olc::vf2d spos = center; + for (auto c : sText) + { + if (c == '\n') + { + spos.x = center.x; spos.y -= 8.0f; + } + else if (c == '\t') + { + spos.x += 8.0f * float(nTabSizeInSpaces) * scale.x; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + DrawPartialRotatedDecal(pos, fontRenderable.Decal(), fAngle, spos, { float(ox) * 8.0f + float(vFontSpacing[c - 32].x), float(oy) * 8.0f }, { float(vFontSpacing[c - 32].y), 8.0f }, scale, col); + spos.x -= float(vFontSpacing[c - 32].y); + } + } + } + + olc::vi2d PixelGameEngine::GetTextSize(const std::string& s) + { + olc::vi2d size = { 0,1 }; + olc::vi2d pos = { 0,1 }; + for (auto c : s) + { + if (c == '\n') { pos.y++; pos.x = 0; } + else if (c == '\t') { pos.x += nTabSizeInSpaces; } + else pos.x++; + size.x = std::max(size.x, pos.x); + size.y = std::max(size.y, pos.y); + } + return size * 8; + } + + void PixelGameEngine::DrawString(const olc::vi2d& pos, const std::string& sText, Pixel col, uint32_t scale) + { DrawString(pos.x, pos.y, sText, col, scale); } + + void PixelGameEngine::DrawString(int32_t x, int32_t y, const std::string& sText, Pixel col, uint32_t scale) + { + int32_t sx = 0; + int32_t sy = 0; + Pixel::Mode m = nPixelMode; + // Thanks @tucna, spotted bug with col.ALPHA :P + if (m != Pixel::CUSTOM) // Thanks @Megarev, required for "shaders" + { + if (col.a != 255) SetPixelMode(Pixel::ALPHA); + else SetPixelMode(Pixel::MASK); + } + for (auto c : sText) + { + if (c == '\n') + { + sx = 0; sy += 8 * scale; + } + else if (c == '\t') + { + sx += 8 * nTabSizeInSpaces * scale; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + + if (scale > 1) + { + for (uint32_t i = 0; i < 8; i++) + for (uint32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8, j + oy * 8).r > 0) + for (uint32_t is = 0; is < scale; is++) + for (uint32_t js = 0; js < scale; js++) + Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, col); + } + else + { + for (uint32_t i = 0; i < 8; i++) + for (uint32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8, j + oy * 8).r > 0) + Draw(x + sx + i, y + sy + j, col); + } + sx += 8 * scale; + } + } + SetPixelMode(m); + } + + olc::vi2d PixelGameEngine::GetTextSizeProp(const std::string& s) + { + olc::vi2d size = { 0,1 }; + olc::vi2d pos = { 0,1 }; + for (auto c : s) + { + if (c == '\n') { pos.y += 1; pos.x = 0; } + else if (c == '\t') { pos.x += nTabSizeInSpaces * 8; } + else pos.x += vFontSpacing[c - 32].y; + size.x = std::max(size.x, pos.x); + size.y = std::max(size.y, pos.y); + } + + size.y *= 8; + return size; + } + + void PixelGameEngine::DrawStringProp(const olc::vi2d& pos, const std::string& sText, Pixel col, uint32_t scale) + { DrawStringProp(pos.x, pos.y, sText, col, scale); } + + void PixelGameEngine::DrawStringProp(int32_t x, int32_t y, const std::string& sText, Pixel col, uint32_t scale) + { + int32_t sx = 0; + int32_t sy = 0; + Pixel::Mode m = nPixelMode; + + if (m != Pixel::CUSTOM) + { + if (col.a != 255) SetPixelMode(Pixel::ALPHA); + else SetPixelMode(Pixel::MASK); + } + for (auto c : sText) + { + if (c == '\n') + { + sx = 0; sy += 8 * scale; + } + else if (c == '\t') + { + sx += 8 * nTabSizeInSpaces * scale; + } + else + { + int32_t ox = (c - 32) % 16; + int32_t oy = (c - 32) / 16; + + if (scale > 1) + { + for (int32_t i = 0; i < vFontSpacing[c - 32].y; i++) + for (int32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8 + vFontSpacing[c - 32].x, j + oy * 8).r > 0) + for (int32_t is = 0; is < int(scale); is++) + for (int32_t js = 0; js < int(scale); js++) + Draw(x + sx + (i * scale) + is, y + sy + (j * scale) + js, col); + } + else + { + for (int32_t i = 0; i < vFontSpacing[c - 32].y; i++) + for (int32_t j = 0; j < 8; j++) + if (fontRenderable.Sprite()->GetPixel(i + ox * 8 + vFontSpacing[c - 32].x, j + oy * 8).r > 0) + Draw(x + sx + i, y + sy + j, col); + } + sx += vFontSpacing[c - 32].y * scale; + } + } + SetPixelMode(m); + } + + void PixelGameEngine::SetPixelMode(Pixel::Mode m) + { nPixelMode = m; } + + Pixel::Mode PixelGameEngine::GetPixelMode() + { return nPixelMode; } + + void PixelGameEngine::SetPixelMode(std::function pixelMode) + { + funcPixelMode = pixelMode; + nPixelMode = Pixel::Mode::CUSTOM; + } + + void PixelGameEngine::SetPixelBlend(float fBlend) + { + fBlendFactor = fBlend; + if (fBlendFactor < 0.0f) fBlendFactor = 0.0f; + if (fBlendFactor > 1.0f) fBlendFactor = 1.0f; + } + + std::stringstream& PixelGameEngine::ConsoleOut() + { return ssConsoleOutput; } + + bool PixelGameEngine::IsConsoleShowing() const + { return bConsoleShow; } + + void PixelGameEngine::ConsoleShow(const olc::Key& keyExit, bool bSuspendTime) + { + if (bConsoleShow) + return; + + bConsoleShow = true; + bConsoleSuspendTime = bSuspendTime; + TextEntryEnable(true); + keyConsoleExit = keyExit; + pKeyboardState[keyConsoleExit].bHeld = false; + pKeyboardState[keyConsoleExit].bPressed = false; + pKeyboardState[keyConsoleExit].bReleased = true; + } + + void PixelGameEngine::ConsoleClear() + { sConsoleLines.clear(); } + + void PixelGameEngine::ConsoleCaptureStdOut(const bool bCapture) + { + if(bCapture) + sbufOldCout = std::cout.rdbuf(ssConsoleOutput.rdbuf()); + else + std::cout.rdbuf(sbufOldCout); + } + + void PixelGameEngine::UpdateConsole() + { + if (GetKey(keyConsoleExit).bPressed) + { + TextEntryEnable(false); + bConsoleSuspendTime = false; + bConsoleShow = false; + return; + } + + // Keep Console sizes based in real screen dimensions + vConsoleCharacterScale = olc::vf2d(1.0f, 2.0f) / (olc::vf2d(vViewSize) * vInvScreenSize); + vConsoleSize = (vViewSize / olc::vi2d(8, 16)) - olc::vi2d(2, 4); + + // If console has changed size, simply reset it + if (vConsoleSize.y != sConsoleLines.size()) + { + vConsoleCursor = { 0,0 }; + sConsoleLines.clear(); + sConsoleLines.resize(vConsoleSize.y); + } + + auto TypeCharacter = [&](const char c) + { + if (c >= 32 && c < 127) + { + sConsoleLines[vConsoleCursor.y].append(1, c); + vConsoleCursor.x++; + } + + if( c == '\n' || vConsoleCursor.x >= vConsoleSize.x) + { + vConsoleCursor.y++; vConsoleCursor.x = 0; + } + + if (vConsoleCursor.y >= vConsoleSize.y) + { + vConsoleCursor.y = vConsoleSize.y - 1; + for (size_t i = 1; i < vConsoleSize.y; i++) + sConsoleLines[i - 1] = sConsoleLines[i]; + sConsoleLines[vConsoleCursor.y].clear(); + } + }; + + // Empty out "std::cout", parsing as we go + while (ssConsoleOutput.rdbuf()->sgetc() != -1) + { + char c = ssConsoleOutput.rdbuf()->sbumpc(); + TypeCharacter(c); + } + + // Draw Shadow + GradientFillRectDecal({ 0,0 }, olc::vf2d(vScreenSize), olc::PixelF(0, 0, 0.5f, 0.5f), olc::PixelF(0, 0, 0.25f, 0.5f), olc::PixelF(0, 0, 0.25f, 0.5f), olc::PixelF(0, 0, 0.25f, 0.5f)); + + // Draw the console buffer + SetDecalMode(olc::DecalMode::NORMAL); + for (int32_t nLine = 0; nLine < vConsoleSize.y; nLine++) + DrawStringDecal(olc::vf2d( 1, 1 + float(nLine) ) * vConsoleCharacterScale * 8.0f, sConsoleLines[nLine], olc::WHITE, vConsoleCharacterScale); + + // Draw Input State + FillRectDecal(olc::vf2d(1 + float((TextEntryGetCursor() + 1)), 1 + float((vConsoleSize.y - 1))) * vConsoleCharacterScale * 8.0f, olc::vf2d(8, 8) * vConsoleCharacterScale, olc::DARK_CYAN); + DrawStringDecal(olc::vf2d(1, 1 + float((vConsoleSize.y - 1))) * vConsoleCharacterScale * 8.0f, std::string(">") + TextEntryGetString(), olc::YELLOW, vConsoleCharacterScale); + } + + + const std::vector& PixelGameEngine::GetDroppedFiles() const + { return vDroppedFiles; } + + const olc::vi2d& PixelGameEngine::GetDroppedFilesPoint() const + { return vDroppedFilesPoint; } + + + void PixelGameEngine::TextEntryEnable(const bool bEnable, const std::string& sText) + { + if (bEnable) + { + nTextEntryCursor = int32_t(sText.size()); + sTextEntryString = sText; + bTextEntryEnable = true; + } + else + { + bTextEntryEnable = false; + } + } + + std::string PixelGameEngine::TextEntryGetString() const + { return sTextEntryString; } + + int32_t PixelGameEngine::TextEntryGetCursor() const + { return nTextEntryCursor; } + + bool PixelGameEngine::IsTextEntryEnabled() const + { return bTextEntryEnable; } + + + void PixelGameEngine::UpdateTextEntry() + { + // Check for typed characters + for (const auto& key : vKeyboardMap) + if (GetKey(std::get<0>(key)).bPressed) + { + sTextEntryString.insert(nTextEntryCursor, GetKey(olc::Key::SHIFT).bHeld ? std::get<2>(key) : std::get<1>(key)); + nTextEntryCursor++; + } + + // Check for command characters + if (GetKey(olc::Key::LEFT).bPressed) + nTextEntryCursor = std::max(0, nTextEntryCursor - 1); + if (GetKey(olc::Key::RIGHT).bPressed) + nTextEntryCursor = std::min(int32_t(sTextEntryString.size()), nTextEntryCursor + 1); + if (GetKey(olc::Key::BACK).bPressed && nTextEntryCursor > 0) + { + sTextEntryString.erase(nTextEntryCursor-1, 1); + nTextEntryCursor = std::max(0, nTextEntryCursor - 1); + } + if (GetKey(olc::Key::DEL).bPressed && nTextEntryCursor < sTextEntryString.size()) + sTextEntryString.erase(nTextEntryCursor, 1); + + if (GetKey(olc::Key::UP).bPressed) + { + if (!sCommandHistory.empty()) + { + if (sCommandHistoryIt != sCommandHistory.begin()) + sCommandHistoryIt--; + + nTextEntryCursor = int32_t(sCommandHistoryIt->size()); + sTextEntryString = *sCommandHistoryIt; + } + } + + if (GetKey(olc::Key::DOWN).bPressed) + { + if (!sCommandHistory.empty()) + { + if (sCommandHistoryIt != sCommandHistory.end()) + { + sCommandHistoryIt++; + if (sCommandHistoryIt != sCommandHistory.end()) + { + nTextEntryCursor = int32_t(sCommandHistoryIt->size()); + sTextEntryString = *sCommandHistoryIt; + } + else + { + nTextEntryCursor = 0; + sTextEntryString = ""; + } + } + } + } + + if (GetKey(olc::Key::ENTER).bPressed) + { + if (bConsoleShow) + { + std::cout << ">" + sTextEntryString + "\n"; + if (OnConsoleCommand(sTextEntryString)) + { + sCommandHistory.push_back(sTextEntryString); + sCommandHistoryIt = sCommandHistory.end(); + } + sTextEntryString.clear(); + nTextEntryCursor = 0; + } + else + { + OnTextEntryComplete(sTextEntryString); + TextEntryEnable(false); + } + } + } + + // User must override these functions as required. I have not made + // them abstract because I do need a default behaviour to occur if + // they are not overwritten + + bool PixelGameEngine::OnUserCreate() + { return false; } + + bool PixelGameEngine::OnUserUpdate(float fElapsedTime) + { UNUSED(fElapsedTime); return false; } + + bool PixelGameEngine::OnUserDestroy() + { return true; } + + void PixelGameEngine::OnTextEntryComplete(const std::string& sText) { UNUSED(sText); } + bool PixelGameEngine::OnConsoleCommand(const std::string& sCommand) { UNUSED(sCommand); return false; } + + // Externalised API + void PixelGameEngine::olc_UpdateViewport() + { + int32_t ww = vScreenSize.x * vPixelSize.x; + int32_t wh = vScreenSize.y * vPixelSize.y; + float wasp = (float)ww / (float)wh; + + if (bPixelCohesion) + { + vScreenPixelSize = (vWindowSize / vScreenSize); + vViewSize = (vWindowSize / vScreenSize) * vScreenSize; + } + else + { + vViewSize.x = (int32_t)vWindowSize.x; + vViewSize.y = (int32_t)((float)vViewSize.x / wasp); + + if (vViewSize.y > vWindowSize.y) + { + vViewSize.y = vWindowSize.y; + vViewSize.x = (int32_t)((float)vViewSize.y * wasp); + } + } + + vViewPos = (vWindowSize - vViewSize) / 2; + } + + void PixelGameEngine::olc_UpdateWindowSize(int32_t x, int32_t y) + { + vWindowSize = { x, y }; + olc_UpdateViewport(); + } + + void PixelGameEngine::olc_UpdateMouseWheel(int32_t delta) + { nMouseWheelDeltaCache += delta; } + + void PixelGameEngine::olc_UpdateMouse(int32_t x, int32_t y) + { + // Mouse coords come in screen space + // But leave in pixel space + bHasMouseFocus = true; + vMouseWindowPos = { x, y }; + // Full Screen mode may have a weird viewport we must clamp to + x -= vViewPos.x; + y -= vViewPos.y; + vMousePosCache.x = (int32_t)(((float)x / (float)(vWindowSize.x - (vViewPos.x * 2)) * (float)vScreenSize.x)); + vMousePosCache.y = (int32_t)(((float)y / (float)(vWindowSize.y - (vViewPos.y * 2)) * (float)vScreenSize.y)); + if (vMousePosCache.x >= (int32_t)vScreenSize.x) vMousePosCache.x = vScreenSize.x - 1; + if (vMousePosCache.y >= (int32_t)vScreenSize.y) vMousePosCache.y = vScreenSize.y - 1; + if (vMousePosCache.x < 0) vMousePosCache.x = 0; + if (vMousePosCache.y < 0) vMousePosCache.y = 0; + } + + void PixelGameEngine::olc_UpdateMouseState(int32_t button, bool state) + { pMouseNewState[button] = state; } + + void PixelGameEngine::olc_UpdateKeyState(int32_t key, bool state) + { pKeyNewState[key] = state; } + + void PixelGameEngine::olc_UpdateMouseFocus(bool state) + { bHasMouseFocus = state; } + + void PixelGameEngine::olc_UpdateKeyFocus(bool state) + { bHasInputFocus = state; } + + void PixelGameEngine::olc_DropFiles(int32_t x, int32_t y, const std::vector& vFiles) + { + x -= vViewPos.x; + y -= vViewPos.y; + vDroppedFilesPointCache.x = (int32_t)(((float)x / (float)(vWindowSize.x - (vViewPos.x * 2)) * (float)vScreenSize.x)); + vDroppedFilesPointCache.y = (int32_t)(((float)y / (float)(vWindowSize.y - (vViewPos.y * 2)) * (float)vScreenSize.y)); + if (vDroppedFilesPointCache.x >= (int32_t)vScreenSize.x) vDroppedFilesPointCache.x = vScreenSize.x - 1; + if (vDroppedFilesPointCache.y >= (int32_t)vScreenSize.y) vDroppedFilesPointCache.y = vScreenSize.y - 1; + if (vDroppedFilesPointCache.x < 0) vDroppedFilesPointCache.x = 0; + if (vDroppedFilesPointCache.y < 0) vDroppedFilesPointCache.y = 0; + vDroppedFilesCache = vFiles; + } + + void PixelGameEngine::olc_Reanimate() + { bAtomActive = true; } + + bool PixelGameEngine::olc_IsRunning() + { return bAtomActive; } + + void PixelGameEngine::olc_Terminate() + { bAtomActive = false; } + + void PixelGameEngine::EngineThread() + { + // Allow platform to do stuff here if needed, since its now in the + // context of this thread + if (platform->ThreadStartUp() == olc::FAIL) return; + + // Do engine context specific initialisation + olc_PrepareEngine(); + + // Create user resources as part of this thread + for (auto& ext : vExtensions) ext->OnBeforeUserCreate(); + if (!OnUserCreate()) bAtomActive = false; + for (auto& ext : vExtensions) ext->OnAfterUserCreate(); + + while (bAtomActive) + { + // Run as fast as possible + while (bAtomActive) { olc_CoreUpdate(); } + + // Allow the user to free resources if they have overrided the destroy function + if (!OnUserDestroy()) + { + // User denied destroy for some reason, so continue running + bAtomActive = true; + } + } + + platform->ThreadCleanUp(); + } + + void PixelGameEngine::olc_PrepareEngine() + { + // Start OpenGL, the context is owned by the game thread + if (platform->CreateGraphics(bFullScreen, bEnableVSYNC, vViewPos, vViewSize) == olc::FAIL) return; + + // Construct default font sheet + olc_ConstructFontSheet(); + + // Create Primary Layer "0" + CreateLayer(); + vLayers[0].bUpdate = true; + vLayers[0].bShow = true; + SetDrawTarget(nullptr); + + m_tp1 = std::chrono::system_clock::now(); + m_tp2 = std::chrono::system_clock::now(); + } + + + void PixelGameEngine::olc_CoreUpdate() + { + // Handle Timing + m_tp2 = std::chrono::system_clock::now(); + std::chrono::duration elapsedTime = m_tp2 - m_tp1; + m_tp1 = m_tp2; + + // Our time per frame coefficient + float fElapsedTime = elapsedTime.count(); + fLastElapsed = fElapsedTime; + + if (bConsoleSuspendTime) + fElapsedTime = 0.0f; + + // Some platforms will need to check for events + platform->HandleSystemEvent(); + + // Compare hardware input states from previous frame + auto ScanHardware = [&](HWButton* pKeys, bool* pStateOld, bool* pStateNew, uint32_t nKeyCount) + { + for (uint32_t i = 0; i < nKeyCount; i++) + { + pKeys[i].bPressed = false; + pKeys[i].bReleased = false; + if (pStateNew[i] != pStateOld[i]) + { + if (pStateNew[i]) + { + pKeys[i].bPressed = !pKeys[i].bHeld; + pKeys[i].bHeld = true; + } + else + { + pKeys[i].bReleased = true; + pKeys[i].bHeld = false; + } + } + pStateOld[i] = pStateNew[i]; + } + }; + + ScanHardware(pKeyboardState, pKeyOldState, pKeyNewState, 256); + ScanHardware(pMouseState, pMouseOldState, pMouseNewState, nMouseButtons); + + // Cache mouse coordinates so they remain consistent during frame + vMousePos = vMousePosCache; + nMouseWheelDelta = nMouseWheelDeltaCache; + nMouseWheelDeltaCache = 0; + + vDroppedFiles = vDroppedFilesCache; + vDroppedFilesPoint = vDroppedFilesPointCache; + vDroppedFilesCache.clear(); + + if (bTextEntryEnable) + { + UpdateTextEntry(); + } + + // Handle Frame Update + bool bExtensionBlockFrame = false; + for (auto& ext : vExtensions) bExtensionBlockFrame |= ext->OnBeforeUserUpdate(fElapsedTime); + if (!bExtensionBlockFrame) + { + if (!OnUserUpdate(fElapsedTime)) bAtomActive = false; + + } + for (auto& ext : vExtensions) ext->OnAfterUserUpdate(fElapsedTime); + + if (bConsoleShow) + { + SetDrawTarget((uint8_t)0); + UpdateConsole(); + } + + + + // Display Frame + renderer->UpdateViewport(vViewPos, vViewSize); + renderer->ClearBuffer(olc::BLACK, true); + + // Layer 0 must always exist + vLayers[0].bUpdate = true; + vLayers[0].bShow = true; + SetDecalMode(DecalMode::NORMAL); + renderer->PrepareDrawing(); + + for (auto layer = vLayers.rbegin(); layer != vLayers.rend(); ++layer) + { + if (layer->bShow) + { + if (layer->funcHook == nullptr) + { + renderer->ApplyTexture(layer->pDrawTarget.Decal()->id); + if (!bSuspendTextureTransfer && layer->bUpdate) + { + layer->pDrawTarget.Decal()->Update(); + layer->bUpdate = false; + } + + renderer->DrawLayerQuad(layer->vOffset, layer->vScale, layer->tint); + + // Display Decals in order for this layer + for (auto& decal : layer->vecDecalInstance) + renderer->DrawDecal(decal); + layer->vecDecalInstance.clear(); + } + else + { + // Mwa ha ha.... Have Fun!!! + layer->funcHook(); + } + } + } + + + + // Present Graphics to screen + renderer->DisplayFrame(); + + // Update Title Bar + fFrameTimer += fElapsedTime; + nFrameCount++; + if (fFrameTimer >= 1.0f) + { + nLastFPS = nFrameCount; + fFrameTimer -= 1.0f; + std::string sTitle = "OneLoneCoder.com - Pixel Game Engine - " + sAppName + " - FPS: " + std::to_string(nFrameCount); + platform->SetWindowTitle(sTitle); + nFrameCount = 0; + } + } + + void PixelGameEngine::olc_ConstructFontSheet() + { + std::string data; + data += "?Q`0001oOch0o01o@F40o000000000"; + data += "O000000nOT0063Qo4d8>?7a14Gno94AA4gno94AaOT0>o3`oO400o7QN00000400"; + data += "Of80001oOg<7O7moBGT7O7lABET024@aBEd714AiOdl717a_=TH013Q>00000000"; + data += "720D000V?V5oB3Q_HdUoE7a9@DdDE4A9@DmoE4A;Hg]oM4Aj8S4D84@`00000000"; + data += "OaPT1000Oa`^13P1@AI[?g`1@A=[OdAoHgljA4Ao?WlBA7l1710007l100000000"; + data += "ObM6000oOfMV?3QoBDD`O7a0BDDH@5A0BDD<@5A0BGeVO5ao@CQR?5Po00000000"; + data += "Oc``000?Ogij70PO2D]??0Ph2DUM@7i`2DTg@7lh2GUj?0TO0C1870T?00000000"; + data += "70<4001o?P<7?1QoHg43O;`h@GT0@:@LB@d0>:@hN@L0@?aoN@<0O7ao0000?000"; + data += "OcH0001SOglLA7mg24TnK7ln24US>0PL24U140PnOgl0>7QgOcH0K71S0000A000"; + data += "00H00000@Dm1S007@DUSg00?OdTnH7YhOfTL<7Yh@Cl0700?@Ah0300700000000"; + data += "<008001QL00ZA41a@6HnI<1i@FHLM81M@@0LG81?O`0nC?Y7?`0ZA7Y300080000"; + data += "O`082000Oh0827mo6>Hn?Wmo?6HnMb11MP08@C11H`08@FP0@@0004@000000000"; + data += "00P00001Oab00003OcKP0006@6=PMgl<@440MglH@000000`@000001P00000000"; + data += "Ob@8@@00Ob@8@Ga13R@8Mga172@8?PAo3R@827QoOb@820@0O`0007`0000007P0"; + data += "O`000P08Od400g`<3V=P0G`673IP0`@3>1`00P@6O`P00g`SetPixel(px, py, olc::Pixel(k, k, k, k)); + if (++py == 48) { px++; py = 0; } + } + } + + fontRenderable.Decal()->Update(); + + constexpr std::array vSpacing = { { + 0x03,0x25,0x16,0x08,0x07,0x08,0x08,0x04,0x15,0x15,0x08,0x07,0x15,0x07,0x24,0x08, + 0x08,0x17,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x24,0x15,0x06,0x07,0x16,0x17, + 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x17,0x08,0x08,0x17,0x08,0x08,0x08, + 0x08,0x08,0x08,0x08,0x17,0x08,0x08,0x08,0x08,0x17,0x08,0x15,0x08,0x15,0x08,0x08, + 0x24,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x33,0x17,0x17,0x33,0x18,0x17,0x17, + 0x17,0x17,0x17,0x17,0x07,0x17,0x17,0x18,0x18,0x17,0x17,0x07,0x33,0x07,0x08,0x00, } }; + + for (auto c : vSpacing) vFontSpacing.push_back({ c >> 4, c & 15 }); + + // UK Standard Layout +#ifdef OLC_KEYBOARD_UK + vKeyboardMap = + { + {olc::Key::A, "a", "A"}, {olc::Key::B, "b", "B"}, {olc::Key::C, "c", "C"}, {olc::Key::D, "d", "D"}, {olc::Key::E, "e", "E"}, + {olc::Key::F, "f", "F"}, {olc::Key::G, "g", "G"}, {olc::Key::H, "h", "H"}, {olc::Key::I, "i", "I"}, {olc::Key::J, "j", "J"}, + {olc::Key::K, "k", "K"}, {olc::Key::L, "l", "L"}, {olc::Key::M, "m", "M"}, {olc::Key::N, "n", "N"}, {olc::Key::O, "o", "O"}, + {olc::Key::P, "p", "P"}, {olc::Key::Q, "q", "Q"}, {olc::Key::R, "r", "R"}, {olc::Key::S, "s", "S"}, {olc::Key::T, "t", "T"}, + {olc::Key::U, "u", "U"}, {olc::Key::V, "v", "V"}, {olc::Key::W, "w", "W"}, {olc::Key::X, "x", "X"}, {olc::Key::Y, "y", "Y"}, + {olc::Key::Z, "z", "Z"}, + + {olc::Key::K0, "0", ")"}, {olc::Key::K1, "1", "!"}, {olc::Key::K2, "2", "\""}, {olc::Key::K3, "3", "#"}, {olc::Key::K4, "4", "$"}, + {olc::Key::K5, "5", "%"}, {olc::Key::K6, "6", "^"}, {olc::Key::K7, "7", "&"}, {olc::Key::K8, "8", "*"}, {olc::Key::K9, "9", "("}, + + {olc::Key::NP0, "0", "0"}, {olc::Key::NP1, "1", "1"}, {olc::Key::NP2, "2", "2"}, {olc::Key::NP3, "3", "3"}, {olc::Key::NP4, "4", "4"}, + {olc::Key::NP5, "5", "5"}, {olc::Key::NP6, "6", "6"}, {olc::Key::NP7, "7", "7"}, {olc::Key::NP8, "8", "8"}, {olc::Key::NP9, "9", "9"}, + {olc::Key::NP_MUL, "*", "*"}, {olc::Key::NP_DIV, "/", "/"}, {olc::Key::NP_ADD, "+", "+"}, {olc::Key::NP_SUB, "-", "-"}, {olc::Key::NP_DECIMAL, ".", "."}, + + {olc::Key::PERIOD, ".", ">"}, {olc::Key::EQUALS, "=", "+"}, {olc::Key::COMMA, ",", "<"}, {olc::Key::MINUS, "-", "_"}, {olc::Key::SPACE, " ", " "}, + + {olc::Key::OEM_1, ";", ":"}, {olc::Key::OEM_2, "/", "?"}, {olc::Key::OEM_3, "\'", "@"}, {olc::Key::OEM_4, "[", "{"}, + {olc::Key::OEM_5, "\\", "|"}, {olc::Key::OEM_6, "]", "}"}, {olc::Key::OEM_7, "#", "~"}, + + // {olc::Key::TAB, "\t", "\t"} + }; +#endif + } + + void PixelGameEngine::pgex_Register(olc::PGEX* pgex) + { + if (std::find(vExtensions.begin(), vExtensions.end(), pgex) == vExtensions.end()) + vExtensions.push_back(pgex); + } + + + PGEX::PGEX(bool bHook) { if(bHook) pge->pgex_Register(this); } + void PGEX::OnBeforeUserCreate() {} + void PGEX::OnAfterUserCreate() {} + bool PGEX::OnBeforeUserUpdate(float& fElapsedTime) { return false; } + void PGEX::OnAfterUserUpdate(float fElapsedTime) {} + + // Need a couple of statics as these are singleton instances + // read from multiple locations + std::atomic PixelGameEngine::bAtomActive{ false }; + olc::PixelGameEngine* olc::PGEX::pge = nullptr; + olc::PixelGameEngine* olc::Platform::ptrPGE = nullptr; + olc::PixelGameEngine* olc::Renderer::ptrPGE = nullptr; + std::unique_ptr olc::Sprite::loader = nullptr; +}; +#pragma endregion + + +#pragma region platform_headless +namespace olc +{ +#if defined(OLC_GFX_HEADLESS) + class Renderer_Headless : public olc::Renderer + { + public: + virtual void PrepareDevice() {}; + virtual olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) { return olc::rcode::OK; } + virtual olc::rcode DestroyDevice() { return olc::rcode::OK; } + virtual void DisplayFrame() {} + virtual void PrepareDrawing() {} + virtual void SetDecalMode(const olc::DecalMode& mode) {} + virtual void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) {} + virtual void DrawDecal(const olc::DecalInstance& decal) {} + virtual uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered = false, const bool clamp = true) {return 1;}; + virtual void UpdateTexture(uint32_t id, olc::Sprite* spr) {} + virtual void ReadTexture(uint32_t id, olc::Sprite* spr) {} + virtual uint32_t DeleteTexture(const uint32_t id) {return 1;} + virtual void ApplyTexture(uint32_t id) {} + virtual void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) {} + virtual void ClearBuffer(olc::Pixel p, bool bDepth) {} + }; +#endif +#if defined(OLC_PLATFORM_HEADLESS) + class Platform_Headless : public olc::Platform + { + public: + virtual olc::rcode ApplicationStartUp() { return olc::rcode::OK; } + virtual olc::rcode ApplicationCleanUp() { return olc::rcode::OK; } + virtual olc::rcode ThreadStartUp() { return olc::rcode::OK; } + virtual olc::rcode ThreadCleanUp() { return olc::rcode::OK; } + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) { return olc::rcode::OK; } + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) { return olc::rcode::OK; } + virtual olc::rcode SetWindowTitle(const std::string& s) { return olc::rcode::OK; } + virtual olc::rcode StartSystemEventLoop() { return olc::rcode::OK; } + virtual olc::rcode HandleSystemEvent() { return olc::rcode::OK; } + }; +#endif +} +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Renderers - the draw-y bits | +// O------------------------------------------------------------------------------O + +#pragma region image_stb +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: stb_image.h, all systems, very fast | +// O------------------------------------------------------------------------------O +// Thanks to Sean Barrett - https://github.com/nothings/stb/blob/master/stb_image.h +// MIT License - Copyright(c) 2017 Sean Barrett + +// Note you need to download the above file into your project folder, and +// #define OLC_IMAGE_STB +// #define OLC_PGE_APPLICATION +// #include "olcPixelGameEngine.h" + +#if defined(OLC_IMAGE_STB) +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" +namespace olc +{ + class ImageLoader_STB : public olc::ImageLoader + { + public: + ImageLoader_STB() : ImageLoader() + {} + + olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) override + { + UNUSED(pack); + // clear out existing sprite + spr->pColData.clear(); + // Open file + stbi_uc* bytes = nullptr; + int w = 0, h = 0, cmp = 0; + if (pack != nullptr) + { + ResourceBuffer rb = pack->GetFileBuffer(sImageFile); + bytes = stbi_load_from_memory((unsigned char*)rb.vMemory.data(), rb.vMemory.size(), &w, &h, &cmp, 4); + } + else + { + // Check file exists + if (!_gfs::exists(sImageFile)) return olc::rcode::NO_FILE; + bytes = stbi_load(sImageFile.c_str(), &w, &h, &cmp, 4); + } + + if (!bytes) return olc::rcode::FAIL; + spr->width = w; spr->height = h; + spr->pColData.resize(spr->width * spr->height); + std::memcpy(spr->pColData.data(), bytes, spr->width * spr->height * 4); + delete[] bytes; + return olc::rcode::OK; + } + + olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) override + { + return olc::rcode::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: stb_image.h | +// O------------------------------------------------------------------------------O +#pragma endregion + + + +#if !defined(OLC_PGE_HEADLESS) + +#pragma region renderer_ogl10 +// O------------------------------------------------------------------------------O +// | START RENDERER: OpenGL 1.0 (the original, the best...) | +// O------------------------------------------------------------------------------O +#if defined(OLC_GFX_OPENGL10) + +#if defined(OLC_PLATFORM_WINAPI) +#include +#include +#if !defined(__MINGW32__) +#pragma comment(lib, "Dwmapi.lib") +#endif +typedef BOOL(WINAPI wglSwapInterval_t) (int interval); +static wglSwapInterval_t* wglSwapInterval = nullptr; +typedef HDC glDeviceContext_t; +typedef HGLRC glRenderContext_t; +#endif + +#if defined(__linux__) || defined(__FreeBSD__) +#include +#endif + +#if defined(OLC_PLATFORM_X11) +namespace X11 +{ +#include +} +typedef int(glSwapInterval_t)(X11::Display* dpy, X11::GLXDrawable drawable, int interval); +static glSwapInterval_t* glSwapIntervalEXT; +typedef X11::GLXContext glDeviceContext_t; +typedef X11::GLXContext glRenderContext_t; +#endif + +#if defined(__APPLE__) +#define GL_SILENCE_DEPRECATION +#include +#include +#include +#endif + +namespace olc +{ + class Renderer_OGL10 : public olc::Renderer + { + private: +#if defined(OLC_PLATFORM_GLUT) + bool mFullScreen = false; +#else + glDeviceContext_t glDeviceContext = 0; + glRenderContext_t glRenderContext = 0; +#endif + + bool bSync = false; + olc::DecalMode nDecalMode = olc::DecalMode(-1); // Thanks Gusgo & Bispoo + olc::DecalStructure nDecalStructure = olc::DecalStructure(-1); +#if defined(OLC_PLATFORM_X11) + X11::Display* olc_Display = nullptr; + X11::Window* olc_Window = nullptr; + X11::XVisualInfo* olc_VisualInfo = nullptr; +#endif + + public: + void PrepareDevice() override + { +#if defined(OLC_PLATFORM_GLUT) + //glutInit has to be called with main() arguments, make fake ones + int argc = 0; + char* argv[1] = { (char*)"" }; + glutInit(&argc, argv); + glutInitWindowPosition(0, 0); + glutInitWindowSize(512, 512); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); + // Creates the window and the OpenGL context for it + glutCreateWindow("OneLoneCoder.com - Pixel Game Engine"); + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif + } + + olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) override + { +#if defined(OLC_PLATFORM_WINAPI) + // Create Device Context + glDeviceContext = GetDC((HWND)(params[0])); + PIXELFORMATDESCRIPTOR pfd = + { + sizeof(PIXELFORMATDESCRIPTOR), 1, + PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PFD_MAIN_PLANE, 0, 0, 0, 0 + }; + + int pf = 0; + if (!(pf = ChoosePixelFormat(glDeviceContext, &pfd))) return olc::FAIL; + SetPixelFormat(glDeviceContext, pf, &pfd); + + if (!(glRenderContext = wglCreateContext(glDeviceContext))) return olc::FAIL; + wglMakeCurrent(glDeviceContext, glRenderContext); + + // Remove Frame cap + wglSwapInterval = (wglSwapInterval_t*)wglGetProcAddress("wglSwapIntervalEXT"); + if (wglSwapInterval && !bVSYNC) wglSwapInterval(0); + bSync = bVSYNC; +#endif + +#if defined(OLC_PLATFORM_X11) + using namespace X11; + // Linux has tighter coupling between OpenGL and X11, so we store + // various "platform" handles in the renderer + olc_Display = (X11::Display*)(params[0]); + olc_Window = (X11::Window*)(params[1]); + olc_VisualInfo = (X11::XVisualInfo*)(params[2]); + + glDeviceContext = glXCreateContext(olc_Display, olc_VisualInfo, nullptr, GL_TRUE); + glXMakeCurrent(olc_Display, *olc_Window, glDeviceContext); + + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, *olc_Window, &gwa); + glViewport(0, 0, gwa.width, gwa.height); + + glSwapIntervalEXT = nullptr; + glSwapIntervalEXT = (glSwapInterval_t*)glXGetProcAddress((unsigned char*)"glXSwapIntervalEXT"); + + if (glSwapIntervalEXT == nullptr && !bVSYNC) + { + printf("NOTE: Could not disable VSYNC, glXSwapIntervalEXT() was not found!\n"); + printf(" Don't worry though, things will still work, it's just the\n"); + printf(" frame rate will be capped to your monitors refresh rate - javidx9\n"); + } + + if (glSwapIntervalEXT != nullptr && !bVSYNC) + glSwapIntervalEXT(olc_Display, *olc_Window, 0); +#endif + +#if defined(OLC_PLATFORM_GLUT) + mFullScreen = bFullScreen; + if (!bVSYNC) + { +#if defined(__APPLE__) + GLint sync = 0; + CGLContextObj ctx = CGLGetCurrentContext(); + if (ctx) CGLSetParameter(ctx, kCGLCPSwapInterval, &sync); +#endif + } +#else + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif + return olc::rcode::OK; + } + + olc::rcode DestroyDevice() override + { +#if defined(OLC_PLATFORM_WINAPI) + wglDeleteContext(glRenderContext); +#endif + +#if defined(OLC_PLATFORM_X11) + glXMakeCurrent(olc_Display, None, NULL); + glXDestroyContext(olc_Display, glDeviceContext); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutDestroyWindow(glutGetWindow()); +#endif + return olc::rcode::OK; + } + + void DisplayFrame() override + { +#if defined(OLC_PLATFORM_WINAPI) + SwapBuffers(glDeviceContext); + if (bSync) DwmFlush(); // Woooohooooooo!!!! SMOOOOOOOTH! +#endif + +#if defined(OLC_PLATFORM_X11) + X11::glXSwapBuffers(olc_Display, *olc_Window); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutSwapBuffers(); +#endif + } + + void PrepareDrawing() override + { + + //ClearBuffer(olc::GREEN, true); + glEnable(GL_BLEND); + nDecalMode = DecalMode::NORMAL; + nDecalStructure = DecalStructure::FAN; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + + void SetDecalMode(const olc::DecalMode& mode) + { + if (mode != nDecalMode) + { + switch (mode) + { + case olc::DecalMode::NORMAL: + case olc::DecalMode::MODEL3D: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + break; + case olc::DecalMode::ADDITIVE: + glBlendFunc(GL_SRC_ALPHA, GL_ONE); + break; + case olc::DecalMode::MULTIPLICATIVE: + glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); + break; + case olc::DecalMode::STENCIL: + glBlendFunc(GL_ZERO, GL_SRC_ALPHA); + break; + case olc::DecalMode::ILLUMINATE: + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); + break; + case olc::DecalMode::WIREFRAME: + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + break; + } + + nDecalMode = mode; + } + } + + void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) override + { + glBegin(GL_QUADS); + glColor4ub(tint.r, tint.g, tint.b, tint.a); + glTexCoord2f(0.0f * scale.x + offset.x, 1.0f * scale.y + offset.y); + glVertex3f(-1.0f /*+ vSubPixelOffset.x*/, -1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glTexCoord2f(0.0f * scale.x + offset.x, 0.0f * scale.y + offset.y); + glVertex3f(-1.0f /*+ vSubPixelOffset.x*/, 1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glTexCoord2f(1.0f * scale.x + offset.x, 0.0f * scale.y + offset.y); + glVertex3f(1.0f /*+ vSubPixelOffset.x*/, 1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glTexCoord2f(1.0f * scale.x + offset.x, 1.0f * scale.y + offset.y); + glVertex3f(1.0f /*+ vSubPixelOffset.x*/, -1.0f /*+ vSubPixelOffset.y*/, 0.0f); + glEnd(); + } + + void DrawDecal(const olc::DecalInstance& decal) override + { + SetDecalMode(decal.mode); + + if (decal.decal == nullptr) + glBindTexture(GL_TEXTURE_2D, 0); + else + glBindTexture(GL_TEXTURE_2D, decal.decal->id); + + if (nDecalMode == DecalMode::MODEL3D) + { +#ifdef OLC_ENABLE_EXPERIMENTAL + glMatrixMode(GL_PROJECTION); glPushMatrix(); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); + + glEnable(GL_DEPTH_TEST); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glFrustum(-1.0f, 1.0f, -1.0f, 1.0f, 1, 1000); + +#pragma comment (lib, "winmm.lib") + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glTranslatef(0, -40, -200); + glRotatef(float(clock()) * 0.1f, 1, 0, 0); + glRotatef(float(clock()) * 0.1f * 2, 0, 1, 0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glBegin(GL_TRIANGLES); + + + // Render as 3D Spatial Entity + for (uint32_t n = 0; n < decal.points; n++) + { + glColor4ub(decal.tint[n].r, decal.tint[n].g, decal.tint[n].b, decal.tint[n].a); + glTexCoord2f(decal.uv[n].x, decal.uv[n].y); + glVertex3f(decal.pos[n].x, decal.pos[n].y, decal.w[n]); + } + + glEnd(); + + glMatrixMode(GL_PROJECTION); glPopMatrix(); + glMatrixMode(GL_MODELVIEW); glPopMatrix(); + glDisable(GL_DEPTH_TEST); +#endif + } + else + { + if (nDecalMode == DecalMode::WIREFRAME) + glBegin(GL_LINE_LOOP); + else + { + if(decal.structure == olc::DecalStructure::FAN) + glBegin(GL_TRIANGLE_FAN); + else if(decal.structure == olc::DecalStructure::STRIP) + glBegin(GL_TRIANGLE_STRIP); + else if(decal.structure == olc::DecalStructure::LIST) + glBegin(GL_TRIANGLES); + } + + // Render as 2D Spatial entity + for (uint32_t n = 0; n < decal.points; n++) + { + glColor4ub(decal.tint[n].r, decal.tint[n].g, decal.tint[n].b, decal.tint[n].a); + glTexCoord4f(decal.uv[n].x, decal.uv[n].y, 0.0f, decal.w[n]); + glVertex2f(decal.pos[n].x, decal.pos[n].y); + } + + glEnd(); + } + + + //glDisable(GL_DEPTH_TEST); + } + + uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered, const bool clamp) override + { + UNUSED(width); + UNUSED(height); + uint32_t id = 0; + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + if (filtered) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + + if (clamp) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } + + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + return id; + } + + uint32_t DeleteTexture(const uint32_t id) override + { + glDeleteTextures(1, &id); + return id; + } + + void UpdateTexture(uint32_t id, olc::Sprite* spr) override + { + UNUSED(id); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, spr->width, spr->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ReadTexture(uint32_t id, olc::Sprite* spr) override + { + glReadPixels(0, 0, spr->width, spr->height, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ApplyTexture(uint32_t id) override + { + glBindTexture(GL_TEXTURE_2D, id); + } + + void ClearBuffer(olc::Pixel p, bool bDepth) override + { + glClearColor(float(p.r) / 255.0f, float(p.g) / 255.0f, float(p.b) / 255.0f, float(p.a) / 255.0f); + glClear(GL_COLOR_BUFFER_BIT); + if (bDepth) glClear(GL_DEPTH_BUFFER_BIT); + } + + void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) override + { + glViewport(pos.x, pos.y, size.x, size.y); + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END RENDERER: OpenGL 1.0 (the original, the best...) | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region renderer_ogl33 +// O------------------------------------------------------------------------------O +// | START RENDERER: OpenGL 3.3 (3.0 es) (sh-sh-sh-shaders....) | +// O------------------------------------------------------------------------------O +#if defined(OLC_GFX_OPENGL33) + +#if defined(OLC_PLATFORM_WINAPI) +#include +//#include +#if !defined(__MINGW32__) +#pragma comment(lib, "Dwmapi.lib") +#endif +//typedef void __stdcall locSwapInterval_t(GLsizei n); +typedef HDC glDeviceContext_t; +typedef HGLRC glRenderContext_t; +//#define CALLSTYLE __stdcall +#define OGL_LOAD(t, n) (t*)wglGetProcAddress(#n) +#endif +// +//#if defined(__linux__) || defined(__FreeBSD__) +// #include +//#endif + +#if defined(OLC_PLATFORM_X11) +/*namespace X11 +{ +#include +} +typedef int(locSwapInterval_t)(X11::Display* dpy, X11::GLXDrawable drawable, int interval);*/ +typedef X11::GLXContext glDeviceContext_t; +typedef X11::GLXContext glRenderContext_t; +//#define CALLSTYLE +#define OGL_LOAD(t, n) (t*)glXGetProcAddress((unsigned char*)#n); +#endif + +//#if defined(__APPLE__) +// #define GL_SILENCE_DEPRECATION +// #include +// #include +// #include +//#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) +#include +#include +#define GL_GLEXT_PROTOTYPES +#include +#include +#define CALLSTYLE +typedef EGLBoolean(locSwapInterval_t)(EGLDisplay display, EGLint interval); +#define GL_CLAMP GL_CLAMP_TO_EDGE +#define OGL_LOAD(t, n) n; +#endif + +namespace olc +{ + // typedef char GLchar; + // typedef ptrdiff_t GLsizeiptr; + // typedef GLuint CALLSTYLE locCreateShader_t(GLenum type); + // typedef GLuint CALLSTYLE locCreateProgram_t(void); + // typedef void CALLSTYLE locDeleteShader_t(GLuint shader); + //#if defined(OLC_PLATFORM_EMSCRIPTEN) + // typedef void CALLSTYLE locShaderSource_t(GLuint shader, GLsizei count, const GLchar* const* string, const GLint* length); + //#else + // typedef void CALLSTYLE locShaderSource_t(GLuint shader, GLsizei count, const GLchar** string, const GLint* length); + //#endif + // typedef void CALLSTYLE locCompileShader_t(GLuint shader); + // typedef void CALLSTYLE locLinkProgram_t(GLuint program); + // typedef void CALLSTYLE locDeleteProgram_t(GLuint program); + // typedef void CALLSTYLE locAttachShader_t(GLuint program, GLuint shader); + // typedef void CALLSTYLE locBindBuffer_t(GLenum target, GLuint buffer); + // typedef void CALLSTYLE locBufferData_t(GLenum target, GLsizeiptr size, const void* data, GLenum usage); + // typedef void CALLSTYLE locGenBuffers_t(GLsizei n, GLuint* buffers); + // typedef void CALLSTYLE locVertexAttribPointer_t(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void* pointer); + // typedef void CALLSTYLE locEnableVertexAttribArray_t(GLuint index); + // typedef void CALLSTYLE locUseProgram_t(GLuint program); + // typedef void CALLSTYLE locBindVertexArray_t(GLuint array); + // typedef void CALLSTYLE locGenVertexArrays_t(GLsizei n, GLuint* arrays); + // typedef void CALLSTYLE locGetShaderInfoLog_t(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog); + // typedef GLint CALLSTYLE locGetUniformLocation_t(GLuint program, const GLchar* name); + // typedef void CALLSTYLE locUniform1f_t(GLint location, GLfloat v0); + // typedef void CALLSTYLE locUniform1i_t(GLint location, GLint v0); + // typedef void CALLSTYLE locUniform2fv_t(GLint location, GLsizei count, const GLfloat* value); + // typedef void CALLSTYLE locActiveTexture_t(GLenum texture); + // typedef void CALLSTYLE locGenFrameBuffers_t(GLsizei n, GLuint* ids); + // typedef void CALLSTYLE locBindFrameBuffer_t(GLenum target, GLuint fb); + // typedef GLenum CALLSTYLE locCheckFrameBufferStatus_t(GLenum target); + // typedef void CALLSTYLE locDeleteFrameBuffers_t(GLsizei n, const GLuint* fbs); + // typedef void CALLSTYLE locFrameBufferTexture2D_t(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); + // typedef void CALLSTYLE locDrawBuffers_t(GLsizei n, const GLenum* bufs); + // typedef void CALLSTYLE locBlendFuncSeparate_t(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); + + + + class Renderer_OGL33 : public olc::Renderer + { + private: +#if defined(OLC_PLATFORM_EMSCRIPTEN) + EGLDisplay olc_Display; + EGLConfig olc_Config; + EGLContext olc_Context; + EGLSurface olc_Surface; +#endif + +#if defined(OLC_PLATFORM_GLUT) + bool mFullScreen = false; +#else +#if !defined(OLC_PLATFORM_EMSCRIPTEN) + glDeviceContext_t glDeviceContext = 0; + glRenderContext_t glRenderContext = 0; +#endif +#endif + bool bSync = false; + olc::DecalMode nDecalMode = olc::DecalMode(-1); // Thanks Gusgo & Bispoo +#if defined(OLC_PLATFORM_X11) + X11::Display* olc_Display = nullptr; + X11::Window* olc_Window = nullptr; + X11::XVisualInfo* olc_VisualInfo = nullptr; +#endif + + private: + locCreateShader_t* locCreateShader = nullptr; + locShaderSource_t* locShaderSource = nullptr; + locCompileShader_t* locCompileShader = nullptr; + locDeleteShader_t* locDeleteShader = nullptr; + locCreateProgram_t* locCreateProgram = nullptr; + locDeleteProgram_t* locDeleteProgram = nullptr; + locLinkProgram_t* locLinkProgram = nullptr; + locAttachShader_t* locAttachShader = nullptr; + locBindBuffer_t* locBindBuffer = nullptr; + locBufferData_t* locBufferData = nullptr; + locGenBuffers_t* locGenBuffers = nullptr; + locVertexAttribPointer_t* locVertexAttribPointer = nullptr; + locEnableVertexAttribArray_t* locEnableVertexAttribArray = nullptr; + locUseProgram_t* locUseProgram = nullptr; + locBindVertexArray_t* locBindVertexArray = nullptr; + locGenVertexArrays_t* locGenVertexArrays = nullptr; + locSwapInterval_t* locSwapInterval = nullptr; + locGetShaderInfoLog_t* locGetShaderInfoLog = nullptr; + + uint32_t m_nFS = 0; + uint32_t m_nVS = 0; + uint32_t m_nQuadShader = 0; + uint32_t m_vbQuad = 0; + uint32_t m_vaQuad = 0; + + struct locVertex + { + float pos[3]; + olc::vf2d tex; + olc::Pixel col; + }; + + locVertex pVertexMem[OLC_MAX_VERTS]; + + olc::Renderable rendBlankQuad; + + public: + void PrepareDevice() override + { +#if defined(OLC_PLATFORM_GLUT) + //glutInit has to be called with main() arguments, make fake ones + int argc = 0; + char* argv[1] = { (char*)"" }; + glutInit(&argc, argv); + glutInitWindowPosition(0, 0); + glutInitWindowSize(512, 512); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH | GLUT_RGBA); + // Creates the window and the OpenGL context for it + glutCreateWindow("OneLoneCoder.com - Pixel Game Engine"); + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif + } + + olc::rcode CreateDevice(std::vector params, bool bFullScreen, bool bVSYNC) override + { + // Create OpenGL Context +#if defined(OLC_PLATFORM_WINAPI) + // Create Device Context + glDeviceContext = GetDC((HWND)(params[0])); + PIXELFORMATDESCRIPTOR pfd = + { + sizeof(PIXELFORMATDESCRIPTOR), 1, + PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, + PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PFD_MAIN_PLANE, 0, 0, 0, 0 + }; + + int pf = 0; + if (!(pf = ChoosePixelFormat(glDeviceContext, &pfd))) return olc::FAIL; + SetPixelFormat(glDeviceContext, pf, &pfd); + + if (!(glRenderContext = wglCreateContext(glDeviceContext))) return olc::FAIL; + wglMakeCurrent(glDeviceContext, glRenderContext); + + // Set Vertical Sync + locSwapInterval = OGL_LOAD(locSwapInterval_t, wglSwapIntervalEXT); + if (locSwapInterval && !bVSYNC) locSwapInterval(0); + bSync = bVSYNC; +#endif + +#if defined(OLC_PLATFORM_X11) + using namespace X11; + // Linux has tighter coupling between OpenGL and X11, so we store + // various "platform" handles in the renderer + olc_Display = (X11::Display*)(params[0]); + olc_Window = (X11::Window*)(params[1]); + olc_VisualInfo = (X11::XVisualInfo*)(params[2]); + + glDeviceContext = glXCreateContext(olc_Display, olc_VisualInfo, nullptr, GL_TRUE); + glXMakeCurrent(olc_Display, *olc_Window, glDeviceContext); + + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, *olc_Window, &gwa); + glViewport(0, 0, gwa.width, gwa.height); + + locSwapInterval = OGL_LOAD(locSwapInterval_t, glXSwapIntervalEXT); + + if (locSwapInterval == nullptr && !bVSYNC) + { + printf("NOTE: Could not disable VSYNC, glXSwapIntervalEXT() was not found!\n"); + printf(" Don't worry though, things will still work, it's just the\n"); + printf(" frame rate will be capped to your monitors refresh rate - javidx9\n"); + } + + if (locSwapInterval != nullptr && !bVSYNC) + locSwapInterval(olc_Display, *olc_Window, 0); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + EGLint const attribute_list[] = { EGL_RED_SIZE, 8, EGL_GREEN_SIZE, 8, EGL_BLUE_SIZE, 8, EGL_ALPHA_SIZE, 8, EGL_NONE }; + EGLint const context_config[] = { EGL_CONTEXT_CLIENT_VERSION , 2, EGL_NONE }; + EGLint num_config; + + olc_Display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + eglInitialize(olc_Display, nullptr, nullptr); + eglChooseConfig(olc_Display, attribute_list, &olc_Config, 1, &num_config); + + /* create an EGL rendering context */ + olc_Context = eglCreateContext(olc_Display, olc_Config, EGL_NO_CONTEXT, context_config); + olc_Surface = eglCreateWindowSurface(olc_Display, olc_Config, NULL, nullptr); + eglMakeCurrent(olc_Display, olc_Surface, olc_Surface, olc_Context); + //eglSwapInterval is currently a NOP, plement anyways in case it becomes supported + locSwapInterval = &eglSwapInterval; + locSwapInterval(olc_Display, bVSYNC ? 1 : 0); +#endif + +#if defined(OLC_PLATFORM_GLUT) + mFullScreen = bFullScreen; + if (!bVSYNC) + { +#if defined(__APPLE__) + GLint sync = 0; + CGLContextObj ctx = CGLGetCurrentContext(); + if (ctx) CGLSetParameter(ctx, kCGLCPSwapInterval, &sync); +#endif + } +#else +#if !defined(OLC_PLATFORM_EMSCRIPTEN) + glEnable(GL_TEXTURE_2D); // Turn on texturing + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); +#endif +#endif + // Load External OpenGL Functions + locCreateShader = OGL_LOAD(locCreateShader_t, glCreateShader); + locCompileShader = OGL_LOAD(locCompileShader_t, glCompileShader); + locShaderSource = OGL_LOAD(locShaderSource_t, glShaderSource); + locDeleteShader = OGL_LOAD(locDeleteShader_t, glDeleteShader); + locCreateProgram = OGL_LOAD(locCreateProgram_t, glCreateProgram); + locDeleteProgram = OGL_LOAD(locDeleteProgram_t, glDeleteProgram); + locLinkProgram = OGL_LOAD(locLinkProgram_t, glLinkProgram); + locAttachShader = OGL_LOAD(locAttachShader_t, glAttachShader); + locBindBuffer = OGL_LOAD(locBindBuffer_t, glBindBuffer); + locBufferData = OGL_LOAD(locBufferData_t, glBufferData); + locGenBuffers = OGL_LOAD(locGenBuffers_t, glGenBuffers); + locVertexAttribPointer = OGL_LOAD(locVertexAttribPointer_t, glVertexAttribPointer); + locEnableVertexAttribArray = OGL_LOAD(locEnableVertexAttribArray_t, glEnableVertexAttribArray); + locUseProgram = OGL_LOAD(locUseProgram_t, glUseProgram); + locGetShaderInfoLog = OGL_LOAD(locGetShaderInfoLog_t, glGetShaderInfoLog); +#if !defined(OLC_PLATFORM_EMSCRIPTEN) + locBindVertexArray = OGL_LOAD(locBindVertexArray_t, glBindVertexArray); + locGenVertexArrays = OGL_LOAD(locGenVertexArrays_t, glGenVertexArrays); +#else + locBindVertexArray = glBindVertexArrayOES; + locGenVertexArrays = glGenVertexArraysOES; +#endif + + // Load & Compile Quad Shader - assumes no errors + m_nFS = locCreateShader(0x8B30); + const GLchar* strFS = +#if defined(__arm__) || defined(OLC_PLATFORM_EMSCRIPTEN) + "#version 300 es\n" + "precision mediump float;" +#else + "#version 330 core\n" +#endif + "out vec4 pixel;\n""in vec2 oTex;\n" + "in vec4 oCol;\n""uniform sampler2D sprTex;\n""void main(){pixel = texture(sprTex, oTex) * oCol;}"; + locShaderSource(m_nFS, 1, &strFS, NULL); + locCompileShader(m_nFS); + + m_nVS = locCreateShader(0x8B31); + const GLchar* strVS = +#if defined(__arm__) || defined(OLC_PLATFORM_EMSCRIPTEN) + "#version 300 es\n" + "precision mediump float;" +#else + "#version 330 core\n" +#endif + "layout(location = 0) in vec3 aPos;\n""layout(location = 1) in vec2 aTex;\n" + "layout(location = 2) in vec4 aCol;\n""out vec2 oTex;\n""out vec4 oCol;\n" + "void main(){ float p = 1.0 / aPos.z; gl_Position = p * vec4(aPos.x, aPos.y, 0.0, 1.0); oTex = p * aTex; oCol = aCol;}"; + locShaderSource(m_nVS, 1, &strVS, NULL); + locCompileShader(m_nVS); + + m_nQuadShader = locCreateProgram(); + locAttachShader(m_nQuadShader, m_nFS); + locAttachShader(m_nQuadShader, m_nVS); + locLinkProgram(m_nQuadShader); + + // Create Quad + locGenBuffers(1, &m_vbQuad); + locGenVertexArrays(1, &m_vaQuad); + locBindVertexArray(m_vaQuad); + locBindBuffer(0x8892, m_vbQuad); + + locVertex verts[OLC_MAX_VERTS]; + locBufferData(0x8892, sizeof(locVertex) * OLC_MAX_VERTS, verts, 0x88E0); + locVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(locVertex), 0); locEnableVertexAttribArray(0); + locVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(locVertex), (void*)(3 * sizeof(float))); locEnableVertexAttribArray(1); + locVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(locVertex), (void*)(5 * sizeof(float))); locEnableVertexAttribArray(2); + locBindBuffer(0x8892, 0); + locBindVertexArray(0); + + // Create blank texture for spriteless decals + rendBlankQuad.Create(1, 1); + rendBlankQuad.Sprite()->GetData()[0] = olc::WHITE; + rendBlankQuad.Decal()->Update(); + return olc::rcode::OK; + } + + olc::rcode DestroyDevice() override + { +#if defined(OLC_PLATFORM_WINAPI) + wglDeleteContext(glRenderContext); +#endif + +#if defined(OLC_PLATFORM_X11) + glXMakeCurrent(olc_Display, None, NULL); + glXDestroyContext(olc_Display, glDeviceContext); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutDestroyWindow(glutGetWindow()); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + eglMakeCurrent(olc_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroyContext(olc_Display, olc_Context); + eglDestroySurface(olc_Display, olc_Surface); + eglTerminate(olc_Display); + olc_Display = EGL_NO_DISPLAY; + olc_Surface = EGL_NO_SURFACE; + olc_Context = EGL_NO_CONTEXT; +#endif + return olc::rcode::OK; + } + + void DisplayFrame() override + { +#if defined(OLC_PLATFORM_WINAPI) + SwapBuffers(glDeviceContext); + if (bSync) DwmFlush(); // Woooohooooooo!!!! SMOOOOOOOTH! +#endif + +#if defined(OLC_PLATFORM_X11) + X11::glXSwapBuffers(olc_Display, *olc_Window); +#endif + +#if defined(OLC_PLATFORM_GLUT) + glutSwapBuffers(); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + eglSwapBuffers(olc_Display, olc_Surface); +#endif + } + + void PrepareDrawing() override + { + glEnable(GL_BLEND); + nDecalMode = DecalMode::NORMAL; + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + locUseProgram(m_nQuadShader); + locBindVertexArray(m_vaQuad); + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + locVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(locVertex), 0); locEnableVertexAttribArray(0); + locVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(locVertex), (void*)(3 * sizeof(float))); locEnableVertexAttribArray(1); + locVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(locVertex), (void*)(5 * sizeof(float))); locEnableVertexAttribArray(2); +#endif + } + + void SetDecalMode(const olc::DecalMode& mode) override + { + if (mode != nDecalMode) + { + switch (mode) + { + case olc::DecalMode::NORMAL: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; + case olc::DecalMode::ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); break; + case olc::DecalMode::MULTIPLICATIVE: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); break; + case olc::DecalMode::STENCIL: glBlendFunc(GL_ZERO, GL_SRC_ALPHA); break; + case olc::DecalMode::ILLUMINATE: glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); break; + case olc::DecalMode::WIREFRAME: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break; + } + + nDecalMode = mode; + } + } + + void DrawLayerQuad(const olc::vf2d& offset, const olc::vf2d& scale, const olc::Pixel tint) override + { + locBindBuffer(0x8892, m_vbQuad); + locVertex verts[4] = { + {{-1.0f, -1.0f, 1.0}, {0.0f * scale.x + offset.x, 1.0f * scale.y + offset.y}, tint}, + {{+1.0f, -1.0f, 1.0}, {1.0f * scale.x + offset.x, 1.0f * scale.y + offset.y}, tint}, + {{-1.0f, +1.0f, 1.0}, {0.0f * scale.x + offset.x, 0.0f * scale.y + offset.y}, tint}, + {{+1.0f, +1.0f, 1.0}, {1.0f * scale.x + offset.x, 0.0f * scale.y + offset.y}, tint}, + }; + + locBufferData(0x8892, sizeof(locVertex) * 4, verts, 0x88E0); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + void DrawDecal(const olc::DecalInstance& decal) override + { + SetDecalMode(decal.mode); + if (decal.decal == nullptr) + glBindTexture(GL_TEXTURE_2D, rendBlankQuad.Decal()->id); + else + glBindTexture(GL_TEXTURE_2D, decal.decal->id); + + locBindBuffer(0x8892, m_vbQuad); + + for (uint32_t i = 0; i < decal.points; i++) + pVertexMem[i] = { { decal.pos[i].x, decal.pos[i].y, decal.w[i] }, { decal.uv[i].x, decal.uv[i].y }, decal.tint[i] }; + + locBufferData(0x8892, sizeof(locVertex) * decal.points, pVertexMem, 0x88E0); + + if (nDecalMode == DecalMode::WIREFRAME) + glDrawArrays(GL_LINE_LOOP, 0, decal.points); + else + { + if (decal.structure == olc::DecalStructure::FAN) + glDrawArrays(GL_TRIANGLE_FAN, 0, decal.points); + else if (decal.structure == olc::DecalStructure::STRIP) + glDrawArrays(GL_TRIANGLE_STRIP, 0, decal.points); + else if (decal.structure == olc::DecalStructure::LIST) + glDrawArrays(GL_TRIANGLES, 0, decal.points); + } + } + + uint32_t CreateTexture(const uint32_t width, const uint32_t height, const bool filtered, const bool clamp) override + { + UNUSED(width); + UNUSED(height); + uint32_t id = 0; + glGenTextures(1, &id); + glBindTexture(GL_TEXTURE_2D, id); + + if (filtered) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + + if (clamp) + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + } + else + { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } +#if !defined(OLC_PLATFORM_EMSCRIPTEN) + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); +#endif + return id; + } + + uint32_t DeleteTexture(const uint32_t id) override + { + glDeleteTextures(1, &id); + return id; + } + + void UpdateTexture(uint32_t id, olc::Sprite* spr) override + { + UNUSED(id); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, spr->width, spr->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ReadTexture(uint32_t id, olc::Sprite* spr) override + { + glReadPixels(0, 0, spr->width, spr->height, GL_RGBA, GL_UNSIGNED_BYTE, spr->GetData()); + } + + void ApplyTexture(uint32_t id) override + { + glBindTexture(GL_TEXTURE_2D, id); + } + + void ClearBuffer(olc::Pixel p, bool bDepth) override + { + glClearColor(float(p.r) / 255.0f, float(p.g) / 255.0f, float(p.b) / 255.0f, float(p.a) / 255.0f); + glClear(GL_COLOR_BUFFER_BIT); + if (bDepth) glClear(GL_DEPTH_BUFFER_BIT); + } + + void UpdateViewport(const olc::vi2d& pos, const olc::vi2d& size) override + { + glViewport(pos.x, pos.y, size.x, size.y); + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END RENDERER: OpenGL 3.3 (3.0 es) (sh-sh-sh-shaders....) | +// O------------------------------------------------------------------------------O +#pragma endregion + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Image loaders | +// O------------------------------------------------------------------------------O + +#pragma region image_gdi +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: GDI+, Windows Only, always exists, a little slow | +// O------------------------------------------------------------------------------O +#if defined(OLC_IMAGE_GDI) + +#define min(a, b) ((a < b) ? a : b) +#define max(a, b) ((a > b) ? a : b) +#include +#include +#if defined(__MINGW32__) // Thanks Gusgo & Dandistine, but c'mon mingw!! wtf?! +#include +#else +#include +#endif +#include +#undef min +#undef max + +#if !defined(__MINGW32__) +#pragma comment(lib, "gdiplus.lib") +#pragma comment(lib, "Shlwapi.lib") +#endif + +namespace olc +{ + // Thanks @MaGetzUb for this, which allows sprites to be defined + // at construction, by initialising the GDI subsystem + static class GDIPlusStartup + { + public: + GDIPlusStartup() + { + Gdiplus::GdiplusStartupInput startupInput; + GdiplusStartup(&token, &startupInput, NULL); + } + + ULONG_PTR token; + + ~GDIPlusStartup() + { + // Well, MarcusTU thought this was important :D + Gdiplus::GdiplusShutdown(token); + } + } gdistartup; + + class ImageLoader_GDIPlus : public olc::ImageLoader + { + private: + std::wstring ConvertS2W(std::string s) + { +#ifdef __MINGW32__ + wchar_t* buffer = new wchar_t[s.length() + 1]; + mbstowcs(buffer, s.c_str(), s.length()); + buffer[s.length()] = L'\0'; +#else + int count = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0); + wchar_t* buffer = new wchar_t[count]; + MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buffer, count); +#endif + std::wstring w(buffer); + delete[] buffer; + return w; + } + + public: + ImageLoader_GDIPlus() : ImageLoader() + {} + + olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) override + { + // clear out existing sprite + spr->pColData.clear(); + + // Open file + UNUSED(pack); + Gdiplus::Bitmap* bmp = nullptr; + if (pack != nullptr) + { + // Load sprite from input stream + ResourceBuffer rb = pack->GetFileBuffer(sImageFile); + bmp = Gdiplus::Bitmap::FromStream(SHCreateMemStream((BYTE*)rb.vMemory.data(), UINT(rb.vMemory.size()))); + } + else + { + // Check file exists + if (!_gfs::exists(sImageFile)) return olc::rcode::NO_FILE; + + // Load sprite from file + bmp = Gdiplus::Bitmap::FromFile(ConvertS2W(sImageFile).c_str()); + } + + if (bmp->GetLastStatus() != Gdiplus::Ok) return olc::rcode::FAIL; + spr->width = bmp->GetWidth(); + spr->height = bmp->GetHeight(); + + spr->pColData.resize(spr->width * spr->height); + + for (int y = 0; y < spr->height; y++) + for (int x = 0; x < spr->width; x++) + { + Gdiplus::Color c; + bmp->GetPixel(x, y, &c); + spr->SetPixel(x, y, olc::Pixel(c.GetRed(), c.GetGreen(), c.GetBlue(), c.GetAlpha())); + } + delete bmp; + return olc::rcode::OK; + } + + olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) override + { + return olc::rcode::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END IMAGE LOADER: GDI+ | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region image_libpng +// O------------------------------------------------------------------------------O +// | START IMAGE LOADER: libpng, default on linux, requires -lpng (libpng-dev) | +// O------------------------------------------------------------------------------O +#if defined(OLC_IMAGE_LIBPNG) +#include +namespace olc +{ + void pngReadStream(png_structp pngPtr, png_bytep data, png_size_t length) + { + png_voidp a = png_get_io_ptr(pngPtr); + ((std::istream*)a)->read((char*)data, length); + } + + class ImageLoader_LibPNG : public olc::ImageLoader + { + public: + ImageLoader_LibPNG() : ImageLoader() + {} + + olc::rcode LoadImageResource(olc::Sprite* spr, const std::string& sImageFile, olc::ResourcePack* pack) override + { + UNUSED(pack); + + // clear out existing sprite + spr->pColData.clear(); + + //////////////////////////////////////////////////////////////////////////// + // Use libpng, Thanks to Guillaume Cottenceau + // https://gist.github.com/niw/5963798 + // Also reading png from streams + // http://www.piko3d.net/tutorials/libpng-tutorial-loading-png-files-from-streams/ + png_structp png; + png_infop info; + + auto loadPNG = [&]() + { + png_read_info(png, info); + png_byte color_type; + png_byte bit_depth; + png_bytep* row_pointers; + spr->width = png_get_image_width(png, info); + spr->height = png_get_image_height(png, info); + color_type = png_get_color_type(png, info); + bit_depth = png_get_bit_depth(png, info); + if (bit_depth == 16) png_set_strip_16(png); + if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png); + if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png); + if (png_get_valid(png, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png); + if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_PALETTE) + png_set_filler(png, 0xFF, PNG_FILLER_AFTER); + if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) + png_set_gray_to_rgb(png); + png_read_update_info(png, info); + row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * spr->height); + for (int y = 0; y < spr->height; y++) { + row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png, info)); + } + png_read_image(png, row_pointers); + //////////////////////////////////////////////////////////////////////////// + // Create sprite array + spr->pColData.resize(spr->width * spr->height); + // Iterate through image rows, converting into sprite format + for (int y = 0; y < spr->height; y++) + { + png_bytep row = row_pointers[y]; + for (int x = 0; x < spr->width; x++) + { + png_bytep px = &(row[x * 4]); + spr->SetPixel(x, y, Pixel(px[0], px[1], px[2], px[3])); + } + } + + for (int y = 0; y < spr->height; y++) // Thanks maksym33 + free(row_pointers[y]); + free(row_pointers); + png_destroy_read_struct(&png, &info, nullptr); + }; + + png = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png) goto fail_load; + + info = png_create_info_struct(png); + if (!info) goto fail_load; + + if (setjmp(png_jmpbuf(png))) goto fail_load; + + if (pack == nullptr) + { + FILE* f = fopen(sImageFile.c_str(), "rb"); + if (!f) return olc::rcode::NO_FILE; + png_init_io(png, f); + loadPNG(); + fclose(f); + } + else + { + ResourceBuffer rb = pack->GetFileBuffer(sImageFile); + std::istream is(&rb); + png_set_read_fn(png, (png_voidp)&is, pngReadStream); + loadPNG(); + } + + return olc::rcode::OK; + + fail_load: + spr->width = 0; + spr->height = 0; + spr->pColData.clear(); + return olc::rcode::FAIL; + } + + olc::rcode SaveImageResource(olc::Sprite* spr, const std::string& sImageFile) override + { + return olc::rcode::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END IMAGE LOADER: | +// O------------------------------------------------------------------------------O +#pragma endregion + + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Platforms | +// O------------------------------------------------------------------------------O + +#pragma region platform_windows +// O------------------------------------------------------------------------------O +// | START PLATFORM: MICROSOFT WINDOWS XP, VISTA, 7, 8, 10 | +// O------------------------------------------------------------------------------O +#if defined(OLC_PLATFORM_WINAPI) + +#if defined(_WIN32) && !defined(__MINGW32__) +#pragma comment(lib, "user32.lib") // Visual Studio Only +#pragma comment(lib, "gdi32.lib") // For other Windows Compilers please add +#pragma comment(lib, "opengl32.lib") // these libs to your linker input +#endif + +namespace olc +{ + class Platform_Windows : public olc::Platform + { + private: + HWND olc_hWnd = nullptr; + std::wstring wsAppName; + + std::wstring ConvertS2W(std::string s) + { +#ifdef __MINGW32__ + wchar_t* buffer = new wchar_t[s.length() + 1]; + mbstowcs(buffer, s.c_str(), s.length()); + buffer[s.length()] = L'\0'; +#else + int count = MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, NULL, 0); + wchar_t* buffer = new wchar_t[count]; + MultiByteToWideChar(CP_UTF8, 0, s.c_str(), -1, buffer, count); +#endif + std::wstring w(buffer); + delete[] buffer; + return w; + } + + + + public: + virtual olc::rcode ApplicationStartUp() override { return olc::rcode::OK; } + virtual olc::rcode ApplicationCleanUp() override { return olc::rcode::OK; } + virtual olc::rcode ThreadStartUp() override { return olc::rcode::OK; } + + virtual olc::rcode ThreadCleanUp() override + { + renderer->DestroyDevice(); + PostMessage(olc_hWnd, WM_DESTROY, 0, 0); + return olc::OK; + } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({ olc_hWnd }, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { + WNDCLASS wc; + wc.hIcon = static_cast(::LoadImage(GetModuleHandle(nullptr), + MAKEINTRESOURCE(103), + IMAGE_ICON, + 48, 48, + LR_DEFAULTCOLOR));; + wc.hCursor = LoadCursor(NULL, IDC_ARROW); + wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; + wc.hInstance = GetModuleHandle(nullptr); + wc.lpfnWndProc = olc_WindowEvent; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.lpszMenuName = nullptr; + wc.hbrBackground = nullptr; + wc.lpszClassName = olcT("OLC_PIXEL_GAME_ENGINE"); + RegisterClass(&wc); + + // Define window furniture + DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; + DWORD dwStyle = WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_THICKFRAME; + + olc::vi2d vTopLeft = vWindowPos; + + // Handle Fullscreen + if (bFullScreen) + { + dwExStyle = 0; + dwStyle = WS_VISIBLE | WS_POPUP; + HMONITOR hmon = MonitorFromWindow(olc_hWnd, MONITOR_DEFAULTTONEAREST); + MONITORINFO mi = { sizeof(mi) }; + if (!GetMonitorInfo(hmon, &mi)) return olc::rcode::FAIL; + vWindowSize = { mi.rcMonitor.right, mi.rcMonitor.bottom }; + vTopLeft.x = 0; + vTopLeft.y = 0; + } + + // Keep client size as requested + RECT rWndRect = { 0, 0, vWindowSize.x, vWindowSize.y }; + AdjustWindowRectEx(&rWndRect, dwStyle, FALSE, dwExStyle); + int width = rWndRect.right - rWndRect.left; + int height = rWndRect.bottom - rWndRect.top; + + olc_hWnd = CreateWindowEx(dwExStyle, olcT("OLC_PIXEL_GAME_ENGINE"), olcT(""), dwStyle, + vTopLeft.x, vTopLeft.y, width, height, NULL, NULL, GetModuleHandle(nullptr), this); + + DragAcceptFiles(olc_hWnd, true); + + // Create Keyboard Mapping + mapKeys[0x00] = Key::NONE; + mapKeys[0x41] = Key::A; mapKeys[0x42] = Key::B; mapKeys[0x43] = Key::C; mapKeys[0x44] = Key::D; mapKeys[0x45] = Key::E; + mapKeys[0x46] = Key::F; mapKeys[0x47] = Key::G; mapKeys[0x48] = Key::H; mapKeys[0x49] = Key::I; mapKeys[0x4A] = Key::J; + mapKeys[0x4B] = Key::K; mapKeys[0x4C] = Key::L; mapKeys[0x4D] = Key::M; mapKeys[0x4E] = Key::N; mapKeys[0x4F] = Key::O; + mapKeys[0x50] = Key::P; mapKeys[0x51] = Key::Q; mapKeys[0x52] = Key::R; mapKeys[0x53] = Key::S; mapKeys[0x54] = Key::T; + mapKeys[0x55] = Key::U; mapKeys[0x56] = Key::V; mapKeys[0x57] = Key::W; mapKeys[0x58] = Key::X; mapKeys[0x59] = Key::Y; + mapKeys[0x5A] = Key::Z; + + mapKeys[VK_F1] = Key::F1; mapKeys[VK_F2] = Key::F2; mapKeys[VK_F3] = Key::F3; mapKeys[VK_F4] = Key::F4; + mapKeys[VK_F5] = Key::F5; mapKeys[VK_F6] = Key::F6; mapKeys[VK_F7] = Key::F7; mapKeys[VK_F8] = Key::F8; + mapKeys[VK_F9] = Key::F9; mapKeys[VK_F10] = Key::F10; mapKeys[VK_F11] = Key::F11; mapKeys[VK_F12] = Key::F12; + + mapKeys[VK_DOWN] = Key::DOWN; mapKeys[VK_LEFT] = Key::LEFT; mapKeys[VK_RIGHT] = Key::RIGHT; mapKeys[VK_UP] = Key::UP; + //mapKeys[VK_RETURN] = Key::ENTER;// mapKeys[VK_RETURN] = Key::RETURN; + + mapKeys[VK_BACK] = Key::BACK; mapKeys[VK_ESCAPE] = Key::ESCAPE; mapKeys[VK_RETURN] = Key::ENTER; mapKeys[VK_PAUSE] = Key::PAUSE; + mapKeys[VK_SCROLL] = Key::SCROLL; mapKeys[VK_TAB] = Key::TAB; mapKeys[VK_DELETE] = Key::DEL; mapKeys[VK_HOME] = Key::HOME; + mapKeys[VK_END] = Key::END; mapKeys[VK_PRIOR] = Key::PGUP; mapKeys[VK_NEXT] = Key::PGDN; mapKeys[VK_INSERT] = Key::INS; + mapKeys[VK_SHIFT] = Key::SHIFT; mapKeys[VK_CONTROL] = Key::CTRL; + mapKeys[VK_SPACE] = Key::SPACE; + + mapKeys[0x30] = Key::K0; mapKeys[0x31] = Key::K1; mapKeys[0x32] = Key::K2; mapKeys[0x33] = Key::K3; mapKeys[0x34] = Key::K4; + mapKeys[0x35] = Key::K5; mapKeys[0x36] = Key::K6; mapKeys[0x37] = Key::K7; mapKeys[0x38] = Key::K8; mapKeys[0x39] = Key::K9; + + mapKeys[VK_NUMPAD0] = Key::NP0; mapKeys[VK_NUMPAD1] = Key::NP1; mapKeys[VK_NUMPAD2] = Key::NP2; mapKeys[VK_NUMPAD3] = Key::NP3; mapKeys[VK_NUMPAD4] = Key::NP4; + mapKeys[VK_NUMPAD5] = Key::NP5; mapKeys[VK_NUMPAD6] = Key::NP6; mapKeys[VK_NUMPAD7] = Key::NP7; mapKeys[VK_NUMPAD8] = Key::NP8; mapKeys[VK_NUMPAD9] = Key::NP9; + mapKeys[VK_MULTIPLY] = Key::NP_MUL; mapKeys[VK_ADD] = Key::NP_ADD; mapKeys[VK_DIVIDE] = Key::NP_DIV; mapKeys[VK_SUBTRACT] = Key::NP_SUB; mapKeys[VK_DECIMAL] = Key::NP_DECIMAL; + + // Thanks scripticuk + mapKeys[VK_OEM_1] = Key::OEM_1; // On US and UK keyboards this is the ';:' key + mapKeys[VK_OEM_2] = Key::OEM_2; // On US and UK keyboards this is the '/?' key + mapKeys[VK_OEM_3] = Key::OEM_3; // On US keyboard this is the '~' key + mapKeys[VK_OEM_4] = Key::OEM_4; // On US and UK keyboards this is the '[{' key + mapKeys[VK_OEM_5] = Key::OEM_5; // On US keyboard this is '\|' key. + mapKeys[VK_OEM_6] = Key::OEM_6; // On US and UK keyboards this is the ']}' key + mapKeys[VK_OEM_7] = Key::OEM_7; // On US keyboard this is the single/double quote key. On UK, this is the single quote/@ symbol key + mapKeys[VK_OEM_8] = Key::OEM_8; // miscellaneous characters. Varies by keyboard + mapKeys[VK_OEM_PLUS] = Key::EQUALS; // the '+' key on any keyboard + mapKeys[VK_OEM_COMMA] = Key::COMMA; // the comma key on any keyboard + mapKeys[VK_OEM_MINUS] = Key::MINUS; // the minus key on any keyboard + mapKeys[VK_OEM_PERIOD] = Key::PERIOD; // the period key on any keyboard + mapKeys[VK_CAPITAL] = Key::CAPS_LOCK; + return olc::OK; + } + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { +#ifdef UNICODE + SetWindowText(olc_hWnd, ConvertS2W(s).c_str()); +#else + SetWindowText(olc_hWnd, s.c_str()); +#endif + return olc::OK; + } + + virtual olc::rcode StartSystemEventLoop() override + { + MSG msg; + while (GetMessage(&msg, NULL, 0, 0) > 0) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + return olc::OK; + } + + virtual olc::rcode HandleSystemEvent() override { return olc::rcode::FAIL; } + + // Windows Event Handler - this is statically connected to the windows event system + static LRESULT CALLBACK olc_WindowEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) + { + switch (uMsg) + { + case WM_MOUSEMOVE: + { + // Thanks @ForAbby (Discord) + uint16_t x = lParam & 0xFFFF; uint16_t y = (lParam >> 16) & 0xFFFF; + int16_t ix = *(int16_t*)&x; int16_t iy = *(int16_t*)&y; + ptrPGE->olc_UpdateMouse(ix, iy); + return 0; + } + case WM_SIZE: ptrPGE->olc_UpdateWindowSize(lParam & 0xFFFF, (lParam >> 16) & 0xFFFF); return 0; + case WM_MOUSEWHEEL: ptrPGE->olc_UpdateMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam)); return 0; + case WM_MOUSELEAVE: ptrPGE->olc_UpdateMouseFocus(false); return 0; + case WM_SETFOCUS: ptrPGE->olc_UpdateKeyFocus(true); return 0; + case WM_KILLFOCUS: ptrPGE->olc_UpdateKeyFocus(false); return 0; + case WM_KEYDOWN: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], true); return 0; + case WM_KEYUP: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], false); return 0; + case WM_SYSKEYDOWN: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], true); return 0; + case WM_SYSKEYUP: ptrPGE->olc_UpdateKeyState(mapKeys[wParam], false); return 0; + case WM_LBUTTONDOWN:ptrPGE->olc_UpdateMouseState(0, true); return 0; + case WM_LBUTTONUP: ptrPGE->olc_UpdateMouseState(0, false); return 0; + case WM_RBUTTONDOWN:ptrPGE->olc_UpdateMouseState(1, true); return 0; + case WM_RBUTTONUP: ptrPGE->olc_UpdateMouseState(1, false); return 0; + case WM_MBUTTONDOWN:ptrPGE->olc_UpdateMouseState(2, true); return 0; + case WM_MBUTTONUP: ptrPGE->olc_UpdateMouseState(2, false); return 0; + case WM_DROPFILES: + { + // This is all eww... + HDROP drop = (HDROP)wParam; + + uint32_t nFiles = DragQueryFile(drop, 0xFFFFFFFF, nullptr, 0); + std::vector vFiles; + for (uint32_t i = 0; i < nFiles; i++) + { + TCHAR dfbuffer[256]{}; + uint32_t len = DragQueryFile(drop, i, nullptr, 0); + DragQueryFile(drop, i, dfbuffer, 256); +#ifdef UNICODE +#ifdef __MINGW32__ + char* buffer = new char[len + 1]; + wcstombs(buffer, dfbuffer, len); + buffer[len] = '\0'; +#else + int count = WideCharToMultiByte(CP_UTF8, 0, dfbuffer, -1, NULL, 0, NULL, NULL); + char* buffer = new char[count]; + WideCharToMultiByte(CP_UTF8, 0, dfbuffer, -1, buffer, count, NULL, NULL); +#endif + vFiles.push_back(std::string(buffer)); + delete[] buffer; +#else + vFiles.push_back(std::string(dfbuffer)); +#endif + } + + // Even more eww... + POINT p; DragQueryPoint(drop, &p); + ptrPGE->olc_DropFiles(p.x, p.y, vFiles); + DragFinish(drop); + return 0; + } + break; + + + case WM_CLOSE: ptrPGE->olc_Terminate(); return 0; + case WM_DESTROY: PostQuitMessage(0); DestroyWindow(hWnd); return 0; + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: MICROSOFT WINDOWS XP, VISTA, 7, 8, 10 | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region platform_linux +// O------------------------------------------------------------------------------O +// | START PLATFORM: LINUX | +// O------------------------------------------------------------------------------O +#if defined(OLC_PLATFORM_X11) +namespace olc +{ + class Platform_Linux : public olc::Platform + { + private: + X11::Display* olc_Display = nullptr; + X11::Window olc_WindowRoot; + X11::Window olc_Window; + X11::XVisualInfo* olc_VisualInfo; + X11::Colormap olc_ColourMap; + X11::XSetWindowAttributes olc_SetWindowAttribs; + + public: + virtual olc::rcode ApplicationStartUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ApplicationCleanUp() override + { + XDestroyWindow(olc_Display, olc_Window); + return olc::rcode::OK; + } + + virtual olc::rcode ThreadStartUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ThreadCleanUp() override + { + renderer->DestroyDevice(); + return olc::OK; + } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({ olc_Display, &olc_Window, olc_VisualInfo }, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { + using namespace X11; + XInitThreads(); + + // Grab the deafult display and window + olc_Display = XOpenDisplay(NULL); + olc_WindowRoot = DefaultRootWindow(olc_Display); + + // Based on the display capabilities, configure the appearance of the window + GLint olc_GLAttribs[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None }; + olc_VisualInfo = glXChooseVisual(olc_Display, 0, olc_GLAttribs); + olc_ColourMap = XCreateColormap(olc_Display, olc_WindowRoot, olc_VisualInfo->visual, AllocNone); + olc_SetWindowAttribs.colormap = olc_ColourMap; + + // Register which events we are interested in receiving + olc_SetWindowAttribs.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | FocusChangeMask | StructureNotifyMask; + + // Create the window + olc_Window = XCreateWindow(olc_Display, olc_WindowRoot, vWindowPos.x, vWindowPos.y, + vWindowSize.x, vWindowSize.y, + 0, olc_VisualInfo->depth, InputOutput, olc_VisualInfo->visual, + CWColormap | CWEventMask, &olc_SetWindowAttribs); + + Atom wmDelete = XInternAtom(olc_Display, "WM_DELETE_WINDOW", true); + XSetWMProtocols(olc_Display, olc_Window, &wmDelete, 1); + + XMapWindow(olc_Display, olc_Window); + XStoreName(olc_Display, olc_Window, "OneLoneCoder.com - Pixel Game Engine"); + + if (bFullScreen) // Thanks DragonEye, again :D + { + Atom wm_state; + Atom fullscreen; + wm_state = XInternAtom(olc_Display, "_NET_WM_STATE", False); + fullscreen = XInternAtom(olc_Display, "_NET_WM_STATE_FULLSCREEN", False); + XEvent xev{ 0 }; + xev.type = ClientMessage; + xev.xclient.window = olc_Window; + xev.xclient.message_type = wm_state; + xev.xclient.format = 32; + xev.xclient.data.l[0] = (bFullScreen ? 1 : 0); // the action (0: off, 1: on, 2: toggle) + xev.xclient.data.l[1] = fullscreen; // first property to alter + xev.xclient.data.l[2] = 0; // second property to alter + xev.xclient.data.l[3] = 0; // source indication + XMapWindow(olc_Display, olc_Window); + XSendEvent(olc_Display, DefaultRootWindow(olc_Display), False, + SubstructureRedirectMask | SubstructureNotifyMask, &xev); + XFlush(olc_Display); + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, olc_Window, &gwa); + vWindowSize.x = gwa.width; + vWindowSize.y = gwa.height; + } + + // Create Keyboard Mapping + mapKeys[0x00] = Key::NONE; + mapKeys[0x61] = Key::A; mapKeys[0x62] = Key::B; mapKeys[0x63] = Key::C; mapKeys[0x64] = Key::D; mapKeys[0x65] = Key::E; + mapKeys[0x66] = Key::F; mapKeys[0x67] = Key::G; mapKeys[0x68] = Key::H; mapKeys[0x69] = Key::I; mapKeys[0x6A] = Key::J; + mapKeys[0x6B] = Key::K; mapKeys[0x6C] = Key::L; mapKeys[0x6D] = Key::M; mapKeys[0x6E] = Key::N; mapKeys[0x6F] = Key::O; + mapKeys[0x70] = Key::P; mapKeys[0x71] = Key::Q; mapKeys[0x72] = Key::R; mapKeys[0x73] = Key::S; mapKeys[0x74] = Key::T; + mapKeys[0x75] = Key::U; mapKeys[0x76] = Key::V; mapKeys[0x77] = Key::W; mapKeys[0x78] = Key::X; mapKeys[0x79] = Key::Y; + mapKeys[0x7A] = Key::Z; + + mapKeys[XK_F1] = Key::F1; mapKeys[XK_F2] = Key::F2; mapKeys[XK_F3] = Key::F3; mapKeys[XK_F4] = Key::F4; + mapKeys[XK_F5] = Key::F5; mapKeys[XK_F6] = Key::F6; mapKeys[XK_F7] = Key::F7; mapKeys[XK_F8] = Key::F8; + mapKeys[XK_F9] = Key::F9; mapKeys[XK_F10] = Key::F10; mapKeys[XK_F11] = Key::F11; mapKeys[XK_F12] = Key::F12; + + mapKeys[XK_Down] = Key::DOWN; mapKeys[XK_Left] = Key::LEFT; mapKeys[XK_Right] = Key::RIGHT; mapKeys[XK_Up] = Key::UP; + mapKeys[XK_KP_Enter] = Key::ENTER; mapKeys[XK_Return] = Key::ENTER; + + mapKeys[XK_BackSpace] = Key::BACK; mapKeys[XK_Escape] = Key::ESCAPE; mapKeys[XK_Linefeed] = Key::ENTER; mapKeys[XK_Pause] = Key::PAUSE; + mapKeys[XK_Scroll_Lock] = Key::SCROLL; mapKeys[XK_Tab] = Key::TAB; mapKeys[XK_Delete] = Key::DEL; mapKeys[XK_Home] = Key::HOME; + mapKeys[XK_End] = Key::END; mapKeys[XK_Page_Up] = Key::PGUP; mapKeys[XK_Page_Down] = Key::PGDN; mapKeys[XK_Insert] = Key::INS; + mapKeys[XK_Shift_L] = Key::SHIFT; mapKeys[XK_Shift_R] = Key::SHIFT; mapKeys[XK_Control_L] = Key::CTRL; mapKeys[XK_Control_R] = Key::CTRL; + mapKeys[XK_space] = Key::SPACE; mapKeys[XK_period] = Key::PERIOD; + + mapKeys[XK_0] = Key::K0; mapKeys[XK_1] = Key::K1; mapKeys[XK_2] = Key::K2; mapKeys[XK_3] = Key::K3; mapKeys[XK_4] = Key::K4; + mapKeys[XK_5] = Key::K5; mapKeys[XK_6] = Key::K6; mapKeys[XK_7] = Key::K7; mapKeys[XK_8] = Key::K8; mapKeys[XK_9] = Key::K9; + + mapKeys[XK_KP_0] = Key::NP0; mapKeys[XK_KP_1] = Key::NP1; mapKeys[XK_KP_2] = Key::NP2; mapKeys[XK_KP_3] = Key::NP3; mapKeys[XK_KP_4] = Key::NP4; + mapKeys[XK_KP_5] = Key::NP5; mapKeys[XK_KP_6] = Key::NP6; mapKeys[XK_KP_7] = Key::NP7; mapKeys[XK_KP_8] = Key::NP8; mapKeys[XK_KP_9] = Key::NP9; + mapKeys[XK_KP_Multiply] = Key::NP_MUL; mapKeys[XK_KP_Add] = Key::NP_ADD; mapKeys[XK_KP_Divide] = Key::NP_DIV; mapKeys[XK_KP_Subtract] = Key::NP_SUB; mapKeys[XK_KP_Decimal] = Key::NP_DECIMAL; + + // These keys vary depending on the keyboard. I've included comments for US and UK keyboard layouts + mapKeys[XK_semicolon] = Key::OEM_1; // On US and UK keyboards this is the ';:' key + mapKeys[XK_slash] = Key::OEM_2; // On US and UK keyboards this is the '/?' key + mapKeys[XK_asciitilde] = Key::OEM_3; // On US keyboard this is the '~' key + mapKeys[XK_bracketleft] = Key::OEM_4; // On US and UK keyboards this is the '[{' key + mapKeys[XK_backslash] = Key::OEM_5; // On US keyboard this is '\|' key. + mapKeys[XK_bracketright] = Key::OEM_6; // On US and UK keyboards this is the ']}' key + mapKeys[XK_apostrophe] = Key::OEM_7; // On US keyboard this is the single/double quote key. On UK, this is the single quote/@ symbol key + mapKeys[XK_numbersign] = Key::OEM_8; // miscellaneous characters. Varies by keyboard. I believe this to be the '#~' key on UK keyboards + mapKeys[XK_equal] = Key::EQUALS; // the '+' key on any keyboard + mapKeys[XK_comma] = Key::COMMA; // the comma key on any keyboard + mapKeys[XK_minus] = Key::MINUS; // the minus key on any keyboard + + mapKeys[XK_Caps_Lock] = Key::CAPS_LOCK; + + return olc::OK; + } + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { + X11::XStoreName(olc_Display, olc_Window, s.c_str()); + return olc::OK; + } + + virtual olc::rcode StartSystemEventLoop() override + { + return olc::OK; + } + + virtual olc::rcode HandleSystemEvent() override + { + using namespace X11; + // Handle Xlib Message Loop - we do this in the + // same thread that OpenGL was created so we dont + // need to worry too much about multithreading with X11 + XEvent xev; + while (XPending(olc_Display)) + { + XNextEvent(olc_Display, &xev); + if (xev.type == Expose) + { + XWindowAttributes gwa; + XGetWindowAttributes(olc_Display, olc_Window, &gwa); + ptrPGE->olc_UpdateWindowSize(gwa.width, gwa.height); + } + else if (xev.type == ConfigureNotify) + { + XConfigureEvent xce = xev.xconfigure; + ptrPGE->olc_UpdateWindowSize(xce.width, xce.height); + } + else if (xev.type == KeyPress) + { + KeySym sym = XLookupKeysym(&xev.xkey, 0); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], true); + XKeyEvent* e = (XKeyEvent*)&xev; // Because DragonEye loves numpads + XLookupString(e, NULL, 0, &sym, NULL); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], true); + } + else if (xev.type == KeyRelease) + { + KeySym sym = XLookupKeysym(&xev.xkey, 0); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], false); + XKeyEvent* e = (XKeyEvent*)&xev; + XLookupString(e, NULL, 0, &sym, NULL); + ptrPGE->olc_UpdateKeyState(mapKeys[sym], false); + } + else if (xev.type == ButtonPress) + { + switch (xev.xbutton.button) + { + case 1: ptrPGE->olc_UpdateMouseState(0, true); break; + case 2: ptrPGE->olc_UpdateMouseState(2, true); break; + case 3: ptrPGE->olc_UpdateMouseState(1, true); break; + case 4: ptrPGE->olc_UpdateMouseWheel(120); break; + case 5: ptrPGE->olc_UpdateMouseWheel(-120); break; + default: break; + } + } + else if (xev.type == ButtonRelease) + { + switch (xev.xbutton.button) + { + case 1: ptrPGE->olc_UpdateMouseState(0, false); break; + case 2: ptrPGE->olc_UpdateMouseState(2, false); break; + case 3: ptrPGE->olc_UpdateMouseState(1, false); break; + default: break; + } + } + else if (xev.type == MotionNotify) + { + ptrPGE->olc_UpdateMouse(xev.xmotion.x, xev.xmotion.y); + } + else if (xev.type == FocusIn) + { + ptrPGE->olc_UpdateKeyFocus(true); + } + else if (xev.type == FocusOut) + { + ptrPGE->olc_UpdateKeyFocus(false); + } + else if (xev.type == ClientMessage) + { + ptrPGE->olc_Terminate(); + } + } + return olc::OK; + } + }; +} +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: LINUX | +// O------------------------------------------------------------------------------O +#pragma endregion + +#pragma region platform_glut +// O------------------------------------------------------------------------------O +// | START PLATFORM: GLUT (used to make it simple for Apple) | +// O------------------------------------------------------------------------------O +// +// VERY IMPORTANT!!! The Apple port was originally created by @Mumflr (discord) +// and the repo for the development of this project can be found here: +// https://github.com/MumflrFumperdink/olcPGEMac which contains maccy goodness +// and support on how to setup your build environment. +// +// "MASSIVE MASSIVE THANKS TO MUMFLR" - Javidx9 +#if defined(OLC_PLATFORM_GLUT) +namespace olc { + + class Platform_GLUT : public olc::Platform + { + public: + static std::atomic* bActiveRef; + + virtual olc::rcode ApplicationStartUp() override { + return olc::rcode::OK; + } + + virtual olc::rcode ApplicationCleanUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ThreadStartUp() override + { + return olc::rcode::OK; + } + + virtual olc::rcode ThreadCleanUp() override + { + renderer->DestroyDevice(); + return olc::OK; + } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({}, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + static void ExitMainLoop() { + if (!ptrPGE->OnUserDestroy()) { + *bActiveRef = true; + return; + } + platform->ThreadCleanUp(); + platform->ApplicationCleanUp(); + exit(0); + } + +#if defined(__APPLE__) + static void scrollWheelUpdate(id selff, SEL _sel, id theEvent) { + static const SEL deltaYSel = sel_registerName("deltaY"); + +#if defined(__aarch64__) // Thanks ruarq! + double deltaY = ((double (*)(id, SEL))objc_msgSend)(theEvent, deltaYSel); +#else + double deltaY = ((double (*)(id, SEL))objc_msgSend_fpret)(theEvent, deltaYSel); +#endif + + for (int i = 0; i < abs(deltaY); i++) { + if (deltaY > 0) { + ptrPGE->olc_UpdateMouseWheel(-1); + } + else if (deltaY < 0) { + ptrPGE->olc_UpdateMouseWheel(1); + } + } + } +#endif + static void ThreadFunct() { +#if defined(__APPLE__) + static bool hasEnabledCocoa = false; + if (!hasEnabledCocoa) { + // Objective-C Wizardry + Class NSApplicationClass = objc_getClass("NSApplication"); + + // NSApp = [NSApplication sharedApplication] + SEL sharedApplicationSel = sel_registerName("sharedApplication"); + id NSApp = ((id(*)(Class, SEL))objc_msgSend)(NSApplicationClass, sharedApplicationSel); + // window = [NSApp mainWindow] + SEL mainWindowSel = sel_registerName("mainWindow"); + id window = ((id(*)(id, SEL))objc_msgSend)(NSApp, mainWindowSel); + + // [window setStyleMask: NSWindowStyleMaskClosable | ~NSWindowStyleMaskResizable] + SEL setStyleMaskSel = sel_registerName("setStyleMask:"); + ((void (*)(id, SEL, NSUInteger))objc_msgSend)(window, setStyleMaskSel, 7); + + hasEnabledCocoa = true; + } +#endif + if (!*bActiveRef) { + ExitMainLoop(); + return; + } + glutPostRedisplay(); + } + + static void DrawFunct() { + ptrPGE->olc_CoreUpdate(); + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { +#if defined(__APPLE__) + Class GLUTViewClass = objc_getClass("GLUTView"); + + SEL scrollWheelSel = sel_registerName("scrollWheel:"); + bool resultAddMethod = class_addMethod(GLUTViewClass, scrollWheelSel, (IMP)scrollWheelUpdate, "v@:@"); + assert(resultAddMethod); +#endif + + renderer->PrepareDevice(); + + if (bFullScreen) + { + vWindowSize.x = glutGet(GLUT_SCREEN_WIDTH); + vWindowSize.y = glutGet(GLUT_SCREEN_HEIGHT); + glutFullScreen(); + } + else + { + if (vWindowSize.x > glutGet(GLUT_SCREEN_WIDTH) || vWindowSize.y > glutGet(GLUT_SCREEN_HEIGHT)) + { + perror("ERROR: The specified window dimensions do not fit on your screen\n"); + return olc::FAIL; + } + glutReshapeWindow(vWindowSize.x, vWindowSize.y - 1); + } + + // Create Keyboard Mapping + mapKeys[0x00] = Key::NONE; + mapKeys['A'] = Key::A; mapKeys['B'] = Key::B; mapKeys['C'] = Key::C; mapKeys['D'] = Key::D; mapKeys['E'] = Key::E; + mapKeys['F'] = Key::F; mapKeys['G'] = Key::G; mapKeys['H'] = Key::H; mapKeys['I'] = Key::I; mapKeys['J'] = Key::J; + mapKeys['K'] = Key::K; mapKeys['L'] = Key::L; mapKeys['M'] = Key::M; mapKeys['N'] = Key::N; mapKeys['O'] = Key::O; + mapKeys['P'] = Key::P; mapKeys['Q'] = Key::Q; mapKeys['R'] = Key::R; mapKeys['S'] = Key::S; mapKeys['T'] = Key::T; + mapKeys['U'] = Key::U; mapKeys['V'] = Key::V; mapKeys['W'] = Key::W; mapKeys['X'] = Key::X; mapKeys['Y'] = Key::Y; + mapKeys['Z'] = Key::Z; + + mapKeys[GLUT_KEY_F1] = Key::F1; mapKeys[GLUT_KEY_F2] = Key::F2; mapKeys[GLUT_KEY_F3] = Key::F3; mapKeys[GLUT_KEY_F4] = Key::F4; + mapKeys[GLUT_KEY_F5] = Key::F5; mapKeys[GLUT_KEY_F6] = Key::F6; mapKeys[GLUT_KEY_F7] = Key::F7; mapKeys[GLUT_KEY_F8] = Key::F8; + mapKeys[GLUT_KEY_F9] = Key::F9; mapKeys[GLUT_KEY_F10] = Key::F10; mapKeys[GLUT_KEY_F11] = Key::F11; mapKeys[GLUT_KEY_F12] = Key::F12; + + mapKeys[GLUT_KEY_DOWN] = Key::DOWN; mapKeys[GLUT_KEY_LEFT] = Key::LEFT; mapKeys[GLUT_KEY_RIGHT] = Key::RIGHT; mapKeys[GLUT_KEY_UP] = Key::UP; + mapKeys[13] = Key::ENTER; + + mapKeys[127] = Key::BACK; mapKeys[27] = Key::ESCAPE; + mapKeys[9] = Key::TAB; mapKeys[GLUT_KEY_HOME] = Key::HOME; + mapKeys[GLUT_KEY_END] = Key::END; mapKeys[GLUT_KEY_PAGE_UP] = Key::PGUP; mapKeys[GLUT_KEY_PAGE_DOWN] = Key::PGDN; mapKeys[GLUT_KEY_INSERT] = Key::INS; + mapKeys[32] = Key::SPACE; mapKeys[46] = Key::PERIOD; + + mapKeys[48] = Key::K0; mapKeys[49] = Key::K1; mapKeys[50] = Key::K2; mapKeys[51] = Key::K3; mapKeys[52] = Key::K4; + mapKeys[53] = Key::K5; mapKeys[54] = Key::K6; mapKeys[55] = Key::K7; mapKeys[56] = Key::K8; mapKeys[57] = Key::K9; + + // NOTE: MISSING KEYS :O + + glutKeyboardFunc([](unsigned char key, int x, int y) -> void { + switch (glutGetModifiers()) { + case 0: //This is when there are no modifiers + if ('a' <= key && key <= 'z') key -= 32; + break; + case GLUT_ACTIVE_SHIFT: + ptrPGE->olc_UpdateKeyState(Key::SHIFT, true); + break; + case GLUT_ACTIVE_CTRL: + if ('a' <= key && key <= 'z') key -= 32; + ptrPGE->olc_UpdateKeyState(Key::CTRL, true); + break; + case GLUT_ACTIVE_ALT: + if ('a' <= key && key <= 'z') key -= 32; + break; + } + + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], true); + }); + + glutKeyboardUpFunc([](unsigned char key, int x, int y) -> void { + switch (glutGetModifiers()) { + case 0: //This is when there are no modifiers + if ('a' <= key && key <= 'z') key -= 32; + break; + case GLUT_ACTIVE_SHIFT: + ptrPGE->olc_UpdateKeyState(Key::SHIFT, false); + break; + case GLUT_ACTIVE_CTRL: + if ('a' <= key && key <= 'z') key -= 32; + ptrPGE->olc_UpdateKeyState(Key::CTRL, false); + break; + case GLUT_ACTIVE_ALT: + if ('a' <= key && key <= 'z') key -= 32; + //No ALT in PGE + break; + } + + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], false); + }); + + //Special keys + glutSpecialFunc([](int key, int x, int y) -> void { + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], true); + }); + + glutSpecialUpFunc([](int key, int x, int y) -> void { + if (mapKeys[key]) + ptrPGE->olc_UpdateKeyState(mapKeys[key], false); + }); + + glutMouseFunc([](int button, int state, int x, int y) -> void { + switch (button) { + case GLUT_LEFT_BUTTON: + if (state == GLUT_UP) ptrPGE->olc_UpdateMouseState(0, false); + else if (state == GLUT_DOWN) ptrPGE->olc_UpdateMouseState(0, true); + break; + case GLUT_MIDDLE_BUTTON: + if (state == GLUT_UP) ptrPGE->olc_UpdateMouseState(2, false); + else if (state == GLUT_DOWN) ptrPGE->olc_UpdateMouseState(2, true); + break; + case GLUT_RIGHT_BUTTON: + if (state == GLUT_UP) ptrPGE->olc_UpdateMouseState(1, false); + else if (state == GLUT_DOWN) ptrPGE->olc_UpdateMouseState(1, true); + break; + } + }); + + auto mouseMoveCall = [](int x, int y) -> void { + ptrPGE->olc_UpdateMouse(x, y); + }; + + glutMotionFunc(mouseMoveCall); + glutPassiveMotionFunc(mouseMoveCall); + + glutEntryFunc([](int state) -> void { + if (state == GLUT_ENTERED) ptrPGE->olc_UpdateKeyFocus(true); + else if (state == GLUT_LEFT) ptrPGE->olc_UpdateKeyFocus(false); + }); + + glutDisplayFunc(DrawFunct); + glutIdleFunc(ThreadFunct); + + return olc::OK; + } + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { + glutSetWindowTitle(s.c_str()); + return olc::OK; + } + + virtual olc::rcode StartSystemEventLoop() override { + glutMainLoop(); + return olc::OK; + } + + virtual olc::rcode HandleSystemEvent() override + { + return olc::OK; + } + }; + + std::atomic* Platform_GLUT::bActiveRef{ nullptr }; + + //Custom Start + olc::rcode PixelGameEngine::Start() + { + if (platform->ApplicationStartUp() != olc::OK) return olc::FAIL; + + // Construct the window + if (platform->CreateWindowPane({ 30,30 }, vWindowSize, bFullScreen) != olc::OK) return olc::FAIL; + olc_UpdateWindowSize(vWindowSize.x, vWindowSize.y); + + if (platform->ThreadStartUp() == olc::FAIL) return olc::FAIL; + olc_PrepareEngine(); + if (!OnUserCreate()) return olc::FAIL; + Platform_GLUT::bActiveRef = &bAtomActive; + glutWMCloseFunc(Platform_GLUT::ExitMainLoop); + bAtomActive = true; + platform->StartSystemEventLoop(); + + //This code will not even be run but why not + if (platform->ApplicationCleanUp() != olc::OK) return olc::FAIL; + + return olc::OK; + } +} + +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: GLUT | +// O------------------------------------------------------------------------------O +#pragma endregion + + + + + +#pragma region platform_emscripten +// O------------------------------------------------------------------------------O +// | START PLATFORM: Emscripten - Totally Game Changing... | +// O------------------------------------------------------------------------------O + +// +// Firstly a big mega thank you to members of the OLC Community for sorting this +// out. Making a browser compatible version has been a priority for quite some +// time, but I lacked the expertise to do it. This awesome feature is possible +// because a group of former strangers got together and formed friendships over +// their shared passion for code. If anything demonstrates how powerful helping +// each other can be, it's this. - Javidx9 + +// Emscripten Platform: MaGetzUb, Moros1138, Slavka, Dandistine, Gorbit99, Bispoo +// also: Ishidex, Gusgo99, SlicEnDicE, Alexio + + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + +#include +#include + +extern "C" +{ + EMSCRIPTEN_KEEPALIVE inline int olc_OnPageUnload() + { olc::platform->ApplicationCleanUp(); return 0; } +} + +namespace olc +{ + class Platform_Emscripten : public olc::Platform + { + public: + + virtual olc::rcode ApplicationStartUp() override + { return olc::rcode::OK; } + + virtual olc::rcode ApplicationCleanUp() override + { ThreadCleanUp(); return olc::rcode::OK; } + + virtual olc::rcode ThreadStartUp() override + { return olc::rcode::OK; } + + virtual olc::rcode ThreadCleanUp() override + { renderer->DestroyDevice(); return olc::OK; } + + virtual olc::rcode CreateGraphics(bool bFullScreen, bool bEnableVSYNC, const olc::vi2d& vViewPos, const olc::vi2d& vViewSize) override + { + if (renderer->CreateDevice({}, bFullScreen, bEnableVSYNC) == olc::rcode::OK) + { + renderer->UpdateViewport(vViewPos, vViewSize); + return olc::rcode::OK; + } + else + return olc::rcode::FAIL; + } + + virtual olc::rcode CreateWindowPane(const olc::vi2d& vWindowPos, olc::vi2d& vWindowSize, bool bFullScreen) override + { + emscripten_set_canvas_element_size("#canvas", vWindowSize.x, vWindowSize.y); + + mapKeys[DOM_PK_UNKNOWN] = Key::NONE; + mapKeys[DOM_PK_A] = Key::A; mapKeys[DOM_PK_B] = Key::B; mapKeys[DOM_PK_C] = Key::C; mapKeys[DOM_PK_D] = Key::D; + mapKeys[DOM_PK_E] = Key::E; mapKeys[DOM_PK_F] = Key::F; mapKeys[DOM_PK_G] = Key::G; mapKeys[DOM_PK_H] = Key::H; + mapKeys[DOM_PK_I] = Key::I; mapKeys[DOM_PK_J] = Key::J; mapKeys[DOM_PK_K] = Key::K; mapKeys[DOM_PK_L] = Key::L; + mapKeys[DOM_PK_M] = Key::M; mapKeys[DOM_PK_N] = Key::N; mapKeys[DOM_PK_O] = Key::O; mapKeys[DOM_PK_P] = Key::P; + mapKeys[DOM_PK_Q] = Key::Q; mapKeys[DOM_PK_R] = Key::R; mapKeys[DOM_PK_S] = Key::S; mapKeys[DOM_PK_T] = Key::T; + mapKeys[DOM_PK_U] = Key::U; mapKeys[DOM_PK_V] = Key::V; mapKeys[DOM_PK_W] = Key::W; mapKeys[DOM_PK_X] = Key::X; + mapKeys[DOM_PK_Y] = Key::Y; mapKeys[DOM_PK_Z] = Key::Z; + mapKeys[DOM_PK_0] = Key::K0; mapKeys[DOM_PK_1] = Key::K1; mapKeys[DOM_PK_2] = Key::K2; + mapKeys[DOM_PK_3] = Key::K3; mapKeys[DOM_PK_4] = Key::K4; mapKeys[DOM_PK_5] = Key::K5; + mapKeys[DOM_PK_6] = Key::K6; mapKeys[DOM_PK_7] = Key::K7; mapKeys[DOM_PK_8] = Key::K8; + mapKeys[DOM_PK_9] = Key::K9; + mapKeys[DOM_PK_F1] = Key::F1; mapKeys[DOM_PK_F2] = Key::F2; mapKeys[DOM_PK_F3] = Key::F3; mapKeys[DOM_PK_F4] = Key::F4; + mapKeys[DOM_PK_F5] = Key::F5; mapKeys[DOM_PK_F6] = Key::F6; mapKeys[DOM_PK_F7] = Key::F7; mapKeys[DOM_PK_F8] = Key::F8; + mapKeys[DOM_PK_F9] = Key::F9; mapKeys[DOM_PK_F10] = Key::F10; mapKeys[DOM_PK_F11] = Key::F11; mapKeys[DOM_PK_F12] = Key::F12; + mapKeys[DOM_PK_ARROW_UP] = Key::UP; mapKeys[DOM_PK_ARROW_DOWN] = Key::DOWN; + mapKeys[DOM_PK_ARROW_LEFT] = Key::LEFT; mapKeys[DOM_PK_ARROW_RIGHT] = Key::RIGHT; + mapKeys[DOM_PK_SPACE] = Key::SPACE; mapKeys[DOM_PK_TAB] = Key::TAB; + mapKeys[DOM_PK_SHIFT_LEFT] = Key::SHIFT; mapKeys[DOM_PK_SHIFT_RIGHT] = Key::SHIFT; + mapKeys[DOM_PK_CONTROL_LEFT] = Key::CTRL; mapKeys[DOM_PK_CONTROL_RIGHT] = Key::CTRL; + mapKeys[DOM_PK_INSERT] = Key::INS; mapKeys[DOM_PK_DELETE] = Key::DEL; mapKeys[DOM_PK_HOME] = Key::HOME; + mapKeys[DOM_PK_END] = Key::END; mapKeys[DOM_PK_PAGE_UP] = Key::PGUP; mapKeys[DOM_PK_PAGE_DOWN] = Key::PGDN; + mapKeys[DOM_PK_BACKSPACE] = Key::BACK; mapKeys[DOM_PK_ESCAPE] = Key::ESCAPE; + mapKeys[DOM_PK_ENTER] = Key::ENTER; mapKeys[DOM_PK_NUMPAD_EQUAL] = Key::EQUALS; + mapKeys[DOM_PK_NUMPAD_ENTER] = Key::ENTER; mapKeys[DOM_PK_PAUSE] = Key::PAUSE; + mapKeys[DOM_PK_SCROLL_LOCK] = Key::SCROLL; + mapKeys[DOM_PK_NUMPAD_0] = Key::NP0; mapKeys[DOM_PK_NUMPAD_1] = Key::NP1; mapKeys[DOM_PK_NUMPAD_2] = Key::NP2; + mapKeys[DOM_PK_NUMPAD_3] = Key::NP3; mapKeys[DOM_PK_NUMPAD_4] = Key::NP4; mapKeys[DOM_PK_NUMPAD_5] = Key::NP5; + mapKeys[DOM_PK_NUMPAD_6] = Key::NP6; mapKeys[DOM_PK_NUMPAD_7] = Key::NP7; mapKeys[DOM_PK_NUMPAD_8] = Key::NP8; + mapKeys[DOM_PK_NUMPAD_9] = Key::NP9; + mapKeys[DOM_PK_NUMPAD_MULTIPLY] = Key::NP_MUL; mapKeys[DOM_PK_NUMPAD_DIVIDE] = Key::NP_DIV; + mapKeys[DOM_PK_NUMPAD_ADD] = Key::NP_ADD; mapKeys[DOM_PK_NUMPAD_SUBTRACT] = Key::NP_SUB; + mapKeys[DOM_PK_NUMPAD_DECIMAL] = Key::NP_DECIMAL; + mapKeys[DOM_PK_PERIOD] = Key::PERIOD; mapKeys[DOM_PK_EQUAL] = Key::EQUALS; + mapKeys[DOM_PK_COMMA] = Key::COMMA; mapKeys[DOM_PK_MINUS] = Key::MINUS; + mapKeys[DOM_PK_CAPS_LOCK] = Key::CAPS_LOCK; + mapKeys[DOM_PK_SEMICOLON] = Key::OEM_1; mapKeys[DOM_PK_SLASH] = Key::OEM_2; mapKeys[DOM_PK_BACKQUOTE] = Key::OEM_3; + mapKeys[DOM_PK_BRACKET_LEFT] = Key::OEM_4; mapKeys[DOM_PK_BACKSLASH] = Key::OEM_5; mapKeys[DOM_PK_BRACKET_RIGHT] = Key::OEM_6; + mapKeys[DOM_PK_QUOTE] = Key::OEM_7; mapKeys[DOM_PK_BACKSLASH] = Key::OEM_8; + + // Keyboard Callbacks + emscripten_set_keydown_callback("#canvas", 0, 1, keyboard_callback); + emscripten_set_keyup_callback("#canvas", 0, 1, keyboard_callback); + + // Mouse Callbacks + emscripten_set_wheel_callback("#canvas", 0, 1, wheel_callback); + emscripten_set_mousedown_callback("#canvas", 0, 1, mouse_callback); + emscripten_set_mouseup_callback("#canvas", 0, 1, mouse_callback); + emscripten_set_mousemove_callback("#canvas", 0, 1, mouse_callback); + + // Touch Callbacks + emscripten_set_touchstart_callback("#canvas", 0, 1, touch_callback); + emscripten_set_touchmove_callback("#canvas", 0, 1, touch_callback); + emscripten_set_touchend_callback("#canvas", 0, 1, touch_callback); + + // Canvas Focus Callbacks + emscripten_set_blur_callback("#canvas", 0, 1, focus_callback); + emscripten_set_focus_callback("#canvas", 0, 1, focus_callback); + +#pragma warning disable format + EM_ASM( window.onunload = Module._olc_OnPageUnload; ); + + // IMPORTANT! - Sorry About This... + // + // In order to handle certain browser based events, such as resizing and + // going to full screen, we have to effectively inject code into the container + // running the PGE. Yes, I vomited about 11 times too when the others were + // convincing me this is the future. Well, this isnt the future, and if it + // were to be, I want no part of what must be a miserable distopian free + // for all of anarchic code injection to get rudimentary events like "Resize()". + // + // Wake up people! Of course theres a spoon. There has to be to keep feeding + // the giant web baby. + + + EM_ASM({ + + // olc_ApsectRatio + // + // Used by olc_ResizeHandler to calculate the viewport from the + // dimensions of the canvas container's element. + Module.olc_AspectRatio = $0 / $1; + + // HACK ALERT! + // + // Here we assume any html shell that uses 3 or more instance of the class "emscripten" + // is using one of the default or minimal emscripten page layouts + Module.olc_AssumeDefaultShells = (document.querySelectorAll('.emscripten').length >= 3) ? true : false; + + // olc_ResizeHandler + // + // Used by olc_Init, and is called when a resize observer and fullscreenchange event is triggered. + var olc_ResizeHandler = function() + { + // are we in fullscreen mode? + let isFullscreen = (document.fullscreenElement != null); + + // get the width of the containing element + let width = (isFullscreen) ? window.innerWidth : Module.canvas.parentNode.clientWidth; + let height = (isFullscreen) ? window.innerHeight : Module.canvas.parentNode.clientHeight; + + // calculate the expected viewport size + let viewWidth = width; + let viewHeight = width / Module.olc_AspectRatio; + + // if we're taller than the containing element, recalculate based on height + if(viewHeight > height) + { + viewWidth = height * Module.olc_AspectRatio; + viewHeight = height; + } + + // ensure resulting viewport is in integer space + viewWidth = parseInt(viewWidth); + viewHeight = parseInt(viewHeight); + + setTimeout(function() + { + // if default shells, apply default styles + if(Module.olc_AssumeDefaultShells) + Module.canvas.parentNode.setAttribute('style', 'width: 100%; height: 70vh; margin-left: auto; margin-right: auto;'); + + // apply viewport dimensions to teh canvas + Module.canvas.setAttribute('width', viewWidth); + Module.canvas.setAttribute('height', viewHeight); + Module.canvas.setAttribute('style', `width: ${viewWidth}px; height: ${viewHeight}px;`); + + // update the PGE window size + Module._olc_PGE_UpdateWindowSize(viewWidth, viewHeight); + + // force focus on our PGE canvas + Module.canvas.focus(); + }, 200); + }; + + + // olc_Init + // + // set up resize observer and fullscreenchange event handler + var olc_Init = function() + { + if(Module.olc_AspectRatio === undefined) + { + setTimeout(function() { Module.olc_Init(); }, 50); + return; + } + + let resizeObserver = new ResizeObserver(function(entries) + { + Module.olc_ResizeHandler(); + }).observe(Module.canvas.parentNode); + + let mutationObserver = new MutationObserver(function(mutationsList, observer) + { + setTimeout(function() { Module.olc_ResizeHandler(); }, 200); + }).observe(Module.canvas.parentNode, { attributes: false, childList: true, subtree: false }); + + window.addEventListener('fullscreenchange', function(e) + { + setTimeout(function() { Module.olc_ResizeHandler();}, 200); + }); + }; + + // set up hooks + Module.olc_ResizeHandler = (Module.olc_ResizeHandler != undefined) ? Module.olc_ResizeHandler : olc_ResizeHandler; + Module.olc_Init = (Module.olc_Init != undefined) ? Module.olc_Init : olc_Init; + + // run everything! + Module.olc_Init(); + + }, vWindowSize.x, vWindowSize.y); // Fullscreen and Resize Observers +#pragma warning restore format + return olc::rcode::OK; + } + + // Interface PGE's UpdateWindowSize, for use in Javascript + void UpdateWindowSize(int width, int height) + { + ptrPGE->olc_UpdateWindowSize(width, height); + } + + //TY Gorbit + static EM_BOOL focus_callback(int eventType, const EmscriptenFocusEvent* focusEvent, void* userData) + { + if (eventType == EMSCRIPTEN_EVENT_BLUR) + { + ptrPGE->olc_UpdateKeyFocus(false); + ptrPGE->olc_UpdateMouseFocus(false); + } + else if (eventType == EMSCRIPTEN_EVENT_FOCUS) + { + ptrPGE->olc_UpdateKeyFocus(true); + ptrPGE->olc_UpdateMouseFocus(true); + } + + return 0; + } + + //TY Moros + static EM_BOOL keyboard_callback(int eventType, const EmscriptenKeyboardEvent* e, void* userData) + { + if (eventType == EMSCRIPTEN_EVENT_KEYDOWN) + ptrPGE->olc_UpdateKeyState(mapKeys[emscripten_compute_dom_pk_code(e->code)], true); + + // THANK GOD!! for this compute function. And thanks Dandistine for pointing it out! + if (eventType == EMSCRIPTEN_EVENT_KEYUP) + ptrPGE->olc_UpdateKeyState(mapKeys[emscripten_compute_dom_pk_code(e->code)], false); + + //Consume keyboard events so that keys like F1 and F5 don't do weird things + return EM_TRUE; + } + + //TY Moros + static EM_BOOL wheel_callback(int eventType, const EmscriptenWheelEvent* e, void* userData) + { + if (eventType == EMSCRIPTEN_EVENT_WHEEL) + ptrPGE->olc_UpdateMouseWheel(-1 * e->deltaY); + + return EM_TRUE; + } + + //TY Bispoo + static EM_BOOL touch_callback(int eventType, const EmscriptenTouchEvent* e, void* userData) + { + // Move + if (eventType == EMSCRIPTEN_EVENT_TOUCHMOVE) + { + ptrPGE->olc_UpdateMouse(e->touches->targetX, e->touches->targetY); + } + + // Start + if (eventType == EMSCRIPTEN_EVENT_TOUCHSTART) + { + ptrPGE->olc_UpdateMouse(e->touches->targetX, e->touches->targetY); + ptrPGE->olc_UpdateMouseState(0, true); + } + + // End + if (eventType == EMSCRIPTEN_EVENT_TOUCHEND) + { + ptrPGE->olc_UpdateMouseState(0, false); + } + + return EM_TRUE; + } + + //TY Moros + static EM_BOOL mouse_callback(int eventType, const EmscriptenMouseEvent* e, void* userData) + { + //Mouse Movement + if (eventType == EMSCRIPTEN_EVENT_MOUSEMOVE) + ptrPGE->olc_UpdateMouse(e->targetX, e->targetY); + + + //Mouse button press + if (e->button == 0) // left click + { + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) + ptrPGE->olc_UpdateMouseState(0, true); + else if (eventType == EMSCRIPTEN_EVENT_MOUSEUP) + ptrPGE->olc_UpdateMouseState(0, false); + } + + if (e->button == 2) // right click + { + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) + ptrPGE->olc_UpdateMouseState(1, true); + else if (eventType == EMSCRIPTEN_EVENT_MOUSEUP) + ptrPGE->olc_UpdateMouseState(1, false); + + } + + if (e->button == 1) // middle click + { + if (eventType == EMSCRIPTEN_EVENT_MOUSEDOWN) + ptrPGE->olc_UpdateMouseState(2, true); + else if (eventType == EMSCRIPTEN_EVENT_MOUSEUP) + ptrPGE->olc_UpdateMouseState(2, false); + + //at the moment only middle mouse needs to consume events. + return EM_TRUE; + } + + return EM_FALSE; + } + + + virtual olc::rcode SetWindowTitle(const std::string& s) override + { emscripten_set_window_title(s.c_str()); return olc::OK; } + + virtual olc::rcode StartSystemEventLoop() override + { return olc::OK; } + + virtual olc::rcode HandleSystemEvent() override + { return olc::OK; } + + static void MainLoop() + { + olc::Platform::ptrPGE->olc_CoreUpdate(); + if (!ptrPGE->olc_IsRunning()) + { + if (ptrPGE->OnUserDestroy()) + { + emscripten_cancel_main_loop(); + platform->ApplicationCleanUp(); + } + else + { + ptrPGE->olc_Reanimate(); + } + } + } + }; + + //Emscripten needs a special Start function + //Much of this is usually done in EngineThread, but that isn't used here + olc::rcode PixelGameEngine::Start() + { + if (platform->ApplicationStartUp() != olc::OK) return olc::FAIL; + + // Construct the window + if (platform->CreateWindowPane({ 30,30 }, vWindowSize, bFullScreen) != olc::OK) return olc::FAIL; + olc_UpdateWindowSize(vWindowSize.x, vWindowSize.y); + + // Some implementations may form an event loop here + if (platform->ThreadStartUp() == olc::FAIL) return olc::FAIL; + + // Do engine context specific initialisation + olc_PrepareEngine(); + + // Consider the "thread" started + bAtomActive = true; + + // Create user resources as part of this thread + for (auto& ext : vExtensions) ext->OnBeforeUserCreate(); + if (!OnUserCreate()) bAtomActive = false; + for (auto& ext : vExtensions) ext->OnAfterUserCreate(); + + platform->StartSystemEventLoop(); + + //This causes a heap memory corruption in Emscripten for some reason + //Platform_Emscripten::bActiveRef = &bAtomActive; + emscripten_set_main_loop(&Platform_Emscripten::MainLoop, 0, 1); + + // Wait for thread to be exited + if (platform->ApplicationCleanUp() != olc::OK) return olc::FAIL; + return olc::OK; + } +} + +extern "C" +{ + EMSCRIPTEN_KEEPALIVE inline void olc_PGE_UpdateWindowSize(int width, int height) + { + emscripten_set_canvas_element_size("#canvas", width, height); + // Thanks slavka + ((olc::Platform_Emscripten*)olc::platform.get())->UpdateWindowSize(width, height); + } +} + +#endif +// O------------------------------------------------------------------------------O +// | END PLATFORM: Emscripten | +// O------------------------------------------------------------------------------O +#pragma endregion + + +#endif // Headless + +// O------------------------------------------------------------------------------O +// | olcPixelGameEngine Auto-Configuration | +// O------------------------------------------------------------------------------O +#pragma region pge_config +namespace olc +{ + void PixelGameEngine::olc_ConfigureSystem() + { + + //#if !defined(OLC_PGE_HEADLESS) + + olc::Sprite::loader = nullptr; + +#if defined(OLC_IMAGE_GDI) + olc::Sprite::loader = std::make_unique(); +#endif + +#if defined(OLC_IMAGE_LIBPNG) + olc::Sprite::loader = std::make_unique(); +#endif + +#if defined(OLC_IMAGE_STB) + olc::Sprite::loader = std::make_unique(); +#endif + +#if defined(OLC_IMAGE_CUSTOM_EX) + olc::Sprite::loader = std::make_unique(); +#endif + + +#if defined(OLC_PLATFORM_HEADLESS) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_WINAPI) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_X11) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_GLUT) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_EMSCRIPTEN) + platform = std::make_unique(); +#endif + +#if defined(OLC_PLATFORM_CUSTOM_EX) + platform = std::make_unique(); +#endif + +#if defined(OLC_GFX_HEADLESS) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_OPENGL10) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_OPENGL33) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_OPENGLES2) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_DIRECTX10) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_DIRECTX11) + renderer = std::make_unique(); +#endif + +#if defined(OLC_GFX_CUSTOM_EX) + renderer = std::make_unique(); +#endif + + // Associate components with PGE instance + platform->ptrPGE = this; + renderer->ptrPGE = this; + //#else + // olc::Sprite::loader = nullptr; + // platform = nullptr; + // renderer = nullptr; + //#endif + } +} + +#pragma endregion + +#endif // End OLC_PGE_APPLICATION + +// O------------------------------------------------------------------------------O +// | END OF OLC_PGE_APPLICATION | +// O------------------------------------------------------------------------------O + +using namespace olc; \ No newline at end of file diff --git a/olcCodeJam2023Entry/olcSoundWaveEngine.h b/olcCodeJam2023Entry/olcSoundWaveEngine.h new file mode 100644 index 0000000..cd53fac --- /dev/null +++ b/olcCodeJam2023Entry/olcSoundWaveEngine.h @@ -0,0 +1,1962 @@ +/* ++-------------------------------------------------------------+ +| OneLoneCoder Sound Wave Engine v0.02 | +| "You wanted noise? Well is this loud enough?" - javidx9 | ++-------------------------------------------------------------+ + +What is this? +~~~~~~~~~~~~~ +olc::SoundWaveEngine is a single file, cross platform audio +interface for lightweight applications that just need a bit of +easy audio manipulation. + +It's origins started in the olcNoiseMaker file that accompanied +javidx9's "Code-It-Yourself: Synthesizer" series. It was refactored +and absorbed into the "olcConsoleGameEngine.h" file, and then +refactored again into olcPGEX_Sound.h, that was an extension to +the awesome "olcPixelGameEngine.h" file. + +Alas, it went underused and began to rot, with many myths circulating +that "it doesnt work" and "it shouldn't be used". These untruths +made javidx9 feel sorry for the poor file, and he decided to breathe +some new life into it, in anticipation of new videos! + +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2018 - 2022 OneLoneCoder.com + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met : + +1. Redistributions or derivations of source code must retain the above +copyright notice, this list of conditionsand the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce +the above copyright notice.This list of conditions and the following +disclaimer must be reproduced in the documentation and /or other +materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Links +~~~~~ +YouTube: https://www.youtube.com/javidx9 +Discord: https://discord.gg/WhwHUMV +Twitter: https://www.twitter.com/javidx9 +Twitch: https://www.twitch.tv/javidx9 +GitHub: https://www.github.com/onelonecoder +Homepage: https://www.onelonecoder.com +Patreon: https://www.patreon.com/javidx9 + +Thanks +~~~~~~ +Gorbit99, Dragoneye, Puol + +Authors +~~~~~~~ +slavka, MaGetzUb, cstd, Moros1138 & javidx9 + +(c)OneLoneCoder 2019, 2020, 2021, 2022 +*/ + + +/* +Using & Installing On Microsoft Windows +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Microsoft Visual Studio +~~~~~~~~~~~~~~~~~~~~~~~ +1) Include the header file "olcSoundWaveEngine.h" from a .cpp file in your project. +2) That's it! + + +Code::Blocks +~~~~~~~~~~~~ +1) Make sure your compiler toolchain is NOT the default one installed with Code::Blocks. That +one is old, out of date, and a general mess. Instead, use MSYS2 to install a recent and +decent GCC toolchain, then configure Code::Blocks to use it + +Guide for installing recent GCC for Windows: +https://www.msys2.org/ +Guide for configuring code::blocks: +https://solarianprogrammer.com/2019/11/05/install-gcc-windows/ +https://solarianprogrammer.com/2019/11/16/install-codeblocks-gcc-windows-build-c-cpp-fortran-programs/ + +2) Include the header file "olcSoundWaveEngine.h" from a .cpp file in your project. +3) Add these libraries to "Linker Options": user32 winmm +4) Set this "Compiler Option": -std=c++17 +*/ + +/* +Using & Installing On Linux +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +GNU Compiler Collection (GCC) +~~~~~~~~~~~~~~~~~~~~~~~ +1) Include the header file "olcSoundWaveEngine.h" from a .cpp file in your project. +2) Build with the following command: + +g++ olcSoundWaveEngineExample.cpp -o olcSoundWaveEngineExample -lpulse -lpulse-simple -std=c++17 + +3) That's it! + +*/ + +/* +Using in multiple-file projects +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If you intend to use olcSoundWaveEngine across multiple files, it's important to only have one +instance of the implementation. This is done using the compiler preprocessor definition: OLC_SOUNDWAVE + +This is defined typically before the header is included in teh translation unit you wish the implementation +to be associated with. To avoid things getting messy I recommend you create a file "olcSoundWaveEngine.cpp" +and that file includes ONLY the following code: + +#define OLC_SOUNDWAVE +#include "olcSoundWaveEngine.h" +*/ + +/* +0.01: olcPGEX_Sound.h reworked ++Changed timekeeping to double, added accuracy fix - Thanks scripticuk ++Concept of audio drivers and interface ++All internal timing now double precision ++All internal sampling now single precsion ++Loading form WAV files ++LERPed sampling from all buffers ++Multi-channel audio support +0.02: +Support multi-channel wave files ++Support for 24-bit wave files ++Wave files are now sample rate invariant ++Linux PulseAudio Updated ++Linux ALSA Updated ++WinMM Updated ++CMake Compatibility +=Fix wave format durations preventing playback +=Various bug fixes +*/ + +#pragma once +#ifndef OLC_SOUNDWAVE_H +#define OLC_SOUNDWAVE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Compiler/System Sensitivity +#if !defined(SOUNDWAVE_USING_WINMM) && !defined(SOUNDWAVE_USING_WASAPI) && \ + !defined(SOUNDWAVE_USING_XAUDIO) && !defined(SOUNDWAVE_USING_OPENAL) && \ + !defined(SOUNDWAVE_USING_ALSA) && !defined(SOUNDWAVE_USING_SDLMIXER) && \ + !defined(SOUNDWAVE_USING_PULSE) \ + +#if defined(_WIN32) +#define SOUNDWAVE_USING_WINMM +#endif +#if defined(__linux__) +#define SOUNDWAVE_USING_PULSE +#endif +#if defined(__APPLE__) +#define SOUNDWAVE_USING_SDLMIXER +#endif +#if defined(__EMSCRIPTEN__) +#define SOUNDWAVE_USING_SDLMIXER +#endif + +#endif + +namespace olc::sound +{ + + namespace wave + { + // Physically represents a .WAV file, but the data is stored + // as normalised floating point values + template + class File + { + public: + File() = default; + + File(const size_t nChannels, const size_t nSampleSize, const size_t nSampleRate, const size_t nSamples) + { + m_nChannels = nChannels; + m_nSampleSize = nSampleSize; + m_nSamples = nSamples; + m_nSampleRate = nSampleRate; + m_dDuration = double(m_nSamples) / double(m_nSampleRate); + m_dDurationInSamples = double(m_nSamples); + + m_pRawData = std::make_unique(m_nSamples * m_nChannels); + } + + public: + T* data() const + { + return m_pRawData.get(); + } + + size_t samples() const + { + return m_nSamples; + } + + size_t channels() const + { + return m_nChannels; + } + + size_t samplesize() const + { + return m_nSampleSize; + } + + size_t samplerate() const + { + return m_nSampleRate; + } + + double duration() const + { + return m_dDuration; + } + + double durationInSamples() const + { + return m_dDurationInSamples; + } + + bool LoadFile(const std::string& sFilename) + { + std::ifstream ifs(sFilename, std::ios::binary); + if (!ifs.is_open()) + return false; + + struct WaveFormatHeader + { + uint16_t wFormatTag; /* format type */ + uint16_t nChannels; /* number of channels (i.e. mono, stereo...) */ + uint32_t nSamplesPerSec; /* sample rate */ + uint32_t nAvgBytesPerSec; /* for buffer estimation */ + uint16_t nBlockAlign; /* block size of data */ + uint16_t wBitsPerSample; /* number of bits per sample of mono data */ + }; + + WaveFormatHeader header{ 0 }; + + m_pRawData.reset(); + + char dump[4]; + ifs.read(dump, sizeof(uint8_t) * 4); // Read "RIFF" + if (strncmp(dump, "RIFF", 4) != 0) return false; + + ifs.read(dump, sizeof(uint8_t) * 4); // Not Interested + ifs.read(dump, sizeof(uint8_t) * 4); // Read "WAVE" + if (strncmp(dump, "WAVE", 4) != 0) return false; + + // Read Wave description chunk + ifs.read(dump, sizeof(uint8_t) * 4); // Read "fmt " + ifs.read(dump, sizeof(uint8_t) * 4); // Not Interested + ifs.read((char*)&header, sizeof(WaveFormatHeader)); // Read Wave Format Structure chunk + + // Search for audio data chunk + int32_t nChunksize = 0; + ifs.read(dump, sizeof(uint8_t) * 4); // Read chunk header + ifs.read((char*)&nChunksize, sizeof(uint32_t)); // Read chunk size + + while (strncmp(dump, "data", 4) != 0) + { + // Not audio data, so just skip it + ifs.seekg(nChunksize, std::ios::cur); + ifs.read(dump, sizeof(uint8_t) * 4); // Read next chunk header + ifs.read((char*)&nChunksize, sizeof(uint32_t)); // Read next chunk size + } + + // Finally got to data, so read it all in and convert to float samples + m_nSampleSize = header.wBitsPerSample >> 3; + m_nSamples = nChunksize / (header.nChannels * m_nSampleSize); + m_nChannels = header.nChannels; + m_nSampleRate = header.nSamplesPerSec; + m_pRawData = std::make_unique(m_nSamples * m_nChannels); + m_dDuration = double(m_nSamples) / double(m_nSampleRate); + m_dDurationInSamples = double(m_nSamples); + + T* pSample = m_pRawData.get(); + + // Read in audio data and normalise + for (long i = 0; i < m_nSamples; i++) + { + for (int c = 0; c < m_nChannels; c++) + { + switch (m_nSampleSize) + { + case 1: + { + int8_t s = 0; + ifs.read((char*)&s, sizeof(int8_t)); + *pSample = T(s) / T(std::numeric_limits::max()); + } + break; + + case 2: + { + int16_t s = 0; + ifs.read((char*)&s, sizeof(int16_t)); + *pSample = T(s) / T(std::numeric_limits::max()); + } + break; + + case 3: // 24-bit + { + int32_t s = 0; + ifs.read((char*)&s, 3); + if (s & (1 << 23)) s |= 0xFF000000; + *pSample = T(s) / T(std::pow(2, 23)-1); + } + break; + + case 4: + { + int32_t s = 0; + ifs.read((char*)&s, sizeof(int32_t)); + *pSample = T(s) / T(std::numeric_limits::max()); + } + break; + } + + pSample++; + } + } + return true; + } + + bool SaveFile(const std::string& sFilename) + { + return false; + } + + + protected: + std::unique_ptr m_pRawData; + size_t m_nSamples = 0; + size_t m_nChannels = 0; + size_t m_nSampleRate = 0; + size_t m_nSampleSize = 0; + double m_dDuration = 0.0; + double m_dDurationInSamples = 0.0; + }; + + template + class View + { + public: + View() = default; + + View(const T* pData, const size_t nSamples) + { + SetData(pData, nSamples); + } + + public: + void SetData(T const* pData, const size_t nSamples, const size_t nStride = 1, const size_t nOffset = 0) + { + m_pData = pData; + m_nSamples = nSamples; + m_nStride = nStride; + m_nOffset = nOffset; + } + + double GetSample(const double dSample) const + { + double d1 = std::floor(dSample); + size_t p1 = static_cast(d1); + size_t p2 = p1 + 1; + + double t = dSample - d1; + double a = GetValue(p1); + double b = GetValue(p2); + + return a + t * (b - a); // std::lerp in C++20 + } + + std::pair GetRange(const double dSample1, const double dSample2) const + { + if (dSample1 < 0 || dSample2 < 0) + return { 0,0 }; + + if (dSample1 > m_nSamples && dSample2 > m_nSamples) + return { 0,0 }; + + double dMin, dMax; + + double d = GetSample(dSample1); + dMin = dMax = d; + + size_t n1 = static_cast(std::ceil(dSample1)); + size_t n2 = static_cast(std::floor(dSample2)); + for (size_t n = n1; n < n2; n++) + { + d = GetValue(n); + dMin = std::min(dMin, d); + dMax = std::max(dMax, d); + } + + d = GetSample(dSample2); + dMin = std::min(dMin, d); + dMax = std::max(dMax, d); + + return { dMin, dMax }; + } + + T GetValue(const size_t nSample) const + { + if (nSample >= m_nSamples) + return 0; + else + return m_pData[m_nOffset + nSample * m_nStride]; + } + + private: + const T* m_pData = nullptr; + size_t m_nSamples = 0; + size_t m_nStride = 1; + size_t m_nOffset = 0; + }; + } + + template + class Wave_generic + { + public: + Wave_generic() = default; + Wave_generic(std::string sWavFile) { LoadAudioWaveform(sWavFile); } + Wave_generic(std::istream& sStream) { LoadAudioWaveform(sStream); } + Wave_generic(const char* pData, const size_t nBytes) { LoadAudioWaveform(pData, nBytes); } + + Wave_generic(const size_t nChannels, const size_t nSampleSize, const size_t nSampleRate, const size_t nSamples) + { + vChannelView.clear(); + file = wave::File(nChannels, nSampleSize, nSampleRate, nSamples); + vChannelView.resize(file.channels()); + for (uint32_t c = 0; c < file.channels(); c++) + vChannelView[c].SetData(file.data(), file.samples(), file.channels(), c); + } + + bool LoadAudioWaveform(std::string sWavFile) + { + vChannelView.clear(); + + if (file.LoadFile(sWavFile)) + { + // Setup views for each channel + vChannelView.resize(file.channels()); + for (uint32_t c = 0; c < file.channels(); c++) + vChannelView[c].SetData(file.data(), file.samples(), file.channels(), c); + + return true; + } + + return false; + } + + + + bool LoadAudioWaveform(std::istream& sStream) { return false; } + bool LoadAudioWaveform(const char* pData, const size_t nBytes) { return false; } + + std::vector> vChannelView; + wave::File file; + }; + + typedef Wave_generic Wave; + + struct WaveInstance + { + Wave* pWave = nullptr; + double dInstanceTime = 0.0; + double dDuration = 0.0; + double dSpeedModifier = 1.0; + bool bFinished = false; + bool bLoop = false; + bool bFlagForStop = false; + }; + + typedef std::list::iterator PlayingWave; + + namespace driver + { + class Base; + } + + // Container class for Basic Sound Manipulation + class WaveEngine + { + + public: + WaveEngine(); + virtual ~WaveEngine(); + + // Configure Audio Hardware + bool InitialiseAudio(uint32_t nSampleRate = 44100, uint32_t nChannels = 1, uint32_t nBlocks = 8, uint32_t nBlockSamples = 512); + + // Release Audio Hardware + bool DestroyAudio(); + + // Call to get the names of all the devices capable of audio output - DACs. An entry + // from the returned collection can be specified as the device to use in UseOutputDevice() + std::vector GetOutputDevices(); + + // Specify a device for audio output prior to calling InitialiseAudio() + void UseOutputDevice(const std::string& sDeviceOut); + + // Call to get the names of all the devices capable of audio input - ADCs. An entry + // from the returned collection can be specified as the device to use in UseInputDevice() + std::vector GetInputDevices(); + + // Specify a device for audio input prior to calling InitialiseAudio() + void UseInputDevice(const std::string& sDeviceOut); + + + void SetCallBack_NewSample(std::function func); + void SetCallBack_SynthFunction(std::function func); + void SetCallBack_FilterFunction(std::function func); + + public: + void SetOutputVolume(const float fVolume); + + + + PlayingWave PlayWaveform(Wave* pWave, bool bLoop = false, double dSpeed = 1.0); + void StopWaveform(const PlayingWave& w); + void StopAll(); + + private: + uint32_t FillOutputBuffer(std::vector& vBuffer, const uint32_t nBufferOffset, const uint32_t nRequiredSamples); + + private: + std::unique_ptr m_driver; + std::function m_funcNewSample; + std::function m_funcUserSynth; + std::function m_funcUserFilter; + + + private: + uint32_t m_nSampleRate = 44100; + uint32_t m_nChannels = 1; + uint32_t m_nBlocks = 8; + uint32_t m_nBlockSamples = 512; + double m_dSamplePerTime = 44100.0; + double m_dTimePerSample = 1.0 / 44100; + double m_dGlobalTime = 0.0; + float m_fOutputVolume = 1.0; + + std::string m_sInputDevice; + std::string m_sOutputDevice; + + private: + std::list m_listWaves; + + public: + uint32_t GetSampleRate() const; + uint32_t GetChannels() const; + uint32_t GetBlocks() const; + uint32_t GetBlockSampleCount() const; + double GetTimePerSample() const; + + + // Friends, for access to FillOutputBuffer from Drivers + friend class driver::Base; + + }; + + namespace driver + { + // DRIVER DEVELOPERS ONLY!!! + // + // This interface allows SoundWave to exchange data with OS audio systems. It + // is not intended of use by regular users. + class Base + { + public: + Base(WaveEngine* pHost); + virtual ~Base(); + + public: + // [IMPLEMENT] Opens a connection to the hardware device, returns true if success + virtual bool Open(const std::string& sOutputDevice, const std::string& sInputDevice); + // [IMPLEMENT] Starts a process that repeatedly requests audio, returns true if success + virtual bool Start(); + // [IMPLEMENT] Stops a process form requesting audio + virtual void Stop(); + // [IMPLEMENT] Closes any connections to hardware devices + virtual void Close(); + + virtual std::vector EnumerateOutputDevices(); + virtual std::vector EnumerateInputDevices(); + + protected: + // [IMPLEMENT IF REQUIRED] Called by driver to exchange data with SoundWave System. Your + // implementation will call this function providing a "DAC" buffer to be filled by + // SoundWave from a buffer of floats filled by the user. + void ProcessOutputBlock(std::vector& vFloatBuffer, std::vector& vDACBuffer); + + // [IMPLEMENT IF REQUIRED] Called by driver to exchange data with SoundWave System. + void GetFullOutputBlock(std::vector& vFloatBuffer); + + // Handle to SoundWave, to interrogate optons, and get user data + WaveEngine* m_pHost = nullptr; + }; + } + + + namespace synth + { + class Property + { + public: + double value = 0.0f; + + public: + Property() = default; + Property(double f); + + public: + Property& operator =(const double f); + }; + + + class Trigger + { + + }; + + + class Module + { + public: + virtual void Update(uint32_t nChannel, double dTime, double dTimeStep) = 0; + }; + + + class ModularSynth + { + public: + ModularSynth(); + + public: + bool AddModule(Module* pModule); + bool RemoveModule(Module* pModule); + bool AddPatch(Property* pInput, Property* pOutput); + bool RemovePatch(Property* pInput, Property* pOutput); + + + public: + void UpdatePatches(); + void Update(uint32_t nChannel, double dTime, double dTimeStep); + + protected: + std::vector m_vModules; + std::vector> m_vPatches; + }; + + + namespace modules + { + class Oscillator : public Module + { + public: + enum class Type + { + Sine, + Saw, + Square, + Triangle, + PWM, + Wave, + Noise, + }; + + public: + // Primary frequency of oscillation + Property frequency = 0.0f; + // Primary amplitude of output + Property amplitude = 1.0f; + // LFO input if required + Property lfo_input = 0.0f; + // Primary Output + Property output; + // Tweakable Parameter + Property parameter = 0.0; + + Type waveform = Type::Sine; + + Wave* pWave = nullptr; + + private: + double phase_acc = 0.0f; + double max_frequency = 20000.0; + uint32_t random_seed = 0xB00B1E5; + + double rndDouble(double min, double max); + uint32_t rnd(); + + + public: + virtual void Update(uint32_t nChannel, double dTime, double dTimeStep) override; + + }; + } + } + + +} + +#if defined(SOUNDWAVE_USING_WINMM) +#define _WIN32_LEAN_AND_MEAN +#include +#undef min +#undef max + +namespace olc::sound::driver +{ + class WinMM : public Base + { + public: + WinMM(WaveEngine* pHost); + ~WinMM(); + + protected: + bool Open(const std::string& sOutputDevice, const std::string& sInputDevice) override; + bool Start() override; + void Stop() override; + void Close() override; + + private: + void DriverLoop(); + void FreeAudioBlock(); + static void CALLBACK waveOutProc(HWAVEOUT hWaveOut, UINT uMsg, DWORD_PTR dwInstance, DWORD dwParam1, DWORD dwParam2); + HWAVEOUT m_hwDevice = nullptr; + std::thread m_thDriverLoop; + std::atomic m_bDriverLoopActive{ false }; + std::unique_ptr[]> m_pvBlockMemory; + std::unique_ptr m_pWaveHeaders; + std::atomic m_nBlockFree = 0; + std::condition_variable m_cvBlockNotZero; + std::mutex m_muxBlockNotZero; + uint32_t m_nBlockCurrent = 0; + }; +} +#endif // SOUNDWAVE_USING_WINMM + +#if defined(SOUNDWAVE_USING_SDLMIXER) + +#if defined(__EMSCRIPTEN__) +#include +#else +#include +#endif + +namespace olc::sound::driver +{ + class SDLMixer final : public Base + { + public: + explicit SDLMixer(WaveEngine* pHost); + ~SDLMixer() final; + + protected: + bool Open(const std::string& sOutputDevice, const std::string& sInputDevice) final; + bool Start() final; + void Stop() final; + void Close() final; + + private: + void FillChunkBuffer(const std::vector& userData) const; + + static void SDLMixerCallback(int channel); + + private: + bool m_keepRunning = false; + Uint16 m_haveFormat = AUDIO_F32SYS; + std::vector audioBuffer; + Mix_Chunk audioChunk; + + static SDLMixer* instance; + }; +} + +#endif // SOUNDWAVE_USING_SDLMIXER + +#if defined(SOUNDWAVE_USING_ALSA) +#include +#include +#include + +namespace olc::sound::driver +{ + // Not thread-safe + template + class RingBuffer + { + public: + RingBuffer() + { } + + void Resize(unsigned int bufnum = 0, unsigned int buflen = 0) + { + m_vBuffers.resize(bufnum); + for (auto &vBuffer : m_vBuffers) + vBuffer.resize(buflen); + } + + std::vector& GetFreeBuffer() + { + assert(!IsFull()); + + std::vector& result = m_vBuffers[m_nTail]; + m_nTail = Next(m_nTail); + return result; + } + + std::vector& GetFullBuffer() + { + assert(!IsEmpty()); + + std::vector& result = m_vBuffers[m_nHead]; + m_nHead = Next(m_nHead); + return result; + } + + bool IsEmpty() + { + return m_nHead == m_nTail; + } + + bool IsFull() + { + return m_nHead == Next(m_nTail); + } + + private: + unsigned int Next(unsigned int current) + { + return (current + 1) % m_vBuffers.size(); + } + + std::vector> m_vBuffers; + unsigned int m_nHead = 0; + unsigned int m_nTail = 0; + }; + + class ALSA : public Base + { + public: + ALSA(WaveEngine* pHost); + ~ALSA(); + + protected: + bool Open(const std::string& sOutputDevice, const std::string& sInputDevice) override; + bool Start() override; + void Stop() override; + void Close() override; + + private: + void DriverLoop(); + + snd_pcm_t *m_pPCM; + RingBuffer m_rBuffers; + std::atomic m_bDriverLoopActive{ false }; + std::thread m_thDriverLoop; + }; +} +#endif // SOUNDWAVE_USING_ALSA + +#if defined(SOUNDWAVE_USING_PULSE) +#include + +namespace olc::sound::driver +{ + class PulseAudio : public Base + { + public: + PulseAudio(WaveEngine* pHost); + ~PulseAudio(); + + protected: + bool Open(const std::string& sOutputDevice, const std::string& sInputDevice) override; + bool Start() override; + void Stop() override; + void Close() override; + + private: + void DriverLoop(); + + pa_simple *m_pPA; + std::atomic m_bDriverLoopActive{ false }; + std::thread m_thDriverLoop; + }; +} +#endif // SOUNDWAVE_USING_PULSE + +#ifdef OLC_SOUNDWAVE +#undef OLC_SOUNDWAVE + +namespace olc::sound +{ + WaveEngine::WaveEngine() + { + m_sInputDevice = "NONE"; + m_sOutputDevice = "DEFAULT"; + +#if defined(SOUNDWAVE_USING_WINMM) + m_driver = std::make_unique(this); +#endif + +#if defined(SOUNDWAVE_USING_WASAPI) + m_driver = std::make_unique(this); +#endif + +#if defined(SOUNDWAVE_USING_XAUDIO) + m_driver = std::make_unique(this); +#endif + +#if defined(SOUNDWAVE_USING_OPENAL) + m_driver = std::make_unique(this); +#endif + +#if defined(SOUNDWAVE_USING_ALSA) + m_driver = std::make_unique(this); +#endif + +#if defined(SOUNDWAVE_USING_SDLMIXER) + m_driver = std::make_unique(this); +#endif + +#if defined(SOUNDWAVE_USING_PULSE) + m_driver = std::make_unique(this); +#endif + } + + WaveEngine::~WaveEngine() + { + DestroyAudio(); + } + + std::vector WaveEngine::GetOutputDevices() + { + return { "XXX" }; + } + + + void WaveEngine::UseOutputDevice(const std::string& sDeviceOut) + { + m_sOutputDevice = sDeviceOut; + } + + std::vector WaveEngine::GetInputDevices() + { + return { "XXX" }; + } + + void WaveEngine::UseInputDevice(const std::string& sDeviceIn) + { + m_sInputDevice = sDeviceIn; + } + + bool WaveEngine::InitialiseAudio(uint32_t nSampleRate, uint32_t nChannels, uint32_t nBlocks, uint32_t nBlockSamples) + { + m_nSampleRate = nSampleRate; + m_nChannels = nChannels; + m_nBlocks = nBlocks; + m_nBlockSamples = nBlockSamples; + m_dSamplePerTime = double(nSampleRate); + m_dTimePerSample = 1.0 / double(nSampleRate); + m_driver->Open(m_sOutputDevice, m_sInputDevice); + m_driver->Start(); + return false; + } + + + bool WaveEngine::DestroyAudio() + { + StopAll(); + m_driver->Stop(); + m_driver->Close(); + return false; + } + + void WaveEngine::SetCallBack_NewSample(std::function func) + { + m_funcNewSample = func; + } + + void WaveEngine::SetCallBack_SynthFunction(std::function func) + { + m_funcUserSynth = func; + } + + void WaveEngine::SetCallBack_FilterFunction(std::function func) + { + m_funcUserFilter = func; + } + + PlayingWave WaveEngine::PlayWaveform(Wave* pWave, bool bLoop, double dSpeed) + { + WaveInstance wi; + wi.bLoop = bLoop; + wi.pWave = pWave; + wi.dSpeedModifier = dSpeed * double(pWave->file.samplerate()) / m_dSamplePerTime; + wi.dDuration = pWave->file.duration() / dSpeed; + wi.dInstanceTime = m_dGlobalTime; + m_listWaves.push_back(wi); + return std::prev(m_listWaves.end()); + } + + void WaveEngine::StopWaveform(const PlayingWave& w) + { + w->bFlagForStop = true; + } + + void WaveEngine::StopAll() + { + for (auto& wave : m_listWaves) + { + wave.bFlagForStop = true; + } + } + + void WaveEngine::SetOutputVolume(const float fVolume) + { + m_fOutputVolume = std::clamp(fVolume, 0.0f, 1.0f); + } + + uint32_t WaveEngine::FillOutputBuffer(std::vector& vBuffer, const uint32_t nBufferOffset, const uint32_t nRequiredSamples) + { + for (uint32_t nSample = 0; nSample < nRequiredSamples; nSample++) + { + double dSampleTime = m_dGlobalTime + nSample * m_dTimePerSample; + + if (m_funcNewSample) + m_funcNewSample(dSampleTime); + + for (uint32_t nChannel = 0; nChannel < m_nChannels; nChannel++) + { + // Construct the sample + float fSample = 0.0f; + + // 1) Sample any active waves + for (auto& wave : m_listWaves) + { + // Is wave instance flagged for stopping? + if (wave.bFlagForStop) + { + wave.bFinished = true; + } + else + { + // Calculate offset into wave instance + double dTimeOffset = dSampleTime - wave.dInstanceTime; + + // If offset is larger than wave then... + if (dTimeOffset >= wave.dDuration) + { + if (wave.bLoop) + { + // ...if looping, reset the wave instance + wave.dInstanceTime = dSampleTime; + } + else + { + // ...if not looping, flag wave instance as dead + wave.bFinished = true; + } + } + else + { + // OR, sample the waveform from the correct channel + fSample += float(wave.pWave->vChannelView[nChannel % wave.pWave->file.channels()].GetSample(dTimeOffset * m_dSamplePerTime * wave.dSpeedModifier)); + } + } + } + + // Remove waveform instances that have finished + m_listWaves.remove_if([](const WaveInstance& wi) {return wi.bFinished; }); + + + // 2) If user is synthesizing, request sample + if (m_funcUserSynth) + fSample += m_funcUserSynth(nChannel, dSampleTime); + + // 3) Apply global filters + + + // 4) If user is filtering, allow manipulation of output + if (m_funcUserFilter) + fSample = m_funcUserFilter(nChannel, dSampleTime, fSample); + + // Place sample in buffer + vBuffer[nBufferOffset + nSample * m_nChannels + nChannel] = fSample * m_fOutputVolume; + } + } + + // UPdate global time, accounting for error (thanks scripticuk) + m_dGlobalTime += nRequiredSamples * m_dTimePerSample; + return nRequiredSamples; + } + + + uint32_t WaveEngine::GetSampleRate() const + { + return m_nSampleRate; + } + + uint32_t WaveEngine::GetChannels() const + { + return m_nChannels; + } + + uint32_t WaveEngine::GetBlocks() const + { + return m_nBlocks; + } + + uint32_t WaveEngine::GetBlockSampleCount() const + { + return m_nBlockSamples; + } + + double WaveEngine::GetTimePerSample() const + { + return m_dTimePerSample; + } + + namespace driver + { + Base::Base(olc::sound::WaveEngine* pHost) : m_pHost(pHost) + {} + + Base::~Base() + {} + + bool Base::Open(const std::string& sOutputDevice, const std::string& sInputDevice) + { + return false; + } + + bool Base::Start() + { + return false; + } + + void Base::Stop() + { + } + + void Base::Close() + { + } + + std::vector Base::EnumerateOutputDevices() + { + return { "DEFAULT" }; + } + + std::vector Base::EnumerateInputDevices() + { + return { "NONE" }; + } + + void Base::ProcessOutputBlock(std::vector& vFloatBuffer, std::vector& vDACBuffer) + { + constexpr float fMaxSample = float(std::numeric_limits::max()); + constexpr float fMinSample = float(std::numeric_limits::min()); + + // So... why not use vFloatBuffer.size()? Well with this implementation + // we can, but i suspect there may be some platforms that request a + // specific number of samples per "loop" rather than this block architecture + uint32_t nSamplesToProcess = m_pHost->GetBlockSampleCount(); + uint32_t nSampleOffset = 0; + while (nSamplesToProcess > 0) + { + uint32_t nSamplesGathered = m_pHost->FillOutputBuffer(vFloatBuffer, nSampleOffset, nSamplesToProcess); + + // Vector is in float32 format, so convert to hardware required format + for (uint32_t n = 0; n < nSamplesGathered; n++) + { + for (uint32_t c = 0; c < m_pHost->GetChannels(); c++) + { + size_t nSampleID = nSampleOffset + (n * m_pHost->GetChannels() + c); + vDACBuffer[nSampleID] = short(std::clamp(vFloatBuffer[nSampleID] * fMaxSample, fMinSample, fMaxSample)); + } + } + + nSampleOffset += nSamplesGathered; + nSamplesToProcess -= nSamplesGathered; + } + } + + void Base::GetFullOutputBlock(std::vector& vFloatBuffer) + { + uint32_t nSamplesToProcess = m_pHost->GetBlockSampleCount(); + uint32_t nSampleOffset = 0; + while (nSamplesToProcess > 0) + { + uint32_t nSamplesGathered = m_pHost->FillOutputBuffer(vFloatBuffer, nSampleOffset, nSamplesToProcess); + + nSampleOffset += nSamplesGathered; + nSamplesToProcess -= nSamplesGathered; + } + } + } + + namespace synth + { + Property::Property(double f) + { + value = std::clamp(f, -1.0, 1.0); + } + + Property& Property::operator =(const double f) + { + value = std::clamp(f, -1.0, 1.0); + return *this; + } + + + ModularSynth::ModularSynth() + { + + } + + bool ModularSynth::AddModule(Module* pModule) + { + // Check if module already added + if (std::find(m_vModules.begin(), m_vModules.end(), pModule) == std::end(m_vModules)) + { + m_vModules.push_back(pModule); + return true; + } + + return false; + } + + bool ModularSynth::RemoveModule(Module* pModule) + { + if (std::find(m_vModules.begin(), m_vModules.end(), pModule) == std::end(m_vModules)) + { + m_vModules.erase(std::remove(m_vModules.begin(), m_vModules.end(), pModule), m_vModules.end()); + return true; + } + + return false; + } + + bool ModularSynth::AddPatch(Property* pInput, Property* pOutput) + { + // Does patch exist? + std::pair newPatch = std::pair(pInput, pOutput); + + if (std::find(m_vPatches.begin(), m_vPatches.end(), newPatch) == std::end(m_vPatches)) + { + // Patch doesnt exist, now check if either are null + if (pInput != nullptr && pOutput != nullptr) + { + m_vPatches.push_back(newPatch); + return true; + } + } + + return false; + } + + bool ModularSynth::RemovePatch(Property* pInput, Property* pOutput) + { + std::pair newPatch = std::pair(pInput, pOutput); + + if (std::find(m_vPatches.begin(), m_vPatches.end(), newPatch) == std::end(m_vPatches)) + { + m_vPatches.erase(std::remove(m_vPatches.begin(), m_vPatches.end(), newPatch), m_vPatches.end()); + return true; + } + + return false; + } + + void ModularSynth::UpdatePatches() + { + // Update patches + for (auto& patch : m_vPatches) + { + patch.second->value = patch.first->value; + } + } + + + void ModularSynth::Update(uint32_t nChannel, double dTime, double dTimeStep) + { + // Now update synth + for (auto& pModule : m_vModules) + { + pModule->Update(nChannel, dTime, dTimeStep); + } + } + + + namespace modules + { + void Oscillator::Update(uint32_t nChannel, double dTime, double dTimeStep) + { + // We use phase accumulation to combat change in parameter glitches + double w = frequency.value * max_frequency * dTimeStep; + phase_acc += w + lfo_input.value * frequency.value; + if (phase_acc >= 2.0) phase_acc -= 2.0; + + switch (waveform) + { + case Type::Sine: + output = amplitude.value * sin(phase_acc * 2.0 * 3.14159); + break; + + case Type::Saw: + output = amplitude.value * (phase_acc - 1.0) * 2.0; + break; + + case Type::Square: + output = amplitude.value * (phase_acc >= 1.0) ? 1.0 : -1.0; + break; + + case Type::Triangle: + output = amplitude.value * (phase_acc < 1.0) ? (phase_acc * 0.5) : (1.0 - phase_acc * 0.5); + break; + + case Type::PWM: + output = amplitude.value * (phase_acc >= (parameter.value + 1.0)) ? 1.0 : -1.0; + break; + + case Type::Wave: + if(pWave != nullptr) + output = amplitude.value * pWave->vChannelView[nChannel].GetSample(phase_acc * 0.5 * pWave->file.durationInSamples()); + break; + + case Type::Noise: + output = amplitude.value * rndDouble(-1.0, 1.0); + break; + + } + } + + double Oscillator::rndDouble(double min, double max) + { + return ((double)rnd() / (double)(0x7FFFFFFF)) * (max - min) + min; + } + + uint32_t Oscillator::rnd() + { + random_seed += 0xe120fc15; + uint64_t tmp; + tmp = (uint64_t)random_seed * 0x4a39b70d; + uint32_t m1 = uint32_t(((tmp >> 32) ^ tmp) & 0xFFFFFFFF); + tmp = (uint64_t)m1 * 0x12fad5c9; + uint32_t m2 = uint32_t(((tmp >> 32) ^ tmp) & 0xFFFFFFFF); + return m2; + } + } + } +} + + + +#if defined(SOUNDWAVE_USING_WINMM) +// WinMM Driver Implementation +namespace olc::sound::driver +{ +#pragma comment(lib, "winmm.lib") + + WinMM::WinMM(WaveEngine* pHost) : Base(pHost) + { } + + WinMM::~WinMM() + { + Stop(); + Close(); + } + + bool WinMM::Open(const std::string& sOutputDevice, const std::string& sInputDevice) + { + // Device is available + WAVEFORMATEX waveFormat; + waveFormat.wFormatTag = WAVE_FORMAT_PCM; + waveFormat.nSamplesPerSec = m_pHost->GetSampleRate(); + waveFormat.wBitsPerSample = sizeof(short) * 8; + waveFormat.nChannels = m_pHost->GetChannels(); + waveFormat.nBlockAlign = (waveFormat.wBitsPerSample / 8) * waveFormat.nChannels; + waveFormat.nAvgBytesPerSec = waveFormat.nSamplesPerSec * waveFormat.nBlockAlign; + waveFormat.cbSize = 0; + + // Open Device if valid + if (waveOutOpen(&m_hwDevice, WAVE_MAPPER, &waveFormat, (DWORD_PTR)WinMM::waveOutProc, (DWORD_PTR)this, CALLBACK_FUNCTION) != S_OK) + return false; + + // Allocate array of wave header objects, one per block + m_pWaveHeaders = std::make_unique(m_pHost->GetBlocks()); + + // Allocate block memory - I dont like vector of vectors, so going with this mess instead + // My std::vector's content will change, but their size never will - they are basically array now + m_pvBlockMemory = std::make_unique[]>(m_pHost->GetBlocks()); + for (size_t i = 0; i < m_pHost->GetBlocks(); i++) + m_pvBlockMemory[i].resize(m_pHost->GetBlockSampleCount() * m_pHost->GetChannels(), 0); + + // Link headers to block memory - clever, so we only move headers about + // rather than memory... + for (unsigned int n = 0; n < m_pHost->GetBlocks(); n++) + { + m_pWaveHeaders[n].dwBufferLength = DWORD(m_pvBlockMemory[0].size() * sizeof(short)); + m_pWaveHeaders[n].lpData = (LPSTR)(m_pvBlockMemory[n].data()); + } + + // To begin with, all blocks are free + m_nBlockFree = m_pHost->GetBlocks(); + return true; + } + + bool WinMM::Start() + { + // Prepare driver thread for activity + m_bDriverLoopActive = true; + // and get it going! + m_thDriverLoop = std::thread(&WinMM::DriverLoop, this); + return true; + } + + void WinMM::Stop() + { + // Signal the driver loop to exit + m_bDriverLoopActive = false; + + // Wait for driver thread to exit gracefully + if (m_thDriverLoop.joinable()) + m_thDriverLoop.join(); + } + + void WinMM::Close() + { + waveOutClose(m_hwDevice); + } + + // Static Callback wrapper - specific instance is specified + void CALLBACK WinMM::waveOutProc(HWAVEOUT hWaveOut, UINT uMsg, DWORD_PTR dwInstance, DWORD dwParam1, DWORD dwParam2) + { + // All sorts of messages may be pinged here, but we're only interested + // in audio block is finished... + if (uMsg != WOM_DONE) return; + + // ...which has happened so allow driver object to free resource + WinMM* driver = (WinMM*)dwInstance; + driver->FreeAudioBlock(); + } + + void WinMM::FreeAudioBlock() + { + // Audio subsystem is done with the block it was using, thus + // making it available again + m_nBlockFree++; + + // Signal to driver loop that a block is now available. It + // could have been suspended waiting for one + std::unique_lock lm(m_muxBlockNotZero); + m_cvBlockNotZero.notify_one(); + } + + void WinMM::DriverLoop() + { + // We will be using this vector to transfer to the host for filling, with + // user sound data (float32, -1.0 --> +1.0) + std::vector vFloatBuffer(m_pHost->GetBlockSampleCount() * m_pHost->GetChannels(), 0.0f); + + // While the system is active, start requesting audio data + while (m_bDriverLoopActive) + { + // Are there any blocks available to fill? ... + if (m_nBlockFree == 0) + { + // ...no, So wait until one is available + std::unique_lock lm(m_muxBlockNotZero); + while (m_nBlockFree == 0) // sometimes, Windows signals incorrectly + { + // This thread will suspend until this CV is signalled + // from FreeAudioBlock. + m_cvBlockNotZero.wait(lm); + } + } + + // ...yes, so use next one, by indicating one fewer + // block is available + m_nBlockFree--; + + // Prepare block for processing, by oddly, marking it as unprepared :P + if (m_pWaveHeaders[m_nBlockCurrent].dwFlags & WHDR_PREPARED) + { + waveOutUnprepareHeader(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR)); + } + + // Give the userland the opportunity to fill the buffer. Note that the driver + // doesnt give a hoot about timing. Thats up to the SoundWave interface to + // maintain + + // Userland will populate a float buffer, that gets cleanly converted to + // a buffer of shorts for DAC + ProcessOutputBlock(vFloatBuffer, m_pvBlockMemory[m_nBlockCurrent]); + + // Send block to sound device + waveOutPrepareHeader(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR)); + waveOutWrite(m_hwDevice, &m_pWaveHeaders[m_nBlockCurrent], sizeof(WAVEHDR)); + m_nBlockCurrent++; + m_nBlockCurrent %= m_pHost->GetBlocks(); + } + } +} // WinMM Driver Implementation +#endif +#if defined(SOUNDWAVE_USING_SDLMIXER) + +namespace olc::sound::driver +{ + + SDLMixer* SDLMixer::instance = nullptr; + + SDLMixer::SDLMixer(olc::sound::WaveEngine* pHost) + : Base(pHost) + { + instance = this; + } + + SDLMixer::~SDLMixer() + { + Stop(); + Close(); + } + + bool SDLMixer::Open(const std::string& sOutputDevice, const std::string& sInputDevice) + { + auto errc = Mix_OpenAudioDevice(static_cast(m_pHost->GetSampleRate()), + AUDIO_F32, + static_cast(m_pHost->GetChannels()), + static_cast(m_pHost->GetBlockSampleCount()), + sOutputDevice == "DEFAULT" ? nullptr : sOutputDevice.c_str(), + SDL_AUDIO_ALLOW_FORMAT_CHANGE); + + // Query the actual format of the audio device, as we have allowed it to be changed. + if (errc || !Mix_QuerySpec(nullptr, &m_haveFormat, nullptr)) + { + std::cerr << "Failed to open audio device '" << sOutputDevice << "'" << std::endl; + return false; + } + + // Compute the Mix_Chunk buffer's size according to the format of the audio device + Uint32 bufferSize = 0; + switch (m_haveFormat) + { + case AUDIO_F32: + case AUDIO_S32: + bufferSize = m_pHost->GetBlockSampleCount() * m_pHost->GetChannels() * 4; + break; + case AUDIO_S16: + case AUDIO_U16: + bufferSize = m_pHost->GetBlockSampleCount() * m_pHost->GetChannels() * 2; + break; + case AUDIO_S8: + case AUDIO_U8: + bufferSize = m_pHost->GetBlockSampleCount() * m_pHost->GetChannels() * 1; + break; + default: + std::cerr << "Audio format of device '" << sOutputDevice << "' is not supported" << std::endl; + return false; + } + + // Allocate the buffer once. The size will never change after this + audioBuffer.resize(bufferSize); + audioChunk = { + 0, // 0, as the chunk does not own the array + audioBuffer.data(), // Pointer to data array + bufferSize, // Size in bytes + 128 // Volume; max by default as it's not controlled by the driver. + }; + + return true; + } + + template + void ConvertFloatTo(const std::vector& fromArr, Int* toArr) + { + static auto minVal = static_cast(std::numeric_limits::min()); + static auto maxVal = static_cast(std::numeric_limits::max()); + for (size_t i = 0; i != fromArr.size(); ++i) + { + toArr[i] = static_cast(std::clamp(fromArr[i] * maxVal, minVal, maxVal)); + } + } + + void SDLMixer::FillChunkBuffer(const std::vector& userData) const + { + // Since the audio device might have changed the format we need to provide, + // we convert the wave data from the user to that format. + switch (m_haveFormat) + { + case AUDIO_F32: + memcpy(audioChunk.abuf, userData.data(), audioChunk.alen); + break; + case AUDIO_S32: + ConvertFloatTo(userData, reinterpret_cast(audioChunk.abuf)); + break; + case AUDIO_S16: + ConvertFloatTo(userData, reinterpret_cast(audioChunk.abuf)); + break; + case AUDIO_U16: + ConvertFloatTo(userData, reinterpret_cast(audioChunk.abuf)); + break; + case AUDIO_S8: + ConvertFloatTo(userData, reinterpret_cast(audioChunk.abuf)); + break; + case AUDIO_U8: + ConvertFloatTo(userData, audioChunk.abuf); + break; + } + } + + void SDLMixer::SDLMixerCallback(int channel) + { + static std::vector userData(instance->m_pHost->GetBlockSampleCount() * instance->m_pHost->GetChannels()); + + if (channel != 0) + { + std::cerr << "Unexpected channel number" << std::endl; + } + + // Don't add another chunk if we should not keep running + if (!instance->m_keepRunning) + return; + + instance->GetFullOutputBlock(userData); + instance->FillChunkBuffer(userData); + + if (Mix_PlayChannel(0, &instance->audioChunk, 0) == -1) + { + std::cerr << "Error while playing Chunk" << std::endl; + } + } + + bool SDLMixer::Start() + { + m_keepRunning = true; + + // Kickoff the audio driver + SDLMixerCallback(0); + + // SDLMixer handles all other calls to reinsert user data + Mix_ChannelFinished(SDLMixerCallback); + return true; + } + + void SDLMixer::Stop() + { + m_keepRunning = false; + + // Stop might be called multiple times, so we check whether the device is already closed + if (Mix_QuerySpec(nullptr, nullptr, nullptr)) + { + for (int i = 0; i != m_pHost->GetChannels(); ++i) + { + if (Mix_Playing(i)) + Mix_HaltChannel(i); + } + } + } + + void SDLMixer::Close() + { + Mix_CloseAudio(); + } +} + +#endif // SOUNDWAVE_USING_SDLMIXER +#if defined(SOUNDWAVE_USING_ALSA) +// ALSA Driver Implementation +namespace olc::sound::driver +{ + ALSA::ALSA(WaveEngine* pHost) : Base(pHost) + { } + + ALSA::~ALSA() + { + Stop(); + Close(); + } + + bool ALSA::Open(const std::string& sOutputDevice, const std::string& sInputDevice) + { + // Open PCM stream + int rc = snd_pcm_open(&m_pPCM, "default", SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK); + + // Clear global cache. + // This won't affect users who don't want to create multiple instances of this driver, + // but it will prevent valgrind from whining about "possibly lost" memory. + // If the user's ALSA setup uses a PulseAudio plugin, then valgrind will still compain + // about some "still reachable" data used by that plugin. TODO? + snd_config_update_free_global(); + + if (rc < 0) + return false; + + // Prepare the parameter structure and set default parameters + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + snd_pcm_hw_params_any(m_pPCM, params); + + // Set other parameters + snd_pcm_hw_params_set_access(m_pPCM, params, SND_PCM_ACCESS_RW_INTERLEAVED); + snd_pcm_hw_params_set_format(m_pPCM, params, SND_PCM_FORMAT_FLOAT); + snd_pcm_hw_params_set_rate(m_pPCM, params, m_pHost->GetSampleRate(), 0); + snd_pcm_hw_params_set_channels(m_pPCM, params, m_pHost->GetChannels()); + snd_pcm_hw_params_set_period_size(m_pPCM, params, m_pHost->GetBlockSampleCount(), 0); + snd_pcm_hw_params_set_periods(m_pPCM, params, m_pHost->GetBlocks(), 0); + + // Save these parameters + rc = snd_pcm_hw_params(m_pPCM, params); + if (rc < 0) + return false; + + return true; + } + + bool ALSA::Start() + { + // Unsure if really needed, helped prevent underrun on my setup + std::vector vSilence(m_pHost->GetBlockSampleCount() * m_pHost->GetChannels(), 0.0f); + snd_pcm_start(m_pPCM); + for (unsigned int i = 0; i < m_pHost->GetBlocks(); i++) + snd_pcm_writei(m_pPCM, vSilence.data(), m_pHost->GetBlockSampleCount()); + + m_rBuffers.Resize(m_pHost->GetBlocks(), m_pHost->GetBlockSampleCount() * m_pHost->GetChannels()); + + snd_pcm_start(m_pPCM); + m_bDriverLoopActive = true; + m_thDriverLoop = std::thread(&ALSA::DriverLoop, this); + + return true; + } + + void ALSA::Stop() + { + // Signal the driver loop to exit + m_bDriverLoopActive = false; + + // Wait for driver thread to exit gracefully + if (m_thDriverLoop.joinable()) + m_thDriverLoop.join(); + + if (m_pPCM != nullptr) + snd_pcm_drop(m_pPCM); + } + + void ALSA::Close() + { + if (m_pPCM != nullptr) + { + snd_pcm_close(m_pPCM); + m_pPCM = nullptr; + } + // Clear the global cache again for good measure + snd_config_update_free_global(); + } + + void ALSA::DriverLoop() + { + const uint32_t nFrames = m_pHost->GetBlockSampleCount(); + + int err; + std::vector vFDs; + + int nFDs = snd_pcm_poll_descriptors_count(m_pPCM); + if (nFDs < 0) + { + std::cerr << "snd_pcm_poll_descriptors_count returned " << nFDs << "\n"; + std::cerr << "disabling polling\n"; + nFDs = 0; + } + else + { + vFDs.resize(nFDs); + + err = snd_pcm_poll_descriptors(m_pPCM, vFDs.data(), vFDs.size()); + if (err < 0) + { + std::cerr << "snd_pcm_poll_descriptors returned " << err << "\n"; + std::cerr << "disabling polling\n"; + vFDs = {}; + } + } + + // While the system is active, start requesting audio data + while (m_bDriverLoopActive) + { + if (!m_rBuffers.IsFull()) + { + // Grab some audio data + auto& vFreeBuffer = m_rBuffers.GetFreeBuffer(); + GetFullOutputBlock(vFreeBuffer); + } + + // Wait a bit if our buffer is full + auto avail = snd_pcm_avail_update(m_pPCM); + while (m_rBuffers.IsFull() && avail < nFrames) + { + if (vFDs.size() == 0) break; + + err = poll(vFDs.data(), vFDs.size(), -1); + if (err < 0) + std::cerr << "poll returned " << err << "\n"; + + unsigned short revents; + err = snd_pcm_poll_descriptors_revents(m_pPCM, vFDs.data(), vFDs.size(), &revents); + if (err < 0) + std::cerr << "snd_pcm_poll_descriptors_revents returned " << err << "\n"; + + if (revents & POLLERR) + std::cerr << "POLLERR\n"; + + avail = snd_pcm_avail_update(m_pPCM); + } + + // Write whatever we can + while (!m_rBuffers.IsEmpty() && avail >= nFrames) + { + auto vFullBuffer = m_rBuffers.GetFullBuffer(); + uint32_t nWritten = 0; + + while (nWritten < nFrames) + { + auto err = snd_pcm_writei(m_pPCM, vFullBuffer.data() + nWritten, nFrames - nWritten); + if (err > 0) + nWritten += err; + else + { + std::cerr << "snd_pcm_writei returned " << err << "\n"; + break; + } + } + avail = snd_pcm_avail_update(m_pPCM); + } + } + } +} // ALSA Driver Implementation +#endif +#if defined(SOUNDWAVE_USING_PULSE) + // PULSE Driver Implementation +#include +#include + +namespace olc::sound::driver +{ + PulseAudio::PulseAudio(WaveEngine* pHost) : Base(pHost) + { } + + PulseAudio::~PulseAudio() + { + Stop(); + Close(); + } + + bool PulseAudio::Open(const std::string& sOutputDevice, const std::string& sInputDevice) + { + pa_sample_spec ss { + PA_SAMPLE_FLOAT32, m_pHost->GetSampleRate(), (uint8_t)m_pHost->GetChannels() + }; + + m_pPA = pa_simple_new(NULL, "olcSoundWaveEngine", PA_STREAM_PLAYBACK, NULL, + "Output Stream", &ss, NULL, NULL, NULL); + + if (m_pPA == NULL) + return false; + + return true; + } + + bool PulseAudio::Start() + { + m_bDriverLoopActive = true; + m_thDriverLoop = std::thread(&PulseAudio::DriverLoop, this); + + return true; + } + + void PulseAudio::Stop() + { + // Signal the driver loop to exit + m_bDriverLoopActive = false; + + // Wait for driver thread to exit gracefully + if (m_thDriverLoop.joinable()) + m_thDriverLoop.join(); + } + + void PulseAudio::Close() + { + if (m_pPA != nullptr) + { + pa_simple_free(m_pPA); + m_pPA = nullptr; + } + } + + void PulseAudio::DriverLoop() + { + // We will be using this vector to transfer to the host for filling, with + // user sound data (float32, -1.0 --> +1.0) + std::vector vFloatBuffer(m_pHost->GetBlockSampleCount() * m_pHost->GetChannels(), 0.0f); + + // While the system is active, start requesting audio data + while (m_bDriverLoopActive) + { + // Grab audio data from user + GetFullOutputBlock(vFloatBuffer); + + // Fill PulseAudio data buffer + int error; + if (pa_simple_write(m_pPA, vFloatBuffer.data(), + vFloatBuffer.size() * sizeof(float), &error) < 0) + { + std::cerr << "Failed to feed data to PulseAudio: " << pa_strerror(error) << "\n"; + } + } + } +} // PulseAudio Driver Implementation +#endif + +#endif // OLC_SOUNDWAVE IMPLEMENTATION +#endif // OLC_SOUNDWAVE_H diff --git a/olcCodeJam2023Entry/olcUTIL_Camera2D.h b/olcCodeJam2023Entry/olcUTIL_Camera2D.h new file mode 100644 index 0000000..a482b78 --- /dev/null +++ b/olcCodeJam2023Entry/olcUTIL_Camera2D.h @@ -0,0 +1,258 @@ +/* + OneLoneCoder - Camera2D v1.00 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + A 2D world camera with various modes + + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2022 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions or derivations of source code must retain the above + copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce + the above copyright notice. This list of conditions and the following + disclaimer must be reproduced in the documentation and/or other + materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + + Author + ~~~~~~ + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021, 2022 + +*/ + +#pragma once + +#include "olcPixelGameEngine.h" + +namespace olc::utils +{ + class Camera2D + { + public: + enum class Mode : uint8_t + { + Simple, // No motion, just directly settable + EdgeMove, // Moves as target crosses boundary + LazyFollow, // Lazily follows the target + FixedScreens, // Moves statically between "screens" + }; + + public: + inline Camera2D() : m_pTarget(&m_vLocalTarget) {} + + // Construct a camera with a viewable area size, and an optional starting position + inline Camera2D(const olc::vf2d& vViewSize, const olc::vf2d& vViewPos = { 0.0f, 0.0f }) : m_pTarget(&m_vLocalTarget) + { + m_vViewSize = vViewSize; + m_vViewPos = vViewPos; + } + + // Set the operational mode of this camera + inline void SetMode(const Mode t) + { + m_nMode = t; + } + + // Get the operational mode of this camera + inline Mode GetMode() const + { + return m_nMode; + } + + // Get the position of the target being tracked by this camera + inline const olc::vf2d& GetTarget() const + { + return *m_pTarget; + } + + // Get the position of the cameras focus point + inline const olc::vf2d& GetPosition() const + { + return m_vPosition; + } + + // Get the top left of teh cameras visible area in world space + inline const olc::vf2d& GetViewPosition() const + { + return m_vViewPos; + } + + // Get the camera's visible area + inline const olc::vf2d& GetViewSize() const + { + return m_vViewSize; + } + + // Set tracked point via pointer + inline void SetTarget(olc::vf2d& vTarget) + { + m_pTarget = &vTarget; + } + + // Set tracked point via const ref - {10, 35} for example + inline void SetTarget(const olc::vf2d&& vTarget) + { + m_vLocalTarget = vTarget; + m_pTarget = &m_vLocalTarget; + } + + // Set world boundary rectangle + inline void SetWorldBoundary(const olc::vf2d& vPos, const olc::vf2d& vSize) + { + m_vWorldBoundaryPos = vPos; + m_vWorldBoundarySize = vSize; + } + + // Instruct camera to respect world boundaries + inline void EnableWorldBoundary(const bool bEnable) + { + m_bWorldBoundary = bEnable; + } + + // Are we using a world boundary? + inline bool IsWorldBoundaryEnabled() const + { + return m_bWorldBoundary; + } + + // Get the world boundary rectangle position + inline const olc::vf2d& GetWorldBoundaryPosition() const + { + return m_vWorldBoundaryPos; + } + + // Get the world boundary rectangle size + inline const olc::vf2d& GetWorldBoundarySize() const + { + return m_vWorldBoundarySize; + } + + // Set the velocity at which the lazy follower reaches tracked point + inline void SetLazyFollowRate(const float fRate) + { + m_fLazyFollowRate = fRate; + } + + // Get the velocity at which the lazy follower reaches tracked point + inline float GetLazyFollowRate() const + { + return m_fLazyFollowRate; + } + + // Set distance from tracked point to start nudging screen + inline void SetEdgeTriggerDistance(const olc::vf2d& vEdge) + { + m_vEdgeTriggerDistance = vEdge; + } + + // Return disance from tracked point that screen will nudge + inline const olc::vf2d& GetEdgeTriggerDistance() const + { + return m_vEdgeTriggerDistance; + } + + // Update camera, animating if necessary, obeying world boundary rules + // returns true if target is visible + inline virtual bool Update(const float fElapsedTime) + { + switch (m_nMode) + { + case Mode::Simple: + { + m_vPosition = GetTarget(); + } + break; + + case Mode::EdgeMove: + { + olc::vf2d vOverlap = GetTarget() - m_vPosition; + if (vOverlap.x > m_vEdgeTriggerDistance.x) m_vPosition.x += vOverlap.x - m_vEdgeTriggerDistance.x; + if (vOverlap.x < -m_vEdgeTriggerDistance.x) m_vPosition.x += vOverlap.x + m_vEdgeTriggerDistance.x; + if (vOverlap.y > m_vEdgeTriggerDistance.y) m_vPosition.y += vOverlap.y - m_vEdgeTriggerDistance.y; + if (vOverlap.y < -m_vEdgeTriggerDistance.y) m_vPosition.y += vOverlap.y + m_vEdgeTriggerDistance.y; + } + break; + + case Mode::LazyFollow: + { + m_vPosition += (GetTarget() - m_vPosition) * m_fLazyFollowRate * fElapsedTime; + } + break; + + case Mode::FixedScreens: + { + m_vPosition = olc::vf2d(olc::vi2d(GetTarget() / m_vScreenSize) * olc::vi2d(m_vScreenSize)) + (m_vViewSize * 0.5f); + } + break; + } + + // Make camera target the middle of the view + m_vViewPos = m_vPosition - (m_vViewSize * 0.5f); + + // Clamp to World Boundary (if in place) + if (m_bWorldBoundary) + { + m_vViewPos = m_vViewPos.max(m_vWorldBoundaryPos).min(m_vWorldBoundaryPos + m_vWorldBoundarySize - m_vViewSize); + } + + return GetTarget().x >= m_vViewPos.x && GetTarget().x < (m_vViewPos.x + m_vViewSize.x) && + GetTarget().y >= m_vViewPos.y && GetTarget().y < (m_vViewPos.y + m_vViewSize.y); + } + + protected: + // Position of camera focus point in the world + olc::vf2d m_vPosition; + // Rectangular size of camera viewing area + olc::vf2d m_vViewSize; + // Top left coordinate of camera viewing area + olc::vf2d m_vViewPos; + // Camera movement mode + Mode m_nMode = Mode::Simple; + + // Target Vector2D object camera should follow (either ref or ptr) + olc::vf2d* m_pTarget = nullptr; + olc::vf2d m_vLocalTarget; + + // World Boundary + bool m_bWorldBoundary = false; + olc::vf2d m_vWorldBoundaryPos = { 0.0f, 0.0f }; + olc::vf2d m_vWorldBoundarySize = { 256.0f, 240.0f }; + + // Mode specific + olc::vf2d m_vEdgeTriggerDistance = { 1.0f, 1.0f }; + float m_fLazyFollowRate = 4.0f; + olc::vi2d m_vScreenSize = { 16,15 }; + }; +} \ No newline at end of file diff --git a/olcCodeJam2023Entry/olcUTIL_Geometry2D.h b/olcCodeJam2023Entry/olcUTIL_Geometry2D.h new file mode 100644 index 0000000..3b8f363 --- /dev/null +++ b/olcCodeJam2023Entry/olcUTIL_Geometry2D.h @@ -0,0 +1,1046 @@ +/* + OneLoneCoder - Geometry 2D v1.01 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + A collection of 2D Geometric primitives and functions to work with + and between them. + + + License (OLC-3) + ~~~~~~~~~~~~~~~ + + Copyright 2018 - 2022 OneLoneCoder.com + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions or derivations of source code must retain the above + copyright notice, this list of conditions and the following disclaimer. + + 2. Redistributions or derivative works in binary form must reproduce + the above copyright notice. This list of conditions and the following + disclaimer must be reproduced in the documentation and/or other + materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + Links + ~~~~~ + YouTube: https://www.youtube.com/javidx9 + Discord: https://discord.gg/WhwHUMV + Twitter: https://www.twitter.com/javidx9 + Twitch: https://www.twitch.tv/javidx9 + GitHub: https://www.github.com/onelonecoder + Homepage: https://www.onelonecoder.com + + Author + ~~~~~~ + David Barr, aka javidx9, ©OneLoneCoder 2019, 2020, 2021, 2022 + + Changes: + v1.01: +Made constants inline + +Header guards (lol... sigh...) + +*/ + +#pragma once +#include "olcPixelGameEngine.h" + +namespace olc::utils::geom2d +{ + // Lemon Meringue + inline const double pi = 3.141592653589793238462643383279502884; + + // Floating point error margin + inline const double epsilon = 0.001; + + //https://stackoverflow.com/questions/1903954/is-there-a-standard-sign-function-signum-sgn-in-c-c + template + constexpr int sgn(T val) { return (T(0) < val) - (val < T(0)); } + + // Defines a line segment + template + struct line + { + olc::v2d_generic start; + olc::v2d_generic end; + + inline line(const olc::v2d_generic& s = { T(0), T(0) }, + const olc::v2d_generic& e = { T(0), T(0) }) + : start(s), end(e) + { } + + + // Get length of line + inline constexpr T length() + { + return (end - start).mag(); + } + + // Get length of line^2 + inline constexpr T length2() + { + return (end - start).mag2(); + } + + inline constexpr olc::v2d_generic vector() const + { + return (end - start); + } + + // Given a real distance, get point along line + inline constexpr olc::v2d_generic rpoint(const T& distance) const + { + return start + (end - start).norm() * distance; + } + + // Given a unit distance, get point along line + inline constexpr olc::v2d_generic upoint(const T& distance) const + { + return start + (end - start) * distance; + } + + // Return which side of the line does a point lie + inline constexpr int32_t side(const olc::v2d_generic& point) const + { + double d = (end - start).cross(point - start); + if (d < 0) + return -1; + else + if (d > 0) + return 1; + else + return 0; + } + }; + + template + struct ray + { + olc::v2d_generic origin; + olc::v2d_generic direction; + }; + + template + struct rect + { + olc::v2d_generic pos; + olc::v2d_generic size; + + inline rect(const olc::v2d_generic& p = { T(0), T(0) }, + const olc::v2d_generic& s = { T(1), T(1) }) + : pos(p), size(s) + { } + + inline olc::v2d_generic middle() const + { + return pos + (size * double(0.5)); + } + + // Get line segment from top side of rectangle + inline line top() const + { + return { pos, {pos.x + size.x, pos.y } }; + } + + // Get line segment from bottom side of rectangle + inline line bottom() const + { + return { {pos.x, pos.y + size.y}, pos + size }; + } + + // Get line segment from left side of rectangle + inline line left() const + { + return { pos, {pos.x, pos.y + size.y} }; + } + + // Get line segment from right side of rectangle + inline line right() const + { + return { {pos.x + size.x, pos.y }, pos + size }; + } + + // Get a line from an indexed side, starting top, going clockwise + inline line side(const size_t i) const + { + if (i & 0b11 == 0) return top(); + if (i & 0b11 == 1) return right(); + if (i & 0b11 == 2) return bottom(); + if (i & 0b11 == 3) return left(); + } + + // Get area of rectangle + inline constexpr T area() const + { + return size.x * size.y; + } + + // Get perimeter of rectangle + inline constexpr T perimeter() const + { + return T(2) * (size.x + size.y); + } + }; + + + template + struct circle + { + olc::v2d_generic pos; + T radius = T(0); + + inline circle(const olc::v2d_generic& p = { T(0), T(0) }, const T r = T(0)) + : pos(p), radius(r) + { } + + // Get area of circle + inline constexpr T area() const + { + return T(pi) * radius * radius; + } + + // Get circumference of circle + inline constexpr T perimeter() const + { + return T(2.0 * pi) * radius; + } + + // Get circumference of circle + inline constexpr T circumference() const + { + return perimeter(); + } + }; + + + template + struct triangle + { + std::array, 3> pos; + + inline triangle( + const olc::v2d_generic& p0 = { T(0), T(0) }, + const olc::v2d_generic& p1 = { T(0), T(0) }, + const olc::v2d_generic& p2 = { T(0), T(0) }) + : pos{ p0,p1,p2 } + { } + + // Get a line from an indexed side, starting top, going clockwise + inline line side(const size_t i) const + { + return line(pos[i % 3], pos[(i + 1) % 3]); + } + + // Get area of triangle + inline constexpr T area() const + { + return double(0.5) * std::abs( + (pos[0].x * (pos[1].y - pos[2].y)) + + (pos[1].x * (pos[2].y - pos[0].y)) + + (pos[2].x * (pos[0].y - pos[1].y))); + } + + // Get perimeter of triangle + inline constexpr T perimeter() const + { + return line(pos[0], pos[1]).length() + + line(pos[1], pos[2]).length() + + line(pos[2], pos[0]).length(); + } + }; + + + template + struct polygon + { + std::vector> vPoints; + }; + + + // ========================================================================================================================= + // Closest(shape, point) =================================================================================================== + + // Returns closest point to point + template + inline olc::v2d_generic closest(const olc::v2d_generic& p1, const olc::v2d_generic& p2) + { + return p1; + } + + // Returns closest point on line to point + template + inline olc::v2d_generic closest(const line& l, const olc::v2d_generic& p) + { + auto d = l.vector(); + double u = std::clamp(double(d.dot(p - l.start)) / d.mag2(), 0.0, 1.0); + return l.start + u * d; + } + + // Returns closest point on circle to point + template + inline olc::v2d_generic closest(const circle& c, const olc::v2d_generic& p) + { + return c.pos + olc::vd2d(p - c.pos).norm() * c.radius; + } + + // Returns closest point on rectangle to point + template + inline olc::v2d_generic closest(const rect& r, const olc::v2d_generic& p) + { + // This could be a "constrain" function hmmmm + // TODO: Not quite what i wanted, should restrain to boundary + return olc::v2d_generic{ std::clamp(p.x, r.pos.x, r.pos.x + r.size.x), std::clamp(p.y, r.pos.y, r.pos.y + r.size.y) }; + + } + + // Returns closest point on triangle to point + template + inline olc::v2d_generic closest(const triangle& t, const olc::v2d_generic& p) + { + olc::utils::geom2d::line l{t.pos[0], t.pos[1]}; + auto p0 = closest(l, p); + auto d0 = (p0 - p).mag2(); + + l.end = t.pos[2]; + auto p1 = closest(l, p); + auto d1 = (p1 - p).mag2(); + + l.start = t.pos[1]; + auto p2 = closest(l, p); + auto d2 = (p2 - p).mag2(); + + if((d0 <= d1) && (d0 <= d2)) { + return p0; + } else if((d1 <= d0) && (d1 <= d2)) { + return p1; + } else { + return p2; + } + } + + + + + + + + + + + + // ================================================================================================================ + // POINT ========================================================================================================== + + // Checks if point contains point + template + inline constexpr bool contains(const olc::v2d_generic& p1, const olc::v2d_generic& p2) + { + return (p1 - p2).mag2() < epsilon; + } + + // Checks if line contains point + template + inline constexpr bool contains(const line& l, const olc::v2d_generic& p) + { + double d = ((p.x - l.start.x) * (l.end.y - l.start.y) - (p.y - l.start.y) * (l.end.x - l.start.x)); + if (std::abs(d) < epsilon) + { + // point is on line + double u = l.vector().dot(p - l.start) / l.vector().mag2(); + return (u >= double(0.0) && u <= double(1.0)); + } + + return false; + } + + // Checks if rectangle contains point + template + inline constexpr bool contains(const rect& r, const olc::v2d_generic& p) + { + return !(p.x < r.pos.x || p.y < r.pos.y || + p.x > (r.pos.x + r.size.x) || p.y > (r.pos.y + r.size.y)); + } + + // Checks if circle contains a point + template + inline constexpr bool contains(const circle& c, const olc::v2d_generic& p) + { + return (c.pos - p).mag2() < (c.radius * c.radius); + } + + // Checks if triangle contains a point + template + inline constexpr bool contains(const triangle& t, const olc::v2d_generic& p) + { + // http://jsfiddle.net/PerroAZUL/zdaY8/1/ + T2 A = T2(0.5) * (-t.pos[1].y * t.pos[2].x + t.pos[0].y * (-t.pos[1].x + t.pos[2].x) + t.pos[0].x * (t.pos[1].y - t.pos[2].y) + t.pos[1].x * t.pos[2].y); + T2 sign = A < T2(0) ? T2(-1) : T2(1); + T2 s = (t.pos[0].y * t.pos[2].x - t.pos[0].x * t.pos[2].y + (t.pos[2].y - t.pos[0].y) * p.x + (t.pos[0].x - t.pos[2].x) * p.y) * sign; + T2 v = (t.pos[0].x * t.pos[1].y - t.pos[0].y * t.pos[1].x + (t.pos[0].y - t.pos[1].y) * p.x + (t.pos[1].x - t.pos[0].x) * p.y) * sign; + return s > T2(0) && v > T2(0) && (s + v) < T2(2) * A * sign; + } + + + + + // Check if point overlaps with point (analagous to contains()) + template + inline constexpr bool overlaps(const olc::v2d_generic& p1, const olc::v2d_generic& p2) + { + return contains(p1, p2); + } + + // Checks if line segment overlaps with point + template + inline constexpr bool overlaps(const line& l, const olc::v2d_generic& p) + { + return contains(l, p); + } + + // Checks if rectangle overlaps with point + template + inline constexpr bool overlaps(const rect& r, const olc::v2d_generic& p) + { + return contains(r, p); + } + + // Checks if circle overlaps with point + template + inline constexpr bool overlaps(const circle& c, const olc::v2d_generic& p) + { + return contains(c, p); + } + + // Checks if triangle overlaps with point + template + inline constexpr bool overlaps(const triangle& t, const olc::v2d_generic& p) + { + return contains(t, p); + } + + + + + // Get intersection points where point intersects with point + template + inline std::vector> intersects(const olc::v2d_generic& p1, const olc::v2d_generic& p2) + { + if (contains(p1, p2)) + return { p1 }; + else + return {}; + } + + // Get intersection points where line segment intersects with point + template + inline std::vector> intersects(const line& l, const olc::v2d_generic& p) + { + if (contains(l, p)) + return { p }; + else + return {}; + } + + // Get intersection points where rectangle intersects with point + template + inline std::vector> intersects(const rect& r, const olc::v2d_generic& p) + { + std::vector> vPoints; + if (contains(r.top(), p)) vPoints.push_back(p); + if (contains(r.bottom(), p)) vPoints.push_back(p); + if (contains(r.left(), p)) vPoints.push_back(p); + if (contains(r.right(), p)) vPoints.push_back(p); + return vPoints; + } + + // Get intersection points where circle intersects with point + template + inline std::vector> intersects(const circle& c, const olc::v2d_generic& p) + { + if (std::abs((p - c.pos).mag2() - (c.radius * c.radius)) <= epsilon) + return { p }; + else + return {}; + } + + // Get intersection points where triangle intersects with point + template + inline std::vector> intersects(const triangle& r, const olc::v2d_generic& p) + { + // TODO: + return {}; + } + + + + + + + + + + + + + // ================================================================================================================ + // LINE =========================================================================================================== + + // Check if point contains line segment + template + inline constexpr bool contains(const olc::v2d_generic& p, const line& l) + { + return false; // It can't! + } + + // Check if line segment contains line segment + template + inline constexpr bool contains(const line& l1, const line& l2) + { + // TODO: Check if segments are colinear, and l1 exists within bounds of l2 + return false; + } + + // Check if rectangle contains line segment + template + inline constexpr bool contains(const rect& r, const line& l) + { + return contains(r, l.start) && contains(r, l.end); + } + + // Check if circle contains line segment + template + inline constexpr bool contains(const circle& c1, const line& l) + { + return contains(c1, l.start) && contains(c1, l.end); + } + + // Check if triangle contains line segment + template + inline constexpr bool contains(const triangle& t, const line& l) + { + return contains(t, l.start) && contains(t, l.end); + } + + + + + // Check if point overlaps line segment + template + inline constexpr bool overlaps(const olc::v2d_generic& p, const line& l) + { + return contains(l, p); + } + + // Check if line segment overlaps line segment + template + inline constexpr bool overlaps(const line& l1, const line& l2) + { + // TODO: + return false; + } + + // Check if rectangle overlaps line segment + template + inline constexpr bool overlaps(const rect& r, const line& l) + { + return contains(r, l.start) + || contains(r, l.end); + + // TODO: This method is no good, it cant detect lines whose start and end + // points are outside the rectangle + } + + // Check if circle overlaps line segment + template + inline constexpr bool overlaps(const circle& c, const line& l) + { + // TODO: + return false; + } + + // Check if triangle overlaps line segment + template + inline constexpr bool overlaps(const triangle& t, const line& l) + { + return overlaps(t, l.start) || overlaps(t, l.end); + + // TODO: This method is no good, it cant detect lines whose start and end + // points are outside the triangle + } + + + + + // Get intersection points where point intersects with line segment + template + inline std::vector> intersects(const olc::v2d_generic& p, const line& l) + { + // TODO: + return {}; + } + + // Get intersection points where line segment intersects with line segment + template + inline std::vector> intersects(const line& l1, const line& l2) + { + // TODO: + return {}; + } + + // Get intersection points where rectangle intersects with line segment + template + inline std::vector> intersects(const rect& r, const line& l) + { + // TODO: + return {}; + } + + // Get intersection points where circle intersects with line segment + template + inline std::vector> intersects(const circle& c, const line& l) + { + // TODO: + return {}; + } + + // Get intersection points where triangle intersects with line segment + template + inline std::vector> intersects(const triangle& t, const line& l) + { + // TODO: + return {}; + } + + + + + + + + + + + + + // ================================================================================================================ + // RECTANGLE ====================================================================================================== + + // Check if point contains rectangle + template + inline constexpr bool contains(const olc::v2d_generic& p, const rect& r) + { + return false; // It can't! + } + + // Check if line segment contains rectangle + template + inline constexpr bool contains(const line& l, const rect& r) + { + return false; // It can't + } + + // Check if rectangle contains rectangle + template + inline constexpr bool contains(const rect& r1, const rect& r2) + { + return (r2.pos.x >= r1.pos.x) && (r2.pos.x + r2.size.x < r1.pos.x + r1.size.x) && + (r2.pos.y >= r1.pos.y) && (r2.pos.y + r2.size.y < r1.pos.y + r1.size.y); + } + + // Check if circle contains rectangle + template + inline constexpr bool contains(const circle& c, const rect& r) + { + return contains(c, r.pos) + && contains(c, olc::v2d_generic{ r.pos.x + r.size.x, r.pos.y }) + && contains(c, olc::v2d_generic{ r.pos.x, r.pos.y + r.size.y }) + && contains(c, r.pos + r.size); + } + + // Check if triangle contains rectangle + template + inline constexpr bool contains(const triangle& t, const rect& r) + { + return contains(t, r.pos) + && contains(t, r.pos + r.size) + && contains(t, olc::v2d_generic{ r.pos.x + r.size.x,r.pos.y }) + && contains(t, olc::v2d_generic{ r.pos.x, r.pos.y + r.size.y }); + } + + + + + // Check if point overlaps rectangle + template + inline constexpr bool overlaps(const olc::v2d_generic& p, const rect& r) + { + return overlaps(r, p); + } + + // Check if line segment overlaps rectangle + template + inline constexpr bool overlaps(const line& l, const rect& r) + { + return overlaps(r, l); + } + + // Check if rectangle overlaps rectangle + template + inline constexpr bool overlaps(const rect& r1, const rect& r2) + { + return (r1.pos.x < r2.pos.x + r2.size.x && r1.pos.x + r1.size.x >= r2.pos.x && + r1.pos.y < r2.pos.y + r2.size.y && r1.pos.y + r1.size.y >= r2.pos.y); + } + + // Check if circle overlaps rectangle + template + inline constexpr bool overlaps(const circle& c, const rect& r) + { + // Inspired by this (very clever btw) + // https://stackoverflow.com/questions/45370692/circle-rectangle-collision-response + // But modified to work :P + T2 overlap = (olc::v2d_generic{ std::clamp(c.pos.x, r.pos.x, r.pos.x + r.size.x), std::clamp(c.pos.y, r.pos.y, r.pos.y + r.size.y) } - c.pos).mag2(); + if (std::isnan(overlap)) overlap = T2(0); + return (overlap - (c.radius * c.radius)) < T2(0); + } + + // Check if triangle overlaps rectangle + template + inline constexpr bool overlaps(const triangle& t, const rect& r) + { + return contains(t, r.pos) + || contains(t, r.pos + r.size) + || contains(t, olc::v2d_generic{ r.pos.x + r.size.x, r.pos.y }) + || contains(t, olc::v2d_generic{ r.pos.x, r.pos.y + r.size.y }); + + // TODO: This method is no good, consider rectangle with all vertices + // outside of triangle, but edges still crossing + } + + + + + // Get intersection points where point intersects with rectangle + template + inline std::vector> intersects(const olc::v2d_generic& p, const rect& r) + { + return intersects(r, p); + } + + // Get intersection points where line segment intersects with rectangle + template + inline std::vector> intersects(const line& l, const rect& r) + { + // TODO: + return {}; + } + + // Get intersection points where rectangle intersects with rectangle + template + inline std::vector> intersects(const rect& r1, const rect& r2) + { + // TODO: + return {}; + } + + // Get intersection points where circle intersects with rectangle + template + inline std::vector> intersects(const circle& c, const rect& r) + { + // TODO: + return {}; + } + + // Get intersection points where triangle intersects with rectangle + template + inline std::vector> intersects(const triangle& t, const rect& r) + { + // TODO: + return {}; + } + + + + + + + + + + + + + + // ================================================================================================================ + // CIRCLE ========================================================================================================= + + // Check if point contains circle + template + inline constexpr bool contains(const olc::v2d_generic& p, const circle& c) + { + return false; // It can't! + } + + // Check if line segment contains circle + template + inline constexpr bool contains(const line& l, const circle& c) + { + return false; // It can't! + } + + // Check if rectangle contains circle + template + inline constexpr bool contains(const rect& r, const circle& c) + { + // TODO: + return false; + } + + // Check if circle contains circle + template + inline constexpr bool contains(const circle& c1, const circle& c2) + { + return (c1.pos - c2.pos).mag2() <= (c1.radius - c2.radius) * (c1.radius - c2.radius); + } + + // Check if triangle contains circle + template + inline constexpr bool contains(const triangle& t, const circle& c) + { + // TODO: + return false; + } + + + + + // Check if point overlaps circle + template + inline constexpr bool overlaps(const olc::v2d_generic& p, const circle& c) + { + return overlaps(c, p); + } + + // Check if line segment overlaps circle + template + inline constexpr bool overlaps(const line& l, const circle& c) + { + return overlaps(c, l); + } + + // Check if rectangle overlaps circle + template + inline constexpr bool overlaps(const rect& r, const circle& c) + { + return overlaps(c, r); + } + + // Check if circle overlaps circle + template + inline constexpr bool overlaps(const circle& c1, const circle& c2) + { + return (c1.pos - c2.pos).mag2() <= (c1.radius + c2.radius) * (c1.radius + c2.radius); + } + + // Check if triangle overlaps circle + template + inline constexpr bool overlaps(const triangle& t, const circle& c) + { + // TODO: + return false; + } + + + + + // Get intersection points where point intersects with circle + template + inline std::vector> intersects(const olc::v2d_generic& p, const circle& c) + { + // TODO: + return {}; + } + + // Get intersection points where line segment intersects with circle + template + inline std::vector> intersects(const line& l, const circle& c) + { + // TODO: + return {}; + } + + // Get intersection points where rectangle intersects with circle + template + inline std::vector> intersects(const rect& r, const circle& c) + { + // TODO: + return {}; + } + + // Get intersection points where circle intersects with circle + template + inline std::vector> intersects(const circle& c1, const circle& c2) + { + // TODO: + return {}; + } + + // Get intersection points where triangle intersects with circle + template + inline std::vector> intersects(const triangle& t, const circle& c) + { + // TODO: + return {}; + } + + + + + + + + + + + + + + // ================================================================================================================ + // TRIANGLE ======================================================================================================= + + // Check if point contains triangle + template + inline constexpr bool contains(const olc::v2d_generic& p, const triangle& t) + { + return false; // It can't! + } + + // Check if line segment contains triangle + template + inline constexpr bool contains(const line& l, const triangle& t) + { + return false; // It can't + } + + // Check if rectangle contains triangle + template + inline constexpr bool contains(const rect& r, const triangle& t) + { + // TODO: + return false; + } + + // Check if circle contains triangle + template + inline constexpr bool contains(const circle& c, const triangle& t) + { + // TODO: + return false; + } + + // Check if triangle contains triangle + template + inline constexpr bool contains(const triangle& t1, const triangle& t2) + { + // TODO: + return false; + } + + + + + // Check if point overlaps triangle + template + inline constexpr bool overlaps(const olc::v2d_generic& p, const triangle& t) + { + return overlaps(t, p); + } + + // Check if line segment overlaps triangle + template + inline constexpr bool overlaps(const line& l, const triangle& t) + { + return overlaps(t, l); + } + + // Check if rectangle overlaps triangle + template + inline constexpr bool overlaps(const rect& r, const triangle& t) + { + return overlaps(t, r); + } + + // Check if circle overlaps triangle + template + inline constexpr bool overlaps(const circle& c, const triangle& t) + { + return overlaps(t, c); + } + + // Check if triangle overlaps triangle + template + inline constexpr bool overlaps(const triangle& t1, const triangle& t2) + { + // TODO: + return false; + } + + + + + // Get intersection points where point intersects with triangle + template + inline std::vector> intersects(const olc::v2d_generic& p, const triangle& t) + { + // TODO: + return {}; + } + + // Get intersection points where line segment intersects with triangle + template + inline std::vector> intersects(const line& l, const triangle& t) + { + // TODO: + return {}; + } + + // Get intersection points where rectangle intersects with triangle + template + inline std::vector> intersects(const rect& r, const triangle& t) + { + // TODO: + return {}; + } + + // Get intersection points where circle intersects with triangle + template + inline std::vector> intersects(const circle& c, const triangle& t) + { + // TODO: + return {}; + } + + // Get intersection points where triangle intersects with triangle + template + inline std::vector> intersects(const triangle& t1, const triangle& t2) + { + // TODO: + return {}; + } + +} \ No newline at end of file diff --git a/olcCodeJam2023Entry/pge.data b/olcCodeJam2023Entry/pge.data new file mode 100644 index 0000000..5e8e58d Binary files /dev/null and b/olcCodeJam2023Entry/pge.data differ diff --git a/olcCodeJam2023Entry/pge.html b/olcCodeJam2023Entry/pge.html new file mode 100644 index 0000000..3c95c1e --- /dev/null +++ b/olcCodeJam2023Entry/pge.html @@ -0,0 +1,1296 @@ + + + + + + Emscripten-Generated Code + + + + + image/svg+xml + + +
+
Downloading...
+ + + Resize canvas + Lock/hide mouse pointer     + + + + +
+ +
+ + +
+ +
+ + + + + + + + diff --git a/olcCodeJam2023Entry/pge.js b/olcCodeJam2023Entry/pge.js new file mode 100644 index 0000000..238f596 --- /dev/null +++ b/olcCodeJam2023Entry/pge.js @@ -0,0 +1,11121 @@ +// include: shell.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) + + if (!Module.expectedDataFileDownloads) { + Module.expectedDataFileDownloads = 0; + } + + Module.expectedDataFileDownloads++; + (function() { + // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. + if (Module['ENVIRONMENT_IS_PTHREAD'] || Module['$ww']) return; + var loadPackage = function(metadata) { + + var PACKAGE_PATH = ''; + if (typeof window === 'object') { + PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.toString().substring(0, window.location.pathname.toString().lastIndexOf('/')) + '/'); + } else if (typeof process === 'undefined' && typeof location !== 'undefined') { + // web worker + PACKAGE_PATH = encodeURIComponent(location.pathname.toString().substring(0, location.pathname.toString().lastIndexOf('/')) + '/'); + } + var PACKAGE_NAME = 'pge.data'; + var REMOTE_PACKAGE_BASE = 'pge.data'; + if (typeof Module['locateFilePackage'] === 'function' && !Module['locateFile']) { + Module['locateFile'] = Module['locateFilePackage']; + err('warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)'); + } + var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE; +var REMOTE_PACKAGE_SIZE = metadata['remote_package_size']; + + function fetchRemotePackage(packageName, packageSize, callback, errback) { + if (typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string') { + require('fs').readFile(packageName, function(err, contents) { + if (err) { + errback(err); + } else { + callback(contents.buffer); + } + }); + return; + } + var xhr = new XMLHttpRequest(); + xhr.open('GET', packageName, true); + xhr.responseType = 'arraybuffer'; + xhr.onprogress = function(event) { + var url = packageName; + var size = packageSize; + if (event.total) size = event.total; + if (event.loaded) { + if (!xhr.addedTotal) { + xhr.addedTotal = true; + if (!Module.dataFileDownloads) Module.dataFileDownloads = {}; + Module.dataFileDownloads[url] = { + loaded: event.loaded, + total: size + }; + } else { + Module.dataFileDownloads[url].loaded = event.loaded; + } + var total = 0; + var loaded = 0; + var num = 0; + for (var download in Module.dataFileDownloads) { + var data = Module.dataFileDownloads[download]; + total += data.total; + loaded += data.loaded; + num++; + } + total = Math.ceil(total * Module.expectedDataFileDownloads/num); + if (Module['setStatus']) Module['setStatus'](`Downloading data... (${loaded}/${total})`); + } else if (!Module.dataFileDownloads) { + if (Module['setStatus']) Module['setStatus']('Downloading data...'); + } + }; + xhr.onerror = function(event) { + throw new Error("NetworkError for: " + packageName); + } + xhr.onload = function(event) { + if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + var packageData = xhr.response; + callback(packageData); + } else { + throw new Error(xhr.statusText + " : " + xhr.responseURL); + } + }; + xhr.send(null); + }; + + function handleError(error) { + console.error('package error:', error); + }; + + var fetchedCallback = null; + var fetched = Module['getPreloadedPackage'] ? Module['getPreloadedPackage'](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE) : null; + + if (!fetched) fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, function(data) { + if (fetchedCallback) { + fetchedCallback(data); + fetchedCallback = null; + } else { + fetched = data; + } + }, handleError); + + function runWithFS() { + + function assert(check, msg) { + if (!check) throw msg + new Error().stack; + } +Module['FS_createPath']("/", "assets", true, true); + + /** @constructor */ + function DataRequest(start, end, audio) { + this.start = start; + this.end = end; + this.audio = audio; + } + DataRequest.prototype = { + requests: {}, + open: function(mode, name) { + this.name = name; + this.requests[name] = this; + Module['addRunDependency'](`fp ${this.name}`); + }, + send: function() {}, + onload: function() { + var byteArray = this.byteArray.subarray(this.start, this.end); + this.finish(byteArray); + }, + finish: function(byteArray) { + var that = this; + // canOwn this data in the filesystem, it is a slide into the heap that will never change + Module['FS_createDataFile'](this.name, null, byteArray, true, true, true); + Module['removeRunDependency'](`fp ${that.name}`); + this.requests[this.name] = null; + } + }; + + var files = metadata['files']; + for (var i = 0; i < files.length; ++i) { + new DataRequest(files[i]['start'], files[i]['end'], files[i]['audio'] || 0).open('GET', files[i]['filename']); + } + + function processPackageData(arrayBuffer) { + assert(arrayBuffer, 'Loading data file failed.'); + assert(arrayBuffer.constructor.name === ArrayBuffer.name, 'bad input to processPackageData'); + var byteArray = new Uint8Array(arrayBuffer); + var curr; + // Reuse the bytearray from the XHR as the source for file reads. + DataRequest.prototype.byteArray = byteArray; + var files = metadata['files']; + for (var i = 0; i < files.length; ++i) { + DataRequest.prototype.requests[files[i].filename].onload(); + } Module['removeRunDependency']('datafile_pge.data'); + + }; + Module['addRunDependency']('datafile_pge.data'); + + if (!Module.preloadResults) Module.preloadResults = {}; + + Module.preloadResults[PACKAGE_NAME] = {fromCache: false}; + if (fetched) { + processPackageData(fetched); + fetched = null; + } else { + fetchedCallback = processPackageData; + } + + } + if (Module['calledRun']) { + runWithFS(); + } else { + if (!Module['preRun']) Module['preRun'] = []; + Module["preRun"].push(runWithFS); // FS is not initialized yet, wait for it + } + + } + loadPackage({"files": [{"filename": "/assets/Vast Horizons.wav", "start": 0, "end": 49444908, "audio": 1}], "remote_package_size": 49444908}); + + })(); + + + // All the pre-js content up to here must remain later on, we need to run + // it. + if (Module['ENVIRONMENT_IS_PTHREAD'] || Module['$ww']) Module['preRun'] = []; + var necessaryPreJSTasks = Module['preRun'].slice(); + + if (!Module['preRun']) throw 'Module.preRun should exist because file support used it; did a pre-js delete it?'; + necessaryPreJSTasks.forEach(function(task) { + if (Module['preRun'].indexOf(task) < 0) throw 'All preRun tasks that exist before user pre-js code should remain after; did you replace Module or modify Module.preRun?'; + }); + + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = Object.assign({}, Module); + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = typeof window == 'object'; +var ENVIRONMENT_IS_WORKER = typeof importScripts == 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +if (ENVIRONMENT_IS_NODE) { + if (typeof process == 'undefined' || !process.release || process.release.name !== 'node') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + var nodeVersion = process.versions.node; + var numericVersion = nodeVersion.split('.').slice(0, 3); + numericVersion = (numericVersion[0] * 10000) + (numericVersion[1] * 100) + (numericVersion[2].split('-')[0] * 1); + var minVersion = 101900; + if (numericVersion < 101900) { + throw new Error('This emscripten-generated code requires node v10.19.19.0 (detected v' + nodeVersion + ')'); + } + + // `require()` is no-op in an ESM module, use `createRequire()` to construct + // the require()` function. This is only necessary for multi-environment + // builds, `-sENVIRONMENT=node` emits a static import declaration instead. + // TODO: Swap all `require()`'s with `import()`'s? + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('fs'); + var nodePath = require('path'); + + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = nodePath.dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + +// include: node_shell_read.js +read_ = (filename, binary) => { + // We need to re-wrap `file://` strings to URLs. Normalizing isn't + // necessary in that case, the path should already be absolute. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + return fs.readFileSync(filename, binary ? undefined : 'utf8'); +}; + +readBinary = (filename) => { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; +}; + +readAsync = (filename, onload, onerror, binary = true) => { + // See the comment in the `read_` function. + filename = isFileURI(filename) ? new URL(filename) : nodePath.normalize(filename); + fs.readFile(filename, binary ? undefined : 'utf8', (err, data) => { + if (err) onerror(err); + else onload(binary ? data.buffer : data); + }); +}; + +// end include: node_shell_read.js + if (!Module['thisProgram'] && process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + arguments_ = process.argv.slice(2); + + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + process.on('uncaughtException', (ex) => { + // suppress ExitStatus exceptions from showing an error + if (ex !== 'unwind' && !(ex instanceof ExitStatus) && !(ex.context instanceof ExitStatus)) { + throw ex; + } + }); + + // Without this older versions of node (< v15) will log unhandled rejections + // but return 0, which is not normally the desired behaviour. This is + // not be needed with node v15 and about because it is now the default + // behaviour: + // See https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode + var nodeMajor = process.versions.node.split(".")[0]; + if (nodeMajor < 15) { + process.on('unhandledRejection', (reason) => { throw reason; }); + } + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + + Module['inspect'] = () => '[Emscripten Module object]'; + +} else +if (ENVIRONMENT_IS_SHELL) { + + if ((typeof process == 'object' && typeof require === 'function') || typeof window == 'object' || typeof importScripts == 'function') throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + if (typeof read != 'undefined') { + read_ = (f) => { + return read(f); + }; + } + + readBinary = (f) => { + let data; + if (typeof readbuffer == 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data == 'object'); + return data; + }; + + readAsync = (f, onload, onerror) => { + setTimeout(() => onload(readBinary(f)), 0); + }; + + if (typeof clearTimeout == 'undefined') { + globalThis.clearTimeout = (id) => {}; + } + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit == 'function') { + quit_ = (status, toThrow) => { + // Unlike node which has process.exitCode, d8 has no such mechanism. So we + // have no way to set the exit code and then let the program exit with + // that code when it naturally stops running (say, when all setTimeouts + // have completed). For that reason, we must call `quit` - the only way to + // set the exit code - but quit also halts immediately. To increase + // consistency with node (and the web) we schedule the actual quit call + // using a setTimeout to give the current stack and any exception handlers + // a chance to run. This enables features such as addOnPostRun (which + // expected to be able to run code after main returns). + setTimeout(() => { + if (!(toThrow instanceof ExitStatus)) { + let toLog = toThrow; + if (toThrow && typeof toThrow == 'object' && toThrow.stack) { + toLog = [toThrow, toThrow.stack]; + } + err(`exiting due to exception: ${toLog}`); + } + quit(status); + }); + throw toThrow; + }; + } + + if (typeof print != 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console == 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr != 'undefined' ? printErr : print); + } + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (typeof document != 'undefined' && document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + // If scriptDirectory contains a query (starting with ?) or a fragment (starting with #), + // they are removed because they could contain a slash. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + if (!(typeof window == 'object' || typeof importScripts == 'function')) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { +// include: web_or_worker_shell_read.js +read_ = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + } + + if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = (url, onload, onerror) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + } + +// end include: web_or_worker_shell_read.js + } + + setWindowTitle = (title) => document.title = title; +} else +{ + throw new Error('environment detection error'); +} + +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.error.bind(console); + +// Merge back in the overrides +Object.assign(Module, moduleOverrides); +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; +checkIncomingModuleAPI(); + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. + +if (Module['arguments']) arguments_ = Module['arguments'];legacyModuleProp('arguments', 'arguments_'); + +if (Module['thisProgram']) thisProgram = Module['thisProgram'];legacyModuleProp('thisProgram', 'thisProgram'); + +if (Module['quit']) quit_ = Module['quit'];legacyModuleProp('quit', 'quit_'); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] == 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +legacyModuleProp('read', 'read_'); +legacyModuleProp('readAsync', 'readAsync'); +legacyModuleProp('readBinary', 'readBinary'); +legacyModuleProp('setWindowTitle', 'setWindowTitle'); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +assert(!ENVIRONMENT_IS_SHELL, "shell environment detected but not enabled at build time. Add 'shell' to `-sENVIRONMENT` to enable."); + + +// end include: shell.js +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; +if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];legacyModuleProp('wasmBinary', 'wasmBinary'); +var noExitRuntime = Module['noExitRuntime'] || true;legacyModuleProp('noExitRuntime', 'noExitRuntime'); + +if (typeof WebAssembly != 'object') { + abort('no native wasm support detected'); +} + +// Wasm globals + +var wasmMemory; + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +// Memory management + +var HEAP, +/** @type {!Int8Array} */ + HEAP8, +/** @type {!Uint8Array} */ + HEAPU8, +/** @type {!Int16Array} */ + HEAP16, +/** @type {!Uint16Array} */ + HEAPU16, +/** @type {!Int32Array} */ + HEAP32, +/** @type {!Uint32Array} */ + HEAPU32, +/** @type {!Float32Array} */ + HEAPF32, +/** @type {!Float64Array} */ + HEAPF64; + +function updateMemoryViews() { + var b = wasmMemory.buffer; + Module['HEAP8'] = HEAP8 = new Int8Array(b); + Module['HEAP16'] = HEAP16 = new Int16Array(b); + Module['HEAP32'] = HEAP32 = new Int32Array(b); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(b); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(b); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(b); + Module['HEAPF32'] = HEAPF32 = new Float32Array(b); + Module['HEAPF64'] = HEAPF64 = new Float64Array(b); +} + +assert(!Module['STACK_SIZE'], 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + +assert(typeof Int32Array != 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray != undefined && Int32Array.prototype.set != undefined, + 'JS engine does not provide full typed array support'); + +// If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY +assert(!Module['wasmMemory'], 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); +assert(!Module['INITIAL_MEMORY'], 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + +// include: runtime_init_table.js +// In regular non-RELOCATABLE mode the table is exported +// from the wasm module and this will be assigned once +// the exports are available. +var wasmTable; + +// end include: runtime_init_table.js +// include: runtime_stack_check.js +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with the (separate) address-zero check + // below. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = 0x02135467; + HEAPU32[(((max)+(4))>>2)] = 0x89BACDFE; + // Also test the global address 0 for integrity. + HEAPU32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var cookie1 = HEAPU32[((max)>>2)]; + var cookie2 = HEAPU32[(((max)+(4))>>2)]; + if (cookie1 != 0x02135467 || cookie2 != 0x89BACDFE) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords 0x89BACDFE and 0x2135467, but received ${ptrToString(cookie2)} ${ptrToString(cookie1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[0] !== 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} + +// end include: runtime_stack_check.js +// include: runtime_assertions.js +// Endianness check +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'; +})(); + +// end include: runtime_assertions.js +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; + +var runtimeKeepaliveCounter = 0; + +function keepRuntimeAlive() { + return noExitRuntime || runtimeKeepaliveCounter > 0; +} + +function preRun() { + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + +if (!Module["noFSInit"] && !FS.init.initialized) + FS.init(); +FS.ignorePermissions = false; + +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + + callRuntimeCallbacks(__ATMAIN__); +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +// include: runtime_math.js +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +// end include: runtime_math.js +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval != 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what = 'Aborted(' + what + ')'; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + EXITSTATUS = 1; + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // defintion for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// include: URIUtils.js +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + // Prefix of data URIs emitted by SINGLE_FILE and related options. + return filename.startsWith(dataURIPrefix); +} + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return filename.startsWith('file://'); +} + +// end include: URIUtils.js +/** @param {boolean=} fixedasm */ +function createExportWrapper(name, fixedasm) { + return function() { + var displayName = name; + var asm = fixedasm; + if (!fixedasm) { + asm = Module['asm']; + } + assert(runtimeInitialized, 'native function `' + displayName + '` called before runtime initialization'); + if (!asm[name]) { + assert(asm[name], 'exported native function `' + displayName + '` not found'); + } + return asm[name].apply(null, arguments); + }; +} + +// include: runtime_exceptions.js +// end include: runtime_exceptions.js +var wasmBinaryFile; + wasmBinaryFile = 'pge.wasm'; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + +function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + if (readBinary) { + return readBinary(file); + } + throw "both async and sync fetching of the wasm failed"; + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise(binaryFile) { + // If we don't have the binary yet, try to load it asynchronously. + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use fetch if it is available and the url is not a file, otherwise fall back to XHR. + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { + if (typeof fetch == 'function' + && !isFileURI(binaryFile) + ) { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + binaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(() => getBinary(binaryFile)); + } + else { + if (readAsync) { + // fetch is not available or url is file => try XHR (readAsync uses XHR internally) + return new Promise((resolve, reject) => { + readAsync(binaryFile, (response) => resolve(new Uint8Array(/** @type{!ArrayBuffer} */(response))), reject) + }); + } + } + } + + // Otherwise, getBinary should be able to get it synchronously + return Promise.resolve().then(() => getBinary(binaryFile)); +} + +function instantiateArrayBuffer(binaryFile, imports, receiver) { + return getBinaryPromise(binaryFile).then((binary) => { + return WebAssembly.instantiate(binary, imports); + }).then((instance) => { + return instance; + }).then(receiver, (reason) => { + err('failed to asynchronously prepare wasm: ' + reason); + + // Warn on some common problems. + if (isFileURI(wasmBinaryFile)) { + err('warning: Loading from a file URI (' + wasmBinaryFile + ') is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing'); + } + abort(reason); + }); +} + +function instantiateAsync(binary, binaryFile, imports, callback) { + if (!binary && + typeof WebAssembly.instantiateStreaming == 'function' && + !isDataURI(binaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(binaryFile) && + // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + !ENVIRONMENT_IS_NODE && + typeof fetch == 'function') { + return fetch(binaryFile, { credentials: 'same-origin' }).then((response) => { + // Suppress closure warning here since the upstream definition for + // instantiateStreaming only allows Promise rather than + // an actual Response. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure is fixed. + /** @suppress {checkTypes} */ + var result = WebAssembly.instantiateStreaming(response, imports); + + return result.then( + callback, + function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + return instantiateArrayBuffer(binaryFile, imports, callback); + }); + }); + } else { + return instantiateArrayBuffer(binaryFile, imports, callback); + } +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + + Module['asm'] = exports; + + wasmMemory = Module['asm']['memory']; + assert(wasmMemory, "memory not found in wasm exports"); + // This assertion doesn't hold when emscripten is run in --post-link + // mode. + // TODO(sbc): Read INITIAL_MEMORY out of the wasm file in post-link mode. + //assert(wasmMemory.buffer.byteLength === 16777216); + updateMemoryViews(); + + wasmTable = Module['asm']['__indirect_function_table']; + assert(wasmTable, "table not found in wasm exports"); + + addOnInit(Module['asm']['__wasm_call_ctors']); + + removeRunDependency('wasm-instantiate'); + return exports; + } + // wait for the pthread pool (if any) + addRunDependency('wasm-instantiate'); + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + receiveInstance(result['instance']); + } + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + if (Module['instantiateWasm']) { + + try { + return Module['instantiateWasm'](info, receiveInstance); + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + instantiateAsync(wasmBinary, wasmBinaryFile, info, receiveInstantiationResult); + return {}; // no exports yet; we'll fill them in later +} + +// Globals used by JS i64 conversions (see makeSetValue) +var tempDouble; +var tempI64; + +// include: runtime_debug.js +function legacyModuleProp(prop, newName) { + if (!Object.getOwnPropertyDescriptor(Module, prop)) { + Object.defineProperty(Module, prop, { + configurable: true, + get: function() { + abort('Module.' + prop + ' has been replaced with plain ' + newName + ' (the initial value can be provided on Module, but after startup the value is only looked for on a local variable of that name)'); + } + }); + } +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort('`Module.' + prop + '` was supplied but `' + prop + '` not included in INCOMING_MODULE_JS_API'); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +function missingGlobal(sym, msg) { + if (typeof globalThis !== 'undefined') { + Object.defineProperty(globalThis, sym, { + configurable: true, + get: function() { + warnOnce('`' + sym + '` is not longer defined by emscripten. ' + msg); + return undefined; + } + }); + } +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); + +function missingLibrarySymbol(sym) { + if (typeof globalThis !== 'undefined' && !Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get: function() { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = '`' + sym + '` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line'; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += " (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE=" + librarySymbol + ")"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + return undefined; + } + }); + } + // Any symbol that is not included from the JS libary is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get: function() { + var msg = "'" + sym + "' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the FAQ)"; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + } + }); + } +} + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(text) { + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn.apply(console, arguments); +} + +// end include: runtime_debug.js +// === Body === + +var ASM_CONSTS = { + 235500: () => { window.onunload = Module._olc_OnPageUnload; }, + 235544: ($0, $1) => { Module.olc_AspectRatio = $0 / $1; Module.olc_AssumeDefaultShells = (document.querySelectorAll('.emscripten').length >= 3) ? true : false; var olc_ResizeHandler = function() { let isFullscreen = (document.fullscreenElement != null); let width = (isFullscreen) ? window.innerWidth : Module.canvas.parentNode.clientWidth; let height = (isFullscreen) ? window.innerHeight : Module.canvas.parentNode.clientHeight; let viewWidth = width; let viewHeight = width / Module.olc_AspectRatio; if(viewHeight > height) { viewWidth = height * Module.olc_AspectRatio; viewHeight = height; } viewWidth = parseInt(viewWidth); viewHeight = parseInt(viewHeight); setTimeout(function() { if(Module.olc_AssumeDefaultShells) Module.canvas.parentNode.setAttribute('style', 'width: 100%; height: 70vh; margin-left: auto; margin-right: auto;'); Module.canvas.setAttribute('width', viewWidth); Module.canvas.setAttribute('height', viewHeight); Module.canvas.setAttribute('style', `width: ${viewWidth}px; height: ${viewHeight}px;`); Module._olc_PGE_UpdateWindowSize(viewWidth, viewHeight); Module.canvas.focus(); }, 200); }; var olc_Init = function() { if(Module.olc_AspectRatio === undefined) { setTimeout(function() { Module.olc_Init(); }, 50); return; } let resizeObserver = new ResizeObserver(function(entries) { Module.olc_ResizeHandler(); }).observe(Module.canvas.parentNode); let mutationObserver = new MutationObserver(function(mutationsList, observer) { setTimeout(function() { Module.olc_ResizeHandler(); }, 200); }).observe(Module.canvas.parentNode, { attributes: false, childList: true, subtree: false }); window.addEventListener('fullscreenchange', function(e) { setTimeout(function() { Module.olc_ResizeHandler();}, 200); }); }; Module.olc_ResizeHandler = (Module.olc_ResizeHandler != undefined) ? Module.olc_ResizeHandler : olc_ResizeHandler; Module.olc_Init = (Module.olc_Init != undefined) ? Module.olc_Init : olc_Init; Module.olc_Init(); }, + 237476: () => { if (typeof(AudioContext) !== 'undefined') { return true; } else if (typeof(webkitAudioContext) !== 'undefined') { return true; } return false; }, + 237623: () => { if ((typeof(navigator.mediaDevices) !== 'undefined') && (typeof(navigator.mediaDevices.getUserMedia) !== 'undefined')) { return true; } else if (typeof(navigator.webkitGetUserMedia) !== 'undefined') { return true; } return false; }, + 237857: ($0) => { if(typeof(Module['SDL2']) === 'undefined') { Module['SDL2'] = {}; } var SDL2 = Module['SDL2']; if (!$0) { SDL2.audio = {}; } else { SDL2.capture = {}; } if (!SDL2.audioContext) { if (typeof(AudioContext) !== 'undefined') { SDL2.audioContext = new AudioContext(); } else if (typeof(webkitAudioContext) !== 'undefined') { SDL2.audioContext = new webkitAudioContext(); } if (SDL2.audioContext) { autoResumeAudioContext(SDL2.audioContext); } } return SDL2.audioContext === undefined ? -1 : 0; }, + 238350: () => { var SDL2 = Module['SDL2']; return SDL2.audioContext.sampleRate; }, + 238418: ($0, $1, $2, $3) => { var SDL2 = Module['SDL2']; var have_microphone = function(stream) { if (SDL2.capture.silenceTimer !== undefined) { clearTimeout(SDL2.capture.silenceTimer); SDL2.capture.silenceTimer = undefined; } SDL2.capture.mediaStreamNode = SDL2.audioContext.createMediaStreamSource(stream); SDL2.capture.scriptProcessorNode = SDL2.audioContext.createScriptProcessor($1, $0, 1); SDL2.capture.scriptProcessorNode.onaudioprocess = function(audioProcessingEvent) { if ((SDL2 === undefined) || (SDL2.capture === undefined)) { return; } audioProcessingEvent.outputBuffer.getChannelData(0).fill(0.0); SDL2.capture.currentCaptureBuffer = audioProcessingEvent.inputBuffer; dynCall('vi', $2, [$3]); }; SDL2.capture.mediaStreamNode.connect(SDL2.capture.scriptProcessorNode); SDL2.capture.scriptProcessorNode.connect(SDL2.audioContext.destination); SDL2.capture.stream = stream; }; var no_microphone = function(error) { }; SDL2.capture.silenceBuffer = SDL2.audioContext.createBuffer($0, $1, SDL2.audioContext.sampleRate); SDL2.capture.silenceBuffer.getChannelData(0).fill(0.0); var silence_callback = function() { SDL2.capture.currentCaptureBuffer = SDL2.capture.silenceBuffer; dynCall('vi', $2, [$3]); }; SDL2.capture.silenceTimer = setTimeout(silence_callback, ($1 / SDL2.audioContext.sampleRate) * 1000); if ((navigator.mediaDevices !== undefined) && (navigator.mediaDevices.getUserMedia !== undefined)) { navigator.mediaDevices.getUserMedia({ audio: true, video: false }).then(have_microphone).catch(no_microphone); } else if (navigator.webkitGetUserMedia !== undefined) { navigator.webkitGetUserMedia({ audio: true, video: false }, have_microphone, no_microphone); } }, + 240070: ($0, $1, $2, $3) => { var SDL2 = Module['SDL2']; SDL2.audio.scriptProcessorNode = SDL2.audioContext['createScriptProcessor']($1, 0, $0); SDL2.audio.scriptProcessorNode['onaudioprocess'] = function (e) { if ((SDL2 === undefined) || (SDL2.audio === undefined)) { return; } SDL2.audio.currentOutputBuffer = e['outputBuffer']; dynCall('vi', $2, [$3]); }; SDL2.audio.scriptProcessorNode['connect'](SDL2.audioContext['destination']); }, + 240480: ($0, $1) => { var SDL2 = Module['SDL2']; var numChannels = SDL2.capture.currentCaptureBuffer.numberOfChannels; for (var c = 0; c < numChannels; ++c) { var channelData = SDL2.capture.currentCaptureBuffer.getChannelData(c); if (channelData.length != $1) { throw 'Web Audio capture buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + $1 + ' samples!'; } if (numChannels == 1) { for (var j = 0; j < $1; ++j) { setValue($0 + (j * 4), channelData[j], 'float'); } } else { for (var j = 0; j < $1; ++j) { setValue($0 + (((j * numChannels) + c) * 4), channelData[j], 'float'); } } } }, + 241085: ($0, $1) => { var SDL2 = Module['SDL2']; var numChannels = SDL2.audio.currentOutputBuffer['numberOfChannels']; for (var c = 0; c < numChannels; ++c) { var channelData = SDL2.audio.currentOutputBuffer['getChannelData'](c); if (channelData.length != $1) { throw 'Web Audio output buffer length mismatch! Destination size: ' + channelData.length + ' samples vs expected ' + $1 + ' samples!'; } for (var j = 0; j < $1; ++j) { channelData[j] = HEAPF32[$0 + ((j*numChannels + c) << 2) >> 2]; } } }, + 241565: ($0) => { var SDL2 = Module['SDL2']; if ($0) { if (SDL2.capture.silenceTimer !== undefined) { clearTimeout(SDL2.capture.silenceTimer); } if (SDL2.capture.stream !== undefined) { var tracks = SDL2.capture.stream.getAudioTracks(); for (var i = 0; i < tracks.length; i++) { SDL2.capture.stream.removeTrack(tracks[i]); } SDL2.capture.stream = undefined; } if (SDL2.capture.scriptProcessorNode !== undefined) { SDL2.capture.scriptProcessorNode.onaudioprocess = function(audioProcessingEvent) {}; SDL2.capture.scriptProcessorNode.disconnect(); SDL2.capture.scriptProcessorNode = undefined; } if (SDL2.capture.mediaStreamNode !== undefined) { SDL2.capture.mediaStreamNode.disconnect(); SDL2.capture.mediaStreamNode = undefined; } if (SDL2.capture.silenceBuffer !== undefined) { SDL2.capture.silenceBuffer = undefined } SDL2.capture = undefined; } else { if (SDL2.audio.scriptProcessorNode != undefined) { SDL2.audio.scriptProcessorNode.disconnect(); SDL2.audio.scriptProcessorNode = undefined; } SDL2.audio = undefined; } if ((SDL2.audioContext !== undefined) && (SDL2.audio === undefined) && (SDL2.capture === undefined)) { SDL2.audioContext.close(); SDL2.audioContext = undefined; } }, + 242737: ($0, $1, $2) => { var w = $0; var h = $1; var pixels = $2; if (!Module['SDL2']) Module['SDL2'] = {}; var SDL2 = Module['SDL2']; if (SDL2.ctxCanvas !== Module['canvas']) { SDL2.ctx = Module['createContext'](Module['canvas'], false, true); SDL2.ctxCanvas = Module['canvas']; } if (SDL2.w !== w || SDL2.h !== h || SDL2.imageCtx !== SDL2.ctx) { SDL2.image = SDL2.ctx.createImageData(w, h); SDL2.w = w; SDL2.h = h; SDL2.imageCtx = SDL2.ctx; } var data = SDL2.image.data; var src = pixels >> 2; var dst = 0; var num; if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) { num = data.length; while (dst < num) { var val = HEAP32[src]; data[dst ] = val & 0xff; data[dst+1] = (val >> 8) & 0xff; data[dst+2] = (val >> 16) & 0xff; data[dst+3] = 0xff; src++; dst += 4; } } else { if (SDL2.data32Data !== data) { SDL2.data32 = new Int32Array(data.buffer); SDL2.data8 = new Uint8Array(data.buffer); SDL2.data32Data = data; } var data32 = SDL2.data32; num = data32.length; data32.set(HEAP32.subarray(src, src + num)); var data8 = SDL2.data8; var i = 3; var j = i + 4*num; if (num % 8 == 0) { while (i < j) { data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; data8[i] = 0xff; i = i + 4 | 0; } } else { while (i < j) { data8[i] = 0xff; i = i + 4 | 0; } } } SDL2.ctx.putImageData(SDL2.image, 0, 0); }, + 244206: ($0, $1, $2, $3, $4) => { var w = $0; var h = $1; var hot_x = $2; var hot_y = $3; var pixels = $4; var canvas = document.createElement("canvas"); canvas.width = w; canvas.height = h; var ctx = canvas.getContext("2d"); var image = ctx.createImageData(w, h); var data = image.data; var src = pixels >> 2; var dst = 0; var num; if (typeof CanvasPixelArray !== 'undefined' && data instanceof CanvasPixelArray) { num = data.length; while (dst < num) { var val = HEAP32[src]; data[dst ] = val & 0xff; data[dst+1] = (val >> 8) & 0xff; data[dst+2] = (val >> 16) & 0xff; data[dst+3] = (val >> 24) & 0xff; src++; dst += 4; } } else { var data32 = new Int32Array(data.buffer); num = data32.length; data32.set(HEAP32.subarray(src, src + num)); } ctx.putImageData(image, 0, 0); var url = hot_x === 0 && hot_y === 0 ? "url(" + canvas.toDataURL() + "), auto" : "url(" + canvas.toDataURL() + ") " + hot_x + " " + hot_y + ", auto"; var urlBuf = _malloc(url.length + 1); stringToUTF8(url, urlBuf, url.length + 1); return urlBuf; }, + 245195: ($0) => { if (Module['canvas']) { Module['canvas'].style['cursor'] = UTF8ToString($0); } }, + 245278: () => { if (Module['canvas']) { Module['canvas'].style['cursor'] = 'none'; } }, + 245347: () => { return window.innerWidth; }, + 245377: () => { return window.innerHeight; } +}; + + + +// end include: preamble.js + + /** @constructor */ + function ExitStatus(status) { + this.name = 'ExitStatus'; + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + + function listenOnce(object, event, func) { + object.addEventListener(event, func, { 'once': true }); + } + /** @param {Object=} elements */ + function autoResumeAudioContext(ctx, elements) { + if (!elements) { + elements = [document, document.getElementById('canvas')]; + } + ['keydown', 'mousedown', 'touchstart'].forEach((event) => { + elements.forEach((element) => { + if (element) { + listenOnce(element, event, () => { + if (ctx.state === 'suspended') ctx.resume(); + }); + } + }); + }); + } + + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + } + + function dynCallLegacy(sig, ptr, args) { + assert(('dynCall_' + sig) in Module, `bad function pointer type - dynCall function not found for sig '${sig}'`); + if (args && args.length) { + // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. + assert(args.length === sig.substring(1).replace(/j/g, '--').length); + } else { + assert(sig.length == 1); + } + var f = Module['dynCall_' + sig]; + return args && args.length ? f.apply(null, [ptr].concat(args)) : f.call(null, ptr); + } + + var wasmTableMirror = []; + + function getWasmTableEntry(funcPtr) { + var func = wasmTableMirror[funcPtr]; + if (!func) { + if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; + wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr); + } + assert(wasmTable.get(funcPtr) == func, "JavaScript-side Wasm function table mirror is out of date!"); + return func; + } + + /** @param {Object=} args */ + function dynCall(sig, ptr, args) { + // Without WASM_BIGINT support we cannot directly call function with i64 as + // part of thier signature, so we rely the dynCall functions generated by + // wasm-emscripten-finalize + if (sig.includes('j')) { + return dynCallLegacy(sig, ptr, args); + } + assert(getWasmTableEntry(ptr), `missing table entry in dynCall: ${ptr}`); + var rtn = getWasmTableEntry(ptr).apply(null, args); + return rtn; + + } + + + /** + * @param {number} ptr + * @param {string} type + */ + function getValue(ptr, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + case '*': return HEAPU32[((ptr)>>2)]; + default: abort(`invalid type for getValue: ${type}`); + } + } + + function ptrToString(ptr) { + assert(typeof ptr === 'number'); + return '0x' + ptr.toString(16).padStart(8, '0'); + } + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[((ptr)>>0)] = value; break; + case 'i8': HEAP8[((ptr)>>0)] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[((ptr)>>2)] = tempI64[0],HEAP32[(((ptr)+(4))>>2)] = tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + } + + /** @constructor */ + function ExceptionInfo(excPtr) { + this.excPtr = excPtr; + this.ptr = excPtr - 24; + + this.set_type = function(type) { + HEAPU32[(((this.ptr)+(4))>>2)] = type; + }; + + this.get_type = function() { + return HEAPU32[(((this.ptr)+(4))>>2)]; + }; + + this.set_destructor = function(destructor) { + HEAPU32[(((this.ptr)+(8))>>2)] = destructor; + }; + + this.get_destructor = function() { + return HEAPU32[(((this.ptr)+(8))>>2)]; + }; + + this.set_caught = function (caught) { + caught = caught ? 1 : 0; + HEAP8[(((this.ptr)+(12))>>0)] = caught; + }; + + this.get_caught = function () { + return HEAP8[(((this.ptr)+(12))>>0)] != 0; + }; + + this.set_rethrown = function (rethrown) { + rethrown = rethrown ? 1 : 0; + HEAP8[(((this.ptr)+(13))>>0)] = rethrown; + }; + + this.get_rethrown = function () { + return HEAP8[(((this.ptr)+(13))>>0)] != 0; + }; + + // Initialize native structure fields. Should be called once after allocated. + this.init = function(type, destructor) { + this.set_adjusted_ptr(0); + this.set_type(type); + this.set_destructor(destructor); + } + + this.set_adjusted_ptr = function(adjustedPtr) { + HEAPU32[(((this.ptr)+(16))>>2)] = adjustedPtr; + }; + + this.get_adjusted_ptr = function() { + return HEAPU32[(((this.ptr)+(16))>>2)]; + }; + + // Get pointer which is expected to be received by catch clause in C++ code. It may be adjusted + // when the pointer is casted to some of the exception object base classes (e.g. when virtual + // inheritance is used). When a pointer is thrown this method should return the thrown pointer + // itself. + this.get_exception_ptr = function() { + // Work around a fastcomp bug, this code is still included for some reason in a build without + // exceptions support. + var isPointer = ___cxa_is_pointer_type(this.get_type()); + if (isPointer) { + return HEAPU32[((this.excPtr)>>2)]; + } + var adjusted = this.get_adjusted_ptr(); + if (adjusted !== 0) return adjusted; + return this.excPtr; + }; + } + + var exceptionLast = 0; + + var uncaughtExceptionCount = 0; + function ___cxa_throw(ptr, type, destructor) { + var info = new ExceptionInfo(ptr); + // Initialize ExceptionInfo content after it was allocated in __cxa_allocate_exception. + info.init(type, destructor); + exceptionLast = ptr; + uncaughtExceptionCount++; + assert(false, 'Exception thrown, but exception catching is not enabled. Compile with -sNO_DISABLE_EXCEPTION_CATCHING or -sEXCEPTION_CATCHING_ALLOWED=[..] to catch.'); + } + + function setErrNo(value) { + HEAP32[((___errno_location())>>2)] = value; + return value; + } + + var PATH = {isAbs:(path) => path.charAt(0) === '/',splitPath:(filename) => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:(parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:(path) => { + var isAbsolute = PATH.isAbs(path), + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter((p) => !!p), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:(path) => { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:(path) => { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + path = PATH.normalize(path); + path = path.replace(/\/$/, ""); + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },join:function() { + var paths = Array.prototype.slice.call(arguments); + return PATH.normalize(paths.join('/')); + },join2:(l, r) => { + return PATH.normalize(l + '/' + r); + }}; + + function initRandomFill() { + if (typeof crypto == 'object' && typeof crypto['getRandomValues'] == 'function') { + // for modern web browsers + return (view) => crypto.getRandomValues(view); + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + var randomFillSync = crypto_module['randomFillSync']; + if (randomFillSync) { + // nodejs with LTS crypto support + return (view) => crypto_module['randomFillSync'](view); + } + // very old nodejs with the original crypto API + var randomBytes = crypto_module['randomBytes']; + return (view) => ( + view.set(randomBytes(view.byteLength)), + // Return the original view to match modern native implementations. + view + ); + } catch (e) { + // nodejs doesn't have crypto support + } + } + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + abort("no cryptographic support found for randomDevice. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); + } + function randomFill(view) { + // Lazily init on the first invocation. + return (randomFill = initRandomFill())(view); + } + + + + var PATH_FS = {resolve:function() { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter((p) => !!p), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:(from, to) => { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + } + + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + assert(typeof str === 'string'); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce('Invalid Unicode code point ' + ptrToString(u) + ' encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + } + /** @type {function(string, boolean=, number=)} */ + function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; + } + + var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder('utf8') : undefined; + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ + function UTF8ArrayToString(heapOrArray, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. Also, use the length info to avoid running tiny + // strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, + // so that undefined means Infinity) + while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + // If building with TextDecoder, we have already computed the string length + // above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte ' + ptrToString(u0) + ' encountered when deserializing a UTF-8 string in wasm memory to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + } + var TTY = {ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + },shutdown:function() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + },register:function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + },close:function(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + },fsync:function(stream) { + stream.tty.ops.fsync(stream.tty); + },read:function(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + + try { + bytesRead = fs.readSync(process.stdin.fd, buf, 0, BUFSIZE, -1); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },fsync:function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },fsync:function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + + function zeroMemory(address, size) { + HEAPU8.fill(0, address, address + size); + return address; + } + + function alignMemory(size, alignment) { + assert(alignment, "alignment argument is required"); + return Math.ceil(size / alignment) * alignment; + } + function mmapAlloc(size) { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + } + var MEMFS = {ops_table:null,mount:function(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.timestamp = node.timestamp; + } + return node; + },getFileDataAsTypedArray:function(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + },resizeFileStorage:function(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + } else { + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + } + },node_ops:{getattr:function(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function(parent, name) { + throw FS.genericErrors[44]; + },mknod:function(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.parent.timestamp = Date.now() + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + new_dir.timestamp = old_node.parent.timestamp; + old_node.parent = new_dir; + },unlink:function(parent, name) { + delete parent.contents[name]; + parent.timestamp = Date.now(); + },rmdir:function(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.timestamp = Date.now(); + },readdir:function(node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }},stream_ops:{read:function(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + // If the buffer is located in main memory (HEAP), and if + // memory can grow, we can't hold on to references of the + // memory buffer, as they may get invalidated. That means we + // need to do copy its contents. + if (buffer.buffer === HEAP8.buffer) { + canOwn = false; + } + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) { + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + } else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + },llseek:function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + },allocate:function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + HEAP8.set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + /** @param {boolean=} noRunDep */ + function asyncLoad(url, onload, onerror, noRunDep) { + var dep = !noRunDep ? getUniqueRunDependency(`al ${url}`) : ''; + readAsync(url, (arrayBuffer) => { + assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); + onload(new Uint8Array(arrayBuffer)); + if (dep) removeRunDependency(dep); + }, (event) => { + if (onerror) { + onerror(); + } else { + throw `Loading data file "${url}" failed.`; + } + }); + if (dep) addRunDependency(dep); + } + + var preloadPlugins = Module['preloadPlugins'] || []; + function FS_handledByPreloadPlugin(byteArray, fullname, finish, onerror) { + // Ensure plugins are ready. + if (typeof Browser != 'undefined') Browser.init(); + + var handled = false; + preloadPlugins.forEach(function(plugin) { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, onerror); + handled = true; + } + }); + return handled; + } + function FS_createPreloadedFile(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + if (FS_handledByPreloadPlugin(byteArray, fullname, finish, () => { + if (onerror) onerror(); + removeRunDependency(dep); + })) { + return; + } + finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + asyncLoad(url, (byteArray) => processData(byteArray), onerror); + } else { + processData(url); + } + } + + function FS_modeStringToFlags(str) { + var flagModes = { + 'r': 0, + 'r+': 2, + 'w': 512 | 64 | 1, + 'w+': 512 | 64 | 2, + 'a': 1024 | 64 | 1, + 'a+': 1024 | 64 | 2, + }; + var flags = flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error(`Unknown file open mode: ${str}`); + } + return flags; + } + + function FS_getMode(canRead, canWrite) { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + } + + + + + var ERRNO_MESSAGES = {0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; + + var ERRNO_CODES = {}; + + function demangle(func) { + warnOnce('warning: build with -sDEMANGLE_SUPPORT to link in libcxxabi demangling'); + return func; + } + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + var FS = {root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path, opts = {}) => { + path = PATH_FS.resolve(path); + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + opts = Object.assign(defaults, opts) + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the absolute path + var parts = path.split('/').filter((p) => !!p); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count + 1 }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:(node) => { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + },hashName:(parentid, name) => { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:(node) => { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:(node) => { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:(parent, name) => { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:(parent, name, mode, rdev) => { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:(node) => { + FS.hashRemoveNode(node); + },isRoot:(node) => { + return node === node.parent; + },isMountpoint:(node) => { + return !!node.mounted; + },isFile:(mode) => { + return (mode & 61440) === 32768; + },isDir:(mode) => { + return (mode & 61440) === 16384; + },isLink:(mode) => { + return (mode & 61440) === 40960; + },isChrdev:(mode) => { + return (mode & 61440) === 8192; + },isBlkdev:(mode) => { + return (mode & 61440) === 24576; + },isFIFO:(mode) => { + return (mode & 61440) === 4096; + },isSocket:(mode) => { + return (mode & 49152) === 49152; + },flagsToPermissionString:(flag) => { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:(node, perms) => { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } else if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } else if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + },mayLookup:(dir) => { + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + },mayCreate:(dir, name) => { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:(dir, name, isdir) => { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + },mayOpen:(node, flags) => { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:() => { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + },getStream:(fd) => FS.streams[fd],createStream:(stream, fd = -1) => { + if (!FS.FSStream) { + FS.FSStream = /** @constructor */ function() { + this.shared = { }; + }; + FS.FSStream.prototype = {}; + Object.defineProperties(FS.FSStream.prototype, { + object: { + /** @this {FS.FSStream} */ + get: function() { return this.node; }, + /** @this {FS.FSStream} */ + set: function(val) { this.node = val; } + }, + isRead: { + /** @this {FS.FSStream} */ + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + /** @this {FS.FSStream} */ + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + /** @this {FS.FSStream} */ + get: function() { return (this.flags & 1024); } + }, + flags: { + /** @this {FS.FSStream} */ + get: function() { return this.shared.flags; }, + /** @this {FS.FSStream} */ + set: function(val) { this.shared.flags = val; }, + }, + position : { + /** @this {FS.FSStream} */ + get: function() { return this.shared.position; }, + /** @this {FS.FSStream} */ + set: function(val) { this.shared.position = val; }, + }, + }); + } + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:(fd) => { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:(stream) => { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:() => { + throw new FS.ErrnoError(70); + }},major:(dev) => ((dev) >> 8),minor:(dev) => ((dev) & 0xff),makedev:(ma, mi) => ((ma) << 8 | (mi)),registerDevice:(dev, ops) => { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:(dev) => FS.devices[dev],getMounts:(mount) => { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:(populate, callback) => { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach((mount) => { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:(type, opts, mountpoint) => { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:(mountpoint) => { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach((hash) => { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:(parent, name) => { + return parent.node_ops.lookup(parent, name); + },mknod:(path, mode, dev) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:(path, mode) => { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:(path, mode) => { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:(path, mode) => { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + },mkdev:(path, mode, dev) => { + if (typeof dev == 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:(oldpath, newpath) => { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:(old_path, new_path) => { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existant directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + },rmdir:(path) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + },readdir:(path) => { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + },unlink:(path) => { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + },readlink:(path) => { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:(path, dontFollow) => { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + },lstat:(path) => { + return FS.stat(path, true); + },chmod:(path, mode, dontFollow) => { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:(path, mode) => { + FS.chmod(path, mode, true); + },fchmod:(fd, mode) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + },chown:(path, uid, gid, dontFollow) => { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:(path, uid, gid) => { + FS.chown(path, uid, gid, true); + },fchown:(fd, uid, gid) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + },truncate:(path, len) => { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:(fd, len) => { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + },utime:(path, atime, mtime) => { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:(path, flags, mode) => { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags == 'string' ? FS_modeStringToFlags(flags) : flags; + mode = typeof mode == 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path == 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + } + } + return stream; + },close:(stream) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:(stream) => { + return stream.fd === null; + },llseek:(stream, offset, whence) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:(stream, buffer, offset, length, position) => { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:(stream, buffer, offset, length, position, canOwn) => { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + },allocate:(stream, offset, length) => { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:(stream, length, position, prot, flags) => { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + },msync:(stream, buffer, offset, length, mmapFlags) => { + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:(stream) => 0,ioctl:(stream, cmd, arg) => { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:(path, opts = {}) => { + opts.flags = opts.flags || 0; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error(`Invalid encoding type "${opts.encoding}"`); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:(path, data, opts = {}) => { + opts.flags = opts.flags || 577; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data == 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:() => FS.currentPath,chdir:(path) => { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:() => { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:() => { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomLeft = randomFill(randomBuffer).byteLength; + } + return randomBuffer[--randomLeft]; + }; + FS.createDevice('/dev', 'random', randomByte); + FS.createDevice('/dev', 'urandom', randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:() => { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: () => { + var node = FS.createNode(proc_self, 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: (parent, name) => { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:() => { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`); + assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`); + assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`); + },ensureErrnoError:() => { + if (FS.ErrnoError) return; + FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + this.name = 'ErrnoError'; + this.node = node; + this.setErrno = /** @this{Object} */ function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + + // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack + // now ensures it shows what we want. + if (this.stack) { + // Define the stack property for Node.js 4, which otherwise errors on the next line. + Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); + this.stack = demangleAll(this.stack); + } + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach((code) => { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:() => { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + },init:(input, output, error) => { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:() => { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + _fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },findObject:(path, dontResolveLastLink) => { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + },analyzePath:(path, dontResolveLastLink) => { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createPath:(parent, path, canRead, canWrite) => { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:(parent, name, properties, canRead, canWrite) => { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:(parent, name, data, canRead, canWrite, canOwn) => { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data == 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:(parent, name, input, output) => { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: (stream) => { + stream.seekable = false; + }, + close: (stream) => { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: (stream, buffer, offset, length, pos /* ignored */) => { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: (stream, buffer, offset, length, pos) => { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },forceLoadFile:(obj) => { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (typeof XMLHttpRequest != 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (read_) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + throw new FS.ErrnoError(29); + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + },createLazyFile:(parent, name, url, canRead, canWrite) => { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + /** @constructor */ + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } + return intArrayFromString(xhr.responseText || '', true); + }; + var lazyArray = this; + lazyArray.setDataGetter((chunkNum) => { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == 'undefined') { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == 'undefined') throw new Error('doXHR failed!'); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest != 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: /** @this{Object} */ function() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: /** @this {FSNode} */ function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach((key) => { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + FS.forceLoadFile(node); + return fn.apply(null, arguments); + }; + }); + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position) + }; + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + writeChunks(stream, HEAP8, ptr, length, position); + return { ptr: ptr, allocated: true }; + }; + node.stream_ops = stream_ops; + return node; + },absolutePath:() => { + abort('FS.absolutePath has been removed; use PATH_FS.resolve instead'); + },createFolder:() => { + abort('FS.createFolder has been removed; use FS.mkdir instead'); + },createLink:() => { + abort('FS.createLink has been removed; use FS.symlink instead'); + },joinPath:() => { + abort('FS.joinPath has been removed; use PATH.join instead'); + },mmapAlloc:() => { + abort('FS.mmapAlloc has been replaced by the top level function mmapAlloc'); + },standardizePath:() => { + abort('FS.standardizePath has been removed; use PATH.normalize instead'); + }}; + + + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index (i.e. maxBytesToRead will not + * produce a string of exact length [ptr, ptr+maxBytesToRead[) N.B. mixing + * frequent uses of UTF8ToString() with and without maxBytesToRead may throw + * JS JIT optimizations off, so it is worth to consider consistently using one + * @return {string} + */ + function UTF8ToString(ptr, maxBytesToRead) { + assert(typeof ptr == 'number'); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; + } + var SYSCALLS = {DEFAULT_POLLMASK:5,calculateAt:function(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return PATH.join2(dir, path); + },doStat:function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -54; + } + throw e; + } + HEAP32[((buf)>>2)] = stat.dev; + HEAP32[(((buf)+(8))>>2)] = stat.ino; + HEAP32[(((buf)+(12))>>2)] = stat.mode; + HEAPU32[(((buf)+(16))>>2)] = stat.nlink; + HEAP32[(((buf)+(20))>>2)] = stat.uid; + HEAP32[(((buf)+(24))>>2)] = stat.gid; + HEAP32[(((buf)+(28))>>2)] = stat.rdev; + (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(40))>>2)] = tempI64[0],HEAP32[(((buf)+(44))>>2)] = tempI64[1]); + HEAP32[(((buf)+(48))>>2)] = 4096; + HEAP32[(((buf)+(52))>>2)] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + (tempI64 = [Math.floor(atime / 1000)>>>0,(tempDouble=Math.floor(atime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(56))>>2)] = tempI64[0],HEAP32[(((buf)+(60))>>2)] = tempI64[1]); + HEAPU32[(((buf)+(64))>>2)] = (atime % 1000) * 1000; + (tempI64 = [Math.floor(mtime / 1000)>>>0,(tempDouble=Math.floor(mtime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(72))>>2)] = tempI64[0],HEAP32[(((buf)+(76))>>2)] = tempI64[1]); + HEAPU32[(((buf)+(80))>>2)] = (mtime % 1000) * 1000; + (tempI64 = [Math.floor(ctime / 1000)>>>0,(tempDouble=Math.floor(ctime / 1000),(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(88))>>2)] = tempI64[0],HEAP32[(((buf)+(92))>>2)] = tempI64[1]); + HEAPU32[(((buf)+(96))>>2)] = (ctime % 1000) * 1000; + (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[(((buf)+(104))>>2)] = tempI64[0],HEAP32[(((buf)+(108))>>2)] = tempI64[1]); + return 0; + },doMsync:function(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + },varargs:undefined,get:function() { + assert(SYSCALLS.varargs != undefined); + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + },getStreamFromFD:function(fd) { + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + return stream; + }}; + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.createStream(stream, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 5: + /* case 5: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { + + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)] = 2; + return 0; + } + case 6: + case 7: + /* case 6: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + /* case 7: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + + + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -28; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fcntl() returns that, and we set errno ourselves. + setErrNo(28); + return -1; + default: { + return -28; + } + } + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)] = 0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + default: return -28; // not supported + } + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + function ___syscall_openat(dirfd, path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + var mode = varargs ? SYSCALLS.get() : 0; + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + var nowIsMonotonic = true;; + function __emscripten_get_now_is_monotonic() { + return nowIsMonotonic; + } + + function __emscripten_throw_longjmp() { + throw Infinity; + } + + function _abort() { + abort('native code called abort()'); + } + + function _emscripten_set_main_loop_timing(mode, value) { + Browser.mainLoop.timingMode = mode; + Browser.mainLoop.timingValue = value; + + if (!Browser.mainLoop.func) { + err('emscripten_set_main_loop_timing: Cannot set timing mode for main loop since a main loop does not exist! Call emscripten_set_main_loop first to set one up.'); + return 1; // Return non-zero on failure, can't set timing mode when there is no main loop. + } + + if (!Browser.mainLoop.running) { + + Browser.mainLoop.running = true; + } + if (mode == 0) { + Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setTimeout() { + var timeUntilNextTick = Math.max(0, Browser.mainLoop.tickStartTime + value - _emscripten_get_now())|0; + setTimeout(Browser.mainLoop.runner, timeUntilNextTick); // doing this each time means that on exception, we stop + }; + Browser.mainLoop.method = 'timeout'; + } else if (mode == 1) { + Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_rAF() { + Browser.requestAnimationFrame(Browser.mainLoop.runner); + }; + Browser.mainLoop.method = 'rAF'; + } else if (mode == 2) { + if (typeof setImmediate == 'undefined') { + // Emulate setImmediate. (note: not a complete polyfill, we don't emulate clearImmediate() to keep code size to minimum, since not needed) + var setImmediates = []; + var emscriptenMainLoopMessageId = 'setimmediate'; + /** @param {Event} event */ + var Browser_setImmediate_messageHandler = (event) => { + // When called in current thread or Worker, the main loop ID is structured slightly different to accommodate for --proxy-to-worker runtime listening to Worker events, + // so check for both cases. + if (event.data === emscriptenMainLoopMessageId || event.data.target === emscriptenMainLoopMessageId) { + event.stopPropagation(); + setImmediates.shift()(); + } + }; + addEventListener("message", Browser_setImmediate_messageHandler, true); + setImmediate = /** @type{function(function(): ?, ...?): number} */(function Browser_emulated_setImmediate(func) { + setImmediates.push(func); + if (ENVIRONMENT_IS_WORKER) { + if (Module['setImmediates'] === undefined) Module['setImmediates'] = []; + Module['setImmediates'].push(func); + postMessage({target: emscriptenMainLoopMessageId}); // In --proxy-to-worker, route the message via proxyClient.js + } else postMessage(emscriptenMainLoopMessageId, "*"); // On the main thread, can just send the message to itself. + }) + } + Browser.mainLoop.scheduler = function Browser_mainLoop_scheduler_setImmediate() { + setImmediate(Browser.mainLoop.runner); + }; + Browser.mainLoop.method = 'immediate'; + } + return 0; + } + + var _emscripten_get_now; + // The performance global was added to node in v16.0.0: + // https://nodejs.org/api/globals.html#performance + if (ENVIRONMENT_IS_NODE) { + global.performance = require('perf_hooks').performance; + } + // Modern environment where performance.now() is supported: + // N.B. a shorter form "_emscripten_get_now = performance.now;" is + // unfortunately not allowed even in current browsers (e.g. FF Nightly 75). + _emscripten_get_now = () => performance.now(); + ; + + + /** + * @param {number=} arg + * @param {boolean=} noSetTiming + */ + function setMainLoop(browserIterationFunc, fps, simulateInfiniteLoop, arg, noSetTiming) { + assert(!Browser.mainLoop.func, 'emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.'); + + Browser.mainLoop.func = browserIterationFunc; + Browser.mainLoop.arg = arg; + + var thisMainLoopId = Browser.mainLoop.currentlyRunningMainloop; + function checkIsRunning() { + if (thisMainLoopId < Browser.mainLoop.currentlyRunningMainloop) { + + return false; + } + return true; + } + + // We create the loop runner here but it is not actually running until + // _emscripten_set_main_loop_timing is called (which might happen a + // later time). This member signifies that the current runner has not + // yet been started so that we can call runtimeKeepalivePush when it + // gets it timing set for the first time. + Browser.mainLoop.running = false; + Browser.mainLoop.runner = function Browser_mainLoop_runner() { + if (ABORT) return; + if (Browser.mainLoop.queue.length > 0) { + var start = Date.now(); + var blocker = Browser.mainLoop.queue.shift(); + blocker.func(blocker.arg); + if (Browser.mainLoop.remainingBlockers) { + var remaining = Browser.mainLoop.remainingBlockers; + var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining); + if (blocker.counted) { + Browser.mainLoop.remainingBlockers = next; + } else { + // not counted, but move the progress along a tiny bit + next = next + 0.5; // do not steal all the next one's progress + Browser.mainLoop.remainingBlockers = (8*remaining + next)/9; + } + } + out('main loop blocker "' + blocker.name + '" took ' + (Date.now() - start) + ' ms'); //, left: ' + Browser.mainLoop.remainingBlockers); + Browser.mainLoop.updateStatus(); + + // catches pause/resume main loop from blocker execution + if (!checkIsRunning()) return; + + setTimeout(Browser.mainLoop.runner, 0); + return; + } + + // catch pauses from non-main loop sources + if (!checkIsRunning()) return; + + // Implement very basic swap interval control + Browser.mainLoop.currentFrameNumber = Browser.mainLoop.currentFrameNumber + 1 | 0; + if (Browser.mainLoop.timingMode == 1 && Browser.mainLoop.timingValue > 1 && Browser.mainLoop.currentFrameNumber % Browser.mainLoop.timingValue != 0) { + // Not the scheduled time to render this frame - skip. + Browser.mainLoop.scheduler(); + return; + } else if (Browser.mainLoop.timingMode == 0) { + Browser.mainLoop.tickStartTime = _emscripten_get_now(); + } + + // Signal GL rendering layer that processing of a new frame is about to start. This helps it optimize + // VBO double-buffering and reduce GPU stalls. + + if (Browser.mainLoop.method === 'timeout' && Module.ctx) { + warnOnce('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!'); + Browser.mainLoop.method = ''; // just warn once per call to set main loop + } + + Browser.mainLoop.runIter(browserIterationFunc); + + checkStackCookie(); + + // catch pauses from the main loop itself + if (!checkIsRunning()) return; + + // Queue new audio data. This is important to be right after the main loop invocation, so that we will immediately be able + // to queue the newest produced audio samples. + // TODO: Consider adding pre- and post- rAF callbacks so that GL.newRenderingFrameStarted() and SDL.audio.queueNewAudioData() + // do not need to be hardcoded into this function, but can be more generic. + if (typeof SDL == 'object' && SDL.audio && SDL.audio.queueNewAudioData) SDL.audio.queueNewAudioData(); + + Browser.mainLoop.scheduler(); + } + + if (!noSetTiming) { + if (fps && fps > 0) { + _emscripten_set_main_loop_timing(0, 1000.0 / fps); + } else { + // Do rAF by rendering each frame (no decimating) + _emscripten_set_main_loop_timing(1, 1); + } + + Browser.mainLoop.scheduler(); + } + + if (simulateInfiniteLoop) { + throw 'unwind'; + } + } + + function handleException(e) { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + checkStackCookie(); + if (e instanceof WebAssembly.RuntimeError) { + if (_emscripten_stack_get_current() <= 0) { + err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)'); + } + } + quit_(1, e); + } + + + function _proc_exit(code) { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + if (Module['onExit']) Module['onExit'](code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + } + /** @suppress {duplicate } */ + /** @param {boolean|number=} implicit */ + function exitJS(status, implicit) { + EXITSTATUS = status; + + checkUnflushedContent(); + + // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down + if (keepRuntimeAlive() && !implicit) { + var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; + err(msg); + } + + _proc_exit(status); + } + var _exit = exitJS; + + function maybeExit() { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + } + function callUserCallback(func) { + if (ABORT) { + err('user callback triggered after runtime exited or application aborted. Ignoring.'); + return; + } + try { + func(); + maybeExit(); + } catch (e) { + handleException(e); + } + } + + /** @param {number=} timeout */ + function safeSetTimeout(func, timeout) { + + return setTimeout(() => { + + callUserCallback(func); + }, timeout); + } + + + + + var Browser = {mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function() { + Browser.mainLoop.scheduler = null; + // Incrementing this signals the previous main loop that it's now become old, and it must return. + Browser.mainLoop.currentlyRunningMainloop++; + },resume:function() { + Browser.mainLoop.currentlyRunningMainloop++; + var timingMode = Browser.mainLoop.timingMode; + var timingValue = Browser.mainLoop.timingValue; + var func = Browser.mainLoop.func; + Browser.mainLoop.func = null; + // do not set timing and call scheduler, we will do it on the next lines + setMainLoop(func, 0, false, Browser.mainLoop.arg, true); + _emscripten_set_main_loop_timing(timingMode, timingValue); + Browser.mainLoop.scheduler(); + },updateStatus:function() { + if (Module['setStatus']) { + var message = Module['statusMessage'] || 'Please wait...'; + var remaining = Browser.mainLoop.remainingBlockers; + var expected = Browser.mainLoop.expectedBlockers; + if (remaining) { + if (remaining < expected) { + Module['setStatus'](message + ' (' + (expected - remaining) + '/' + expected + ')'); + } else { + Module['setStatus'](message); + } + } else { + Module['setStatus'](''); + } + } + },runIter:function(func) { + if (ABORT) return; + if (Module['preMainLoop']) { + var preRet = Module['preMainLoop'](); + if (preRet === false) { + return; // |return false| skips a frame + } + } + callUserCallback(func); + if (Module['postMainLoop']) Module['postMainLoop'](); + }},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init:function() { + if (Browser.initted) return; + Browser.initted = true; + + // Support for plugins that can process preloaded files. You can add more of these to + // your app by creating and appending to preloadPlugins. + // + // Each plugin is asked if it can handle a file based on the file's name. If it can, + // it is given the file's raw data. When it is done, it calls a callback with the file's + // (possibly modified) data. For example, a plugin might decompress a file, or it + // might create some side data structure for use later (like an Image element, etc.). + + var imagePlugin = {}; + imagePlugin['canHandle'] = function imagePlugin_canHandle(name) { + return !Module.noImageDecoding && /\.(jpg|jpeg|png|bmp)$/i.test(name); + }; + imagePlugin['handle'] = function imagePlugin_handle(byteArray, name, onload, onerror) { + var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); + if (b.size !== byteArray.length) { // Safari bug #118630 + // Safari's Blob can only take an ArrayBuffer + b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) }); + } + var url = URL.createObjectURL(b); + assert(typeof url == 'string', 'createObjectURL must return a url as a string'); + var img = new Image(); + img.onload = () => { + assert(img.complete, 'Image ' + name + ' could not be decoded'); + var canvas = /** @type {!HTMLCanvasElement} */ (document.createElement('canvas')); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0); + preloadedImages[name] = canvas; + URL.revokeObjectURL(url); + if (onload) onload(byteArray); + }; + img.onerror = (event) => { + out('Image ' + url + ' could not be decoded'); + if (onerror) onerror(); + }; + img.src = url; + }; + preloadPlugins.push(imagePlugin); + + var audioPlugin = {}; + audioPlugin['canHandle'] = function audioPlugin_canHandle(name) { + return !Module.noAudioDecoding && name.substr(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; + }; + audioPlugin['handle'] = function audioPlugin_handle(byteArray, name, onload, onerror) { + var done = false; + function finish(audio) { + if (done) return; + done = true; + preloadedAudios[name] = audio; + if (onload) onload(byteArray); + } + function fail() { + if (done) return; + done = true; + preloadedAudios[name] = new Audio(); // empty shim + if (onerror) onerror(); + } + var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); + var url = URL.createObjectURL(b); // XXX we never revoke this! + assert(typeof url == 'string', 'createObjectURL must return a url as a string'); + var audio = new Audio(); + audio.addEventListener('canplaythrough', () => finish(audio), false); // use addEventListener due to chromium bug 124926 + audio.onerror = function audio_onerror(event) { + if (done) return; + err('warning: browser could not fully decode audio ' + name + ', trying slower base64 approach'); + function encode64(data) { + var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var PAD = '='; + var ret = ''; + var leftchar = 0; + var leftbits = 0; + for (var i = 0; i < data.length; i++) { + leftchar = (leftchar << 8) | data[i]; + leftbits += 8; + while (leftbits >= 6) { + var curr = (leftchar >> (leftbits-6)) & 0x3f; + leftbits -= 6; + ret += BASE[curr]; + } + } + if (leftbits == 2) { + ret += BASE[(leftchar&3) << 4]; + ret += PAD + PAD; + } else if (leftbits == 4) { + ret += BASE[(leftchar&0xf) << 2]; + ret += PAD; + } + return ret; + } + audio.src = 'data:audio/x-' + name.substr(-3) + ';base64,' + encode64(byteArray); + finish(audio); // we don't wait for confirmation this worked - but it's worth trying + }; + audio.src = url; + // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror + safeSetTimeout(() => { + finish(audio); // try to use it even though it is not necessarily ready to play + }, 10000); + }; + preloadPlugins.push(audioPlugin); + + // Canvas event setup + + function pointerLockChange() { + Browser.pointerLock = document['pointerLockElement'] === Module['canvas'] || + document['mozPointerLockElement'] === Module['canvas'] || + document['webkitPointerLockElement'] === Module['canvas'] || + document['msPointerLockElement'] === Module['canvas']; + } + var canvas = Module['canvas']; + if (canvas) { + // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module + // Module['forcedAspectRatio'] = 4 / 3; + + canvas.requestPointerLock = canvas['requestPointerLock'] || + canvas['mozRequestPointerLock'] || + canvas['webkitRequestPointerLock'] || + canvas['msRequestPointerLock'] || + (() => {}); + canvas.exitPointerLock = document['exitPointerLock'] || + document['mozExitPointerLock'] || + document['webkitExitPointerLock'] || + document['msExitPointerLock'] || + (() => {}); // no-op if function does not exist + canvas.exitPointerLock = canvas.exitPointerLock.bind(document); + + document.addEventListener('pointerlockchange', pointerLockChange, false); + document.addEventListener('mozpointerlockchange', pointerLockChange, false); + document.addEventListener('webkitpointerlockchange', pointerLockChange, false); + document.addEventListener('mspointerlockchange', pointerLockChange, false); + + if (Module['elementPointerLock']) { + canvas.addEventListener("click", (ev) => { + if (!Browser.pointerLock && Module['canvas'].requestPointerLock) { + Module['canvas'].requestPointerLock(); + ev.preventDefault(); + } + }, false); + } + } + },createContext:function(/** @type {HTMLCanvasElement} */ canvas, useWebGL, setInModule, webGLContextAttributes) { + if (useWebGL && Module.ctx && canvas == Module.canvas) return Module.ctx; // no need to recreate GL context if it's already been created for this canvas. + + var ctx; + var contextHandle; + if (useWebGL) { + // For GLES2/desktop GL compatibility, adjust a few defaults to be different to WebGL defaults, so that they align better with the desktop defaults. + var contextAttributes = { + antialias: false, + alpha: false, + majorVersion: 2, + }; + + if (webGLContextAttributes) { + for (var attribute in webGLContextAttributes) { + contextAttributes[attribute] = webGLContextAttributes[attribute]; + } + } + + // This check of existence of GL is here to satisfy Closure compiler, which yells if variable GL is referenced below but GL object is not + // actually compiled in because application is not doing any GL operations. TODO: Ideally if GL is not being used, this function + // Browser.createContext() should not even be emitted. + if (typeof GL != 'undefined') { + contextHandle = GL.createContext(canvas, contextAttributes); + if (contextHandle) { + ctx = GL.getContext(contextHandle).GLctx; + } + } + } else { + ctx = canvas.getContext('2d'); + } + + if (!ctx) return null; + + if (setInModule) { + if (!useWebGL) assert(typeof GLctx == 'undefined', 'cannot set in module if GLctx is used, but we are a non-GL context that would replace it'); + + Module.ctx = ctx; + if (useWebGL) GL.makeContextCurrent(contextHandle); + Module.useWebGL = useWebGL; + Browser.moduleContextCreatedCallbacks.forEach((callback) => callback()); + Browser.init(); + } + return ctx; + },destroyContext:function(canvas, useWebGL, setInModule) {},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen:function(lockPointer, resizeCanvas) { + Browser.lockPointer = lockPointer; + Browser.resizeCanvas = resizeCanvas; + if (typeof Browser.lockPointer == 'undefined') Browser.lockPointer = true; + if (typeof Browser.resizeCanvas == 'undefined') Browser.resizeCanvas = false; + + var canvas = Module['canvas']; + function fullscreenChange() { + Browser.isFullscreen = false; + var canvasContainer = canvas.parentNode; + if ((document['fullscreenElement'] || document['mozFullScreenElement'] || + document['msFullscreenElement'] || document['webkitFullscreenElement'] || + document['webkitCurrentFullScreenElement']) === canvasContainer) { + canvas.exitFullscreen = Browser.exitFullscreen; + if (Browser.lockPointer) canvas.requestPointerLock(); + Browser.isFullscreen = true; + if (Browser.resizeCanvas) { + Browser.setFullscreenCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + } + } else { + // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen + canvasContainer.parentNode.insertBefore(canvas, canvasContainer); + canvasContainer.parentNode.removeChild(canvasContainer); + + if (Browser.resizeCanvas) { + Browser.setWindowedCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + } + } + if (Module['onFullScreen']) Module['onFullScreen'](Browser.isFullscreen); + if (Module['onFullscreen']) Module['onFullscreen'](Browser.isFullscreen); + } + + if (!Browser.fullscreenHandlersInstalled) { + Browser.fullscreenHandlersInstalled = true; + document.addEventListener('fullscreenchange', fullscreenChange, false); + document.addEventListener('mozfullscreenchange', fullscreenChange, false); + document.addEventListener('webkitfullscreenchange', fullscreenChange, false); + document.addEventListener('MSFullscreenChange', fullscreenChange, false); + } + + // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root + var canvasContainer = document.createElement("div"); + canvas.parentNode.insertBefore(canvasContainer, canvas); + canvasContainer.appendChild(canvas); + + // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) + canvasContainer.requestFullscreen = canvasContainer['requestFullscreen'] || + canvasContainer['mozRequestFullScreen'] || + canvasContainer['msRequestFullscreen'] || + (canvasContainer['webkitRequestFullscreen'] ? () => canvasContainer['webkitRequestFullscreen'](Element['ALLOW_KEYBOARD_INPUT']) : null) || + (canvasContainer['webkitRequestFullScreen'] ? () => canvasContainer['webkitRequestFullScreen'](Element['ALLOW_KEYBOARD_INPUT']) : null); + + canvasContainer.requestFullscreen(); + },requestFullScreen:function() { + abort('Module.requestFullScreen has been replaced by Module.requestFullscreen (without a capital S)'); + },exitFullscreen:function() { + // This is workaround for chrome. Trying to exit from fullscreen + // not in fullscreen state will cause "TypeError: Document not active" + // in chrome. See https://github.com/emscripten-core/emscripten/pull/8236 + if (!Browser.isFullscreen) { + return false; + } + + var CFS = document['exitFullscreen'] || + document['cancelFullScreen'] || + document['mozCancelFullScreen'] || + document['msExitFullscreen'] || + document['webkitCancelFullScreen'] || + (() => {}); + CFS.apply(document, []); + return true; + },nextRAF:0,fakeRequestAnimationFrame:function(func) { + // try to keep 60fps between calls to here + var now = Date.now(); + if (Browser.nextRAF === 0) { + Browser.nextRAF = now + 1000/60; + } else { + while (now + 2 >= Browser.nextRAF) { // fudge a little, to avoid timer jitter causing us to do lots of delay:0 + Browser.nextRAF += 1000/60; + } + } + var delay = Math.max(Browser.nextRAF - now, 0); + setTimeout(func, delay); + },requestAnimationFrame:function(func) { + if (typeof requestAnimationFrame == 'function') { + requestAnimationFrame(func); + return; + } + var RAF = Browser.fakeRequestAnimationFrame; + RAF(func); + },safeSetTimeout:function(func, timeout) { + // Legacy function, this is used by the SDL2 port so we need to keep it + // around at least until that is updated. + // See https://github.com/libsdl-org/SDL/pull/6304 + return safeSetTimeout(func, timeout); + },safeRequestAnimationFrame:function(func) { + + return Browser.requestAnimationFrame(() => { + + callUserCallback(func); + }); + },getMimetype:function(name) { + return { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'png': 'image/png', + 'bmp': 'image/bmp', + 'ogg': 'audio/ogg', + 'wav': 'audio/wav', + 'mp3': 'audio/mpeg' + }[name.substr(name.lastIndexOf('.')+1)]; + },getUserMedia:function(func) { + if (!window.getUserMedia) { + window.getUserMedia = navigator['getUserMedia'] || + navigator['mozGetUserMedia']; + } + window.getUserMedia(func); + },getMovementX:function(event) { + return event['movementX'] || + event['mozMovementX'] || + event['webkitMovementX'] || + 0; + },getMovementY:function(event) { + return event['movementY'] || + event['mozMovementY'] || + event['webkitMovementY'] || + 0; + },getMouseWheelDelta:function(event) { + var delta = 0; + switch (event.type) { + case 'DOMMouseScroll': + // 3 lines make up a step + delta = event.detail / 3; + break; + case 'mousewheel': + // 120 units make up a step + delta = event.wheelDelta / 120; + break; + case 'wheel': + delta = event.deltaY + switch (event.deltaMode) { + case 0: + // DOM_DELTA_PIXEL: 100 pixels make up a step + delta /= 100; + break; + case 1: + // DOM_DELTA_LINE: 3 lines make up a step + delta /= 3; + break; + case 2: + // DOM_DELTA_PAGE: A page makes up 80 steps + delta *= 80; + break; + default: + throw 'unrecognized mouse wheel delta mode: ' + event.deltaMode; + } + break; + default: + throw 'unrecognized mouse wheel event: ' + event.type; + } + return delta; + },mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(event) { // event should be mousemove, mousedown or mouseup + if (Browser.pointerLock) { + // When the pointer is locked, calculate the coordinates + // based on the movement of the mouse. + // Workaround for Firefox bug 764498 + if (event.type != 'mousemove' && + ('mozMovementX' in event)) { + Browser.mouseMovementX = Browser.mouseMovementY = 0; + } else { + Browser.mouseMovementX = Browser.getMovementX(event); + Browser.mouseMovementY = Browser.getMovementY(event); + } + + // check if SDL is available + if (typeof SDL != "undefined") { + Browser.mouseX = SDL.mouseX + Browser.mouseMovementX; + Browser.mouseY = SDL.mouseY + Browser.mouseMovementY; + } else { + // just add the mouse delta to the current absolut mouse position + // FIXME: ideally this should be clamped against the canvas size and zero + Browser.mouseX += Browser.mouseMovementX; + Browser.mouseY += Browser.mouseMovementY; + } + } else { + // Otherwise, calculate the movement based on the changes + // in the coordinates. + var rect = Module["canvas"].getBoundingClientRect(); + var cw = Module["canvas"].width; + var ch = Module["canvas"].height; + + // Neither .scrollX or .pageXOffset are defined in a spec, but + // we prefer .scrollX because it is currently in a spec draft. + // (see: http://www.w3.org/TR/2013/WD-cssom-view-20131217/) + var scrollX = ((typeof window.scrollX != 'undefined') ? window.scrollX : window.pageXOffset); + var scrollY = ((typeof window.scrollY != 'undefined') ? window.scrollY : window.pageYOffset); + // If this assert lands, it's likely because the browser doesn't support scrollX or pageXOffset + // and we have no viable fallback. + assert((typeof scrollX != 'undefined') && (typeof scrollY != 'undefined'), 'Unable to retrieve scroll position, mouse positions likely broken.'); + + if (event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchmove') { + var touch = event.touch; + if (touch === undefined) { + return; // the "touch" property is only defined in SDL + + } + var adjustedX = touch.pageX - (scrollX + rect.left); + var adjustedY = touch.pageY - (scrollY + rect.top); + + adjustedX = adjustedX * (cw / rect.width); + adjustedY = adjustedY * (ch / rect.height); + + var coords = { x: adjustedX, y: adjustedY }; + + if (event.type === 'touchstart') { + Browser.lastTouches[touch.identifier] = coords; + Browser.touches[touch.identifier] = coords; + } else if (event.type === 'touchend' || event.type === 'touchmove') { + var last = Browser.touches[touch.identifier]; + if (!last) last = coords; + Browser.lastTouches[touch.identifier] = last; + Browser.touches[touch.identifier] = coords; + } + return; + } + + var x = event.pageX - (scrollX + rect.left); + var y = event.pageY - (scrollY + rect.top); + + // the canvas might be CSS-scaled compared to its backbuffer; + // SDL-using content will want mouse coordinates in terms + // of backbuffer units. + x = x * (cw / rect.width); + y = y * (ch / rect.height); + + Browser.mouseMovementX = x - Browser.mouseX; + Browser.mouseMovementY = y - Browser.mouseY; + Browser.mouseX = x; + Browser.mouseY = y; + } + },resizeListeners:[],updateResizeListeners:function() { + var canvas = Module['canvas']; + Browser.resizeListeners.forEach((listener) => listener(canvas.width, canvas.height)); + },setCanvasSize:function(width, height, noUpdates) { + var canvas = Module['canvas']; + Browser.updateCanvasDimensions(canvas, width, height); + if (!noUpdates) Browser.updateResizeListeners(); + },windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function() { + // check if SDL is available + if (typeof SDL != "undefined") { + var flags = HEAPU32[((SDL.screen)>>2)]; + flags = flags | 0x00800000; // set SDL_FULLSCREEN flag + HEAP32[((SDL.screen)>>2)] = flags; + } + Browser.updateCanvasDimensions(Module['canvas']); + Browser.updateResizeListeners(); + },setWindowedCanvasSize:function() { + // check if SDL is available + if (typeof SDL != "undefined") { + var flags = HEAPU32[((SDL.screen)>>2)]; + flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag + HEAP32[((SDL.screen)>>2)] = flags; + } + Browser.updateCanvasDimensions(Module['canvas']); + Browser.updateResizeListeners(); + },updateCanvasDimensions:function(canvas, wNative, hNative) { + if (wNative && hNative) { + canvas.widthNative = wNative; + canvas.heightNative = hNative; + } else { + wNative = canvas.widthNative; + hNative = canvas.heightNative; + } + var w = wNative; + var h = hNative; + if (Module['forcedAspectRatio'] && Module['forcedAspectRatio'] > 0) { + if (w/h < Module['forcedAspectRatio']) { + w = Math.round(h * Module['forcedAspectRatio']); + } else { + h = Math.round(w / Module['forcedAspectRatio']); + } + } + if (((document['fullscreenElement'] || document['mozFullScreenElement'] || + document['msFullscreenElement'] || document['webkitFullscreenElement'] || + document['webkitCurrentFullScreenElement']) === canvas.parentNode) && (typeof screen != 'undefined')) { + var factor = Math.min(screen.width / w, screen.height / h); + w = Math.round(w * factor); + h = Math.round(h * factor); + } + if (Browser.resizeCanvas) { + if (canvas.width != w) canvas.width = w; + if (canvas.height != h) canvas.height = h; + if (typeof canvas.style != 'undefined') { + canvas.style.removeProperty( "width"); + canvas.style.removeProperty("height"); + } + } else { + if (canvas.width != wNative) canvas.width = wNative; + if (canvas.height != hNative) canvas.height = hNative; + if (typeof canvas.style != 'undefined') { + if (w != wNative || h != hNative) { + canvas.style.setProperty( "width", w + "px", "important"); + canvas.style.setProperty("height", h + "px", "important"); + } else { + canvas.style.removeProperty( "width"); + canvas.style.removeProperty("height"); + } + } + } + }}; + + var EGL = {errorCode:12288,defaultDisplayInitialized:false,currentContext:0,currentReadSurface:0,currentDrawSurface:0,contextAttributes:{alpha:false,depth:false,stencil:false,antialias:false},stringCache:{},setErrorCode:function(code) { + EGL.errorCode = code; + },chooseConfig:function(display, attribList, config, config_size, numConfigs) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + + if (attribList) { + // read attribList if it is non-null + for (;;) { + var param = HEAP32[((attribList)>>2)]; + if (param == 0x3021 /*EGL_ALPHA_SIZE*/) { + var alphaSize = HEAP32[(((attribList)+(4))>>2)]; + EGL.contextAttributes.alpha = (alphaSize > 0); + } else if (param == 0x3025 /*EGL_DEPTH_SIZE*/) { + var depthSize = HEAP32[(((attribList)+(4))>>2)]; + EGL.contextAttributes.depth = (depthSize > 0); + } else if (param == 0x3026 /*EGL_STENCIL_SIZE*/) { + var stencilSize = HEAP32[(((attribList)+(4))>>2)]; + EGL.contextAttributes.stencil = (stencilSize > 0); + } else if (param == 0x3031 /*EGL_SAMPLES*/) { + var samples = HEAP32[(((attribList)+(4))>>2)]; + EGL.contextAttributes.antialias = (samples > 0); + } else if (param == 0x3032 /*EGL_SAMPLE_BUFFERS*/) { + var samples = HEAP32[(((attribList)+(4))>>2)]; + EGL.contextAttributes.antialias = (samples == 1); + } else if (param == 0x3100 /*EGL_CONTEXT_PRIORITY_LEVEL_IMG*/) { + var requestedPriority = HEAP32[(((attribList)+(4))>>2)]; + EGL.contextAttributes.lowLatency = (requestedPriority != 0x3103 /*EGL_CONTEXT_PRIORITY_LOW_IMG*/); + } else if (param == 0x3038 /*EGL_NONE*/) { + break; + } + attribList += 8; + } + } + + if ((!config || !config_size) && !numConfigs) { + EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */); + return 0; + } + if (numConfigs) { + HEAP32[((numConfigs)>>2)] = 1; // Total number of supported configs: 1. + } + if (config && config_size > 0) { + HEAP32[((config)>>2)] = 62002; + } + + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + }}; + function _eglBindAPI(api) { + if (api == 0x30A0 /* EGL_OPENGL_ES_API */) { + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + } + // if (api == 0x30A1 /* EGL_OPENVG_API */ || api == 0x30A2 /* EGL_OPENGL_API */) { + EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */); + return 0; + } + + function _eglChooseConfig(display, attrib_list, configs, config_size, numConfigs) { + return EGL.chooseConfig(display, attrib_list, configs, config_size, numConfigs); + } + + function webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(ctx) { + // Closure is expected to be allowed to minify the '.dibvbi' property, so not accessing it quoted. + return !!(ctx.dibvbi = ctx.getExtension('WEBGL_draw_instanced_base_vertex_base_instance')); + } + + function webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(ctx) { + // Closure is expected to be allowed to minify the '.mdibvbi' property, so not accessing it quoted. + return !!(ctx.mdibvbi = ctx.getExtension('WEBGL_multi_draw_instanced_base_vertex_base_instance')); + } + + function webgl_enable_WEBGL_multi_draw(ctx) { + // Closure is expected to be allowed to minify the '.multiDrawWebgl' property, so not accessing it quoted. + return !!(ctx.multiDrawWebgl = ctx.getExtension('WEBGL_multi_draw')); + } + + + var GL = {counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],samplers:[],transformFeedbacks:[],syncs:[],stringCache:{},stringiCache:{},unpackAlignment:4,recordError:function recordError(errorCode) { + if (!GL.lastError) { + GL.lastError = errorCode; + } + },getNewId:function(table) { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + },getSource:function(shader, count, string, length) { + var source = ''; + for (var i = 0; i < count; ++i) { + var len = length ? HEAP32[(((length)+(i*4))>>2)] : -1; + source += UTF8ToString(HEAP32[(((string)+(i*4))>>2)], len < 0 ? undefined : len); + } + return source; + },createContext:function(/** @type {HTMLCanvasElement} */ canvas, webGLContextAttributes) { + + // BUG: Workaround Safari WebGL issue: After successfully acquiring WebGL context on a canvas, + // calling .getContext() will always return that context independent of which 'webgl' or 'webgl2' + // context version was passed. See https://bugs.webkit.org/show_bug.cgi?id=222758 and + // https://github.com/emscripten-core/emscripten/issues/13295. + // TODO: Once the bug is fixed and shipped in Safari, adjust the Safari version field in above check. + if (!canvas.getContextSafariWebGL2Fixed) { + canvas.getContextSafariWebGL2Fixed = canvas.getContext; + /** @type {function(this:HTMLCanvasElement, string, (Object|null)=): (Object|null)} */ + function fixedGetContext(ver, attrs) { + var gl = canvas.getContextSafariWebGL2Fixed(ver, attrs); + return ((ver == 'webgl') == (gl instanceof WebGLRenderingContext)) ? gl : null; + } + canvas.getContext = fixedGetContext; + } + + var ctx = canvas.getContext("webgl2", webGLContextAttributes); + + if (!ctx) return 0; + + var handle = GL.registerContext(ctx, webGLContextAttributes); + + return handle; + },registerContext:function(ctx, webGLContextAttributes) { + // without pthreads a context is just an integer ID + var handle = GL.getNewId(GL.contexts); + + var context = { + handle: handle, + attributes: webGLContextAttributes, + version: webGLContextAttributes.majorVersion, + GLctx: ctx + }; + + // Store the created context object so that we can access the context given a canvas without having to pass the parameters again. + if (ctx.canvas) ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault == 'undefined' || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + + return handle; + },makeContextCurrent:function(contextHandle) { + + GL.currentContext = GL.contexts[contextHandle]; // Active Emscripten GL layer context object. + Module.ctx = GLctx = GL.currentContext && GL.currentContext.GLctx; // Active WebGL context object. + return !(contextHandle && !GLctx); + },getContext:function(contextHandle) { + return GL.contexts[contextHandle]; + },deleteContext:function(contextHandle) { + if (GL.currentContext === GL.contexts[contextHandle]) GL.currentContext = null; + if (typeof JSEvents == 'object') JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); // Release all JS event handlers on the DOM element that the GL context is associated with since the context is now deleted. + if (GL.contexts[contextHandle] && GL.contexts[contextHandle].GLctx.canvas) GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; // Make sure the canvas object no longer refers to the context object so there are no GC surprises. + GL.contexts[contextHandle] = null; + },initExtensions:function(context) { + // If this function is called without a specific context object, init the extensions of the currently active context. + if (!context) context = GL.currentContext; + + if (context.initExtensionsDone) return; + context.initExtensionsDone = true; + + var GLctx = context.GLctx; + + // Detect the presence of a few extensions manually, this GL interop layer itself will need to know if they exist. + + // Extensions that are available from WebGL >= 2 (no-op if called on a WebGL 1 context active) + webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance(GLctx); + webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance(GLctx); + + // On WebGL 2, EXT_disjoint_timer_query is replaced with an alternative + // that's based on core APIs, and exposes only the queryCounterEXT() + // entrypoint. + if (context.version >= 2) { + GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query_webgl2"); + } + + // However, Firefox exposes the WebGL 1 version on WebGL 2 as well and + // thus we look for the WebGL 1 version again if the WebGL 2 version + // isn't present. https://bugzilla.mozilla.org/show_bug.cgi?id=1328882 + if (context.version < 2 || !GLctx.disjointTimerQueryExt) + { + GLctx.disjointTimerQueryExt = GLctx.getExtension("EXT_disjoint_timer_query"); + } + + webgl_enable_WEBGL_multi_draw(GLctx); + + // .getSupportedExtensions() can return null if context is lost, so coerce to empty array. + var exts = GLctx.getSupportedExtensions() || []; + exts.forEach(function(ext) { + // WEBGL_lose_context, WEBGL_debug_renderer_info and WEBGL_debug_shaders are not enabled by default. + if (!ext.includes('lose_context') && !ext.includes('debug')) { + // Call .getExtension() to enable that extension permanently. + GLctx.getExtension(ext); + } + }); + }}; + + function _eglCreateContext(display, config, hmm, contextAttribs) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + + // EGL 1.4 spec says default EGL_CONTEXT_CLIENT_VERSION is GLES1, but this is not supported by Emscripten. + // So user must pass EGL_CONTEXT_CLIENT_VERSION == 2 to initialize EGL. + var glesContextVersion = 1; + for (;;) { + var param = HEAP32[((contextAttribs)>>2)]; + if (param == 0x3098 /*EGL_CONTEXT_CLIENT_VERSION*/) { + glesContextVersion = HEAP32[(((contextAttribs)+(4))>>2)]; + } else if (param == 0x3038 /*EGL_NONE*/) { + break; + } else { + /* EGL1.4 specifies only EGL_CONTEXT_CLIENT_VERSION as supported attribute */ + EGL.setErrorCode(0x3004 /*EGL_BAD_ATTRIBUTE*/); + return 0; + } + contextAttribs += 8; + } + if (glesContextVersion < 2 || glesContextVersion > 3) { + EGL.setErrorCode(0x3005 /* EGL_BAD_CONFIG */); + return 0; /* EGL_NO_CONTEXT */ + } + + EGL.contextAttributes.majorVersion = glesContextVersion - 1; // WebGL 1 is GLES 2, WebGL2 is GLES3 + EGL.contextAttributes.minorVersion = 0; + + EGL.context = GL.createContext(Module['canvas'], EGL.contextAttributes); + + if (EGL.context != 0) { + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + + // Run callbacks so that GL emulation works + GL.makeContextCurrent(EGL.context); + Module.useWebGL = true; + Browser.moduleContextCreatedCallbacks.forEach(function(callback) { callback() }); + + // Note: This function only creates a context, but it shall not make it active. + GL.makeContextCurrent(null); + return 62004; // Magic ID for Emscripten EGLContext + } else { + EGL.setErrorCode(0x3009 /* EGL_BAD_MATCH */); // By the EGL 1.4 spec, an implementation that does not support GLES2 (WebGL in this case), this error code is set. + return 0; /* EGL_NO_CONTEXT */ + } + } + + function _eglCreateWindowSurface(display, config, win, attrib_list) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + if (config != 62002 /* Magic ID for the only EGLConfig supported by Emscripten */) { + EGL.setErrorCode(0x3005 /* EGL_BAD_CONFIG */); + return 0; + } + // TODO: Examine attrib_list! Parameters that can be present there are: + // - EGL_RENDER_BUFFER (must be EGL_BACK_BUFFER) + // - EGL_VG_COLORSPACE (can't be set) + // - EGL_VG_ALPHA_FORMAT (can't be set) + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 62006; /* Magic ID for Emscripten 'default surface' */ + } + + + function _eglDestroyContext(display, context) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + if (context != 62004 /* Magic ID for Emscripten EGLContext */) { + EGL.setErrorCode(0x3006 /* EGL_BAD_CONTEXT */); + return 0; + } + + GL.deleteContext(EGL.context); + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + if (EGL.currentContext == context) { + EGL.currentContext = 0; + } + return 1 /* EGL_TRUE */; + } + + function _eglDestroySurface(display, surface) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + if (surface != 62006 /* Magic ID for the only EGLSurface supported by Emscripten */) { + EGL.setErrorCode(0x300D /* EGL_BAD_SURFACE */); + return 1; + } + if (EGL.currentReadSurface == surface) { + EGL.currentReadSurface = 0; + } + if (EGL.currentDrawSurface == surface) { + EGL.currentDrawSurface = 0; + } + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; /* Magic ID for Emscripten 'default surface' */ + } + + function _eglGetConfigAttrib(display, config, attribute, value) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + if (config != 62002 /* Magic ID for the only EGLConfig supported by Emscripten */) { + EGL.setErrorCode(0x3005 /* EGL_BAD_CONFIG */); + return 0; + } + if (!value) { + EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */); + return 0; + } + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + switch (attribute) { + case 0x3020: // EGL_BUFFER_SIZE + HEAP32[((value)>>2)] = EGL.contextAttributes.alpha ? 32 : 24; + return 1; + case 0x3021: // EGL_ALPHA_SIZE + HEAP32[((value)>>2)] = EGL.contextAttributes.alpha ? 8 : 0; + return 1; + case 0x3022: // EGL_BLUE_SIZE + HEAP32[((value)>>2)] = 8; + return 1; + case 0x3023: // EGL_GREEN_SIZE + HEAP32[((value)>>2)] = 8; + return 1; + case 0x3024: // EGL_RED_SIZE + HEAP32[((value)>>2)] = 8; + return 1; + case 0x3025: // EGL_DEPTH_SIZE + HEAP32[((value)>>2)] = EGL.contextAttributes.depth ? 24 : 0; + return 1; + case 0x3026: // EGL_STENCIL_SIZE + HEAP32[((value)>>2)] = EGL.contextAttributes.stencil ? 8 : 0; + return 1; + case 0x3027: // EGL_CONFIG_CAVEAT + // We can return here one of EGL_NONE (0x3038), EGL_SLOW_CONFIG (0x3050) or EGL_NON_CONFORMANT_CONFIG (0x3051). + HEAP32[((value)>>2)] = 0x3038; + return 1; + case 0x3028: // EGL_CONFIG_ID + HEAP32[((value)>>2)] = 62002; + return 1; + case 0x3029: // EGL_LEVEL + HEAP32[((value)>>2)] = 0; + return 1; + case 0x302A: // EGL_MAX_PBUFFER_HEIGHT + HEAP32[((value)>>2)] = 4096; + return 1; + case 0x302B: // EGL_MAX_PBUFFER_PIXELS + HEAP32[((value)>>2)] = 16777216; + return 1; + case 0x302C: // EGL_MAX_PBUFFER_WIDTH + HEAP32[((value)>>2)] = 4096; + return 1; + case 0x302D: // EGL_NATIVE_RENDERABLE + HEAP32[((value)>>2)] = 0; + return 1; + case 0x302E: // EGL_NATIVE_VISUAL_ID + HEAP32[((value)>>2)] = 0; + return 1; + case 0x302F: // EGL_NATIVE_VISUAL_TYPE + HEAP32[((value)>>2)] = 0x3038; + return 1; + case 0x3031: // EGL_SAMPLES + HEAP32[((value)>>2)] = EGL.contextAttributes.antialias ? 4 : 0; + return 1; + case 0x3032: // EGL_SAMPLE_BUFFERS + HEAP32[((value)>>2)] = EGL.contextAttributes.antialias ? 1 : 0; + return 1; + case 0x3033: // EGL_SURFACE_TYPE + HEAP32[((value)>>2)] = 0x4; + return 1; + case 0x3034: // EGL_TRANSPARENT_TYPE + // If this returns EGL_TRANSPARENT_RGB (0x3052), transparency is used through color-keying. No such thing applies to Emscripten canvas. + HEAP32[((value)>>2)] = 0x3038; + return 1; + case 0x3035: // EGL_TRANSPARENT_BLUE_VALUE + case 0x3036: // EGL_TRANSPARENT_GREEN_VALUE + case 0x3037: // EGL_TRANSPARENT_RED_VALUE + // "If EGL_TRANSPARENT_TYPE is EGL_NONE, then the values for EGL_TRANSPARENT_RED_VALUE, EGL_TRANSPARENT_GREEN_VALUE, and EGL_TRANSPARENT_BLUE_VALUE are undefined." + HEAP32[((value)>>2)] = -1; + return 1; + case 0x3039: // EGL_BIND_TO_TEXTURE_RGB + case 0x303A: // EGL_BIND_TO_TEXTURE_RGBA + HEAP32[((value)>>2)] = 0; + return 1; + case 0x303B: // EGL_MIN_SWAP_INTERVAL + HEAP32[((value)>>2)] = 0; + return 1; + case 0x303C: // EGL_MAX_SWAP_INTERVAL + HEAP32[((value)>>2)] = 1; + return 1; + case 0x303D: // EGL_LUMINANCE_SIZE + case 0x303E: // EGL_ALPHA_MASK_SIZE + HEAP32[((value)>>2)] = 0; + return 1; + case 0x303F: // EGL_COLOR_BUFFER_TYPE + // EGL has two types of buffers: EGL_RGB_BUFFER and EGL_LUMINANCE_BUFFER. + HEAP32[((value)>>2)] = 0x308E; + return 1; + case 0x3040: // EGL_RENDERABLE_TYPE + // A bit combination of EGL_OPENGL_ES_BIT,EGL_OPENVG_BIT,EGL_OPENGL_ES2_BIT and EGL_OPENGL_BIT. + HEAP32[((value)>>2)] = 0x4; + return 1; + case 0x3042: // EGL_CONFORMANT + // "EGL_CONFORMANT is a mask indicating if a client API context created with respect to the corresponding EGLConfig will pass the required conformance tests for that API." + HEAP32[((value)>>2)] = 0; + return 1; + default: + EGL.setErrorCode(0x3004 /* EGL_BAD_ATTRIBUTE */); + return 0; + } + } + + function _eglGetDisplay(nativeDisplayType) { + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + // Note: As a 'conformant' implementation of EGL, we would prefer to init here only if the user + // calls this function with EGL_DEFAULT_DISPLAY. Other display IDs would be preferred to be unsupported + // and EGL_NO_DISPLAY returned. Uncomment the following code lines to do this. + // Instead, an alternative route has been preferred, namely that the Emscripten EGL implementation + // "emulates" X11, and eglGetDisplay is expected to accept/receive a pointer to an X11 Display object. + // Therefore, be lax and allow anything to be passed in, and return the magic handle to our default EGLDisplay object. + + // if (nativeDisplayType == 0 /* EGL_DEFAULT_DISPLAY */) { + return 62000; // Magic ID for Emscripten 'default display' + // } + // else + // return 0; // EGL_NO_DISPLAY + } + + function _eglGetError() { + return EGL.errorCode; + } + + function _eglInitialize(display, majorVersion, minorVersion) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + if (majorVersion) { + HEAP32[((majorVersion)>>2)] = 1; // Advertise EGL Major version: '1' + } + if (minorVersion) { + HEAP32[((minorVersion)>>2)] = 4; // Advertise EGL Minor version: '4' + } + EGL.defaultDisplayInitialized = true; + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + } + + + function _eglMakeCurrent(display, draw, read, context) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0 /* EGL_FALSE */; + } + //\todo An EGL_NOT_INITIALIZED error is generated if EGL is not initialized for dpy. + if (context != 0 && context != 62004 /* Magic ID for Emscripten EGLContext */) { + EGL.setErrorCode(0x3006 /* EGL_BAD_CONTEXT */); + return 0; + } + if ((read != 0 && read != 62006) || (draw != 0 && draw != 62006 /* Magic ID for Emscripten 'default surface' */)) { + EGL.setErrorCode(0x300D /* EGL_BAD_SURFACE */); + return 0; + } + + GL.makeContextCurrent(context ? EGL.context : null); + + EGL.currentContext = context; + EGL.currentDrawSurface = draw; + EGL.currentReadSurface = read; + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1 /* EGL_TRUE */; + } + + + function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); + } + + function stringToNewUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8(str, ret, size); + return ret; + } + + function _eglQueryString(display, name) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + //\todo An EGL_NOT_INITIALIZED error is generated if EGL is not initialized for dpy. + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + if (EGL.stringCache[name]) return EGL.stringCache[name]; + var ret; + switch (name) { + case 0x3053 /* EGL_VENDOR */: ret = stringToNewUTF8("Emscripten"); break; + case 0x3054 /* EGL_VERSION */: ret = stringToNewUTF8("1.4 Emscripten EGL"); break; + case 0x3055 /* EGL_EXTENSIONS */: ret = stringToNewUTF8(""); break; // Currently not supporting any EGL extensions. + case 0x308D /* EGL_CLIENT_APIS */: ret = stringToNewUTF8("OpenGL_ES"); break; + default: + EGL.setErrorCode(0x300C /* EGL_BAD_PARAMETER */); + return 0; + } + EGL.stringCache[name] = ret; + return ret; + } + + function _eglSwapBuffers(dpy, surface) { + + if (!EGL.defaultDisplayInitialized) { + EGL.setErrorCode(0x3001 /* EGL_NOT_INITIALIZED */); + } else if (!Module.ctx) { + EGL.setErrorCode(0x3002 /* EGL_BAD_ACCESS */); + } else if (Module.ctx.isContextLost()) { + EGL.setErrorCode(0x300E /* EGL_CONTEXT_LOST */); + } else { + // According to documentation this does an implicit flush. + // Due to discussion at https://github.com/emscripten-core/emscripten/pull/1871 + // the flush was removed since this _may_ result in slowing code down. + //_glFlush(); + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1 /* EGL_TRUE */; + } + return 0 /* EGL_FALSE */; + } + + + function _eglSwapInterval(display, interval) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + if (interval == 0) _emscripten_set_main_loop_timing(0, 0); + else _emscripten_set_main_loop_timing(1, interval); + + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + } + + function _eglTerminate(display) { + if (display != 62000 /* Magic ID for Emscripten 'default display' */) { + EGL.setErrorCode(0x3008 /* EGL_BAD_DISPLAY */); + return 0; + } + EGL.currentContext = 0; + EGL.currentReadSurface = 0; + EGL.currentDrawSurface = 0; + EGL.defaultDisplayInitialized = false; + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + } + + + /** @suppress {duplicate } */ + function _eglWaitClient() { + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + } + var _eglWaitGL = _eglWaitClient; + + function _eglWaitNative(nativeEngineId) { + EGL.setErrorCode(0x3000 /* EGL_SUCCESS */); + return 1; + } + + var readEmAsmArgsArray = []; + function readEmAsmArgs(sigPtr, buf) { + // Nobody should have mutated _readEmAsmArgsArray underneath us to be something else than an array. + assert(Array.isArray(readEmAsmArgsArray)); + // The input buffer is allocated on the stack, so it must be stack-aligned. + assert(buf % 16 == 0); + readEmAsmArgsArray.length = 0; + var ch; + // Most arguments are i32s, so shift the buffer pointer so it is a plain + // index into HEAP32. + buf >>= 2; + while (ch = HEAPU8[sigPtr++]) { + var chr = String.fromCharCode(ch); + var validChars = ['d', 'f', 'i']; + assert(validChars.includes(chr), `Invalid character ${ch}("${chr}") in readEmAsmArgs! Use only [${validChars}], and do not specify "v" for void return argument.`); + // Floats are always passed as doubles, and doubles and int64s take up 8 + // bytes (two 32-bit slots) in memory, align reads to these: + buf += (ch != 105/*i*/) & buf; + readEmAsmArgsArray.push( + ch == 105/*i*/ ? HEAP32[buf] : + HEAPF64[buf++ >> 1] + ); + ++buf; + } + return readEmAsmArgsArray; + } + function runEmAsmFunction(code, sigPtr, argbuf) { + var args = readEmAsmArgs(sigPtr, argbuf); + if (!ASM_CONSTS.hasOwnProperty(code)) abort(`No EM_ASM constant found at address ${code}`); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_asm_const_int(code, sigPtr, argbuf) { + return runEmAsmFunction(code, sigPtr, argbuf); + } + + function runMainThreadEmAsm(code, sigPtr, argbuf, sync) { + var args = readEmAsmArgs(sigPtr, argbuf); + if (!ASM_CONSTS.hasOwnProperty(code)) abort(`No EM_ASM constant found at address ${code}`); + return ASM_CONSTS[code].apply(null, args); + } + function _emscripten_asm_const_int_sync_on_main_thread(code, sigPtr, argbuf) { + return runMainThreadEmAsm(code, sigPtr, argbuf, 1); + } + + function _emscripten_cancel_main_loop() { + Browser.mainLoop.pause(); + Browser.mainLoop.func = null; + } + + function _emscripten_date_now() { + return Date.now(); + } + + function withStackSave(f) { + var stack = stackSave(); + var ret = f(); + stackRestore(stack); + return ret; + } + var JSEvents = {inEventHandler:0,removeAllEventListeners:function() { + for (var i = JSEvents.eventHandlers.length-1; i >= 0; --i) { + JSEvents._removeHandler(i); + } + JSEvents.eventHandlers = []; + JSEvents.deferredCalls = []; + },registerRemoveEventListeners:function() { + if (!JSEvents.removeEventListenersRegistered) { + __ATEXIT__.push(JSEvents.removeAllEventListeners); + JSEvents.removeEventListenersRegistered = true; + } + },deferredCalls:[],deferCall:function(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) return false; + + for (var i in arrA) { + if (arrA[i] != arrB[i]) return false; + } + return true; + } + // Test if the given call was already queued, and if so, don't add it again. + for (var i in JSEvents.deferredCalls) { + var call = JSEvents.deferredCalls[i]; + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({ + targetFunction: targetFunction, + precedence: precedence, + argsList: argsList + }); + + JSEvents.deferredCalls.sort(function(x,y) { return x.precedence < y.precedence; }); + },removeDeferredCalls:function(targetFunction) { + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + if (JSEvents.deferredCalls[i].targetFunction == targetFunction) { + JSEvents.deferredCalls.splice(i, 1); + --i; + } + } + },canPerformEventHandlerRequests:function() { + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + },runDeferredCalls:function() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + for (var i = 0; i < JSEvents.deferredCalls.length; ++i) { + var call = JSEvents.deferredCalls[i]; + JSEvents.deferredCalls.splice(i, 1); + --i; + call.targetFunction.apply(null, call.argsList); + } + },eventHandlers:[],removeAllHandlersOnTarget:function(target, eventTypeString) { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && + (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + },_removeHandler:function(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + },registerOrRemoveHandler:function(eventHandler) { + if (!eventHandler.target) { + err('registerOrRemoveHandler: the target element for event handler registration does not exist, when processing the following event handler registration:'); + console.dir(eventHandler); + return -4; + } + var jsEventHandler = function jsEventHandler(event) { + // Increment nesting count for the event handler. + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + // Process any old deferred calls the user has placed. + JSEvents.runDeferredCalls(); + // Process the actual event, calls back to user C code handler. + eventHandler.handlerFunc(event); + // Process any new deferred calls that were placed right now from this event handler. + JSEvents.runDeferredCalls(); + // Out of event handler - restore nesting count. + --JSEvents.inEventHandler; + }; + + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = jsEventHandler; + eventHandler.target.addEventListener(eventHandler.eventTypeString, jsEventHandler, eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + JSEvents.registerRemoveEventListeners(); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target + && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + return 0; + },getNodeNameForTarget:function(target) { + if (!target) return ''; + if (target == window) return '#window'; + if (target == screen) return '#screen'; + return (target && target.nodeName) ? target.nodeName : ''; + },fullscreenEnabled:function() { + return document.fullscreenEnabled + // Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitFullscreenEnabled. + // TODO: If Safari at some point ships with unprefixed version, update the version check above. + || document.webkitFullscreenEnabled + ; + }}; + + var currentFullscreenStrategy = {}; + + + + + function maybeCStringToJsString(cString) { + // "cString > 2" checks if the input is a number, and isn't of the special + // values we accept here, EMSCRIPTEN_EVENT_TARGET_* (which map to 0, 1, 2). + // In other words, if cString > 2 then it's a pointer to a valid place in + // memory, and points to a C string. + return cString > 2 ? UTF8ToString(cString) : cString; + } + + var specialHTMLTargets = [0, typeof document != 'undefined' ? document : 0, typeof window != 'undefined' ? window : 0]; + function findEventTarget(target) { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || (typeof document != 'undefined' ? document.querySelector(target) : undefined); + return domElement; + } + function findCanvasEventTarget(target) { return findEventTarget(target); } + function _emscripten_get_canvas_element_size(target, width, height) { + var canvas = findCanvasEventTarget(target); + if (!canvas) return -4; + HEAP32[((width)>>2)] = canvas.width; + HEAP32[((height)>>2)] = canvas.height; + } + + + + function stringToUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8(str, ret, size); + return ret; + } + function getCanvasElementSize(target) { + return withStackSave(function() { + var w = stackAlloc(8); + var h = w + 4; + + var targetInt = stringToUTF8OnStack(target.id); + var ret = _emscripten_get_canvas_element_size(targetInt, w, h); + var size = [HEAP32[((w)>>2)], HEAP32[((h)>>2)]]; + return size; + }); + } + + + function _emscripten_set_canvas_element_size(target, width, height) { + var canvas = findCanvasEventTarget(target); + if (!canvas) return -4; + canvas.width = width; + canvas.height = height; + return 0; + } + + + function setCanvasElementSize(target, width, height) { + if (!target.controlTransferredOffscreen) { + target.width = width; + target.height = height; + } else { + // This function is being called from high-level JavaScript code instead of asm.js/Wasm, + // and it needs to synchronously proxy over to another thread, so marshal the string onto the heap to do the call. + withStackSave(function() { + var targetInt = stringToUTF8OnStack(target.id); + _emscripten_set_canvas_element_size(targetInt, width, height); + }); + } + } + + function registerRestoreOldStyle(canvas) { + var canvasSize = getCanvasElementSize(canvas); + var oldWidth = canvasSize[0]; + var oldHeight = canvasSize[1]; + var oldCssWidth = canvas.style.width; + var oldCssHeight = canvas.style.height; + var oldBackgroundColor = canvas.style.backgroundColor; // Chrome reads color from here. + var oldDocumentBackgroundColor = document.body.style.backgroundColor; // IE11 reads color from here. + // Firefox always has black background color. + var oldPaddingLeft = canvas.style.paddingLeft; // Chrome, FF, Safari + var oldPaddingRight = canvas.style.paddingRight; + var oldPaddingTop = canvas.style.paddingTop; + var oldPaddingBottom = canvas.style.paddingBottom; + var oldMarginLeft = canvas.style.marginLeft; // IE11 + var oldMarginRight = canvas.style.marginRight; + var oldMarginTop = canvas.style.marginTop; + var oldMarginBottom = canvas.style.marginBottom; + var oldDocumentBodyMargin = document.body.style.margin; + var oldDocumentOverflow = document.documentElement.style.overflow; // Chrome, Firefox + var oldDocumentScroll = document.body.scroll; // IE + var oldImageRendering = canvas.style.imageRendering; + + function restoreOldStyle() { + var fullscreenElement = document.fullscreenElement + || document.webkitFullscreenElement + ; + if (!fullscreenElement) { + document.removeEventListener('fullscreenchange', restoreOldStyle); + + // Unprefixed Fullscreen API shipped in Chromium 71 (https://bugs.chromium.org/p/chromium/issues/detail?id=383813) + // As of Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitfullscreenchange. TODO: revisit this check once Safari ships unprefixed version. + document.removeEventListener('webkitfullscreenchange', restoreOldStyle); + + setCanvasElementSize(canvas, oldWidth, oldHeight); + + canvas.style.width = oldCssWidth; + canvas.style.height = oldCssHeight; + canvas.style.backgroundColor = oldBackgroundColor; // Chrome + // IE11 hack: assigning 'undefined' or an empty string to document.body.style.backgroundColor has no effect, so first assign back the default color + // before setting the undefined value. Setting undefined value is also important, or otherwise we would later treat that as something that the user + // had explicitly set so subsequent fullscreen transitions would not set background color properly. + if (!oldDocumentBackgroundColor) document.body.style.backgroundColor = 'white'; + document.body.style.backgroundColor = oldDocumentBackgroundColor; // IE11 + canvas.style.paddingLeft = oldPaddingLeft; // Chrome, FF, Safari + canvas.style.paddingRight = oldPaddingRight; + canvas.style.paddingTop = oldPaddingTop; + canvas.style.paddingBottom = oldPaddingBottom; + canvas.style.marginLeft = oldMarginLeft; // IE11 + canvas.style.marginRight = oldMarginRight; + canvas.style.marginTop = oldMarginTop; + canvas.style.marginBottom = oldMarginBottom; + document.body.style.margin = oldDocumentBodyMargin; + document.documentElement.style.overflow = oldDocumentOverflow; // Chrome, Firefox + document.body.scroll = oldDocumentScroll; // IE + canvas.style.imageRendering = oldImageRendering; + if (canvas.GLctxObject) canvas.GLctxObject.GLctx.viewport(0, 0, oldWidth, oldHeight); + + if (currentFullscreenStrategy.canvasResizedCallback) { + getWasmTableEntry(currentFullscreenStrategy.canvasResizedCallback)(37, 0, currentFullscreenStrategy.canvasResizedCallbackUserData); + } + } + } + document.addEventListener('fullscreenchange', restoreOldStyle); + // Unprefixed Fullscreen API shipped in Chromium 71 (https://bugs.chromium.org/p/chromium/issues/detail?id=383813) + // As of Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitfullscreenchange. TODO: revisit this check once Safari ships unprefixed version. + document.addEventListener('webkitfullscreenchange', restoreOldStyle); + return restoreOldStyle; + } + + + function setLetterbox(element, topBottom, leftRight) { + // Cannot use margin to specify letterboxes in FF or Chrome, since those ignore margins in fullscreen mode. + element.style.paddingLeft = element.style.paddingRight = leftRight + 'px'; + element.style.paddingTop = element.style.paddingBottom = topBottom + 'px'; + } + + + function getBoundingClientRect(e) { + return specialHTMLTargets.indexOf(e) < 0 ? e.getBoundingClientRect() : {'left':0,'top':0}; + } + function JSEvents_resizeCanvasForFullscreen(target, strategy) { + var restoreOldStyle = registerRestoreOldStyle(target); + var cssWidth = strategy.softFullscreen ? innerWidth : screen.width; + var cssHeight = strategy.softFullscreen ? innerHeight : screen.height; + var rect = getBoundingClientRect(target); + var windowedCssWidth = rect.width; + var windowedCssHeight = rect.height; + var canvasSize = getCanvasElementSize(target); + var windowedRttWidth = canvasSize[0]; + var windowedRttHeight = canvasSize[1]; + + if (strategy.scaleMode == 3) { + setLetterbox(target, (cssHeight - windowedCssHeight) / 2, (cssWidth - windowedCssWidth) / 2); + cssWidth = windowedCssWidth; + cssHeight = windowedCssHeight; + } else if (strategy.scaleMode == 2) { + if (cssWidth*windowedRttHeight < windowedRttWidth*cssHeight) { + var desiredCssHeight = windowedRttHeight * cssWidth / windowedRttWidth; + setLetterbox(target, (cssHeight - desiredCssHeight) / 2, 0); + cssHeight = desiredCssHeight; + } else { + var desiredCssWidth = windowedRttWidth * cssHeight / windowedRttHeight; + setLetterbox(target, 0, (cssWidth - desiredCssWidth) / 2); + cssWidth = desiredCssWidth; + } + } + + // If we are adding padding, must choose a background color or otherwise Chrome will give the + // padding a default white color. Do it only if user has not customized their own background color. + if (!target.style.backgroundColor) target.style.backgroundColor = 'black'; + // IE11 does the same, but requires the color to be set in the document body. + if (!document.body.style.backgroundColor) document.body.style.backgroundColor = 'black'; // IE11 + // Firefox always shows black letterboxes independent of style color. + + target.style.width = cssWidth + 'px'; + target.style.height = cssHeight + 'px'; + + if (strategy.filteringMode == 1) { + target.style.imageRendering = 'optimizeSpeed'; + target.style.imageRendering = '-moz-crisp-edges'; + target.style.imageRendering = '-o-crisp-edges'; + target.style.imageRendering = '-webkit-optimize-contrast'; + target.style.imageRendering = 'optimize-contrast'; + target.style.imageRendering = 'crisp-edges'; + target.style.imageRendering = 'pixelated'; + } + + var dpiScale = (strategy.canvasResolutionScaleMode == 2) ? devicePixelRatio : 1; + if (strategy.canvasResolutionScaleMode != 0) { + var newWidth = (cssWidth * dpiScale)|0; + var newHeight = (cssHeight * dpiScale)|0; + setCanvasElementSize(target, newWidth, newHeight); + if (target.GLctxObject) target.GLctxObject.GLctx.viewport(0, 0, newWidth, newHeight); + } + return restoreOldStyle; + } + + function JSEvents_requestFullscreen(target, strategy) { + // EMSCRIPTEN_FULLSCREEN_SCALE_DEFAULT + EMSCRIPTEN_FULLSCREEN_CANVAS_SCALE_NONE is a mode where no extra logic is performed to the DOM elements. + if (strategy.scaleMode != 0 || strategy.canvasResolutionScaleMode != 0) { + JSEvents_resizeCanvasForFullscreen(target, strategy); + } + + if (target.requestFullscreen) { + target.requestFullscreen(); + } else if (target.webkitRequestFullscreen) { + target.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT); + } else { + return JSEvents.fullscreenEnabled() ? -3 : -1; + } + + currentFullscreenStrategy = strategy; + + if (strategy.canvasResizedCallback) { + getWasmTableEntry(strategy.canvasResizedCallback)(37, 0, strategy.canvasResizedCallbackUserData); + } + + return 0; + } + + function _emscripten_exit_fullscreen() { + if (!JSEvents.fullscreenEnabled()) return -1; + // Make sure no queued up calls will fire after this. + JSEvents.removeDeferredCalls(JSEvents_requestFullscreen); + + var d = specialHTMLTargets[1]; + if (d.exitFullscreen) { + d.fullscreenElement && d.exitFullscreen(); + } else if (d.webkitExitFullscreen) { + d.webkitFullscreenElement && d.webkitExitFullscreen(); + } else { + return -1; + } + + return 0; + } + + + function requestPointerLock(target) { + if (target.requestPointerLock) { + target.requestPointerLock(); + } else { + // document.body is known to accept pointer lock, so use that to differentiate if the user passed a bad element, + // or if the whole browser just doesn't support the feature. + if (document.body.requestPointerLock + ) { + return -3; + } + return -1; + } + return 0; + } + function _emscripten_exit_pointerlock() { + // Make sure no queued up calls will fire after this. + JSEvents.removeDeferredCalls(requestPointerLock); + + if (document.exitPointerLock) { + document.exitPointerLock(); + } else { + return -1; + } + return 0; + } + + function _emscripten_get_device_pixel_ratio() { + return (typeof devicePixelRatio == 'number' && devicePixelRatio) || 1.0; + } + + + + function _emscripten_get_element_css_size(target, width, height) { + target = findEventTarget(target); + if (!target) return -4; + + var rect = getBoundingClientRect(target); + HEAPF64[((width)>>3)] = rect.width; + HEAPF64[((height)>>3)] = rect.height; + + return 0; + } + + + function fillGamepadEventData(eventStruct, e) { + HEAPF64[((eventStruct)>>3)] = e.timestamp; + for (var i = 0; i < e.axes.length; ++i) { + HEAPF64[(((eventStruct+i*8)+(16))>>3)] = e.axes[i]; + } + for (var i = 0; i < e.buttons.length; ++i) { + if (typeof e.buttons[i] == 'object') { + HEAPF64[(((eventStruct+i*8)+(528))>>3)] = e.buttons[i].value; + } else { + HEAPF64[(((eventStruct+i*8)+(528))>>3)] = e.buttons[i]; + } + } + for (var i = 0; i < e.buttons.length; ++i) { + if (typeof e.buttons[i] == 'object') { + HEAP32[(((eventStruct+i*4)+(1040))>>2)] = e.buttons[i].pressed; + } else { + // Assigning a boolean to HEAP32, that's ok, but Closure would like to warn about it: + /** @suppress {checkTypes} */ + HEAP32[(((eventStruct+i*4)+(1040))>>2)] = e.buttons[i] == 1; + } + } + HEAP32[(((eventStruct)+(1296))>>2)] = e.connected; + HEAP32[(((eventStruct)+(1300))>>2)] = e.index; + HEAP32[(((eventStruct)+(8))>>2)] = e.axes.length; + HEAP32[(((eventStruct)+(12))>>2)] = e.buttons.length; + stringToUTF8(e.id, eventStruct + 1304, 64); + stringToUTF8(e.mapping, eventStruct + 1368, 64); + } + function _emscripten_get_gamepad_status(index, gamepadState) { + if (!JSEvents.lastGamepadState) throw 'emscripten_get_gamepad_status() can only be called after having first called emscripten_sample_gamepad_data() and that function has returned EMSCRIPTEN_RESULT_SUCCESS!'; + + // INVALID_PARAM is returned on a Gamepad index that never was there. + if (index < 0 || index >= JSEvents.lastGamepadState.length) return -5; + + // NO_DATA is returned on a Gamepad index that was removed. + // For previously disconnected gamepads there should be an empty slot (null/undefined/false) at the index. + // This is because gamepads must keep their original position in the array. + // For example, removing the first of two gamepads produces [null/undefined/false, gamepad]. + if (!JSEvents.lastGamepadState[index]) return -7; + + fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]); + return 0; + } + + + function _emscripten_get_num_gamepads() { + if (!JSEvents.lastGamepadState) throw 'emscripten_get_num_gamepads() can only be called after having first called emscripten_sample_gamepad_data() and that function has returned EMSCRIPTEN_RESULT_SUCCESS!'; + // N.B. Do not call emscripten_get_num_gamepads() unless having first called emscripten_sample_gamepad_data(), and that has returned EMSCRIPTEN_RESULT_SUCCESS. + // Otherwise the following line will throw an exception. + return JSEvents.lastGamepadState.length; + } + + function _emscripten_get_screen_size(width, height) { + HEAP32[((width)>>2)] = screen.width; + HEAP32[((height)>>2)] = screen.height; + } + + /** @suppress {duplicate } */ + function _glActiveTexture(x0) { GLctx.activeTexture(x0) } + var _emscripten_glActiveTexture = _glActiveTexture; + + /** @suppress {duplicate } */ + function _glAttachShader(program, shader) { + GLctx.attachShader(GL.programs[program], GL.shaders[shader]); + } + var _emscripten_glAttachShader = _glAttachShader; + + /** @suppress {duplicate } */ + function _glBeginQuery(target, id) { + GLctx.beginQuery(target, GL.queries[id]); + } + var _emscripten_glBeginQuery = _glBeginQuery; + + /** @suppress {duplicate } */ + function _glBeginQueryEXT(target, id) { + GLctx.disjointTimerQueryExt['beginQueryEXT'](target, GL.queries[id]); + } + var _emscripten_glBeginQueryEXT = _glBeginQueryEXT; + + /** @suppress {duplicate } */ + function _glBeginTransformFeedback(x0) { GLctx.beginTransformFeedback(x0) } + var _emscripten_glBeginTransformFeedback = _glBeginTransformFeedback; + + + /** @suppress {duplicate } */ + function _glBindAttribLocation(program, index, name) { + GLctx.bindAttribLocation(GL.programs[program], index, UTF8ToString(name)); + } + var _emscripten_glBindAttribLocation = _glBindAttribLocation; + + /** @suppress {duplicate } */ + function _glBindBuffer(target, buffer) { + + if (target == 0x88EB /*GL_PIXEL_PACK_BUFFER*/) { + // In WebGL 2 glReadPixels entry point, we need to use a different WebGL 2 API function call when a buffer is bound to + // GL_PIXEL_PACK_BUFFER_BINDING point, so must keep track whether that binding point is non-null to know what is + // the proper API function to call. + GLctx.currentPixelPackBufferBinding = buffer; + } else if (target == 0x88EC /*GL_PIXEL_UNPACK_BUFFER*/) { + // In WebGL 2 gl(Compressed)Tex(Sub)Image[23]D entry points, we need to + // use a different WebGL 2 API function call when a buffer is bound to + // GL_PIXEL_UNPACK_BUFFER_BINDING point, so must keep track whether that + // binding point is non-null to know what is the proper API function to + // call. + GLctx.currentPixelUnpackBufferBinding = buffer; + } + GLctx.bindBuffer(target, GL.buffers[buffer]); + } + var _emscripten_glBindBuffer = _glBindBuffer; + + /** @suppress {duplicate } */ + function _glBindBufferBase(target, index, buffer) { + GLctx.bindBufferBase(target, index, GL.buffers[buffer]); + } + var _emscripten_glBindBufferBase = _glBindBufferBase; + + /** @suppress {duplicate } */ + function _glBindBufferRange(target, index, buffer, offset, ptrsize) { + GLctx.bindBufferRange(target, index, GL.buffers[buffer], offset, ptrsize); + } + var _emscripten_glBindBufferRange = _glBindBufferRange; + + /** @suppress {duplicate } */ + function _glBindFramebuffer(target, framebuffer) { + + GLctx.bindFramebuffer(target, GL.framebuffers[framebuffer]); + + } + var _emscripten_glBindFramebuffer = _glBindFramebuffer; + + /** @suppress {duplicate } */ + function _glBindRenderbuffer(target, renderbuffer) { + GLctx.bindRenderbuffer(target, GL.renderbuffers[renderbuffer]); + } + var _emscripten_glBindRenderbuffer = _glBindRenderbuffer; + + /** @suppress {duplicate } */ + function _glBindSampler(unit, sampler) { + GLctx.bindSampler(unit, GL.samplers[sampler]); + } + var _emscripten_glBindSampler = _glBindSampler; + + /** @suppress {duplicate } */ + function _glBindTexture(target, texture) { + GLctx.bindTexture(target, GL.textures[texture]); + } + var _emscripten_glBindTexture = _glBindTexture; + + /** @suppress {duplicate } */ + function _glBindTransformFeedback(target, id) { + GLctx.bindTransformFeedback(target, GL.transformFeedbacks[id]); + } + var _emscripten_glBindTransformFeedback = _glBindTransformFeedback; + + /** @suppress {duplicate } */ + function _glBindVertexArray(vao) { + GLctx.bindVertexArray(GL.vaos[vao]); + } + var _emscripten_glBindVertexArray = _glBindVertexArray; + + + /** @suppress {duplicate } */ + var _glBindVertexArrayOES = _glBindVertexArray; + var _emscripten_glBindVertexArrayOES = _glBindVertexArrayOES; + + /** @suppress {duplicate } */ + function _glBlendColor(x0, x1, x2, x3) { GLctx.blendColor(x0, x1, x2, x3) } + var _emscripten_glBlendColor = _glBlendColor; + + /** @suppress {duplicate } */ + function _glBlendEquation(x0) { GLctx.blendEquation(x0) } + var _emscripten_glBlendEquation = _glBlendEquation; + + /** @suppress {duplicate } */ + function _glBlendEquationSeparate(x0, x1) { GLctx.blendEquationSeparate(x0, x1) } + var _emscripten_glBlendEquationSeparate = _glBlendEquationSeparate; + + /** @suppress {duplicate } */ + function _glBlendFunc(x0, x1) { GLctx.blendFunc(x0, x1) } + var _emscripten_glBlendFunc = _glBlendFunc; + + /** @suppress {duplicate } */ + function _glBlendFuncSeparate(x0, x1, x2, x3) { GLctx.blendFuncSeparate(x0, x1, x2, x3) } + var _emscripten_glBlendFuncSeparate = _glBlendFuncSeparate; + + /** @suppress {duplicate } */ + function _glBlitFramebuffer(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) { GLctx.blitFramebuffer(x0, x1, x2, x3, x4, x5, x6, x7, x8, x9) } + var _emscripten_glBlitFramebuffer = _glBlitFramebuffer; + + /** @suppress {duplicate } */ + function _glBufferData(target, size, data, usage) { + + if (true) { // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + // If size is zero, WebGL would interpret uploading the whole input arraybuffer (starting from given offset), which would + // not make sense in WebAssembly, so avoid uploading if size is zero. However we must still call bufferData to establish a + // backing storage of zero bytes. + if (data && size) { + GLctx.bufferData(target, HEAPU8, usage, data, size); + } else { + GLctx.bufferData(target, size, usage); + } + } else { + // N.b. here first form specifies a heap subarray, second form an integer size, so the ?: code here is polymorphic. It is advised to avoid + // randomly mixing both uses in calling code, to avoid any potential JS engine JIT issues. + GLctx.bufferData(target, data ? HEAPU8.subarray(data, data+size) : size, usage); + } + } + var _emscripten_glBufferData = _glBufferData; + + /** @suppress {duplicate } */ + function _glBufferSubData(target, offset, size, data) { + if (true) { // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + size && GLctx.bufferSubData(target, offset, HEAPU8, data, size); + return; + } + GLctx.bufferSubData(target, offset, HEAPU8.subarray(data, data+size)); + } + var _emscripten_glBufferSubData = _glBufferSubData; + + /** @suppress {duplicate } */ + function _glCheckFramebufferStatus(x0) { return GLctx.checkFramebufferStatus(x0) } + var _emscripten_glCheckFramebufferStatus = _glCheckFramebufferStatus; + + /** @suppress {duplicate } */ + function _glClear(x0) { GLctx.clear(x0) } + var _emscripten_glClear = _glClear; + + /** @suppress {duplicate } */ + function _glClearBufferfi(x0, x1, x2, x3) { GLctx.clearBufferfi(x0, x1, x2, x3) } + var _emscripten_glClearBufferfi = _glClearBufferfi; + + /** @suppress {duplicate } */ + function _glClearBufferfv(buffer, drawbuffer, value) { + + GLctx.clearBufferfv(buffer, drawbuffer, HEAPF32, value>>2); + } + var _emscripten_glClearBufferfv = _glClearBufferfv; + + /** @suppress {duplicate } */ + function _glClearBufferiv(buffer, drawbuffer, value) { + + GLctx.clearBufferiv(buffer, drawbuffer, HEAP32, value>>2); + } + var _emscripten_glClearBufferiv = _glClearBufferiv; + + /** @suppress {duplicate } */ + function _glClearBufferuiv(buffer, drawbuffer, value) { + + GLctx.clearBufferuiv(buffer, drawbuffer, HEAPU32, value>>2); + } + var _emscripten_glClearBufferuiv = _glClearBufferuiv; + + /** @suppress {duplicate } */ + function _glClearColor(x0, x1, x2, x3) { GLctx.clearColor(x0, x1, x2, x3) } + var _emscripten_glClearColor = _glClearColor; + + /** @suppress {duplicate } */ + function _glClearDepthf(x0) { GLctx.clearDepth(x0) } + var _emscripten_glClearDepthf = _glClearDepthf; + + /** @suppress {duplicate } */ + function _glClearStencil(x0) { GLctx.clearStencil(x0) } + var _emscripten_glClearStencil = _glClearStencil; + + function convertI32PairToI53(lo, hi) { + // This function should not be getting called with too large unsigned numbers + // in high part (if hi >= 0x7FFFFFFFF, one should have been calling + // convertU32PairToI53()) + assert(hi === (hi|0)); + return (lo >>> 0) + hi * 4294967296; + } + /** @suppress {duplicate } */ + function _glClientWaitSync(sync, flags, timeout_low, timeout_high) { + // WebGL2 vs GLES3 differences: in GLES3, the timeout parameter is a uint64, where 0xFFFFFFFFFFFFFFFFULL means GL_TIMEOUT_IGNORED. + // In JS, there's no 64-bit value types, so instead timeout is taken to be signed, and GL_TIMEOUT_IGNORED is given value -1. + // Inherently the value accepted in the timeout is lossy, and can't take in arbitrary u64 bit pattern (but most likely doesn't matter) + // See https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.15 + var timeout = convertI32PairToI53(timeout_low, timeout_high); + return GLctx.clientWaitSync(GL.syncs[sync], flags, timeout); + } + var _emscripten_glClientWaitSync = _glClientWaitSync; + + /** @suppress {duplicate } */ + function _glColorMask(red, green, blue, alpha) { + GLctx.colorMask(!!red, !!green, !!blue, !!alpha); + } + var _emscripten_glColorMask = _glColorMask; + + /** @suppress {duplicate } */ + function _glCompileShader(shader) { + GLctx.compileShader(GL.shaders[shader]); + } + var _emscripten_glCompileShader = _glCompileShader; + + /** @suppress {duplicate } */ + function _glCompressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data) { + if (true) { // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + if (GLctx.currentPixelUnpackBufferBinding || !imageSize) { + GLctx.compressedTexImage2D(target, level, internalFormat, width, height, border, imageSize, data); + } else { + GLctx.compressedTexImage2D(target, level, internalFormat, width, height, border, HEAPU8, data, imageSize); + } + return; + } + GLctx.compressedTexImage2D(target, level, internalFormat, width, height, border, data ? HEAPU8.subarray((data), (data+imageSize)) : null); + } + var _emscripten_glCompressedTexImage2D = _glCompressedTexImage2D; + + /** @suppress {duplicate } */ + function _glCompressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, data) { + if (GLctx.currentPixelUnpackBufferBinding) { + GLctx.compressedTexImage3D(target, level, internalFormat, width, height, depth, border, imageSize, data); + } else { + GLctx.compressedTexImage3D(target, level, internalFormat, width, height, depth, border, HEAPU8, data, imageSize); + } + } + var _emscripten_glCompressedTexImage3D = _glCompressedTexImage3D; + + /** @suppress {duplicate } */ + function _glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data) { + if (true) { // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + if (GLctx.currentPixelUnpackBufferBinding || !imageSize) { + GLctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data); + } else { + GLctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, HEAPU8, data, imageSize); + } + return; + } + GLctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, data ? HEAPU8.subarray((data), (data+imageSize)) : null); + } + var _emscripten_glCompressedTexSubImage2D = _glCompressedTexSubImage2D; + + /** @suppress {duplicate } */ + function _glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data) { + if (GLctx.currentPixelUnpackBufferBinding) { + GLctx.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data); + } else { + GLctx.compressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, HEAPU8, data, imageSize); + } + } + var _emscripten_glCompressedTexSubImage3D = _glCompressedTexSubImage3D; + + /** @suppress {duplicate } */ + function _glCopyBufferSubData(x0, x1, x2, x3, x4) { GLctx.copyBufferSubData(x0, x1, x2, x3, x4) } + var _emscripten_glCopyBufferSubData = _glCopyBufferSubData; + + /** @suppress {duplicate } */ + function _glCopyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx.copyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7) } + var _emscripten_glCopyTexImage2D = _glCopyTexImage2D; + + /** @suppress {duplicate } */ + function _glCopyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7) { GLctx.copyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7) } + var _emscripten_glCopyTexSubImage2D = _glCopyTexSubImage2D; + + /** @suppress {duplicate } */ + function _glCopyTexSubImage3D(x0, x1, x2, x3, x4, x5, x6, x7, x8) { GLctx.copyTexSubImage3D(x0, x1, x2, x3, x4, x5, x6, x7, x8) } + var _emscripten_glCopyTexSubImage3D = _glCopyTexSubImage3D; + + /** @suppress {duplicate } */ + function _glCreateProgram() { + var id = GL.getNewId(GL.programs); + var program = GLctx.createProgram(); + // Store additional information needed for each shader program: + program.name = id; + // Lazy cache results of glGetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH/GL_ACTIVE_ATTRIBUTE_MAX_LENGTH/GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH) + program.maxUniformLength = program.maxAttributeLength = program.maxUniformBlockNameLength = 0; + program.uniformIdCounter = 1; + GL.programs[id] = program; + return id; + } + var _emscripten_glCreateProgram = _glCreateProgram; + + /** @suppress {duplicate } */ + function _glCreateShader(shaderType) { + var id = GL.getNewId(GL.shaders); + GL.shaders[id] = GLctx.createShader(shaderType); + + return id; + } + var _emscripten_glCreateShader = _glCreateShader; + + /** @suppress {duplicate } */ + function _glCullFace(x0) { GLctx.cullFace(x0) } + var _emscripten_glCullFace = _glCullFace; + + /** @suppress {duplicate } */ + function _glDeleteBuffers(n, buffers) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((buffers)+(i*4))>>2)]; + var buffer = GL.buffers[id]; + + // From spec: "glDeleteBuffers silently ignores 0's and names that do not + // correspond to existing buffer objects." + if (!buffer) continue; + + GLctx.deleteBuffer(buffer); + buffer.name = 0; + GL.buffers[id] = null; + + if (id == GLctx.currentPixelPackBufferBinding) GLctx.currentPixelPackBufferBinding = 0; + if (id == GLctx.currentPixelUnpackBufferBinding) GLctx.currentPixelUnpackBufferBinding = 0; + } + } + var _emscripten_glDeleteBuffers = _glDeleteBuffers; + + /** @suppress {duplicate } */ + function _glDeleteFramebuffers(n, framebuffers) { + for (var i = 0; i < n; ++i) { + var id = HEAP32[(((framebuffers)+(i*4))>>2)]; + var framebuffer = GL.framebuffers[id]; + if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects". + GLctx.deleteFramebuffer(framebuffer); + framebuffer.name = 0; + GL.framebuffers[id] = null; + } + } + var _emscripten_glDeleteFramebuffers = _glDeleteFramebuffers; + + /** @suppress {duplicate } */ + function _glDeleteProgram(id) { + if (!id) return; + var program = GL.programs[id]; + if (!program) { // glDeleteProgram actually signals an error when deleting a nonexisting object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteProgram(program); + program.name = 0; + GL.programs[id] = null; + } + var _emscripten_glDeleteProgram = _glDeleteProgram; + + /** @suppress {duplicate } */ + function _glDeleteQueries(n, ids) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((ids)+(i*4))>>2)]; + var query = GL.queries[id]; + if (!query) continue; // GL spec: "unused names in ids are ignored, as is the name zero." + GLctx.deleteQuery(query); + GL.queries[id] = null; + } + } + var _emscripten_glDeleteQueries = _glDeleteQueries; + + /** @suppress {duplicate } */ + function _glDeleteQueriesEXT(n, ids) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((ids)+(i*4))>>2)]; + var query = GL.queries[id]; + if (!query) continue; // GL spec: "unused names in ids are ignored, as is the name zero." + GLctx.disjointTimerQueryExt['deleteQueryEXT'](query); + GL.queries[id] = null; + } + } + var _emscripten_glDeleteQueriesEXT = _glDeleteQueriesEXT; + + /** @suppress {duplicate } */ + function _glDeleteRenderbuffers(n, renderbuffers) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((renderbuffers)+(i*4))>>2)]; + var renderbuffer = GL.renderbuffers[id]; + if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects". + GLctx.deleteRenderbuffer(renderbuffer); + renderbuffer.name = 0; + GL.renderbuffers[id] = null; + } + } + var _emscripten_glDeleteRenderbuffers = _glDeleteRenderbuffers; + + /** @suppress {duplicate } */ + function _glDeleteSamplers(n, samplers) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((samplers)+(i*4))>>2)]; + var sampler = GL.samplers[id]; + if (!sampler) continue; + GLctx.deleteSampler(sampler); + sampler.name = 0; + GL.samplers[id] = null; + } + } + var _emscripten_glDeleteSamplers = _glDeleteSamplers; + + /** @suppress {duplicate } */ + function _glDeleteShader(id) { + if (!id) return; + var shader = GL.shaders[id]; + if (!shader) { // glDeleteShader actually signals an error when deleting a nonexisting object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteShader(shader); + GL.shaders[id] = null; + } + var _emscripten_glDeleteShader = _glDeleteShader; + + /** @suppress {duplicate } */ + function _glDeleteSync(id) { + if (!id) return; + var sync = GL.syncs[id]; + if (!sync) { // glDeleteSync signals an error when deleting a nonexisting object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteSync(sync); + sync.name = 0; + GL.syncs[id] = null; + } + var _emscripten_glDeleteSync = _glDeleteSync; + + /** @suppress {duplicate } */ + function _glDeleteTextures(n, textures) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((textures)+(i*4))>>2)]; + var texture = GL.textures[id]; + if (!texture) continue; // GL spec: "glDeleteTextures silently ignores 0s and names that do not correspond to existing textures". + GLctx.deleteTexture(texture); + texture.name = 0; + GL.textures[id] = null; + } + } + var _emscripten_glDeleteTextures = _glDeleteTextures; + + /** @suppress {duplicate } */ + function _glDeleteTransformFeedbacks(n, ids) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((ids)+(i*4))>>2)]; + var transformFeedback = GL.transformFeedbacks[id]; + if (!transformFeedback) continue; // GL spec: "unused names in ids are ignored, as is the name zero." + GLctx.deleteTransformFeedback(transformFeedback); + transformFeedback.name = 0; + GL.transformFeedbacks[id] = null; + } + } + var _emscripten_glDeleteTransformFeedbacks = _glDeleteTransformFeedbacks; + + /** @suppress {duplicate } */ + function _glDeleteVertexArrays(n, vaos) { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((vaos)+(i*4))>>2)]; + GLctx.deleteVertexArray(GL.vaos[id]); + GL.vaos[id] = null; + } + } + var _emscripten_glDeleteVertexArrays = _glDeleteVertexArrays; + + + /** @suppress {duplicate } */ + var _glDeleteVertexArraysOES = _glDeleteVertexArrays; + var _emscripten_glDeleteVertexArraysOES = _glDeleteVertexArraysOES; + + /** @suppress {duplicate } */ + function _glDepthFunc(x0) { GLctx.depthFunc(x0) } + var _emscripten_glDepthFunc = _glDepthFunc; + + /** @suppress {duplicate } */ + function _glDepthMask(flag) { + GLctx.depthMask(!!flag); + } + var _emscripten_glDepthMask = _glDepthMask; + + /** @suppress {duplicate } */ + function _glDepthRangef(x0, x1) { GLctx.depthRange(x0, x1) } + var _emscripten_glDepthRangef = _glDepthRangef; + + /** @suppress {duplicate } */ + function _glDetachShader(program, shader) { + GLctx.detachShader(GL.programs[program], GL.shaders[shader]); + } + var _emscripten_glDetachShader = _glDetachShader; + + /** @suppress {duplicate } */ + function _glDisable(x0) { GLctx.disable(x0) } + var _emscripten_glDisable = _glDisable; + + /** @suppress {duplicate } */ + function _glDisableVertexAttribArray(index) { + GLctx.disableVertexAttribArray(index); + } + var _emscripten_glDisableVertexAttribArray = _glDisableVertexAttribArray; + + /** @suppress {duplicate } */ + function _glDrawArrays(mode, first, count) { + + GLctx.drawArrays(mode, first, count); + + } + var _emscripten_glDrawArrays = _glDrawArrays; + + /** @suppress {duplicate } */ + function _glDrawArraysInstanced(mode, first, count, primcount) { + GLctx.drawArraysInstanced(mode, first, count, primcount); + } + var _emscripten_glDrawArraysInstanced = _glDrawArraysInstanced; + + + /** @suppress {duplicate } */ + var _glDrawArraysInstancedANGLE = _glDrawArraysInstanced; + var _emscripten_glDrawArraysInstancedANGLE = _glDrawArraysInstancedANGLE; + + + /** @suppress {duplicate } */ + var _glDrawArraysInstancedARB = _glDrawArraysInstanced; + var _emscripten_glDrawArraysInstancedARB = _glDrawArraysInstancedARB; + + + /** @suppress {duplicate } */ + var _glDrawArraysInstancedEXT = _glDrawArraysInstanced; + var _emscripten_glDrawArraysInstancedEXT = _glDrawArraysInstancedEXT; + + + /** @suppress {duplicate } */ + var _glDrawArraysInstancedNV = _glDrawArraysInstanced; + var _emscripten_glDrawArraysInstancedNV = _glDrawArraysInstancedNV; + + var tempFixedLengthArray = []; + + /** @suppress {duplicate } */ + function _glDrawBuffers(n, bufs) { + + var bufArray = tempFixedLengthArray[n]; + for (var i = 0; i < n; i++) { + bufArray[i] = HEAP32[(((bufs)+(i*4))>>2)]; + } + + GLctx.drawBuffers(bufArray); + } + var _emscripten_glDrawBuffers = _glDrawBuffers; + + + /** @suppress {duplicate } */ + var _glDrawBuffersEXT = _glDrawBuffers; + var _emscripten_glDrawBuffersEXT = _glDrawBuffersEXT; + + + /** @suppress {duplicate } */ + var _glDrawBuffersWEBGL = _glDrawBuffers; + var _emscripten_glDrawBuffersWEBGL = _glDrawBuffersWEBGL; + + /** @suppress {duplicate } */ + function _glDrawElements(mode, count, type, indices) { + + GLctx.drawElements(mode, count, type, indices); + + } + var _emscripten_glDrawElements = _glDrawElements; + + /** @suppress {duplicate } */ + function _glDrawElementsInstanced(mode, count, type, indices, primcount) { + GLctx.drawElementsInstanced(mode, count, type, indices, primcount); + } + var _emscripten_glDrawElementsInstanced = _glDrawElementsInstanced; + + + /** @suppress {duplicate } */ + var _glDrawElementsInstancedANGLE = _glDrawElementsInstanced; + var _emscripten_glDrawElementsInstancedANGLE = _glDrawElementsInstancedANGLE; + + + /** @suppress {duplicate } */ + var _glDrawElementsInstancedARB = _glDrawElementsInstanced; + var _emscripten_glDrawElementsInstancedARB = _glDrawElementsInstancedARB; + + + /** @suppress {duplicate } */ + var _glDrawElementsInstancedEXT = _glDrawElementsInstanced; + var _emscripten_glDrawElementsInstancedEXT = _glDrawElementsInstancedEXT; + + + /** @suppress {duplicate } */ + var _glDrawElementsInstancedNV = _glDrawElementsInstanced; + var _emscripten_glDrawElementsInstancedNV = _glDrawElementsInstancedNV; + + /** @suppress {duplicate } */ + function _glDrawRangeElements(mode, start, end, count, type, indices) { + // TODO: This should be a trivial pass-though function registered at the bottom of this page as + // glFuncs[6][1] += ' drawRangeElements'; + // but due to https://bugzilla.mozilla.org/show_bug.cgi?id=1202427, + // we work around by ignoring the range. + _glDrawElements(mode, count, type, indices); + } + var _emscripten_glDrawRangeElements = _glDrawRangeElements; + + /** @suppress {duplicate } */ + function _glEnable(x0) { GLctx.enable(x0) } + var _emscripten_glEnable = _glEnable; + + /** @suppress {duplicate } */ + function _glEnableVertexAttribArray(index) { + GLctx.enableVertexAttribArray(index); + } + var _emscripten_glEnableVertexAttribArray = _glEnableVertexAttribArray; + + /** @suppress {duplicate } */ + function _glEndQuery(x0) { GLctx.endQuery(x0) } + var _emscripten_glEndQuery = _glEndQuery; + + /** @suppress {duplicate } */ + function _glEndQueryEXT(target) { + GLctx.disjointTimerQueryExt['endQueryEXT'](target); + } + var _emscripten_glEndQueryEXT = _glEndQueryEXT; + + /** @suppress {duplicate } */ + function _glEndTransformFeedback() { GLctx.endTransformFeedback() } + var _emscripten_glEndTransformFeedback = _glEndTransformFeedback; + + /** @suppress {duplicate } */ + function _glFenceSync(condition, flags) { + var sync = GLctx.fenceSync(condition, flags); + if (sync) { + var id = GL.getNewId(GL.syncs); + sync.name = id; + GL.syncs[id] = sync; + return id; + } + return 0; // Failed to create a sync object + } + var _emscripten_glFenceSync = _glFenceSync; + + /** @suppress {duplicate } */ + function _glFinish() { GLctx.finish() } + var _emscripten_glFinish = _glFinish; + + /** @suppress {duplicate } */ + function _glFlush() { GLctx.flush() } + var _emscripten_glFlush = _glFlush; + + /** @suppress {duplicate } */ + function _glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer) { + GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget, + GL.renderbuffers[renderbuffer]); + } + var _emscripten_glFramebufferRenderbuffer = _glFramebufferRenderbuffer; + + /** @suppress {duplicate } */ + function _glFramebufferTexture2D(target, attachment, textarget, texture, level) { + GLctx.framebufferTexture2D(target, attachment, textarget, + GL.textures[texture], level); + } + var _emscripten_glFramebufferTexture2D = _glFramebufferTexture2D; + + /** @suppress {duplicate } */ + function _glFramebufferTextureLayer(target, attachment, texture, level, layer) { + GLctx.framebufferTextureLayer(target, attachment, GL.textures[texture], level, layer); + } + var _emscripten_glFramebufferTextureLayer = _glFramebufferTextureLayer; + + /** @suppress {duplicate } */ + function _glFrontFace(x0) { GLctx.frontFace(x0) } + var _emscripten_glFrontFace = _glFrontFace; + + function __glGenObject(n, buffers, createFunction, objectTable + ) { + for (var i = 0; i < n; i++) { + var buffer = GLctx[createFunction](); + var id = buffer && GL.getNewId(objectTable); + if (buffer) { + buffer.name = id; + objectTable[id] = buffer; + } else { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); + } + HEAP32[(((buffers)+(i*4))>>2)] = id; + } + } + + /** @suppress {duplicate } */ + function _glGenBuffers(n, buffers) { + __glGenObject(n, buffers, 'createBuffer', GL.buffers + ); + } + var _emscripten_glGenBuffers = _glGenBuffers; + + + /** @suppress {duplicate } */ + function _glGenFramebuffers(n, ids) { + __glGenObject(n, ids, 'createFramebuffer', GL.framebuffers + ); + } + var _emscripten_glGenFramebuffers = _glGenFramebuffers; + + /** @suppress {duplicate } */ + function _glGenQueries(n, ids) { + __glGenObject(n, ids, 'createQuery', GL.queries + ); + } + var _emscripten_glGenQueries = _glGenQueries; + + /** @suppress {duplicate } */ + function _glGenQueriesEXT(n, ids) { + for (var i = 0; i < n; i++) { + var query = GLctx.disjointTimerQueryExt['createQueryEXT'](); + if (!query) { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); + while (i < n) HEAP32[(((ids)+(i++*4))>>2)] = 0; + return; + } + var id = GL.getNewId(GL.queries); + query.name = id; + GL.queries[id] = query; + HEAP32[(((ids)+(i*4))>>2)] = id; + } + } + var _emscripten_glGenQueriesEXT = _glGenQueriesEXT; + + + /** @suppress {duplicate } */ + function _glGenRenderbuffers(n, renderbuffers) { + __glGenObject(n, renderbuffers, 'createRenderbuffer', GL.renderbuffers + ); + } + var _emscripten_glGenRenderbuffers = _glGenRenderbuffers; + + /** @suppress {duplicate } */ + function _glGenSamplers(n, samplers) { + __glGenObject(n, samplers, 'createSampler', GL.samplers + ); + } + var _emscripten_glGenSamplers = _glGenSamplers; + + + /** @suppress {duplicate } */ + function _glGenTextures(n, textures) { + __glGenObject(n, textures, 'createTexture', GL.textures + ); + } + var _emscripten_glGenTextures = _glGenTextures; + + /** @suppress {duplicate } */ + function _glGenTransformFeedbacks(n, ids) { + __glGenObject(n, ids, 'createTransformFeedback', GL.transformFeedbacks + ); + } + var _emscripten_glGenTransformFeedbacks = _glGenTransformFeedbacks; + + + /** @suppress {duplicate } */ + function _glGenVertexArrays(n, arrays) { + __glGenObject(n, arrays, 'createVertexArray', GL.vaos + ); + } + var _emscripten_glGenVertexArrays = _glGenVertexArrays; + + + /** @suppress {duplicate } */ + var _glGenVertexArraysOES = _glGenVertexArrays; + var _emscripten_glGenVertexArraysOES = _glGenVertexArraysOES; + + /** @suppress {duplicate } */ + function _glGenerateMipmap(x0) { GLctx.generateMipmap(x0) } + var _emscripten_glGenerateMipmap = _glGenerateMipmap; + + + function __glGetActiveAttribOrUniform(funcName, program, index, bufSize, length, size, type, name) { + program = GL.programs[program]; + var info = GLctx[funcName](program, index); + if (info) { // If an error occurs, nothing will be written to length, size and type and name. + var numBytesWrittenExclNull = name && stringToUTF8(info.name, name, bufSize); + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + if (size) HEAP32[((size)>>2)] = info.size; + if (type) HEAP32[((type)>>2)] = info.type; + } + } + + /** @suppress {duplicate } */ + function _glGetActiveAttrib(program, index, bufSize, length, size, type, name) { + __glGetActiveAttribOrUniform('getActiveAttrib', program, index, bufSize, length, size, type, name); + } + var _emscripten_glGetActiveAttrib = _glGetActiveAttrib; + + + /** @suppress {duplicate } */ + function _glGetActiveUniform(program, index, bufSize, length, size, type, name) { + __glGetActiveAttribOrUniform('getActiveUniform', program, index, bufSize, length, size, type, name); + } + var _emscripten_glGetActiveUniform = _glGetActiveUniform; + + /** @suppress {duplicate } */ + function _glGetActiveUniformBlockName(program, uniformBlockIndex, bufSize, length, uniformBlockName) { + program = GL.programs[program]; + + var result = GLctx.getActiveUniformBlockName(program, uniformBlockIndex); + if (!result) return; // If an error occurs, nothing will be written to uniformBlockName or length. + if (uniformBlockName && bufSize > 0) { + var numBytesWrittenExclNull = stringToUTF8(result, uniformBlockName, bufSize); + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + } else { + if (length) HEAP32[((length)>>2)] = 0; + } + } + var _emscripten_glGetActiveUniformBlockName = _glGetActiveUniformBlockName; + + /** @suppress {duplicate } */ + function _glGetActiveUniformBlockiv(program, uniformBlockIndex, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + program = GL.programs[program]; + + if (pname == 0x8A41 /* GL_UNIFORM_BLOCK_NAME_LENGTH */) { + var name = GLctx.getActiveUniformBlockName(program, uniformBlockIndex); + HEAP32[((params)>>2)] = name.length+1; + return; + } + + var result = GLctx.getActiveUniformBlockParameter(program, uniformBlockIndex, pname); + if (result === null) return; // If an error occurs, nothing should be written to params. + if (pname == 0x8A43 /*GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES*/) { + for (var i = 0; i < result.length; i++) { + HEAP32[(((params)+(i*4))>>2)] = result[i]; + } + } else { + HEAP32[((params)>>2)] = result; + } + } + var _emscripten_glGetActiveUniformBlockiv = _glGetActiveUniformBlockiv; + + /** @suppress {duplicate } */ + function _glGetActiveUniformsiv(program, uniformCount, uniformIndices, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (uniformCount > 0 && uniformIndices == 0) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + program = GL.programs[program]; + var ids = []; + for (var i = 0; i < uniformCount; i++) { + ids.push(HEAP32[(((uniformIndices)+(i*4))>>2)]); + } + + var result = GLctx.getActiveUniforms(program, ids, pname); + if (!result) return; // GL spec: If an error is generated, nothing is written out to params. + + var len = result.length; + for (var i = 0; i < len; i++) { + HEAP32[(((params)+(i*4))>>2)] = result[i]; + } + } + var _emscripten_glGetActiveUniformsiv = _glGetActiveUniformsiv; + + /** @suppress {duplicate } */ + function _glGetAttachedShaders(program, maxCount, count, shaders) { + var result = GLctx.getAttachedShaders(GL.programs[program]); + var len = result.length; + if (len > maxCount) { + len = maxCount; + } + HEAP32[((count)>>2)] = len; + for (var i = 0; i < len; ++i) { + var id = GL.shaders.indexOf(result[i]); + HEAP32[(((shaders)+(i*4))>>2)] = id; + } + } + var _emscripten_glGetAttachedShaders = _glGetAttachedShaders; + + + /** @suppress {duplicate } */ + function _glGetAttribLocation(program, name) { + return GLctx.getAttribLocation(GL.programs[program], UTF8ToString(name)); + } + var _emscripten_glGetAttribLocation = _glGetAttribLocation; + + function readI53FromI64(ptr) { + return HEAPU32[ptr>>2] + HEAP32[ptr+4>>2] * 4294967296; + } + + function readI53FromU64(ptr) { + return HEAPU32[ptr>>2] + HEAPU32[ptr+4>>2] * 4294967296; + } + function writeI53ToI64(ptr, num) { + HEAPU32[ptr>>2] = num; + HEAPU32[ptr+4>>2] = (num - HEAPU32[ptr>>2])/4294967296; + var deserialized = (num >= 0) ? readI53FromU64(ptr) : readI53FromI64(ptr); + if (deserialized != num) warnOnce('writeI53ToI64() out of range: serialized JS Number ' + num + ' to Wasm heap as bytes lo=' + ptrToString(HEAPU32[ptr>>2]) + ', hi=' + ptrToString(HEAPU32[ptr+4>>2]) + ', which deserializes back to ' + deserialized + ' instead!'); + } + + function emscriptenWebGLGet(name_, p, type) { + // Guard against user passing a null pointer. + // Note that GLES2 spec does not say anything about how passing a null pointer should be treated. + // Testing on desktop core GL 3, the application crashes on glGetIntegerv to a null pointer, but + // better to report an error instead of doing anything random. + if (!p) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var ret = undefined; + switch (name_) { // Handle a few trivial GLES values + case 0x8DFA: // GL_SHADER_COMPILER + ret = 1; + break; + case 0x8DF8: // GL_SHADER_BINARY_FORMATS + if (type != 0 && type != 1) { + GL.recordError(0x500); // GL_INVALID_ENUM + } + return; // Do not write anything to the out pointer, since no binary formats are supported. + case 0x87FE: // GL_NUM_PROGRAM_BINARY_FORMATS + case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS + ret = 0; + break; + case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS + // WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be queried for length), + // so implement it ourselves to allow C++ GLES2 code get the length. + var formats = GLctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/); + ret = formats ? formats.length : 0; + break; + + case 0x821D: // GL_NUM_EXTENSIONS + if (GL.currentContext.version < 2) { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); // Calling GLES3/WebGL2 function with a GLES2/WebGL1 context + return; + } + // .getSupportedExtensions() can return null if context is lost, so coerce to empty array. + var exts = GLctx.getSupportedExtensions() || []; + ret = 2 * exts.length; // each extension is duplicated, first in unprefixed WebGL form, and then a second time with "GL_" prefix. + break; + case 0x821B: // GL_MAJOR_VERSION + case 0x821C: // GL_MINOR_VERSION + if (GL.currentContext.version < 2) { + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + ret = name_ == 0x821B ? 3 : 0; // return version 3.0 + break; + } + + if (ret === undefined) { + var result = GLctx.getParameter(name_); + switch (typeof result) { + case "number": + ret = result; + break; + case "boolean": + ret = result ? 1 : 0; + break; + case "string": + GL.recordError(0x500); // GL_INVALID_ENUM + return; + case "object": + if (result === null) { + // null is a valid result for some (e.g., which buffer is bound - perhaps nothing is bound), but otherwise + // can mean an invalid name_, which we need to report as an error + switch (name_) { + case 0x8894: // ARRAY_BUFFER_BINDING + case 0x8B8D: // CURRENT_PROGRAM + case 0x8895: // ELEMENT_ARRAY_BUFFER_BINDING + case 0x8CA6: // FRAMEBUFFER_BINDING or DRAW_FRAMEBUFFER_BINDING + case 0x8CA7: // RENDERBUFFER_BINDING + case 0x8069: // TEXTURE_BINDING_2D + case 0x85B5: // WebGL 2 GL_VERTEX_ARRAY_BINDING, or WebGL 1 extension OES_vertex_array_object GL_VERTEX_ARRAY_BINDING_OES + case 0x8F36: // COPY_READ_BUFFER_BINDING or COPY_READ_BUFFER + case 0x8F37: // COPY_WRITE_BUFFER_BINDING or COPY_WRITE_BUFFER + case 0x88ED: // PIXEL_PACK_BUFFER_BINDING + case 0x88EF: // PIXEL_UNPACK_BUFFER_BINDING + case 0x8CAA: // READ_FRAMEBUFFER_BINDING + case 0x8919: // SAMPLER_BINDING + case 0x8C1D: // TEXTURE_BINDING_2D_ARRAY + case 0x806A: // TEXTURE_BINDING_3D + case 0x8E25: // TRANSFORM_FEEDBACK_BINDING + case 0x8C8F: // TRANSFORM_FEEDBACK_BUFFER_BINDING + case 0x8A28: // UNIFORM_BUFFER_BINDING + case 0x8514: { // TEXTURE_BINDING_CUBE_MAP + ret = 0; + break; + } + default: { + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + } + } else if (result instanceof Float32Array || + result instanceof Uint32Array || + result instanceof Int32Array || + result instanceof Array) { + for (var i = 0; i < result.length; ++i) { + switch (type) { + case 0: HEAP32[(((p)+(i*4))>>2)] = result[i]; break; + case 2: HEAPF32[(((p)+(i*4))>>2)] = result[i]; break; + case 4: HEAP8[(((p)+(i))>>0)] = result[i] ? 1 : 0; break; + } + } + return; + } else { + try { + ret = result.name | 0; + } catch(e) { + GL.recordError(0x500); // GL_INVALID_ENUM + err('GL_INVALID_ENUM in glGet' + type + 'v: Unknown object returned from WebGL getParameter(' + name_ + ')! (error: ' + e + ')'); + return; + } + } + break; + default: + GL.recordError(0x500); // GL_INVALID_ENUM + err('GL_INVALID_ENUM in glGet' + type + 'v: Native code calling glGet' + type + 'v(' + name_ + ') and it returns ' + result + ' of type ' + typeof(result) + '!'); + return; + } + } + + switch (type) { + case 1: writeI53ToI64(p, ret); break; + case 0: HEAP32[((p)>>2)] = ret; break; + case 2: HEAPF32[((p)>>2)] = ret; break; + case 4: HEAP8[((p)>>0)] = ret ? 1 : 0; break; + } + } + + /** @suppress {duplicate } */ + function _glGetBooleanv(name_, p) { + emscriptenWebGLGet(name_, p, 4); + } + var _emscripten_glGetBooleanv = _glGetBooleanv; + + /** @suppress {duplicate } */ + function _glGetBufferParameteri64v(target, value, data) { + if (!data) { + // GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense + // if data == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + writeI53ToI64(data, GLctx.getBufferParameter(target, value)); + } + var _emscripten_glGetBufferParameteri64v = _glGetBufferParameteri64v; + + /** @suppress {duplicate } */ + function _glGetBufferParameteriv(target, value, data) { + if (!data) { + // GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense + // if data == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((data)>>2)] = GLctx.getBufferParameter(target, value); + } + var _emscripten_glGetBufferParameteriv = _glGetBufferParameteriv; + + /** @suppress {duplicate } */ + function _glGetError() { + var error = GLctx.getError() || GL.lastError; + GL.lastError = 0/*GL_NO_ERROR*/; + return error; + } + var _emscripten_glGetError = _glGetError; + + + /** @suppress {duplicate } */ + function _glGetFloatv(name_, p) { + emscriptenWebGLGet(name_, p, 2); + } + var _emscripten_glGetFloatv = _glGetFloatv; + + /** @suppress {duplicate } */ + function _glGetFragDataLocation(program, name) { + return GLctx.getFragDataLocation(GL.programs[program], UTF8ToString(name)); + } + var _emscripten_glGetFragDataLocation = _glGetFragDataLocation; + + /** @suppress {duplicate } */ + function _glGetFramebufferAttachmentParameteriv(target, attachment, pname, params) { + var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname); + if (result instanceof WebGLRenderbuffer || + result instanceof WebGLTexture) { + result = result.name | 0; + } + HEAP32[((params)>>2)] = result; + } + var _emscripten_glGetFramebufferAttachmentParameteriv = _glGetFramebufferAttachmentParameteriv; + + function emscriptenWebGLGetIndexed(target, index, data, type) { + if (!data) { + // GLES2 specification does not specify how to behave if data is a null pointer. Since calling this function does not make sense + // if data == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var result = GLctx.getIndexedParameter(target, index); + var ret; + switch (typeof result) { + case 'boolean': + ret = result ? 1 : 0; + break; + case 'number': + ret = result; + break; + case 'object': + if (result === null) { + switch (target) { + case 0x8C8F: // TRANSFORM_FEEDBACK_BUFFER_BINDING + case 0x8A28: // UNIFORM_BUFFER_BINDING + ret = 0; + break; + default: { + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + } + } else if (result instanceof WebGLBuffer) { + ret = result.name | 0; + } else { + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + break; + default: + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + + switch (type) { + case 1: writeI53ToI64(data, ret); break; + case 0: HEAP32[((data)>>2)] = ret; break; + case 2: HEAPF32[((data)>>2)] = ret; break; + case 4: HEAP8[((data)>>0)] = ret ? 1 : 0; break; + default: throw 'internal emscriptenWebGLGetIndexed() error, bad type: ' + type; + } + } + /** @suppress {duplicate } */ + function _glGetInteger64i_v(target, index, data) { + emscriptenWebGLGetIndexed(target, index, data, 1); + } + var _emscripten_glGetInteger64i_v = _glGetInteger64i_v; + + /** @suppress {duplicate } */ + function _glGetInteger64v(name_, p) { + emscriptenWebGLGet(name_, p, 1); + } + var _emscripten_glGetInteger64v = _glGetInteger64v; + + /** @suppress {duplicate } */ + function _glGetIntegeri_v(target, index, data) { + emscriptenWebGLGetIndexed(target, index, data, 0); + } + var _emscripten_glGetIntegeri_v = _glGetIntegeri_v; + + + /** @suppress {duplicate } */ + function _glGetIntegerv(name_, p) { + emscriptenWebGLGet(name_, p, 0); + } + var _emscripten_glGetIntegerv = _glGetIntegerv; + + /** @suppress {duplicate } */ + function _glGetInternalformativ(target, internalformat, pname, bufSize, params) { + if (bufSize < 0) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (!params) { + // GLES3 specification does not specify how to behave if values is a null pointer. Since calling this function does not make sense + // if values == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var ret = GLctx.getInternalformatParameter(target, internalformat, pname); + if (ret === null) return; + for (var i = 0; i < ret.length && i < bufSize; ++i) { + HEAP32[(((params)+(i*4))>>2)] = ret[i]; + } + } + var _emscripten_glGetInternalformativ = _glGetInternalformativ; + + /** @suppress {duplicate } */ + function _glGetProgramBinary(program, bufSize, length, binaryFormat, binary) { + GL.recordError(0x502/*GL_INVALID_OPERATION*/); + } + var _emscripten_glGetProgramBinary = _glGetProgramBinary; + + /** @suppress {duplicate } */ + function _glGetProgramInfoLog(program, maxLength, length, infoLog) { + var log = GLctx.getProgramInfoLog(GL.programs[program]); + if (log === null) log = '(unknown error)'; + var numBytesWrittenExclNull = (maxLength > 0 && infoLog) ? stringToUTF8(log, infoLog, maxLength) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + } + var _emscripten_glGetProgramInfoLog = _glGetProgramInfoLog; + + /** @suppress {duplicate } */ + function _glGetProgramiv(program, pname, p) { + if (!p) { + // GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + + if (program >= GL.counter) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + + program = GL.programs[program]; + + if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH + var log = GLctx.getProgramInfoLog(program); + if (log === null) log = '(unknown error)'; + HEAP32[((p)>>2)] = log.length + 1; + } else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) { + if (!program.maxUniformLength) { + for (var i = 0; i < GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); ++i) { + program.maxUniformLength = Math.max(program.maxUniformLength, GLctx.getActiveUniform(program, i).name.length+1); + } + } + HEAP32[((p)>>2)] = program.maxUniformLength; + } else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) { + if (!program.maxAttributeLength) { + for (var i = 0; i < GLctx.getProgramParameter(program, 0x8B89/*GL_ACTIVE_ATTRIBUTES*/); ++i) { + program.maxAttributeLength = Math.max(program.maxAttributeLength, GLctx.getActiveAttrib(program, i).name.length+1); + } + } + HEAP32[((p)>>2)] = program.maxAttributeLength; + } else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) { + if (!program.maxUniformBlockNameLength) { + for (var i = 0; i < GLctx.getProgramParameter(program, 0x8A36/*GL_ACTIVE_UNIFORM_BLOCKS*/); ++i) { + program.maxUniformBlockNameLength = Math.max(program.maxUniformBlockNameLength, GLctx.getActiveUniformBlockName(program, i).length+1); + } + } + HEAP32[((p)>>2)] = program.maxUniformBlockNameLength; + } else { + HEAP32[((p)>>2)] = GLctx.getProgramParameter(program, pname); + } + } + var _emscripten_glGetProgramiv = _glGetProgramiv; + + + /** @suppress {duplicate } */ + function _glGetQueryObjecti64vEXT(id, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param; + if (GL.currentContext.version < 2) + { + param = GLctx.disjointTimerQueryExt['getQueryObjectEXT'](query, pname); + } + else { + param = GLctx.getQueryParameter(query, pname); + } + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + writeI53ToI64(params, ret); + } + var _emscripten_glGetQueryObjecti64vEXT = _glGetQueryObjecti64vEXT; + + /** @suppress {duplicate } */ + function _glGetQueryObjectivEXT(id, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param = GLctx.disjointTimerQueryExt['getQueryObjectEXT'](query, pname); + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + HEAP32[((params)>>2)] = ret; + } + var _emscripten_glGetQueryObjectivEXT = _glGetQueryObjectivEXT; + + + /** @suppress {duplicate } */ + var _glGetQueryObjectui64vEXT = _glGetQueryObjecti64vEXT; + var _emscripten_glGetQueryObjectui64vEXT = _glGetQueryObjectui64vEXT; + + /** @suppress {duplicate } */ + function _glGetQueryObjectuiv(id, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param = GLctx.getQueryParameter(query, pname); + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + HEAP32[((params)>>2)] = ret; + } + var _emscripten_glGetQueryObjectuiv = _glGetQueryObjectuiv; + + + /** @suppress {duplicate } */ + var _glGetQueryObjectuivEXT = _glGetQueryObjectivEXT; + var _emscripten_glGetQueryObjectuivEXT = _glGetQueryObjectuivEXT; + + /** @suppress {duplicate } */ + function _glGetQueryiv(target, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getQuery(target, pname); + } + var _emscripten_glGetQueryiv = _glGetQueryiv; + + /** @suppress {duplicate } */ + function _glGetQueryivEXT(target, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.disjointTimerQueryExt['getQueryEXT'](target, pname); + } + var _emscripten_glGetQueryivEXT = _glGetQueryivEXT; + + /** @suppress {duplicate } */ + function _glGetRenderbufferParameteriv(target, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getRenderbufferParameter(target, pname); + } + var _emscripten_glGetRenderbufferParameteriv = _glGetRenderbufferParameteriv; + + /** @suppress {duplicate } */ + function _glGetSamplerParameterfv(sampler, pname, params) { + if (!params) { + // GLES3 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAPF32[((params)>>2)] = GLctx.getSamplerParameter(GL.samplers[sampler], pname); + } + var _emscripten_glGetSamplerParameterfv = _glGetSamplerParameterfv; + + /** @suppress {duplicate } */ + function _glGetSamplerParameteriv(sampler, pname, params) { + if (!params) { + // GLES3 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getSamplerParameter(GL.samplers[sampler], pname); + } + var _emscripten_glGetSamplerParameteriv = _glGetSamplerParameteriv; + + + /** @suppress {duplicate } */ + function _glGetShaderInfoLog(shader, maxLength, length, infoLog) { + var log = GLctx.getShaderInfoLog(GL.shaders[shader]); + if (log === null) log = '(unknown error)'; + var numBytesWrittenExclNull = (maxLength > 0 && infoLog) ? stringToUTF8(log, infoLog, maxLength) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + } + var _emscripten_glGetShaderInfoLog = _glGetShaderInfoLog; + + /** @suppress {duplicate } */ + function _glGetShaderPrecisionFormat(shaderType, precisionType, range, precision) { + var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType); + HEAP32[((range)>>2)] = result.rangeMin; + HEAP32[(((range)+(4))>>2)] = result.rangeMax; + HEAP32[((precision)>>2)] = result.precision; + } + var _emscripten_glGetShaderPrecisionFormat = _glGetShaderPrecisionFormat; + + /** @suppress {duplicate } */ + function _glGetShaderSource(shader, bufSize, length, source) { + var result = GLctx.getShaderSource(GL.shaders[shader]); + if (!result) return; // If an error occurs, nothing will be written to length or source. + var numBytesWrittenExclNull = (bufSize > 0 && source) ? stringToUTF8(result, source, bufSize) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + } + var _emscripten_glGetShaderSource = _glGetShaderSource; + + /** @suppress {duplicate } */ + function _glGetShaderiv(shader, pname, p) { + if (!p) { + // GLES2 specification does not specify how to behave if p is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH + var log = GLctx.getShaderInfoLog(GL.shaders[shader]); + if (log === null) log = '(unknown error)'; + // The GLES2 specification says that if the shader has an empty info log, + // a value of 0 is returned. Otherwise the log has a null char appended. + // (An empty string is falsey, so we can just check that instead of + // looking at log.length.) + var logLength = log ? log.length + 1 : 0; + HEAP32[((p)>>2)] = logLength; + } else if (pname == 0x8B88) { // GL_SHADER_SOURCE_LENGTH + var source = GLctx.getShaderSource(GL.shaders[shader]); + // source may be a null, or the empty string, both of which are falsey + // values that we report a 0 length for. + var sourceLength = source ? source.length + 1 : 0; + HEAP32[((p)>>2)] = sourceLength; + } else { + HEAP32[((p)>>2)] = GLctx.getShaderParameter(GL.shaders[shader], pname); + } + } + var _emscripten_glGetShaderiv = _glGetShaderiv; + + + /** @suppress {duplicate } */ + function _glGetString(name_) { + var ret = GL.stringCache[name_]; + if (!ret) { + switch (name_) { + case 0x1F03 /* GL_EXTENSIONS */: + var exts = GLctx.getSupportedExtensions() || []; // .getSupportedExtensions() can return null if context is lost, so coerce to empty array. + exts = exts.concat(exts.map(function(e) { return "GL_" + e; })); + ret = stringToNewUTF8(exts.join(' ')); + break; + case 0x1F00 /* GL_VENDOR */: + case 0x1F01 /* GL_RENDERER */: + case 0x9245 /* UNMASKED_VENDOR_WEBGL */: + case 0x9246 /* UNMASKED_RENDERER_WEBGL */: + var s = GLctx.getParameter(name_); + if (!s) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + } + ret = s && stringToNewUTF8(s); + break; + + case 0x1F02 /* GL_VERSION */: + var glVersion = GLctx.getParameter(0x1F02 /*GL_VERSION*/); + // return GLES version string corresponding to the version of the WebGL context + if (true) glVersion = 'OpenGL ES 3.0 (' + glVersion + ')'; + else + { + glVersion = 'OpenGL ES 2.0 (' + glVersion + ')'; + } + ret = stringToNewUTF8(glVersion); + break; + case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */: + var glslVersion = GLctx.getParameter(0x8B8C /*GL_SHADING_LANGUAGE_VERSION*/); + // extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...' + var ver_re = /^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/; + var ver_num = glslVersion.match(ver_re); + if (ver_num !== null) { + if (ver_num[1].length == 3) ver_num[1] = ver_num[1] + '0'; // ensure minor version has 2 digits + glslVersion = 'OpenGL ES GLSL ES ' + ver_num[1] + ' (' + glslVersion + ')'; + } + ret = stringToNewUTF8(glslVersion); + break; + default: + GL.recordError(0x500/*GL_INVALID_ENUM*/); + // fall through + } + GL.stringCache[name_] = ret; + } + return ret; + } + var _emscripten_glGetString = _glGetString; + + /** @suppress {duplicate } */ + function _glGetStringi(name, index) { + if (GL.currentContext.version < 2) { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); // Calling GLES3/WebGL2 function with a GLES2/WebGL1 context + return 0; + } + var stringiCache = GL.stringiCache[name]; + if (stringiCache) { + if (index < 0 || index >= stringiCache.length) { + GL.recordError(0x501/*GL_INVALID_VALUE*/); + return 0; + } + return stringiCache[index]; + } + switch (name) { + case 0x1F03 /* GL_EXTENSIONS */: + var exts = GLctx.getSupportedExtensions() || []; // .getSupportedExtensions() can return null if context is lost, so coerce to empty array. + exts = exts.concat(exts.map(function(e) { return "GL_" + e; })); + exts = exts.map(function(e) { return stringToNewUTF8(e); }); + + stringiCache = GL.stringiCache[name] = exts; + if (index < 0 || index >= stringiCache.length) { + GL.recordError(0x501/*GL_INVALID_VALUE*/); + return 0; + } + return stringiCache[index]; + default: + GL.recordError(0x500/*GL_INVALID_ENUM*/); + return 0; + } + } + var _emscripten_glGetStringi = _glGetStringi; + + /** @suppress {duplicate } */ + function _glGetSynciv(sync, pname, bufSize, length, values) { + if (bufSize < 0) { + // GLES3 specification does not specify how to behave if bufSize < 0, however in the spec wording for glGetInternalformativ, it does say that GL_INVALID_VALUE should be raised, + // so raise GL_INVALID_VALUE here as well. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (!values) { + // GLES3 specification does not specify how to behave if values is a null pointer. Since calling this function does not make sense + // if values == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var ret = GLctx.getSyncParameter(GL.syncs[sync], pname); + if (ret !== null) { + HEAP32[((values)>>2)] = ret; + if (length) HEAP32[((length)>>2)] = 1; // Report a single value outputted. + } + } + var _emscripten_glGetSynciv = _glGetSynciv; + + /** @suppress {duplicate } */ + function _glGetTexParameterfv(target, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAPF32[((params)>>2)] = GLctx.getTexParameter(target, pname); + } + var _emscripten_glGetTexParameterfv = _glGetTexParameterfv; + + /** @suppress {duplicate } */ + function _glGetTexParameteriv(target, pname, params) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getTexParameter(target, pname); + } + var _emscripten_glGetTexParameteriv = _glGetTexParameteriv; + + /** @suppress {duplicate } */ + function _glGetTransformFeedbackVarying(program, index, bufSize, length, size, type, name) { + program = GL.programs[program]; + var info = GLctx.getTransformFeedbackVarying(program, index); + if (!info) return; // If an error occurred, the return parameters length, size, type and name will be unmodified. + + if (name && bufSize > 0) { + var numBytesWrittenExclNull = stringToUTF8(info.name, name, bufSize); + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + } else { + if (length) HEAP32[((length)>>2)] = 0; + } + + if (size) HEAP32[((size)>>2)] = info.size; + if (type) HEAP32[((type)>>2)] = info.type; + } + var _emscripten_glGetTransformFeedbackVarying = _glGetTransformFeedbackVarying; + + /** @suppress {duplicate } */ + function _glGetUniformBlockIndex(program, uniformBlockName) { + return GLctx.getUniformBlockIndex(GL.programs[program], UTF8ToString(uniformBlockName)); + } + var _emscripten_glGetUniformBlockIndex = _glGetUniformBlockIndex; + + /** @suppress {duplicate } */ + function _glGetUniformIndices(program, uniformCount, uniformNames, uniformIndices) { + if (!uniformIndices) { + // GLES2 specification does not specify how to behave if uniformIndices is a null pointer. Since calling this function does not make sense + // if uniformIndices == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (uniformCount > 0 && (uniformNames == 0 || uniformIndices == 0)) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + program = GL.programs[program]; + var names = []; + for (var i = 0; i < uniformCount; i++) + names.push(UTF8ToString(HEAP32[(((uniformNames)+(i*4))>>2)])); + + var result = GLctx.getUniformIndices(program, names); + if (!result) return; // GL spec: If an error is generated, nothing is written out to uniformIndices. + + var len = result.length; + for (var i = 0; i < len; i++) { + HEAP32[(((uniformIndices)+(i*4))>>2)] = result[i]; + } + } + var _emscripten_glGetUniformIndices = _glGetUniformIndices; + + /** @suppress {checkTypes} */ + function jstoi_q(str) { + return parseInt(str); + } + + /** @noinline */ + function webglGetLeftBracePos(name) { + return name.slice(-1) == ']' && name.lastIndexOf('['); + } + + function webglPrepareUniformLocationsBeforeFirstUse(program) { + var uniformLocsById = program.uniformLocsById, // Maps GLuint -> WebGLUniformLocation + uniformSizeAndIdsByName = program.uniformSizeAndIdsByName, // Maps name -> [uniform array length, GLuint] + i, j; + + // On the first time invocation of glGetUniformLocation on this shader program: + // initialize cache data structures and discover which uniforms are arrays. + if (!uniformLocsById) { + // maps GLint integer locations to WebGLUniformLocations + program.uniformLocsById = uniformLocsById = {}; + // maps integer locations back to uniform name strings, so that we can lazily fetch uniform array locations + program.uniformArrayNamesById = {}; + + for (i = 0; i < GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); ++i) { + var u = GLctx.getActiveUniform(program, i); + var nm = u.name; + var sz = u.size; + var lb = webglGetLeftBracePos(nm); + var arrayName = lb > 0 ? nm.slice(0, lb) : nm; + + // Assign a new location. + var id = program.uniformIdCounter; + program.uniformIdCounter += sz; + // Eagerly get the location of the uniformArray[0] base element. + // The remaining indices >0 will be left for lazy evaluation to + // improve performance. Those may never be needed to fetch, if the + // application fills arrays always in full starting from the first + // element of the array. + uniformSizeAndIdsByName[arrayName] = [sz, id]; + + // Store placeholder integers in place that highlight that these + // >0 index locations are array indices pending population. + for(j = 0; j < sz; ++j) { + uniformLocsById[id] = j; + program.uniformArrayNamesById[id++] = arrayName; + } + } + } + } + + + + /** @suppress {duplicate } */ + function _glGetUniformLocation(program, name) { + + name = UTF8ToString(name); + + if (program = GL.programs[program]) { + webglPrepareUniformLocationsBeforeFirstUse(program); + var uniformLocsById = program.uniformLocsById; // Maps GLuint -> WebGLUniformLocation + var arrayIndex = 0; + var uniformBaseName = name; + + // Invariant: when populating integer IDs for uniform locations, we must maintain the precondition that + // arrays reside in contiguous addresses, i.e. for a 'vec4 colors[10];', colors[4] must be at location colors[0]+4. + // However, user might call glGetUniformLocation(program, "colors") for an array, so we cannot discover based on the user + // input arguments whether the uniform we are dealing with is an array. The only way to discover which uniforms are arrays + // is to enumerate over all the active uniforms in the program. + var leftBrace = webglGetLeftBracePos(name); + + // If user passed an array accessor "[index]", parse the array index off the accessor. + if (leftBrace > 0) { + arrayIndex = jstoi_q(name.slice(leftBrace + 1)) >>> 0; // "index]", coerce parseInt(']') with >>>0 to treat "foo[]" as "foo[0]" and foo[-1] as unsigned out-of-bounds. + uniformBaseName = name.slice(0, leftBrace); + } + + // Have we cached the location of this uniform before? + var sizeAndId = program.uniformSizeAndIdsByName[uniformBaseName]; // A pair [array length, GLint of the uniform location] + + // If an uniform with this name exists, and if its index is within the array limits (if it's even an array), + // query the WebGLlocation, or return an existing cached location. + if (sizeAndId && arrayIndex < sizeAndId[0]) { + arrayIndex += sizeAndId[1]; // Add the base location of the uniform to the array index offset. + if ((uniformLocsById[arrayIndex] = uniformLocsById[arrayIndex] || GLctx.getUniformLocation(program, name))) { + return arrayIndex; + } + } + } + else { + // N.b. we are currently unable to distinguish between GL program IDs that never existed vs GL program IDs that have been deleted, + // so report GL_INVALID_VALUE in both cases. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + } + return -1; + } + var _emscripten_glGetUniformLocation = _glGetUniformLocation; + + function webglGetUniformLocation(location) { + var p = GLctx.currentProgram; + + if (p) { + var webglLoc = p.uniformLocsById[location]; + // p.uniformLocsById[location] stores either an integer, or a WebGLUniformLocation. + + // If an integer, we have not yet bound the location, so do it now. The integer value specifies the array index + // we should bind to. + if (typeof webglLoc == 'number') { + p.uniformLocsById[location] = webglLoc = GLctx.getUniformLocation(p, p.uniformArrayNamesById[location] + (webglLoc > 0 ? '[' + webglLoc + ']' : '')); + } + // Else an already cached WebGLUniformLocation, return it. + return webglLoc; + } else { + GL.recordError(0x502/*GL_INVALID_OPERATION*/); + } + } + + + /** @suppress{checkTypes} */ + function emscriptenWebGLGetUniform(program, location, params, type) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + program = GL.programs[program]; + webglPrepareUniformLocationsBeforeFirstUse(program); + var data = GLctx.getUniform(program, webglGetUniformLocation(location)); + if (typeof data == 'number' || typeof data == 'boolean') { + switch (type) { + case 0: HEAP32[((params)>>2)] = data; break; + case 2: HEAPF32[((params)>>2)] = data; break; + } + } else { + for (var i = 0; i < data.length; i++) { + switch (type) { + case 0: HEAP32[(((params)+(i*4))>>2)] = data[i]; break; + case 2: HEAPF32[(((params)+(i*4))>>2)] = data[i]; break; + } + } + } + } + + /** @suppress {duplicate } */ + function _glGetUniformfv(program, location, params) { + emscriptenWebGLGetUniform(program, location, params, 2); + } + var _emscripten_glGetUniformfv = _glGetUniformfv; + + + /** @suppress {duplicate } */ + function _glGetUniformiv(program, location, params) { + emscriptenWebGLGetUniform(program, location, params, 0); + } + var _emscripten_glGetUniformiv = _glGetUniformiv; + + /** @suppress {duplicate } */ + function _glGetUniformuiv(program, location, params) { + emscriptenWebGLGetUniform(program, location, params, 0); + } + var _emscripten_glGetUniformuiv = _glGetUniformuiv; + + /** @suppress{checkTypes} */ + function emscriptenWebGLGetVertexAttrib(index, pname, params, type) { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var data = GLctx.getVertexAttrib(index, pname); + if (pname == 0x889F/*VERTEX_ATTRIB_ARRAY_BUFFER_BINDING*/) { + HEAP32[((params)>>2)] = data && data["name"]; + } else if (typeof data == 'number' || typeof data == 'boolean') { + switch (type) { + case 0: HEAP32[((params)>>2)] = data; break; + case 2: HEAPF32[((params)>>2)] = data; break; + case 5: HEAP32[((params)>>2)] = Math.fround(data); break; + } + } else { + for (var i = 0; i < data.length; i++) { + switch (type) { + case 0: HEAP32[(((params)+(i*4))>>2)] = data[i]; break; + case 2: HEAPF32[(((params)+(i*4))>>2)] = data[i]; break; + case 5: HEAP32[(((params)+(i*4))>>2)] = Math.fround(data[i]); break; + } + } + } + } + /** @suppress {duplicate } */ + function _glGetVertexAttribIiv(index, pname, params) { + // N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttribI4iv(), + // otherwise the results are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 0); + } + var _emscripten_glGetVertexAttribIiv = _glGetVertexAttribIiv; + + + /** @suppress {duplicate } */ + var _glGetVertexAttribIuiv = _glGetVertexAttribIiv; + var _emscripten_glGetVertexAttribIuiv = _glGetVertexAttribIuiv; + + /** @suppress {duplicate } */ + function _glGetVertexAttribPointerv(index, pname, pointer) { + if (!pointer) { + // GLES2 specification does not specify how to behave if pointer is a null pointer. Since calling this function does not make sense + // if pointer == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((pointer)>>2)] = GLctx.getVertexAttribOffset(index, pname); + } + var _emscripten_glGetVertexAttribPointerv = _glGetVertexAttribPointerv; + + + /** @suppress {duplicate } */ + function _glGetVertexAttribfv(index, pname, params) { + // N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(), + // otherwise the results are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 2); + } + var _emscripten_glGetVertexAttribfv = _glGetVertexAttribfv; + + + /** @suppress {duplicate } */ + function _glGetVertexAttribiv(index, pname, params) { + // N.B. This function may only be called if the vertex attribute was specified using the function glVertexAttrib*f(), + // otherwise the results are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 5); + } + var _emscripten_glGetVertexAttribiv = _glGetVertexAttribiv; + + /** @suppress {duplicate } */ + function _glHint(x0, x1) { GLctx.hint(x0, x1) } + var _emscripten_glHint = _glHint; + + /** @suppress {duplicate } */ + function _glInvalidateFramebuffer(target, numAttachments, attachments) { + var list = tempFixedLengthArray[numAttachments]; + for (var i = 0; i < numAttachments; i++) { + list[i] = HEAP32[(((attachments)+(i*4))>>2)]; + } + + GLctx.invalidateFramebuffer(target, list); + } + var _emscripten_glInvalidateFramebuffer = _glInvalidateFramebuffer; + + /** @suppress {duplicate } */ + function _glInvalidateSubFramebuffer(target, numAttachments, attachments, x, y, width, height) { + var list = tempFixedLengthArray[numAttachments]; + for (var i = 0; i < numAttachments; i++) { + list[i] = HEAP32[(((attachments)+(i*4))>>2)]; + } + + GLctx.invalidateSubFramebuffer(target, list, x, y, width, height); + } + var _emscripten_glInvalidateSubFramebuffer = _glInvalidateSubFramebuffer; + + /** @suppress {duplicate } */ + function _glIsBuffer(buffer) { + var b = GL.buffers[buffer]; + if (!b) return 0; + return GLctx.isBuffer(b); + } + var _emscripten_glIsBuffer = _glIsBuffer; + + /** @suppress {duplicate } */ + function _glIsEnabled(x0) { return GLctx.isEnabled(x0) } + var _emscripten_glIsEnabled = _glIsEnabled; + + /** @suppress {duplicate } */ + function _glIsFramebuffer(framebuffer) { + var fb = GL.framebuffers[framebuffer]; + if (!fb) return 0; + return GLctx.isFramebuffer(fb); + } + var _emscripten_glIsFramebuffer = _glIsFramebuffer; + + /** @suppress {duplicate } */ + function _glIsProgram(program) { + program = GL.programs[program]; + if (!program) return 0; + return GLctx.isProgram(program); + } + var _emscripten_glIsProgram = _glIsProgram; + + /** @suppress {duplicate } */ + function _glIsQuery(id) { + var query = GL.queries[id]; + if (!query) return 0; + return GLctx.isQuery(query); + } + var _emscripten_glIsQuery = _glIsQuery; + + /** @suppress {duplicate } */ + function _glIsQueryEXT(id) { + var query = GL.queries[id]; + if (!query) return 0; + return GLctx.disjointTimerQueryExt['isQueryEXT'](query); + } + var _emscripten_glIsQueryEXT = _glIsQueryEXT; + + /** @suppress {duplicate } */ + function _glIsRenderbuffer(renderbuffer) { + var rb = GL.renderbuffers[renderbuffer]; + if (!rb) return 0; + return GLctx.isRenderbuffer(rb); + } + var _emscripten_glIsRenderbuffer = _glIsRenderbuffer; + + /** @suppress {duplicate } */ + function _glIsSampler(id) { + var sampler = GL.samplers[id]; + if (!sampler) return 0; + return GLctx.isSampler(sampler); + } + var _emscripten_glIsSampler = _glIsSampler; + + /** @suppress {duplicate } */ + function _glIsShader(shader) { + var s = GL.shaders[shader]; + if (!s) return 0; + return GLctx.isShader(s); + } + var _emscripten_glIsShader = _glIsShader; + + /** @suppress {duplicate } */ + function _glIsSync(sync) { + return GLctx.isSync(GL.syncs[sync]); + } + var _emscripten_glIsSync = _glIsSync; + + /** @suppress {duplicate } */ + function _glIsTexture(id) { + var texture = GL.textures[id]; + if (!texture) return 0; + return GLctx.isTexture(texture); + } + var _emscripten_glIsTexture = _glIsTexture; + + /** @suppress {duplicate } */ + function _glIsTransformFeedback(id) { + return GLctx.isTransformFeedback(GL.transformFeedbacks[id]); + } + var _emscripten_glIsTransformFeedback = _glIsTransformFeedback; + + /** @suppress {duplicate } */ + function _glIsVertexArray(array) { + + var vao = GL.vaos[array]; + if (!vao) return 0; + return GLctx.isVertexArray(vao); + } + var _emscripten_glIsVertexArray = _glIsVertexArray; + + + /** @suppress {duplicate } */ + var _glIsVertexArrayOES = _glIsVertexArray; + var _emscripten_glIsVertexArrayOES = _glIsVertexArrayOES; + + /** @suppress {duplicate } */ + function _glLineWidth(x0) { GLctx.lineWidth(x0) } + var _emscripten_glLineWidth = _glLineWidth; + + /** @suppress {duplicate } */ + function _glLinkProgram(program) { + program = GL.programs[program]; + GLctx.linkProgram(program); + // Invalidate earlier computed uniform->ID mappings, those have now become stale + program.uniformLocsById = 0; // Mark as null-like so that glGetUniformLocation() knows to populate this again. + program.uniformSizeAndIdsByName = {}; + + } + var _emscripten_glLinkProgram = _glLinkProgram; + + /** @suppress {duplicate } */ + function _glPauseTransformFeedback() { GLctx.pauseTransformFeedback() } + var _emscripten_glPauseTransformFeedback = _glPauseTransformFeedback; + + /** @suppress {duplicate } */ + function _glPixelStorei(pname, param) { + if (pname == 0xCF5 /* GL_UNPACK_ALIGNMENT */) { + GL.unpackAlignment = param; + } + GLctx.pixelStorei(pname, param); + } + var _emscripten_glPixelStorei = _glPixelStorei; + + /** @suppress {duplicate } */ + function _glPolygonOffset(x0, x1) { GLctx.polygonOffset(x0, x1) } + var _emscripten_glPolygonOffset = _glPolygonOffset; + + /** @suppress {duplicate } */ + function _glProgramBinary(program, binaryFormat, binary, length) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + } + var _emscripten_glProgramBinary = _glProgramBinary; + + /** @suppress {duplicate } */ + function _glProgramParameteri(program, pname, value) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + } + var _emscripten_glProgramParameteri = _glProgramParameteri; + + /** @suppress {duplicate } */ + function _glQueryCounterEXT(id, target) { + GLctx.disjointTimerQueryExt['queryCounterEXT'](GL.queries[id], target); + } + var _emscripten_glQueryCounterEXT = _glQueryCounterEXT; + + /** @suppress {duplicate } */ + function _glReadBuffer(x0) { GLctx.readBuffer(x0) } + var _emscripten_glReadBuffer = _glReadBuffer; + + function computeUnpackAlignedImageSize(width, height, sizePerPixel, alignment) { + function roundedToNextMultipleOf(x, y) { + return (x + y - 1) & -y; + } + var plainRowSize = width * sizePerPixel; + var alignedRowSize = roundedToNextMultipleOf(plainRowSize, alignment); + return height * alignedRowSize; + } + + function colorChannelsInGlTextureFormat(format) { + // Micro-optimizations for size: map format to size by subtracting smallest enum value (0x1902) from all values first. + // Also omit the most common size value (1) from the list, which is assumed by formats not on the list. + var colorChannels = { + // 0x1902 /* GL_DEPTH_COMPONENT */ - 0x1902: 1, + // 0x1906 /* GL_ALPHA */ - 0x1902: 1, + 5: 3, + 6: 4, + // 0x1909 /* GL_LUMINANCE */ - 0x1902: 1, + 8: 2, + 29502: 3, + 29504: 4, + // 0x1903 /* GL_RED */ - 0x1902: 1, + 26917: 2, + 26918: 2, + // 0x8D94 /* GL_RED_INTEGER */ - 0x1902: 1, + 29846: 3, + 29847: 4 + }; + return colorChannels[format - 0x1902]||1; + } + + function heapObjectForWebGLType(type) { + // Micro-optimization for size: Subtract lowest GL enum number (0x1400/* GL_BYTE */) from type to compare + // smaller values for the heap, for shorter generated code size. + // Also the type HEAPU16 is not tested for explicitly, but any unrecognized type will return out HEAPU16. + // (since most types are HEAPU16) + type -= 0x1400; + if (type == 0) return HEAP8; + + if (type == 1) return HEAPU8; + + if (type == 2) return HEAP16; + + if (type == 4) return HEAP32; + + if (type == 6) return HEAPF32; + + if (type == 5 + || type == 28922 + || type == 28520 + || type == 30779 + || type == 30782 + ) + return HEAPU32; + + return HEAPU16; + } + + function heapAccessShiftForWebGLHeap(heap) { + return 31 - Math.clz32(heap.BYTES_PER_ELEMENT); + } + + function emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat) { + var heap = heapObjectForWebGLType(type); + var shift = heapAccessShiftForWebGLHeap(heap); + var byteSize = 1<> shift, pixels + bytes >> shift); + } + + + + /** @suppress {duplicate } */ + function _glReadPixels(x, y, width, height, format, type, pixels) { + if (true) { // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + if (GLctx.currentPixelPackBufferBinding) { + GLctx.readPixels(x, y, width, height, format, type, pixels); + } else { + var heap = heapObjectForWebGLType(type); + GLctx.readPixels(x, y, width, height, format, type, heap, pixels >> heapAccessShiftForWebGLHeap(heap)); + } + return; + } + var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, format); + if (!pixelData) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + return; + } + GLctx.readPixels(x, y, width, height, format, type, pixelData); + } + var _emscripten_glReadPixels = _glReadPixels; + + /** @suppress {duplicate } */ + function _glReleaseShaderCompiler() { + // NOP (as allowed by GLES 2.0 spec) + } + var _emscripten_glReleaseShaderCompiler = _glReleaseShaderCompiler; + + /** @suppress {duplicate } */ + function _glRenderbufferStorage(x0, x1, x2, x3) { GLctx.renderbufferStorage(x0, x1, x2, x3) } + var _emscripten_glRenderbufferStorage = _glRenderbufferStorage; + + /** @suppress {duplicate } */ + function _glRenderbufferStorageMultisample(x0, x1, x2, x3, x4) { GLctx.renderbufferStorageMultisample(x0, x1, x2, x3, x4) } + var _emscripten_glRenderbufferStorageMultisample = _glRenderbufferStorageMultisample; + + /** @suppress {duplicate } */ + function _glResumeTransformFeedback() { GLctx.resumeTransformFeedback() } + var _emscripten_glResumeTransformFeedback = _glResumeTransformFeedback; + + /** @suppress {duplicate } */ + function _glSampleCoverage(value, invert) { + GLctx.sampleCoverage(value, !!invert); + } + var _emscripten_glSampleCoverage = _glSampleCoverage; + + /** @suppress {duplicate } */ + function _glSamplerParameterf(sampler, pname, param) { + GLctx.samplerParameterf(GL.samplers[sampler], pname, param); + } + var _emscripten_glSamplerParameterf = _glSamplerParameterf; + + /** @suppress {duplicate } */ + function _glSamplerParameterfv(sampler, pname, params) { + var param = HEAPF32[((params)>>2)]; + GLctx.samplerParameterf(GL.samplers[sampler], pname, param); + } + var _emscripten_glSamplerParameterfv = _glSamplerParameterfv; + + /** @suppress {duplicate } */ + function _glSamplerParameteri(sampler, pname, param) { + GLctx.samplerParameteri(GL.samplers[sampler], pname, param); + } + var _emscripten_glSamplerParameteri = _glSamplerParameteri; + + /** @suppress {duplicate } */ + function _glSamplerParameteriv(sampler, pname, params) { + var param = HEAP32[((params)>>2)]; + GLctx.samplerParameteri(GL.samplers[sampler], pname, param); + } + var _emscripten_glSamplerParameteriv = _glSamplerParameteriv; + + /** @suppress {duplicate } */ + function _glScissor(x0, x1, x2, x3) { GLctx.scissor(x0, x1, x2, x3) } + var _emscripten_glScissor = _glScissor; + + /** @suppress {duplicate } */ + function _glShaderBinary(count, shaders, binaryformat, binary, length) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + } + var _emscripten_glShaderBinary = _glShaderBinary; + + /** @suppress {duplicate } */ + function _glShaderSource(shader, count, string, length) { + var source = GL.getSource(shader, count, string, length); + + GLctx.shaderSource(GL.shaders[shader], source); + } + var _emscripten_glShaderSource = _glShaderSource; + + /** @suppress {duplicate } */ + function _glStencilFunc(x0, x1, x2) { GLctx.stencilFunc(x0, x1, x2) } + var _emscripten_glStencilFunc = _glStencilFunc; + + /** @suppress {duplicate } */ + function _glStencilFuncSeparate(x0, x1, x2, x3) { GLctx.stencilFuncSeparate(x0, x1, x2, x3) } + var _emscripten_glStencilFuncSeparate = _glStencilFuncSeparate; + + /** @suppress {duplicate } */ + function _glStencilMask(x0) { GLctx.stencilMask(x0) } + var _emscripten_glStencilMask = _glStencilMask; + + /** @suppress {duplicate } */ + function _glStencilMaskSeparate(x0, x1) { GLctx.stencilMaskSeparate(x0, x1) } + var _emscripten_glStencilMaskSeparate = _glStencilMaskSeparate; + + /** @suppress {duplicate } */ + function _glStencilOp(x0, x1, x2) { GLctx.stencilOp(x0, x1, x2) } + var _emscripten_glStencilOp = _glStencilOp; + + /** @suppress {duplicate } */ + function _glStencilOpSeparate(x0, x1, x2, x3) { GLctx.stencilOpSeparate(x0, x1, x2, x3) } + var _emscripten_glStencilOpSeparate = _glStencilOpSeparate; + + + + + /** @suppress {duplicate } */ + function _glTexImage2D(target, level, internalFormat, width, height, border, format, type, pixels) { + if (true) { + // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + if (GLctx.currentPixelUnpackBufferBinding) { + GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixels); + } else if (pixels) { + var heap = heapObjectForWebGLType(type); + GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, heap, pixels >> heapAccessShiftForWebGLHeap(heap)); + } else { + GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, null); + } + return; + } + GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixels ? emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, internalFormat) : null); + } + var _emscripten_glTexImage2D = _glTexImage2D; + + + /** @suppress {duplicate } */ + function _glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels) { + if (GLctx.currentPixelUnpackBufferBinding) { + GLctx.texImage3D(target, level, internalFormat, width, height, depth, border, format, type, pixels); + } else if (pixels) { + var heap = heapObjectForWebGLType(type); + GLctx.texImage3D(target, level, internalFormat, width, height, depth, border, format, type, heap, pixels >> heapAccessShiftForWebGLHeap(heap)); + } else { + GLctx.texImage3D(target, level, internalFormat, width, height, depth, border, format, type, null); + } + } + var _emscripten_glTexImage3D = _glTexImage3D; + + /** @suppress {duplicate } */ + function _glTexParameterf(x0, x1, x2) { GLctx.texParameterf(x0, x1, x2) } + var _emscripten_glTexParameterf = _glTexParameterf; + + /** @suppress {duplicate } */ + function _glTexParameterfv(target, pname, params) { + var param = HEAPF32[((params)>>2)]; + GLctx.texParameterf(target, pname, param); + } + var _emscripten_glTexParameterfv = _glTexParameterfv; + + /** @suppress {duplicate } */ + function _glTexParameteri(x0, x1, x2) { GLctx.texParameteri(x0, x1, x2) } + var _emscripten_glTexParameteri = _glTexParameteri; + + /** @suppress {duplicate } */ + function _glTexParameteriv(target, pname, params) { + var param = HEAP32[((params)>>2)]; + GLctx.texParameteri(target, pname, param); + } + var _emscripten_glTexParameteriv = _glTexParameteriv; + + /** @suppress {duplicate } */ + function _glTexStorage2D(x0, x1, x2, x3, x4) { GLctx.texStorage2D(x0, x1, x2, x3, x4) } + var _emscripten_glTexStorage2D = _glTexStorage2D; + + /** @suppress {duplicate } */ + function _glTexStorage3D(x0, x1, x2, x3, x4, x5) { GLctx.texStorage3D(x0, x1, x2, x3, x4, x5) } + var _emscripten_glTexStorage3D = _glTexStorage3D; + + + + + /** @suppress {duplicate } */ + function _glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels) { + if (true) { + // WebGL 2 provides new garbage-free entry points to call to WebGL. Use those always when possible. + if (GLctx.currentPixelUnpackBufferBinding) { + GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels); + } else if (pixels) { + var heap = heapObjectForWebGLType(type); + GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, heap, pixels >> heapAccessShiftForWebGLHeap(heap)); + } else { + GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, null); + } + return; + } + var pixelData = null; + if (pixels) pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels, 0); + GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData); + } + var _emscripten_glTexSubImage2D = _glTexSubImage2D; + + + /** @suppress {duplicate } */ + function _glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels) { + if (GLctx.currentPixelUnpackBufferBinding) { + GLctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels); + } else if (pixels) { + var heap = heapObjectForWebGLType(type); + GLctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, heap, pixels >> heapAccessShiftForWebGLHeap(heap)); + } else { + GLctx.texSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, null); + } + } + var _emscripten_glTexSubImage3D = _glTexSubImage3D; + + /** @suppress {duplicate } */ + function _glTransformFeedbackVaryings(program, count, varyings, bufferMode) { + program = GL.programs[program]; + var vars = []; + for (var i = 0; i < count; i++) + vars.push(UTF8ToString(HEAP32[(((varyings)+(i*4))>>2)])); + + GLctx.transformFeedbackVaryings(program, vars, bufferMode); + } + var _emscripten_glTransformFeedbackVaryings = _glTransformFeedbackVaryings; + + + /** @suppress {duplicate } */ + function _glUniform1f(location, v0) { + GLctx.uniform1f(webglGetUniformLocation(location), v0); + } + var _emscripten_glUniform1f = _glUniform1f; + + + /** @suppress {duplicate } */ + function _glUniform1fv(location, count, value) { + + count && GLctx.uniform1fv(webglGetUniformLocation(location), HEAPF32, value>>2, count); + } + var _emscripten_glUniform1fv = _glUniform1fv; + + + /** @suppress {duplicate } */ + function _glUniform1i(location, v0) { + GLctx.uniform1i(webglGetUniformLocation(location), v0); + } + var _emscripten_glUniform1i = _glUniform1i; + + + /** @suppress {duplicate } */ + function _glUniform1iv(location, count, value) { + + count && GLctx.uniform1iv(webglGetUniformLocation(location), HEAP32, value>>2, count); + } + var _emscripten_glUniform1iv = _glUniform1iv; + + /** @suppress {duplicate } */ + function _glUniform1ui(location, v0) { + GLctx.uniform1ui(webglGetUniformLocation(location), v0); + } + var _emscripten_glUniform1ui = _glUniform1ui; + + /** @suppress {duplicate } */ + function _glUniform1uiv(location, count, value) { + count && GLctx.uniform1uiv(webglGetUniformLocation(location), HEAPU32, value>>2, count); + } + var _emscripten_glUniform1uiv = _glUniform1uiv; + + + /** @suppress {duplicate } */ + function _glUniform2f(location, v0, v1) { + GLctx.uniform2f(webglGetUniformLocation(location), v0, v1); + } + var _emscripten_glUniform2f = _glUniform2f; + + + /** @suppress {duplicate } */ + function _glUniform2fv(location, count, value) { + + count && GLctx.uniform2fv(webglGetUniformLocation(location), HEAPF32, value>>2, count*2); + } + var _emscripten_glUniform2fv = _glUniform2fv; + + + /** @suppress {duplicate } */ + function _glUniform2i(location, v0, v1) { + GLctx.uniform2i(webglGetUniformLocation(location), v0, v1); + } + var _emscripten_glUniform2i = _glUniform2i; + + + /** @suppress {duplicate } */ + function _glUniform2iv(location, count, value) { + + count && GLctx.uniform2iv(webglGetUniformLocation(location), HEAP32, value>>2, count*2); + } + var _emscripten_glUniform2iv = _glUniform2iv; + + /** @suppress {duplicate } */ + function _glUniform2ui(location, v0, v1) { + GLctx.uniform2ui(webglGetUniformLocation(location), v0, v1); + } + var _emscripten_glUniform2ui = _glUniform2ui; + + /** @suppress {duplicate } */ + function _glUniform2uiv(location, count, value) { + count && GLctx.uniform2uiv(webglGetUniformLocation(location), HEAPU32, value>>2, count*2); + } + var _emscripten_glUniform2uiv = _glUniform2uiv; + + + /** @suppress {duplicate } */ + function _glUniform3f(location, v0, v1, v2) { + GLctx.uniform3f(webglGetUniformLocation(location), v0, v1, v2); + } + var _emscripten_glUniform3f = _glUniform3f; + + + /** @suppress {duplicate } */ + function _glUniform3fv(location, count, value) { + + count && GLctx.uniform3fv(webglGetUniformLocation(location), HEAPF32, value>>2, count*3); + } + var _emscripten_glUniform3fv = _glUniform3fv; + + + /** @suppress {duplicate } */ + function _glUniform3i(location, v0, v1, v2) { + GLctx.uniform3i(webglGetUniformLocation(location), v0, v1, v2); + } + var _emscripten_glUniform3i = _glUniform3i; + + + /** @suppress {duplicate } */ + function _glUniform3iv(location, count, value) { + + count && GLctx.uniform3iv(webglGetUniformLocation(location), HEAP32, value>>2, count*3); + } + var _emscripten_glUniform3iv = _glUniform3iv; + + /** @suppress {duplicate } */ + function _glUniform3ui(location, v0, v1, v2) { + GLctx.uniform3ui(webglGetUniformLocation(location), v0, v1, v2); + } + var _emscripten_glUniform3ui = _glUniform3ui; + + /** @suppress {duplicate } */ + function _glUniform3uiv(location, count, value) { + count && GLctx.uniform3uiv(webglGetUniformLocation(location), HEAPU32, value>>2, count*3); + } + var _emscripten_glUniform3uiv = _glUniform3uiv; + + + /** @suppress {duplicate } */ + function _glUniform4f(location, v0, v1, v2, v3) { + GLctx.uniform4f(webglGetUniformLocation(location), v0, v1, v2, v3); + } + var _emscripten_glUniform4f = _glUniform4f; + + + /** @suppress {duplicate } */ + function _glUniform4fv(location, count, value) { + + count && GLctx.uniform4fv(webglGetUniformLocation(location), HEAPF32, value>>2, count*4); + } + var _emscripten_glUniform4fv = _glUniform4fv; + + + /** @suppress {duplicate } */ + function _glUniform4i(location, v0, v1, v2, v3) { + GLctx.uniform4i(webglGetUniformLocation(location), v0, v1, v2, v3); + } + var _emscripten_glUniform4i = _glUniform4i; + + + /** @suppress {duplicate } */ + function _glUniform4iv(location, count, value) { + + count && GLctx.uniform4iv(webglGetUniformLocation(location), HEAP32, value>>2, count*4); + } + var _emscripten_glUniform4iv = _glUniform4iv; + + /** @suppress {duplicate } */ + function _glUniform4ui(location, v0, v1, v2, v3) { + GLctx.uniform4ui(webglGetUniformLocation(location), v0, v1, v2, v3); + } + var _emscripten_glUniform4ui = _glUniform4ui; + + /** @suppress {duplicate } */ + function _glUniform4uiv(location, count, value) { + count && GLctx.uniform4uiv(webglGetUniformLocation(location), HEAPU32, value>>2, count*4); + } + var _emscripten_glUniform4uiv = _glUniform4uiv; + + /** @suppress {duplicate } */ + function _glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding) { + program = GL.programs[program]; + + GLctx.uniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); + } + var _emscripten_glUniformBlockBinding = _glUniformBlockBinding; + + + /** @suppress {duplicate } */ + function _glUniformMatrix2fv(location, count, transpose, value) { + + count && GLctx.uniformMatrix2fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*4); + } + var _emscripten_glUniformMatrix2fv = _glUniformMatrix2fv; + + /** @suppress {duplicate } */ + function _glUniformMatrix2x3fv(location, count, transpose, value) { + count && GLctx.uniformMatrix2x3fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*6); + } + var _emscripten_glUniformMatrix2x3fv = _glUniformMatrix2x3fv; + + /** @suppress {duplicate } */ + function _glUniformMatrix2x4fv(location, count, transpose, value) { + count && GLctx.uniformMatrix2x4fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*8); + } + var _emscripten_glUniformMatrix2x4fv = _glUniformMatrix2x4fv; + + + /** @suppress {duplicate } */ + function _glUniformMatrix3fv(location, count, transpose, value) { + + count && GLctx.uniformMatrix3fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*9); + } + var _emscripten_glUniformMatrix3fv = _glUniformMatrix3fv; + + /** @suppress {duplicate } */ + function _glUniformMatrix3x2fv(location, count, transpose, value) { + count && GLctx.uniformMatrix3x2fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*6); + } + var _emscripten_glUniformMatrix3x2fv = _glUniformMatrix3x2fv; + + /** @suppress {duplicate } */ + function _glUniformMatrix3x4fv(location, count, transpose, value) { + count && GLctx.uniformMatrix3x4fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*12); + } + var _emscripten_glUniformMatrix3x4fv = _glUniformMatrix3x4fv; + + + /** @suppress {duplicate } */ + function _glUniformMatrix4fv(location, count, transpose, value) { + + count && GLctx.uniformMatrix4fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*16); + } + var _emscripten_glUniformMatrix4fv = _glUniformMatrix4fv; + + /** @suppress {duplicate } */ + function _glUniformMatrix4x2fv(location, count, transpose, value) { + count && GLctx.uniformMatrix4x2fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*8); + } + var _emscripten_glUniformMatrix4x2fv = _glUniformMatrix4x2fv; + + /** @suppress {duplicate } */ + function _glUniformMatrix4x3fv(location, count, transpose, value) { + count && GLctx.uniformMatrix4x3fv(webglGetUniformLocation(location), !!transpose, HEAPF32, value>>2, count*12); + } + var _emscripten_glUniformMatrix4x3fv = _glUniformMatrix4x3fv; + + /** @suppress {duplicate } */ + function _glUseProgram(program) { + program = GL.programs[program]; + GLctx.useProgram(program); + // Record the currently active program so that we can access the uniform + // mapping table of that program. + GLctx.currentProgram = program; + } + var _emscripten_glUseProgram = _glUseProgram; + + /** @suppress {duplicate } */ + function _glValidateProgram(program) { + GLctx.validateProgram(GL.programs[program]); + } + var _emscripten_glValidateProgram = _glValidateProgram; + + /** @suppress {duplicate } */ + function _glVertexAttrib1f(x0, x1) { GLctx.vertexAttrib1f(x0, x1) } + var _emscripten_glVertexAttrib1f = _glVertexAttrib1f; + + /** @suppress {duplicate } */ + function _glVertexAttrib1fv(index, v) { + + GLctx.vertexAttrib1f(index, HEAPF32[v>>2]); + } + var _emscripten_glVertexAttrib1fv = _glVertexAttrib1fv; + + /** @suppress {duplicate } */ + function _glVertexAttrib2f(x0, x1, x2) { GLctx.vertexAttrib2f(x0, x1, x2) } + var _emscripten_glVertexAttrib2f = _glVertexAttrib2f; + + /** @suppress {duplicate } */ + function _glVertexAttrib2fv(index, v) { + + GLctx.vertexAttrib2f(index, HEAPF32[v>>2], HEAPF32[v+4>>2]); + } + var _emscripten_glVertexAttrib2fv = _glVertexAttrib2fv; + + /** @suppress {duplicate } */ + function _glVertexAttrib3f(x0, x1, x2, x3) { GLctx.vertexAttrib3f(x0, x1, x2, x3) } + var _emscripten_glVertexAttrib3f = _glVertexAttrib3f; + + /** @suppress {duplicate } */ + function _glVertexAttrib3fv(index, v) { + + GLctx.vertexAttrib3f(index, HEAPF32[v>>2], HEAPF32[v+4>>2], HEAPF32[v+8>>2]); + } + var _emscripten_glVertexAttrib3fv = _glVertexAttrib3fv; + + /** @suppress {duplicate } */ + function _glVertexAttrib4f(x0, x1, x2, x3, x4) { GLctx.vertexAttrib4f(x0, x1, x2, x3, x4) } + var _emscripten_glVertexAttrib4f = _glVertexAttrib4f; + + /** @suppress {duplicate } */ + function _glVertexAttrib4fv(index, v) { + + GLctx.vertexAttrib4f(index, HEAPF32[v>>2], HEAPF32[v+4>>2], HEAPF32[v+8>>2], HEAPF32[v+12>>2]); + } + var _emscripten_glVertexAttrib4fv = _glVertexAttrib4fv; + + /** @suppress {duplicate } */ + function _glVertexAttribDivisor(index, divisor) { + GLctx.vertexAttribDivisor(index, divisor); + } + var _emscripten_glVertexAttribDivisor = _glVertexAttribDivisor; + + + /** @suppress {duplicate } */ + var _glVertexAttribDivisorANGLE = _glVertexAttribDivisor; + var _emscripten_glVertexAttribDivisorANGLE = _glVertexAttribDivisorANGLE; + + + /** @suppress {duplicate } */ + var _glVertexAttribDivisorARB = _glVertexAttribDivisor; + var _emscripten_glVertexAttribDivisorARB = _glVertexAttribDivisorARB; + + + /** @suppress {duplicate } */ + var _glVertexAttribDivisorEXT = _glVertexAttribDivisor; + var _emscripten_glVertexAttribDivisorEXT = _glVertexAttribDivisorEXT; + + + /** @suppress {duplicate } */ + var _glVertexAttribDivisorNV = _glVertexAttribDivisor; + var _emscripten_glVertexAttribDivisorNV = _glVertexAttribDivisorNV; + + /** @suppress {duplicate } */ + function _glVertexAttribI4i(x0, x1, x2, x3, x4) { GLctx.vertexAttribI4i(x0, x1, x2, x3, x4) } + var _emscripten_glVertexAttribI4i = _glVertexAttribI4i; + + /** @suppress {duplicate } */ + function _glVertexAttribI4iv(index, v) { + GLctx.vertexAttribI4i(index, HEAP32[v>>2], HEAP32[v+4>>2], HEAP32[v+8>>2], HEAP32[v+12>>2]); + } + var _emscripten_glVertexAttribI4iv = _glVertexAttribI4iv; + + /** @suppress {duplicate } */ + function _glVertexAttribI4ui(x0, x1, x2, x3, x4) { GLctx.vertexAttribI4ui(x0, x1, x2, x3, x4) } + var _emscripten_glVertexAttribI4ui = _glVertexAttribI4ui; + + /** @suppress {duplicate } */ + function _glVertexAttribI4uiv(index, v) { + GLctx.vertexAttribI4ui(index, HEAPU32[v>>2], HEAPU32[v+4>>2], HEAPU32[v+8>>2], HEAPU32[v+12>>2]); + } + var _emscripten_glVertexAttribI4uiv = _glVertexAttribI4uiv; + + /** @suppress {duplicate } */ + function _glVertexAttribIPointer(index, size, type, stride, ptr) { + GLctx.vertexAttribIPointer(index, size, type, stride, ptr); + } + var _emscripten_glVertexAttribIPointer = _glVertexAttribIPointer; + + /** @suppress {duplicate } */ + function _glVertexAttribPointer(index, size, type, normalized, stride, ptr) { + GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr); + } + var _emscripten_glVertexAttribPointer = _glVertexAttribPointer; + + /** @suppress {duplicate } */ + function _glViewport(x0, x1, x2, x3) { GLctx.viewport(x0, x1, x2, x3) } + var _emscripten_glViewport = _glViewport; + + /** @suppress {duplicate } */ + function _glWaitSync(sync, flags, timeout_low, timeout_high) { + // See WebGL2 vs GLES3 difference on GL_TIMEOUT_IGNORED above (https://www.khronos.org/registry/webgl/specs/latest/2.0/#5.15) + var timeout = convertI32PairToI53(timeout_low, timeout_high); + GLctx.waitSync(GL.syncs[sync], flags, timeout); + } + var _emscripten_glWaitSync = _glWaitSync; + + function _emscripten_has_asyncify() { + return 0; + } + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + + + + + + + + + function doRequestFullscreen(target, strategy) { + if (!JSEvents.fullscreenEnabled()) return -1; + target = findEventTarget(target); + if (!target) return -4; + + if (!target.requestFullscreen + && !target.webkitRequestFullscreen + ) { + return -3; + } + + var canPerformRequests = JSEvents.canPerformEventHandlerRequests(); + + // Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so. + if (!canPerformRequests) { + if (strategy.deferUntilInEventHandler) { + JSEvents.deferCall(JSEvents_requestFullscreen, 1 /* priority over pointer lock */, [target, strategy]); + return 1; + } + return -2; + } + + return JSEvents_requestFullscreen(target, strategy); + } + + + function _emscripten_request_fullscreen_strategy(target, deferUntilInEventHandler, fullscreenStrategy) { + var strategy = { + scaleMode: HEAP32[((fullscreenStrategy)>>2)], + canvasResolutionScaleMode: HEAP32[(((fullscreenStrategy)+(4))>>2)], + filteringMode: HEAP32[(((fullscreenStrategy)+(8))>>2)], + deferUntilInEventHandler: deferUntilInEventHandler, + canvasResizedCallback: HEAP32[(((fullscreenStrategy)+(12))>>2)], + canvasResizedCallbackUserData: HEAP32[(((fullscreenStrategy)+(16))>>2)] + }; + + return doRequestFullscreen(target, strategy); + } + + + + function _emscripten_request_pointerlock(target, deferUntilInEventHandler) { + target = findEventTarget(target); + if (!target) return -4; + if (!target.requestPointerLock + ) { + return -1; + } + + var canPerformRequests = JSEvents.canPerformEventHandlerRequests(); + + // Queue this function call if we're not currently in an event handler and the user saw it appropriate to do so. + if (!canPerformRequests) { + if (deferUntilInEventHandler) { + JSEvents.deferCall(requestPointerLock, 2 /* priority below fullscreen */, [target]); + return 1; + } + return -2; + } + + return requestPointerLock(target); + } + + function getHeapMax() { + // Stay one Wasm page short of 4GB: while e.g. Chrome is able to allocate + // full 4GB Wasm memories, the size will wrap back to 0 bytes in Wasm side + // for any code that deals with heap sizes, which would require special + // casing all heap size related code to treat 0 specially. + return 2147483648; + } + + function emscripten_realloc_buffer(size) { + var b = wasmMemory.buffer; + try { + // round size grow request up to wasm page size (fixed 64KB per spec) + wasmMemory.grow((size - b.byteLength + 65535) >>> 16); // .grow() takes a delta compared to the previous size + updateMemoryViews(); + return 1 /*success*/; + } catch(e) { + err(`emscripten_realloc_buffer: Attempted to grow heap from ${b.byteLength} bytes to ${size} bytes, but got error: ${e}`); + } + // implicit 0 return to save code size (caller will cast "undefined" into 0 + // anyhow) + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + // With multithreaded builds, races can happen (another thread might increase the size + // in between), so return a failure, and let the caller retry. + assert(requestedSize > oldSize); + + // Memory resize rules: + // 1. Always increase heap size to at least the requested size, rounded up + // to next page multiple. + // 2a. If MEMORY_GROWTH_LINEAR_STEP == -1, excessively resize the heap + // geometrically: increase the heap size according to + // MEMORY_GROWTH_GEOMETRIC_STEP factor (default +20%), At most + // overreserve by MEMORY_GROWTH_GEOMETRIC_CAP bytes (default 96MB). + // 2b. If MEMORY_GROWTH_LINEAR_STEP != -1, excessively resize the heap + // linearly: increase the heap size by at least + // MEMORY_GROWTH_LINEAR_STEP bytes. + // 3. Max size for the heap is capped at 2048MB-WASM_PAGE_SIZE, or by + // MAXIMUM_MEMORY, or by ASAN limit, depending on which is smallest + // 4. If we were unable to allocate as much memory, it may be due to + // over-eager decision to excessively reserve due to (3) above. + // Hence if an allocation fails, cut down on the amount of excess + // growth, in an attempt to succeed to perform a smaller allocation. + + // A limit is set for how much we can grow. We should not exceed that + // (the wasm binary specifies it, so if we tried, we'd fail anyhow). + var maxHeapSize = getHeapMax(); + if (requestedSize > maxHeapSize) { + err(`Cannot enlarge memory, asked to go up to ${requestedSize} bytes, but the limit is ${maxHeapSize} bytes!`); + return false; + } + + var alignUp = (x, multiple) => x + (multiple - x % multiple) % multiple; + + // Loop through potential heap size increases. If we attempt a too eager + // reservation that fails, cut down on the attempted size and reserve a + // smaller bump instead. (max 3 times, chosen somewhat arbitrarily) + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); // ensure geometric growth + // but limit overreserving (default to capping at +96MB overgrowth at most) + overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296 ); + + var newSize = Math.min(maxHeapSize, alignUp(Math.max(requestedSize, overGrownHeapSize), 65536)); + + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + + return true; + } + } + err(`Failed to grow the heap from ${oldSize} bytes to ${newSize} bytes, not enough memory!`); + return false; + } + + function _emscripten_sample_gamepad_data() { + return (JSEvents.lastGamepadState = (navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : null))) + ? 0 : -1; + } + + + + + function registerBeforeUnloadEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString) { + var beforeUnloadEventHandlerFunc = function(e = event) { + // Note: This is always called on the main browser thread, since it needs synchronously return a value! + var confirmationMessage = getWasmTableEntry(callbackfunc)(eventTypeId, 0, userData); + + if (confirmationMessage) { + confirmationMessage = UTF8ToString(confirmationMessage); + } + if (confirmationMessage) { + e.preventDefault(); + e.returnValue = confirmationMessage; + return confirmationMessage; + } + }; + + var eventHandler = { + target: findEventTarget(target), + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: beforeUnloadEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_beforeunload_callback_on_thread(userData, callbackfunc, targetThread) { + if (typeof onbeforeunload == 'undefined') return -1; + // beforeunload callback can only be registered on the main browser thread, because the page will go away immediately after returning from the handler, + // and there is no time to start proxying it anywhere. + if (targetThread !== 1) return -5; + return registerBeforeUnloadEventCallback(2, userData, true, callbackfunc, 28, "beforeunload"); + } + + + + + + function registerFocusEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.focusEvent) JSEvents.focusEvent = _malloc( 256 ); + + var focusEventHandlerFunc = function(e = event) { + var nodeName = JSEvents.getNodeNameForTarget(e.target); + var id = e.target.id ? e.target.id : ''; + + var focusEvent = JSEvents.focusEvent; + stringToUTF8(nodeName, focusEvent + 0, 128); + stringToUTF8(id, focusEvent + 128, 128); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, focusEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: findEventTarget(target), + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: focusEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_blur_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerFocusEventCallback(target, userData, useCapture, callbackfunc, 12, "blur", targetThread); + } + + + + function _emscripten_set_element_css_size(target, width, height) { + target = findEventTarget(target); + if (!target) return -4; + + target.style.width = width + "px"; + target.style.height = height + "px"; + + return 0; + } + + function _emscripten_set_focus_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerFocusEventCallback(target, userData, useCapture, callbackfunc, 13, "focus", targetThread); + } + + + + + function fillFullscreenChangeEventData(eventStruct) { + var fullscreenElement = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement; + var isFullscreen = !!fullscreenElement; + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP32[((eventStruct)>>2)] = isFullscreen; + HEAP32[(((eventStruct)+(4))>>2)] = JSEvents.fullscreenEnabled(); + // If transitioning to fullscreen, report info about the element that is now fullscreen. + // If transitioning to windowed mode, report info about the element that just was fullscreen. + var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement; + var nodeName = JSEvents.getNodeNameForTarget(reportedElement); + var id = (reportedElement && reportedElement.id) ? reportedElement.id : ''; + stringToUTF8(nodeName, eventStruct + 8, 128); + stringToUTF8(id, eventStruct + 136, 128); + HEAP32[(((eventStruct)+(264))>>2)] = reportedElement ? reportedElement.clientWidth : 0; + HEAP32[(((eventStruct)+(268))>>2)] = reportedElement ? reportedElement.clientHeight : 0; + HEAP32[(((eventStruct)+(272))>>2)] = screen.width; + HEAP32[(((eventStruct)+(276))>>2)] = screen.height; + if (isFullscreen) { + JSEvents.previousFullscreenElement = fullscreenElement; + } + } + + + + function registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.fullscreenChangeEvent) JSEvents.fullscreenChangeEvent = _malloc( 280 ); + + var fullscreenChangeEventhandlerFunc = function(e = event) { + var fullscreenChangeEvent = JSEvents.fullscreenChangeEvent; + + fillFullscreenChangeEventData(fullscreenChangeEvent); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: fullscreenChangeEventhandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + + + function _emscripten_set_fullscreenchange_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + if (!JSEvents.fullscreenEnabled()) return -1; + target = findEventTarget(target); + if (!target) return -4; + + // Unprefixed Fullscreen API shipped in Chromium 71 (https://bugs.chromium.org/p/chromium/issues/detail?id=383813) + // As of Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitfullscreenchange. TODO: revisit this check once Safari ships unprefixed version. + registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "webkitfullscreenchange", targetThread); + + return registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, "fullscreenchange", targetThread); + } + + + + + + function registerGamepadEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.gamepadEvent) JSEvents.gamepadEvent = _malloc( 1432 ); + + var gamepadEventHandlerFunc = function(e = event) { + var gamepadEvent = JSEvents.gamepadEvent; + fillGamepadEventData(gamepadEvent, e["gamepad"]); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, gamepadEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: findEventTarget(target), + allowsDeferredCalls: true, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: gamepadEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_gamepadconnected_callback_on_thread(userData, useCapture, callbackfunc, targetThread) { + if (!navigator.getGamepads && !navigator.webkitGetGamepads) return -1; + return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 26, "gamepadconnected", targetThread); + } + + function _emscripten_set_gamepaddisconnected_callback_on_thread(userData, useCapture, callbackfunc, targetThread) { + if (!navigator.getGamepads && !navigator.webkitGetGamepads) return -1; + return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 27, "gamepaddisconnected", targetThread); + } + + + + + + function registerKeyEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.keyEvent) JSEvents.keyEvent = _malloc( 176 ); + + var keyEventHandlerFunc = function(e) { + assert(e); + + var keyEventData = JSEvents.keyEvent; + HEAPF64[((keyEventData)>>3)] = e.timeStamp; + + var idx = keyEventData >> 2; + + HEAP32[idx + 2] = e.location; + HEAP32[idx + 3] = e.ctrlKey; + HEAP32[idx + 4] = e.shiftKey; + HEAP32[idx + 5] = e.altKey; + HEAP32[idx + 6] = e.metaKey; + HEAP32[idx + 7] = e.repeat; + HEAP32[idx + 8] = e.charCode; + HEAP32[idx + 9] = e.keyCode; + HEAP32[idx + 10] = e.which; + stringToUTF8(e.key || '', keyEventData + 44, 32); + stringToUTF8(e.code || '', keyEventData + 76, 32); + stringToUTF8(e.char || '', keyEventData + 108, 32); + stringToUTF8(e.locale || '', keyEventData + 140, 32); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, keyEventData, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: findEventTarget(target), + allowsDeferredCalls: true, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: keyEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_keydown_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerKeyEventCallback(target, userData, useCapture, callbackfunc, 2, "keydown", targetThread); + } + + function _emscripten_set_keypress_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerKeyEventCallback(target, userData, useCapture, callbackfunc, 1, "keypress", targetThread); + } + + function _emscripten_set_keyup_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerKeyEventCallback(target, userData, useCapture, callbackfunc, 3, "keyup", targetThread); + } + + + + function _emscripten_set_main_loop(func, fps, simulateInfiniteLoop) { + var browserIterationFunc = getWasmTableEntry(func); + setMainLoop(browserIterationFunc, fps, simulateInfiniteLoop); + } + + + + + function fillMouseEventData(eventStruct, e, target) { + assert(eventStruct % 4 == 0); + HEAPF64[((eventStruct)>>3)] = e.timeStamp; + var idx = eventStruct >> 2; + HEAP32[idx + 2] = e.screenX; + HEAP32[idx + 3] = e.screenY; + HEAP32[idx + 4] = e.clientX; + HEAP32[idx + 5] = e.clientY; + HEAP32[idx + 6] = e.ctrlKey; + HEAP32[idx + 7] = e.shiftKey; + HEAP32[idx + 8] = e.altKey; + HEAP32[idx + 9] = e.metaKey; + HEAP16[idx*2 + 20] = e.button; + HEAP16[idx*2 + 21] = e.buttons; + + HEAP32[idx + 11] = e["movementX"] + ; + + HEAP32[idx + 12] = e["movementY"] + ; + + var rect = getBoundingClientRect(target); + HEAP32[idx + 13] = e.clientX - rect.left; + HEAP32[idx + 14] = e.clientY - rect.top; + + } + + + + function registerMouseEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.mouseEvent) JSEvents.mouseEvent = _malloc( 72 ); + target = findEventTarget(target); + + var mouseEventHandlerFunc = function(e = event) { + // TODO: Make this access thread safe, or this could update live while app is reading it. + fillMouseEventData(JSEvents.mouseEvent, e, target); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + allowsDeferredCalls: eventTypeString != 'mousemove' && eventTypeString != 'mouseenter' && eventTypeString != 'mouseleave', // Mouse move events do not allow fullscreen/pointer lock requests to be handled in them! + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: mouseEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_mousedown_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerMouseEventCallback(target, userData, useCapture, callbackfunc, 5, "mousedown", targetThread); + } + + function _emscripten_set_mouseenter_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerMouseEventCallback(target, userData, useCapture, callbackfunc, 33, "mouseenter", targetThread); + } + + function _emscripten_set_mouseleave_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerMouseEventCallback(target, userData, useCapture, callbackfunc, 34, "mouseleave", targetThread); + } + + function _emscripten_set_mousemove_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, "mousemove", targetThread); + } + + function _emscripten_set_mouseup_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerMouseEventCallback(target, userData, useCapture, callbackfunc, 6, "mouseup", targetThread); + } + + + + + function fillPointerlockChangeEventData(eventStruct) { + var pointerLockElement = document.pointerLockElement || document.mozPointerLockElement || document.webkitPointerLockElement || document.msPointerLockElement; + var isPointerlocked = !!pointerLockElement; + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP32[((eventStruct)>>2)] = isPointerlocked; + var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement); + var id = (pointerLockElement && pointerLockElement.id) ? pointerLockElement.id : ''; + stringToUTF8(nodeName, eventStruct + 4, 128); + stringToUTF8(id, eventStruct + 132, 128); + } + + + + function registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.pointerlockChangeEvent) JSEvents.pointerlockChangeEvent = _malloc( 260 ); + + var pointerlockChangeEventHandlerFunc = function(e = event) { + var pointerlockChangeEvent = JSEvents.pointerlockChangeEvent; + fillPointerlockChangeEventData(pointerlockChangeEvent); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: pointerlockChangeEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + + + /** @suppress {missingProperties} */ + function _emscripten_set_pointerlockchange_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + // TODO: Currently not supported in pthreads or in --proxy-to-worker mode. (In pthreads mode, document object is not defined) + if (!document || !document.body || (!document.body.requestPointerLock && !document.body.mozRequestPointerLock && !document.body.webkitRequestPointerLock && !document.body.msRequestPointerLock)) { + return -1; + } + + target = findEventTarget(target); + if (!target) return -4; + registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "mozpointerlockchange", targetThread); + registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "webkitpointerlockchange", targetThread); + registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "mspointerlockchange", targetThread); + return registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, "pointerlockchange", targetThread); + } + + + + + function registerUiEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.uiEvent) JSEvents.uiEvent = _malloc( 36 ); + + target = findEventTarget(target); + + var uiEventHandlerFunc = function(e = event) { + if (e.target != target) { + // Never take ui events such as scroll via a 'bubbled' route, but always from the direct element that + // was targeted. Otherwise e.g. if app logs a message in response to a page scroll, the Emscripten log + // message box could cause to scroll, generating a new (bubbled) scroll message, causing a new log print, + // causing a new scroll, etc.. + return; + } + var b = document.body; // Take document.body to a variable, Closure compiler does not outline access to it on its own. + if (!b) { + // During a page unload 'body' can be null, with "Cannot read property 'clientWidth' of null" being thrown + return; + } + var uiEvent = JSEvents.uiEvent; + HEAP32[((uiEvent)>>2)] = e.detail; + HEAP32[(((uiEvent)+(4))>>2)] = b.clientWidth; + HEAP32[(((uiEvent)+(8))>>2)] = b.clientHeight; + HEAP32[(((uiEvent)+(12))>>2)] = innerWidth; + HEAP32[(((uiEvent)+(16))>>2)] = innerHeight; + HEAP32[(((uiEvent)+(20))>>2)] = outerWidth; + HEAP32[(((uiEvent)+(24))>>2)] = outerHeight; + HEAP32[(((uiEvent)+(28))>>2)] = pageXOffset; + HEAP32[(((uiEvent)+(32))>>2)] = pageYOffset; + if (getWasmTableEntry(callbackfunc)(eventTypeId, uiEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: uiEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_resize_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerUiEventCallback(target, userData, useCapture, callbackfunc, 10, "resize", targetThread); + } + + + + + + function registerTouchEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.touchEvent) JSEvents.touchEvent = _malloc( 1696 ); + + target = findEventTarget(target); + + var touchEventHandlerFunc = function(e) { + assert(e); + var t, touches = {}, et = e.touches; + // To ease marshalling different kinds of touches that browser reports (all touches are listed in e.touches, + // only changed touches in e.changedTouches, and touches on target at a.targetTouches), mark a boolean in + // each Touch object so that we can later loop only once over all touches we see to marshall over to Wasm. + + for (var i = 0; i < et.length; ++i) { + t = et[i]; + // Browser might recycle the generated Touch objects between each frame (Firefox on Android), so reset any + // changed/target states we may have set from previous frame. + t.isChanged = t.onTarget = 0; + touches[t.identifier] = t; + } + // Mark which touches are part of the changedTouches list. + for (var i = 0; i < e.changedTouches.length; ++i) { + t = e.changedTouches[i]; + t.isChanged = 1; + touches[t.identifier] = t; + } + // Mark which touches are part of the targetTouches list. + for (var i = 0; i < e.targetTouches.length; ++i) { + touches[e.targetTouches[i].identifier].onTarget = 1; + } + + var touchEvent = JSEvents.touchEvent; + HEAPF64[((touchEvent)>>3)] = e.timeStamp; + var idx = touchEvent>>2; // Pre-shift the ptr to index to HEAP32 to save code size + HEAP32[idx + 3] = e.ctrlKey; + HEAP32[idx + 4] = e.shiftKey; + HEAP32[idx + 5] = e.altKey; + HEAP32[idx + 6] = e.metaKey; + idx += 7; // Advance to the start of the touch array. + var targetRect = getBoundingClientRect(target); + var numTouches = 0; + for (var i in touches) { + t = touches[i]; + HEAP32[idx + 0] = t.identifier; + HEAP32[idx + 1] = t.screenX; + HEAP32[idx + 2] = t.screenY; + HEAP32[idx + 3] = t.clientX; + HEAP32[idx + 4] = t.clientY; + HEAP32[idx + 5] = t.pageX; + HEAP32[idx + 6] = t.pageY; + HEAP32[idx + 7] = t.isChanged; + HEAP32[idx + 8] = t.onTarget; + HEAP32[idx + 9] = t.clientX - targetRect.left; + HEAP32[idx + 10] = t.clientY - targetRect.top; + + idx += 13; + + if (++numTouches > 31) { + break; + } + } + HEAP32[(((touchEvent)+(8))>>2)] = numTouches; + + if (getWasmTableEntry(callbackfunc)(eventTypeId, touchEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + allowsDeferredCalls: eventTypeString == 'touchstart' || eventTypeString == 'touchend', + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: touchEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + function _emscripten_set_touchcancel_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, "touchcancel", targetThread); + } + + function _emscripten_set_touchend_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerTouchEventCallback(target, userData, useCapture, callbackfunc, 23, "touchend", targetThread); + } + + function _emscripten_set_touchmove_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerTouchEventCallback(target, userData, useCapture, callbackfunc, 24, "touchmove", targetThread); + } + + function _emscripten_set_touchstart_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + return registerTouchEventCallback(target, userData, useCapture, callbackfunc, 22, "touchstart", targetThread); + } + + + function fillVisibilityChangeEventData(eventStruct) { + var visibilityStates = [ "hidden", "visible", "prerender", "unloaded" ]; + var visibilityState = visibilityStates.indexOf(document.visibilityState); + + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP32[((eventStruct)>>2)] = document.hidden; + HEAP32[(((eventStruct)+(4))>>2)] = visibilityState; + } + + + + function registerVisibilityChangeEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.visibilityChangeEvent) JSEvents.visibilityChangeEvent = _malloc( 8 ); + + var visibilityChangeEventHandlerFunc = function(e = event) { + var visibilityChangeEvent = JSEvents.visibilityChangeEvent; + + fillVisibilityChangeEventData(visibilityChangeEvent); + + if (getWasmTableEntry(callbackfunc)(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: visibilityChangeEventHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + + function _emscripten_set_visibilitychange_callback_on_thread(userData, useCapture, callbackfunc, targetThread) { + if (!specialHTMLTargets[1]) { + return -4; + } + return registerVisibilityChangeEventCallback(specialHTMLTargets[1], userData, useCapture, callbackfunc, 21, "visibilitychange", targetThread); + } + + + + + + + function registerWheelEventCallback(target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) { + if (!JSEvents.wheelEvent) JSEvents.wheelEvent = _malloc( 104 ); + + // The DOM Level 3 events spec event 'wheel' + var wheelHandlerFunc = function(e = event) { + var wheelEvent = JSEvents.wheelEvent; + fillMouseEventData(wheelEvent, e, target); + HEAPF64[(((wheelEvent)+(72))>>3)] = e["deltaX"]; + HEAPF64[(((wheelEvent)+(80))>>3)] = e["deltaY"]; + HEAPF64[(((wheelEvent)+(88))>>3)] = e["deltaZ"]; + HEAP32[(((wheelEvent)+(96))>>2)] = e["deltaMode"]; + if (getWasmTableEntry(callbackfunc)(eventTypeId, wheelEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: target, + allowsDeferredCalls: true, + eventTypeString: eventTypeString, + callbackfunc: callbackfunc, + handlerFunc: wheelHandlerFunc, + useCapture: useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + } + + function _emscripten_set_wheel_callback_on_thread(target, userData, useCapture, callbackfunc, targetThread) { + target = findEventTarget(target); + if (!target) return -4; + if (typeof target.onwheel != 'undefined') { + return registerWheelEventCallback(target, userData, useCapture, callbackfunc, 9, "wheel", targetThread); + } else { + return -1; + } + } + + + function _emscripten_set_window_title(title) { + setWindowTitle(UTF8ToString(title)); + } + + function _emscripten_sleep() { + throw 'Please compile your program with async support in order to use asynchronous operations like emscripten_sleep'; + } + + var ENV = {}; + + function getExecutableName() { + return thisProgram || './this.program'; + } + function getEnvStrings() { + if (!getEnvStrings.strings) { + // Default values. + // Browser language detection #8751 + var lang = ((typeof navigator == 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8'; + var env = { + 'USER': 'web_user', + 'LOGNAME': 'web_user', + 'PATH': '/', + 'PWD': '/', + 'HOME': '/home/web_user', + 'LANG': lang, + '_': getExecutableName() + }; + // Apply the user-provided values, if any. + for (var x in ENV) { + // x is a key in ENV; if ENV[x] is undefined, that means it was + // explicitly set to be so. We allow user code to do that to + // force variables with default values to remain unset. + if (ENV[x] === undefined) delete env[x]; + else env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(`${x}=${env[x]}`); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + } + + function stringToAscii(str, buffer) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === (str.charCodeAt(i) & 0xff)); + HEAP8[((buffer++)>>0)] = str.charCodeAt(i); + } + // Null-terminate the string + HEAP8[((buffer)>>0)] = 0; + } + + function _environ_get(__environ, environ_buf) { + var bufSize = 0; + getEnvStrings().forEach(function(string, i) { + var ptr = environ_buf + bufSize; + HEAPU32[(((__environ)+(i*4))>>2)] = ptr; + stringToAscii(string, ptr); + bufSize += string.length + 1; + }); + return 0; + } + + + function _environ_sizes_get(penviron_count, penviron_buf_size) { + var strings = getEnvStrings(); + HEAPU32[((penviron_count)>>2)] = strings.length; + var bufSize = 0; + strings.forEach(function(string) { + bufSize += string.length + 1; + }); + HEAPU32[((penviron_buf_size)>>2)] = bufSize; + return 0; + } + + + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ + function doReadv(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + if (typeof offset !== 'undefined') { + offset += curr; + } + } + return ret; + } + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + function convertI32PairToI53Checked(lo, hi) { + assert(lo == (lo >>> 0) || lo == (lo|0)); // lo should either be a i32 or a u32 + assert(hi === (hi|0)); // hi should be a i32 + return ((hi + 0x200000) >>> 0 < 0x400001 - !!lo) ? (lo >>> 0) + hi * 4294967296 : NaN; + } + + + + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { + try { + + var offset = convertI32PairToI53Checked(offset_low, offset_high); if (isNaN(offset)) return 61; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math.abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? (+(Math.floor((tempDouble)/4294967296.0)))>>>0 : (~~((+(Math.ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)], HEAP32[((newOffset)>>2)] = tempI64[0],HEAP32[(((newOffset)+(4))>>2)] = tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + /** @param {number=} offset */ + function doWritev(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (typeof offset !== 'undefined') { + offset += curr; + } + } + return ret; + } + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + function isLeapYear(year) { + return year%4 === 0 && (year%100 !== 0 || year%400 === 0); + } + + function arraySum(array, index) { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) { + // no-op + } + return sum; + } + + + var MONTH_DAYS_LEAP = [31,29,31,30,31,30,31,31,30,31,30,31]; + + var MONTH_DAYS_REGULAR = [31,28,31,30,31,30,31,31,30,31,30,31]; + function addDays(date, days) { + var newDate = new Date(date.getTime()); + while (days > 0) { + var leap = isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = (leap ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR)[currentMonth]; + + if (days > daysInCurrentMonth-newDate.getDate()) { + // we spill over to next month + days -= (daysInCurrentMonth-newDate.getDate()+1); + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth+1) + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear()+1); + } + } else { + // we stay in current month + newDate.setDate(newDate.getDate()+days); + return newDate; + } + } + + return newDate; + } + + + + + function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); + } + + function _strftime(s, maxsize, format, tm) { + // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); + // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html + + var tm_zone = HEAP32[(((tm)+(40))>>2)]; + + var date = { + tm_sec: HEAP32[((tm)>>2)], + tm_min: HEAP32[(((tm)+(4))>>2)], + tm_hour: HEAP32[(((tm)+(8))>>2)], + tm_mday: HEAP32[(((tm)+(12))>>2)], + tm_mon: HEAP32[(((tm)+(16))>>2)], + tm_year: HEAP32[(((tm)+(20))>>2)], + tm_wday: HEAP32[(((tm)+(24))>>2)], + tm_yday: HEAP32[(((tm)+(28))>>2)], + tm_isdst: HEAP32[(((tm)+(32))>>2)], + tm_gmtoff: HEAP32[(((tm)+(36))>>2)], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' + }; + + var pattern = UTF8ToString(format); + + // expand format + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 + '%D': '%m/%d/%y', // Equivalent to %m / %d / %y + '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d + '%h': '%b', // Equivalent to %b + '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation + '%R': '%H:%M', // Replaced by the time in 24-hour notation + '%T': '%H:%M:%S', // Replaced by the time + '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation + '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation + // Modified Conversion Specifiers + '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. + '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. + '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. + '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. + '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. + '%EY': '%Y', // Replaced by the full alternative year representation. + '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. + '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. + '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. + '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. + '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. + '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. + '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. + '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). + '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. + '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. + '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. + '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. + '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); + } + + var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + function leadingSomething(value, digits, character) { + var str = typeof value == 'number' ? value.toString() : (value || ''); + while (str.length < digits) { + str = character[0]+str; + } + return str; + } + + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : (value > 0 ? 1 : 0); + } + + var compare; + if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { + if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { + compare = sgn(date1.getDate()-date2.getDate()); + } + } + return compare; + } + + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: // Sunday + return new Date(janFourth.getFullYear()-1, 11, 29); + case 1: // Monday + return janFourth; + case 2: // Tuesday + return new Date(janFourth.getFullYear(), 0, 3); + case 3: // Wednesday + return new Date(janFourth.getFullYear(), 0, 2); + case 4: // Thursday + return new Date(janFourth.getFullYear(), 0, 1); + case 5: // Friday + return new Date(janFourth.getFullYear()-1, 11, 31); + case 6: // Saturday + return new Date(janFourth.getFullYear()-1, 11, 30); + } + } + + function getWeekBasedYear(date) { + var thisDate = addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + // this date is after the start of the first week of this year + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear()+1; + } + return thisDate.getFullYear(); + } + return thisDate.getFullYear()-1; + } + + var EXPANSION_RULES_2 = { + '%a': function(date) { + return WEEKDAYS[date.tm_wday].substring(0,3); + }, + '%A': function(date) { + return WEEKDAYS[date.tm_wday]; + }, + '%b': function(date) { + return MONTHS[date.tm_mon].substring(0,3); + }, + '%B': function(date) { + return MONTHS[date.tm_mon]; + }, + '%C': function(date) { + var year = date.tm_year+1900; + return leadingNulls((year/100)|0,2); + }, + '%d': function(date) { + return leadingNulls(date.tm_mday, 2); + }, + '%e': function(date) { + return leadingSomething(date.tm_mday, 2, ' '); + }, + '%g': function(date) { + // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. + // In this system, weeks begin on a Monday and week 1 of the year is the week that includes + // January 4th, which is also the week that includes the first Thursday of the year, and + // is also the first week that contains at least four days in the year. + // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of + // the last week of the preceding year; thus, for Saturday 2nd January 1999, + // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, + // or 31st is a Monday, it and any following days are part of week 1 of the following year. + // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. + + return getWeekBasedYear(date).toString().substring(2); + }, + '%G': function(date) { + return getWeekBasedYear(date); + }, + '%H': function(date) { + return leadingNulls(date.tm_hour, 2); + }, + '%I': function(date) { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': function(date) { + // Day of the year (001-366) + return leadingNulls(date.tm_mday + arraySum(isLeapYear(date.tm_year+1900) ? MONTH_DAYS_LEAP : MONTH_DAYS_REGULAR, date.tm_mon-1), 3); + }, + '%m': function(date) { + return leadingNulls(date.tm_mon+1, 2); + }, + '%M': function(date) { + return leadingNulls(date.tm_min, 2); + }, + '%n': function() { + return '\n'; + }, + '%p': function(date) { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } + return 'PM'; + }, + '%S': function(date) { + return leadingNulls(date.tm_sec, 2); + }, + '%t': function() { + return '\t'; + }, + '%u': function(date) { + return date.tm_wday || 7; + }, + '%U': function(date) { + var days = date.tm_yday + 7 - date.tm_wday; + return leadingNulls(Math.floor(days / 7), 2); + }, + '%V': function(date) { + // Replaced by the week number of the year (Monday as the first day of the week) + // as a decimal number [01,53]. If the week containing 1 January has four + // or more days in the new year, then it is considered week 1. + // Otherwise, it is the last week of the previous year, and the next week is week 1. + // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] + var val = Math.floor((date.tm_yday + 7 - (date.tm_wday + 6) % 7 ) / 7); + // If 1 Jan is just 1-3 days past Monday, the previous week + // is also in this year. + if ((date.tm_wday + 371 - date.tm_yday - 2) % 7 <= 2) { + val++; + } + if (!val) { + val = 52; + // If 31 December of prev year a Thursday, or Friday of a + // leap year, then the prev year has 53 weeks. + var dec31 = (date.tm_wday + 7 - date.tm_yday - 1) % 7; + if (dec31 == 4 || (dec31 == 5 && isLeapYear(date.tm_year%400-1))) { + val++; + } + } else if (val == 53) { + // If 1 January is not a Thursday, and not a Wednesday of a + // leap year, then this year has only 52 weeks. + var jan1 = (date.tm_wday + 371 - date.tm_yday) % 7; + if (jan1 != 4 && (jan1 != 3 || !isLeapYear(date.tm_year))) + val = 1; + } + return leadingNulls(val, 2); + }, + '%w': function(date) { + return date.tm_wday; + }, + '%W': function(date) { + var days = date.tm_yday + 7 - ((date.tm_wday + 6) % 7); + return leadingNulls(Math.floor(days / 7), 2); + }, + '%y': function(date) { + // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] + return (date.tm_year+1900).toString().substring(2); + }, + '%Y': function(date) { + // Replaced by the year as a decimal number (for example, 1997). [ tm_year] + return date.tm_year+1900; + }, + '%z': function(date) { + // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). + // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + // convert from minutes into hhmm format (which means 60 minutes = 100 units) + off = (off / 60)*100 + (off % 60); + return (ahead ? '+' : '-') + String("0000" + off).slice(-4); + }, + '%Z': function(date) { + return date.tm_zone; + }, + '%%': function() { + return '%'; + } + }; + + // Replace %% with a pair of NULLs (which cannot occur in a C string), then + // re-inject them after processing. + pattern = pattern.replace(/%%/g, '\0\0') + for (var rule in EXPANSION_RULES_2) { + if (pattern.includes(rule)) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); + } + } + pattern = pattern.replace(/\0\0/g, '%') + + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + + writeArrayToMemory(bytes, s); + return bytes.length-1; + } + function _strftime_l(s, maxsize, format, tm, loc) { + return _strftime(s, maxsize, format, tm); // no locale support yet + } + + + + + + + var FSNode = /** @constructor */ function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292/*292*/ | 73/*73*/; + var writeMode = 146/*146*/; + Object.defineProperties(FSNode.prototype, { + read: { + get: /** @this{FSNode} */function() { + return (this.mode & readMode) === readMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } + }, + write: { + get: /** @this{FSNode} */function() { + return (this.mode & writeMode) === writeMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } + }, + isFolder: { + get: /** @this{FSNode} */function() { + return FS.isDir(this.mode); + } + }, + isDevice: { + get: /** @this{FSNode} */function() { + return FS.isChrdev(this.mode); + } + } + }); + FS.FSNode = FSNode; + FS.createPreloadedFile = FS_createPreloadedFile; + FS.staticInit();Module["FS_createPath"] = FS.createPath;Module["FS_createDataFile"] = FS.createDataFile;Module["FS_createPreloadedFile"] = FS.createPreloadedFile;Module["FS_unlink"] = FS.unlink;Module["FS_createLazyFile"] = FS.createLazyFile;Module["FS_createDevice"] = FS.createDevice;; +ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + };; + + // exports + Module["requestFullscreen"] = function Module_requestFullscreen(lockPointer, resizeCanvas) { Browser.requestFullscreen(lockPointer, resizeCanvas) }; + Module["requestFullScreen"] = function Module_requestFullScreen() { Browser.requestFullScreen() }; + Module["requestAnimationFrame"] = function Module_requestAnimationFrame(func) { Browser.requestAnimationFrame(func) }; + Module["setCanvasSize"] = function Module_setCanvasSize(width, height, noUpdates) { Browser.setCanvasSize(width, height, noUpdates) }; + Module["pauseMainLoop"] = function Module_pauseMainLoop() { Browser.mainLoop.pause() }; + Module["resumeMainLoop"] = function Module_resumeMainLoop() { Browser.mainLoop.resume() }; + Module["getUserMedia"] = function Module_getUserMedia() { Browser.getUserMedia() }; + Module["createContext"] = function Module_createContext(canvas, useWebGL, setInModule, webGLContextAttributes) { return Browser.createContext(canvas, useWebGL, setInModule, webGLContextAttributes) }; + var preloadedImages = {}; + var preloadedAudios = {};; +var GLctx;; +for (var i = 0; i < 32; ++i) tempFixedLengthArray.push(new Array(i));; +// include: base64Utils.js +// Copied from https://github.com/strophe/strophejs/blob/e06d027/src/polyfills.js#L149 + +// This code was written by Tyler Akins and has been placed in the +// public domain. It would be nice if you left this header intact. +// Base64 code from Tyler Akins -- http://rumkin.com + +/** + * Decodes a base64 string. + * @param {string} input The string to decode. + */ +var decodeBase64 = typeof atob == 'function' ? atob : function (input) { + var keyStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + + var output = ''; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + // remove all characters that are not A-Z, a-z, 0-9, +, /, or = + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ''); + do { + enc1 = keyStr.indexOf(input.charAt(i++)); + enc2 = keyStr.indexOf(input.charAt(i++)); + enc3 = keyStr.indexOf(input.charAt(i++)); + enc4 = keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 !== 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 !== 64) { + output = output + String.fromCharCode(chr3); + } + } while (i < input.length); + return output; +}; + +// Converts a string of base64 into a byte array. +// Throws error on invalid input. +function intArrayFromBase64(s) { + if (typeof ENVIRONMENT_IS_NODE == 'boolean' && ENVIRONMENT_IS_NODE) { + var buf = Buffer.from(s, 'base64'); + return new Uint8Array(buf['buffer'], buf['byteOffset'], buf['byteLength']); + } + + try { + var decoded = decodeBase64(s); + var bytes = new Uint8Array(decoded.length); + for (var i = 0 ; i < decoded.length ; ++i) { + bytes[i] = decoded.charCodeAt(i); + } + return bytes; + } catch (_) { + throw new Error('Converting base64 string to bytes failed.'); + } +} + +// If filename is a base64 data URI, parses and returns data (Buffer on node, +// Uint8Array otherwise). If filename is not a base64 data URI, returns undefined. +function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } + + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); +} + + +// end include: base64Utils.js +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); +} +var wasmImports = { + "__cxa_throw": ___cxa_throw, + "__syscall_fcntl64": ___syscall_fcntl64, + "__syscall_ioctl": ___syscall_ioctl, + "__syscall_openat": ___syscall_openat, + "_emscripten_get_now_is_monotonic": __emscripten_get_now_is_monotonic, + "_emscripten_throw_longjmp": __emscripten_throw_longjmp, + "abort": _abort, + "eglBindAPI": _eglBindAPI, + "eglChooseConfig": _eglChooseConfig, + "eglCreateContext": _eglCreateContext, + "eglCreateWindowSurface": _eglCreateWindowSurface, + "eglDestroyContext": _eglDestroyContext, + "eglDestroySurface": _eglDestroySurface, + "eglGetConfigAttrib": _eglGetConfigAttrib, + "eglGetDisplay": _eglGetDisplay, + "eglGetError": _eglGetError, + "eglInitialize": _eglInitialize, + "eglMakeCurrent": _eglMakeCurrent, + "eglQueryString": _eglQueryString, + "eglSwapBuffers": _eglSwapBuffers, + "eglSwapInterval": _eglSwapInterval, + "eglTerminate": _eglTerminate, + "eglWaitGL": _eglWaitGL, + "eglWaitNative": _eglWaitNative, + "emscripten_asm_const_int": _emscripten_asm_const_int, + "emscripten_asm_const_int_sync_on_main_thread": _emscripten_asm_const_int_sync_on_main_thread, + "emscripten_cancel_main_loop": _emscripten_cancel_main_loop, + "emscripten_date_now": _emscripten_date_now, + "emscripten_exit_fullscreen": _emscripten_exit_fullscreen, + "emscripten_exit_pointerlock": _emscripten_exit_pointerlock, + "emscripten_get_device_pixel_ratio": _emscripten_get_device_pixel_ratio, + "emscripten_get_element_css_size": _emscripten_get_element_css_size, + "emscripten_get_gamepad_status": _emscripten_get_gamepad_status, + "emscripten_get_now": _emscripten_get_now, + "emscripten_get_num_gamepads": _emscripten_get_num_gamepads, + "emscripten_get_screen_size": _emscripten_get_screen_size, + "emscripten_glActiveTexture": _emscripten_glActiveTexture, + "emscripten_glAttachShader": _emscripten_glAttachShader, + "emscripten_glBeginQuery": _emscripten_glBeginQuery, + "emscripten_glBeginQueryEXT": _emscripten_glBeginQueryEXT, + "emscripten_glBeginTransformFeedback": _emscripten_glBeginTransformFeedback, + "emscripten_glBindAttribLocation": _emscripten_glBindAttribLocation, + "emscripten_glBindBuffer": _emscripten_glBindBuffer, + "emscripten_glBindBufferBase": _emscripten_glBindBufferBase, + "emscripten_glBindBufferRange": _emscripten_glBindBufferRange, + "emscripten_glBindFramebuffer": _emscripten_glBindFramebuffer, + "emscripten_glBindRenderbuffer": _emscripten_glBindRenderbuffer, + "emscripten_glBindSampler": _emscripten_glBindSampler, + "emscripten_glBindTexture": _emscripten_glBindTexture, + "emscripten_glBindTransformFeedback": _emscripten_glBindTransformFeedback, + "emscripten_glBindVertexArray": _emscripten_glBindVertexArray, + "emscripten_glBindVertexArrayOES": _emscripten_glBindVertexArrayOES, + "emscripten_glBlendColor": _emscripten_glBlendColor, + "emscripten_glBlendEquation": _emscripten_glBlendEquation, + "emscripten_glBlendEquationSeparate": _emscripten_glBlendEquationSeparate, + "emscripten_glBlendFunc": _emscripten_glBlendFunc, + "emscripten_glBlendFuncSeparate": _emscripten_glBlendFuncSeparate, + "emscripten_glBlitFramebuffer": _emscripten_glBlitFramebuffer, + "emscripten_glBufferData": _emscripten_glBufferData, + "emscripten_glBufferSubData": _emscripten_glBufferSubData, + "emscripten_glCheckFramebufferStatus": _emscripten_glCheckFramebufferStatus, + "emscripten_glClear": _emscripten_glClear, + "emscripten_glClearBufferfi": _emscripten_glClearBufferfi, + "emscripten_glClearBufferfv": _emscripten_glClearBufferfv, + "emscripten_glClearBufferiv": _emscripten_glClearBufferiv, + "emscripten_glClearBufferuiv": _emscripten_glClearBufferuiv, + "emscripten_glClearColor": _emscripten_glClearColor, + "emscripten_glClearDepthf": _emscripten_glClearDepthf, + "emscripten_glClearStencil": _emscripten_glClearStencil, + "emscripten_glClientWaitSync": _emscripten_glClientWaitSync, + "emscripten_glColorMask": _emscripten_glColorMask, + "emscripten_glCompileShader": _emscripten_glCompileShader, + "emscripten_glCompressedTexImage2D": _emscripten_glCompressedTexImage2D, + "emscripten_glCompressedTexImage3D": _emscripten_glCompressedTexImage3D, + "emscripten_glCompressedTexSubImage2D": _emscripten_glCompressedTexSubImage2D, + "emscripten_glCompressedTexSubImage3D": _emscripten_glCompressedTexSubImage3D, + "emscripten_glCopyBufferSubData": _emscripten_glCopyBufferSubData, + "emscripten_glCopyTexImage2D": _emscripten_glCopyTexImage2D, + "emscripten_glCopyTexSubImage2D": _emscripten_glCopyTexSubImage2D, + "emscripten_glCopyTexSubImage3D": _emscripten_glCopyTexSubImage3D, + "emscripten_glCreateProgram": _emscripten_glCreateProgram, + "emscripten_glCreateShader": _emscripten_glCreateShader, + "emscripten_glCullFace": _emscripten_glCullFace, + "emscripten_glDeleteBuffers": _emscripten_glDeleteBuffers, + "emscripten_glDeleteFramebuffers": _emscripten_glDeleteFramebuffers, + "emscripten_glDeleteProgram": _emscripten_glDeleteProgram, + "emscripten_glDeleteQueries": _emscripten_glDeleteQueries, + "emscripten_glDeleteQueriesEXT": _emscripten_glDeleteQueriesEXT, + "emscripten_glDeleteRenderbuffers": _emscripten_glDeleteRenderbuffers, + "emscripten_glDeleteSamplers": _emscripten_glDeleteSamplers, + "emscripten_glDeleteShader": _emscripten_glDeleteShader, + "emscripten_glDeleteSync": _emscripten_glDeleteSync, + "emscripten_glDeleteTextures": _emscripten_glDeleteTextures, + "emscripten_glDeleteTransformFeedbacks": _emscripten_glDeleteTransformFeedbacks, + "emscripten_glDeleteVertexArrays": _emscripten_glDeleteVertexArrays, + "emscripten_glDeleteVertexArraysOES": _emscripten_glDeleteVertexArraysOES, + "emscripten_glDepthFunc": _emscripten_glDepthFunc, + "emscripten_glDepthMask": _emscripten_glDepthMask, + "emscripten_glDepthRangef": _emscripten_glDepthRangef, + "emscripten_glDetachShader": _emscripten_glDetachShader, + "emscripten_glDisable": _emscripten_glDisable, + "emscripten_glDisableVertexAttribArray": _emscripten_glDisableVertexAttribArray, + "emscripten_glDrawArrays": _emscripten_glDrawArrays, + "emscripten_glDrawArraysInstanced": _emscripten_glDrawArraysInstanced, + "emscripten_glDrawArraysInstancedANGLE": _emscripten_glDrawArraysInstancedANGLE, + "emscripten_glDrawArraysInstancedARB": _emscripten_glDrawArraysInstancedARB, + "emscripten_glDrawArraysInstancedEXT": _emscripten_glDrawArraysInstancedEXT, + "emscripten_glDrawArraysInstancedNV": _emscripten_glDrawArraysInstancedNV, + "emscripten_glDrawBuffers": _emscripten_glDrawBuffers, + "emscripten_glDrawBuffersEXT": _emscripten_glDrawBuffersEXT, + "emscripten_glDrawBuffersWEBGL": _emscripten_glDrawBuffersWEBGL, + "emscripten_glDrawElements": _emscripten_glDrawElements, + "emscripten_glDrawElementsInstanced": _emscripten_glDrawElementsInstanced, + "emscripten_glDrawElementsInstancedANGLE": _emscripten_glDrawElementsInstancedANGLE, + "emscripten_glDrawElementsInstancedARB": _emscripten_glDrawElementsInstancedARB, + "emscripten_glDrawElementsInstancedEXT": _emscripten_glDrawElementsInstancedEXT, + "emscripten_glDrawElementsInstancedNV": _emscripten_glDrawElementsInstancedNV, + "emscripten_glDrawRangeElements": _emscripten_glDrawRangeElements, + "emscripten_glEnable": _emscripten_glEnable, + "emscripten_glEnableVertexAttribArray": _emscripten_glEnableVertexAttribArray, + "emscripten_glEndQuery": _emscripten_glEndQuery, + "emscripten_glEndQueryEXT": _emscripten_glEndQueryEXT, + "emscripten_glEndTransformFeedback": _emscripten_glEndTransformFeedback, + "emscripten_glFenceSync": _emscripten_glFenceSync, + "emscripten_glFinish": _emscripten_glFinish, + "emscripten_glFlush": _emscripten_glFlush, + "emscripten_glFramebufferRenderbuffer": _emscripten_glFramebufferRenderbuffer, + "emscripten_glFramebufferTexture2D": _emscripten_glFramebufferTexture2D, + "emscripten_glFramebufferTextureLayer": _emscripten_glFramebufferTextureLayer, + "emscripten_glFrontFace": _emscripten_glFrontFace, + "emscripten_glGenBuffers": _emscripten_glGenBuffers, + "emscripten_glGenFramebuffers": _emscripten_glGenFramebuffers, + "emscripten_glGenQueries": _emscripten_glGenQueries, + "emscripten_glGenQueriesEXT": _emscripten_glGenQueriesEXT, + "emscripten_glGenRenderbuffers": _emscripten_glGenRenderbuffers, + "emscripten_glGenSamplers": _emscripten_glGenSamplers, + "emscripten_glGenTextures": _emscripten_glGenTextures, + "emscripten_glGenTransformFeedbacks": _emscripten_glGenTransformFeedbacks, + "emscripten_glGenVertexArrays": _emscripten_glGenVertexArrays, + "emscripten_glGenVertexArraysOES": _emscripten_glGenVertexArraysOES, + "emscripten_glGenerateMipmap": _emscripten_glGenerateMipmap, + "emscripten_glGetActiveAttrib": _emscripten_glGetActiveAttrib, + "emscripten_glGetActiveUniform": _emscripten_glGetActiveUniform, + "emscripten_glGetActiveUniformBlockName": _emscripten_glGetActiveUniformBlockName, + "emscripten_glGetActiveUniformBlockiv": _emscripten_glGetActiveUniformBlockiv, + "emscripten_glGetActiveUniformsiv": _emscripten_glGetActiveUniformsiv, + "emscripten_glGetAttachedShaders": _emscripten_glGetAttachedShaders, + "emscripten_glGetAttribLocation": _emscripten_glGetAttribLocation, + "emscripten_glGetBooleanv": _emscripten_glGetBooleanv, + "emscripten_glGetBufferParameteri64v": _emscripten_glGetBufferParameteri64v, + "emscripten_glGetBufferParameteriv": _emscripten_glGetBufferParameteriv, + "emscripten_glGetError": _emscripten_glGetError, + "emscripten_glGetFloatv": _emscripten_glGetFloatv, + "emscripten_glGetFragDataLocation": _emscripten_glGetFragDataLocation, + "emscripten_glGetFramebufferAttachmentParameteriv": _emscripten_glGetFramebufferAttachmentParameteriv, + "emscripten_glGetInteger64i_v": _emscripten_glGetInteger64i_v, + "emscripten_glGetInteger64v": _emscripten_glGetInteger64v, + "emscripten_glGetIntegeri_v": _emscripten_glGetIntegeri_v, + "emscripten_glGetIntegerv": _emscripten_glGetIntegerv, + "emscripten_glGetInternalformativ": _emscripten_glGetInternalformativ, + "emscripten_glGetProgramBinary": _emscripten_glGetProgramBinary, + "emscripten_glGetProgramInfoLog": _emscripten_glGetProgramInfoLog, + "emscripten_glGetProgramiv": _emscripten_glGetProgramiv, + "emscripten_glGetQueryObjecti64vEXT": _emscripten_glGetQueryObjecti64vEXT, + "emscripten_glGetQueryObjectivEXT": _emscripten_glGetQueryObjectivEXT, + "emscripten_glGetQueryObjectui64vEXT": _emscripten_glGetQueryObjectui64vEXT, + "emscripten_glGetQueryObjectuiv": _emscripten_glGetQueryObjectuiv, + "emscripten_glGetQueryObjectuivEXT": _emscripten_glGetQueryObjectuivEXT, + "emscripten_glGetQueryiv": _emscripten_glGetQueryiv, + "emscripten_glGetQueryivEXT": _emscripten_glGetQueryivEXT, + "emscripten_glGetRenderbufferParameteriv": _emscripten_glGetRenderbufferParameteriv, + "emscripten_glGetSamplerParameterfv": _emscripten_glGetSamplerParameterfv, + "emscripten_glGetSamplerParameteriv": _emscripten_glGetSamplerParameteriv, + "emscripten_glGetShaderInfoLog": _emscripten_glGetShaderInfoLog, + "emscripten_glGetShaderPrecisionFormat": _emscripten_glGetShaderPrecisionFormat, + "emscripten_glGetShaderSource": _emscripten_glGetShaderSource, + "emscripten_glGetShaderiv": _emscripten_glGetShaderiv, + "emscripten_glGetString": _emscripten_glGetString, + "emscripten_glGetStringi": _emscripten_glGetStringi, + "emscripten_glGetSynciv": _emscripten_glGetSynciv, + "emscripten_glGetTexParameterfv": _emscripten_glGetTexParameterfv, + "emscripten_glGetTexParameteriv": _emscripten_glGetTexParameteriv, + "emscripten_glGetTransformFeedbackVarying": _emscripten_glGetTransformFeedbackVarying, + "emscripten_glGetUniformBlockIndex": _emscripten_glGetUniformBlockIndex, + "emscripten_glGetUniformIndices": _emscripten_glGetUniformIndices, + "emscripten_glGetUniformLocation": _emscripten_glGetUniformLocation, + "emscripten_glGetUniformfv": _emscripten_glGetUniformfv, + "emscripten_glGetUniformiv": _emscripten_glGetUniformiv, + "emscripten_glGetUniformuiv": _emscripten_glGetUniformuiv, + "emscripten_glGetVertexAttribIiv": _emscripten_glGetVertexAttribIiv, + "emscripten_glGetVertexAttribIuiv": _emscripten_glGetVertexAttribIuiv, + "emscripten_glGetVertexAttribPointerv": _emscripten_glGetVertexAttribPointerv, + "emscripten_glGetVertexAttribfv": _emscripten_glGetVertexAttribfv, + "emscripten_glGetVertexAttribiv": _emscripten_glGetVertexAttribiv, + "emscripten_glHint": _emscripten_glHint, + "emscripten_glInvalidateFramebuffer": _emscripten_glInvalidateFramebuffer, + "emscripten_glInvalidateSubFramebuffer": _emscripten_glInvalidateSubFramebuffer, + "emscripten_glIsBuffer": _emscripten_glIsBuffer, + "emscripten_glIsEnabled": _emscripten_glIsEnabled, + "emscripten_glIsFramebuffer": _emscripten_glIsFramebuffer, + "emscripten_glIsProgram": _emscripten_glIsProgram, + "emscripten_glIsQuery": _emscripten_glIsQuery, + "emscripten_glIsQueryEXT": _emscripten_glIsQueryEXT, + "emscripten_glIsRenderbuffer": _emscripten_glIsRenderbuffer, + "emscripten_glIsSampler": _emscripten_glIsSampler, + "emscripten_glIsShader": _emscripten_glIsShader, + "emscripten_glIsSync": _emscripten_glIsSync, + "emscripten_glIsTexture": _emscripten_glIsTexture, + "emscripten_glIsTransformFeedback": _emscripten_glIsTransformFeedback, + "emscripten_glIsVertexArray": _emscripten_glIsVertexArray, + "emscripten_glIsVertexArrayOES": _emscripten_glIsVertexArrayOES, + "emscripten_glLineWidth": _emscripten_glLineWidth, + "emscripten_glLinkProgram": _emscripten_glLinkProgram, + "emscripten_glPauseTransformFeedback": _emscripten_glPauseTransformFeedback, + "emscripten_glPixelStorei": _emscripten_glPixelStorei, + "emscripten_glPolygonOffset": _emscripten_glPolygonOffset, + "emscripten_glProgramBinary": _emscripten_glProgramBinary, + "emscripten_glProgramParameteri": _emscripten_glProgramParameteri, + "emscripten_glQueryCounterEXT": _emscripten_glQueryCounterEXT, + "emscripten_glReadBuffer": _emscripten_glReadBuffer, + "emscripten_glReadPixels": _emscripten_glReadPixels, + "emscripten_glReleaseShaderCompiler": _emscripten_glReleaseShaderCompiler, + "emscripten_glRenderbufferStorage": _emscripten_glRenderbufferStorage, + "emscripten_glRenderbufferStorageMultisample": _emscripten_glRenderbufferStorageMultisample, + "emscripten_glResumeTransformFeedback": _emscripten_glResumeTransformFeedback, + "emscripten_glSampleCoverage": _emscripten_glSampleCoverage, + "emscripten_glSamplerParameterf": _emscripten_glSamplerParameterf, + "emscripten_glSamplerParameterfv": _emscripten_glSamplerParameterfv, + "emscripten_glSamplerParameteri": _emscripten_glSamplerParameteri, + "emscripten_glSamplerParameteriv": _emscripten_glSamplerParameteriv, + "emscripten_glScissor": _emscripten_glScissor, + "emscripten_glShaderBinary": _emscripten_glShaderBinary, + "emscripten_glShaderSource": _emscripten_glShaderSource, + "emscripten_glStencilFunc": _emscripten_glStencilFunc, + "emscripten_glStencilFuncSeparate": _emscripten_glStencilFuncSeparate, + "emscripten_glStencilMask": _emscripten_glStencilMask, + "emscripten_glStencilMaskSeparate": _emscripten_glStencilMaskSeparate, + "emscripten_glStencilOp": _emscripten_glStencilOp, + "emscripten_glStencilOpSeparate": _emscripten_glStencilOpSeparate, + "emscripten_glTexImage2D": _emscripten_glTexImage2D, + "emscripten_glTexImage3D": _emscripten_glTexImage3D, + "emscripten_glTexParameterf": _emscripten_glTexParameterf, + "emscripten_glTexParameterfv": _emscripten_glTexParameterfv, + "emscripten_glTexParameteri": _emscripten_glTexParameteri, + "emscripten_glTexParameteriv": _emscripten_glTexParameteriv, + "emscripten_glTexStorage2D": _emscripten_glTexStorage2D, + "emscripten_glTexStorage3D": _emscripten_glTexStorage3D, + "emscripten_glTexSubImage2D": _emscripten_glTexSubImage2D, + "emscripten_glTexSubImage3D": _emscripten_glTexSubImage3D, + "emscripten_glTransformFeedbackVaryings": _emscripten_glTransformFeedbackVaryings, + "emscripten_glUniform1f": _emscripten_glUniform1f, + "emscripten_glUniform1fv": _emscripten_glUniform1fv, + "emscripten_glUniform1i": _emscripten_glUniform1i, + "emscripten_glUniform1iv": _emscripten_glUniform1iv, + "emscripten_glUniform1ui": _emscripten_glUniform1ui, + "emscripten_glUniform1uiv": _emscripten_glUniform1uiv, + "emscripten_glUniform2f": _emscripten_glUniform2f, + "emscripten_glUniform2fv": _emscripten_glUniform2fv, + "emscripten_glUniform2i": _emscripten_glUniform2i, + "emscripten_glUniform2iv": _emscripten_glUniform2iv, + "emscripten_glUniform2ui": _emscripten_glUniform2ui, + "emscripten_glUniform2uiv": _emscripten_glUniform2uiv, + "emscripten_glUniform3f": _emscripten_glUniform3f, + "emscripten_glUniform3fv": _emscripten_glUniform3fv, + "emscripten_glUniform3i": _emscripten_glUniform3i, + "emscripten_glUniform3iv": _emscripten_glUniform3iv, + "emscripten_glUniform3ui": _emscripten_glUniform3ui, + "emscripten_glUniform3uiv": _emscripten_glUniform3uiv, + "emscripten_glUniform4f": _emscripten_glUniform4f, + "emscripten_glUniform4fv": _emscripten_glUniform4fv, + "emscripten_glUniform4i": _emscripten_glUniform4i, + "emscripten_glUniform4iv": _emscripten_glUniform4iv, + "emscripten_glUniform4ui": _emscripten_glUniform4ui, + "emscripten_glUniform4uiv": _emscripten_glUniform4uiv, + "emscripten_glUniformBlockBinding": _emscripten_glUniformBlockBinding, + "emscripten_glUniformMatrix2fv": _emscripten_glUniformMatrix2fv, + "emscripten_glUniformMatrix2x3fv": _emscripten_glUniformMatrix2x3fv, + "emscripten_glUniformMatrix2x4fv": _emscripten_glUniformMatrix2x4fv, + "emscripten_glUniformMatrix3fv": _emscripten_glUniformMatrix3fv, + "emscripten_glUniformMatrix3x2fv": _emscripten_glUniformMatrix3x2fv, + "emscripten_glUniformMatrix3x4fv": _emscripten_glUniformMatrix3x4fv, + "emscripten_glUniformMatrix4fv": _emscripten_glUniformMatrix4fv, + "emscripten_glUniformMatrix4x2fv": _emscripten_glUniformMatrix4x2fv, + "emscripten_glUniformMatrix4x3fv": _emscripten_glUniformMatrix4x3fv, + "emscripten_glUseProgram": _emscripten_glUseProgram, + "emscripten_glValidateProgram": _emscripten_glValidateProgram, + "emscripten_glVertexAttrib1f": _emscripten_glVertexAttrib1f, + "emscripten_glVertexAttrib1fv": _emscripten_glVertexAttrib1fv, + "emscripten_glVertexAttrib2f": _emscripten_glVertexAttrib2f, + "emscripten_glVertexAttrib2fv": _emscripten_glVertexAttrib2fv, + "emscripten_glVertexAttrib3f": _emscripten_glVertexAttrib3f, + "emscripten_glVertexAttrib3fv": _emscripten_glVertexAttrib3fv, + "emscripten_glVertexAttrib4f": _emscripten_glVertexAttrib4f, + "emscripten_glVertexAttrib4fv": _emscripten_glVertexAttrib4fv, + "emscripten_glVertexAttribDivisor": _emscripten_glVertexAttribDivisor, + "emscripten_glVertexAttribDivisorANGLE": _emscripten_glVertexAttribDivisorANGLE, + "emscripten_glVertexAttribDivisorARB": _emscripten_glVertexAttribDivisorARB, + "emscripten_glVertexAttribDivisorEXT": _emscripten_glVertexAttribDivisorEXT, + "emscripten_glVertexAttribDivisorNV": _emscripten_glVertexAttribDivisorNV, + "emscripten_glVertexAttribI4i": _emscripten_glVertexAttribI4i, + "emscripten_glVertexAttribI4iv": _emscripten_glVertexAttribI4iv, + "emscripten_glVertexAttribI4ui": _emscripten_glVertexAttribI4ui, + "emscripten_glVertexAttribI4uiv": _emscripten_glVertexAttribI4uiv, + "emscripten_glVertexAttribIPointer": _emscripten_glVertexAttribIPointer, + "emscripten_glVertexAttribPointer": _emscripten_glVertexAttribPointer, + "emscripten_glViewport": _emscripten_glViewport, + "emscripten_glWaitSync": _emscripten_glWaitSync, + "emscripten_has_asyncify": _emscripten_has_asyncify, + "emscripten_memcpy_big": _emscripten_memcpy_big, + "emscripten_request_fullscreen_strategy": _emscripten_request_fullscreen_strategy, + "emscripten_request_pointerlock": _emscripten_request_pointerlock, + "emscripten_resize_heap": _emscripten_resize_heap, + "emscripten_sample_gamepad_data": _emscripten_sample_gamepad_data, + "emscripten_set_beforeunload_callback_on_thread": _emscripten_set_beforeunload_callback_on_thread, + "emscripten_set_blur_callback_on_thread": _emscripten_set_blur_callback_on_thread, + "emscripten_set_canvas_element_size": _emscripten_set_canvas_element_size, + "emscripten_set_element_css_size": _emscripten_set_element_css_size, + "emscripten_set_focus_callback_on_thread": _emscripten_set_focus_callback_on_thread, + "emscripten_set_fullscreenchange_callback_on_thread": _emscripten_set_fullscreenchange_callback_on_thread, + "emscripten_set_gamepadconnected_callback_on_thread": _emscripten_set_gamepadconnected_callback_on_thread, + "emscripten_set_gamepaddisconnected_callback_on_thread": _emscripten_set_gamepaddisconnected_callback_on_thread, + "emscripten_set_keydown_callback_on_thread": _emscripten_set_keydown_callback_on_thread, + "emscripten_set_keypress_callback_on_thread": _emscripten_set_keypress_callback_on_thread, + "emscripten_set_keyup_callback_on_thread": _emscripten_set_keyup_callback_on_thread, + "emscripten_set_main_loop": _emscripten_set_main_loop, + "emscripten_set_mousedown_callback_on_thread": _emscripten_set_mousedown_callback_on_thread, + "emscripten_set_mouseenter_callback_on_thread": _emscripten_set_mouseenter_callback_on_thread, + "emscripten_set_mouseleave_callback_on_thread": _emscripten_set_mouseleave_callback_on_thread, + "emscripten_set_mousemove_callback_on_thread": _emscripten_set_mousemove_callback_on_thread, + "emscripten_set_mouseup_callback_on_thread": _emscripten_set_mouseup_callback_on_thread, + "emscripten_set_pointerlockchange_callback_on_thread": _emscripten_set_pointerlockchange_callback_on_thread, + "emscripten_set_resize_callback_on_thread": _emscripten_set_resize_callback_on_thread, + "emscripten_set_touchcancel_callback_on_thread": _emscripten_set_touchcancel_callback_on_thread, + "emscripten_set_touchend_callback_on_thread": _emscripten_set_touchend_callback_on_thread, + "emscripten_set_touchmove_callback_on_thread": _emscripten_set_touchmove_callback_on_thread, + "emscripten_set_touchstart_callback_on_thread": _emscripten_set_touchstart_callback_on_thread, + "emscripten_set_visibilitychange_callback_on_thread": _emscripten_set_visibilitychange_callback_on_thread, + "emscripten_set_wheel_callback_on_thread": _emscripten_set_wheel_callback_on_thread, + "emscripten_set_window_title": _emscripten_set_window_title, + "emscripten_sleep": _emscripten_sleep, + "environ_get": _environ_get, + "environ_sizes_get": _environ_sizes_get, + "exit": _exit, + "fd_close": _fd_close, + "fd_read": _fd_read, + "fd_seek": _fd_seek, + "fd_write": _fd_write, + "glAttachShader": _glAttachShader, + "glBindBuffer": _glBindBuffer, + "glBindTexture": _glBindTexture, + "glBindVertexArrayOES": _glBindVertexArrayOES, + "glBlendFunc": _glBlendFunc, + "glBufferData": _glBufferData, + "glClear": _glClear, + "glClearColor": _glClearColor, + "glCompileShader": _glCompileShader, + "glCreateProgram": _glCreateProgram, + "glCreateShader": _glCreateShader, + "glDeleteProgram": _glDeleteProgram, + "glDeleteShader": _glDeleteShader, + "glDeleteTextures": _glDeleteTextures, + "glDrawArrays": _glDrawArrays, + "glEnable": _glEnable, + "glEnableVertexAttribArray": _glEnableVertexAttribArray, + "glGenBuffers": _glGenBuffers, + "glGenTextures": _glGenTextures, + "glGenVertexArraysOES": _glGenVertexArraysOES, + "glGetShaderInfoLog": _glGetShaderInfoLog, + "glLinkProgram": _glLinkProgram, + "glReadPixels": _glReadPixels, + "glShaderSource": _glShaderSource, + "glTexImage2D": _glTexImage2D, + "glTexParameteri": _glTexParameteri, + "glUseProgram": _glUseProgram, + "glVertexAttribPointer": _glVertexAttribPointer, + "glViewport": _glViewport, + "invoke_ii": invoke_ii, + "invoke_iii": invoke_iii, + "invoke_iiii": invoke_iiii, + "invoke_iiiii": invoke_iiiii, + "invoke_vi": invoke_vi, + "invoke_vii": invoke_vii, + "invoke_viii": invoke_viii, + "invoke_viiii": invoke_viiii, + "strftime_l": _strftime_l +}; +var asm = createWasm(); +/** @type {function(...*):?} */ +var ___wasm_call_ctors = createExportWrapper("__wasm_call_ctors"); +/** @type {function(...*):?} */ +var _olc_OnPageUnload = Module["_olc_OnPageUnload"] = createExportWrapper("olc_OnPageUnload"); +/** @type {function(...*):?} */ +var _olc_PGE_UpdateWindowSize = Module["_olc_PGE_UpdateWindowSize"] = createExportWrapper("olc_PGE_UpdateWindowSize"); +/** @type {function(...*):?} */ +var _malloc = createExportWrapper("malloc"); +/** @type {function(...*):?} */ +var _free = createExportWrapper("free"); +/** @type {function(...*):?} */ +var _main = Module["_main"] = createExportWrapper("main"); +/** @type {function(...*):?} */ +var ___errno_location = createExportWrapper("__errno_location"); +/** @type {function(...*):?} */ +var _fflush = Module["_fflush"] = createExportWrapper("fflush"); +/** @type {function(...*):?} */ +var _setThrew = createExportWrapper("setThrew"); +/** @type {function(...*):?} */ +var _emscripten_stack_init = function() { + return (_emscripten_stack_init = Module["asm"]["emscripten_stack_init"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_free = function() { + return (_emscripten_stack_get_free = Module["asm"]["emscripten_stack_get_free"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_base = function() { + return (_emscripten_stack_get_base = Module["asm"]["emscripten_stack_get_base"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var _emscripten_stack_get_end = function() { + return (_emscripten_stack_get_end = Module["asm"]["emscripten_stack_get_end"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var stackSave = createExportWrapper("stackSave"); +/** @type {function(...*):?} */ +var stackRestore = createExportWrapper("stackRestore"); +/** @type {function(...*):?} */ +var stackAlloc = createExportWrapper("stackAlloc"); +/** @type {function(...*):?} */ +var _emscripten_stack_get_current = function() { + return (_emscripten_stack_get_current = Module["asm"]["emscripten_stack_get_current"]).apply(null, arguments); +}; + +/** @type {function(...*):?} */ +var ___cxa_is_pointer_type = createExportWrapper("__cxa_is_pointer_type"); +/** @type {function(...*):?} */ +var dynCall_viijii = Module["dynCall_viijii"] = createExportWrapper("dynCall_viijii"); +/** @type {function(...*):?} */ +var dynCall_iiji = Module["dynCall_iiji"] = createExportWrapper("dynCall_iiji"); +/** @type {function(...*):?} */ +var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji"); +/** @type {function(...*):?} */ +var dynCall_ji = Module["dynCall_ji"] = createExportWrapper("dynCall_ji"); +/** @type {function(...*):?} */ +var dynCall_iiiiij = Module["dynCall_iiiiij"] = createExportWrapper("dynCall_iiiiij"); +/** @type {function(...*):?} */ +var dynCall_iiiiijj = Module["dynCall_iiiiijj"] = createExportWrapper("dynCall_iiiiijj"); +/** @type {function(...*):?} */ +var dynCall_iiiiiijj = Module["dynCall_iiiiiijj"] = createExportWrapper("dynCall_iiiiiijj"); + +function invoke_vi(index,a1) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_ii(index,a1) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iiii(index,a1,a2,a3) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viii(index,a1,a2,a3) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_iii(index,a1,a2) { + var sp = stackSave(); + try { + return getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_vii(index,a1,a2) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + +function invoke_viiii(index,a1,a2,a3,a4) { + var sp = stackSave(); + try { + getWasmTableEntry(index)(a1,a2,a3,a4); + } catch(e) { + stackRestore(sp); + if (e !== e+0) throw e; + _setThrew(1, 0); + } +} + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +Module["addRunDependency"] = addRunDependency; +Module["removeRunDependency"] = removeRunDependency; +Module["FS_createPath"] = FS.createPath; +Module["FS_createDataFile"] = FS.createDataFile; +Module["FS_createLazyFile"] = FS.createLazyFile; +Module["FS_createDevice"] = FS.createDevice; +Module["FS_unlink"] = FS.unlink; +Module["FS_createPreloadedFile"] = FS.createPreloadedFile; +var missingLibrarySymbols = [ + 'ydayFromDate', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'getHostByName', + 'traverseStack', + 'getCallstack', + 'emscriptenLog', + 'convertPCtoSourceLocation', + 'jstoi_s', + 'getDynCaller', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'asmjsMangle', + 'HandleAllocator', + 'getNativeTypeSize', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'convertU32PairToI53', + 'getCFunc', + 'ccall', + 'cwrap', + 'uleb128Encode', + 'sigToWasmTypes', + 'generateFuncType', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'reallyNegative', + 'unSign', + 'strLen', + 'reSign', + 'formatString', + 'intArrayToString', + 'AsciiToString', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'softFullscreenResizeWebGLRenderTarget', + 'registerPointerlockErrorEventCallback', + 'fillBatteryEventData', + 'battery', + 'registerBatteryEventCallback', + 'jsStackTrace', + 'stackTrace', + 'checkWasiClock', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'createDyncallWrapper', + 'setImmediateWrapped', + 'clearImmediateWrapped', + 'polyfillSetImmediate', + 'getPromise', + 'makePromise', + 'idsToPromises', + 'makePromiseCallback', + 'getSocketFromFD', + 'getSocketAddress', + '_setNetworkCallback', + 'writeGLArray', + 'registerWebGlEventCallback', + 'runAndAbortIfError', + 'GLFW_Window', + 'ALLOC_NORMAL', + 'ALLOC_STACK', + 'allocate', + 'writeStringToMemory', + 'writeAsciiToMemory', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + +var unexportedSymbols = [ + 'run', + 'addOnPreRun', + 'addOnInit', + 'addOnPreMain', + 'addOnExit', + 'addOnPostRun', + 'FS_createFolder', + 'FS_createLink', + 'out', + 'err', + 'callMain', + 'abort', + 'keepRuntimeAlive', + 'wasmMemory', + 'stackAlloc', + 'stackSave', + 'stackRestore', + 'getTempRet0', + 'setTempRet0', + 'writeStackCookie', + 'checkStackCookie', + 'ptrToString', + 'zeroMemory', + 'exitJS', + 'getHeapMax', + 'emscripten_realloc_buffer', + 'ENV', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'isLeapYear', + 'arraySum', + 'addDays', + 'ERRNO_CODES', + 'ERRNO_MESSAGES', + 'setErrNo', + 'DNS', + 'Protocols', + 'Sockets', + 'initRandomFill', + 'randomFill', + 'timers', + 'warnOnce', + 'UNWIND_CACHE', + 'readEmAsmArgsArray', + 'readEmAsmArgs', + 'runEmAsmFunction', + 'runMainThreadEmAsm', + 'jstoi_q', + 'getExecutableName', + 'listenOnce', + 'autoResumeAudioContext', + 'dynCallLegacy', + 'dynCall', + 'handleException', + 'callUserCallback', + 'maybeExit', + 'safeSetTimeout', + 'asyncLoad', + 'alignMemory', + 'mmapAlloc', + 'writeI53ToI64', + 'readI53FromI64', + 'readI53FromU64', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'getValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'intArrayFromString', + 'stringToAscii', + 'UTF16Decoder', + 'stringToNewUTF8', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'JSEvents', + 'registerKeyEventCallback', + 'specialHTMLTargets', + 'maybeCStringToJsString', + 'findEventTarget', + 'findCanvasEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerWheelEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'setLetterbox', + 'currentFullscreenStrategy', + 'restoreOldWindowedStyle', + 'doRequestFullscreen', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'requestPointerLock', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'registerBeforeUnloadEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'demangle', + 'demangleAll', + 'ExitStatus', + 'getEnvStrings', + 'doReadv', + 'doWritev', + 'dlopenMissingError', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionLast', + 'exceptionCaught', + 'ExceptionInfo', + 'Browser', + 'setMainLoop', + 'wget', + 'SYSCALLS', + 'preloadPlugins', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'heapObjectForWebGLType', + 'heapAccessShiftForWebGLHeap', + 'webgl_enable_WEBGL_multi_draw', + 'GL', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + '__glGenObject', + 'emscriptenWebGLGetUniform', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'emscripten_webgl_power_preferences', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'GLFW', + 'emscriptenWebGLGetIndexed', + 'webgl_enable_WEBGL_draw_instanced_base_vertex_base_instance', + 'webgl_enable_WEBGL_multi_draw_instanced_base_vertex_base_instance', + 'allocateUTF8', + 'allocateUTF8OnStack', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + + +var calledRun; + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain() { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = _main; + + var argc = 0; + var argv = 0; + + try { + + var ret = entryFunction(argc, argv); + + // if we're not running an evented main loop, it's time to exit + exitJS(ret, /* implicit = */ true); + return ret; + } + catch (e) { + return handleException(e); + } +} + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +function run() { + + if (runDependencies > 0) { + return; + } + + stackCheckInit(); + + preRun(); + + // a preRun added a dependency, run will be called later + if (runDependencies > 0) { + return; + } + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + _fflush(0); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty && tty.output && tty.output.length) { + has = true; + } + }); + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + +run(); + + +// end include: postamble.js diff --git a/olcCodeJam2023Entry/pge.wasm b/olcCodeJam2023Entry/pge.wasm new file mode 100644 index 0000000..e5f0c72 Binary files /dev/null and b/olcCodeJam2023Entry/pge.wasm differ diff --git a/olcCodeJam2023Entry/pge.wasm.map b/olcCodeJam2023Entry/pge.wasm.map new file mode 100644 index 0000000..0b9a40e --- /dev/null +++ b/olcCodeJam2023Entry/pge.wasm.map @@ -0,0 +1 @@ +{"version":3,"sources":["olcPixelGameEngine.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/unique_ptr.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/map","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__tree","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/max.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/max.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/min.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/vector","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/compressed_pair.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__debug","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/math.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/pointer_traits.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__ios/fpos.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__ios/fpos.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/streambuf","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/streambuf","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/pointer_traits.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/ios","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/ios","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/istream","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/istream","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/fstream","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/fstream","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/string","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/string","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/wrap_iter.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__iterator/wrap_iter.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/tuple","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/compressed_pair.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__debug","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/allocator_traits.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/allocator_traits.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__functional/function.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__chrono/time_point.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/sstream","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/list","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__chrono/duration.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__string/char_traits.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__string/char_traits.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/sstream","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__utility/transaction.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/initializer_list","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/array","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/ostream","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/atomic","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/reverse_iterator.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__chrono/time_point.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/prev.h","olcSoundWaveEngine.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/advance.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/clamp.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/next.h","main.cpp","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/comp.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/comp.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/allocator.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__split_buffer","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/allocate_at_least.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/uninitialized_algorithms.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__utility/swap.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/construct_at.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/voidify.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/limits","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/limits","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/min.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/stdexcept","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/stdexcept","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/new","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/new","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/move.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/unwrap_iter.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__utility/pair.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/allocator.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/allocate_at_least.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__utility/swap.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/unwrap_iter.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/move.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__utility/pair.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__chrono/duration.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/type_traits","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/type_traits","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/copy.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__algorithm/unwrap_range.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/distance.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__iterator/distance.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__functional/operations.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/string_view","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/string_view","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/exception","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/exception","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/ostream","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__iterator/ostreambuf_iterator.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__iterator/ostreambuf_iterator.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/locale","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/locale","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__locale","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__locale","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__memory/shared_ptr.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/png.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngerror.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngget.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngmem.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngread.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngrio.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngrtran.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngrutil.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngset.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/libpng/libpng-1.6.39/pngtrans.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/zlib/zlib-1.2.13/adler32.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/zlib/zlib-1.2.13/crc32.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/zlib/zlib-1.2.13/inffast.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/zlib/zlib-1.2.13/inflate.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/zlib/zlib-1.2.13/inftrees.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/zlib/zlib-1.2.13/zutil.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2_mixer/SDL_mixer-release-2.0.4/effect_position.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2_mixer/SDL_mixer-release-2.0.4/effects_internal.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2_mixer/SDL_mixer-release-2.0.4/mixer.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2_mixer/SDL_mixer-release-2.0.4/music.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2_mixer/SDL_mixer-release-2.0.4/music_ogg.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2_mixer/SDL_mixer-release-2.0.4/music_wav.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/psy.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/scales.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/mdct.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/envelope.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/bitrate.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/sharedbook.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/smallft.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/codebook.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/lsp.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/floor0.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/floor1.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/res0.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/mapping0.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/block.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/info.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/synthesis.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/vorbisfile.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/os.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/vorbis/Vorbis-version_1/lib/window.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL.c","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/SDL2/SDL_bits.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/atomic/SDL_atomic.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/SDL_audio.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/SDL_audiocvt.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/SDL_audio_channel_converters.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/SDL_audiotypecvt.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_dataqueue.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/disk/SDL_diskaudio.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/dummy/SDL_dummyaudio.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/emscripten/SDL_emscriptenaudio.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_error.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_events.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/joystick/SDL_gamecontroller.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_gesture.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/stdlib/SDL_getenv.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_hints.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_guid.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/joystick/SDL_joystick.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_keyboard.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_log.c","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/SDL2/SDL_stdinc.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/stdlib/SDL_malloc.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/audio/SDL_mixer.c","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/SDL2/SDL_endian.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_mouse.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_quit.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_rect_impl.h","../../../../Documents/emsdk/upstream/emscripten/cache/sysroot/include/SDL2/SDL_rect.h","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/file/SDL_rwops.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/sensor/dummy/SDL_dummysensor.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/sensor/SDL_sensor.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/atomic/SDL_spinlock.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/stdlib/SDL_stdlib.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/stdlib/SDL_string.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_list.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/cpuinfo/SDL_cpuinfo.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_fillrect.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_RLEaccel.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_copy.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_slow.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_0.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_1.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_A.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_N.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit_auto.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_blit.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_pixels.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_surface.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/joystick/emscripten/SDL_sysjoystick.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/thread/generic/SDL_sysmutex.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/thread/generic/SDL_syssem.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/thread/generic/SDL_systhread.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/timer/unix/SDL_systimer.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/thread/generic/SDL_systls.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/thread/SDL_thread.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/timer/SDL_timer.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_touch.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/SDL_utils.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/loadso/dlopen/SDL_sysloadso.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_egl.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/emscripten/SDL_emscriptenopengles.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/emscripten/SDL_emscriptenframebuffer.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/emscripten/SDL_emscriptenmouse.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/emscripten/SDL_emscriptenevents.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/emscripten/SDL_emscriptenvideo.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_displayevents.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/stdlib/SDL_qsort.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/video/SDL_video.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/events/SDL_windowevents.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/sdl2/SDL-release-2.24.2/src/joystick/controller_type.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/ogg/Ogg-version_1/src/bitwise.c","../../../../Documents/emsdk/upstream/emscripten/cache/ports/ogg/Ogg-version_1/src/framing.c","../../../../../../emsdk/emscripten/system/lib/gl/gl.c","../../../../../../emsdk/emscripten/system/lib/gl/libprocaddr.c","../../../../../../emsdk/emscripten/system/lib/gl/webgl1.c","../../../../../../emsdk/emscripten/system/lib/gl/webgl2.c","../../../../../../emsdk/emscripten/system/lib/html5/dom_pk_codes.c","../../../../../../emsdk/emscripten/system/lib/libc/atexit_dummy.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/errno/__errno_location.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/abs.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/atan.c","../../../../../../emsdk/emscripten/cache/sysroot/include/math.h","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/atan2.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/atof.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/atoi.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__cos.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__rem_pio2_large.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__rem_pio2.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__sin.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/cos.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ldso/dlclose.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ldso/dlerror.c","../../../../../../emsdk/emscripten/system/lib/libc/emscripten_memcpy.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/memmove.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/memset.c","../../../../../../emsdk/emscripten/system/lib/libc/emscripten_time.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__math_xflow.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/libm.h","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__math_uflow.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__math_oflow.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/exp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/fabs.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__lockfile.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fclose.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/ferror.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fflush.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/floor.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__fmodeflags.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__stdio_seek.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__stdio_write.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__stdio_read.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__stdio_close.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__fdopen.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fopen.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fprintf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__towrite.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__overflow.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fputc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/putc.h","../../../../../../emsdk/emscripten/cache/sysroot/include/atomic_arch.h","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/pthread_impl.h","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__toread.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fread.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/frexp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fseek.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/ftell.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/fwrite.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/env/__environ.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/env/getenv.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/isdigit.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/isspace.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/isupper.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/isxdigit.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/ldexp.c","../../../../../../emsdk/emscripten/system/lib/pthread/library_pthread_stub.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__math_divzero.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__math_invalid.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/log.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/unistd/lseek.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/memchr.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/memcmp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/time/clock_nanosleep.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/time/nanosleep.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/ofl.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/ofl_add.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/pow.c","../../../../../../emsdk/emscripten/system/lib/libc/emscripten_syscall_stubs.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/unistd/getpid.c","../../../../../../emsdk/emscripten/system/lib/pthread/pthread_self_stub.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/qsort.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/atomic.h","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/qsort_nr.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/prng/rand.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/scalbn.c","../../../../../../emsdk/emscripten/system/lib/libc/sigaction.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/signal/signal.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/sin.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strcasecmp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strchr.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strchrnul.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strcmp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/stpcpy.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strcpy.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strlcat.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strlcpy.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strlen.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strncasecmp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strncmp.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strnlen.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/strstr.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/__uflow.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/shgetc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/copysignl.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/scalbnl.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/__fpclassifyl.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/fmodl.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/math/fabsl.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/floatscan.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/strtod.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdlib/strtol.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/syscall_ret.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/tolower.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/vfprintf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/vsnprintf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/internal/intscan.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/mbrtowc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/mbsinit.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/vfscanf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/vsscanf.c","../../../../../../emsdk/emscripten/system/lib/libc/wasi-helpers.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/string/wcslen.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/wcrtomb.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/wctomb.c","../../../../../../emsdk/emscripten/system/lib/libc/emscripten_get_heap_size.c","../../../../../../emsdk/emscripten/system/lib/libc/sbrk.c","../../../../../../emsdk/emscripten/system/lib/dlmalloc.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/addtf3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_add_impl.inc","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_lib.h","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/ashlti3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/comparetf2.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_compare_impl.inc","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/divtf3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_div_impl.inc","../../../../../../emsdk/emscripten/system/lib/compiler-rt/emscripten_exception_builtins.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/emscripten_setjmp.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/extenddftf2.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_extend.h","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_extend_impl.inc","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/extendsftf2.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/floatsitf.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/floatunsitf.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_mode.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/lshrti3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/multf3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_mul_impl.inc","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/multi3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/subtf3.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/trunctfdf2.c","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_trunc_impl.inc","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/fp_trunc.h","../../../../../../emsdk/emscripten/system/lib/compiler-rt/lib/builtins/trunctfsf2.c","../../../../../../emsdk/emscripten/system/lib/libcxx/src/chrono.cpp","../../../../../../emsdk/emscripten/system/lib/libcxx/src/functional.cpp","../../../../../../emsdk/emscripten/system/lib/libcxx/src/support/runtime/exception_libcxxabi.ipp","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/copy_n.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__iterator/istreambuf_iterator.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/unique_ptr.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/typeinfo","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/copy.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/unwrap_range.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/ios.cpp","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/stdout.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/ungetc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/getc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/getc.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/iostream_init.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/iostream.cpp","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__std_stream","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/locale/locale_map.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/locale/newlocale.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/sscanf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/snprintf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/stdio/vasprintf.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/locale/freelocale.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/__ctype_toupper_loc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/__ctype_tolower_loc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/wcsnrtombs.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/mbsrtowcs.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/mbsnrtowcs.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/mbtowc.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/ctype/__ctype_get_mb_cur_max.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/multibyte/mbrlen.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/locale/uselocale.c","../../../../../../emsdk/emscripten/system/lib/libc/musl/src/locale/strtod_l.c","../../../../../../emsdk/emscripten/system/lib/libcxx/src/locale.cpp","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__bsd_locale_fallbacks.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/find.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/reverse.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__iterator/access.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/equal.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/vector","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/shared_ptr.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__utility/transaction.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/mutex","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/tuple","../../../../../../emsdk/emscripten/system/lib/libcxx/src/include/atomic_support.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/iterator_operations.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/iter_swap.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/include/sso_allocator.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/construct_at.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__split_buffer","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__iterator/reverse_iterator.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__memory/uninitialized_algorithms.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__functional/invoke.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__support/musl/xlocale.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/memory.cpp","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__threading_support","../../../../../../emsdk/emscripten/system/lib/libcxx/src/mutex.cpp","../../../../../../emsdk/emscripten/system/lib/libcxx/src/new.cpp","../../../../../../emsdk/emscripten/system/lib/libcxx/src/include/refstring.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/support/runtime/stdexcept_default.ipp","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__algorithm/fill_n.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/string.cpp","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/charconv","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__type_traits/make_unsigned.h","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__bits","../../../../../../emsdk/emscripten/cache/sysroot/include/c++/v1/__charconv/to_chars_base_10.h","../../../../../../emsdk/emscripten/system/lib/libcxx/src/system_error.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/abort_message.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/cxa_handlers.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/cxa_noexception.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/cxa_virtual.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/private_typeinfo.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/stdlib_exception.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/stdlib_stdexcept.cpp","../../../../../../emsdk/emscripten/system/lib/libcxxabi/src/stdlib_typeinfo.cpp"],"names":[],"mappings":"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gBACA,aADA,WACA,GAG4D,KAAP,GAEO,KAAP,GAGO,KAAP,GAEO,KAAP,EAGrD,OAAsD,KAAP,EAE/C,OAAsD,KAAP,GAGQ,UAAP,GAEO,UAAP,EnX/wHhD,YAAsC,eAEpB,SAAZ,GACA,KACF,Yc9cO,KAAP,GqW4tIoD,UAAP,GAEO,UAAP,GGziJ/C,OACF,GHs0JI,cACO,KAAP,EAD6B,GAA7B,wBACA,IA/CA,kCACU,gBACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,QACV,kCAwCA,cACO,KAAP,EAD8B,GAA9B,wBACA,IAjCA,kCACU,gBACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,QACV,kCnXz9HuD,OAAP,GmXqjIhD,cACO,KAAP,EAD8B,GAA9B,wBACA,IAnEA,kCACW,gBACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YAXA,IAYA,QACA,YACA,YACA,YACA,YACA,YACA,YACA,QACX,kCAkDA,cACO,KAAP,EAD+B,GAA/B,wBACA,IA3CA,kCACW,gBACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YAXA,IAYA,QACA,YACA,YACA,YACA,YACA,YACA,YACA,QACX,kCAgDA,cACO,KAAP,EAD6B,GAA7B,wBACA,GAvBA,kCACU,gBACA,QACV,kCA4BA,cACO,KAAP,EAD8B,GAA9B,wBACA,GArBA,kCACU,gBACA,QACV,kCA0BA,WAAc,YAAd,uBACA,kBAQA,WAAe,YAAf,uBACA,kBAQA,WAAc,YAAd,uBACA,kBAQA,WAAe,YAAf,uBACA,kBAQA,WAAc,YAAd,uBACA,kBAQA,WAAe,YAAf,uBACA,kBAQA,WAAc,YAAd,uBACA,kBAQA,WAAe,YAAf,uBACA,kBnXpuGJ,GmX84HQ,OAAU,GAAH,CAAP,EACW,KAAX,IACR,KnXzoGiB,OAJb,GsE37DW,QAAC,GAAD,QAAC,GA+pBD,QAAC,GAAD,QAAC,EA8bhB,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"} \ No newline at end of file diff --git a/olcCodeJam2023Entry/resource.h b/olcCodeJam2023Entry/resource.h new file mode 100644 index 0000000..e740ca9 --- /dev/null +++ b/olcCodeJam2023Entry/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by olcCodeJam2023Entry.rc +// +#define IDI_ICON1 104 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/olcCodeJam2023Entry/resource1.h b/olcCodeJam2023Entry/resource1.h new file mode 100644 index 0000000..6ebfb5d --- /dev/null +++ b/olcCodeJam2023Entry/resource1.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by olcCodeJam2023Entry.rc +// +#define IDI_ICON1 103 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 102 +#endif +#endif