diff --git a/src/scripting/src/script_system.cpp b/src/scripting/src/script_system.cpp index ff224fe..d5629e2 100644 --- a/src/scripting/src/script_system.cpp +++ b/src/scripting/src/script_system.cpp @@ -11,7 +11,8 @@ void script_system::load(sol::table &ns) "update",&window::update, "title",sol::writeonly_property(&window::set_title), "size",sol::property(&window::size,&window::set_size), - "position",sol::property(&window::position,&window::set_position) + "position",sol::property(&window::position,&window::set_position), + "fullscreen",sol::property(&window::fullscreen,&window::set_fullscreen) ); ns.new_usertype("input", @@ -19,6 +20,7 @@ void script_system::load(sol::table &ns) "get",&input::get, "mouse_position",sol::readonly_property(&input::mouse_position), "mouse_button",sol::readonly_property(&input::mouse_button), + "mouse_pressed",sol::readonly_property(&input::mouse_pressed), "input_string",sol::readonly_property(&input::input_string) ); } diff --git a/src/scripts/demos/simple_000.lua b/src/scripts/demos/simple_000.lua index c6d8f37..5931cc3 100644 --- a/src/scripts/demos/simple_000.lua +++ b/src/scripts/demos/simple_000.lua @@ -78,6 +78,7 @@ do if (pw.input:get().mouse_button == 1) then print(pw.input:get().mouse_position.x,pw.input:get().mouse_position.y) +-- w.fullscreen = not w.fullscreen end diff --git a/src/system/include/pw/system/input.hpp b/src/system/include/pw/system/input.hpp index 5d32122..50e2e60 100644 --- a/src/system/include/pw/system/input.hpp +++ b/src/system/include/pw/system/input.hpp @@ -12,8 +12,13 @@ public: static input& get(); point mouse_position() const { return _mouse_position; } - int mouse_button() const { return _mouse_button; } - std::string input_string() const { return _input_string; } + + bool mouse_pressed() const { return _mouse_pressed; } + int mouse_button() const { return _mouse_button; } + + + std::string input_string() const { return _input_string; } + ~input() = default; @@ -23,6 +28,8 @@ public: released }; + void reset(); + protected: friend class window; @@ -33,6 +40,7 @@ private: point _mouse_position; int _mouse_button; + bool _mouse_pressed; std::string _input_string; diff --git a/src/system/include/pw/system/window.hpp b/src/system/include/pw/system/window.hpp index 06515bf..8244e75 100644 --- a/src/system/include/pw/system/window.hpp +++ b/src/system/include/pw/system/window.hpp @@ -18,13 +18,17 @@ public: void set_title(const std::string& title); void set_size(const size& s); - size size() const; + pw::size size() const; void set_position(const point& p); point position() const; typedef void drop_callback; + bool fullscreen() const; + void set_fullscreen(bool use_fullscreen); + + protected: struct impl; diff --git a/src/system/src/input.cpp b/src/system/src/input.cpp index a59acc3..edd8039 100644 --- a/src/system/src/input.cpp +++ b/src/system/src/input.cpp @@ -12,5 +12,11 @@ input &input::get() return instance; } +void input::reset() +{ + _input_string.clear(); + _mouse_button = 0; +} + } diff --git a/src/system/src/window.cpp b/src/system/src/window.cpp index a0f6354..0c5c18e 100644 --- a/src/system/src/window.cpp +++ b/src/system/src/window.cpp @@ -16,10 +16,10 @@ namespace pw { struct window_context : context { - virtual bool make_current() override; - virtual void resize() override; - // virtual context::size size() override; - virtual void flush() override; + virtual bool make_current() override; + virtual void resize() override; + // virtual context::size size() override; + virtual void flush() override; }; bool window_context::make_current() @@ -36,158 +36,188 @@ void window_context::flush() struct window::impl { - GLFWwindow *_window = nullptr; + GLFWwindow *_window = nullptr; - // window_context _context; + sizei _old_size; + pointi _old_pos; - static void drop_callback(GLFWwindow* window, int count, const char** paths) - { - // std::cout << __FUNCTION__ << std::endl; - // for (int i = 0; i < count; i++) - // std::cout << "\t" << paths[i] << std::endl; - } + // window_context _context; - static void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) - { - std::cout << __FUNCTION__ << std::endl; - } + static void drop_callback(GLFWwindow* window, int count, const char** paths) + { + // std::cout << __FUNCTION__ << std::endl; + // for (int i = 0; i < count; i++) + // std::cout << "\t" << paths[i] << std::endl; + } - static void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) - { - input::get()._mouse_button = button; + static void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) + { + std::cout << __FUNCTION__ << std::endl; + } - std::cout << __FUNCTION__ << " " << button << " " << action << " " << mods << std::endl; - // input::get()._mouse_position - } + static void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) + { + input::get()._mouse_button = button; - static void cursor_pos_callback(GLFWwindow* window, double xpos, double ypos) - { - input::get()._mouse_position = point(xpos,ypos); - } + std::cout << __FUNCTION__ << " " << button << " " << action << " " << mods << std::endl; + // input::get()._mouse_position + } - static void key_callback(GLFWwindow *window,int key, int scancode, int action, int mods) - { - std::cout << __FUNCTION__ << std::endl; - } + static void cursor_pos_callback(GLFWwindow* window, double xpos, double ypos) + { + input::get()._mouse_position = point(xpos,ypos); + } - // static void character_callback(GLFWwindow* window, unsigned int codepoint) - // { - // std::cout << __FUNCTION__ << std::endl; - // } + static void key_callback(GLFWwindow *window,int key, int scancode, int action, int mods) + { + std::cout << __FUNCTION__ << std::endl; + } - static void charmods_callback(GLFWwindow* window, unsigned int codepoint, int mods) - { - // build the string from a Unicode code point - std::wstring_convert, char32_t> converter; - std::string u8str = converter.to_bytes(codepoint); + // static void character_callback(GLFWwindow* window, unsigned int codepoint) + // { + // std::cout << __FUNCTION__ << std::endl; + // } - input::get()._input_string = u8str; - } + static void charmods_callback(GLFWwindow* window, unsigned int codepoint, int mods) + { + // build the string from a Unicode code point + std::wstring_convert, char32_t> converter; + std::string u8str = converter.to_bytes(codepoint); - static void framebuffer_size_callback(GLFWwindow* window, int width, int height) - { - window::impl* impl = static_cast(glfwGetWindowUserPointer(window)); - // impl->on_resize(width,height); + input::get()._input_string = u8str; + } - // std::cout << "framebuffer " << width << "x" << height << std::endl; - // glViewport(0, 0, width, height); - } + static void framebuffer_size_callback(GLFWwindow* window, int width, int height) + { + window::impl* impl = static_cast(glfwGetWindowUserPointer(window)); + // impl->on_resize(width,height); - impl() - { - glfwInit(); + // std::cout << "framebuffer " << width << "x" << height << std::endl; + // glViewport(0, 0, width, height); + } - _window = glfwCreateWindow(640, 480, "pixwerxs", nullptr, nullptr); + impl() + { + glfwInit(); - glfwSetWindowUserPointer(_window,this); + _window = glfwCreateWindow(640, 480, "pixwerxs", nullptr, nullptr); - glfwSetFramebufferSizeCallback(_window, window::impl::framebuffer_size_callback); - glfwSetKeyCallback(_window, window::impl::key_callback); - // glfwSetCharCallback(_window, character_callback); - glfwSetCharModsCallback(_window, charmods_callback); - glfwSetScrollCallback(_window, scroll_callback); + glfwSetWindowUserPointer(_window,this); - glfwSetDropCallback(_window, drop_callback); + glfwSetFramebufferSizeCallback(_window, window::impl::framebuffer_size_callback); + glfwSetKeyCallback(_window, window::impl::key_callback); + // glfwSetCharCallback(_window, character_callback); + glfwSetCharModsCallback(_window, charmods_callback); + glfwSetScrollCallback(_window, scroll_callback); - glfwSetCursorPosCallback(_window, cursor_pos_callback); - glfwSetMouseButtonCallback(_window, mouse_button_callback); - glfwSetScrollCallback(_window, scroll_callback); + glfwSetDropCallback(_window, drop_callback); + + glfwSetCursorPosCallback(_window, cursor_pos_callback); + glfwSetMouseButtonCallback(_window, mouse_button_callback); + glfwSetScrollCallback(_window, scroll_callback); #if 0 - glfwMakeContextCurrent(_window); + glfwMakeContextCurrent(_window); - gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); + gladLoadGLLoader((GLADloadproc) glfwGetProcAddress); #endif - } + } - ~impl() - { - glfwDestroyWindow(_window); - } + ~impl() + { + glfwDestroyWindow(_window); + } - bool update() - { - if (!glfwWindowShouldClose(_window)) { + bool update() + { + if (!glfwWindowShouldClose(_window)) { - glfwPollEvents(); + // reset input + input::get().reset(); - // do other stuff + // get new events + glfwPollEvents(); + + // do other stuff #if 0 - glClearColor(1,0,0,1); - glClear(GL_COLOR_BUFFER_BIT); + glClearColor(1,0,0,1); + glClear(GL_COLOR_BUFFER_BIT); #endif - glfwSwapBuffers(_window); + glfwSwapBuffers(_window); - return true; - } + return true; + } - return false; + return false; - } + } - void set_title(const std::string& title) - { - glfwSetWindowTitle(_window,title.c_str()); - } + void set_title(const std::string& title) + { + glfwSetWindowTitle(_window,title.c_str()); + } - void set_size(int w,int h) - { - glfwSetWindowSize(_window,w,h); - } + void set_size(int w,int h) + { + glfwSetWindowSize(_window,w,h); + } - ::pw::size size() const - { - int w,h; - glfwGetWindowSize(_window,&w,&h); - return ::pw::size(w,h); - } + ::pw::size size() const + { + int w,h; + glfwGetWindowSize(_window,&w,&h); + return ::pw::size(w,h); + } - ::pw::point position() const - { - int x,y; - glfwGetWindowPos(_window,&x,&y); - return ::pw::point(x,y); - } + ::pw::point position() const + { + int x,y; + glfwGetWindowPos(_window,&x,&y); + return ::pw::point(x,y); + } - void set_position(int x,int y) - { - glfwSetWindowPos(_window,x,y); - } + void set_position(int x,int y) + { + glfwSetWindowPos(_window,x,y); + } - void set_fullscreen() - { - // glfwSetWindow - } + void set_fullscreen(bool use_fullscreen) + { + if (fullscreen() == use_fullscreen) + return; + + if (use_fullscreen) + { + glfwGetWindowPos( _window, &_old_pos.x, &_old_pos.y ); + glfwGetWindowSize( _window, &_old_size.width, &_old_size.height ); + + GLFWmonitor * monitor = glfwGetPrimaryMonitor(); + const GLFWvidmode * mode = glfwGetVideoMode(monitor); + + glfwSetWindowMonitor( _window, monitor, 0, 0, mode->width, mode->height, 0 ); + + } else + { + + glfwSetWindowMonitor( _window, nullptr, _old_pos.x,_old_pos.y, _old_size.width,_old_size.height,0); + } + + // glfwSetWindow + } + + bool fullscreen() const { + return glfwGetWindowMonitor(_window) != nullptr; + } }; window::window() - : _impl(std::make_unique()) + : _impl(std::make_unique()) { } @@ -197,34 +227,46 @@ window::~window() bool window::update() { - return _impl->update(); + return _impl->update(); } void window::set_title(const std::string& title) { - _impl->set_title(title); + _impl->set_title(title); } void window::set_size(const ::pw::size& s) { - _impl->set_size(static_cast(std::round(s.width)),static_cast(std::round(s.height))); + _impl->set_size(static_cast(std::round(s.width)),static_cast(std::round(s.height))); } size window::size() const { - return _impl->size(); + return _impl->size(); } void window::set_position(const point &p) { - _impl->set_position(p.x,p.y); + _impl->set_position(p.x,p.y); } point window::position() const { - return _impl->position(); + return _impl->position(); +} + +bool window::fullscreen() const +{ + return _impl->fullscreen(); +} + +void window::set_fullscreen(bool use_fullscreen) +{ + _impl->set_fullscreen(use_fullscreen); } + + }