summaryrefslogtreecommitdiffhomepage
path: root/bench
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2024-02-04 19:55:02 +0100
committerStanislaw Halik <sthalik@misaki.pl>2024-02-04 19:55:02 +0100
commite97eca9db2be08c4af752b8c16bb044990f72228 (patch)
tree4edbb16e4745cc012e083ee87df6d229d0179797 /bench
parentaa3db4c1757b9b597e32997e938cdbc7752755c4 (diff)
w
Diffstat (limited to 'bench')
-rw-r--r--bench/raycast.cpp62
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);