From 94b3b6b32bc8b996c9689fb89a381cf216353641 Mon Sep 17 00:00:00 2001 From: LaG1924 Date: Thu, 17 Jun 2021 01:56:25 +0500 Subject: Implemented main menu in Rml and improved RmlUi support --- CMakeLists.txt | 3 ++ cwd/test.rcss | 105 +++++++++++++++++++++++++++++++++++++++++++++++++-------- cwd/test.rml | 31 +++++++---------- src/Plugin.cpp | 23 +++++++++++++ src/Render.cpp | 75 ++++++++++++++++++++++++++++++++++++++--- src/Render.hpp | 1 + src/Rml.cpp | 8 +++++ src/Rml.hpp | 6 +++- 8 files changed, 214 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ac3c254..e7d166a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -206,6 +206,9 @@ target_include_directories(AltCraft PRIVATE ${RmlUi_SOURCE_DIR}/Include) set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT AltCraft) +if (MSVC) + target_compile_options(AltCraft PRIVATE /bigobj) +endif() if(MSVC AND CMAKE_BUILD_TYPE MATCHES Release) set_target_properties(AltCraft PROPERTIES WIN32_EXECUTABLE ON) endif() diff --git a/cwd/test.rcss b/cwd/test.rcss index f1e8cee..ee86894 100644 --- a/cwd/test.rcss +++ b/cwd/test.rcss @@ -1,28 +1,105 @@ body { - background-color: red; - color: blue; - font-size: 50px; + background-color: #160f08; + color: white; font-family: "open sans"; width: 100%; + height: 100%; + text-align: center; } -body:hover { - background-color: yellow; +.menu { + width: 50%; + margin: auto; + background-color: #a79f9c; } -div { - background-color: green; +.mc-title { + color: #8e8e8e; + display: block; } -div:hover { - background-color: white; +.mc-p { + color: #d6d4d6; + display: block; + text-align: left; + font-size: 4vh; } -button:active { - background-color: teal; +.mc-text { + border-width: 2dp; + border-color: #9f9793; + background-color: #010001; + color: #d6d4d6; + text-align: center; + vertical-align: middle; + font-size: 5vh; } -.right-pos { - position: absolute; - right: 0px; +.mc-button { + border-width: 2dp; + border-color: #14110c; + background-color: #6e6f70; + color: #c5c6c7; + text-align: center; + vertical-align: middle; + font-size: 5vh; +} + +.mc-button:hover { + background-color: #7e86bc; +} + +#title { + margin: 0% auto auto; + font-size: 20vh; +} + +#disclaimer { + width: 70%; + margin: 0 auto; +} + +#hostname-text { + width: 70%; + margin: 5% auto; +} + +#hostname { + display: inline-block; + width: 45%; + height: 8%; + position: fixed; + margin: 0% auto auto; +} + +#username { + display: inline-block; + width: 45%; + height: 8%; + position: fixed; + margin: 10% auto auto; +} + +#connect { + display: inline-block; + width: 45%; + height: 8%; + position: fixed; + margin: 20% auto auto; +} + +#options { + display: inline-block; + width: 22%; + height: 8%; + position: fixed; + margin: 33% auto auto 27.5%; +} + +#exit { + display: inline-block; + width: 22%; + height: 8%; + position: fixed; + margin: 33% 27.5% auto auto; } diff --git a/cwd/test.rml b/cwd/test.rml index 4c7bfa6..de48053 100644 --- a/cwd/test.rml +++ b/cwd/test.rml @@ -1,26 +1,19 @@ - - Test RmlUi -
- New line -
- Substring -
-
- -
- (Clickable) Right viewport border is here -> -
+ AltCraft +

AltCraft is currently not finished, but there is some buggy early testing going on.

+

Enter the hostname of a server and your username to connect to it:

+ + + + +
diff --git a/src/Plugin.cpp b/src/Plugin.cpp index d7a9820..13045e1 100644 --- a/src/Plugin.cpp +++ b/src/Plugin.cpp @@ -74,6 +74,27 @@ namespace PluginApi { void RegisterDimension(int dimId, Dimension dim) { RegisterNewDimension(dimId, dim); } + + void ConnectToServer(std::string host, std::string username) { + size_t index = host.find_last_of(':'); + unsigned short port; + if (index == std::string::npos) + port = 25565; + else { + try { + port = std::stoi(host.substr(index + 1)); + } + catch (std::exception& e) { + port = 25565; + LOG(WARNING) << "Incorrect host format: " << host; + } + } + PUSH_EVENT("ConnectToServer", std::make_tuple(host.substr(0, index), port, username)); + } + + void Exit() { + PUSH_EVENT("Exit", 0); + } } int LoadFileRequire(lua_State* L) { @@ -212,6 +233,8 @@ void PluginSystem::Init() { apiTable["GetGameState"] = PluginApi::GetGameState; apiTable["RegisterBlock"] = PluginApi::RegisterBlock; apiTable["RegisterDimension"] = PluginApi::RegisterDimension; + apiTable["ConnectToServer"] = PluginApi::ConnectToServer; + apiTable["Exit"] = PluginApi::Exit; } lua_State* PluginSystem::GetLuaState() { diff --git a/src/Render.cpp b/src/Render.cpp index 48bbadd..39322f9 100644 --- a/src/Render.cpp +++ b/src/Render.cpp @@ -18,6 +18,36 @@ #include "Plugin.hpp" #include "Rml.hpp" +const std::map keyMapping = { + {SDLK_BACKSPACE, Rml::Input::KI_BACK}, + {SDLK_INSERT, Rml::Input::KI_INSERT}, + {SDLK_DELETE, Rml::Input::KI_DELETE}, + {SDLK_HOME, Rml::Input::KI_HOME}, + {SDLK_END, Rml::Input::KI_END}, + {SDLK_LEFT, Rml::Input::KI_LEFT}, + {SDLK_RIGHT, Rml::Input::KI_RIGHT}, + {SDLK_UP, Rml::Input::KI_UP}, + {SDLK_DOWN, Rml::Input::KI_DOWN}, + {SDLK_TAB, Rml::Input::KI_TAB} +}; + +inline int ConvertKeymodsSdlToRml(unsigned short keyMods) { + int ret = 0; + if (keyMods & KMOD_SHIFT) + ret |= Rml::Input::KM_SHIFT; + if (keyMods & KMOD_CTRL) + ret |= Rml::Input::KM_CTRL; + if (keyMods & KMOD_ALT) + ret |= Rml::Input::KM_ALT; + if (keyMods & KMOD_GUI) + ret |= Rml::Input::KM_META; + if (keyMods & KMOD_NUM) + ret |= Rml::Input::KM_NUMLOCK; + if (keyMods & KMOD_CAPS) + ret |= Rml::Input::KM_CAPSLOCK; + return ret; +} + Render::Render(unsigned int windowWidth, unsigned int windowHeight, std::string windowTitle) { InitEvents(); @@ -129,7 +159,7 @@ void Render::InitGlew() { int width, height; SDL_GL_GetDrawableSize(window, &width, &height); glViewport(0, 0, width, height); - glClearColor(0.8,0.8,0.8, 1.0f); + glClearColor(0.0f,0.0f,0.0f, 1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); @@ -203,6 +233,8 @@ void Render::RenderFrame() { } void Render::HandleEvents() { + int rmlKeymods = ConvertKeymodsSdlToRml(sdlKeyMods); + SDL_PumpEvents(); SDL_Event event; while (SDL_PollEvent(&event)) { @@ -247,6 +279,13 @@ void Render::HandleEvents() { } case SDL_KEYDOWN: { + sdlKeyMods = event.key.keysym.mod; + rmlKeymods = ConvertKeymodsSdlToRml(sdlKeyMods); + + auto it = keyMapping.find(event.key.keysym.sym); + Rml::Input::KeyIdentifier ki = it != keyMapping.end() ? it->second : Rml::Input::KeyIdentifier::KI_UNKNOWN; + rmlContext->ProcessKeyDown(ki, rmlKeymods); + switch (event.key.keysym.scancode) { case SDL_SCANCODE_ESCAPE: { auto state = GetState(); @@ -294,6 +333,16 @@ void Render::HandleEvents() { break; } + case SDL_KEYUP: { + sdlKeyMods = event.key.keysym.mod; + rmlKeymods = ConvertKeymodsSdlToRml(sdlKeyMods); + + auto it = keyMapping.find(event.key.keysym.sym); + Rml::Input::KeyIdentifier ki = it != keyMapping.end() ? it->second : Rml::Input::KeyIdentifier::KI_UNKNOWN; + rmlContext->ProcessKeyUp(ki, rmlKeymods); + break; + } + case SDL_MOUSEMOTION: { if (isMouseCaptured) { double deltaX = event.motion.xrel; @@ -304,7 +353,7 @@ void Render::HandleEvents() { } else { int mouseX, mouseY; SDL_GetMouseState(&mouseX, &mouseY); - rmlContext->ProcessMouseMove(mouseX, mouseY, 0); + rmlContext->ProcessMouseMove(mouseX, mouseY, rmlKeymods); } break; } @@ -320,7 +369,7 @@ void Render::HandleEvents() { event.button.button = SDL_BUTTON_RIGHT; else if (event.button.button == SDL_BUTTON_RIGHT) event.button.button = SDL_BUTTON_MIDDLE; - rmlContext->ProcessMouseButtonDown(event.button.button - 1, 0); + rmlContext->ProcessMouseButtonDown(event.button.button - 1, rmlKeymods); } break; @@ -337,16 +386,34 @@ void Render::HandleEvents() { event.button.button = SDL_BUTTON_RIGHT; else if (event.button.button == SDL_BUTTON_RIGHT) event.button.button = SDL_BUTTON_MIDDLE; - rmlContext->ProcessMouseButtonUp(event.button.button - 1, 0); + rmlContext->ProcessMouseButtonUp(event.button.button - 1, rmlKeymods); } break; } + case SDL_TEXTINPUT: { + rmlContext->ProcessTextInput(Rml::String(event.text.text)); + break; + } + default: break; } } + char* rawClipboard = SDL_GetClipboardText(); + std::string clipboard = rawClipboard; + SDL_free(rawClipboard); + + if (clipboard != rmlSystem->clipboard) { + rmlSystem->clipboard = clipboard; + } + rmlContext->Update(); + + if (clipboard != rmlSystem->clipboard) { + clipboard = rmlSystem->clipboard; + SDL_SetClipboardText(clipboard.c_str()); + } } void Render::HandleMouseCapture() { diff --git a/src/Render.hpp b/src/Render.hpp index a8c437c..7b2313c 100644 --- a/src/Render.hpp +++ b/src/Render.hpp @@ -52,6 +52,7 @@ class Render { std::unique_ptr rmlRender; std::unique_ptr rmlSystem; Rml::Context* rmlContext; + unsigned short sdlKeyMods; void SetMouseCapture(bool IsCaptured); diff --git a/src/Rml.cpp b/src/Rml.cpp index bcdca0c..abec7db 100644 --- a/src/Rml.cpp +++ b/src/Rml.cpp @@ -37,6 +37,14 @@ bool RmlSystemInterface::LogMessage(Rml::Log::Type type, const Rml::String& mess return true; } +void RmlSystemInterface::SetClipboardText(const Rml::String& text) { + clipboard = text; +} + +void RmlSystemInterface::GetClipboardText(Rml::String& text) { + text = clipboard; +} + RmlRenderInterface::RmlRenderInterface(RenderState& renderState) : State(&renderState) { glGenVertexArrays(1, &Vao); glBindVertexArray(Vao); diff --git a/src/Rml.hpp b/src/Rml.hpp index 5815c3e..7b312c0 100644 --- a/src/Rml.hpp +++ b/src/Rml.hpp @@ -7,17 +7,21 @@ class RmlSystemInterface : public Rml::SystemInterface { double totalTime; - public: virtual double GetElapsedTime() override; virtual bool LogMessage(Rml::Log::Type type, const Rml::String& message) override; + virtual void SetClipboardText(const Rml::String& text) override; + + virtual void GetClipboardText(Rml::String& text) override; + inline void Update(double timeToUpdate) { totalTime += timeToUpdate; } + std::string clipboard; }; class RmlRenderInterface : public Rml::RenderInterface { -- cgit v1.2.3