]> git.seodisparate.com - jumpartifact.com_demo_0/commitdiff
Begin work on environment
authorStephen Seo <seo.disparate@gmail.com>
Mon, 7 Aug 2023 03:54:23 +0000 (12:54 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Mon, 7 Aug 2023 03:54:23 +0000 (12:54 +0900)
Makefile
src/3d_helpers.cc
src/3d_helpers.h
src/ems.cc
src/ems.h
src/screen_trunner.cc
src/screen_trunner.h

index b1ea6272a5e952bfc71af22615d96b018262a0a2..09c40267a8879600f6ee1bb4756626a7ddc878f4 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -16,14 +16,16 @@ SOURCES = \
                src/screen_test.cc \
                src/screen_trunner.cc \
                src/3d_helpers.cc \
-               src/raymath.cc
+               src/raymath.cc \
+               src/ems.cc
 
 HEADERS = \
                src/game.h \
                src/screen.h \
                src/screen_test.h \
                src/screen_trunner.h \
-               src/3d_helpers.h
+               src/3d_helpers.h \
+               src/ems.h
 
 OBJECTS = $(addprefix ${OBJDIR}/,$(subst .cc,.cc.o,${SOURCES}))
 
index a02ad680636711965790694fd0b025aa4696504c..850893f84b52e24670f83faf9b7fb0092f80e60b 100644 (file)
@@ -117,6 +117,11 @@ Matrix translate_matrix_xyz(float x, float y, float z) {
                 0.0F, 0.0F, 1.0F, z, 0.0F, 0.0F, 0.0F, 1.0F};
 }
 
+Matrix scale_matrix_xyz(float x, float y, float z) {
+  return Matrix{x,    0.0F, 0.0F, 0.0F, 0.0F, y,    0.0F, 0.0F,
+                0.0F, 0.0F, z,    0.0F, 0.0F, 0.0F, 0.0F, 1.0F};
+}
+
 Matrix operator*(const Matrix &a, const Matrix &b) {
   return MatrixMultiply(a, b);
 }
index 27f30a353bd9187c671c922065d6c919f90847a8..ba1d0958c2a781194ed66b85ea136de437e566fa 100644 (file)
@@ -14,6 +14,8 @@ extern Matrix translate_matrix_y(float distance);
 extern Matrix translate_matrix_z(float distance);
 extern Matrix translate_matrix_xyz(float x, float y, float z);
 
+extern Matrix scale_matrix_xyz(float x, float y, float z);
+
 extern Matrix operator*(const Matrix &a, const Matrix &b);
 
 // Unimplemented as this function isn't really needed and it exposes some
index e16927e12abffd4748e1a0bd1b602c14390d28cf..16e8e61acd4ba154929b0b4ce74d32e26478ca33 100644 (file)
@@ -11,12 +11,24 @@ EM_JS(int, canvas_get_width, (),
 EM_JS(int, canvas_get_height, (),
       { return document.getElementById("canvas").clientHeight; });
 
+EM_JS(int, js_get_random, (), { return Math.random(); });
+
 int call_js_get_canvas_width() { return canvas_get_width(); }
 
 int call_js_get_canvas_height() { return canvas_get_height(); }
 
+float call_js_get_random() { return js_get_random(); }
+
 #else
+#include <random>
+
 int call_js_get_canvas_width() { return 800; }
 
 int call_js_get_canvas_height() { return 800; }
+
+float call_js_get_random() {
+  static std::default_random_engine re{std::random_device()()};
+  static std::uniform_real_distribution<float> dist(0.0F, 1.0F);
+  return dist(re);
+}
 #endif
index 772073be79d979e2bf0657c6b0b0aacc0c148ecb..dc8aff3bbd34c090ae57bcc06d3f8d5ddc326ee1 100644 (file)
--- a/src/ems.h
+++ b/src/ems.h
@@ -4,4 +4,6 @@
 extern int call_js_get_canvas_width();
 extern int call_js_get_canvas_height();
 
+extern float call_js_get_random();
+
 #endif
index 2e8f39f1c93c0fbf53943567c9c18f0f93735d75..8e1a6154833fda24aeb161b3e5da0de392cb7676 100644 (file)
@@ -1,67 +1,48 @@
 #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;
 }
 
@@ -70,10 +51,20 @@ bool TRunnerScreen::draw() {
   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,
@@ -123,3 +114,19 @@ Color TRunnerScreen::PixelToColor(Pixel p) {
       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;
+}
index 93f6a7530b413da4bb6edc312f00b1a95fc51a65..46ea5ab8f22dfec14c5a8c174ae05b5cbb5949bc 100644 (file)
@@ -10,7 +10,8 @@
 // third party includes
 #include <raylib.h>
 
-constexpr float TEMP_VALUE_INC_RATE = 1.0F;
+constexpr float POS_VALUE_INC_RATE = 0.5F;
+constexpr float CAMERA_UPDATE_RATE = 1.0F;
 
 class TRunnerScreen : public Screen {
  public:
@@ -39,19 +40,18 @@ class TRunnerScreen : public Screen {
 
   static Color PixelToColor(Pixel p);
 
-  const Camera3D camera;
+  Camera3D camera;
   std::bitset<64> flags;
+  Material default_material;
   Model TEMP_cube_model;
+  Mesh plane_mesh;
   Texture2D TEMP_cube_texture;
   Matrix TEMP_matrix;
-  Matrix TEMP_permanent_matrix;
-  float TEMP_value;
-  /*
-   * 0 - rotating about z
-   * 1 - rotating about y
-   * 2 - rotating about x
-   */
-  int TEMP_current_state;
+  Vector3 camera_pos;
+  Vector3 camera_target;
+  float pos_value;
+
+  void camera_to_targets(float dt);
 };
 
 #endif