mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-06-18 00:27:02 +08:00
feat: add Config class
This commit is contained in:
@@ -27,6 +27,7 @@ public:
|
||||
void update_move_camera();
|
||||
|
||||
void camera_init(Player* player);
|
||||
void hot_reload();
|
||||
void reset_camera();
|
||||
void update_cursor_position_camera(double xpos, double ypos);
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#pragma once
|
||||
#include <array>
|
||||
#include <toml++/toml.hpp>
|
||||
|
||||
#include <Cubed/tools/cubed_assert.hpp>
|
||||
|
||||
namespace Cubed {
|
||||
|
||||
@@ -8,149 +11,118 @@ constexpr int MAX_BLOCK_NUM = 7;
|
||||
constexpr int MAX_UI_NUM = 1;
|
||||
|
||||
constexpr int CHUCK_SIZE = 16;
|
||||
constexpr int DISTANCE = 24;
|
||||
constexpr int PRE_LOAD_DISTANCE = 24;
|
||||
constexpr int MAX_DISTANCE = 128;
|
||||
constexpr int MAX_BLOCK_STATUS = 1;
|
||||
constexpr int MAX_CHARACTER = 128;
|
||||
constexpr float NORMAL_FOV = 70.0f;
|
||||
|
||||
constexpr int MAX_BIOME_SUM = 4;
|
||||
using HeightMapArray = std::array<std::array<float, CHUCK_SIZE>, CHUCK_SIZE>;
|
||||
constexpr float VERTICES_POS[6][6][3] = {
|
||||
// ===== front (z = +1) =====
|
||||
0.0f, 0.0f, 1.0f, // bottom left
|
||||
0.0f, 1.0f, 1.0f, // top left
|
||||
1.0f, 1.0f, 1.0f, // top right
|
||||
1.0f, 1.0f, 1.0f, // top right
|
||||
1.0f, 0.0f, 1.0f, // bottom right
|
||||
0.0f, 0.0f, 1.0f, // bottom left
|
||||
// ===== right (x = +1) =====
|
||||
1.0f, 0.0f, 1.0f, // bottom front
|
||||
1.0f, 0.0f, 0.0f, // bottom back
|
||||
1.0f, 1.0f, 0.0f, // top back
|
||||
1.0f, 1.0f, 0.0f, // top back
|
||||
1.0f, 1.0f, 1.0f, // top front
|
||||
1.0f, 0.0f, 1.0f, // bottom front
|
||||
// ===== back (z = -1) =====
|
||||
0.0f, 0.0f, 0.0f, // bottom left
|
||||
1.0f, 0.0f, 0.0f, // bottom right
|
||||
1.0f, 1.0f, 0.0f, // top right
|
||||
1.0f, 1.0f, 0.0f, // top right
|
||||
0.0f, 1.0f, 0.0f, // top left
|
||||
0.0f, 0.0f, 0.0f, // bottom left
|
||||
// ===== left (x = -1) =====
|
||||
0.0f, 0.0f, 0.0f, // bottom back
|
||||
0.0f, 0.0f, 1.0f, // bottom front
|
||||
0.0f, 1.0f, 1.0f, // top front
|
||||
0.0f, 1.0f, 1.0f, // top front
|
||||
0.0f, 1.0f, 0.0f, // top back
|
||||
0.0f, 0.0f, 0.0f, // bottom back
|
||||
// ===== top (y = +1) =====
|
||||
0.0f, 1.0f, 0.0f, // back left
|
||||
1.0f, 1.0f, 0.0f, // back right
|
||||
1.0f, 1.0f, 1.0f, // front right
|
||||
1.0f, 1.0f, 1.0f, // front right
|
||||
0.0f, 1.0f, 1.0f, // front left
|
||||
0.0f, 1.0f, 0.0f, // back left
|
||||
// ===== bottom (y = -1) =====
|
||||
0.0f, 0.0f, 1.0f, // front left
|
||||
1.0f, 0.0f, 1.0f, // front right
|
||||
1.0f, 0.0f, 0.0f, // back right
|
||||
1.0f, 0.0f, 0.0f, // back right
|
||||
0.0f, 0.0f, 0.0f, // back left
|
||||
0.0f, 0.0f, 1.0f // front left
|
||||
};
|
||||
|
||||
constexpr float TEX_COORDS[6][6][2] = {
|
||||
// ===== front (z = +1) =====
|
||||
0.0f, 1.0f, // bottom left
|
||||
0.0f, 0.0f, // top left
|
||||
1.0f, 0.0f, // top right
|
||||
1.0f, 0.0f, // top right
|
||||
1.0f, 1.0f, // bottom right
|
||||
0.0f, 1.0f, // bottom left
|
||||
// ===== right (x = +1) =====
|
||||
0.0f, 1.0f, // bottom front
|
||||
1.0f, 1.0f, // bottom back
|
||||
1.0f, 0.0f, // top back
|
||||
1.0f, 0.0f, // top back
|
||||
0.0f, 0.0f, // top front
|
||||
0.0f, 1.0f, // bottom front
|
||||
// ===== back (z = -1) =====
|
||||
1.0f, 1.0f, // bottom left
|
||||
0.0f, 1.0f, // bottom right
|
||||
0.0f, 0.0f, // top right
|
||||
0.0f, 0.0f, // top right
|
||||
1.0f, 0.0f, // top left
|
||||
1.0f, 1.0f, // bottom left
|
||||
// ===== left (x = -1) =====
|
||||
1.0f, 1.0f, // bottom back
|
||||
0.0f, 1.0f, // bottom front
|
||||
0.0f, 0.0f, // top front
|
||||
0.0f, 0.0f, // top front
|
||||
1.0f, 0.0f, // top back
|
||||
1.0f, 1.0f, // bottom back
|
||||
// ===== top (y = +1) =====
|
||||
0.0f, 0.0f, // back left
|
||||
1.0f, 0.0f, // back right
|
||||
1.0f, 1.0f, // front right
|
||||
1.0f, 1.0f, // front right
|
||||
0.0f, 1.0f, // front left
|
||||
0.0f, 0.0f, // back left
|
||||
// ===== bottom (y = -1) =====
|
||||
0.0f, 0.0f, // front left
|
||||
1.0f, 0.0f, // front right
|
||||
1.0f, 1.0f, // back right
|
||||
1.0f, 1.0f, // back right
|
||||
0.0f, 1.0f, // back left
|
||||
0.0f, 0.0f, // front left
|
||||
};
|
||||
|
||||
constexpr float CUBE_VER[24] = {
|
||||
0.0, 0.0, 0.0,
|
||||
1.0, 0.0, 0.0,
|
||||
1.0, 1.0, 0.0,
|
||||
0.0, 1.0, 0.0,
|
||||
0.0, 0.0, 1.0,
|
||||
1.0, 0.0, 1.0,
|
||||
1.0, 1.0, 1.0,
|
||||
0.0, 1.0, 1.0
|
||||
};
|
||||
|
||||
|
||||
constexpr int OUTLINE_CUBE_INDICES[24] = {
|
||||
0,1, 1,2, 2,3, 3,0,
|
||||
4,5, 5,6, 6,7, 7,4,
|
||||
0,4, 1,5, 2,6, 3,7
|
||||
};
|
||||
template <typename T>
|
||||
concept TomlValueType =
|
||||
std::same_as<T, int> ||
|
||||
std::same_as<T, bool> ||
|
||||
std::same_as<T, double> ||
|
||||
std::same_as<T, const char*> ||
|
||||
std::same_as<T, toml::date> ||
|
||||
std::same_as<T, toml::time> ||
|
||||
std::same_as<T, toml::date_time> ||
|
||||
std::same_as<T, std::string>
|
||||
;
|
||||
|
||||
constexpr float SQUARE_VERTICES[6][2] = {
|
||||
-0.5f, -0.5f, // bottom left
|
||||
-0.5f, 0.5f, // top left
|
||||
0.5f, 0.5f, // top right
|
||||
0.5f, 0.5f, // top right
|
||||
0.5f, -0.5f, // bottom right
|
||||
-0.5f, -0.5f // bottom left
|
||||
};
|
||||
class Config {
|
||||
public:
|
||||
Config();
|
||||
~Config();
|
||||
|
||||
constexpr float SQUARE_TEXTURE_POS[6][2] = {
|
||||
0.0f, 0.0f,
|
||||
0.0f, 1.0f,
|
||||
1.0f, 1.0f,
|
||||
1.0f, 1.0f,
|
||||
1.0f, 0.0f,
|
||||
0.0f, 0.0f,
|
||||
};
|
||||
static Config& get();
|
||||
|
||||
struct Vertex {
|
||||
float x = 0.0f, y = 0.0f, z = 0.0f;
|
||||
float s = 0.0f, t = 0.0f;
|
||||
float layer = 0.0f;
|
||||
};
|
||||
toml::table& table();
|
||||
|
||||
void load_or_create_config();
|
||||
void save_to_file();
|
||||
|
||||
template <TomlValueType T>
|
||||
T get(std::string_view key) const{
|
||||
size_t cur = 0;
|
||||
auto pos = key.find('.');
|
||||
const toml::table* table = &m_tbl;
|
||||
while (pos != std::string_view::npos) {
|
||||
std::string_view s = key.substr(cur, pos - cur);
|
||||
if (s.empty()) {
|
||||
Logger::error("Empty key/table name in path '{}'", key);
|
||||
ASSERT(false);
|
||||
std::abort();
|
||||
}
|
||||
cur = pos + 1;
|
||||
pos = key.find('.', cur);
|
||||
if (auto* next = (*table)[s].as_table()) {
|
||||
table = next;
|
||||
} else {
|
||||
Logger::error("Can't find table {}", s);
|
||||
ASSERT(false);
|
||||
std::abort();
|
||||
}
|
||||
}
|
||||
std::string_view n_key = key.substr(cur);
|
||||
if (n_key.empty()) {
|
||||
Logger::error("Trailing dot in path '{}'", key);
|
||||
ASSERT(false);
|
||||
std::abort();
|
||||
}
|
||||
auto opt = (*table)[n_key].value<T>();
|
||||
if (opt){
|
||||
return *opt;
|
||||
} else {
|
||||
Logger::error("Can't find key {}", n_key);
|
||||
ASSERT(false);
|
||||
std::abort();
|
||||
}
|
||||
}
|
||||
template <typename T>
|
||||
void set(std::string_view key, T&& val) {
|
||||
if constexpr (!TomlValueType<std::decay_t<T>>) {
|
||||
static_assert(false, "Type Not Support");
|
||||
}
|
||||
size_t cur = 0;
|
||||
auto pos = key.find('.');
|
||||
toml::table* table = &m_tbl;
|
||||
while (pos != std::string_view::npos) {
|
||||
std::string_view s = key.substr(cur, pos - cur);
|
||||
if (s.empty()) {
|
||||
Logger::error("Empty key/table name in path '{}'", key);
|
||||
ASSERT(false);
|
||||
std::abort();
|
||||
}
|
||||
cur = pos + 1;
|
||||
pos = key.find('.', cur);
|
||||
if (auto* next = (*table)[s].as_table()) {
|
||||
table = next;
|
||||
} else {
|
||||
auto [it, inserted] = table->insert_or_assign(s, toml::table{});
|
||||
table = it->second.as_table();
|
||||
}
|
||||
|
||||
}
|
||||
std::string_view n_key = key.substr(cur);
|
||||
if (n_key.empty()) {
|
||||
Logger::error("Trailing dot in path '{}'", key);
|
||||
ASSERT(false);
|
||||
std::abort();
|
||||
}
|
||||
table->insert_or_assign(n_key, std::forward<T>(val));
|
||||
save_to_file();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
toml::table m_tbl;
|
||||
constexpr static inline std::string_view CONGIF_PATH = ASSETS_PATH"config.toml";
|
||||
void create_config();
|
||||
|
||||
struct Vertex2D {
|
||||
float x = 0.0f, y = 0.0f;
|
||||
float s = 0.0f, t = 0.0f;
|
||||
float layer = 0.0f;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <Cubed/primitive_data.hpp>
|
||||
#include <Cubed/ui/text.hpp>
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <cstdint>
|
||||
|
||||
#include <Cubed/config.hpp>
|
||||
#include <Cubed/primitive_data.hpp>
|
||||
#include <Cubed/gameplay/biome.hpp>
|
||||
#include <Cubed/gameplay/chunk_pos.hpp>
|
||||
#include <Cubed/gameplay/block.hpp>
|
||||
|
||||
@@ -49,7 +49,7 @@ private:
|
||||
glm::vec3 move_distance {0.0f, 0.0f, 0.0f};
|
||||
// player is tow block tall, the pos is the lower pos
|
||||
|
||||
glm::vec3 m_player_pos {0.0f, 120.0f, 0.0f};
|
||||
glm::vec3 m_player_pos {0.0f, 255.0f, 0.0f};
|
||||
ChunkPos m_player_chunk_pos {0, 0};
|
||||
|
||||
glm::vec3 m_front {0, 0, -1};
|
||||
@@ -84,12 +84,15 @@ public:
|
||||
const MoveState& get_move_state() const;
|
||||
|
||||
void change_mode(GameMode mode);
|
||||
void hot_reload();
|
||||
void set_player_pos(const glm::vec3& pos);
|
||||
void update(float delta_time);
|
||||
void update_front_vec(float offset_x, float offset_y);
|
||||
void update_player_move_state(int key, int action);
|
||||
void update_scroll(double yoffset);
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <unordered_map>
|
||||
#include <unordered_set>
|
||||
#include <Cubed/AABB.hpp>
|
||||
#include <Cubed/primitive_data.hpp>
|
||||
#include <Cubed/gameplay/chunk.hpp>
|
||||
|
||||
namespace Cubed {
|
||||
@@ -45,7 +46,7 @@ private:
|
||||
std::condition_variable m_gen_cv;
|
||||
std::atomic<bool> m_gen_running{false};
|
||||
std::atomic<bool> m_need_gen_chunk{false};
|
||||
|
||||
std::atomic<int> m_rendering_distance{24};
|
||||
std::vector<ChunkPos> m_dirty_queue;
|
||||
std::vector<ChunkRenderSnapshot> m_render_snapshots;
|
||||
std::vector<std::pair<ChunkPos, Chunk>> m_new_chunk;
|
||||
@@ -90,6 +91,8 @@ public:
|
||||
|
||||
void push_delete_vbo(GLuint vbo);
|
||||
|
||||
void hot_reload();
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
143
include/Cubed/primitive_data.hpp
Normal file
143
include/Cubed/primitive_data.hpp
Normal file
@@ -0,0 +1,143 @@
|
||||
#pragma once
|
||||
|
||||
namespace Cubed {
|
||||
|
||||
constexpr float VERTICES_POS[6][6][3] = {
|
||||
// ===== front (z = +1) =====
|
||||
{{0.0f, 0.0f, 1.0f}, // bottom left
|
||||
{0.0f, 1.0f, 1.0f}, // top left
|
||||
{1.0f, 1.0f, 1.0f}, // top right
|
||||
{1.0f, 1.0f, 1.0f}, // top right
|
||||
{1.0f, 0.0f, 1.0f}, // bottom right
|
||||
{0.0f, 0.0f, 1.0f}}, // bottom left
|
||||
// ===== right (x = +1) =====
|
||||
{{1.0f, 0.0f, 1.0f}, // bottom front
|
||||
{1.0f, 0.0f, 0.0f}, // bottom back
|
||||
{1.0f, 1.0f, 0.0f}, // top back
|
||||
{1.0f, 1.0f, 0.0f}, // top back
|
||||
{1.0f, 1.0f, 1.0f}, // top front
|
||||
{1.0f, 0.0f, 1.0f}}, // bottom front
|
||||
// ===== back (z = -1) =====
|
||||
{{0.0f, 0.0f, 0.0f}, // bottom left
|
||||
{1.0f, 0.0f, 0.0f}, // bottom right
|
||||
{1.0f, 1.0f, 0.0f}, // top right
|
||||
{1.0f, 1.0f, 0.0f}, // top right
|
||||
{0.0f, 1.0f, 0.0f}, // top left
|
||||
{0.0f, 0.0f, 0.0f}}, // bottom left
|
||||
// ===== left (x = -1) =====
|
||||
{{0.0f, 0.0f, 0.0f}, // bottom back
|
||||
{0.0f, 0.0f, 1.0f}, // bottom front
|
||||
{0.0f, 1.0f, 1.0f}, // top front
|
||||
{0.0f, 1.0f, 1.0f}, // top front
|
||||
{0.0f, 1.0f, 0.0f}, // top back
|
||||
{0.0f, 0.0f, 0.0f}}, // bottom back
|
||||
// ===== top (y = +1) =====
|
||||
{{0.0f, 1.0f, 0.0f}, // back left
|
||||
{1.0f, 1.0f, 0.0f}, // back right
|
||||
{1.0f, 1.0f, 1.0f}, // front right
|
||||
{1.0f, 1.0f, 1.0f}, // front right
|
||||
{0.0f, 1.0f, 1.0f}, // front left
|
||||
{0.0f, 1.0f, 0.0f}}, // back left
|
||||
// ===== bottom (y = -1) =====
|
||||
{{0.0f, 0.0f, 1.0f}, // front left
|
||||
{1.0f, 0.0f, 1.0f}, // front right
|
||||
{1.0f, 0.0f, 0.0f}, // back right
|
||||
{1.0f, 0.0f, 0.0f}, // back right
|
||||
{0.0f, 0.0f, 0.0f}, // back left
|
||||
{0.0f, 0.0f, 1.0f}} // front left
|
||||
};
|
||||
|
||||
constexpr float TEX_COORDS[6][6][2] = {
|
||||
// ===== front (z = +1) =====
|
||||
{{0.0f, 1.0f}, // bottom left
|
||||
{0.0f, 0.0f}, // top left
|
||||
{1.0f, 0.0f}, // top right
|
||||
{1.0f, 0.0f}, // top right
|
||||
{1.0f, 1.0f}, // bottom right
|
||||
{0.0f, 1.0f}}, // bottom left
|
||||
// ===== right (x = +1) =====
|
||||
{{0.0f, 1.0f}, // bottom front
|
||||
{1.0f, 1.0f}, // bottom back
|
||||
{1.0f, 0.0f}, // top back
|
||||
{1.0f, 0.0f}, // top back
|
||||
{0.0f, 0.0f}, // top front
|
||||
{0.0f, 1.0f}}, // bottom front
|
||||
// ===== back (z = -1) =====
|
||||
{{1.0f, 1.0f}, // bottom left
|
||||
{0.0f, 1.0f}, // bottom right
|
||||
{0.0f, 0.0f}, // top right
|
||||
{0.0f, 0.0f}, // top right
|
||||
{1.0f, 0.0f}, // top left
|
||||
{1.0f, 1.0f}}, // bottom left
|
||||
// ===== left (x = -1) =====
|
||||
{{1.0f, 1.0f}, // bottom back
|
||||
{0.0f, 1.0f}, // bottom front
|
||||
{0.0f, 0.0f}, // top front
|
||||
{0.0f, 0.0f}, // top front
|
||||
{1.0f, 0.0f}, // top back
|
||||
{1.0f, 1.0f}}, // bottom back
|
||||
// ===== top (y = +1) =====
|
||||
{{0.0f, 0.0f}, // back left
|
||||
{1.0f, 0.0f}, // back right
|
||||
{1.0f, 1.0f}, // front right
|
||||
{1.0f, 1.0f}, // front right
|
||||
{0.0f, 1.0f}, // front left
|
||||
{0.0f, 0.0f}}, // back left
|
||||
// ===== bottom (y = -1) =====
|
||||
{{0.0f, 0.0f}, // front left
|
||||
{1.0f, 0.0f}, // front right
|
||||
{1.0f, 1.0f}, // back right
|
||||
{1.0f, 1.0f}, // back right
|
||||
{0.0f, 1.0f}, // back left
|
||||
{0.0f, 0.0f}} // front left
|
||||
};
|
||||
|
||||
constexpr float CUBE_VER[24] = {
|
||||
0.0, 0.0, 0.0,
|
||||
1.0, 0.0, 0.0,
|
||||
1.0, 1.0, 0.0,
|
||||
0.0, 1.0, 0.0,
|
||||
0.0, 0.0, 1.0,
|
||||
1.0, 0.0, 1.0,
|
||||
1.0, 1.0, 1.0,
|
||||
0.0, 1.0, 1.0
|
||||
};
|
||||
|
||||
|
||||
constexpr int OUTLINE_CUBE_INDICES[24] = {
|
||||
0,1, 1,2, 2,3, 3,0,
|
||||
4,5, 5,6, 6,7, 7,4,
|
||||
0,4, 1,5, 2,6, 3,7
|
||||
};
|
||||
|
||||
constexpr float SQUARE_VERTICES[6][2] = {
|
||||
{-0.5f, -0.5f}, // bottom left
|
||||
{-0.5f, 0.5f}, // top left
|
||||
{ 0.5f, 0.5f}, // top right
|
||||
{ 0.5f, 0.5f}, // top right
|
||||
{ 0.5f, -0.5f}, // bottom right
|
||||
{-0.5f, -0.5f} // bottom left
|
||||
};
|
||||
|
||||
constexpr float SQUARE_TEXTURE_POS[6][2] = {
|
||||
{0.0f, 0.0f},
|
||||
{0.0f, 1.0f},
|
||||
{1.0f, 1.0f},
|
||||
{1.0f, 1.0f},
|
||||
{1.0f, 0.0f},
|
||||
{0.0f, 0.0f},
|
||||
};
|
||||
|
||||
struct Vertex {
|
||||
float x = 0.0f, y = 0.0f, z = 0.0f;
|
||||
float s = 0.0f, t = 0.0f;
|
||||
float layer = 0.0f;
|
||||
};
|
||||
|
||||
struct Vertex2D {
|
||||
float x = 0.0f, y = 0.0f;
|
||||
float s = 0.0f, t = 0.0f;
|
||||
float layer = 0.0f;
|
||||
};
|
||||
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <Cubed/config.hpp>
|
||||
#include <Cubed/primitive_data.hpp>
|
||||
#include <Cubed/shader.hpp>
|
||||
#include <Cubed/ui/text.hpp>
|
||||
|
||||
@@ -18,6 +19,7 @@ public:
|
||||
|
||||
Renderer(const Camera& camera, World& world, const TextureManager& texture_manager);
|
||||
~Renderer();
|
||||
void hot_reload();
|
||||
void init();
|
||||
const Shader& get_shader(const std::string& name) const;
|
||||
void render();
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#include <unordered_map>
|
||||
|
||||
#include <Cubed/config.hpp>
|
||||
#include <Cubed/primitive_data.hpp>
|
||||
|
||||
namespace Cubed {
|
||||
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
#include <glad/glad.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <Cubed/config.hpp>
|
||||
#include <Cubed/primitive_data.hpp>
|
||||
#include <Cubed/ui/color.hpp>
|
||||
namespace Cubed {
|
||||
|
||||
|
||||
@@ -13,6 +13,9 @@ public:
|
||||
GLFWwindow* get_glfw_window();
|
||||
void init();
|
||||
void update_viewport();
|
||||
// end of frame to reload!
|
||||
void hot_reload();
|
||||
|
||||
void toggle_fullscreen();
|
||||
void toggle_mouse_able();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user