Skip to content

Commit 1f6e443

Browse files
config mappings
1 parent 50dcaa4 commit 1f6e443

8 files changed

+110
-13
lines changed

config.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
database_file: './db/matrix.db'
22
#menu_program: 'rofi -show drun'
33
menu_program: dmenu_run
4+
key_mappings:
5+
screenshot: "p"

include/Config.h

+14-9
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
#include "fkYAML/node.hpp"
44
#include <memory>
55

6-
class Config
6+
std::vector<std::string> split_path(const std::string& path);
7+
8+
class Config
79
{
810
private:
911
fkyaml::node config;
@@ -13,15 +15,18 @@ class Config
1315
static std::shared_ptr<Config> _singleton;
1416
Config();
1517

16-
template <typename T>
17-
T get(std::string key)
18+
template<typename T>
19+
T get(const std::string& key_path)
1820
{
19-
return config[key.c_str()].get_value<std::string>();
20-
}
21+
auto parts = split_path(key_path);
22+
fkyaml::node* current = &config;
2123

22-
template <typename T>
23-
T get(const char* key)
24-
{
25-
return config[key].get_value<std::string>();
24+
for (size_t i = 0; i < parts.size() - 1; ++i) {
25+
current = &(*current)[parts[i]];
26+
}
27+
28+
return (*current)[parts.back()].get_value<T>();
2629
}
30+
31+
std::vector<std::string> get_keys(const std::string& key_path);
2732
};

include/ControlMappings.h

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <unordered_map>
2+
#include <string>
3+
#include <GLFW/glfw3.h>
4+
5+
// Map for direct key mappings (e.g., "W" -> GLFW_KEY_W)
6+
class ControlMappings {
7+
static std::unordered_map<std::string, int> keyMap;
8+
std::unordered_map<std::string, int> functionMap;
9+
public:
10+
ControlMappings();
11+
int getKey(std::string function);
12+
};

include/controls.h

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "app.h"
1010
#include "world.h"
1111
#include "WindowManager/WindowManager.h"
12+
#include "ControlMappings.h"
1213

