Begin work on environment
All checks were successful
Build and Publish WASM version of demo / Build-And-Deploy (push) Successful in 16s

This commit is contained in:
Stephen Seo 2023-08-07 12:54:23 +09:00
parent bd3f760588
commit fe59f09af5
7 changed files with 83 additions and 53 deletions

View file

@ -16,14 +16,16 @@ SOURCES = \
src/screen_test.cc \ src/screen_test.cc \
src/screen_trunner.cc \ src/screen_trunner.cc \
src/3d_helpers.cc \ src/3d_helpers.cc \
src/raymath.cc src/raymath.cc \
src/ems.cc
HEADERS = \ HEADERS = \
src/game.h \ src/game.h \
src/screen.h \ src/screen.h \
src/screen_test.h \ src/screen_test.h \
src/screen_trunner.h \ src/screen_trunner.h \
src/3d_helpers.h src/3d_helpers.h \
src/ems.h
OBJECTS = $(addprefix ${OBJDIR}/,$(subst .cc,.cc.o,${SOURCES})) OBJECTS = $(addprefix ${OBJDIR}/,$(subst .cc,.cc.o,${SOURCES}))

View 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}; 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) { Matrix operator*(const Matrix &a, const Matrix &b) {
return MatrixMultiply(a, b); return MatrixMultiply(a, b);
} }

View file

@ -14,6 +14,8 @@ extern Matrix translate_matrix_y(float distance);
extern Matrix translate_matrix_z(float distance); extern Matrix translate_matrix_z(float distance);
extern Matrix translate_matrix_xyz(float x, float y, float z); 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); extern Matrix operator*(const Matrix &a, const Matrix &b);
// Unimplemented as this function isn't really needed and it exposes some // Unimplemented as this function isn't really needed and it exposes some

View file

@ -11,12 +11,24 @@ EM_JS(int, canvas_get_width, (),
EM_JS(int, canvas_get_height, (), EM_JS(int, canvas_get_height, (),
{ return document.getElementById("canvas").clientHeight; }); { 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_width() { return canvas_get_width(); }
int call_js_get_canvas_height() { return canvas_get_height(); } int call_js_get_canvas_height() { return canvas_get_height(); }
float call_js_get_random() { return js_get_random(); }
#else #else
#include <random>
int call_js_get_canvas_width() { return 800; } int call_js_get_canvas_width() { return 800; }
int call_js_get_canvas_height() { 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 #endif

View file

@ -4,4 +4,6 @@
extern int call_js_get_canvas_width(); extern int call_js_get_canvas_width();
extern int call_js_get_canvas_height(); extern int call_js_get_canvas_height();
extern float call_js_get_random();
#endif #endif

View file

@ -1,67 +1,48 @@
#include "screen_trunner.h" #include "screen_trunner.h"
// standard library includes // standard library includes
#include <raylib.h>
#include <cassert> #include <cassert>
#include <cmath> #include <cmath>
// local includes // local includes
#include "3d_helpers.h" #include "3d_helpers.h"
#include "ems.h"
TRunnerScreen::TRunnerScreen(std::weak_ptr<ScreenStack> stack) TRunnerScreen::TRunnerScreen(std::weak_ptr<ScreenStack> stack)
: Screen(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}, Vector3{0.0F, 1.0F, 0.0F}, 80.0F, CAMERA_PERSPECTIVE},
flags(), flags(),
default_material(LoadMaterialDefault()),
TEMP_cube_model(LoadModel("res/test_cube.obj")), 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_cube_texture(LoadTexture("res/test_cube_texture.png")),
TEMP_matrix(get_identity_matrix()), TEMP_matrix(get_identity_matrix()),
TEMP_permanent_matrix(get_identity_matrix()), camera_pos{0.0F, 4.0F, 4.0F},
TEMP_value(0.0F), camera_target{0.0F, 0.0F, 0.0F},
TEMP_current_state(0) { pos_value(0.0F) {
TEMP_cube_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = TEMP_cube_model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture =
TEMP_cube_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() { TRunnerScreen::~TRunnerScreen() {
UnloadTexture(TEMP_cube_texture); UnloadTexture(TEMP_cube_texture);
UnloadMesh(plane_mesh);
UnloadModel(TEMP_cube_model); UnloadModel(TEMP_cube_model);
UnloadMaterial(default_material);
} }
bool TRunnerScreen::update(float dt) { bool TRunnerScreen::update(float dt) {
TEMP_value += TEMP_VALUE_INC_RATE * dt; pos_value += dt * POS_VALUE_INC_RATE;
if (TEMP_value < PI / 2.0F) { if (pos_value > PI * 2.0F) {
TEMP_matrix = get_rotation_matrix_about_z(TEMP_value); pos_value -= PI * 2.0F;
} 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);
} }
camera_pos.x = std::sin(pos_value) * 4.0F;
camera_pos.z = std::cos(pos_value) * 4.0F;
camera_to_targets(dt);
return false; return false;
} }
@ -70,10 +51,20 @@ bool TRunnerScreen::draw() {
ClearBackground(PixelToColor(Pixel::PIXEL_SKY)); ClearBackground(PixelToColor(Pixel::PIXEL_SKY));
BeginMode3D(camera); BeginMode3D(camera);
// DrawMesh(TEMP_cube, TEMP_default_material, TEMP_matrix * for (int z = -25; z <= 25; ++z) {
// TEMP_offset_matrix); for (int x = -25; x <= 25; ++x) {
DrawModel(Model{.transform = TEMP_cube_model.transform * if (x == 0 && z == 0) {
TEMP_permanent_matrix * TEMP_matrix, 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, .meshCount = TEMP_cube_model.meshCount,
.materialCount = TEMP_cube_model.materialCount, .materialCount = TEMP_cube_model.materialCount,
.meshes = TEMP_cube_model.meshes, .meshes = TEMP_cube_model.meshes,
@ -123,3 +114,19 @@ Color TRunnerScreen::PixelToColor(Pixel p) {
return Color{0, 0, 0, 255}; 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;
}

View file

@ -10,7 +10,8 @@
// third party includes // third party includes
#include <raylib.h> #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 { class TRunnerScreen : public Screen {
public: public:
@ -39,19 +40,18 @@ class TRunnerScreen : public Screen {
static Color PixelToColor(Pixel p); static Color PixelToColor(Pixel p);
const Camera3D camera; Camera3D camera;
std::bitset<64> flags; std::bitset<64> flags;
Material default_material;
Model TEMP_cube_model; Model TEMP_cube_model;
Mesh plane_mesh;
Texture2D TEMP_cube_texture; Texture2D TEMP_cube_texture;
Matrix TEMP_matrix; Matrix TEMP_matrix;
Matrix TEMP_permanent_matrix; Vector3 camera_pos;
float TEMP_value; Vector3 camera_target;
/* float pos_value;
* 0 - rotating about z
* 1 - rotating about y void camera_to_targets(float dt);
* 2 - rotating about x
*/
int TEMP_current_state;
}; };
#endif #endif