From 11ce65b1eafd1d43ab618994f07b0633e7051136 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 19 Jan 2023 15:04:44 +0900 Subject: [PATCH] Rename a3f to arrays, work on attack anims --- CMakeLists.txt | 12 ++-- src/3d/a3f_conv.cc | 9 --- src/3d/anim_falling_2d.cc | 45 +++++++++++++ src/3d/anim_falling_2d.h | 48 ++++++++++++++ src/3d/anim_model_attack.cc | 12 +++- src/3d/anim_model_attack.h | 3 +- src/3d/anim_model_grow.cc | 2 +- src/3d/anim_model_grow.h | 2 +- src/3d/anim_model_shrink.cc | 2 +- src/3d/anim_model_shrink.h | 2 +- src/3d/anim_model_still.cc | 2 +- src/3d/anim_model_still.h | 2 +- src/3d/anims.h | 2 +- src/3d/{a3f.cc => arrays.cc} | 2 +- src/3d/{a3f.h => arrays.h} | 5 ++ src/3d/arrays_conv.cc | 19 ++++++ src/3d/{a3f_conv.h => arrays_conv.h} | 8 ++- src/3d/deferred_2d_draw.cc | 55 ++++++++++++++++ src/3d/deferred_2d_draw.h | 49 +++++++++++++++ src/3d/obj.h | 2 +- src/3d/qm.cc | 2 +- src/3d_renderer.cc | 94 +++++++++++++++++++++++----- src/3d_renderer.h | 6 ++ src/constants.h | 8 +++ src/ems.cc | 6 +- src/helpers.cc | 15 +++++ src/helpers.h | 5 ++ wasm_build/Makefile | 16 +++-- 28 files changed, 384 insertions(+), 51 deletions(-) delete mode 100644 src/3d/a3f_conv.cc create mode 100644 src/3d/anim_falling_2d.cc create mode 100644 src/3d/anim_falling_2d.h rename src/3d/{a3f.cc => arrays.cc} (96%) rename src/3d/{a3f.h => arrays.h} (77%) create mode 100644 src/3d/arrays_conv.cc rename src/3d/{a3f_conv.h => arrays_conv.h} (61%) create mode 100644 src/3d/deferred_2d_draw.cc create mode 100644 src/3d/deferred_2d_draw.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 96c93ae..7469218 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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 index cdebf19..0000000 --- a/src/3d/a3f_conv.cc +++ /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 index 0000000..b30e606 --- /dev/null +++ b/src/3d/anim_falling_2d.cc @@ -0,0 +1,45 @@ +#include "anim_falling_2d.h" + +// local includes +#include + +#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 index 0000000..c3400e8 --- /dev/null +++ b/src/3d/anim_falling_2d.h @@ -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 + +// third party includes +#include + +// local includes +#include "arrays.h" +#include "deferred_2d_draw.h" + +// redef map type +using Deferred2DMap = std::unordered_map; + +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 diff --git a/src/3d/anim_model_attack.cc b/src/3d/anim_model_attack.cc index bb93a88..872a16e 100644 --- a/src/3d/anim_model_attack.cc +++ b/src/3d/anim_model_attack.cc @@ -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; } diff --git a/src/3d/anim_model_attack.h b/src/3d/anim_model_attack.h index f5bcf7c..a1cadd5 100644 --- a/src/3d/anim_model_attack.h +++ b/src/3d/anim_model_attack.h @@ -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; }; diff --git a/src/3d/anim_model_grow.cc b/src/3d/anim_model_grow.cc index 469366a..6a482b4 100644 --- a/src/3d/anim_model_grow.cc +++ b/src/3d/anim_model_grow.cc @@ -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) {} diff --git a/src/3d/anim_model_grow.h b/src/3d/anim_model_grow.h index faf98ec..6f258cb 100644 --- a/src/3d/anim_model_grow.h +++ b/src/3d/anim_model_grow.h @@ -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: diff --git a/src/3d/anim_model_shrink.cc b/src/3d/anim_model_shrink.cc index 1459efe..a9bf447 100644 --- a/src/3d/anim_model_shrink.cc +++ b/src/3d/anim_model_shrink.cc @@ -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) {} diff --git a/src/3d/anim_model_shrink.h b/src/3d/anim_model_shrink.h index 89a458e..5cec73f 100644 --- a/src/3d/anim_model_shrink.h +++ b/src/3d/anim_model_shrink.h @@ -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: diff --git a/src/3d/anim_model_still.cc b/src/3d/anim_model_still.cc index eba90e8..a27e1fe 100644 --- a/src/3d/anim_model_still.cc +++ b/src/3d/anim_model_still.cc @@ -4,7 +4,7 @@ #include // 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) {} diff --git a/src/3d/anim_model_still.h b/src/3d/anim_model_still.h index 664a8c5..3694c6f 100644 --- a/src/3d/anim_model_still.h +++ b/src/3d/anim_model_still.h @@ -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: diff --git a/src/3d/anims.h b/src/3d/anims.h index ec96615..4af1c7a 100644 --- a/src/3d/anims.h +++ b/src/3d/anims.h @@ -5,7 +5,7 @@ #include // local includes -#include "a3f.h" +#include "arrays.h" // forward declarations struct Model; diff --git a/src/3d/a3f.cc b/src/3d/arrays.cc similarity index 96% rename from src/3d/a3f.cc rename to src/3d/arrays.cc index 4d1f3e2..661ed7f 100644 --- a/src/3d/a3f.cc +++ b/src/3d/arrays.cc @@ -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]}; diff --git a/src/3d/a3f.h b/src/3d/arrays.h similarity index 77% rename from src/3d/a3f.h rename to src/3d/arrays.h index 219b05f..e3cc0fa 100644 --- a/src/3d/a3f.h +++ b/src/3d/arrays.h @@ -3,6 +3,7 @@ #include +using A2F = std::array; using A3F = std::array; 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; + using A3C = std::array; using A4C = std::array; +using A2U = std::array; +using A4U = std::array; 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 index 0000000..0d472c6 --- /dev/null +++ b/src/3d/arrays_conv.cc @@ -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}; } diff --git a/src/3d/a3f_conv.h b/src/3d/arrays_conv.h similarity index 61% rename from src/3d/a3f_conv.h rename to src/3d/arrays_conv.h index 597afdb..c5855ab 100644 --- a/src/3d/a3f_conv.h +++ b/src/3d/arrays_conv.h @@ -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 @@ -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 index 0000000..35afcd8 --- /dev/null +++ b/src/3d/deferred_2d_draw.cc @@ -0,0 +1,55 @@ +#include "deferred_2d_draw.h" + +// local includes +#include + +#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 ∠ } + +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 index 0000000..1e05a32 --- /dev/null +++ b/src/3d/deferred_2d_draw.h @@ -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 + +// 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 diff --git a/src/3d/obj.h b/src/3d/obj.h index 193ee4c..28a0a22 100644 --- a/src/3d/obj.h +++ b/src/3d/obj.h @@ -5,7 +5,7 @@ #include // local includes -#include "a3f.h" +#include "arrays.h" // forward declarations struct Model; diff --git a/src/3d/qm.cc b/src/3d/qm.cc index 570b544..8504d49 100644 --- a/src/3d/qm.cc +++ b/src/3d/qm.cc @@ -11,7 +11,7 @@ // local includes #include "../constants.h" -#include "a3f_conv.h" +#include "arrays_conv.h" QuestionMark::QuestionMark() : Object3D() diff --git a/src/3d_renderer.cc b/src/3d_renderer.cc index ac58f5b..255613d 100644 --- a/src/3d_renderer.cc +++ b/src/3d_renderer.cc @@ -5,17 +5,19 @@ #include #include #include +#include // third party includes #include // 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 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( - 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( - 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(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(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( + seqAnim->push_anim(std::make_unique( 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( + 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( 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( p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F}, - A4C{255, 255, 255, 255}, true)); - newAnim->push_anim(std::make_unique( + A4C{255, 200, 200, 255}, true)); + seqAnim->push_anim(std::make_unique( 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( + 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(nullptr); - newAnim->push_anim(std::make_unique( - p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F}, A4C{255, 255, 255, 255})); - newAnim->push_anim(std::make_unique( - 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( + 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( + p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F}, + A4C{200, 200, 255, 255})); + } else { + newAnim->push_anim(std::make_unique( + p1_model, A3F{score * 2.0F - 1.0F, 0.0F, 0.0F}, + A4C{255, 200, 200, 255})); + newAnim->push_anim(std::make_unique( + p2_model, A3F{score * 2.0F + 1.0F, 0.0F, 0.0F}, + A4C{200, 200, 255, 255})); + } using DataT = std::tuple; 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; // } diff --git a/src/3d_renderer.h b/src/3d_renderer.h index 273988e..45e875a 100644 --- a/src/3d_renderer.h +++ b/src/3d_renderer.h @@ -7,6 +7,7 @@ // standard library includes #include #include +#include // third party includes #include @@ -14,10 +15,13 @@ // 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; + Renderer3D(); ~Renderer3D() override; @@ -46,6 +50,8 @@ class Renderer3D : public GameRenderer { std::array qms; + Deferred2DMap deferred_2d_draw_map; + Camera camera; Texture2D spriteSheet; diff --git a/src/constants.h b/src/constants.h index b75eb26..c9a080b 100644 --- a/src/constants.h +++ b/src/constants.h @@ -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 diff --git a/src/ems.cc b/src/ems.cc index 1d53fc6..73582ea 100644 --- a/src/ems.cc +++ b/src/ems.cc @@ -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() { diff --git a/src/helpers.cc b/src/helpers.cc index a19ad11..cbd1d41 100644 --- a/src/helpers.cc +++ b/src/helpers.cc @@ -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]}; + } +} diff --git a/src/helpers.h b/src/helpers.h index b342a15..8ea9784 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -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 diff --git a/wasm_build/Makefile b/wasm_build/Makefile index bb1e1ed..b789d29 100644 --- a/wasm_build/Makefile +++ b/wasm_build/Makefile @@ -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++ -- 2.49.0