]> git.seodisparate.com - RockPaperScissorsDuel/commitdiff
Rename a3f to arrays, work on attack anims
authorStephen Seo <seo.disparate@gmail.com>
Thu, 19 Jan 2023 06:04:44 +0000 (15:04 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 19 Jan 2023 06:04:44 +0000 (15:04 +0900)
28 files changed:
CMakeLists.txt
src/3d/a3f_conv.cc [deleted file]
src/3d/anim_falling_2d.cc [new file with mode: 0644]
src/3d/anim_falling_2d.h [new file with mode: 0644]
src/3d/anim_model_attack.cc
src/3d/anim_model_attack.h
src/3d/anim_model_grow.cc
src/3d/anim_model_grow.h
src/3d/anim_model_shrink.cc
src/3d/anim_model_shrink.h
src/3d/anim_model_still.cc
src/3d/anim_model_still.h
src/3d/anims.h
src/3d/arrays.cc [moved from src/3d/a3f.cc with 96% similarity]
src/3d/arrays.h [moved from src/3d/a3f.h with 77% similarity]
src/3d/arrays_conv.cc [new file with mode: 0644]
src/3d/arrays_conv.h [moved from src/3d/a3f_conv.h with 61% similarity]
src/3d/deferred_2d_draw.cc [new file with mode: 0644]
src/3d/deferred_2d_draw.h [new file with mode: 0644]
src/3d/obj.h
src/3d/qm.cc
src/3d_renderer.cc
src/3d_renderer.h
src/constants.h
src/ems.cc
src/helpers.cc
src/helpers.h
wasm_build/Makefile

index 96c93aec20980856836ab83f78a53b75af2640ea..746921851458343d9f41c602f258aa4d6184e2e0 100644 (file)
@@ -22,8 +22,8 @@ set(RPSDuelNative_SOURCES
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d_renderer.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/constants.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/obj.cc"
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f.cc"
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f_conv.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/arrays.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/arrays_conv.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/qm.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anims.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_concurrent.cc"
@@ -32,6 +32,8 @@ set(RPSDuelNative_SOURCES
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_grow.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_attack.cc"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_still.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_falling_2d.cc"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/deferred_2d_draw.cc"
 )
 
 set(RPSDuelNative_HEADERS
@@ -42,8 +44,8 @@ set(RPSDuelNative_HEADERS
     "${CMAKE_CURRENT_SOURCE_DIR}/src/basic_renderer.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d_renderer.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/obj.h"
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f.h"
-    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/a3f_conv.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/arrays.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/arrays_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_sequence.h"
@@ -51,6 +53,8 @@ set(RPSDuelNative_HEADERS
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_grow.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_attack.h"
     "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_model_still.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/anim_falling_2d.h"
+    "${CMAKE_CURRENT_SOURCE_DIR}/src/3d/deferred_2d_draw.h"
 )
 
 add_executable(RPSDuelNative ${RPSDuelNative_SOURCES})
diff --git a/src/3d/a3f_conv.cc b/src/3d/a3f_conv.cc
deleted file mode 100644 (file)
index cdebf19..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "a3f_conv.h"
-
-Vector3 A3FToRV3(const A3F &v) { return Vector3{v[0], v[1], v[2]}; }
-
-A3F RV3ToA3F(const Vector3 &v) { return A3F{v.x, v.y, v.z}; }
-
-Color A4CToC(const A4C &v) { return Color{v[0], v[1], v[2], v[3]}; }
-
-A4C CToA4C(const Color &c) { return A4C{c.r, c.g, c.b, c.a}; }
diff --git a/src/3d/anim_falling_2d.cc b/src/3d/anim_falling_2d.cc
new file mode 100644 (file)
index 0000000..b30e606
--- /dev/null
@@ -0,0 +1,45 @@
+#include "anim_falling_2d.h"
+
+// local includes
+#include <raylib.h>
+
+#include "../constants.h"
+#include "arrays_conv.h"
+#include "deferred_2d_draw.h"
+
+AnimFalling2D::AnimFalling2D(A3F pos, A4C color, Texture2D *texture, A4F txywh,
+                             bool is_going_right, Deferred2DMap *map)
+    : Anims(nullptr, pos, color),
+      map(map),
+      wh{txywh.at(2), txywh.at(3)},
+      dx(is_going_right ? MODEL_FALLING_2D_DX : -MODEL_FALLING_2D_DX),
+      dy(MODEL_FALLING_2D_DY),
+      ddy(MODEL_FALLING_2D_DDY) {
+  Deferred2DDraw def(texture, txywh, A2F{pos.at(0), pos.at(1)},
+                     A2F{txywh.at(2) / 2.0F, txywh.at(3) / 2.0F}, color, 0.0F,
+                     is_going_right);
+  def_id = def.get_id();
+
+  map->insert(std::make_pair(def_id, std::move(def)));
+}
+
+AnimFalling2D::~AnimFalling2D() {}
+
+void AnimFalling2D::do_update(float) {
+  auto iter = map->find(def_id);
+  if (iter != map->end()) {
+    iter->second.activate();
+  }
+}
+
+void AnimFalling2D::do_draw() {}
+
+bool AnimFalling2D::is_done_impl() {
+  auto iter = map->find(def_id);
+  if (iter != map->end()) {
+    if (iter->second.is_activated()) {
+      return true;
+    }
+  }
+  return true;
+}
diff --git a/src/3d/anim_falling_2d.h b/src/3d/anim_falling_2d.h
new file mode 100644 (file)
index 0000000..c3400e8
--- /dev/null
@@ -0,0 +1,48 @@
+#ifndef ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_FALLING_2D_H_
+#define ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_FALLING_2D_H_
+
+#include "anims.h"
+
+// standard libary includes
+#include <unordered_map>
+
+// third party includes
+#include <raylib.h>
+
+// local includes
+#include "arrays.h"
+#include "deferred_2d_draw.h"
+
+// redef map type
+using Deferred2DMap = std::unordered_map<int, Deferred2DDraw>;
+
+class AnimFalling2D : public Anims {
+ public:
+  AnimFalling2D(A3F pos, A4C color, Texture2D *texture, A4F txywh,
+                bool is_going_right, Deferred2DMap *map);
+  ~AnimFalling2D() override;
+
+  // disable copy
+  AnimFalling2D(const AnimFalling2D &) = delete;
+  AnimFalling2D &operator=(const AnimFalling2D &) = delete;
+
+  // allow move
+  AnimFalling2D(AnimFalling2D &&) = default;
+  AnimFalling2D &operator=(AnimFalling2D &&) = default;
+
+  void do_update(float dt) override;
+  void do_draw() override;
+
+ protected:
+  bool is_done_impl() override;
+
+ private:
+  Deferred2DMap *map;
+  A2F wh;
+  float dx;
+  float dy;
+  float ddy;
+  int def_id;
+};
+
+#endif
index bb93a887d1bcfb840fe9a7f28904fabb8a6c06a3..872a16e9d5859f318bc5884e61ca1742d9264225 100644 (file)
@@ -6,13 +6,14 @@
 // local includes
 #include "../constants.h"
 #include "../helpers.h"
-#include "a3f_conv.h"
+#include "arrays_conv.h"
 
 AnimModelAttack::AnimModelAttack(Model *model, A3F pos, A4C color, bool is_p1)
     : Anims(model, pos, color),
       offset{0.0F, 0.0F, 0.0F},
       timer(MODEL_ATTACK_TIME_0),
       state(0),
+      angle(0.0F),
       is_p1(is_p1) {}
 
 AnimModelAttack::~AnimModelAttack() {}
@@ -46,6 +47,9 @@ void AnimModelAttack::do_update(float dt) {
                                    1.0F - timer / MODEL_ATTACK_TIME_1);
       offset.at(1) = Helpers::lerp(MODEL_ATTACK_0_Y, MODEL_ATTACK_1_Y,
                                    1.0F - timer / MODEL_ATTACK_TIME_1);
+      angle = Helpers::lerp(MODEL_ATTACK_ANGLE_START,
+                            MODEL_ATTACK_ANGLE_END * (is_p1 ? 1.0F : -1.0F),
+                            1.0F - timer / MODEL_ATTACK_TIME_1);
       break;
     case 2:
       offset.at(0) =
@@ -53,6 +57,9 @@ void AnimModelAttack::do_update(float dt) {
                         MODEL_ATTACK_2_X, 1.0F - timer / MODEL_ATTACK_TIME_2);
       offset.at(1) = Helpers::lerp(MODEL_ATTACK_1_Y, MODEL_ATTACK_2_Y,
                                    1.0F - timer / MODEL_ATTACK_TIME_2);
+      angle = Helpers::lerp(MODEL_ATTACK_ANGLE_END * (is_p1 ? 1.0F : -1.0F),
+                            MODEL_ATTACK_ANGLE_START,
+                            1.0F - timer / MODEL_ATTACK_TIME_2);
       break;
     default:
       offset.at(0) = 0.0F;
@@ -62,7 +69,8 @@ void AnimModelAttack::do_update(float dt) {
 }
 
 void AnimModelAttack::do_draw() {
-  DrawModel(*model, A3FToRV3(pos + offset), 1.0F, A4CToC(color));
+  DrawModelEx(*model, A3FToRV3(pos + offset), {0.0F, 0.0F, -1.0F}, angle,
+              {1.0F, 1.0F, 1.0F}, A4CToC(color));
 }
 
 bool AnimModelAttack::is_done_impl() { return state == 3; }
index f5bcf7c0f1b41975979813e35de14a2104071161..a1cadd5177c6b901dbc0ce2c045b57c9c055386e 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef ROCK_PAPER_SCISSORS_DUEL_3D_MODEL_ATTACK_H_
 #define ROCK_PAPER_SCISSORS_DUEL_3D_MODEL_ATTACK_H_
 
-#include "a3f.h"
 #include "anims.h"
+#include "arrays.h"
 
 class AnimModelAttack : public Anims {
  public:
@@ -24,6 +24,7 @@ class AnimModelAttack : public Anims {
    * 3 - done
    */
   int state;
+  float angle;
   bool is_p1;
 };
 
index 469366ae28cc5578f483f7e8d62463e1917c53aa..6a482b4f566279c1d66c5baa6332cee421683e59 100644 (file)
@@ -5,7 +5,7 @@
 
 // local includes
 #include "../constants.h"
-#include "a3f_conv.h"
+#include "arrays_conv.h"
 
 AnimModelGrow::AnimModelGrow(Model *model, A3F pos, A4C color)
     : Anims(model, pos, color), timer(MODEL_GROW_TIME) {}
index faf98eca94de86a17839dd5809413923eee7f6ad..6f258cb5d2104056b01a1a2e02fd6e0c5268f224 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_MODEL_GROW_H_
 #define ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_MODEL_GROW_H_
 
-#include "a3f.h"
 #include "anims.h"
+#include "arrays.h"
 
 class AnimModelGrow : public Anims {
  public:
index 1459efe2ab98e18657deaaf0812924a677ad6896..a9bf447099810f467d5a37a6f4b7f0011c019a77 100644 (file)
@@ -5,7 +5,7 @@
 
 // local includes
 #include "../constants.h"
-#include "a3f_conv.h"
+#include "arrays_conv.h"
 
 AnimModelShrink::AnimModelShrink(Model *model, A3F pos, A4C color)
     : Anims(model, pos, color), timer(MODEL_SHRINK_TIME) {}
index 89a458e757334de3b00eb6c9647c4facd73b1ee3..5cec73fbab67a1e6ef7fde57caf4db85f084645b 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_MODEL_SHRINK_H_
 #define ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_MODEL_SHRINK_H_
 
-#include "a3f.h"
 #include "anims.h"
+#include "arrays.h"
 
 class AnimModelShrink : public Anims {
  public:
index eba90e8a743720f27eeeda30877fc7c4b44cff30..a27e1fecb43eedd4f610f470d09ca0dfdfeadf53 100644 (file)
@@ -4,7 +4,7 @@
 #include <raylib.h>
 
 // local includes
-#include "a3f_conv.h"
+#include "arrays_conv.h"
 
 AnimModelStill::AnimModelStill(Model *model, A3F pos, A4C color, float time)
     : Anims(model, pos, color), timer(time) {}
index 664a8c54c59651f6a335162e84f97862e67eb3f6..3694c6fdf07e1cddaf4f6a50b81f068a32dae915 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_MODEL_STILL_H_
 #define ROCK_PAPER_SCISSORS_DUEL_3D_ANIM_MODEL_STILL_H_
 
-#include "a3f.h"
 #include "anims.h"
+#include "arrays.h"
 
 class AnimModelStill : public Anims {
  public:
index ec9661545ed5c565cdebc735da2ec5d0ad42c584..4af1c7a0b795715b25616dfca1a021a390716bb1 100644 (file)
@@ -5,7 +5,7 @@
 #include <memory>
 
 // local includes
-#include "a3f.h"
+#include "arrays.h"
 
 // forward declarations
 struct Model;
similarity index 96%
rename from src/3d/a3f.cc
rename to src/3d/arrays.cc
index 4d1f3e29fd06c172877b56241a0996c74544432b..661ed7f2e2d96eff868a8478d128ffcf8df9e7f7 100644 (file)
@@ -1,4 +1,4 @@
-#include "a3f.h"
+#include "arrays.h"
 
 A3F operator+(const A3F &a, const A3F &b) {
   return A3F{a[0] + b[0], a[1] + b[1], a[2] + b[2]};
similarity index 77%
rename from src/3d/a3f.h
rename to src/3d/arrays.h
index 219b05f7110fe7f67ea8abb35a9d9d268f4c1292..e3cc0fabb9e4e55f9626e271dab8a95ce9f8147a 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <array>
 
+using A2F = std::array<float, 2>;
 using A3F = std::array<float, 3>;
 
 A3F operator+(const A3F &a, const A3F &b);
@@ -11,8 +12,12 @@ A3F operator-(const A3F &a, const A3F &b);
 A3F operator*(const A3F &v, float s);
 A3F operator/(const A3F &v, float s);
 
+using A4F = std::array<float, 4>;
+
 using A3C = std::array<unsigned char, 3>;
 using A4C = std::array<unsigned char, 4>;
+using A2U = std::array<unsigned int, 2>;
+using A4U = std::array<unsigned int, 4>;
 
 namespace A3F_F {
 extern float dotp(const A3F &a, const A3F &b);
diff --git a/src/3d/arrays_conv.cc b/src/3d/arrays_conv.cc
new file mode 100644 (file)
index 0000000..0d472c6
--- /dev/null
@@ -0,0 +1,19 @@
+#include "arrays_conv.h"
+
+Vector3 A3FToRV3(const A3F &v) { return Vector3{v[0], v[1], v[2]}; }
+
+A3F RV3ToA3F(const Vector3 &v) { return A3F{v.x, v.y, v.z}; }
+
+Color A4CToC(const A4C &v) { return Color{v[0], v[1], v[2], v[3]}; }
+
+A4C CToA4C(const Color &c) { return A4C{c.r, c.g, c.b, c.a}; }
+
+Vector2 A2FToRV2(const A2F &v) { return Vector2{v.at(0), v.at(1)}; }
+
+A2F RV2ToA2F(const Vector2 &v) { return A2F{v.x, v.y}; }
+
+Rectangle A4FToRect(const A4F &v) {
+  return Rectangle{v.at(0), v.at(1), v.at(2), v.at(3)};
+}
+
+A4F RectToA4F(const Rectangle &r) { return A4F{r.x, r.y, r.width, r.height}; }
similarity index 61%
rename from src/3d/a3f_conv.h
rename to src/3d/arrays_conv.h
index 597afdb6732842affd1831e0de430da002e83376..c5855ab0a3970191f176db024239de9c0e2a5240 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef ROCK_PAPER_SCISSORS_3D_A3F_CONV_H_
 #define ROCK_PAPER_SCISSORS_3D_A3F_CONV_H_
 
-#include "a3f.h"
+#include "arrays.h"
 
 // third party includes
 #include <raylib.h>
@@ -12,4 +12,10 @@ extern A3F RV3ToA3F(const Vector3 &v);
 extern Color A4CToC(const A4C &v);
 extern A4C CToA4C(const Color &c);
 
+extern Vector2 A2FToRV2(const A2F &v);
+extern A2F RV2ToA2F(const Vector2 &v);
+
+extern Rectangle A4FToRect(const A4F &v);
+extern A4F RectToA4F(const Rectangle &r);
+
 #endif
diff --git a/src/3d/deferred_2d_draw.cc b/src/3d/deferred_2d_draw.cc
new file mode 100644 (file)
index 0000000..35afcd8
--- /dev/null
@@ -0,0 +1,55 @@
+#include "deferred_2d_draw.h"
+
+// local includes
+#include <raylib.h>
+
+#include "../constants.h"
+#include "arrays_conv.h"
+
+int Deferred2DDraw::id_counter = 0;
+
+Deferred2DDraw::Deferred2DDraw(Texture2D *texture, A4F txywh, A2F pos,
+                               A2F origin, A4C color, float angle,
+                               bool is_going_right)
+    : texture(texture),
+      txywh(txywh),
+      pos(pos),
+      origin(origin),
+      color(color),
+      angle(angle),
+      dx(is_going_right ? MODEL_FALLING_2D_DX : -MODEL_FALLING_2D_DX),
+      dy(MODEL_FALLING_2D_DY),
+      ddy(MODEL_FALLING_2D_DDY),
+      id(id_counter++),
+      activated(false),
+      is_going_right(is_going_right) {}
+
+void Deferred2DDraw::update(float dt) {
+  dy += ddy * dt;
+  pos.at(0) += dx * dt;
+  pos.at(1) += dy * dt;
+  angle += MODEL_FALLING_2D_DA * dt * (is_going_right ? 1.0F : -1.0F);
+}
+
+void Deferred2DDraw::draw() {
+  DrawTexturePro(*texture, A4FToRect(txywh),
+                 {pos.at(0), pos.at(1), txywh.at(2), txywh.at(3)},
+                 A2FToRV2(origin), angle, A4CToC(color));
+}
+
+A2F *Deferred2DDraw::get_pos() { return &pos; }
+
+float *Deferred2DDraw::get_angle() { return &angle; }
+
+int Deferred2DDraw::get_id() { return id; }
+
+void Deferred2DDraw::activate() { activated = true; }
+
+bool Deferred2DDraw::is_activated() const { return activated; }
+
+bool Deferred2DDraw::is_oob() const {
+  return pos.at(0) - txywh.at(2) > GetScreenWidth() ||
+         pos.at(0) + txywh.at(2) * 2.0F < 0.0F ||
+         pos.at(1) - txywh.at(3) > GetScreenHeight() ||
+         pos.at(1) + txywh.at(3) * 2.0F < 0.0F;
+}
diff --git a/src/3d/deferred_2d_draw.h b/src/3d/deferred_2d_draw.h
new file mode 100644 (file)
index 0000000..1e05a32
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef ROCK_PAPER_SCISSORS_DUEL_DEFERRED_2D_DRAW_H_
+#define ROCK_PAPER_SCISSORS_DUEL_DEFERRED_2D_DRAW_H_
+
+// third party includes
+#include <raylib.h>
+
+// local includes
+#include "arrays.h"
+
+class Deferred2DDraw {
+ public:
+  Deferred2DDraw(Texture2D *texture, A4F txywh, A2F pos, A2F origin, A4C color,
+                 float angle, bool is_going_right);
+
+  // no copy
+  Deferred2DDraw(const Deferred2DDraw &) = delete;
+  Deferred2DDraw &operator=(const Deferred2DDraw &) = delete;
+
+  // allow move
+  Deferred2DDraw(Deferred2DDraw &&) = default;
+  Deferred2DDraw &operator=(Deferred2DDraw &&) = default;
+
+  void update(float dt);
+  void draw();
+
+  A2F *get_pos();
+  float *get_angle();
+  int get_id();
+  void activate();
+  bool is_activated() const;
+  bool is_oob() const;
+
+ private:
+  static int id_counter;
+  Texture2D *texture;
+  A4F txywh;
+  A2F pos;
+  A2F origin;
+  A4C color;
+  float angle;
+  float dx;
+  float dy;
+  float ddy;
+  int id;
+  bool activated;
+  bool is_going_right;
+};
+
+#endif
index 193ee4c9da146b9f66e882d991caead07f0da861..28a0a2285f001b87f88138c515b33260c12b2a6e 100644 (file)
@@ -5,7 +5,7 @@
 #include <optional>
 
 // local includes
-#include "a3f.h"
+#include "arrays.h"
 
 // forward declarations
 struct Model;
index 570b54446e313707713363e1ec36be3dd973fbcb..8504d490ac54e8ddf4e3b81d94b48294a9b69bed 100644 (file)
@@ -11,7 +11,7 @@
 
 // local includes
 #include "../constants.h"
-#include "a3f_conv.h"
+#include "arrays_conv.h"
 
 QuestionMark::QuestionMark()
     : Object3D()
index ac58f5b6ed0dd3a7f7d39f56dd07413d351957b8..255613db8d0372700f373d45bbc63a0766e2f7db 100644 (file)
@@ -5,17 +5,19 @@
 #include <cstring>
 #include <iostream>
 #include <memory>
+#include <vector>
 
 // third party includes
 #include <raylib.h>
 
 // local includes
-#include "3d/a3f_conv.h"
 #include "3d/anim_concurrent.h"
+#include "3d/anim_falling_2d.h"
 #include "3d/anim_model_attack.h"
 #include "3d/anim_model_grow.h"
 #include "3d/anim_model_shrink.h"
 #include "3d/anim_model_still.h"
+#include "3d/arrays_conv.h"
 #include "constants.h"
 #include "ems.h"
 #include "helpers.h"
@@ -389,6 +391,20 @@ void Renderer3D::update_impl() {
 
   qms.at(0).set_pos_x(received_pos * 2.0F - 1.0F);
   qms.at(1).set_pos_x(received_pos * 2.0F + 1.0F);
+
+  std::vector<int> to_delete;
+  for (auto &iter : deferred_2d_draw_map) {
+    if (iter.second.is_activated()) {
+      iter.second.update(dt);
+      if (iter.second.is_oob()) {
+        to_delete.push_back(iter.first);
+      }
+    }
+  }
+
+  for (int id : to_delete) {
+    deferred_2d_draw_map.erase(id);
+  }
 }
 
 void Renderer3D::draw_impl() {
@@ -542,6 +558,12 @@ void Renderer3D::draw_impl() {
     DrawText("Waiting...", 0, 0, 20, RAYWHITE);
   }
 
+  for (auto &iter : deferred_2d_draw_map) {
+    if (iter.second.is_activated()) {
+      iter.second.draw();
+    }
+  }
+
   EndDrawing();
 }
 
@@ -629,9 +651,9 @@ int Renderer3D::setup_anims(int idx, int score) {
       break;
   }
   newAnim->push_anim(std::make_unique<AnimModelGrow>(
-      p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F}, A4C{255, 255, 255, 255}));
+      p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F}, A4C{255, 200, 200, 255}));
   newAnim->push_anim(std::make_unique<AnimModelGrow>(
-      p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F}, A4C{255, 255, 255, 255}));
+      p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F}, A4C{200, 200, 255, 255}));
   anims.push_anim(std::move(newAnim));
 
   newAnim = std::make_unique<AnimConcurrent>(nullptr);
@@ -642,24 +664,52 @@ int Renderer3D::setup_anims(int idx, int score) {
       (flags.test(2) || flags.test(3)) ? opponent_choices.at(idx)
                                        : choices.at(idx));
 
+  auto seqAnim = std::make_unique<AnimSequence>(nullptr);
+
+  A4F p1_dims = (flags.test(2) || flags.test(3))
+                    ? Helpers::get_sprite_dims(choices.at(idx))
+                    : Helpers::get_sprite_dims(opponent_choices.at(idx));
+  A4F p2_dims = (flags.test(2) || flags.test(3))
+                    ? Helpers::get_sprite_dims(opponent_choices.at(idx))
+                    : Helpers::get_sprite_dims(choices.at(idx));
+  Vector3 oldPos = camera.position;
+  camera.position = camera.target;
+  camera.position.z += 10.0F;
+  camera.position.y += 4.0F;
+  Vector2 p1_pos =
+      GetWorldToScreen({camera.target.x - 1.0F, 0.35F, 0.0F}, camera);
+  Vector2 p2_pos =
+      GetWorldToScreen({camera.target.x + 1.0F, 0.35F, 0.0F}, camera);
+  camera.position = oldPos;
+
+  // if (flags.test(2)) {
+  //   std::cout << "p1_pos x is " << (score * 2.0F - 1.0F) << " or " <<
+  //   p1_pos.x
+  //             << std::endl;
+  // }
+
   switch (result) {
     case -1:
-      newAnim->push_anim(std::make_unique<AnimModelStill>(
+      seqAnim->push_anim(std::make_unique<AnimModelStill>(
           p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F},
-          A4C{255, 255, 255, 255},
-          MODEL_ATTACK_TIME_0 + MODEL_ATTACK_TIME_1 + MODEL_ATTACK_TIME_2));
+          A4C{255, 200, 200, 255}, MODEL_ATTACK_TIME_0 + MODEL_ATTACK_TIME_1));
+      seqAnim->push_anim(std::make_unique<AnimFalling2D>(
+          A3F{p1_pos.x, p1_pos.y, 0.0F}, A4C{255, 200, 200, 255}, &spriteSheet,
+          p1_dims, false, &deferred_2d_draw_map));
       newAnim->push_anim(std::make_unique<AnimModelAttack>(
           p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F},
-          A4C{255, 255, 255, 255}, false));
+          A4C{200, 200, 255, 255}, false));
       break;
     case 1:
       newAnim->push_anim(std::make_unique<AnimModelAttack>(
           p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F},
-          A4C{255, 255, 255, 255}, true));
-      newAnim->push_anim(std::make_unique<AnimModelStill>(
+          A4C{255, 200, 200, 255}, true));
+      seqAnim->push_anim(std::make_unique<AnimModelStill>(
           p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F},
-          A4C{255, 255, 255, 255},
-          MODEL_ATTACK_TIME_0 + MODEL_ATTACK_TIME_1 + MODEL_ATTACK_TIME_2));
+          A4C{200, 200, 255, 255}, MODEL_ATTACK_TIME_0 + MODEL_ATTACK_TIME_1));
+      seqAnim->push_anim(std::make_unique<AnimFalling2D>(
+          A3F{p2_pos.x, p2_pos.y, 0.0F}, A4C{200, 200, 255, 255}, &spriteSheet,
+          p2_dims, true, &deferred_2d_draw_map));
       break;
     case 0:
     default:
