diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index eb24e0594..4509597d9 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -7,6 +7,7 @@ on: - '.github/workflows/linux-build.yml' - '.github/workflows/macos-build.yml' - '.github/workflows/msys2-build.yml' + - '.github/workflows/wasm-build.yml' - '.github/workflows/windows-build.yml' - '.gitignore' - 'LICENSE' diff --git a/.github/workflows/linux-build.yml b/.github/workflows/linux-build.yml index 6df5de1be..45670c227 100644 --- a/.github/workflows/linux-build.yml +++ b/.github/workflows/linux-build.yml @@ -7,6 +7,7 @@ on: - '.github/workflows/coverage.yml' - '.github/workflows/macos-build.yml' - '.github/workflows/msys2-build.yml' + - '.github/workflows/wasm-build.yml' - '.github/workflows/windows-build.yml' - '.gitignore' - 'LICENSE' @@ -92,5 +93,5 @@ jobs: # Upload artifacts - uses: actions/upload-artifact@v3 with: - name: ${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} + name: nazaraengine-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} path: package diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index b1bc93dec..238c43561 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -7,6 +7,7 @@ on: - '.github/workflows/coverage.yml' - '.github/workflows/linux-build.yml' - '.github/workflows/msys2-build.yml' + - '.github/workflows/wasm-build.yml' - '.github/workflows/windows-build.yml' - '.gitignore' - 'LICENSE' @@ -85,5 +86,5 @@ jobs: # Upload artifacts - uses: actions/upload-artifact@v3 with: - name: ${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} + name: nazaraengine-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} path: package diff --git a/.github/workflows/msys2-build.yml b/.github/workflows/msys2-build.yml index e9581b76c..9ad35b64d 100644 --- a/.github/workflows/msys2-build.yml +++ b/.github/workflows/msys2-build.yml @@ -7,6 +7,7 @@ on: - '.github/workflows/coverage.yml' - '.github/workflows/linux-build.yml' - '.github/workflows/macos-build.yml' + - '.github/workflows/wasm-build.yml' - '.github/workflows/windows-build.yml' - '.gitignore' - 'LICENSE' @@ -115,5 +116,5 @@ jobs: # Upload artifacts - uses: actions/upload-artifact@v3 with: - name: ${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} + name: nazaraengine-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} path: package \ No newline at end of file diff --git a/.github/workflows/wasm-build.yml b/.github/workflows/wasm-build.yml new file mode 100644 index 000000000..d4716b703 --- /dev/null +++ b/.github/workflows/wasm-build.yml @@ -0,0 +1,93 @@ +name: Emscripten (wasm) build + +on: + pull_request: + push: + paths-ignore: + - '.github/workflows/coverage.yml' + - '.github/workflows/linux-build.yml' + - '.github/workflows/macos-build.yml' + - '.github/workflows/msys2-build.yml' + - '.github/workflows/windows-build.yml' + - '.gitignore' + - 'LICENSE' + - 'CHANGELOG.md' + - 'README.md' + - 'README_en.md' + - 'README_fr.md' + +jobs: + build: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest] + arch: [x86_64] + mode: [debug, release] + kind: [static] + + runs-on: ${{ matrix.os }} + if: "!contains(github.event.head_commit.message, 'ci skip')" + + steps: + - name: Get current date as package key + id: cache_key + run: echo "key=$(date +'%W')" >> $GITHUB_OUTPUT + + - name: Checkout repository + uses: actions/checkout@v3 + + # Force xmake to a specific folder (for cache) + - name: Set xmake env + run: echo "XMAKE_GLOBALDIR=${{ runner.workspace }}/xmake-global" >> $GITHUB_ENV + + # Install xmake + - name: Setup xmake + uses: xmake-io/github-action-setup-xmake@v1 + with: + actions-cache-folder: .xmake-cache-W${{ steps.cache_key.outputs.key }} + + # Update xmake repository (in order to have the file that will be cached) + - name: Update xmake repository + run: xmake repo --update + + # Fetch xmake dephash + - name: Retrieve dependencies hash + id: dep_hash + run: echo "hash=$(xmake l utils.ci.packageskey)" >> $GITHUB_OUTPUT + + # Setup emsdk + - name: Setup emscripten + uses: mymindstorm/setup-emsdk@v11 + with: + version: 1.38.40 + actions-cache-folder: emsdk-cache-${{ matrix.mode }}-${{ matrix.kind }} + + # Cache xmake dependencies + - name: Retrieve cached xmake dependencies + uses: actions/cache@v3 + with: + path: ${{ env.XMAKE_GLOBALDIR }}/.xmake/packages + key: Wasm-${{ matrix.arch }}-${{ matrix.mode }}-${{ steps.dep_hash.outputs.hash }}-W${{ steps.cache_key.outputs.key }} + + # Setup compilation mode and install project dependencies + - name: Configure xmake and install dependencies + run: xmake config --plat=wasm --arch=${{ matrix.arch }} --mode=${{ matrix.mode }} --kind=${{ matrix.kind }} --ccache=n --fs_watcher=n --tests=n --unitybuild=y --yes + + # Build the engine + - name: Build Nazara + run: xmake --yes + + # Setup installation configuration + - name: Configure xmake for installation + run: xmake config --plat=wasm --arch=${{ matrix.arch }} --mode=${{ matrix.mode }} --ccache=n --ffmpeg=n --shadernodes=y --tests=y --yes + + # Install the result files + - name: Install Nazara + run: xmake install -vo package + + # Upload artifacts + - uses: actions/upload-artifact@v3 + with: + name: nazaraengine-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} + path: package diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index bb9874a90..c18eed854 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -8,6 +8,7 @@ on: - '.github/workflows/linux-build.yml' - '.github/workflows/macos-build.yml' - '.github/workflows/msys2-build.yml' + - '.github/workflows/wasm-build.yml' - '.gitignore' - 'LICENSE' - 'CHANGELOG.md' @@ -86,5 +87,5 @@ jobs: # Upload artifacts - uses: actions/upload-artifact@v3 with: - name: ${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} + name: nazaraengine-${{ matrix.os }}-${{ matrix.arch }}-${{ matrix.mode }} path: package diff --git a/emscripten.patch b/emscripten.patch deleted file mode 100644 index 862f11759..000000000 --- a/emscripten.patch +++ /dev/null @@ -1,1208 +0,0 @@ -diff --git a/examples/DopplerEffect/main.cpp b/examples/DopplerEffect/main.cpp -index 0498da58a..ba817eadd 100644 ---- a/examples/DopplerEffect/main.cpp -+++ b/examples/DopplerEffect/main.cpp -@@ -14,6 +14,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - #include -@@ -52,28 +54,33 @@ int main() - // On joue le son - sound.Play(); - -- // La boucle du programme (Pour déplacer le son) -+ Nz::Window window; -+ - Nz::Clock clock; -- while (sound.GetStatus() == Nz::SoundStatus::Playing) -- { -- // Comme le son se joue dans un thread séparé, on peut mettre en pause le principal régulièrement -- int sleepTime = int(1000/60 - clock.GetMilliseconds()); // 60 FPS -+ Nz::BasicMainloop(window, [&] { -+ if (sound.GetStatus() == Nz::SoundStatus::Playing) -+ { -+ // Comme le son se joue dans un thread séparé, on peut mettre en pause le principal régulièrement -+ int sleepTime = int(1000 / 60 - clock.GetMilliseconds()); // 60 FPS - -- if (sleepTime > 0) -- std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime)); -+ if (sleepTime > 0) -+ std::this_thread::sleep_for(std::chrono::milliseconds(sleepTime)); - -- // On bouge la source du son en fonction du temps depuis chaque mise à jour -- Nz::Vector3f pos = sound.GetPosition() + sound.GetVelocity()*clock.GetSeconds(); -- sound.SetPosition(pos); -+ // On bouge la source du son en fonction du temps depuis chaque mise à jour -+ Nz::Vector3f pos = sound.GetPosition() + sound.GetVelocity() * clock.GetSeconds(); -+ sound.SetPosition(pos); - -- std::cout << "Sound position: " << pos << std::endl; -+ std::cout << "Sound position: " << pos << std::endl; - -- // Si la position de la source atteint une certaine position, ou si l'utilisateur appuie sur echap -- if (pos.x > Nz::Vector3f::Left().x*-50.f || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::VKey::Escape)) -- sound.Stop(); // On arrête le son (Stoppant également la boucle) -+ // Si la position de la source atteint une certaine position, ou si l'utilisateur appuie sur echap -+ if (pos.x > Nz::Vector3f::Left().x * -50.f || Nz::Keyboard::IsKeyPressed(Nz::Keyboard::VKey::Escape)) -+ sound.Stop(); // On arrête le son (Stoppant également la boucle) - -- clock.Restart(); -- } -+ clock.Restart(); -+ } -+ }); -+ -+ // La boucle du programme (Pour déplacer le son) - - return 0; - } -diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp -index 1054bd8bd..f51e917d6 100644 ---- a/examples/GraphicsTest/main.cpp -+++ b/examples/GraphicsTest/main.cpp -@@ -17,11 +17,12 @@ int main() - resourceDir = "../.." / resourceDir; - - Nz::Renderer::Config rendererConfig; -- std::cout << "Run using Vulkan? (y/n)" << std::endl; -+ rendererConfig.preferredAPI = Nz::RenderAPI::OpenGL; -+ /*std::cout << "Run using Vulkan? (y/n)" << std::endl; - if (std::getchar() == 'y') - rendererConfig.preferredAPI = Nz::RenderAPI::Vulkan; - else -- rendererConfig.preferredAPI = Nz::RenderAPI::Vulkan; -+ rendererConfig.preferredAPI = Nz::RenderAPI::OpenGL;*/ - - Nz::Modules nazara(rendererConfig); - -@@ -31,7 +32,7 @@ int main() - meshParams.center = true; - meshParams.vertexRotation = Nz::EulerAnglesf(0.f, -90.f, 0.f); - meshParams.vertexScale = Nz::Vector3f(0.002f); -- meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ_Normal_UV_Tangent); -+ meshParams.vertexDeclaration = Nz::VertexDeclaration::Get(Nz::VertexLayout::XYZ_Normal_UV); - - std::shared_ptr device = Nz::Graphics::Instance()->GetRenderDevice(); - -@@ -122,6 +123,8 @@ int main() - - Nz::Mouse::SetRelativeMouseMode(true); - -+ Nz::Clock crashClock; -+ - Nz::BasicMainloop(window, [&] - { - Nz::WindowEvent event; -@@ -221,6 +224,14 @@ int main() - - framePipeline.GetDebugDrawer().DrawLine(Nz::Vector3f::Zero(), Nz::Vector3f::Forward(), Nz::Color::Blue); - -+ for (const Nz::WorldInstancePtr& worldInstance : { modelInstance, modelInstance2 }) -+ { -+ Nz::Boxf aabb = model.GetAABB(); -+ aabb.Transform(worldInstance->GetWorldMatrix()); -+ -+ framePipeline.GetDebugDrawer().DrawBox(aabb, Nz::Color::Green); -+ } -+ - viewerInstance.UpdateViewMatrix(Nz::Matrix4f::TransformInverse(viewerPos, camAngles)); - viewerInstance.UpdateEyePosition(viewerPos); - -@@ -249,6 +260,9 @@ int main() - // Et on relance l'horloge pour refaire ça dans une seconde - secondClock.Restart(); - } -+ -+ if (crashClock.GetSeconds() > 3.f) -+ std::abort(); - }); - - return EXIT_SUCCESS; -diff --git a/examples/GraphicsTest/xmake.lua b/examples/GraphicsTest/xmake.lua -index 76c04f596..b439049fd 100644 ---- a/examples/GraphicsTest/xmake.lua -+++ b/examples/GraphicsTest/xmake.lua -@@ -1,7 +1,3 @@ - target("GraphicsTest") - add_deps("NazaraGraphics") -- add_files("main.cpp") -- -- if is_plat("wasm") then -- add_ldflags("--preload-file assets/", {force = true}) -- end -+ add_files("main.cpp") -\ No newline at end of file -diff --git a/examples/PhysicallyBasedRendering/xmake.lua b/examples/PhysicallyBasedRendering/xmake.lua -index 5093554b6..6af2278d6 100644 ---- a/examples/PhysicallyBasedRendering/xmake.lua -+++ b/examples/PhysicallyBasedRendering/xmake.lua -@@ -1,7 +1,3 @@ - target("PBR") - add_deps("NazaraGraphics") - add_files("main.cpp") -- -- if is_plat("wasm") then -- add_ldflags("--preload-file assets/", {force = true}) -- end -diff --git a/examples/PlayMusic/main.cpp b/examples/PlayMusic/main.cpp -index e52b10440..dc5154a2d 100644 ---- a/examples/PlayMusic/main.cpp -+++ b/examples/PlayMusic/main.cpp -@@ -8,6 +8,8 @@ - #include - #include - #include -+#include -+#include - #include - #include - #include -@@ -18,6 +20,8 @@ int main() - if (!std::filesystem::is_directory(resourceDir) && std::filesystem::is_directory("../.." / resourceDir)) - resourceDir = "../.." / resourceDir; - -+ std::getchar(); -+ - Nz::Modules audio; - - Nz::SoundStreamParams streamParams; -@@ -35,8 +39,10 @@ int main() - - std::cout << "Playing sound..." << std::endl; - -- while (music.IsPlaying()) -- std::this_thread::sleep_for(std::chrono::milliseconds(100)); -+ Nz::Window window; -+ -+ Nz::BasicMainloop(window, [&] { -+ }); - - return EXIT_SUCCESS; - } -diff --git a/examples/PlayMusic/xmake.lua b/examples/PlayMusic/xmake.lua -index 946c770e3..3825e84bd 100644 ---- a/examples/PlayMusic/xmake.lua -+++ b/examples/PlayMusic/xmake.lua -@@ -1,3 +1,3 @@ - target("PlayMusic") -- add_deps("NazaraAudio") -+ add_deps("NazaraAudio", "NazaraPlatform") - add_files("main.cpp") -diff --git a/examples/RenderTest/main.cpp b/examples/RenderTest/main.cpp -index 7ae60e011..0c17e233e 100644 ---- a/examples/RenderTest/main.cpp -+++ b/examples/RenderTest/main.cpp -@@ -129,7 +129,6 @@ int main() - } - - Nz::MeshParams meshParams; -- meshParams.bufferFactory = Nz::GetRenderBufferFactory(device); - meshParams.center = true; - meshParams.vertexRotation = Nz::EulerAnglesf(0.f, -90.f, 0.f); - meshParams.vertexScale = Nz::Vector3f(0.002f); -@@ -153,6 +152,17 @@ int main() - // Vertex buffer - std::cout << "Vertex count: " << meshVB->GetVertexCount() << std::endl; - -+ // Create renderbuffers (GPU buffers) -+ const std::shared_ptr& renderDevice = window.GetRenderDevice(); -+ -+ assert(meshIB->GetBuffer()->GetStorage() == Nz::DataStorage::Software); -+ assert(meshVB->GetBuffer()->GetStorage() == Nz::DataStorage::Software); -+ const Nz::SoftwareBuffer* indexBufferContent = static_cast(meshIB->GetBuffer().get()); -+ const Nz::SoftwareBuffer* vertexBufferContent = static_cast(meshVB->GetBuffer().get()); -+ -+ std::shared_ptr renderBufferIB = renderDevice->InstantiateBuffer(Nz::BufferType::Index, indexBufferContent->GetSize(), Nz::BufferUsage::DeviceLocal, indexBufferContent->GetData()); -+ std::shared_ptr renderBufferVB = renderDevice->InstantiateBuffer(Nz::BufferType::Vertex, vertexBufferContent->GetSize(), Nz::BufferUsage::DeviceLocal, vertexBufferContent->GetData()); -+ - // Texture - Nz::TextureParams texParams; - texParams.renderDevice = device; -@@ -230,13 +240,8 @@ int main() - - std::shared_ptr pipeline = device->InstantiateRenderPipeline(pipelineInfo); - -- const std::shared_ptr& renderDevice = window.GetRenderDevice(); -- - std::shared_ptr commandPool = renderDevice->InstantiateCommandPool(Nz::QueueType::Graphics); - -- Nz::RenderBuffer& renderBufferIB = static_cast(*meshIB->GetBuffer()); -- Nz::RenderBuffer& renderBufferVB = static_cast(*meshVB->GetBuffer()); -- - Nz::Vector3f viewerPos = Nz::Vector3f::Zero(); - - Nz::EulerAnglesf camAngles(0.f, 0.f, 0.f); -@@ -253,6 +258,8 @@ int main() - - Nz::DebugDrawer debugDrawer(*renderDevice); - -+ Nz::Clock crashClock; -+ - Nz::BasicMainloop(window, [&] - { - Nz::WindowEvent event; -@@ -379,9 +386,9 @@ int main() - { - builder.BeginRenderPass(windowRT->GetFramebuffer(frame.GetFramebufferIndex()), windowRT->GetRenderPass(), renderRect, { clearValues[0], clearValues[1] }); - { -- builder.BindIndexBuffer(renderBufferIB, Nz::IndexType::U16); -+ builder.BindIndexBuffer(*renderBufferIB, Nz::IndexType::U16); - builder.BindPipeline(*pipeline); -- builder.BindVertexBuffer(0, renderBufferVB); -+ builder.BindVertexBuffer(0, *renderBufferVB); - builder.BindShaderBinding(0, *viewerShaderBinding); - builder.BindShaderBinding(1, *textureShaderBinding); - -@@ -421,6 +428,9 @@ int main() - // Et on relance l'horloge pour refaire ça dans une seconde - secondClock.Restart(); - } -+ -+ if (crashClock.GetSeconds() > 2.f) -+ std::abort(); - }); - - return EXIT_SUCCESS; -diff --git a/examples/xmake.lua b/examples/xmake.lua -index 2e114e9dd..c86f78d0b 100644 ---- a/examples/xmake.lua -+++ b/examples/xmake.lua -@@ -5,5 +5,9 @@ if has_config("examples") then - set_group("Examples") - set_kind("binary") - -+ if is_plat("wasm") then -+ add_ldflags("--preload-file assets/", { force = true }) -+ end -+ - includes("*/xmake.lua") - end -diff --git a/include/Nazara/Audio.hpp b/include/Nazara/Audio.hpp -index 5b2ad2252..a72eaca2a 100644 ---- a/include/Nazara/Audio.hpp -+++ b/include/Nazara/Audio.hpp -@@ -40,11 +40,6 @@ - #include - #include - #include --#include --#include --#include --#include --#include - #include - #include - #include -diff --git a/include/Nazara/Audio/OpenAL.hpp b/include/Nazara/Audio/OpenAL.hpp -index d23cd08eb..f50c8bd1a 100644 ---- a/include/Nazara/Audio/OpenAL.hpp -+++ b/include/Nazara/Audio/OpenAL.hpp -@@ -2,174 +2,147 @@ - // This file is part of the "Nazara Engine - Audio module" - // For conditions of distribution and use, see copyright notice in Config.hpp - --#pragma once -+// no header guards - --#ifndef NAZARA_AUDIO_OPENAL_HPP --#define NAZARA_AUDIO_OPENAL_HPP -+#if (!defined(NAZARA_AUDIO_AL_FUNCTION) || !defined(NAZARA_AUDIO_ALC_FUNCTION)) && !defined(NAZARA_AUDIO_AL_ALC_FUNCTION) -+#error You must define NAZARA_AUDIO_AL_FUNCTION and NAZARA_AUDIO_ALC_FUNCTION, or NAZARA_AUDIO_AL_ALC_FUNCTION before including this file -+#endif - --// no include reordering -+#ifndef NAZARA_AUDIO_AL_FUNCTION -+#define NAZARA_AUDIO_AL_FUNCTION(func) NAZARA_AUDIO_AL_ALC_FUNCTION(func) -+#endif - --#if defined(NAZARA_AUDIO_OPENAL) || defined(NAZARA_AUDIO_BUILD) -+#ifndef NAZARA_AUDIO_ALC_FUNCTION -+#define NAZARA_AUDIO_ALC_FUNCTION(func) NAZARA_AUDIO_AL_ALC_FUNCTION(func) -+#endif - --#include -+#ifndef NAZARA_AUDIO_AL_EXT_FUNCTION -+#define NAZARA_AUDIO_AL_EXT_FUNCTION(func) NAZARA_AUDIO_AL_FUNCTION(func) -+#endif - --// Inclusion of OpenAL headers -+#ifndef NAZARA_AUDIO_AL_EXT_BEGIN -+#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) -+#endif - --// OpenAL headers does not allow us to only get the signatures without the pointers to the functions --// And I do no want to modify them, I'm obliged to put them in a different namespace --// to put only interesting things back in the global namespace (specially typedef) --namespace OpenALDetail --{ -- #include -- #include -- #include --} -+#ifndef NAZARA_AUDIO_AL_EXT_END -+#define NAZARA_AUDIO_AL_EXT_END() -+#endif - --// If someone has a better idea ... --using OpenALDetail::ALboolean; --using OpenALDetail::ALbyte; --using OpenALDetail::ALchar; --using OpenALDetail::ALdouble; --using OpenALDetail::ALenum; --using OpenALDetail::ALfloat; --using OpenALDetail::ALint; --using OpenALDetail::ALshort; --using OpenALDetail::ALsizei; --using OpenALDetail::ALubyte; --using OpenALDetail::ALuint; --using OpenALDetail::ALushort; --using OpenALDetail::ALvoid; -+NAZARA_AUDIO_AL_FUNCTION(alBuffer3f) -+NAZARA_AUDIO_AL_FUNCTION(alBuffer3i) -+NAZARA_AUDIO_AL_FUNCTION(alBufferData) -+NAZARA_AUDIO_AL_FUNCTION(alBufferf) -+NAZARA_AUDIO_AL_FUNCTION(alBufferfv) -+NAZARA_AUDIO_AL_FUNCTION(alBufferi) -+NAZARA_AUDIO_AL_FUNCTION(alBufferiv) -+NAZARA_AUDIO_AL_FUNCTION(alDeleteBuffers) -+NAZARA_AUDIO_AL_FUNCTION(alDeleteSources) -+NAZARA_AUDIO_AL_FUNCTION(alDisable) -+NAZARA_AUDIO_AL_FUNCTION(alDistanceModel) -+NAZARA_AUDIO_AL_FUNCTION(alDopplerFactor) -+NAZARA_AUDIO_AL_FUNCTION(alDopplerVelocity) -+NAZARA_AUDIO_AL_FUNCTION(alEnable) -+NAZARA_AUDIO_AL_FUNCTION(alGenBuffers) -+NAZARA_AUDIO_AL_FUNCTION(alGenSources) -+NAZARA_AUDIO_AL_FUNCTION(alGetBoolean) -+NAZARA_AUDIO_AL_FUNCTION(alGetBooleanv) -+NAZARA_AUDIO_AL_FUNCTION(alGetBuffer3f) -+NAZARA_AUDIO_AL_FUNCTION(alGetBuffer3i) -+NAZARA_AUDIO_AL_FUNCTION(alGetBufferf) -+NAZARA_AUDIO_AL_FUNCTION(alGetBufferfv) -+NAZARA_AUDIO_AL_FUNCTION(alGetBufferi) -+NAZARA_AUDIO_AL_FUNCTION(alGetBufferiv) -+NAZARA_AUDIO_AL_FUNCTION(alGetDouble) -+NAZARA_AUDIO_AL_FUNCTION(alGetDoublev) -+NAZARA_AUDIO_AL_FUNCTION(alGetEnumValue) -+NAZARA_AUDIO_AL_FUNCTION(alGetError) -+NAZARA_AUDIO_AL_FUNCTION(alGetFloat) -+NAZARA_AUDIO_AL_FUNCTION(alGetFloatv) -+NAZARA_AUDIO_AL_FUNCTION(alGetInteger) -+NAZARA_AUDIO_AL_FUNCTION(alGetIntegerv) -+NAZARA_AUDIO_AL_FUNCTION(alGetListener3f) -+NAZARA_AUDIO_AL_FUNCTION(alGetListener3i) -+NAZARA_AUDIO_AL_FUNCTION(alGetListenerf) -+NAZARA_AUDIO_AL_FUNCTION(alGetListenerfv) -+NAZARA_AUDIO_AL_FUNCTION(alGetListeneri) -+NAZARA_AUDIO_AL_FUNCTION(alGetListeneriv) -+NAZARA_AUDIO_AL_FUNCTION(alGetProcAddress) -+NAZARA_AUDIO_AL_FUNCTION(alGetSource3f) -+NAZARA_AUDIO_AL_FUNCTION(alGetSource3i) -+NAZARA_AUDIO_AL_FUNCTION(alGetSourcef) -+NAZARA_AUDIO_AL_FUNCTION(alGetSourcefv) -+NAZARA_AUDIO_AL_FUNCTION(alGetSourcei) -+NAZARA_AUDIO_AL_FUNCTION(alGetSourceiv) -+NAZARA_AUDIO_AL_FUNCTION(alGetString) -+NAZARA_AUDIO_AL_FUNCTION(alIsBuffer) -+NAZARA_AUDIO_AL_FUNCTION(alIsEnabled) -+NAZARA_AUDIO_AL_FUNCTION(alIsExtensionPresent) -+NAZARA_AUDIO_AL_FUNCTION(alIsSource) -+NAZARA_AUDIO_AL_FUNCTION(alListener3f) -+NAZARA_AUDIO_AL_FUNCTION(alListener3i) -+NAZARA_AUDIO_AL_FUNCTION(alListenerf) -+NAZARA_AUDIO_AL_FUNCTION(alListenerfv) -+NAZARA_AUDIO_AL_FUNCTION(alListeneri) -+NAZARA_AUDIO_AL_FUNCTION(alListeneriv) -+NAZARA_AUDIO_AL_FUNCTION(alSource3f) -+NAZARA_AUDIO_AL_FUNCTION(alSource3i) -+NAZARA_AUDIO_AL_FUNCTION(alSourcef) -+NAZARA_AUDIO_AL_FUNCTION(alSourcefv) -+NAZARA_AUDIO_AL_FUNCTION(alSourcei) -+NAZARA_AUDIO_AL_FUNCTION(alSourceiv) -+NAZARA_AUDIO_AL_FUNCTION(alSourcePause) -+NAZARA_AUDIO_AL_FUNCTION(alSourcePausev) -+NAZARA_AUDIO_AL_FUNCTION(alSourcePlay) -+NAZARA_AUDIO_AL_FUNCTION(alSourcePlayv) -+NAZARA_AUDIO_AL_FUNCTION(alSourceQueueBuffers) -+NAZARA_AUDIO_AL_FUNCTION(alSourceRewind) -+NAZARA_AUDIO_AL_FUNCTION(alSourceRewindv) -+NAZARA_AUDIO_AL_FUNCTION(alSourceStop) -+NAZARA_AUDIO_AL_FUNCTION(alSourceStopv) -+NAZARA_AUDIO_AL_FUNCTION(alSourceUnqueueBuffers) -+NAZARA_AUDIO_AL_FUNCTION(alSpeedOfSound) - --// SOFT_source_latency --using OpenALDetail::ALint64SOFT; --using OpenALDetail::ALuint64SOFT; -+/* -+NAZARA_AUDIO_AL_EXT_BEGIN(AL_SOFT_source_latency) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSource3dSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSource3i64SOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcedSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcedvSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcei64SOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alGetSourcei64vSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alSource3dSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alSource3i64SOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcedSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcedvSOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcei64SOFT) -+NAZARA_AUDIO_AL_FUNCTION_EXT(alSourcei64vSOFT) -+NAZARA_AUDIO_AL_EXT_END() -+*/ - --using OpenALDetail::ALCboolean; --using OpenALDetail::ALCbyte; --using OpenALDetail::ALCchar; --using OpenALDetail::ALCcontext; --using OpenALDetail::ALCdevice; --using OpenALDetail::ALCdouble; --using OpenALDetail::ALCenum; --using OpenALDetail::ALCfloat; --using OpenALDetail::ALCint; --using OpenALDetail::ALCshort; --using OpenALDetail::ALCsizei; --using OpenALDetail::ALCubyte; --using OpenALDetail::ALCuint; --using OpenALDetail::ALCushort; --using OpenALDetail::ALCvoid; -+NAZARA_AUDIO_ALC_FUNCTION(alcCaptureCloseDevice) -+NAZARA_AUDIO_ALC_FUNCTION(alcCaptureOpenDevice) -+NAZARA_AUDIO_ALC_FUNCTION(alcCaptureSamples) -+NAZARA_AUDIO_ALC_FUNCTION(alcCaptureStart) -+NAZARA_AUDIO_ALC_FUNCTION(alcCaptureStop) -+NAZARA_AUDIO_ALC_FUNCTION(alcCloseDevice) -+NAZARA_AUDIO_ALC_FUNCTION(alcCreateContext) -+NAZARA_AUDIO_ALC_FUNCTION(alcDestroyContext) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetContextsDevice) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetCurrentContext) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetEnumValue) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetError) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetIntegerv) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetProcAddress) -+NAZARA_AUDIO_ALC_FUNCTION(alcGetString) -+NAZARA_AUDIO_ALC_FUNCTION(alcIsExtensionPresent) -+NAZARA_AUDIO_ALC_FUNCTION(alcMakeContextCurrent) -+NAZARA_AUDIO_ALC_FUNCTION(alcOpenDevice) -+NAZARA_AUDIO_ALC_FUNCTION(alcProcessContext) -+NAZARA_AUDIO_ALC_FUNCTION(alcSuspendContext) - --#define NAZARA_AUDIO_FOREACH_AL_FUNC(cb, extCb) \ -- cb(alBuffer3f, OpenALDetail::LPALBUFFER3F) \ -- cb(alBuffer3i, OpenALDetail::LPALBUFFER3I) \ -- cb(alBufferData, OpenALDetail::LPALBUFFERDATA) \ -- cb(alBufferf, OpenALDetail::LPALBUFFERF) \ -- cb(alBufferfv, OpenALDetail::LPALBUFFERFV) \ -- cb(alBufferi, OpenALDetail::LPALBUFFERI) \ -- cb(alBufferiv, OpenALDetail::LPALBUFFERIV) \ -- cb(alDeleteBuffers, OpenALDetail::LPALDELETEBUFFERS) \ -- cb(alDeleteSources, OpenALDetail::LPALDELETESOURCES) \ -- cb(alDisable, OpenALDetail::LPALDISABLE) \ -- cb(alDistanceModel, OpenALDetail::LPALDISTANCEMODEL) \ -- cb(alDopplerFactor, OpenALDetail::LPALDOPPLERFACTOR) \ -- cb(alDopplerVelocity, OpenALDetail::LPALDOPPLERVELOCITY) \ -- cb(alEnable, OpenALDetail::LPALENABLE) \ -- cb(alGenBuffers, OpenALDetail::LPALGENBUFFERS) \ -- cb(alGenSources, OpenALDetail::LPALGENSOURCES) \ -- cb(alGetBoolean, OpenALDetail::LPALGETBOOLEAN) \ -- cb(alGetBooleanv, OpenALDetail::LPALGETBOOLEANV) \ -- cb(alGetBuffer3f, OpenALDetail::LPALGETBUFFER3F) \ -- cb(alGetBuffer3i, OpenALDetail::LPALGETBUFFER3I) \ -- cb(alGetBufferf, OpenALDetail::LPALGETBUFFERF) \ -- cb(alGetBufferfv, OpenALDetail::LPALGETBUFFERFV) \ -- cb(alGetBufferi, OpenALDetail::LPALGETBUFFERI) \ -- cb(alGetBufferiv, OpenALDetail::LPALGETBUFFERIV) \ -- cb(alGetDouble, OpenALDetail::LPALGETDOUBLE) \ -- cb(alGetDoublev, OpenALDetail::LPALGETDOUBLEV) \ -- cb(alGetEnumValue, OpenALDetail::LPALGETENUMVALUE) \ -- cb(alGetError, OpenALDetail::LPALGETERROR) \ -- cb(alGetFloat, OpenALDetail::LPALGETFLOAT) \ -- cb(alGetFloatv, OpenALDetail::LPALGETFLOATV) \ -- cb(alGetInteger, OpenALDetail::LPALGETINTEGER) \ -- cb(alGetIntegerv, OpenALDetail::LPALGETINTEGERV) \ -- cb(alGetListener3f, OpenALDetail::LPALGETLISTENER3F) \ -- cb(alGetListener3i, OpenALDetail::LPALGETLISTENER3I) \ -- cb(alGetListenerf, OpenALDetail::LPALGETLISTENERF) \ -- cb(alGetListenerfv, OpenALDetail::LPALGETLISTENERFV) \ -- cb(alGetListeneri, OpenALDetail::LPALGETLISTENERI) \ -- cb(alGetListeneriv, OpenALDetail::LPALGETLISTENERIV) \ -- cb(alGetProcAddress, OpenALDetail::LPALGETPROCADDRESS) \ -- cb(alGetSource3f, OpenALDetail::LPALGETSOURCE3F) \ -- cb(alGetSource3i, OpenALDetail::LPALGETSOURCE3I) \ -- cb(alGetSourcef, OpenALDetail::LPALGETSOURCEF) \ -- cb(alGetSourcefv, OpenALDetail::LPALGETSOURCEFV) \ -- cb(alGetSourcei, OpenALDetail::LPALGETSOURCEI) \ -- cb(alGetSourceiv, OpenALDetail::LPALGETSOURCEIV) \ -- cb(alGetString, OpenALDetail::LPALGETSTRING) \ -- cb(alIsBuffer, OpenALDetail::LPALISBUFFER) \ -- cb(alIsEnabled, OpenALDetail::LPALISENABLED) \ -- cb(alIsExtensionPresent, OpenALDetail::LPALISEXTENSIONPRESENT) \ -- cb(alIsSource, OpenALDetail::LPALISSOURCE) \ -- cb(alListener3f, OpenALDetail::LPALLISTENER3F) \ -- cb(alListener3i, OpenALDetail::LPALLISTENER3I) \ -- cb(alListenerf, OpenALDetail::LPALLISTENERF) \ -- cb(alListenerfv, OpenALDetail::LPALLISTENERFV) \ -- cb(alListeneri, OpenALDetail::LPALLISTENERI) \ -- cb(alListeneriv, OpenALDetail::LPALLISTENERIV) \ -- cb(alSource3f, OpenALDetail::LPALSOURCE3F) \ -- cb(alSource3i, OpenALDetail::LPALSOURCE3I) \ -- cb(alSourcef, OpenALDetail::LPALSOURCEF) \ -- cb(alSourcefv, OpenALDetail::LPALSOURCEFV) \ -- cb(alSourcei, OpenALDetail::LPALSOURCEI) \ -- cb(alSourceiv, OpenALDetail::LPALSOURCEIV) \ -- cb(alSourcePause, OpenALDetail::LPALSOURCEPAUSE) \ -- cb(alSourcePausev, OpenALDetail::LPALSOURCEPAUSEV) \ -- cb(alSourcePlay, OpenALDetail::LPALSOURCEPLAY) \ -- cb(alSourcePlayv, OpenALDetail::LPALSOURCEPLAYV) \ -- cb(alSourceQueueBuffers, OpenALDetail::LPALSOURCEQUEUEBUFFERS) \ -- cb(alSourceRewind, OpenALDetail::LPALSOURCEREWIND) \ -- cb(alSourceRewindv, OpenALDetail::LPALSOURCEREWINDV) \ -- cb(alSourceStop, OpenALDetail::LPALSOURCESTOP) \ -- cb(alSourceStopv, OpenALDetail::LPALSOURCESTOPV) \ -- cb(alSourceUnqueueBuffers, OpenALDetail::LPALSOURCEUNQUEUEBUFFERS) \ -- cb(alSpeedOfSound, OpenALDetail::LPALSPEEDOFSOUND) \ -- /* AL_SOFT_source_latency */ \ -- extCb(alGetSource3dSOFT, OpenALDetail::LPALGETSOURCE3DSOFT) \ -- extCb(alGetSource3i64SOFT, OpenALDetail::LPALGETSOURCE3I64SOFT) \ -- extCb(alGetSourcedSOFT, OpenALDetail::LPALGETSOURCEDSOFT) \ -- extCb(alGetSourcedvSOFT, OpenALDetail::LPALGETSOURCEDVSOFT) \ -- extCb(alGetSourcei64SOFT, OpenALDetail::LPALGETSOURCEI64SOFT) \ -- extCb(alGetSourcei64vSOFT, OpenALDetail::LPALGETSOURCEI64VSOFT) \ -- extCb(alSource3dSOFT, OpenALDetail::LPALSOURCE3DSOFT) \ -- extCb(alSource3i64SOFT, OpenALDetail::LPALSOURCE3I64SOFT) \ -- extCb(alSourcedSOFT, OpenALDetail::LPALSOURCEDSOFT) \ -- extCb(alSourcedvSOFT, OpenALDetail::LPALSOURCEDVSOFT) \ -- extCb(alSourcei64SOFT, OpenALDetail::LPALSOURCEI64SOFT) \ -- extCb(alSourcei64vSOFT, OpenALDetail::LPALSOURCEI64VSOFT) \ -- --#define NAZARA_AUDIO_FOREACH_ALC_FUNC(cb, extCb) \ -- cb(alcCaptureCloseDevice, OpenALDetail::LPALCCAPTURECLOSEDEVICE) \ -- cb(alcCaptureOpenDevice, OpenALDetail::LPALCCAPTUREOPENDEVICE) \ -- cb(alcCaptureSamples, OpenALDetail::LPALCCAPTURESAMPLES) \ -- cb(alcCaptureStart, OpenALDetail::LPALCCAPTURESTART) \ -- cb(alcCaptureStop, OpenALDetail::LPALCCAPTURESTOP) \ -- cb(alcCloseDevice, OpenALDetail::LPALCCLOSEDEVICE) \ -- cb(alcCreateContext, OpenALDetail::LPALCCREATECONTEXT) \ -- cb(alcDestroyContext, OpenALDetail::LPALCDESTROYCONTEXT) \ -- cb(alcGetContextsDevice, OpenALDetail::LPALCGETCONTEXTSDEVICE) \ -- cb(alcGetCurrentContext, OpenALDetail::LPALCGETCURRENTCONTEXT) \ -- cb(alcGetEnumValue, OpenALDetail::LPALCGETENUMVALUE) \ -- cb(alcGetError, OpenALDetail::LPALCGETERROR) \ -- cb(alcGetIntegerv, OpenALDetail::LPALCGETINTEGERV) \ -- cb(alcGetProcAddress, OpenALDetail::LPALCGETPROCADDRESS) \ -- cb(alcGetString, OpenALDetail::LPALCGETSTRING) \ -- cb(alcIsExtensionPresent, OpenALDetail::LPALCISEXTENSIONPRESENT) \ -- cb(alcMakeContextCurrent, OpenALDetail::LPALCMAKECONTEXTCURRENT) \ -- cb(alcOpenDevice, OpenALDetail::LPALCOPENDEVICE) \ -- cb(alcProcessContext, OpenALDetail::LPALCPROCESSCONTEXT) \ -- cb(alcSuspendContext, OpenALDetail::LPALCSUSPENDCONTEXT) \ -- --#endif // NAZARA_AUDIO_OPENAL -- --#endif // NAZARA_AUDIO_OPENAL_HPP -+#undef NAZARA_AUDIO_AL_FUNCTION -+#undef NAZARA_AUDIO_AL_ALC_FUNCTION -+#undef NAZARA_AUDIO_AL_EXT_FUNCTION -+#undef NAZARA_AUDIO_ALC_FUNCTION -+#undef NAZARA_AUDIO_AL_EXT_BEGIN -+#undef NAZARA_AUDIO_AL_EXT_END -diff --git a/include/Nazara/Audio/OpenALBuffer.hpp b/include/Nazara/Audio/OpenALBuffer.hpp -index 132b2be4b..24e974e4f 100644 ---- a/include/Nazara/Audio/OpenALBuffer.hpp -+++ b/include/Nazara/Audio/OpenALBuffer.hpp -@@ -12,12 +12,11 @@ - #include - #include - #include --#include -+#include - - namespace Nz - { - class OpenALDevice; -- class OpenALLibrary; - - class NAZARA_AUDIO_API OpenALBuffer final : public AudioBuffer - { -diff --git a/include/Nazara/Audio/OpenALDevice.hpp b/include/Nazara/Audio/OpenALDevice.hpp -index 84572e4d7..30fe1fc94 100644 ---- a/include/Nazara/Audio/OpenALDevice.hpp -+++ b/include/Nazara/Audio/OpenALDevice.hpp -@@ -13,7 +13,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -@@ -21,8 +21,6 @@ - - namespace Nz - { -- class OpenALLibrary; -- - enum class OpenALExtension - { - SourceLatency, -diff --git a/include/Nazara/Audio/OpenALLibrary.hpp b/include/Nazara/Audio/OpenALLibrary.hpp -index c9a1d1c66..07c990067 100644 ---- a/include/Nazara/Audio/OpenALLibrary.hpp -+++ b/include/Nazara/Audio/OpenALLibrary.hpp -@@ -7,23 +7,29 @@ - #ifndef NAZARA_AUDIO_OPENALLIBRARY_HPP - #define NAZARA_AUDIO_OPENALLIBRARY_HPP - --#if defined(NAZARA_AUDIO_OPENAL) || defined(NAZARA_AUDIO_BUILD) -- - #include - #include - #include --#include --#include - #include - #include - #include - -+// Inclusion of OpenAL headers -+#include -+#include -+ -+#ifndef NAZARA_PLATFORM_WEB -+#include -+#endif -+ - namespace Nz - { -+ class OpenALDevice; -+ - class NAZARA_AUDIO_API OpenALLibrary - { - public: -- OpenALLibrary() = default; -+ inline OpenALLibrary(); - OpenALLibrary(const OpenALLibrary&) = delete; - OpenALLibrary(OpenALLibrary&&) = delete; - inline ~OpenALLibrary(); -@@ -42,21 +48,18 @@ namespace Nz - OpenALLibrary& operator=(const OpenALLibrary&) = delete; - OpenALLibrary& operator=(OpenALLibrary&&) = delete; - --#define NAZARA_AUDIO_FUNC(name, sig) sig name; -- NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) -- NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) --#undef NAZARA_AUDIO_FUNC -+#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) decltype(&::name) name; -+#include - - private: - std::vector ParseDevices(const char* deviceString); - - DynLib m_library; -+ bool m_isLoaded; - bool m_hasCaptureSupport; - }; - } - - #include - --#endif // NAZARA_AUDIO_OPENAL -- - #endif // NAZARA_AUDIO_OPENALLIBRARY_HPP -diff --git a/include/Nazara/Audio/OpenALLibrary.inl b/include/Nazara/Audio/OpenALLibrary.inl -index 05e08e4e0..856fd9a2d 100644 ---- a/include/Nazara/Audio/OpenALLibrary.inl -+++ b/include/Nazara/Audio/OpenALLibrary.inl -@@ -7,6 +7,12 @@ - - namespace Nz - { -+ inline OpenALLibrary::OpenALLibrary() : -+ m_hasCaptureSupport(false), -+ m_isLoaded(false) -+ { -+ } -+ - inline OpenALLibrary::~OpenALLibrary() - { - Unload(); -@@ -14,7 +20,7 @@ namespace Nz - - inline bool OpenALLibrary::IsLoaded() const - { -- return m_library.IsLoaded(); -+ return m_isLoaded; - } - } - -diff --git a/include/Nazara/Audio/OpenALSource.hpp b/include/Nazara/Audio/OpenALSource.hpp -index 73afff99d..3473abdcb 100644 ---- a/include/Nazara/Audio/OpenALSource.hpp -+++ b/include/Nazara/Audio/OpenALSource.hpp -@@ -12,13 +12,12 @@ - #include - #include - #include --#include -+#include - - namespace Nz - { - class OpenALBuffer; - class OpenALDevice; -- class OpenALLibrary; - - class NAZARA_AUDIO_API OpenALSource final : public AudioSource - { -diff --git a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp -index d2cc4248f..e674abd1c 100644 ---- a/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp -+++ b/include/Nazara/OpenGLRenderer/Wrapper/Context.hpp -@@ -164,6 +164,7 @@ namespace Nz::GL - inline void NotifyVertexArrayDestruction(GLuint vao) const; - - bool ProcessErrorStack() const; -+ template bool ProcessErrorStack(std::size_t funcIndex, Args... args) const; - - inline void ResetColorWriteMasks() const; - inline void ResetDepthWriteMasks() const; -diff --git a/include/Nazara/Utility/BasicMainloop.hpp b/include/Nazara/Utility/BasicMainloop.hpp -index 359b5c978..c419651a9 100644 ---- a/include/Nazara/Utility/BasicMainloop.hpp -+++ b/include/Nazara/Utility/BasicMainloop.hpp -@@ -7,7 +7,7 @@ - #ifndef NAZARA_BASIC_MAINLOOP_HPP - #define NAZARA_BASIC_MAINLOOP_HPP - --#include -+#include - - #ifdef NAZARA_PLATFORM_WEB - #include -@@ -16,7 +16,7 @@ - namespace Nz - { - template -- void BasicMainloop(RenderWindow& window, CallbackT&& callback) -+ void BasicMainloop(Window& window, CallbackT&& callback) - { - #ifndef NAZARA_PLATFORM_WEB - while (window.IsOpen()) -diff --git a/src/Nazara/Audio/Audio.cpp b/src/Nazara/Audio/Audio.cpp -index 153c9f585..02f8a6c86 100644 ---- a/src/Nazara/Audio/Audio.cpp -+++ b/src/Nazara/Audio/Audio.cpp -@@ -8,7 +8,7 @@ - #include - #include - #include --#include -+#include - #include - #include - #include -diff --git a/src/Nazara/Audio/OpenALLibrary.cpp b/src/Nazara/Audio/OpenALLibrary.cpp -index e9380a68e..4fcfe990f 100644 ---- a/src/Nazara/Audio/OpenALLibrary.cpp -+++ b/src/Nazara/Audio/OpenALLibrary.cpp -@@ -3,6 +3,7 @@ - // For conditions of distribution and use, see copyright notice in Config.hpp - - #include -+#include - #include - #include - #include -@@ -23,6 +24,16 @@ namespace Nz - - CallOnExit unloadOnFailure([this] { Unload(); }); - -+ auto PostLoad = [&] -+ { -+ m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); -+ m_isLoaded = true; -+ -+ unloadOnFailure.Reset(); -+ }; -+ -+#ifndef NAZARA_AUDIO_OPENAL_LINK -+ // Dynamically load OpenAL - #if defined(NAZARA_PLATFORM_WINDOWS) - std::array libs{ - "soft_oal.dll", -@@ -74,15 +85,32 @@ namespace Nz - continue; - } - -- m_hasCaptureSupport = alcIsExtensionPresent(nullptr, "ALC_EXT_CAPTURE"); -- -- unloadOnFailure.Reset(); -+ PostLoad(); - return true; - } - - NazaraError("failed to load OpenAL library"); - return false; -- } -+ -+#else -+ // OpenAL is linked to the executable -+ -+ // Load core -+#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = &::name; -+#define NAZARA_AUDIO_AL_EXT_FUNCTION(name) -+#include -+ -+ // Load ext -+#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) -+#define NAZARA_AUDIO_AL_EXT_BEGIN(ext) if (alIsExtensionPresent(#ext)) { -+#define NAZARA_AUDIO_AL_EXT_END() } -+#define NAZARA_AUDIO_AL_FUNCTION_EXT(name) name = reinterpret_cast(alGetProcAddress(#name)); -+#include -+ -+ PostLoad(); -+ return true; -+#endif -+ } - - std::vector OpenALLibrary::QueryInputDevices() - { -@@ -111,10 +139,8 @@ namespace Nz - if (!m_library.IsLoaded()) - return; - --#define NAZARA_AUDIO_FUNC(name, sig) name = nullptr; -- NAZARA_AUDIO_FOREACH_AL_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) -- NAZARA_AUDIO_FOREACH_ALC_FUNC(NAZARA_AUDIO_FUNC, NAZARA_AUDIO_FUNC) --#undef NAZARA_AUDIO_FUNC -+#define NAZARA_AUDIO_AL_ALC_FUNCTION(name) name = nullptr; -+#include - - m_library.Unload(); - } -diff --git a/src/Nazara/Audio/OpenALSource.cpp b/src/Nazara/Audio/OpenALSource.cpp -index d4bf7a808..98d163b79 100644 ---- a/src/Nazara/Audio/OpenALSource.cpp -+++ b/src/Nazara/Audio/OpenALSource.cpp -@@ -4,6 +4,7 @@ - - #include - #include -+#include - #include - #include - #include -@@ -84,18 +85,20 @@ namespace Nz - auto OpenALSource::GetSampleOffsetAndLatency() const -> OffsetWithLatency - { - OffsetWithLatency offsetWithLatency; -- if (GetDevice().IsExtensionSupported(OpenALExtension::SourceLatency)) -+#ifndef NAZARA_PLATFORM_WEB -+ /*if (GetDevice().IsExtensionSupported(OpenALExtension::SourceLatency)) - { - GetDevice().MakeContextCurrent(); - -- std::array values; -+ std::array values; - m_library.alGetSourcei64vSOFT(m_sourceId, AL_SAMPLE_OFFSET_LATENCY_SOFT, values.data()); - - offsetWithLatency.sampleOffset = ((values[0] & 0xFFFFFFFF00000000) >> 32) * 1'000; - offsetWithLatency.sourceLatency = values[1] / 1'000; - - } -- else -+ else*/ -+#endif - { - offsetWithLatency.sampleOffset = GetSampleOffset() * 1'000; - offsetWithLatency.sourceLatency = 0; -diff --git a/src/Nazara/Graphics/DebugDrawPipelinePass.cpp b/src/Nazara/Graphics/DebugDrawPipelinePass.cpp -index 2eb17dddf..a0876d3e3 100644 ---- a/src/Nazara/Graphics/DebugDrawPipelinePass.cpp -+++ b/src/Nazara/Graphics/DebugDrawPipelinePass.cpp -@@ -44,8 +44,8 @@ namespace Nz - builder.SetScissor(viewport); - builder.SetViewport(viewport); - -- DebugDrawer& debugDrawer = m_pipeline.GetDebugDrawer(); -- debugDrawer.Draw(builder); -+ //DebugDrawer& debugDrawer = m_pipeline.GetDebugDrawer(); -+ //debugDrawer.Draw(builder); - }); - } - } -diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp -index 2f5ffda80..2e4e1337e 100644 ---- a/src/Nazara/Graphics/ForwardFramePipeline.cpp -+++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp -@@ -161,7 +161,7 @@ namespace Nz - auto& viewerData = *m_viewerPool.Allocate(viewerIndex); - viewerData.renderOrder = renderOrder; - viewerData.debugDrawPass = std::make_unique(*this, viewerInstance); -- viewerData.depthPrepass = std::make_unique(*this, m_elementRegistry, viewerInstance); -+ //viewerData.depthPrepass = std::make_unique(*this, m_elementRegistry, viewerInstance); - viewerData.forwardPass = std::make_unique(*this, m_elementRegistry, viewerInstance); - viewerData.viewer = viewerInstance; - viewerData.onTransferRequired.Connect(viewerInstance->GetViewerInstance().OnTransferRequired, [this](TransferInterface* transferInterface) -diff --git a/src/Nazara/Graphics/ForwardPipelinePass.cpp b/src/Nazara/Graphics/ForwardPipelinePass.cpp -index a860a6ddc..bd4f17cb8 100644 ---- a/src/Nazara/Graphics/ForwardPipelinePass.cpp -+++ b/src/Nazara/Graphics/ForwardPipelinePass.cpp -@@ -297,6 +297,11 @@ namespace Nz - elementRenderer.Render(viewerInstance, *m_elementRendererData[elementType], builder, elementCount, elements); - }); - -+ DebugDrawer& debugDrawer = m_pipeline.GetDebugDrawer(); -+ debugDrawer.Draw(builder); -+ -+ NazaraWarning("----"); -+ - m_rebuildCommandBuffer = false; - }); - } -diff --git a/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp b/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp -index 25d9b384e..a656d74d2 100644 ---- a/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp -+++ b/src/Nazara/OpenGLRenderer/OpenGLCommandBuffer.cpp -@@ -175,7 +175,14 @@ namespace Nz - { - const OpenGLFboFramebuffer& fboFramebuffer = static_cast(*command.framebuffer); - -- context->glDrawBuffers(GLsizei(colorBufferCount), fboDrawBuffers.data()); -+ // TODO: glDrawBuffers should be called only at FBO setup -+ if (colorBufferCount > 0) -+ context->glDrawBuffers(GLsizei(colorBufferCount), fboDrawBuffers.data()); -+ else -+ { -+ GLenum buffer = GL_NONE; -+ context->glDrawBuffers(1, &buffer); -+ } - - invalidateAttachments = NazaraStackVector(GLenum, colorBufferCount + 1); - -@@ -246,13 +253,13 @@ namespace Nz - assert(command.framebuffer->GetType() == FramebufferType::Window); - - // glDrawBuffers doesn't accept GL_BACK on OpenGL non-ES, and glDrawBuffer must be used instead -- if (context->glDrawBuffer) -+ /*if (context->GetParams().type != GL::ContextType::OpenGL_ES && context->glDrawBuffer) - context->glDrawBuffer(GL_BACK); - else - { - GLenum buffer = GL_BACK; - context->glDrawBuffers(1, &buffer); -- } -+ }*/ - - invalidateAttachments = NazaraStackVector(GLenum, 3); //< color + depth + stencil - -diff --git a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp -index 478a904a1..355cf46ac 100644 ---- a/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp -+++ b/src/Nazara/OpenGLRenderer/Wrapper/Context.cpp -@@ -22,6 +22,12 @@ namespace Nz::GL - - namespace - { -+ constexpr std::array s_functionNames = { -+#define NAZARA_OPENGLRENDERER_FUNC(name, sig) #name, -+ NAZARA_OPENGLRENDERER_FOREACH_GLES_FUNC(NAZARA_OPENGLRENDERER_FUNC, NAZARA_OPENGLRENDERER_FUNC) -+#undef NAZARA_OPENGLRENDERER_FUNC -+ }; -+ - template - struct GLWrapper; - -@@ -41,13 +47,13 @@ namespace Nz::GL - { - funcPtr(std::forward(args)...); - -- context->ProcessErrorStack(); -+ context->ProcessErrorStack(FuncIndex, std::forward(args)...); - } - else - { - Ret r = funcPtr(std::forward(args)...); - -- context->ProcessErrorStack(); -+ context->ProcessErrorStack(FuncIndex, std::forward(args)...); - - return r; - } -@@ -139,9 +145,14 @@ namespace Nz::GL - - GLenum Context::BindFramebuffer(GLuint fbo) const - { -- if (m_state.boundDrawFBO == fbo) -+#ifdef NAZARA_PLATFORM_WEB -+ constexpr bool isWeb = true; -+#else -+ constexpr bool isWeb = false; -+#endif -+ if (m_state.boundDrawFBO == fbo && !isWeb) - return GL_DRAW_FRAMEBUFFER; -- else if (m_state.boundReadFBO == fbo) -+ else if (m_state.boundReadFBO == fbo && !isWeb) - return GL_READ_FRAMEBUFFER; - else - { -@@ -163,7 +174,7 @@ namespace Nz::GL - #else - constexpr bool isWeb = false; - #endif -- if (currentFbo != fbo || isWeb); -+ if (currentFbo != fbo || isWeb) - { - if (!SetCurrentContext(this)) - throw std::runtime_error("failed to activate context"); -@@ -271,6 +282,9 @@ namespace Nz::GL - - void Context::BindVertexArray(GLuint vertexArray, bool force) const - { -+#ifdef NAZARA_PLATFORM_WEB -+ force = true; -+#endif - if (m_state.boundVertexArray != vertexArray || force) - { - if (!SetCurrentContext(this)) -@@ -355,7 +369,7 @@ namespace Nz::GL - } - - SymbolLoader loader(*this); -- loader.wrapErrorHandling = params.wrapErrorHandling; -+ //loader.wrapErrorHandling = params.wrapErrorHandling; - - try - { -@@ -594,6 +608,34 @@ namespace Nz::GL - return hasAnyError; - } - -+ template -+ bool Context::ProcessErrorStack(std::size_t funcIndex, Args... args) const -+ { -+ if (!ProcessErrorStack()) -+ return false; -+ -+ std::stringstream ss; -+ ss << s_functionNames[funcIndex] << "("; -+ if constexpr (sizeof...(args) > 0) -+ { -+ bool first = true; -+ auto PrintParam = [&](auto value) -+ { -+ if (!first) -+ ss << ", "; -+ -+ ss << +value; -+ first = false; -+ }; -+ -+ (PrintParam(args), ...); -+ } -+ ss << ")"; -+ NazaraDebug(ss.str()); -+ -+ return true; -+ } -+ - void Context::SetCurrentTextureUnit(UInt32 textureUnit) const - { - if (m_state.currentTextureUnit != textureUnit) -@@ -616,7 +658,7 @@ namespace Nz::GL - if (!SetCurrentContext(this)) - throw std::runtime_error("failed to activate context"); - -- glScissor(x, y, width, height); -+ //glScissor(x, y, width, height); - - m_state.scissorBox.x = x; - m_state.scissorBox.y = y; -diff --git a/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp b/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp -index eb0137a4d..d80bdd0a0 100644 ---- a/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp -+++ b/src/Nazara/OpenGLRenderer/Wrapper/WGL/WGLLoader.cpp -@@ -52,11 +52,11 @@ namespace Nz::GL - ContextParams params; - // Favor OpenGL on desktop and OpenGL ES on mobile - std::array contextTypes = { --#if defined(NAZARA_PLATFORM_DESKTOP) -+/*#if defined(NAZARA_PLATFORM_DESKTOP) - GL::ContextType::OpenGL, GL::ContextType::OpenGL_ES --#else -+#else*/ - GL::ContextType::OpenGL_ES, GL::ContextType::OpenGL --#endif -+//#endif - }; - - bool created = false; -diff --git a/xmake.lua b/xmake.lua -index ff6b6b31c..8b72ebaf1 100644 ---- a/xmake.lua -+++ b/xmake.lua -@@ -54,7 +54,17 @@ local modules = { - Deps = {"NazaraCore"}, - Packages = {"dr_wav", "frozen", "libflac", "libvorbis", "minimp3"}, - Custom = function () -- add_packages("openal-soft", { links = {} }) -- Don't link OpenAL (it will be loaded dynamically) -+ if is_plat("wasm") or has_config("link_openal") then -+ add_defines("NAZARA_AUDIO_OPENAL_LINK") -+ add_defines("AL_ALEXT_PROTOTYPES") -+ if is_plat("wasm") then -+ add_syslinks("openal") -+ else -+ add_packages("openal-soft") -+ end -+ else -+ add_packages("openal-soft", { links = {} }) -+ end - end - }, - Core = { -@@ -157,8 +167,8 @@ if not has_config("embed_rendererbackends") then - end - end - --add_ldflags("-g -s NO_DISABLE_EXCEPTION_CATCHING -s ALLOW_MEMORY_GROWTH=1") --add_cxflags("-g -s NO_DISABLE_EXCEPTION_CATCHING") -+add_ldflags("-g", "-sNO_DISABLE_EXCEPTION_CATCHING", "-sALLOW_MEMORY_GROWTH", "-sWASM_BIGINT") -+add_cxflags("-g", "-sNO_DISABLE_EXCEPTION_CATCHING", "-sERROR_ON_WASM_CHANGES_AFTER_LINK") - - NazaraModules = modules - -@@ -167,6 +177,7 @@ includes("xmake/**.lua") - option("compile_shaders", { description = "Compile nzsl shaders into an includable binary version", default = true }) - option("embed_rendererbackends", { description = "Embed renderer backend code into NazaraRenderer instead of loading them dynamically", default = false }) - option("embed_resources", { description = "Turn builtin resources into includable headers", default = true }) -+option("link_openal", { description = "Link OpenAL in the executable instead of dynamically loading it", default = false }) - option("override_runtime", { description = "Override vs runtime to MD in release and MDd in debug", default = true }) - option("usepch", { description = "Use precompiled headers to speedup compilation", default = false }) - option("unitybuild", { description = "Build the engine using unity build", default = false }) -@@ -174,15 +185,17 @@ option("unitybuild", { description = "Build the engine using unity build", defau - set_project("NazaraEngine") - set_xmakever("2.7.3") - --add_requires("dr_wav", "entt 3.10.1", "fmt", "frozen", "kiwisolver", "minimp3", "ordered_map", "stb") -+add_requires("dr_wav", "entt 3.10.1", "fmt", "frozen", "libflac", "kiwisolver", "minimp3", "ordered_map", "stb") -+add_requires("libvorbis", { configs = { with_vorbisenc = false } }) - if not is_plat("wasm") then -- add_requires("chipmunk2d", "libsdl", "libflac", "efsw") -+ add_requires("chipmunk2d", "libsdl", "efsw") - add_requires("freetype", { configs = { bzip2 = true, png = true, woff2 = true, zlib = true, debug = is_mode("debug") } }) -- add_requires("libvorbis", { configs = { with_vorbisenc = false } }) - add_requires("openal-soft", { configs = { shared = true }}) - add_requires("newtondynamics3", { debug = is_plat("windows") and is_mode("debug") }) -- Newton doesn't like compiling in Debug on Linux - end - -+add_repositories("local-repo xmake-repo") -+ - add_repositories("nazara-engine-repo https://github.com/NazaraEngine/xmake-repo") - add_requires("nazarautils") - add_requires("nzsl", { debug = is_mode("debug"), configs = { with_symbols = not is_mode("release"), shared = not is_plat("wasm") } }) diff --git a/xmake.lua b/xmake.lua index 0e6b97261..adade444c 100644 --- a/xmake.lua +++ b/xmake.lua @@ -191,8 +191,8 @@ includes("xmake/**.lua") option("compile_shaders", { description = "Compile nzsl shaders into an includable binary version", default = true }) option("embed_rendererbackends", { description = "Embed renderer backend code into NazaraRenderer instead of loading them dynamically", default = false }) option("embed_resources", { description = "Turn builtin resources into includable headers", default = true }) -option("embed_plugins", { description = "Embed enabled plugins code as static libraries", default = false }) -option("link_openal", { description = "Link OpenAL in the executable instead of dynamically loading it", default = false }) +option("embed_plugins", { description = "Embed enabled plugins code as static libraries", default = is_plat("wasm") }) +option("link_openal", { description = "Link OpenAL in the executable instead of dynamically loading it", default = is_plat("wasm") }) option("override_runtime", { description = "Override vs runtime to MD in release and MDd in debug", default = true }) option("usepch", { description = "Use precompiled headers to speedup compilation", default = false }) option("unitybuild", { description = "Build the engine using unity build", default = false })