diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2024-02-04 19:55:02 +0100 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2024-02-04 19:55:02 +0100 |
commit | e97eca9db2be08c4af752b8c16bb044990f72228 (patch) | |
tree | 4edbb16e4745cc012e083ee87df6d229d0179797 /bench | |
parent | aa3db4c1757b9b597e32997e938cdbc7752755c4 (diff) |
w
Diffstat (limited to 'bench')
-rw-r--r-- | bench/raycast.cpp | 62 |
1 files changed, 60 insertions, 2 deletions
diff --git a/bench/raycast.cpp b/bench/raycast.cpp index 3baa2958..b19b007c 100644 --- a/bench/raycast.cpp +++ b/bench/raycast.cpp @@ -1,5 +1,9 @@ -#include "src/raycast.hpp" +#include "src/raycast-diag.hpp" +#include "src/world.hpp" +#include "src/wall-atlas.hpp" +#include "loader/loader.hpp" #include <benchmark/benchmark.h> +#include <Magnum/Math/Functions.h> namespace floormat { @@ -7,10 +11,64 @@ namespace { #pragma message("TODO!") +world make_world() +{ + constexpr auto var = (variant_t)-1; + auto wall1_ = loader.wall_atlas("test1"_s); + auto wall2_ = loader.wall_atlas("concrete1"_s); + auto wall1 = wall_image_proto{wall1_, var}; + auto wall2 = wall_image_proto{wall2_, var}; + + auto w = world{}; + w[global_coords{{0, 3, 0}, {15, 0}}].t.wall_north() = wall1; + w[global_coords{{1, 3, 0}, { 0, 0}}].t.wall_north() = wall1; + w[global_coords{{1, 3, 0}, { 0, 0}}].t.wall_north() = wall1; + w[global_coords{{1, 2, 0}, { 1, 15}}].t.wall_west() = wall1; + w[global_coords{{1, 2, 0}, { 1, 14}}].t.wall_west() = wall1; + + w[global_coords{{0, 1, 0}, { 8, 11}}].t.wall_west() = wall2; + w[global_coords{{0, 1, 0}, { 8, 10}}].t.wall_west() = wall2; + w[global_coords{{0, 1, 0}, { 7, 10}}].t.wall_north() = wall2; + + w[global_coords{{0, 1, 0}, { 8, 8}}].t.wall_north() = wall1; + w[global_coords{{0, 1, 0}, {10, 8}}].t.wall_north() = wall1; + w[global_coords{{0, 1, 0}, {12, 8}}].t.wall_west() = wall1; + + w[global_coords{{0, 2, 0}, { 9, 0}}].t.wall_north() = wall1; + w[global_coords{{0, 2, 0}, {10, 0}}].t.wall_north() = wall1; + + return w; +} + [[maybe_unused]] void Raycast(benchmark::State& state) { + constexpr auto run1 = [](world& w, point to, bool b, float len = 0) + { + constexpr auto from = point{{0, 0, 0}, {11,12}, {1,-32}}; + constexpr float fuzz = 8; + auto diag = rc::raycast_diag_s{}; + auto res = raycast_with_diag(diag, w, from, to, 0); + fm_assert(res.success == b); + if (len > 0) + { + auto tmin = res.success ? diag.V.length() : diag.tmin; + fm_assert(len > 1e-6f); + auto diff = Math::abs(tmin - len); + if (diff > fuzz) + fm_abort("|tmin=%f - len=%f| > %f", + (double)tmin, (double)len, (double)fuzz); + } + }; + + auto w = make_world(); + + const auto run = [&] { + run1(w, point{{1, 3, 0}, {0,1}, {-21,23}}, false, 2288); + }; + + run(); for (auto _ : state) - (void)0; + run(); } BENCHMARK(Raycast)->Unit(benchmark::kMicrosecond); |