#include "screen_trunner.h"
// standard library includes
-#include <raylib.h>
-
#include <cassert>
#include <cmath>
// local includes
#include "3d_helpers.h"
+#include "ems.h"
TRunnerScreen::TRunnerScreen(std::weak_ptr<ScreenStack> stack)
: Screen(stack),
- camera{Vector3{0.0F, 0.0F, 0.0F}, Vector3{0.0F, 0.0F, -1.0F},
+ camera{Vector3{0.0F, 1.0F, 0.5F}, Vector3{0.0F, 0.0F, 0.0F},
Vector3{0.0F, 1.0F, 0.0F}, 80.0F, CAMERA_PERSPECTIVE},
flags(),
+ default_material(LoadMaterialDefault()),
TEMP_cube_model(LoadModel("res/test_cube.obj")),
+ plane_mesh(GenMeshPlane(1.0F, 1.0F, 2, 2)),
TEMP_cube_texture(LoadTexture("res/test_cube_texture.png")),
TEMP_matrix(get_identity_matrix()),
- TEMP_permanent_matrix(get_identity_matrix()),
- TEMP_value(0.0F),
- TEMP_current_state(0) {
+ camera_pos{0.0F, 4.0F, 4.0F},
+ camera_target{0.0F, 0.0F, 0.0F},
+ pos_value(0.0F) {
TEMP_cube_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture =
TEMP_cube_texture;
+ TEMP_cube_model.transform = TEMP_cube_model.transform *
+ scale_matrix_xyz(0.5F, 0.5F, 0.5F) *
+ translate_matrix_y(0.5F);
}
TRunnerScreen::~TRunnerScreen() {
UnloadTexture(TEMP_cube_texture);
+ UnloadMesh(plane_mesh);
UnloadModel(TEMP_cube_model);
+ UnloadMaterial(default_material);
}
bool TRunnerScreen::update(float dt) {
- TEMP_value += TEMP_VALUE_INC_RATE * dt;
- if (TEMP_value < PI / 2.0F) {
- TEMP_matrix = get_rotation_matrix_about_z(TEMP_value);
- } else if (TEMP_value < PI) {
- if (TEMP_current_state == 0) {
- TEMP_current_state = 1;
- TEMP_permanent_matrix =
- TEMP_permanent_matrix * get_rotation_matrix_about_z(PI / 2.0F);
- } else if (TEMP_current_state != 1) {
- assert(!"unreachable");
- }
- TEMP_matrix = get_rotation_matrix_about_y(TEMP_value - PI / 2.0F);
- } else if (TEMP_value < PI * 3.0F / 2.0F) {
- if (TEMP_current_state == 1) {
- TEMP_current_state = 2;
- TEMP_permanent_matrix =
- TEMP_permanent_matrix * get_rotation_matrix_about_y(PI / 2.0F);
- } else if (TEMP_current_state != 2) {
- assert(!"unreachable");
- }
- TEMP_matrix = get_rotation_matrix_about_x(TEMP_value - PI);
- } else {
- if (TEMP_current_state == 2) {
- TEMP_current_state = 0;
- TEMP_permanent_matrix =
- TEMP_permanent_matrix * get_rotation_matrix_about_x(PI / 2.0F);
- } else {
- assert(!"unreachable");
- }
- TEMP_value -= PI * 3.0F / 2.0F;
- TEMP_matrix = get_rotation_matrix_about_z(TEMP_value);
+ pos_value += dt * POS_VALUE_INC_RATE;
+ if (pos_value > PI * 2.0F) {
+ pos_value -= PI * 2.0F;
}
+ camera_pos.x = std::sin(pos_value) * 4.0F;
+ camera_pos.z = std::cos(pos_value) * 4.0F;
+ camera_to_targets(dt);
return false;
}
ClearBackground(PixelToColor(Pixel::PIXEL_SKY));
BeginMode3D(camera);
- // DrawMesh(TEMP_cube, TEMP_default_material, TEMP_matrix *
- // TEMP_offset_matrix);
- DrawModel(Model{.transform = TEMP_cube_model.transform *
- TEMP_permanent_matrix * TEMP_matrix,
+ for (int z = -25; z <= 25; ++z) {
+ for (int x = -25; x <= 25; ++x) {
+ if (x == 0 && z == 0) {
+ default_material.maps[MATERIAL_MAP_DIFFUSE].color = RAYWHITE;
+ } else {
+ default_material.maps[MATERIAL_MAP_DIFFUSE].color =
+ Color{(unsigned char)(200 + x * 2), (unsigned char)(150 + z * 2),
+ 20, 255};
+ }
+ DrawMesh(plane_mesh, default_material, translate_matrix_xyz(x, 0.0F, z));
+ }
+ }
+
+ DrawModel(Model{.transform = TEMP_cube_model.transform * TEMP_matrix,
.meshCount = TEMP_cube_model.meshCount,
.materialCount = TEMP_cube_model.materialCount,
.meshes = TEMP_cube_model.meshes,
return Color{0, 0, 0, 255};
}
}
+
+void TRunnerScreen::camera_to_targets(float dt) {
+ camera.position.x +=
+ (camera_pos.x - camera.position.x) * CAMERA_UPDATE_RATE * dt;
+ camera.position.y +=
+ (camera_pos.y - camera.position.y) * CAMERA_UPDATE_RATE * dt;
+ camera.position.z +=
+ (camera_pos.z - camera.position.z) * CAMERA_UPDATE_RATE * dt;
+
+ camera.target.x +=
+ (camera_target.x - camera.target.x) * CAMERA_UPDATE_RATE * dt;
+ camera.target.y +=
+ (camera_target.y - camera.target.y) * CAMERA_UPDATE_RATE * dt;
+ camera.target.z +=
+ (camera_target.z - camera.target.z) * CAMERA_UPDATE_RATE * dt;
+}