]> git.seodisparate.com - RockPaperScissorsDuel/commitdiff
Prep for anims, tweaks to anim handling
authorStephen Seo <seo.disparate@gmail.com>
Tue, 17 Jan 2023 04:39:25 +0000 (13:39 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Tue, 17 Jan 2023 04:39:25 +0000 (13:39 +0900)
CMakeLists.txt
src/3d/anim_concurrent.cc [new file with mode: 0644]
src/3d/anim_concurrent.h [new file with mode: 0644]
src/3d/anims.h [new file with mode: 0644]
src/3d_renderer.cc
src/3d_renderer.h
wasm_build/Makefile

index 09f62eeccc4f662470e1d1902fda858f35c7fb30..182b315e964469024943cd93765de686937a09ad 100644 (file)
@@ -25,6 +25,7 @@ set(RPSDuelNative_SOURCES
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f_conv.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/qm.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_concurrent.cc"
 )
 
 set(RPSDuelNative_HEADERS
@@ -38,6 +39,8 @@ set(RPSDuelNative_HEADERS
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f_conv.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/qm.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anims.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_concurrent.h"
 )
 
 add_executable(RPSDuelNative ${RPSDuelNative_SOURCES})
diff --git a/src/3d/anim_concurrent.cc b/src/3d/anim_concurrent.cc
new file mode 100644 (file)
index 0000000..4475d77
--- /dev/null
@@ -0,0 +1,28 @@
+#include "anim_concurrent.h"
+
+AnimConcurrent::AnimConcurrent() {}
+
+AnimConcurrent::~AnimConcurrent() {}
+
+bool AnimConcurrent::is_done() { return anims.empty(); }
+
+void AnimConcurrent::do_update(float dt) {
+  for (auto iter = anims.begin(); iter != anims.end();) {
+    (*iter)->do_update(dt);
+    if ((*iter)->is_done()) {
+      iter = anims.erase(iter);
+    } else {
+      ++iter;
+    }
+  }
+}
+
+void AnimConcurrent::do_draw(Model *m) {
+  for (auto &anim : anims) {
+    anim->do_draw(m);
+  }
+}
+
+void AnimConcurrent::push_anim(UPtr &&p) {
+  anims.emplace_back(std::forward<UPtr>(p));
+}
diff --git a/src/3d/anim_concurrent.h b/src/3d/anim_concurrent.h
new file mode 100644 (file)
index 0000000..89def91
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_CONCURRENT_H_
+#define ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_CONCURRENT_H_
+
+#include "anims.h"
+
+// standard library includes
+#include <list>
+
+class AnimConcurrent : public Anims {
+ public:
+  AnimConcurrent();
+  ~AnimConcurrent() override;
+
+  bool is_done() override;
+
+  void do_update(float dt) override;
+  void do_draw(Model *m) override;
+
+  void push_anim(UPtr &&p);
+
+ private:
+  std::list<UPtr> anims;
+};
+
+#endif
diff --git a/src/3d/anims.h b/src/3d/anims.h
new file mode 100644 (file)
index 0000000..10e22bb
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef ROCK_PAPER_SCISSORS_DUEL_3D_ANIMS_H_
+#define ROCK_PAPER_SCISSORS_DUEL_3D_ANIMS_H_
+
+// standard library includes
+#include <memory>
+
+// forward declarations
+struct Model;
+
+class Anims {
+ public:
+  using UPtr = std::unique_ptr<Anims>;
+  using SPtr = std::shared_ptr<Anims>;
+
+  Anims() {}
+  virtual ~Anims() {}
+
+  virtual bool is_done() = 0;
+
+  virtual void do_update(float dt) = 0;
+  virtual void do_draw(Model *m) = 0;
+};
+
+#endif
index dd45911884a2a9416bc82cb311eee7bd8317a19e..037907c54eb2bab175e2e8109f9f5f0a53f22e33 100644 (file)
@@ -147,6 +147,9 @@ void Renderer3D::update_state(const char *playerOne, const char *playerTwo,
     opponent_choices.at(2) = '?';
     flags.reset(11);
     flags.reset(8);
+    flags.reset(0);
+    overview_timer = OVERVIEW_TIMER_MAX;
+    set_random_overview();
   }
 }
 
@@ -172,32 +175,14 @@ void Renderer3D::update_impl() {
   const float height2 = actual_width2;
 
   if (flags.test(0)) {
+    camera.position = camera.target;
+    camera.position.z += 10.0F;
+    camera.position.y += 4.0F;
   } else {
     overview_timer -= dt;
     if (overview_timer <= 0.0F) {
       overview_timer += OVERVIEW_TIMER_MAX;
-      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) ||
-             (flags.test(6) && (flags.test(4) || flags.test(5)))) {
-#ifdef __EMSCRIPTEN__
-        flags.set(1, 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);
-        int value = GetRandomValue(0, 4);
-        flags.set(4, (value & 1) != 0);
-        flags.set(5, (value & 2) != 0);
-        flags.set(6, (value & 4) != 0);
-#endif
-      }
+      set_random_overview();
     }
 
     float value =
@@ -321,6 +306,7 @@ void Renderer3D::update_impl() {
                      (char)choices.at(2), 0};
       call_js_set_choices(&buf[0], &buf[2], &buf[4]);
       flags.set(11);
+      flags.set(0);
     }
   }
 
@@ -482,3 +468,27 @@ void Renderer3D::draw_impl() {
 
   EndDrawing();
 }
+
+void Renderer3D::set_random_overview() {
+  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) ||
+         (flags.test(6) && (flags.test(4) || flags.test(5)))) {
+#ifdef __EMSCRIPTEN__
+    flags.set(1, 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);
+    int value = GetRandomValue(0, 4);
+    flags.set(4, (value & 1) != 0);
+    flags.set(5, (value & 2) != 0);
+    flags.set(6, (value & 4) != 0);
+#endif
+  }
+}
index b2a3e47feb205d1bba3a9e6d975e6a43b6fc7237..9a57250457a34c35f624c4800bb2367693e865d6 100644 (file)
@@ -34,6 +34,8 @@ class Renderer3D : public GameRenderer {
   void update_impl();
   void draw_impl();
 
+  void set_random_overview();
+
   std::array<QuestionMark, 2> qms;
 
   Camera camera;
index 395b76ff117bfc6310dc33f08c13126267adfb27..8f98684c1ea43315cefaac1a71c34003f002bb3f 100644 (file)
@@ -14,7 +14,8 @@ SOURCES = \
                ../src/3d/obj.cc \
                ../src/3d/a3f.cc \
                ../src/3d/a3f_conv.cc \
-               ../src/3d/qm.cc
+               ../src/3d/qm.cc \
+               ../src/3d/anim_concurrent.cc
 
 HEADERS = \
                ../src/constants.h \
@@ -26,7 +27,9 @@ HEADERS = \
                ../src/3d/obj.h \
                ../src/3d/a3f.h \
                ../src/3d/a3f_conv.h \
-               ../src/3d/qm.h
+               ../src/3d/qm.h \
+               ../src/3d/anims.h \
+               ../src/3d/anim_concurrent.h
 
 CXX = source ${HOME}/git/emsdk/emsdk_env.sh && em++