diff --git a/CMakeLists.txt b/CMakeLists.txt index 0845878..83dc7d8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,6 +27,22 @@ else () ImGui-SFML::ImGui-SFML) endif() +if(TRACE_FRAMES) + message("Building with Tracy") + add_compile_definitions(TRACE_FRAMES) + + include(FetchContent) + FetchContent_Declare( + Tracy + GIT_REPOSITORY https://github.com/wolfpld/tracy.git + GIT_TAG d46ffb4e9f132fc95bdd7d04207d8d669a9d4100 + ) + FetchContent_MakeAvailable(Tracy) + + set(LIBS ${LIBS} + TracyClient) +endif() + add_compile_options(-Wall -Wextra) add_executable(raycasting diff --git a/FrameTracing.h b/FrameTracing.h new file mode 100644 index 0000000..64ca952 --- /dev/null +++ b/FrameTracing.h @@ -0,0 +1,24 @@ +// +// Created by trotfunky on 05/02/24. +// + +#ifndef RAYCASTING_FRAMETRACING_H +#define RAYCASTING_FRAMETRACING_H + +/* + * Basic wrapper to allow enabling and disabling frame tracing using + * Tracy. + * https://github.com/wolfpld/tracy + */ +#ifdef TRACE_FRAMES + #include "tracy/Tracy.hpp" + #define FTrace_FrameMark FrameMark + #define FTrace_Scope ZoneScoped + #define FTrace_NamedScope(name) ZoneScopedN(name) +#else + #define FTrace_FrameMark + #define FTrace_Scope + #define FTrace_NamedScope(name) +#endif /* TRACE_FRAMES */ + +#endif //RAYCASTING_FRAMETRACING_H diff --git a/World.cpp b/World.cpp index d23aa1f..f06b00a 100644 --- a/World.cpp +++ b/World.cpp @@ -9,6 +9,7 @@ #include #include #endif +#include "FrameTracing.h" World::World(int w, int h, sf::Color groundColor, sf::Color ceilingColor, std::vector worldMap) : player(0,0,0), w(w), h(h), map(std::move(worldMap)), @@ -117,6 +118,7 @@ RaycastResult World::castRay(float originX, float originY, float orientation) co * built around left-handed axes (x→,y↓), so the rendered world is * mirrored. This also explains some weird signs for rotations. */ + FTrace_Scope; /* Offsets to get back on the grid from the ray's origin. */ float hOffsetX; float hOffsetY; @@ -177,10 +179,12 @@ RaycastResult World::castRay(float originX, float originY, float orientation) co int i = 0; float hCheckX = originX + hOffsetX; float hCheckY = hOffsetY; + BlockType hHitBlock = BlockType::AIR; /* Bounds + sanity check. */ while (hCheckX >= 0 && hCheckX <= static_cast(w) && hCheckY >= 0 && hCheckY <= static_cast(h) && i < h) { - if (getBlock(floorf(hCheckX), floorf(hCheckY) + hRound) == BlockType::WALL) { + hHitBlock = getBlock(floorf(hCheckX), floorf(hCheckY) + hRound); + if (hHitBlock == BlockType::WALL) { break; } @@ -192,11 +196,12 @@ RaycastResult World::castRay(float originX, float originY, float orientation) co i = 0; float vCheckX = vOffsetX; float vCheckY = originY + vOffsetY; - + BlockType vHitBlock = BlockType::AIR; /* Bounds + sanity check. */ while (vCheckX >= 0 && vCheckX < static_cast(w) && vCheckY >= 0 && vCheckY < static_cast(h) && i < w) { - if (getBlock(floorf(vCheckX) + vRound, floorf(vCheckY)) == BlockType::WALL) { + vHitBlock = getBlock(floorf(vCheckX) + vRound, floorf(vCheckY)); + if (vHitBlock == BlockType::WALL) { break; } @@ -220,13 +225,13 @@ RaycastResult World::castRay(float originX, float originY, float orientation) co result.distance = vDist; result.hitX = vCheckX; result.hitY = vCheckY; + result.hitBlock = vHitBlock; } else { result.distance = hDist; result.hitX = hCheckX; result.hitY = hCheckY; + result.hitBlock = hHitBlock; } - result.hitBlock = getBlock(floorf(result.hitX) + vRound, - floorf(result.hitY)); return result; } @@ -234,6 +239,7 @@ RaycastResult World::castRay(float originX, float originY, float orientation) co void World::fillColumn(sf::RenderWindow& window, unsigned int column, float scale, sf::Color fillColor) { + FTrace_Scope; float columnHeight = static_cast(window.getSize().y)*scale; sf::RectangleShape& pixelColumn = renderColumns[column]; if (pixelColumn.getSize().y != columnHeight) { @@ -249,6 +255,7 @@ void World::fillColumn(sf::RenderWindow& window, unsigned int column, void World::render(sf::RenderWindow& window) { + FTrace_Scope; float windowX = static_cast(window.getSize().x); float windowY = static_cast(window.getSize().y); /* @@ -291,6 +298,7 @@ void World::render(sf::RenderWindow& window) } void World::step(const float& stepTime) { + FTrace_Scope; player.move(player.currentMoveSpeedX*stepTime, player.currentMoveSpeedY*stepTime); /* Undo last move if the player would end up in a wall. */ diff --git a/main.cpp b/main.cpp index 83ef919..a42b76b 100644 --- a/main.cpp +++ b/main.cpp @@ -5,6 +5,7 @@ #include #include #endif +#include "FrameTracing.h" #include "World.h" @@ -37,8 +38,11 @@ int main() sf::Clock frameTime; while (window.isOpen()) { + FTrace_NamedScope("MainLoop"); + while (window.pollEvent(event)) { + FTrace_NamedScope("EventLoop"); if (event.type == sf::Event::Closed) { window.close(); continue; @@ -135,6 +139,7 @@ int main() #endif window.display(); + FTrace_FrameMark; } #ifdef IMGUI