]> git.seodisparate.com - jumpartifact.com_demo_0/commitdiff
Allocate SurfaceTriangles on the heap (fix wasm)
authorStephen Seo <seo.disparate@gmail.com>
Mon, 21 Aug 2023 06:07:03 +0000 (15:07 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Mon, 21 Aug 2023 06:07:03 +0000 (15:07 +0900)
src/screen_trunner.cc
src/screen_trunner.h
src/surface_triangle.h

index 24f55300f5db8b3b3679aa4950ac7040a593e799..bef1e76128e65a80eacd50cad3db3618b30986d8 100644 (file)
@@ -247,7 +247,7 @@ post_check_click:
     if (surface_reset_anim_timer > SURFACE_RESET_TIME) {
       flags.reset(0);
     } else {
-      for (auto &tri : surface_triangles) {
+      for (auto &tri : *surface_triangles) {
         tri.update(dt);
       }
     }
@@ -335,9 +335,9 @@ bool TRunnerScreen::draw() {
         unsigned char alpha =
             ((1.0F - surface_reset_anim_timer / SURFACE_RESET_TIME_TRI_DRAW) *
              255.0F);
-        surface_triangles.at(x * 2 + y * SURFACE_UNIT_WIDTH * 2)
+        surface_triangles->at(x * 2 + y * SURFACE_UNIT_WIDTH * 2)
             .draw(Color{color.r, color.g, color.b, alpha});
-        surface_triangles.at(x * 2 + 1 + y * SURFACE_UNIT_WIDTH * 2)
+        surface_triangles->at(x * 2 + 1 + y * SURFACE_UNIT_WIDTH * 2)
             .draw(Color{color.r, color.g, color.b, alpha});
       }
     }
index 8b460422fe933a82fbbfe3e02baa5994e3ca79a3..ab278845ed30f4b015426303c2299690f3c2c13f 100644 (file)
@@ -6,6 +6,7 @@
 // standard library includes
 #include <array>
 #include <bitset>
+#include <memory>
 #include <optional>
 
 // third party includes
@@ -62,8 +63,6 @@ class TRunnerScreen : public Screen {
              SURFACE_UNIT_WIDTH * SURFACE_UNIT_HEIGHT>
       surface;
   std::array<BoundingBox, SURFACE_UNIT_WIDTH * SURFACE_UNIT_HEIGHT> surface_bbs;
-  std::array<SurfaceTriangle, SURFACE_UNIT_WIDTH * SURFACE_UNIT_HEIGHT * 2>
-      surface_triangles;
   std::array<Walker, 4> walkers;
 
   Camera3D camera;
@@ -79,6 +78,9 @@ class TRunnerScreen : public Screen {
   Vector3 camera_pos;
   Vector3 camera_target;
   Vector3 mouse_hit;
+  std::unique_ptr<std::array<SurfaceTriangle,
+                             SURFACE_UNIT_WIDTH * SURFACE_UNIT_HEIGHT * 2> >
+      surface_triangles;
   unsigned int idx_hit;
   std::optional<unsigned int> controlled_walker_idx;
   const int left_text_width;
index b13539e4f1b7342b02a2da3a756abf58a80e32f2..1b09d1304bb4eec0f0457e33908eef389fce249c 100644 (file)
@@ -3,6 +3,7 @@
 
 // standard library includes
 #include <array>
+#include <memory>
 
 // third party includes
 #include <raylib.h>
@@ -29,10 +30,11 @@ struct SurfaceTriangle {
 };
 
 template <typename SurfaceUnitOptT, std::size_t ASize>
-extern std::array<SurfaceTriangle, ASize * 2> surface_to_triangles(
-    const std::array<SurfaceUnitOptT, ASize> &surface,
-    const std::size_t width) {
-  std::array<SurfaceTriangle, ASize * 2> triangles;
+extern std::unique_ptr<std::array<SurfaceTriangle, ASize * 2> >
+surface_to_triangles(const std::array<SurfaceUnitOptT, ASize> &surface,
+                     const std::size_t width) {
+  std::unique_ptr<std::array<SurfaceTriangle, ASize * 2> > triangles =
+      std::make_unique<std::array<SurfaceTriangle, ASize * 2> >();
 
   for (std::size_t idx = 0; idx < ASize; ++idx) {
     std::size_t x = idx % width;
@@ -44,20 +46,20 @@ extern std::array<SurfaceTriangle, ASize * 2> surface_to_triangles(
     std::size_t toffset = x * 2 + y * width * 2;
 
     if (!surface[idx].has_value()) {
-      triangles.at(toffset) = SurfaceTriangle();
-      triangles.at(toffset + 1) = SurfaceTriangle();
+      triangles->at(toffset) = SurfaceTriangle();
+      triangles->at(toffset + 1) = SurfaceTriangle();
       continue;
     }
 
     const auto &surface_unit = surface[idx].value();
-    triangles.at(toffset) = SurfaceTriangle(
+    triangles->at(toffset) = SurfaceTriangle(
         Vector3{0.5F, surface_unit.ne, -0.5F},
         Vector3{-0.5F, surface_unit.nw, -0.5F},
         Vector3{-0.5F, surface_unit.sw, 0.5F},
         Vector3{posx,
                 (surface_unit.ne + surface_unit.nw + surface_unit.sw) / 3.0F,
                 posz});
-    triangles.at(toffset + 1) = SurfaceTriangle(
+    triangles->at(toffset + 1) = SurfaceTriangle(
         Vector3{0.5F, surface_unit.ne, -0.5F},
         Vector3{-0.5F, surface_unit.sw, 0.5F},
         Vector3{0.5F, surface_unit.se, 0.5F},