@@ -667,14 +717,27 @@ int Renderer3D::setup_anims(int idx, int score) {
   }
 
   if (result != 0) {
+    newAnim->push_anim(std::move(seqAnim));
     anims.push_anim(std::move(newAnim));
   }
 
   newAnim = std::make_unique<AnimConcurrent>(nullptr);
-  newAnim->push_anim(std::make_unique<AnimModelShrink>(
-      p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F}, A4C{255, 255, 255, 255}));
-  newAnim->push_anim(std::make_unique<AnimModelShrink>(
-      p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F}, A4C{255, 255, 255, 255}));
+  if (result > 0) {
+    newAnim->push_anim(std::make_unique<AnimModelShrink>(
+        p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F},
+        A4C{255, 200, 200, 255}));
+  } else if (result < 0) {
+    newAnim->push_anim(std::make_unique<AnimModelShrink>(
+        p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F},
+        A4C{200, 200, 255, 255}));
+  } else {
+    newAnim->push_anim(std::make_unique<AnimModelShrink>(
+        p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F},
+        A4C{255, 200, 200, 255}));
+    newAnim->push_anim(std::make_unique<AnimModelShrink>(
+        p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F},
+        A4C{200, 200, 255, 255}));
+  }
 
   using DataT = std::tuple<int *, int>;
   DataT *data = new DataT{&received_pos, result};
