]> git.seodisparate.com/gitweb - RockPaperScissorsDuel/commitdiff
Add "orbit" overview, tweaks to overview handling
authorStephen Seo <seo.disparate@gmail.com>
Fri, 13 Jan 2023 02:18:01 +0000 (11:18 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Fri, 13 Jan 2023 02:18:01 +0000 (11:18 +0900)
src/3d_renderer.cc
src/3d_renderer.h
src/constants.h
src/helpers.cc
src/helpers.h

index 3c11d71b2de08aed34178262d34e38f8092753f3..229ca019e3fccbf089db92f00d9571997841cf64 100644 (file)
@@ -112,21 +112,26 @@ void Renderer3D::update_impl() {
     overview_timer -= dt;
     if (overview_timer <= 0.0F) {
       overview_timer += OVERVIEW_TIMER_MAX;
-      const std::bitset<64> prevFlags = flags;
-      const auto is_same = [](const std::bitset<64> &l,
-                              const std::bitset<64> &r) {
-        return l.test(1) == r.test(1) && l.test(4) == r.test(4) &&
-               l.test(5) == r.test(5);
+      const decltype(flags) prevFlags = flags;
+      const auto is_same = [](const decltype(flags) &l,
+                              const decltype(flags) &r) {
+        return l.test(4) == r.test(4) && l.test(5) == r.test(5) &&
+               l.test(6) == r.test(6);
       };
-      while (is_same(prevFlags, flags)) {
+      while (is_same(prevFlags, flags) ||
+             (flags.test(6) && (flags.test(4) || flags.test(5)))) {
 #ifdef __EMSCRIPTEN__
         flags.set(1, call_js_get_random() > 0.5F);
-        flags.set(4, call_js_get_random() > 0.5F);
-        flags.set(5, call_js_get_random() > 0.5F);
+        int value = call_js_get_random() * 4.99F;
+        flags.set(4, (value & 1) != 0);
+        flags.set(5, (value & 2) != 0);
+        flags.set(6, (value & 4) != 0);
 #else
         flags.set(1, GetRandomValue(0, 1) == 0);
-        flags.set(4, GetRandomValue(0, 1) == 0);
-        flags.set(5, GetRandomValue(0, 1) == 0);
+        int value = GetRandomValue(0, 4);
+        flags.set(4, (value & 1) != 0);
+        flags.set(5, (value & 2) != 0);
+        flags.set(6, (value & 4) != 0);
 #endif
       }
     }
@@ -146,6 +151,9 @@ void Renderer3D::update_impl() {
     } else if (flags.test(4) && flags.test(5) && !flags.test(6)) {
       Helpers::overview_zoom_out_c(&camera.position, value, flags.test(1),
                                    camera.target.x);
+    } else if (!flags.test(4) && !flags.test(5) && flags.test(6)) {
+      Helpers::overview_orbit(&camera.position, value, flags.test(1),
+                              camera.target.x);
     }
   }
 
index a08f39f0f2d76caf9df4f26b0f7f77257b6c3f9b..741fa6e0e5a4275f02074456bf6cdfc31a8435af 100644 (file)
@@ -62,7 +62,7 @@ class Renderer3D : public GameRenderer {
    *    001 - from up left zoom out from target (opposite is zoom in)
    *    010 - from up right zoom out from target (opposite is zoom out)
    *    011 - from center zoom out (opposite is zoom in)
-   *    100 - UNUSED
+   *    100 - orbit from left to right (opposite is right to left)
    *    101 - UNUSED
    *    110 - UNUSED
    *    111 - UNUSED
index 2b76f3dd013bb0bae8449c56496c02921cd4a001..a752cdd209e2323d0321bb77cc087817f36a425d 100644 (file)
@@ -59,4 +59,8 @@ constexpr float OVERVIEW_C_E_X = 0.0F;
 constexpr float OVERVIEW_C_E_Y = 7.0F;
 constexpr float OVERVIEW_C_E_Z = 22.0F;
 
+constexpr float OVERVIEW_ORBIT_RADIUS = 12.0F;
+constexpr float OVERVIEW_ORBIT_Y = 7.0F;
+constexpr float OVERVIEW_ORBIT_MODIFIER = 0.9F;
+
 #endif
index c5068edd52200b7d08397624ab35b5c25df0cb30..9fd7bf34d37bc2af0a1fb96fff938caae03c357c 100644 (file)
@@ -85,3 +85,16 @@ void Helpers::overview_zoom_out_c(Vector3 *out, float value, bool is_opposite,
     out->z = lerp(OVERVIEW_C_B_Z, OVERVIEW_C_E_Z, value);
   }
 }
+
+void Helpers::overview_orbit(Vector3 *out, float value, bool is_opposite,
+                             float offset_x) {
+  value = (value * 2.0F - 1.0F) * OVERVIEW_ORBIT_MODIFIER;
+
+  if (is_opposite) {
+    out->x = -value * OVERVIEW_ORBIT_RADIUS + offset_x;
+  } else {
+    out->x = value * OVERVIEW_ORBIT_RADIUS + offset_x;
+  }
+  out->y = OVERVIEW_ORBIT_Y;
+  out->z = -(value * value - 1.0F) * OVERVIEW_ORBIT_RADIUS;
+}
index 9567c098880b93fa4028e0f5ceed37805f7b3dac..c66b1d8428b81317df84d41f511d890d0f700bd8 100644 (file)
@@ -23,6 +23,8 @@ extern void overview_zoom_out_r(Vector3 *out, float value, bool is_opposite,
                                 float offset_x);
 extern void overview_zoom_out_c(Vector3 *out, float value, bool is_opposite,
                                 float offset_x);
+extern void overview_orbit(Vector3 *out, float value, bool is_opposite,
+                           float offset_x);
 
 }  // namespace Helpers