]> git.seodisparate.com - RockPaperScissorsDuel/commitdiff
Renderer3D: Impl "overview" camera mode
authorStephen Seo <seo.disparate@gmail.com>
Thu, 12 Jan 2023 04:39:52 +0000 (13:39 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Thu, 12 Jan 2023 04:39:52 +0000 (13:39 +0900)
CMakeLists.txt
src/3d_renderer.cc
src/3d_renderer.h
src/constants.cc [new file with mode: 0644]
src/constants.h
src/helpers.cc
src/helpers.h
wasm_build/Makefile

index 16f8644086be2b079466c557630ea78076b99f5d..826a9187b1638e68b6e3914fba80d859053b1f79 100644 (file)
@@ -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
index 3e8fc267fd42ef0b56183c09ee35bf6bb64d2348..7484544c8cc632714c315f3af084344f8970599a 100644 (file)
@@ -1,8 +1,18 @@
 #include "3d_renderer.h"
 
-#include <raylib.h>
-
-Renderer3D::Renderer3D() {
+// standard library includes
+#include <cmath>
+#include <cstring>
+#include <iostream>
+
+// 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();
index 96098fd9c95c96427735866b0643a5bdc3ee4db8..842f49ba836ce9335b05f22dae0f36d1f7b1e00d 100644 (file)
@@ -4,6 +4,9 @@
 // required dependency include
 #include "game_renderer.h"
 
+// standard library includes
+#include <bitset>
+
 // third party includes
 #include <raylib.h>
 
@@ -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 (file)
index 0000000..c405ebe
--- /dev/null
@@ -0,0 +1,5 @@
+#include "constants.h"
+
+#include <cmath>
+
+const float PI_F = std::acos(-1.0F);
index 31f2869205ceb21068a716098bdc87cdd6315f30..67216d465e4e91d17704f5190ef13604e73783df 100644 (file)
@@ -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
index 0d9a9ded5ed7404ae5bbc2006412147ed469558b..a4dd7af5d56e6b9ce957716c0bfb787ca5292e0a 100644 (file)
@@ -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;
+}
index 1b73ced6801087edc6ec9abddc31ce3ed27dec35..c3b4c30012a2d35ee69232b8ab6e110a6ef9f147 100644 (file)
@@ -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
index 671262f322cc1f70c53ad61f0c13cc9ed204e438..f6898b4d7e3255a5d18fa6b0e037d63ec322e59b 100644 (file)
@@ -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 \