@@ -716,6 +779,7 @@ void Renderer3D::reset_for_next() {
   overview_timer = OVERVIEW_TIMER_MAX;
   set_random_overview();
   camera.target.x = received_pos * 2.0F;
+
   // if (flags.test(3)) {
   //   std::cerr << "RESET STATE for next round" << std::endl;
   // }
index 273988e2500ef7885c673757bbc2e2de63932cf5..45e875a2dc1c3c7aaa92639e2ce3cc92cfc90f77 100644 (file)
@@ -7,6 +7,7 @@
 // standard library includes
 #include <array>
 #include <bitset>
+#include <unordered_map>
 
 // third party includes
 #include <raylib.h>
 // local includes
 #include "3d/anim_sequence.h"
 #include "3d/anims.h"
+#include "3d/deferred_2d_draw.h"
 #include "3d/qm.h"
 
 class Renderer3D : public GameRenderer {
  public:
+  using Deferred2DMap = std::unordered_map<int, Deferred2DDraw>;
+
   Renderer3D();
   ~Renderer3D() override;
 
@@ -46,6 +50,8 @@ class Renderer3D : public GameRenderer {
 
   std::array<QuestionMark, 2> qms;
 
+  Deferred2DMap deferred_2d_draw_map;
+
   Camera camera;
 
   Texture2D spriteSheet;
index b75eb26113e75fb98c83dcfe2d0e412ea385d320..c9a080b77a0f959924b8100cbb61a2c164ce1917 100644 (file)
@@ -90,4 +90,12 @@ constexpr float MODEL_ATTACK_1_Y = 0.2F;
 constexpr float MODEL_ATTACK_2_X = 0.0F;
 constexpr float MODEL_ATTACK_2_Y = 0.0F;
 
+constexpr float MODEL_ATTACK_ANGLE_START = 0.0F;
+constexpr float MODEL_ATTACK_ANGLE_END = 90.0F;
+
+constexpr float MODEL_FALLING_2D_DX = 80.0F;
+constexpr float MODEL_FALLING_2D_DY = -30.0F;
+constexpr float MODEL_FALLING_2D_DDY = 150.0F;
+constexpr float MODEL_FALLING_2D_DA = 270.0F;
+
 #endif
index 1d53fc606306592f9a95271c97a2983fdeb4dbad..73582ea296742086216d65699f3bb4e0b357760b 100644 (file)
@@ -51,13 +51,13 @@ void call_js_set_choices(const char *first, const char *second,
 }
 
 // void call_js_request_update() {
-//#ifdef __EMSCRIPTEN__
+// #ifdef __EMSCRIPTEN__
 //   js_request_update();
-//#else
+// #else
 //   std::clog
 //       << "WARNING: emscripten not enabled, cannot call js_request_update()!"
 //       << std::endl;
-//#endif
+// #endif
 // }
 
 void call_js_set_matchup_done() {
index a19ad1133b512418ab9888662065b1b5db72857d..cbd1d413a4ce15dff19d9a18e6d9f6b2fb208c08 100644 (file)
@@ -134,3 +134,18 @@ int Helpers::a_vs_b(char a, char b) {
     return 0;
   }
 }
+
+A4F Helpers::get_sprite_dims(char type) {
+  switch (type) {
+    case 'r':
+      return A4F{ROCK_DIMS[0], ROCK_DIMS[1], ROCK_DIMS[2], ROCK_DIMS[3]};
+    case 'p':
+      return A4F{PAPER_DIMS[0], PAPER_DIMS[1], PAPER_DIMS[2], PAPER_DIMS[3]};
+    case 's':
+      return A4F{SCISSORS_DIMS[0], SCISSORS_DIMS[1], SCISSORS_DIMS[2],
+                 SCISSORS_DIMS[3]};
+    default:
+      return A4F{QUESTIONMARK_DIMS[0], QUESTIONMARK_DIMS[1],
+                 QUESTIONMARK_DIMS[2], QUESTIONMARK_DIMS[3]};
+  }
+}
index b342a1562a05e2a4dc38c875a202fbe154b91793..8ea9784a90634e6b40afd57fbc7f8f4090347f83 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef ROCK_PAPER_SCISSORS_DUEL_HELPERS_H_
 #define ROCK_PAPER_SCISSORS_DUEL_HELPERS_H_
 
+// local includes
+#include "3d/arrays.h"
+
 // forard declarations
 struct Vector3;
 
@@ -28,6 +31,8 @@ extern void overview_orbit(Vector3 *out, float value, bool is_opposite,
 
 extern int a_vs_b(char a, char b);
 
+extern A4F get_sprite_dims(char type);
+
 }  // namespace Helpers
 
 #endif
index bb1e1edf9de4c84eeb3d26b2c946a8711d6eee98..b789d290ebaee018ac82512cc4f65aa652452433 100644 (file)
@@ -12,8 +12,8 @@ SOURCES = \
                ../src/3d_renderer.cc \
                ../src/constants.cc \
                ../src/3d/obj.cc \
-               ../src/3d/a3f.cc \
-               ../src/3d/a3f_conv.cc \
+               ../src/3d/arrays.cc \
+               ../src/3d/arrays_conv.cc \
                ../src/3d/qm.cc \
                ../src/3d/anims.cc \
                ../src/3d/anim_concurrent.cc \
@@ -21,7 +21,9 @@ SOURCES = \
                ../src/3d/anim_model_shrink.cc \
                ../src/3d/anim_model_grow.cc \
                ../src/3d/anim_model_attack.cc \
-               ../src/3d/anim_model_still.cc
+               ../src/3d/anim_model_still.cc \
+               ../src/3d/anim_falling_2d.cc \
+               ../src/3d/deferred_2d_draw.cc
 
 HEADERS = \
                ../src/constants.h \
@@ -31,8 +33,8 @@ HEADERS = \
                ../src/game_renderer.h \
                ../src/3d_renderer.h \
                ../src/3d/obj.h \
-               ../src/3d/a3f.h \
-               ../src/3d/a3f_conv.h \
+               ../src/3d/arrays.h \
+               ../src/3d/arrays_conv.h \
                ../src/3d/qm.h \
                ../src/3d/anims.h \
                ../src/3d/anim_concurrent.h \
@@ -40,7 +42,9 @@ HEADERS = \
                ../src/3d/anim_model_shrink.h \
                ../src/3d/anim_model_grow.h \
                ../src/3d/anim_model_attack.h \
-               ../src/3d/anim_model_still.h
+               ../src/3d/anim_model_still.h \
+               ../src/3d/anim_falling_2d.h \
+               ../src/3d/deferred_2d_draw.h
 
 CXX = source ${HOME}/git/emsdk/emsdk_env.sh && em++