#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include NAZARA_REQUEST_DEDICATED_GPU() int main() { std::filesystem::path resourceDir = "resources"; if (!std::filesystem::is_directory(resourceDir) && std::filesystem::is_directory(".." / resourceDir)) resourceDir = ".." / resourceDir; Nz::Renderer::Config rendererConfig; std::cout << "Run using Vulkan? (y/n)" << std::endl; if (std::getchar() != 'n') rendererConfig.preferredAPI = Nz::RenderAPI::Vulkan; else rendererConfig.preferredAPI = Nz::RenderAPI::OpenGL; std::cin.ignore(std::numeric_limits::max(), '\n'); Nz::Modules nazara(rendererConfig); Nz::RenderWindow window; std::shared_ptr device = Nz::Graphics::Instance()->GetRenderDevice(); std::string windowTitle = "Graphics Test"; if (!window.Create(device, Nz::VideoMode(1920, 1080, 32), windowTitle)) { std::cout << "Failed to create Window" << std::endl; return __LINE__; } entt::registry registry; Nz::Physics2DSystem physSytem(registry); physSytem.GetPhysWorld().SetGravity({ 0.f, -9.81f }); Nz::RenderSystem renderSystem(registry); entt::entity viewer = registry.create(); { registry.emplace(viewer); auto& cameraComponent = registry.emplace(viewer, window.GetRenderTarget(), Nz::ProjectionType::Orthographic); cameraComponent.UpdateRenderMask(1); cameraComponent.UpdateClearColor(Nz::Color(127, 127, 127)); } std::shared_ptr material = std::make_shared(); std::shared_ptr materialPass = std::make_shared(Nz::BasicMaterial::GetSettings()); material->AddPass("ForwardPass", materialPass); Nz::TextureSamplerInfo samplerInfo; samplerInfo.anisotropyLevel = 8; Nz::TextureParams texParams; texParams.renderDevice = device; texParams.loadFormat = Nz::PixelFormat::RGBA8_SRGB; Nz::BasicMaterial basicMat(*materialPass); basicMat.SetDiffuseMap(Nz::Texture::LoadFromFile(resourceDir / "Spaceship/Texture/diffuse.png", texParams)); basicMat.SetDiffuseSampler(samplerInfo); for (std::size_t y = 0; y < 10; ++y) { for (std::size_t x = 0; x < 10; ++x) { entt::entity spriteEntity = registry.create(); { std::shared_ptr sprite = std::make_shared(material); sprite->SetSize({ 32.f, 32.f }); sprite->SetOrigin({ 16.f, 16.f, 0.f }); registry.emplace(spriteEntity).SetPosition(1920 / 2 + x * 36.f, 1080 / 2 + y * 36.f); registry.emplace(spriteEntity).AttachRenderable(sprite, 1); auto& rigidBody = registry.emplace(spriteEntity, physSytem.CreateRigidBody(50.f, std::make_shared(Nz::Vector2f(32.f, 32.f)))); rigidBody.SetElasticity(0.99f); } } } entt::entity groundEntity = registry.create(); { std::shared_ptr whiteMaterial = std::make_shared(); std::shared_ptr materialPass = std::make_shared(Nz::BasicMaterial::GetSettings()); whiteMaterial->AddPass("ForwardPass", materialPass); std::shared_ptr sprite = std::make_shared(whiteMaterial); sprite->SetSize({ 800.f, 20.f }); sprite->SetOrigin({ 400.f, 10.f, 0.f }); registry.emplace(groundEntity).SetPosition(1920.f / 2.f, 50.f); registry.emplace(groundEntity).AttachRenderable(sprite, 1); auto& rigidBody = registry.emplace(groundEntity, physSytem.CreateRigidBody(0.f, std::make_shared(Nz::Vector2f(800.f, 20.f)))); rigidBody.SetElasticity(0.99f); } Nz::EulerAnglesf camAngles(0.f, 0.f, 0.f); Nz::Quaternionf camQuat(camAngles); window.EnableEventPolling(true); Nz::Clock updateClock; Nz::Clock secondClock; unsigned int fps = 0; //Nz::Mouse::SetRelativeMouseMode(true); float elapsedTime = 0.f; Nz::UInt64 time = Nz::GetElapsedMicroseconds(); Nz::PidController headingController(0.5f, 0.f, 0.05f); Nz::PidController upController(1.f, 0.f, 0.1f); bool showColliders = false; while (window.IsOpen()) { Nz::UInt64 now = Nz::GetElapsedMicroseconds(); elapsedTime = (now - time) / 1'000'000.f; time = now; Nz::WindowEvent event; while (window.PollEvent(&event)) { switch (event.type) { case Nz::WindowEventType::Quit: window.Close(); break; case Nz::WindowEventType::KeyPressed: break; case Nz::WindowEventType::MouseMoved: break; default: break; } } if (updateClock.GetMilliseconds() > 1000 / 60) { float updateTime = updateClock.Restart() / 1'000'000.f; physSytem.Update(registry, 1000.f / 60.f); } Nz::RenderFrame frame = window.AcquireFrame(); if (!frame) continue; renderSystem.Render(registry, frame); frame.Present(); fps++; if (secondClock.GetMilliseconds() >= 1000) { window.SetTitle(windowTitle + " - " + Nz::NumberToString(fps) + " FPS" + " - " + Nz::NumberToString(registry.alive()) + " entities"); fps = 0; secondClock.Restart(); } } return EXIT_SUCCESS; }