From 33400ca06bd9fb55241b2d7c7a213e71cf5138a7 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 12 Jan 2023 13:39:52 +0900 Subject: [PATCH] Renderer3D: Impl "overview" camera mode --- CMakeLists.txt | 1 + src/3d_renderer.cc | 53 ++++++++++++++++++++++++++++++++++++++++----- src/3d_renderer.h | 15 +++++++++++++ src/constants.cc | 5 +++++ src/constants.h | 14 ++++++++++++ src/helpers.cc | 7 ++++++ src/helpers.h | 6 +++++ wasm_build/Makefile | 3 ++- 8 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 src/constants.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 16f8644..826a918 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ set(RPSDuelNative_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/src/ems.cc" "${CMAKE_CURRENT_SOURCE_DIR}/src/helpers.cc" "${CMAKE_CURRENT_SOURCE_DIR}/src/3d_renderer.cc" + "${CMAKE_CURRENT_SOURCE_DIR}/src/constants.cc" ) set(RPSDuelNative_HEADERS diff --git a/src/3d_renderer.cc b/src/3d_renderer.cc index 3e8fc26..7484544 100644 --- a/src/3d_renderer.cc +++ b/src/3d_renderer.cc @@ -1,8 +1,18 @@ #include "3d_renderer.h" -#include - -Renderer3D::Renderer3D() { +// standard library includes +#include +#include +#include + +// local includes +#include "constants.h" +#include "helpers.h" + +Renderer3D::Renderer3D() + : overview_start{OVERVIEW_LEFT_X, OVERVIEW_LEFT_Y, OVERVIEW_LEFT_Z}, + overview_end{OVERVIEW_RIGHT_X, OVERVIEW_RIGHT_Y, OVERVIEW_RIGHT_Z}, + overview_timer(OVERVIEW_TIMER_MAX) { camera.position.x = 0.0F; camera.position.y = 5.0F; camera.position.z = 10.0F; @@ -19,6 +29,8 @@ Renderer3D::Renderer3D() { camera.projection = CAMERA_PERSPECTIVE; + SetCameraMode(camera, CAMERA_CUSTOM); + skybox_texture = LoadTexture("resources/skybox.gif"); platform_texture = LoadTexture("resources/platform_texture.png"); qm_texture = LoadTexture("resources/question_mark_texture.png"); @@ -41,6 +53,8 @@ Renderer3D::Renderer3D() { paper_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = paper_texture; scissors_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = scissors_texture; + + flags.set(1); } Renderer3D::~Renderer3D() { @@ -65,7 +79,18 @@ void Renderer3D::update_state(const char *playerOne, const char *playerTwo, char second_first, char second_second, char second_third, bool first_ready, bool second_ready, int pos, int matchup_idx, - bool gameover) {} + bool gameover) { + if (std::strcmp(playerOne, currentPlayer) == 0) { + flags.set(2); + flags.reset(3); + } else if (std::strcmp(playerTwo, currentPlayer) == 0) { + flags.reset(2); + flags.reset(3); + } else { + flags.reset(2); + flags.set(3); + } +} void Renderer3D::do_update() { update_impl(); @@ -74,7 +99,25 @@ void Renderer3D::do_update() { void Renderer3D::screen_size_changed() {} -void Renderer3D::update_impl() { UpdateCamera(&camera); } +void Renderer3D::update_impl() { + const float dt = GetFrameTime(); + + if (flags.test(0)) { + } else { + overview_timer -= dt; + if (overview_timer <= 0.0F) { + overview_timer += OVERVIEW_TIMER_MAX; + flags.flip(1); + } + + float value = flags.test(1) ? (1.0F - overview_timer / OVERVIEW_TIMER_MAX) + : (overview_timer / OVERVIEW_TIMER_MAX); + value = (std::cos(PI_F * value) + 1.0F) / 2.0F; + Helpers::lerp_v3(&overview_start, &overview_end, &camera.position, value); + } + + UpdateCamera(&camera); +} void Renderer3D::draw_impl() { BeginDrawing(); diff --git a/src/3d_renderer.h b/src/3d_renderer.h index 96098fd..842f49b 100644 --- a/src/3d_renderer.h +++ b/src/3d_renderer.h @@ -4,6 +4,9 @@ // required dependency include #include "game_renderer.h" +// standard library includes +#include + // third party includes #include @@ -43,7 +46,19 @@ class Renderer3D : public GameRenderer { Model paper_model; Model scissors_model; + const Vector3 overview_start; + const Vector3 overview_end; Vector3 root_pos; + + /* + * 0 - focus view if true, overview view if false + * 1 - overview view movement direction (right if true) + * 2 - is player one + * 3 - is spectator + */ + std::bitset<64> flags; + + float overview_timer; }; #endif diff --git a/src/constants.cc b/src/constants.cc new file mode 100644 index 0000000..c405ebe --- /dev/null +++ b/src/constants.cc @@ -0,0 +1,5 @@ +#include "constants.h" + +#include + +const float PI_F = std::acos(-1.0F); diff --git a/src/constants.h b/src/constants.h index 31f2869..67216d4 100644 --- a/src/constants.h +++ b/src/constants.h @@ -1,6 +1,8 @@ #ifndef ROCK_PAPER_SCISSORS_DUEL_CONSTANTS_H_ #define ROCK_PAPER_SCISSORS_DUEL_CONSTANTS_H_ +extern const float PI_F; + constexpr int DEFAULT_SCREEN_WIDTH = 500; constexpr int DEFAULT_SCREEN_HEIGHT = 800; @@ -24,4 +26,16 @@ constexpr float REQUEST_TIMER_MAX = 3.0F; constexpr int DEFAULT_STATUS_TEXT_SIZE = 30; +// Renderer3D + +constexpr float OVERVIEW_TIMER_MAX = 14.0F; + +constexpr float OVERVIEW_LEFT_X = -20.0F; +constexpr float OVERVIEW_LEFT_Y = 5.0F; +constexpr float OVERVIEW_LEFT_Z = 20.0F; + +constexpr float OVERVIEW_RIGHT_X = 20.0F; +constexpr float OVERVIEW_RIGHT_Y = 5.0F; +constexpr float OVERVIEW_RIGHT_Z = 20.0F; + #endif diff --git a/src/helpers.cc b/src/helpers.cc index 0d9a9de..a4dd7af 100644 --- a/src/helpers.cc +++ b/src/helpers.cc @@ -19,3 +19,10 @@ int Helpers::getFitableSize(const char *text, const int default_size, return size; } + +void Helpers::lerp_v3(const Vector3 *start, const Vector3 *end, Vector3 *out, + float value) { + out->x = start->x * (1.0F - value) + end->x * value; + out->y = start->y * (1.0F - value) + end->y * value; + out->z = start->z * (1.0F - value) + end->z * value; +} diff --git a/src/helpers.h b/src/helpers.h index 1b73ced..c3b4c30 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -1,12 +1,18 @@ #ifndef ROCK_PAPER_SCISSORS_DUEL_HELPERS_H_ #define ROCK_PAPER_SCISSORS_DUEL_HELPERS_H_ +// forard declarations +struct Vector3; + namespace Helpers { extern bool isValidChoice(char choice); extern int getFitableSize(const char *text, const int default_size, const int width); +extern void lerp_v3(const Vector3 *start, const Vector3 *end, Vector3 *out, + float value); + } // namespace Helpers #endif diff --git a/wasm_build/Makefile b/wasm_build/Makefile index 671262f..f6898b4 100644 --- a/wasm_build/Makefile +++ b/wasm_build/Makefile @@ -9,7 +9,8 @@ SOURCES = \ ../src/ems.cc \ ../src/basic_renderer.cc \ ../src/helpers.cc \ - ../src/3d_renderer.cc + ../src/3d_renderer.cc \ + ../src/constants.cc HEADERS = \ ../src/constants.h \ -- 2.49.0