From 9a3c3cdd046d52afb26771044891e732b6a137eb Mon Sep 17 00:00:00 2001 From: Bensuperpc Date: Tue, 13 Feb 2024 00:08:10 +0100 Subject: [PATCH] Update example, header and screenshot Signed-off-by: Bensuperpc --- README.md | 2 + cmake/lib/raygui.cmake | 4 +- include/astar/astar.hpp | 5 + resources/Screenshot_20240213_000512.png | Bin 0 -> 48989 bytes test/CMakeLists.txt | 16 +- test/source/benchmark/astar_bench.cpp | 2 +- ...ath_finder.cpp => path_finder_compare.cpp} | 0 test/source/benchmark/path_finder_visual.cpp | 211 ++++++++++++++++++ 8 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 resources/Screenshot_20240213_000512.png rename test/source/benchmark/{path_finder.cpp => path_finder_compare.cpp} (100%) create mode 100644 test/source/benchmark/path_finder_visual.cpp diff --git a/README.md b/README.md index 7aadb47..3e1cda9 100755 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ It is an [astar algorithm](https://en.wikipedia.org/wiki/A*_search_algorithm), t ![astar](resources/Screenshot_20240128_093812.png) +![astar](resources/Screenshot_20240213_000512.png) + # Features * [x] Header-only library C++20 diff --git a/cmake/lib/raygui.cmake b/cmake/lib/raygui.cmake index e69dae3..463f0f8 100755 --- a/cmake/lib/raygui.cmake +++ b/cmake/lib/raygui.cmake @@ -12,6 +12,6 @@ if (NOT raygui_FOUND) GIT_TAG 4.0 ) FetchContent_MakeAvailable(raygui) - include_directories(${raygui_SOURCE_DIR}) - include_directories(${raygui_SOURCE_DIR}/src) + include_directories(SYSTEM ${raygui_SOURCE_DIR}) + include_directories(SYSTEM ${raygui_SOURCE_DIR}/src) endif() \ No newline at end of file diff --git a/include/astar/astar.hpp b/include/astar/astar.hpp index b4e03fa..9aa8816 100644 --- a/include/astar/astar.hpp +++ b/include/astar/astar.hpp @@ -1,3 +1,8 @@ +/* + * Header only library of A* algorithm by Bensuperpc + * MIT License + */ + #pragma once #include diff --git a/resources/Screenshot_20240213_000512.png b/resources/Screenshot_20240213_000512.png new file mode 100644 index 0000000000000000000000000000000000000000..e85643f3adcd123b0c4725c8d6bb1208d84258e4 GIT binary patch literal 48989 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 N|MhQH{o6Yq{$GCAasmJV literal 0 HcmV?d00001 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 19d8ce2..b6f20e9 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -14,10 +14,19 @@ endif() function(test_bench_generator TEST_BENCH_NAME IS_TEST ADD_TO_TEST) + + set(SOURCES + "source/generator/generator.cpp" + ) + + set(HEADERS + "source/generator/generator.hpp" + ) + if (IS_TEST) - add_executable("${TEST_BENCH_NAME}" "source/test/${TEST_BENCH_NAME}.cpp" source/generator/generator.cpp source/generator/generator.hpp) + add_executable("${TEST_BENCH_NAME}" "source/test/${TEST_BENCH_NAME}.cpp" ${SOURCES} ${HEADERS}) else() - add_executable("${TEST_BENCH_NAME}" "source/benchmark/${TEST_BENCH_NAME}.cpp" source/generator/generator.cpp source/generator/generator.hpp) + add_executable("${TEST_BENCH_NAME}" "source/benchmark/${TEST_BENCH_NAME}.cpp" ${SOURCES} ${HEADERS}) endif() @@ -74,7 +83,8 @@ if(NOT WIN32) test_bench_generator(astar_test true true) test_bench_generator(astar_bench false true) - test_bench_generator(path_finder false false) + test_bench_generator(path_finder_compare false false) + test_bench_generator(path_finder_visual false false) endif() # ---- End-of-file commands ---- diff --git a/test/source/benchmark/astar_bench.cpp b/test/source/benchmark/astar_bench.cpp index a078308..056e803 100644 --- a/test/source/benchmark/astar_bench.cpp +++ b/test/source/benchmark/astar_bench.cpp @@ -9,7 +9,7 @@ static constexpr int64_t multiplier = 4; static constexpr int64_t minRange = 16; -static constexpr int64_t maxRange = 256; +static constexpr int64_t maxRange = 1024; static constexpr int64_t minThreadRange = 1; static constexpr int64_t maxThreadRange = 1; static constexpr int64_t repetitions = 1; diff --git a/test/source/benchmark/path_finder.cpp b/test/source/benchmark/path_finder_compare.cpp similarity index 100% rename from test/source/benchmark/path_finder.cpp rename to test/source/benchmark/path_finder_compare.cpp diff --git a/test/source/benchmark/path_finder_visual.cpp b/test/source/benchmark/path_finder_visual.cpp new file mode 100644 index 0000000..e45c36d --- /dev/null +++ b/test/source/benchmark/path_finder_visual.cpp @@ -0,0 +1,211 @@ +#include // std::array +#include // std::chrono::system_clock +#include // std::abs +#include // std::uint32_t +#include // std::cout, std::endl +#include // std::map +#include // std::unique_ptr +#include // std::random_device, std::mt19937, std::uniform_int_distribution +#include // std::vector + +#include "astar/astar.hpp" +#include "generator/generator.hpp" + +#include "raylib.h" + +#define RAYGUI_IMPLEMENTATION +extern "C" { +#include "src/raygui.h" +} + +auto main() -> int { + // Set log level for Raylib + SetTraceLogLevel(LOG_WARNING); + + const int screenWidth = 1920; + const int screenHeight = 1080; + + const int mapWidth = 192; + const int mapHeight = 108; + + const uint32_t targetFPS = 120; + + const uint32_t ImageUpdatePerSecond = 30; + + SetConfigFlags(FLAG_WINDOW_RESIZABLE | FLAG_MSAA_4X_HINT); + InitWindow(screenWidth, screenHeight, "Path finder by Bensuperpc"); + + SetTargetFPS(targetFPS); + + float lacunarity = 1.6f; + float octaves = 6; + float gain = 3.5f; + float frequency = 1.7f; + float weighted_strength = 0.034f; + float multiplier = 118; + + Generator generator_2(-972960945); + generator_2.setLacunarity(lacunarity); + generator_2.setOctaves((uint32_t)octaves); + generator_2.setGain(gain); + generator_2.setFrequency(frequency); + generator_2.setWeightedStrength(0.0f); + generator_2.setMultiplier((uint32_t)multiplier); + + AStar::AStar pathFinder; + pathFinder.setWorldSize({mapWidth, mapHeight}); + pathFinder.setHeuristic(AStar::Heuristic::manhattan); + pathFinder.setDiagonalMovement(true); + + size_t pathSize = 0; + + std::vector heightmap; + + heightmap = generator_2.generate2dMeightmap(0, 0, 0, mapWidth, 0, mapHeight); + + std::vector blocks = std::vector(mapWidth * mapHeight, 0); + + uint64_t framesCounter = 0; + + bool needUpdate = true; + + while (!WindowShouldClose()) { + framesCounter++; + if (IsKeyPressed(KEY_S)) { + const std::string filename = "screenshot_" + std::to_string(std::chrono::system_clock::now().time_since_epoch().count()) + ".png"; + TakeScreenshot(filename.c_str()); + } + if (IsKeyPressed(KEY_R)) { + generator_2.randomizeSeed(); + needUpdate = true; + } + + if (framesCounter % (targetFPS / ImageUpdatePerSecond) == 0) { + if (needUpdate) { + needUpdate = false; + generator_2.setLacunarity(lacunarity); + generator_2.setOctaves((uint32_t)octaves); + generator_2.setGain(gain); + generator_2.setFrequency(frequency); + generator_2.setWeightedStrength(weighted_strength); + generator_2.setMultiplier((uint32_t)multiplier); + + pathFinder.clear(); + + heightmap = generator_2.generate2dMeightmap(0, 0, 0, screenWidth, 0, screenHeight); + + for (uint64_t x = 0; x < mapWidth; x++) { + for (uint64_t y = 0; y < mapHeight; y++) { + uint64_t index = x + y * mapWidth; + uint8_t value = static_cast(heightmap[index]); + + if (value < 128) { + blocks[index] = 0; + } else { + blocks[index] = 1; + pathFinder.addObstacle({static_cast(x), static_cast(y)}); + } + } + } + blocks[0] = 0; + pathFinder.removeObstacle({0, 0}); + blocks[mapWidth * mapHeight - 1] = 0; + pathFinder.removeObstacle({mapWidth - 1, mapHeight - 1}); + + pathFinder.setHeuristic(AStar::Heuristic::euclidean); + + std::function* node)> debugCurrentNode = [&](const AStar::Node* node) { + uint64_t index = node->pos.x + node->pos.y * mapWidth; + blocks[index] = 3; + }; + + pathFinder.setDebugCurrentNode(debugCurrentNode); + + std::function* node)> debugOpenNode = [&](const AStar::Node* node) { + uint64_t index = node->pos.x + node->pos.y * mapWidth; + blocks[index] = 4; + }; + + pathFinder.setDebugOpenNode(debugOpenNode); + + auto start1 = std::chrono::high_resolution_clock::now(); + auto path = pathFinder.findPath({0, 0}, {mapWidth - 1, mapHeight - 1}); + auto stop1 = std::chrono::high_resolution_clock::now(); + if (path.empty()) { + std::cout << "Path not found" << std::endl; + } + auto duration1 = std::chrono::duration_cast(stop1 - start1); + std::cout << "Path search: " << duration1.count() << " microseconds" << std::endl; + + pathSize = path.size(); + for (auto& i : path) { + uint64_t index = i.x + i.y * mapWidth; + blocks[index] = 2; + } + } + } + + ClearBackground(RAYWHITE); + BeginDrawing(); + + // Draw white if blocks[index] == 0 else black + int size = 10; + for (uint64_t x = 0; x < mapWidth; x++) { + for (uint64_t y = 0; y < mapHeight; y++) { + uint64_t index = x + y * mapWidth; + if (blocks[index] == 0) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, WHITE); + } else if (blocks[index] == 1) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, BLACK); + } else if (blocks[index] == 2) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, RED); + } else if (blocks[index] == 3) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, GREEN); + } else if (blocks[index] == 4) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, BLUE); + } else if (blocks[index] == 5) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, YELLOW); + } else if (blocks[index] == 6) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, ORANGE); + } else if (blocks[index] == 7) { + DrawRectangle(static_cast(x * size), static_cast(y * size), size, size, PURPLE); + } + } + } + + // display FPS + DrawRectangle(screenWidth - 90, 10, 80, 20, Fade(SKYBLUE, 0.95f)); + DrawText(TextFormat("FPS: %02d", GetFPS()), screenWidth - 80, 15, 15, DARKGRAY); + + DrawRectangle(0, 0, 275, 200, Fade(SKYBLUE, 0.95f)); + DrawRectangleLines(0, 0, 275, 200, BLUE); + GuiSlider((Rectangle){70, 10, 165, 20}, "Lacunarity", TextFormat("%2.3f", lacunarity), &lacunarity, -0.0f, 5.0f); + GuiSlider((Rectangle){70, 40, 165, 20}, "Octaves", TextFormat("%2.3f", octaves), &octaves, 1, 12); + GuiSlider((Rectangle){70, 70, 165, 20}, "Gain", TextFormat("%2.3f", gain), &gain, -0.0f, 16.0f); + GuiSlider((Rectangle){70, 100, 165, 20}, "Frequency", TextFormat("%2.3f", frequency), &frequency, -0.0f, 10.0f); + GuiSlider((Rectangle){70, 130, 165, 20}, "Weight", TextFormat("%2.3f", weighted_strength), &weighted_strength, -5.0f, 5.0f); + GuiSlider((Rectangle){70, 160, 165, 20}, "Multiplier", TextFormat("%2.3f", multiplier), &multiplier, 1, 512); + + // display info each color for each heuristic + DrawRectangle(0, 200, 275, 190, Fade(SKYBLUE, 0.95f)); + DrawRectangleLines(0, 200, 275, 190, BLUE); + + std::string pathText = "Path: " + std::to_string(pathSize); + DrawRectangle(10, 210, 20, 20, RED); + DrawText(pathText.c_str(), 40, 210, 20, DARKGRAY); + + std::string testedNodesText = "Tested nodes"; + DrawRectangle(10, 240, 20, 20, GREEN); + DrawText(testedNodesText.c_str(), 40, 240, 20, DARKGRAY); + + std::string openNodesText = "Open nodes"; + DrawRectangle(10, 270, 20, 20, BLUE); + DrawText(openNodesText.c_str(), 40, 270, 20, DARKGRAY); + + EndDrawing(); + } + + CloseWindow(); + + return 0; +}