1314
struct DeferedAction
1415
{
@@ -18,6 +19,7 @@ struct DeferedAction
1819

1920
class Controls
2021
{
22+
ControlMappings controlMappings;
2123
shared_ptr<blocks::TexturePack> texturePack;
2224
shared_ptr<WindowManager::WindowManager> wm;
2325
float windowFlop = 0.25;

makefile

+8-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ INCLUDES = -Iinclude -I/usr/local/include -Iinclude/imgui -Itracy/public
1515
LOADER_FLAGS = -march=native -funroll-loops
1616
SQLITE_SOURCES = $(wildcard src/sqlite/*.cpp)
1717
SQLITE_OBJECTS = $(patsubst src/sqlite/%.cpp, build/%.o, $(SQLITE_SOURCES))
18-
ALL_OBJECTS = build/Config.o build/systems/Player.o build/MultiPlayer/Server.o build/MultiPlayer/Client.o build/MultiPlayer/Gui.o build/screen.o build/systems/Light.o build/components/Light.o build/systems/Boot.o build/components/Bootable.o build/IndexPool.o build/WindowManager/Space.o build/systems/Move.o build/systems/ApplyTranslation.o build/systems/Derivative.o build/systems/Update.o build/systems/Intersections.o build/systems/Scripts.o build/components/Scriptable.o build/components/Parent.o build/components/RotateMovement.o build/components/Lock.o build/components/Key.o build/systems/KeyAndLock.o build/systems/Door.o build/systems/ApplyRotation.o build/persister.o build/engineGui.o build/entity.o build/renderer.o build/shader.o build/texture.o build/world.o build/camera.o build/api.o build/controls.o build/app.o build/WindowManager/WindowManager.o build/logger.o build/engine.o build/cube.o build/chunk.o build/mesher.o build/loader.o build/utility.o build/blocks.o build/dynamicObject.o build/assets.o build/model.o build/mesh.o build/imgui/imgui.o build/imgui/imgui_draw.o build/imgui/imgui_impl_opengl3.o build/imgui/imgui_widgets.o build/imgui/imgui_demo.o build/imgui/imgui_impl_glfw.o build/imgui/imgui_tables.o build/enkimi.o build/miniz.o src/api.pb.cc src/glad.c src/glad_glx.c $(SQLITE_OBJECTS) tracy/public/TracyClient.cpp
18+
ALL_OBJECTS = build/ControlMappings.o build/Config.o build/systems/Player.o build/MultiPlayer/Server.o build/MultiPlayer/Client.o build/MultiPlayer/Gui.o build/screen.o build/systems/Light.o build/components/Light.o build/systems/Boot.o build/components/Bootable.o build/IndexPool.o build/WindowManager/Space.o build/systems/Move.o build/systems/ApplyTranslation.o build/systems/Derivative.o build/systems/Update.o build/systems/Intersections.o build/systems/Scripts.o build/components/Scriptable.o build/components/Parent.o build/components/RotateMovement.o build/components/Lock.o build/components/Key.o build/systems/KeyAndLock.o build/systems/Door.o build/systems/ApplyRotation.o build/persister.o build/engineGui.o build/entity.o build/renderer.o build/shader.o build/texture.o build/world.o build/camera.o build/api.o build/controls.o build/app.o build/WindowManager/WindowManager.o build/logger.o build/engine.o build/cube.o build/chunk.o build/mesher.o build/loader.o build/utility.o build/blocks.o build/dynamicObject.o build/assets.o build/model.o build/mesh.o build/imgui/imgui.o build/imgui/imgui_draw.o build/imgui/imgui_impl_opengl3.o build/imgui/imgui_widgets.o build/imgui/imgui_demo.o build/imgui/imgui_impl_glfw.o build/imgui/imgui_tables.o build/enkimi.o build/miniz.o src/api.pb.cc src/glad.c src/glad_glx.c $(SQLITE_OBJECTS) tracy/public/TracyClient.cpp
1919

2020
LIBS = -lzmq -lX11 -lXcomposite -lXtst -lXext -lXfixes -lprotobuf -lspdlog -lfmt -Llib $(shell pkg-config --libs glfw3) -lGL -lpthread -lassimp -lsqlite3 $(shell pkg-config --libs protobuf)
2121

@@ -72,9 +72,14 @@ build/camera.o: src/camera.cpp include/camera.h
7272
build/api.o: src/api.cpp include/api.h include/world.h include/logger.h include/protos/api.pb.h
7373
g++ -std=c++20 $(FLAGS) -o build/api.o -c src/api.cpp $(INCLUDES)
7474

75-
build/controls.o: src/controls.cpp include/controls.h include/camera.h include/WindowManager/WindowManager.h include/world.h
75+
build/controls.o: src/controls.cpp include/controls.h include/camera.h include/WindowManager/WindowManager.h include/world.h include/ControlMappings.h
7676
g++ -std=c++20 $(FLAGS) -o build/controls.o -c src/controls.cpp $(INCLUDES)
7777

78+
build/ControlMappings.o: src/ControlMappings.cpp include/ControlMappings.h include/Config.h
79+
g++ -std=c++20 $(FLAGS) -o build/ControlMappings.o -c src/ControlMappings.cpp $(INCLUDES)
80+
81+
82+
7883
build/app.o: src/app.cpp include/app.h include/screen.h
7984
g++ -std=c++20 $(FLAGS) -o build/app.o -c src/app.cpp $(INCLUDES) -Wno-narrowing
8085

@@ -123,7 +128,7 @@ build/model.o: src/model.cpp include/model.h include/mesh.h
123128
build/mesh.o: src/mesh.cpp include/mesh.h
124129
g++ -std=c++20 $(FLAGS) -o build/mesh.o -c src/mesh.cpp $(INCLUDES)
125130

126-
build/entity.o: src/entity.cpp include/entity.h
131+
build/entity.o: src/entity.cpp include/entity.h include/Config.h
127132
g++ -std=c++20 $(FLAGS) -o build/entity.o -c src/entity.cpp $(INCLUDES)
128133

129134
build/engineGui.o: src/engineGui.cpp include/engineGui.h include/components/RotateMovement.h include/model.h include/systems/Update.h include/components/Bootable.h include/components/Light.h include/engine.h

src/Config.cpp

+39
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "Config.h"
22
#include <fstream>
3+
#include <map>
34

45
Config::Config()
56
{
@@ -17,3 +18,41 @@ Config::singleton()
1718
}
1819
return _singleton;
1920
}
21+
22+
std::vector<std::string>
23+
split_path(const std::string& path)
24+
{
25+
std::vector<std::string> parts;
26+
size_t start = 0, end;
27+
28+
while ((end = path.find('.', start)) != std::string::npos) {
29+
parts.push_back(path.substr(start, end - start));
30+
start = end + 1;
31+
}
32+
parts.push_back(path.substr(start));
33+
return parts;
34+
}
35+
36+
std::vector<std::string>
37+
Config::get_keys(const std::string& key_path)
38+
{
39+
std::vector<std::string> keys;
40+
auto parts = split_path(key_path);
41+
fkyaml::node* current = &config;
42+
43+
// Navigate to the requested node
44+
for (const auto& part : parts) {
45+
current = &(*current)[part];
46+
}
47+
48+
if(current->is_mapping()) {
49+
auto keyPairs = current->get_value<std::map<std::string, std::string>>();
50+
51+
// Collect all keys in the node
52+
for (const auto& pair : keyPairs) {
53+
keys.push_back(pair.first);
54+
}
55+
}
56+
57+
return keys;
58+
}

src/ControlMappings.cpp

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "ControlMappings.h"
2+
#include "Config.h"
3+
#include <iostream>
4+
5+
std::unordered_map<std::string, int> ControlMappings::keyMap = {
6+
{ "w", GLFW_KEY_W },
7+
{ "a", GLFW_KEY_A },
8+
{ "s", GLFW_KEY_S },
9+
{ "d", GLFW_KEY_D },
10+
{ "p", GLFW_KEY_P}
11+
};
12+
13+
ControlMappings::ControlMappings() {
14+
auto config = Config::singleton();
15+
auto mappingKeys = Config::singleton()->get_keys("key_mappings");
16+
//std::cout << "key_mappings" << mappingKeys[0] << std::endl;
17+
for(auto it = mappingKeys.begin(); it != mappingKeys.end(); it++) {
18+
auto fullPath = "key_mappings." + *it;
19+
auto key = config->get<std::string>(fullPath);
20+
if(keyMap.contains(key)) {
21+
functionMap[*it] = keyMap[key];
22+
}
23+
}
24+
}
25+
26+
int ControlMappings::getKey(std::string fnName) {
27+
if(functionMap.contains(fnName)) {
28+
return functionMap[fnName];
29+
}
30+
return -1;
31+
}

src/controls.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ Controls::handleSave(GLFWwindow* window)
168168
void
169169
Controls::handleScreenshot(GLFWwindow* window)
170170
{
171-
bool shouldCapture = glfwGetKey(window, GLFW_KEY_P) == GLFW_PRESS;
171+
int screenshotKey = controlMappings.getKey("screenshot");
172+
bool shouldCapture = glfwGetKey(window, screenshotKey) == GLFW_PRESS;
172173
if (shouldCapture && debounce(lastKeyPressTime)) {
173174
renderer->screenshot();
174175
}

0 commit comments

Comments
 (0)