#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;
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");
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() {
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();
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();
// required dependency include
#include "game_renderer.h"
+// standard library includes
+#include <bitset>
+
// third party includes
#include <raylib.h>
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
#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;
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
#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