diff --git a/engine.build.lua b/engine.build.lua index d2ddd58..37958dc 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -27,7 +27,8 @@ local system_module = Module("source/System", { "Path.cpp", "MessageHandler.cpp", "MessageQueue.cpp", - "SystemEvent.cpp", + "Event.cpp", + "EventListener.cpp", "Log.cpp" }) @@ -46,7 +47,7 @@ local platform_spec_module = Module("source/Platform/Win32", { "Win32Keyboard.cpp", "Win32Misc.cpp", "Win32Mouse.cpp", - "Win32MsgBuffer.cpp", + "Win32EventQueue.cpp", "Win32System.cpp", "glad_wgl.c" }) @@ -54,8 +55,6 @@ local platform_spec_module = Module("source/Platform/Win32", { local input_module = Module("source/Input", { "InputDevice.cpp", - "InputEvent.cpp", - "InputListener.cpp", "InputModule.cpp", "Keyboard.cpp", "Mouse.cpp" diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index 305623b..6f5965f 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -5,7 +5,6 @@ #include "DisplayMode.h" #include "DisplayDescription.h" #include -#include #include namespace sp { diff --git a/include/Spectre/Game.h b/include/Spectre/Game.h index 41cb59d..4c7b5b8 100644 --- a/include/Spectre/Game.h +++ b/include/Spectre/Game.h @@ -3,7 +3,6 @@ #define SPECTRE_GAME_H #include -#include #include class InputModule; @@ -37,9 +36,9 @@ protected : FPSCounter& getFpsCounter(); -private : + MessageHandler* getMessageHandler() const; - void setup(); +private : void gameLoop(); diff --git a/include/Spectre/Input/InputDevice.h b/include/Spectre/Input/InputDevice.h index 543cdb2..ddace17 100644 --- a/include/Spectre/Input/InputDevice.h +++ b/include/Spectre/Input/InputDevice.h @@ -2,10 +2,10 @@ #ifndef SPECTRE_INTPUT_DEVICE_H #define SPECTRE_INTPUT_DEVICE_H -#include "InputModule.h" - namespace sp { +class InputMudule; + class InputDevice { friend class InputModule; diff --git a/include/Spectre/Input/InputEvent.h b/include/Spectre/Input/InputEvent.h deleted file mode 100644 index aef33bd..0000000 --- a/include/Spectre/Input/InputEvent.h +++ /dev/null @@ -1,157 +0,0 @@ - -#ifndef SPECTRE_INPUT_EVENT_H -#define SPECTRE_INPUT_EVENT_H - -#include -#include - -namespace sp { - -namespace MouseButton { - - enum Type { - Unknown, - Left, - Right, - Middle, - Button1, - Button2, - NUM_MBUTTONS, - }; -}; - -namespace Key { - - enum Type { - Unknown, - A, - B, - C, - D, - E, - F, - G, - H, - I, - J, - K, - L, - M, - N, - O, - P, - Q, - R, - S, - T, - U, - V, - W, - X, - Y, - Z, - One, - Two, - Three, - Four, - Five, - Six, - Seven, - Eight, - Nine, - Zero, - Period, - Comma, - Enter, - Backspace, - Escape, - Space, - Capslock, - Up, - Down, - Left, - Right, - NUMPAD_1, - NUMPAD_2, - NUMPAD_3, - NUMPAD_4, - NUMPAD_5, - NUMPAD_6, - NUMPAD_7, - NUMPAD_8, - NUMPAD_9, - NUMPAD_0, - NUMPAD_Enter, - Home, - End, - Insert, - Delete, - PageUp, - PageDown, - Pause, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - F11, - F12, - Tab, - LShift, - RShift, - LCtrl, - RCtrl, - LAlt, - RAlt, - NUM_KEYS, - }; -} - -typedef struct InputEvent -{ - enum Type - { - None, - Key, - MouseButton, - MousePosition - }; - - struct KeyEvent { - Key::Type code; - bool pressed; /* true if pressed, false if released. */ - - std::string getKeyName() const; /* Get the key name */ - }; - - struct MouseButtonEvent { - MouseButton::Type button; - bool pressed; /* true if pressed, false if released. */ - - std::string getName() const; - }; - - struct MouseEvent { - unsigned int x; - unsigned int y; - }; - - Type type; - union { - struct KeyEvent key; - struct MouseEvent mouse; - struct MouseButtonEvent mouseButton; - }; - - InputEvent(Type type = None); - -} InputEvent; - -} // namespace sp - -#endif /* SPECTRE_INPUT_EVENT_H */ diff --git a/include/Spectre/Input/InputListener.h b/include/Spectre/Input/InputListener.h deleted file mode 100644 index c15a7ae..0000000 --- a/include/Spectre/Input/InputListener.h +++ /dev/null @@ -1,17 +0,0 @@ - -#ifndef SPECTRE_INPUT_LISTENER_H -#define SPECTRE_INPUT_LISTENER_H - -#include "InputEvent.h" - -namespace sp { - -class InputListener -{ -public : - virtual void onInputEvent(const InputEvent& event); -}; - -} // namespace sp - -#endif /* SPECTRE_INPUT_LISTENER_H */ diff --git a/include/Spectre/Input/InputModule.h b/include/Spectre/Input/InputModule.h index c3eb2e7..e30a93d 100644 --- a/include/Spectre/Input/InputModule.h +++ b/include/Spectre/Input/InputModule.h @@ -5,9 +5,6 @@ #include #include -#include "InputListener.h" -#include "InputEvent.h" - namespace sp { class Mouse; @@ -28,12 +25,6 @@ public : void addInputDevice(InputDevice *device); - void registerListener(InputListener* listener); - - void removeListener(InputListener* listener); - - void postInputEvent(const InputEvent& event); - // NOTE: Update devices here! (for winapi, process keyboard/mouse messages) void update(); @@ -48,11 +39,6 @@ protected : Keyboard *m_keyboard; - // Buffered input queue. - std::deque m_buffer; - - std::vector m_listeners; - PlatformInput *m_platform; }; diff --git a/include/Spectre/Input/Keyboard.h b/include/Spectre/Input/Keyboard.h index fe993f2..cfc13ba 100644 --- a/include/Spectre/Input/Keyboard.h +++ b/include/Spectre/Input/Keyboard.h @@ -3,19 +3,107 @@ #define SPECTRE_INPUT_KEYBOARD_H #include -#include "InputEvent.h" #include "InputDevice.h" namespace sp { class Keyboard : public InputDevice { +public : + enum Key { + Unknown, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + One, + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + Zero, + Period, + Comma, + Enter, + Backspace, + Escape, + Space, + Capslock, + Up, + Down, + Left, + Right, + Numpad1, + Numpad2, + Numpad3, + Numpad4, + Numpad5, + Numpad6, + Numpad7, + Numpad8, + Numpad9, + Numpad0, + Home, + End, + Insert, + Delete, + PageUp, + PageDown, + Pause, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Tab, + LShift, + RShift, + LCtrl, + RCtrl, + LAlt, + RAlt, + NUM_KEYS, + }; + public : virtual ~Keyboard() {}; - virtual bool isKeyDown(Key::Type key) = 0; + virtual bool isKeyDown(Key key) = 0; - static std::string getKeyName(Key::Type key); + static std::string getKeyName(Key key); }; } // namespace sp diff --git a/include/Spectre/Input/Mouse.h b/include/Spectre/Input/Mouse.h index 4268536..8d62feb 100644 --- a/include/Spectre/Input/Mouse.h +++ b/include/Spectre/Input/Mouse.h @@ -4,26 +4,39 @@ #include #include -#include "InputEvent.h" #include "InputDevice.h" namespace sp { class Mouse : public InputDevice { +public : + enum Button { + Unknown, + Left, + Right, + Middle, + Button1, + Button2, + NUM_MBUTTONS + }; + public : virtual ~Mouse(); - // Get mouse position + // Get the position in relative (focused window) coordinates. + // coordinates are relative to the window's top-left corner. virtual Vector2f getPosition() const = 0; - //virtual Vector2i getPositionAbs() const = 0; + // Get the position in absolute (screen) coordinates. + // 0,0 is located at the screen's top-left corner. + virtual Vector2f getAbsPosition() const = 0; - virtual bool isButtonDown(MouseButton::Type button) const = 0; + virtual bool isButtonDown(Button button) const = 0; - static std::string getButtonName(MouseButton::Type button); + static std::string getButtonName(Button button); }; -} // namespace sp +}; // namespace sp #endif /* SPECTRE_INPUT_MOUSE_H */ diff --git a/include/Spectre/System/Event.h b/include/Spectre/System/Event.h new file mode 100644 index 0000000..657e461 --- /dev/null +++ b/include/Spectre/System/Event.h @@ -0,0 +1,74 @@ + +#ifndef SPECTRE_SYSTEM_EVENT_H +#define SPECTRE_SYSTEM_EVENT_H + +#include +#include + +namespace sp { + +class Display; + +struct Event +{ +public : + + enum Type { + None, + Quit, + Size, + Key, + MouseButton, + MouseMove + }; + + struct KeyEvent { + Keyboard::Key code; + bool pressed; /* true if pressed, false if released. */ + + std::string getKeyName() const; /* Get the key name */ + }; + + struct MouseButtonEvent { + Mouse::Button button; + bool pressed; /* true if pressed, false if released. */ + + std::string getName() const; + }; + + struct MouseMoveEvent { + unsigned int x; + unsigned int y; + }; + + struct SizeEvent + { + Display *display; + int width; + int height; + }; + + Type type; + union { + struct SizeEvent size; + struct KeyEvent key; + struct MouseMoveEvent mouseMove; + struct MouseButtonEvent mouseButton; + }; + + Event(Type type = None); + + // Helper methods + + static Event createSize(Display *display, int width, int height); + + static Event createKey(Keyboard::Key code, bool pressed); + + static Event createMouseButton(Mouse::Button button, bool pressed); + + static Event createMouseMove(unsigned int x, unsigned int y); +}; + +} // namespace sp + +#endif /* SPECTRE_SYSTEM_EVENT_H */ diff --git a/include/Spectre/System/EventListener.h b/include/Spectre/System/EventListener.h new file mode 100644 index 0000000..5b18d6b --- /dev/null +++ b/include/Spectre/System/EventListener.h @@ -0,0 +1,23 @@ + +#ifndef SYSTEM_EVENT_LISTENER_H +#define SYSTEM_EVENT_LISTENER_H + +#include +#include +#include + +namespace sp { + +class Display; + +class EventListener +{ +public : + virtual void onSizeChanged(Display* display, int width, int height); + + virtual void onEvent(const Event& event); +}; + +} // namespace sp + +#endif /* SYSTEM_EVENT_LISTENER_H */ diff --git a/include/Spectre/System/MessageHandler.h b/include/Spectre/System/MessageHandler.h index 759ae3e..4ca39bc 100644 --- a/include/Spectre/System/MessageHandler.h +++ b/include/Spectre/System/MessageHandler.h @@ -2,16 +2,25 @@ #ifndef SPECTRE_SYSTEM_MESSAGEHANDLER_H #define SPECTRE_SYSTEM_MESSAGEHANDLER_H -#include "SystemEvent.h" +#include +#include "EventListener.h" namespace sp { -class Display; - -class MessageHandler +class MessageHandler : public EventListener { public : + + void registerListener(EventListener *listener); + + void unregisterListener(EventListener *listener); + virtual void onSizeChanged(Display* display, int width, int height); + + virtual void onEvent(const Event& event); + +protected : + std::vector m_listeners; }; } // namespace sp diff --git a/include/Spectre/System/MessageQueue.h b/include/Spectre/System/MessageQueue.h index e1fcb34..c105889 100644 --- a/include/Spectre/System/MessageQueue.h +++ b/include/Spectre/System/MessageQueue.h @@ -2,22 +2,29 @@ #ifndef SPECTRE_MESSAGE_QUEUE_H #define SPECTRE_MESSAGE_QUEUE_H -#include +#include #include namespace sp { +class PlatformEventQueue; + class MessageQueue { public : - void postEvent(SysEvent event); + MessageQueue(); + ~MessageQueue(); - bool pollEvent(SysEvent& event); + void postEvent(Event event); + + bool pollEvent(Event& event); bool isEmpty() const; protected : - std::deque m_queue; + std::deque m_queue; + + PlatformEventQueue* m_impl; }; } // namespace sp diff --git a/include/Spectre/System/SystemEvent.h b/include/Spectre/System/SystemEvent.h deleted file mode 100644 index e802634..0000000 --- a/include/Spectre/System/SystemEvent.h +++ /dev/null @@ -1,41 +0,0 @@ - -#ifndef SYSTEM_EVENT_H -#define SYSTEM_EVENT_H - -namespace sp { - -class Display; - -struct SysEvent -{ -public : - - enum Type { - None, - Quit, - Size, - }; - - Type type; - - struct Size - { - Display *display; - int width; - int height; - }; - - union { - struct Size size; - }; - - SysEvent(Type type = None); - - // Helper methods - - static SysEvent sizeEvent(Display *display, int width, int height); -}; - -} // namespace sp - -#endif /* SYSTEM_EVENT_H */ diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 6895d06..f70078f 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include namespace sp { diff --git a/source/Game.cpp b/source/Game.cpp index f395494..5213c50 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -11,14 +11,12 @@ namespace sp { -Game::Game() +Game::Game() : +m_running(false) { m_platform = new Win32Application(); - - m_running = false; m_graphics = new Graphics(m_platform); m_input = new InputModule(&m_platform->getInput()); - m_messageHandler = new MessageHandler(); } @@ -30,18 +28,13 @@ Game::~Game() delete m_messageHandler; } -void Game::setup() -{ - m_graphics->init(); - - m_graphics->setClearColor(0.0f, 0.0f, 0.0f); - - init(); -} - void Game::run() { - setup(); + if (!m_graphics->init()) { + return; + } + + init(); gameLoop(); } @@ -56,6 +49,9 @@ void Game::gameLoop() processEvents(); + // Update input. + getInput()->update(); + if (time.beginFrame()) { while(time.tick()) { @@ -71,22 +67,22 @@ void Game::gameLoop() void Game::processEvents() { MessageQueue& queue = m_platform->getMessageQueue(); - SysEvent event; - - m_platform->update(); + Event event; while(queue.pollEvent(event)) { - if (event.type == SysEvent::Quit) { + if (event.type == Event::Quit) { exit(); break; } // Call message handler. - if (event.type == SysEvent::Size) { + if (event.type == Event::Size) { m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height); } + + m_messageHandler->onEvent(event); } } @@ -110,4 +106,9 @@ FPSCounter& Game::getFpsCounter() return m_fpsCounter; } +MessageHandler* Game::getMessageHandler() const +{ + return m_messageHandler; } + +} // namespace sp diff --git a/source/Graphics/OpenGL.cpp b/source/Graphics/OpenGL.cpp index 6a1e6ff..ef7383d 100644 --- a/source/Graphics/OpenGL.cpp +++ b/source/Graphics/OpenGL.cpp @@ -26,7 +26,9 @@ bool Graphics::init() desc.decoration = DisplayDecorate::Menu | DisplayDecorate::Close | DisplayDecorate::Resize; - m_display->create(desc); + if (!m_display->create(desc)) { + return false; + } setClearColor(0.0f, 0.0f, 0.0f); diff --git a/source/Input/InputEvent.cpp b/source/Input/InputEvent.cpp deleted file mode 100644 index 4bc80c4..0000000 --- a/source/Input/InputEvent.cpp +++ /dev/null @@ -1,23 +0,0 @@ - -#include -#include -#include - -namespace sp { - -InputEvent::InputEvent(Type type) : -type (type) -{ -} - -std::string InputEvent::KeyEvent::getKeyName() const -{ - return Keyboard::getKeyName(code); -} - -std::string InputEvent::MouseButtonEvent::getName() const -{ - return Mouse::getButtonName(button); -} - -} // namespace sp diff --git a/source/Input/InputListener.cpp b/source/Input/InputListener.cpp deleted file mode 100644 index 2310737..0000000 --- a/source/Input/InputListener.cpp +++ /dev/null @@ -1,10 +0,0 @@ - -#include - -namespace sp { - -void InputListener::onInputEvent(const InputEvent& event) -{ -} - -} // namespace sp diff --git a/source/Input/InputModule.cpp b/source/Input/InputModule.cpp index 3f5f3ec..cde426d 100644 --- a/source/Input/InputModule.cpp +++ b/source/Input/InputModule.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -35,16 +34,6 @@ void InputModule::addInputDevice(InputDevice *device) m_devices.push_back(device); } -void InputModule::registerListener(InputListener* listener) -{ - m_listeners.push_back(listener); -} - -void InputModule::removeListener(InputListener* listener) -{ - -} - Mouse* InputModule::getMouse() { return m_mouse; @@ -55,46 +44,14 @@ Keyboard* InputModule::getKeyboard() return m_keyboard; } -void InputModule::postInputEvent(const InputEvent& event) -{ - if (m_buffer.size() < 128) { - m_buffer.push_back(event); - } -} - void InputModule::update() { InputDeviceVec::iterator it; - m_platform->update(); - // Update all devices. for(it = m_devices.begin(); it != m_devices.end(); it++) { - (*it)->update(this); } - - // Dispatch all events to listeners. - dispatch(); -} - -void InputModule::dispatch() -{ - std::deque::iterator it; - - for(it = m_buffer.begin(); it != m_buffer.end(); it++) { - - const InputEvent& event = *it; - - // Call listeners. - std::vector::iterator it; - for(it = m_listeners.begin(); it != m_listeners.end(); it++) { - - (*it)->onInputEvent(event); - } - } - - m_buffer.clear(); } } // namespace sp diff --git a/source/Input/Keyboard.cpp b/source/Input/Keyboard.cpp index 6c64bf5..dd47b23 100644 --- a/source/Input/Keyboard.cpp +++ b/source/Input/Keyboard.cpp @@ -5,107 +5,106 @@ namespace sp { struct keyentry { - Key::Type type; + Keyboard::Key type; const char *name; }; #define MapSym(key, name) { key, name } struct keyentry table[] = { - MapSym(Key::Unknown, "Unknown"), - MapSym(Key::A, "A"), - MapSym(Key::B, "B"), - MapSym(Key::C, "C"), - MapSym(Key::D, "D"), - MapSym(Key::E, "E"), - MapSym(Key::F, "F"), - MapSym(Key::G, "G"), - MapSym(Key::H, "H"), - MapSym(Key::I, "I"), - MapSym(Key::J, "J"), - MapSym(Key::K, "K"), - MapSym(Key::L, "L"), - MapSym(Key::M, "M"), - MapSym(Key::N, "N"), - MapSym(Key::O, "O"), - MapSym(Key::P, "P"), - MapSym(Key::Q, "Q"), - MapSym(Key::R, "R"), - MapSym(Key::S, "S"), - MapSym(Key::T, "T"), - MapSym(Key::U, "U"), - MapSym(Key::V, "V"), - MapSym(Key::W, "W"), - MapSym(Key::X, "X"), - MapSym(Key::Y, "Y"), - MapSym(Key::Z, "Z"), - MapSym(Key::One, "1"), - MapSym(Key::Two, "2"), - MapSym(Key::Three, "3"), - MapSym(Key::Four, "4"), - MapSym(Key::Five, "5"), - MapSym(Key::Six, "6"), - MapSym(Key::Seven, "7"), - MapSym(Key::Eight, "8"), - MapSym(Key::Nine, "9"), - MapSym(Key::Zero, "0"), - MapSym(Key::Period, "Period"), - MapSym(Key::Comma, "Comma"), - MapSym(Key::Enter, "Enter"), - MapSym(Key::Backspace, "Backspace"), - MapSym(Key::Escape, "Escape"), - MapSym(Key::Space, "Space"), - MapSym(Key::Capslock, "Capslock"), - MapSym(Key::Up, "Up"), - MapSym(Key::Down, "Down"), - MapSym(Key::Left, "Left"), - MapSym(Key::Right, "Right"), + MapSym(Keyboard::Key::Unknown, "Unknown"), + MapSym(Keyboard::Key::A, "A"), + MapSym(Keyboard::Key::B, "B"), + MapSym(Keyboard::Key::C, "C"), + MapSym(Keyboard::Key::D, "D"), + MapSym(Keyboard::Key::E, "E"), + MapSym(Keyboard::Key::F, "F"), + MapSym(Keyboard::Key::G, "G"), + MapSym(Keyboard::Key::H, "H"), + MapSym(Keyboard::Key::I, "I"), + MapSym(Keyboard::Key::J, "J"), + MapSym(Keyboard::Key::K, "K"), + MapSym(Keyboard::Key::L, "L"), + MapSym(Keyboard::Key::M, "M"), + MapSym(Keyboard::Key::N, "N"), + MapSym(Keyboard::Key::O, "O"), + MapSym(Keyboard::Key::P, "P"), + MapSym(Keyboard::Key::Q, "Q"), + MapSym(Keyboard::Key::R, "R"), + MapSym(Keyboard::Key::S, "S"), + MapSym(Keyboard::Key::T, "T"), + MapSym(Keyboard::Key::U, "U"), + MapSym(Keyboard::Key::V, "V"), + MapSym(Keyboard::Key::W, "W"), + MapSym(Keyboard::Key::X, "X"), + MapSym(Keyboard::Key::Y, "Y"), + MapSym(Keyboard::Key::Z, "Z"), + MapSym(Keyboard::Key::One, "1"), + MapSym(Keyboard::Key::Two, "2"), + MapSym(Keyboard::Key::Three, "3"), + MapSym(Keyboard::Key::Four, "4"), + MapSym(Keyboard::Key::Five, "5"), + MapSym(Keyboard::Key::Six, "6"), + MapSym(Keyboard::Key::Seven, "7"), + MapSym(Keyboard::Key::Eight, "8"), + MapSym(Keyboard::Key::Nine, "9"), + MapSym(Keyboard::Key::Zero, "0"), + MapSym(Keyboard::Key::Period, "Period"), + MapSym(Keyboard::Key::Comma, "Comma"), + MapSym(Keyboard::Key::Enter, "Enter"), + MapSym(Keyboard::Key::Backspace, "Backspace"), + MapSym(Keyboard::Key::Escape, "Escape"), + MapSym(Keyboard::Key::Space, "Space"), + MapSym(Keyboard::Key::Capslock, "Capslock"), + MapSym(Keyboard::Key::Up, "Up"), + MapSym(Keyboard::Key::Down, "Down"), + MapSym(Keyboard::Key::Left, "Left"), + MapSym(Keyboard::Key::Right, "Right"), // Numpad - MapSym(Key::NUMPAD_1, "Numpad 1"), - MapSym(Key::NUMPAD_2, "Numpad 2"), - MapSym(Key::NUMPAD_3, "Numpad 3"), - MapSym(Key::NUMPAD_4, "Numpad 4"), - MapSym(Key::NUMPAD_5, "Numpad 5"), - MapSym(Key::NUMPAD_6, "Numpad 6"), - MapSym(Key::NUMPAD_7, "Numpad 7"), - MapSym(Key::NUMPAD_8, "Numpad 8"), - MapSym(Key::NUMPAD_9, "Numpad 9"), - MapSym(Key::NUMPAD_0, "Numpad 0"), - MapSym(Key::NUMPAD_Enter, "Numpad Enter"), + MapSym(Keyboard::Key::Numpad1, "Numpad 1"), + MapSym(Keyboard::Key::Numpad2, "Numpad 2"), + MapSym(Keyboard::Key::Numpad3, "Numpad 3"), + MapSym(Keyboard::Key::Numpad4, "Numpad 4"), + MapSym(Keyboard::Key::Numpad5, "Numpad 5"), + MapSym(Keyboard::Key::Numpad6, "Numpad 6"), + MapSym(Keyboard::Key::Numpad7, "Numpad 7"), + MapSym(Keyboard::Key::Numpad8, "Numpad 8"), + MapSym(Keyboard::Key::Numpad9, "Numpad 9"), + MapSym(Keyboard::Key::Numpad0, "Numpad 0"), - MapSym(Key::Home, "Home"), - MapSym(Key::End, "End"), - MapSym(Key::Insert, "Insert"), - MapSym(Key::Delete, "Delete"), - MapSym(Key::PageUp, "Page up"), - MapSym(Key::PageDown, "Page down"), - MapSym(Key::Pause, "Pause"), + MapSym(Keyboard::Key::Home, "Home"), + MapSym(Keyboard::Key::End, "End"), + MapSym(Keyboard::Key::Insert, "Insert"), + MapSym(Keyboard::Key::Delete, "Delete"), + MapSym(Keyboard::Key::PageUp, "Page up"), + MapSym(Keyboard::Key::PageDown, "Page down"), + MapSym(Keyboard::Key::Pause, "Pause"), // Function keys. - MapSym(Key::F1, "F1"), - MapSym(Key::F2, "F2"), - MapSym(Key::F3, "F3"), - MapSym(Key::F4, "F4"), - MapSym(Key::F5, "F5"), - MapSym(Key::F6, "F6"), - MapSym(Key::F7, "F7"), - MapSym(Key::F8, "F8"), - MapSym(Key::F9, "F9"), - MapSym(Key::F10, "F10"), - MapSym(Key::F11, "F11"), - MapSym(Key::F12, "F12"), + MapSym(Keyboard::Key::F1, "F1"), + MapSym(Keyboard::Key::F2, "F2"), + MapSym(Keyboard::Key::F3, "F3"), + MapSym(Keyboard::Key::F4, "F4"), + MapSym(Keyboard::Key::F5, "F5"), + MapSym(Keyboard::Key::F6, "F6"), + MapSym(Keyboard::Key::F7, "F7"), + MapSym(Keyboard::Key::F8, "F8"), + MapSym(Keyboard::Key::F9, "F9"), + MapSym(Keyboard::Key::F10, "F10"), + MapSym(Keyboard::Key::F11, "F11"), + MapSym(Keyboard::Key::F12, "F12"), - MapSym(Key::Tab, "Tab"), - MapSym(Key::LShift, "Left Shift"), - MapSym(Key::RShift, "Right Shift"), - MapSym(Key::LCtrl, "Left Control"), - MapSym(Key::RCtrl, "Right Control"), - MapSym(Key::LAlt, "Left Alt"), - MapSym(Key::RAlt, "Right Alt"), + MapSym(Keyboard::Key::Tab, "Tab"), + MapSym(Keyboard::Key::LShift, "Left Shift"), + MapSym(Keyboard::Key::RShift, "Right Shift"), + MapSym(Keyboard::Key::LCtrl, "Left Control"), + MapSym(Keyboard::Key::RCtrl, "Right Control"), + MapSym(Keyboard::Key::LAlt, "Left Alt"), + MapSym(Keyboard::Key::RAlt, "Right Alt"), }; -std::string Keyboard::getKeyName(Key::Type key) +std::string Keyboard::getKeyName(Key key) { if (key >= Key::NUM_KEYS) { key = Key::Unknown; diff --git a/source/Input/Mouse.cpp b/source/Input/Mouse.cpp index 45edde6..3b58f0e 100644 --- a/source/Input/Mouse.cpp +++ b/source/Input/Mouse.cpp @@ -7,15 +7,15 @@ Mouse::~Mouse() { } -std::string Mouse::getButtonName(MouseButton::Type button) +std::string Mouse::getButtonName(Button button) { switch(button) { - case MouseButton::Button1 : return "Button1"; - case MouseButton::Button2 : return "Button2"; - case MouseButton::Left : return "Left"; - case MouseButton::Right : return "Right"; - case MouseButton::Middle : return "Middle"; - case MouseButton::Unknown : + case Button::Button1 : return "Button1"; + case Button::Button2 : return "Button2"; + case Button::Left : return "Left"; + case Button::Right : return "Right"; + case Button::Middle : return "Middle"; + case Button::Unknown : default: return "Unknown"; } diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index 21315e8..800bf31 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -20,8 +20,6 @@ public : virtual PlatformInput& getInput() = 0; virtual MessageQueue& getMessageQueue() = 0; - - virtual void update() = 0; }; } // namespace sp diff --git a/source/Platform/PlatformEventQueue.h b/source/Platform/PlatformEventQueue.h new file mode 100644 index 0000000..706a816 --- /dev/null +++ b/source/Platform/PlatformEventQueue.h @@ -0,0 +1,21 @@ +#ifndef PLATFORM_MESSAGE_QUEUE_H +#define PLATFORM_MESSAGE_QUEUE_H + +namespace sp { + +struct Event; + +// Interface for platform specific event queue. +class PlatformEventQueue +{ +public : + + // Poll one event from the platform's event queue. + // Returns false if there was no events. + // NOTE: This method is guaranteed to be non-blocking. + virtual bool poll(Event& event) = 0; +}; + +} // namespace sp + +#endif /* PLATFORM_MESSAGE_QUEUE_H */ diff --git a/source/Platform/Win32/Win32Application.cpp b/source/Platform/Win32/Win32Application.cpp index 20124e5..b125c7f 100644 --- a/source/Platform/Win32/Win32Application.cpp +++ b/source/Platform/Win32/Win32Application.cpp @@ -1,7 +1,4 @@ -#include -#include "Win32Keyboard.h" -#include "Win32Mouse.h" #include "Win32Application.h" namespace sp { @@ -30,71 +27,4 @@ MessageQueue& Win32Application::getMessageQueue() return m_messageQueue; } -void Win32Application::update() -{ - MSG msg; - - while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - processMessage(msg); - } -} - -LRESULT Win32Application::processMessage(MSG msg) -{ - switch(msg.message) { - case WM_QUIT : - m_messageQueue.postEvent(SysEvent(SysEvent::Quit)); - return 0; - // Input, Forward to devices. - case WM_KEYDOWN : - case WM_KEYUP : - OutputDebugString("WM_KEYDOWN\n"); - //SetCapture(msg.hwnd); - - if (Win32Keyboard::handleMessage(msg)) { - // Keyboard did handle the message. - return 0; - } - break; - case WM_MOUSEMOVE : - case WM_MOUSELEAVE : - - if (Win32Mouse::handleMessage(msg)) { - // Mouse did handle the message. - return 0; - } - break; - case WM_LBUTTONDOWN : - case WM_RBUTTONDOWN : - case WM_MBUTTONDOWN : - case WM_XBUTTONDOWN : - - SetCapture(msg.hwnd); - - if (Win32Mouse::handleMessage(msg)) { - // Mouse did handle the message. - return 0; - } - break; - case WM_LBUTTONUP : - case WM_RBUTTONUP : - case WM_MBUTTONUP : - case WM_XBUTTONUP : - - ReleaseCapture(); - - if (Win32Mouse::handleMessage(msg)) { - // Mouse did handle the message. - return 0; - } - break; - default : - break; - } - - // Message was not intercepted. Pass down to window. - return DispatchMessage(&msg); -} - } // namespace sp diff --git a/source/Platform/Win32/Win32Application.h b/source/Platform/Win32/Win32Application.h index c1e02b8..51ed8ab 100644 --- a/source/Platform/Win32/Win32Application.h +++ b/source/Platform/Win32/Win32Application.h @@ -24,12 +24,6 @@ public : virtual MessageQueue& getMessageQueue(); - virtual void update(); - -protected : - - LRESULT processMessage(MSG msg); - protected : //Win32Display m_display; diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 9527585..f8bbe49 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -3,7 +3,6 @@ #include -#include #include #include "Win32Application.h" #include "Win32Internal.h" diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp new file mode 100644 index 0000000..38ab96d --- /dev/null +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -0,0 +1,79 @@ + +#include +#include "Win32Keyboard.h" +#include "Win32Mouse.h" +#include "Win32EventQueue.h" + +namespace sp { + +bool Win32EventQueue::poll(Event& event) +{ + MSG msg; + + if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + if (processMessage(msg, event) == 0) { + return true; + } + } + return false; +} + +LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) +{ + switch(msg.message) { + case WM_QUIT : + event.type = Event::Quit; + return 0; + // Input, Forward to devices. + case WM_KEYDOWN : + case WM_KEYUP : + OutputDebugString("WM_KEYDOWN\n"); + //SetCapture(msg.hwnd); + + if (Win32Keyboard::handleMessage(msg, event)) { + // Keyboard did handle the message. + return 0; + } + break; + case WM_MOUSEMOVE : + case WM_MOUSELEAVE : + + if (Win32Mouse::handleMessage(msg, event)) { + // Mouse did handle the message. + return 0; + } + break; + case WM_LBUTTONDOWN : + case WM_RBUTTONDOWN : + case WM_MBUTTONDOWN : + case WM_XBUTTONDOWN : + + SetCapture(msg.hwnd); + + if (Win32Mouse::handleMessage(msg, event)) { + // Mouse did handle the message. + return 0; + } + break; + case WM_LBUTTONUP : + case WM_RBUTTONUP : + case WM_MBUTTONUP : + case WM_XBUTTONUP : + + ReleaseCapture(); + + if (Win32Mouse::handleMessage(msg, event)) { + // Mouse did handle the message. + return 0; + } + break; + default : + break; + } + + // Message was not intercepted. Pass down to window. + return DispatchMessage(&msg); +} + +} // namespace sp diff --git a/source/Platform/Win32/Win32EventQueue.h b/source/Platform/Win32/Win32EventQueue.h new file mode 100644 index 0000000..503f5fc --- /dev/null +++ b/source/Platform/Win32/Win32EventQueue.h @@ -0,0 +1,22 @@ +#ifndef PLATFORM_WIN32_EVENT_QUEUE_H +#define PLATFORM_WIN32_EVENT_QUEUE_H + +#include +#include +#include + +namespace sp { + +class Win32EventQueue : public PlatformEventQueue +{ +public : + virtual bool poll(Event& event); + +private : + + LRESULT processMessage(MSG msg, Event& event); +}; + +} // namespace sp + +#endif /* PLATFORM_WIN32_MESSAGE_QUEUE_H */ diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index 13bb7d4..475394a 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -9,29 +9,26 @@ namespace sp { -// Can't use GLAD's standard loader function because it -// calls wglGetProcAddress without __stdcall -// that results in some runtime exception. -static GLADapiproc func_loader(const char *name) { - return (GLADapiproc) wglGetProcAddress(name); -} - // Ensure that OpenGL extensions are loaded. -static void ensureExtensionsLoaded(HDC dc) +static bool ensureExtensionsLoaded(HDC dc) { static bool init = false; if (!init) { - init = true; - if (!gladLoadWGL(dc, func_loader)) { + if (!gladLoaderLoadWGL(dc)) { Log::error("WGL: Could not load WGL extensions"); + return false; } if (!gladLoaderLoadGL()) { Log::error("WGL: Could not load OpenGL extensions"); + return false; } + + init = true; } + return true; } Win32GLContext::Win32GLContext() : @@ -103,11 +100,9 @@ void Win32GLContext::createGLContext() tmpDC = ::wglCreateContext(m_deviceContext); ::wglMakeCurrent(m_deviceContext, tmpDC); - ensureExtensionsLoaded(m_deviceContext); - - // Dont need to old one anymore. - wglMakeCurrent(m_deviceContext, NULL); - ::wglDeleteContext(tmpDC); + if (!ensureExtensionsLoaded(m_deviceContext)) { + goto err; + } // TODO: For now.. We force 3.2 Core but this should not be implementation specific. // The Display class should force that for all GLContext Implementations. @@ -121,6 +116,11 @@ void Win32GLContext::createGLContext() // Create real context. m_renderContext = ::wglCreateContextAttribsARB(m_deviceContext, 0, attriblist); + +err: + // Dont need the old one anymore. + wglMakeCurrent(m_deviceContext, NULL); + ::wglDeleteContext(tmpDC); } bool Win32GLContext::activate() diff --git a/source/Platform/Win32/Win32Input.cpp b/source/Platform/Win32/Win32Input.cpp index 40cc230..6ee30ad 100644 --- a/source/Platform/Win32/Win32Input.cpp +++ b/source/Platform/Win32/Win32Input.cpp @@ -6,14 +6,6 @@ namespace sp { -Win32InputMsgBuffer Win32Input::inputMsgBuffer; - -Win32InputMsgBuffer::Win32InputMsgBuffer() : -index (0), -enabled (false) -{ -} - Keyboard* Win32Input::createKeyboard() { return new Win32Keyboard(); diff --git a/source/Platform/Win32/Win32Input.h b/source/Platform/Win32/Win32Input.h index 21ad632..9ec3630 100644 --- a/source/Platform/Win32/Win32Input.h +++ b/source/Platform/Win32/Win32Input.h @@ -7,18 +7,6 @@ namespace sp { -#define WIN32_INPUT_BUFFER_QUEUE_MAX_SIZE 64 - -struct Win32InputMsgBuffer { - int index; - MSG messages[WIN32_INPUT_BUFFER_QUEUE_MAX_SIZE]; - bool enabled; - - Win32InputMsgBuffer(); - - bool postMessage(MSG msg); -}; - class Win32Input : public PlatformInput { public : @@ -27,10 +15,8 @@ public : virtual Mouse* createMouse(); virtual void update(); - - static Win32InputMsgBuffer inputMsgBuffer; }; } // namespace sp -#endif /* PLATFORM_WIN32_INPUT_H */ \ No newline at end of file +#endif /* PLATFORM_WIN32_INPUT_H */ diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index 8cbd4ee..e309675 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -1,123 +1,183 @@ #include -#include +#include #include #include "Win32Input.h" #include "Win32Keyboard.h" -#include "Win32MsgBuffer.h" namespace sp { -static Win32MsgBuffer msg_buf; +static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { + 0x0, // Unknown -static const Key::Type deviceToKey[256] = { + 0x41, // A + 0x42, // B + 0x43, // C + 0x42, // D + 0x43, // E + 0x44, // F + 0x45, // G + 0x46, // H + 0x47, // I + 0x48, // J + 0x49, // K + 0x50, // L + 0x51, // M + 0x52, // N + 0x53, // O + 0x54, // P + 0x55, // Q + 0x56, // R + 0x57, // S + 0x58, // T + 0x59, // U + 0x60, // V + 0x61, // W + 0x62, // X + 0x63, // Y + 0x64, // Z + + 0x30, // One + 0x31, // Two + 0x32, // Three + 0x33, // Four + 0x34, // Five + 0x35, // Six + 0x36, // Seven + 0x37, // Eight + 0x38, // Nine + 0x39, // Zero + + VK_OEM_PERIOD, // Period + VK_OEM_COMMA, // Comma + VK_RETURN, // Enter + VK_BACK, // Backspace + VK_ESCAPE, // Escape + VK_SPACE, // Space + VK_CAPITAL, // Capslock + + VK_UP, // Up + VK_DOWN, // Down + VK_LEFT, // Left + VK_RIGHT, // Right + + VK_NUMPAD1, // Numpad1 + VK_NUMPAD2, // Numpad2 + VK_NUMPAD3, // Numpad3 + VK_NUMPAD4, // Numpad4 + VK_NUMPAD5, // Numpad5 + VK_NUMPAD6, // Numpad6 + VK_NUMPAD7, // Numpad7 + VK_NUMPAD8, // Numpad8 + VK_NUMPAD9, // Numpad9 + VK_NUMPAD0, // Numpad0 + + VK_HOME, // Home + VK_END, // End + VK_INSERT, // Insert + VK_DELETE, // Delete + VK_PRIOR, // PageUp + VK_NEXT, // PageDown + VK_PAUSE, // Pause + + VK_F1, // F1 + VK_F2, // F2 + VK_F3, // F3 + VK_F4, // F4 + VK_F5, // F5 + VK_F6, // F6 + VK_F7, // F7 + VK_F8, // F8 + VK_F9, // F9 + VK_F10, // F10 + VK_F11, // F11 + VK_F12, // F12 + + VK_TAB, // Tab + VK_LSHIFT, // LShift + VK_RSHIFT, // RShift + VK_LCONTROL, // LCtrl + VK_RCONTROL, // RCtrl + VK_LMENU, // LAlt + VK_RMENU // RAlt +}; + +static const Keyboard::Key deviceToKey[256] = { /* 0 1 2 3 4 5 6 7 */ /* 8 9 A B C D E F */ // 00-0F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Backspace, Key::Tab, Key::Unknown, Key::Unknown, Key::Unknown, Key::Enter, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Backspace, Keyboard::Key::Tab, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Enter, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 10-1F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Pause, Key::Capslock, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Escape, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Pause, Keyboard::Key::Capslock, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Escape, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 20-2F - Key::Space, Key::PageUp, Key::PageDown, Key::End, Key::Home, Key::Left, Key::Up, Key::Right, - Key::Down, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Insert, Key::Delete, Key::Unknown, + Keyboard::Key::Space, Keyboard::Key::PageUp, Keyboard::Key::PageDown, Keyboard::Key::End, Keyboard::Key::Home, Keyboard::Key::Left, Keyboard::Key::Up, Keyboard::Key::Right, + Keyboard::Key::Down, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Insert, Keyboard::Key::Delete, Keyboard::Key::Unknown, // 30-3F - Key::Zero, Key::One, Key::Two, Key::Three, Key::Four, Key::Five, Key::Six, Key::Seven, - Key::Eight, Key::Nine, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Zero, Keyboard::Key::One, Keyboard::Key::Two, Keyboard::Key::Three, Keyboard::Key::Four, Keyboard::Key::Five, Keyboard::Key::Six, Keyboard::Key::Seven, + Keyboard::Key::Eight, Keyboard::Key::Nine, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 40-4F - Key::Unknown, Key::A, Key::B, Key::C, Key::D, Key::E, Key::F, Key::G, - Key::H, Key::I, Key::J, Key::K, Key::L, Key::M, Key::N, Key::O, + Keyboard::Key::Unknown, Keyboard::Key::A, Keyboard::Key::B, Keyboard::Key::C, Keyboard::Key::D, Keyboard::Key::E, Keyboard::Key::F, Keyboard::Key::G, + Keyboard::Key::H, Keyboard::Key::I, Keyboard::Key::J, Keyboard::Key::K, Keyboard::Key::L, Keyboard::Key::M, Keyboard::Key::N, Keyboard::Key::O, // 50-5F - Key::P, Key::Q, Key::R, Key::S, Key::T, Key::U, Key::V, Key::W, - Key::X, Key::Y, Key::Z, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::P, Keyboard::Key::Q, Keyboard::Key::R, Keyboard::Key::S, Keyboard::Key::T, Keyboard::Key::U, Keyboard::Key::V, Keyboard::Key::W, + Keyboard::Key::X, Keyboard::Key::Y, Keyboard::Key::Z, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 60-6F - Key::NUMPAD_0, Key::NUMPAD_1, Key::NUMPAD_2, Key::NUMPAD_3, Key::NUMPAD_4, Key::NUMPAD_5, Key::NUMPAD_6, Key::NUMPAD_7, - Key::NUMPAD_8, Key::NUMPAD_9, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Numpad0, Keyboard::Key::Numpad1, Keyboard::Key::Numpad2, Keyboard::Key::Numpad3, Keyboard::Key::Numpad4, Keyboard::Key::Numpad5, Keyboard::Key::Numpad6, Keyboard::Key::Numpad7, + Keyboard::Key::Numpad8, Keyboard::Key::Numpad9, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 70-7F - Key::F1, Key::F2, Key::F3, Key::F4, Key::F5, Key::F6, Key::F7, Key::F8, - Key::F9, Key::F10, Key::F11, Key::F12, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::F1, Keyboard::Key::F2, Keyboard::Key::F3, Keyboard::Key::F4, Keyboard::Key::F5, Keyboard::Key::F6, Keyboard::Key::F7, Keyboard::Key::F8, + Keyboard::Key::F9, Keyboard::Key::F10, Keyboard::Key::F11, Keyboard::Key::F12, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 80-8F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 90-9F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // A0-AF - Key::LShift, Key::RShift, Key::LCtrl, Key::RCtrl, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::LShift, Keyboard::Key::RShift, Keyboard::Key::LCtrl, Keyboard::Key::RCtrl, Keyboard::Key::LAlt, Keyboard::Key::RAlt, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // B0-BF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Comma, Key::Unknown, Key::Period, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Comma, Keyboard::Key::Unknown, Keyboard::Key::Period, Keyboard::Key::Unknown, // C0-CF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // E0-EF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // F0-FF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, }; void Win32Keyboard::init() { - Win32Input::inputMsgBuffer.enabled = true; - - memset(m_btnState, 0, sizeof(m_btnState) / sizeof(m_btnState[0])); } -bool Win32Keyboard::isKeyDown(Key::Type key) +bool Win32Keyboard::isKeyDown(Keyboard::Key key) { - return m_btnState[key]; + return ::GetAsyncKeyState(keyToWin32[key]) & 0x8000; } void Win32Keyboard::update(InputModule *input) { - for(int i = 0; i < msg_buf.index; i++) { - - MSG msg = msg_buf.messages[i]; - - if (msg.message == WM_KILLFOCUS) { - - for(int i = 0; i < Key::NUM_KEYS; i++) { - - if (m_btnState[i]) { - InputEvent event(InputEvent::Key); - event.key.code = (Key::Type) i; - event.key.pressed = msg.message == WM_KEYDOWN; - - m_btnState[i] = false; - input->postInputEvent(event); - } - } - - continue; - } - - if (msg.message != WM_KEYDOWN && msg.message != WM_KEYUP) { - continue; - } - - Key::Type key = deviceToKey[msg.wParam % 0xFF]; - - if (key != Key::Unknown) { - InputEvent event(InputEvent::Key); - event.key.code = key; - event.key.pressed = msg.message == WM_KEYDOWN; - - m_btnState[key] = event.key.pressed; - input->postInputEvent(event); - } - } - - msg_buf.index = 0; } -bool Win32Keyboard::handleMessage(MSG message) +bool Win32Keyboard::handleMessage(MSG msg, Event& event) { - return msg_buf.postMessage(message); + Keyboard::Key key = deviceToKey[msg.wParam % 0xFF]; + + if (key != Keyboard::Key::Unknown) { + event.type = Event::Key; + event.key.code = key; + event.key.pressed = msg.message == WM_KEYDOWN; + return true; + } + + return false; } } // namespace sp diff --git a/source/Platform/Win32/Win32Keyboard.h b/source/Platform/Win32/Win32Keyboard.h index 80cbd13..f7017ed 100644 --- a/source/Platform/Win32/Win32Keyboard.h +++ b/source/Platform/Win32/Win32Keyboard.h @@ -3,6 +3,7 @@ #define PLATFORM_WIN32_KEYBOARD_H #include +#include #include namespace sp { @@ -12,19 +13,14 @@ class Win32Keyboard : public Keyboard public : void init(); - bool isKeyDown(Key::Type key); + bool isKeyDown(Keyboard::Key key); - static bool handleMessage(MSG message); + // Translate a Win32 Event to sp::Event, Called from Win32EventQueue + static bool handleMessage(MSG message, Event& event); protected : void update(InputModule *input); - -protected : - - bool m_btnState[Key::NUM_KEYS]; - - bool m_hasFocus; }; } // namespace sp diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 3675486..3ad6a41 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -2,14 +2,11 @@ #include #include #include -#include "Win32MsgBuffer.h" #include "Win32Input.h" #include "Win32Mouse.h" namespace sp { -static Win32MsgBuffer msg_buf; - static Vector2f _normalizePos(int x, int y, RECT area) { Vector2f out; @@ -29,8 +26,6 @@ static RECT GetClientArea(HWND hwnd) { void Win32Mouse::init() { - memset(m_state, 0, MouseButton::NUM_MBUTTONS); - m_tracked = false; } Vector2f Win32Mouse::getPosition() const @@ -38,82 +33,104 @@ Vector2f Win32Mouse::getPosition() const return m_position; } -bool Win32Mouse::isButtonDown(MouseButton::Type button) const +Vector2f Win32Mouse::getAbsPosition() const { - return m_state[button]; + return m_abs_position; +} + +bool Win32Mouse::isButtonDown(Mouse::Button button) const +{ + int btn; + + switch(button) { + case Mouse::Left : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON; break; + case Mouse::Right : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON; break; + case Mouse::Middle : btn = VK_MBUTTON; break; + case Mouse::Button1 : btn = VK_XBUTTON1; break; + case Mouse::Button2 : btn = VK_XBUTTON2; break; + default: btn = 0; + } + + return ::GetAsyncKeyState(btn) & 0x8000; } void Win32Mouse::update(InputModule *input) { - // TODO: Clean this. - for(int i = 0; i < msg_buf.index; i++) { + HWND handle; + POINT p; - MSG msg = msg_buf.messages[i]; + // Update absolute position + GetCursorPos(&p); + m_abs_position = Vector2f(p.x, p.y); - if (msg.message == WM_LBUTTONDOWN || msg.message == WM_LBUTTONUP) { - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = MouseButton::Left; - event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; - - m_state[MouseButton::Left] = event.mouseButton.pressed; - input->postInputEvent(event); - } else if (msg.message == WM_RBUTTONDOWN || msg.message == WM_RBUTTONUP) { - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = MouseButton::Right; - event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; - - m_state[MouseButton::Right] = event.mouseButton.pressed; - input->postInputEvent(event); - } else if (msg.message == WM_MBUTTONDOWN || msg.message == WM_MBUTTONUP) { - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = MouseButton::Middle; - event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; - - m_state[MouseButton::Middle] = event.mouseButton.pressed; - input->postInputEvent(event); - - } else if (msg.message == WM_XBUTTONDOWN || msg.message == WM_XBUTTONUP) { - - int btn = GET_XBUTTON_WPARAM(msg.wParam); - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = btn == XBUTTON1 ? MouseButton::Button1 : MouseButton::Button2; - event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; - - m_state[MouseButton::Button1] = event.mouseButton.pressed; - input->postInputEvent(event); - - } else if (msg.message == WM_MOUSEMOVE) { - - InputEvent event(InputEvent::MousePosition); - RECT area = GetClientArea(msg.hwnd); - - int x = LOWORD(msg.lParam); - int y = HIWORD(msg.lParam); - - // Do not forward the message if mouse is outside client area. - if ((x < area.left) || (x > area.right) || (y < area.top) || (y > area.bottom)) { - continue; - } - - event.mouse.x = x; - event.mouse.y = y; - - input->postInputEvent(event); - - m_position = _normalizePos(x, y, area); - } + // Update relative position + handle = ::GetCapture(); + if (handle) { + // Translate position to focued window. + ScreenToClient(handle, &p); + m_position = Vector2f(p.x, p.y); } - - msg_buf.index = 0; } -bool Win32Mouse::handleMessage(MSG message) +bool Win32Mouse::handleMessage(MSG msg, Event& event) { - return msg_buf.postMessage(message); + switch(msg.message) { + case WM_LBUTTONUP : + case WM_LBUTTONDOWN : + case WM_RBUTTONUP : + case WM_RBUTTONDOWN : + case WM_MBUTTONUP : + case WM_MBUTTONDOWN : + case WM_XBUTTONUP : + case WM_XBUTTONDOWN : + event.type = Event::MouseButton; + break; + } + + switch(msg.message) { + case WM_LBUTTONUP : + case WM_LBUTTONDOWN : + event.mouseButton.button = Mouse::Button::Left; + event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; + return true; + + case WM_RBUTTONUP : + case WM_RBUTTONDOWN : + event.mouseButton.button = Mouse::Button::Right; + event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; + return true; + + case WM_MBUTTONUP : + case WM_MBUTTONDOWN : + event.mouseButton.button = Mouse::Button::Right; + event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; + return true; + + case WM_XBUTTONUP : + case WM_XBUTTONDOWN : + event.mouseButton.button = GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON1 + ? Mouse::Button::Button1 : Mouse::Button::Button2; + event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; + return true; + + case WM_MOUSEMOVE : + RECT area = GetClientArea(msg.hwnd); + int x = LOWORD(msg.lParam); + int y = HIWORD(msg.lParam); + + // Do not forward the message if mouse is outside client area. + if ( (x < area.left) || (x > area.right) + || (y < area.top) || (y > area.bottom) ) { + return false; + } + + event.type = Event::MouseMove; + event.mouseMove.x = x; + event.mouseMove.y = y; + return true; + } + + return false; } } // namespace sp diff --git a/source/Platform/Win32/Win32Mouse.h b/source/Platform/Win32/Win32Mouse.h index 290103a..b304aa7 100644 --- a/source/Platform/Win32/Win32Mouse.h +++ b/source/Platform/Win32/Win32Mouse.h @@ -3,6 +3,7 @@ #define PLATFORM_WIN32_MOUSE_H #include +#include #include namespace sp { @@ -17,20 +18,22 @@ public : // Get mouse position virtual Vector2f getPosition() const; - virtual bool isButtonDown(MouseButton::Type button) const; + virtual Vector2f getAbsPosition() const; - static bool handleMessage(MSG message); + virtual bool isButtonDown(Mouse::Button button) const; + + static bool handleMessage(MSG msg, Event& event); protected : virtual void update(InputModule *input); protected : + // position in relative (focused window) coordinates. Vector2f m_position; - bool m_state[MouseButton::NUM_MBUTTONS]; - - bool m_tracked; + // position in absolute (screen) coordinates. + Vector2f m_abs_position; }; } // namespace sp diff --git a/source/Platform/Win32/Win32MsgBuffer.cpp b/source/Platform/Win32/Win32MsgBuffer.cpp deleted file mode 100644 index a1d6693..0000000 --- a/source/Platform/Win32/Win32MsgBuffer.cpp +++ /dev/null @@ -1,22 +0,0 @@ - -#include -#include "Win32MsgBuffer.h" - -namespace sp { - -Win32MsgBuffer::Win32MsgBuffer() : -index (0) -{ -} - -bool Win32MsgBuffer::postMessage(MSG msg) -{ - if (index < WIN32_MSG_BUFFER_MAX_SIZE) { - messages[index++] = msg; - return true; - } - Log::warn("Win32MsgBuffer: Queue overflow\n"); - return false; -} - -} // namespace sp diff --git a/source/Platform/Win32/Win32MsgBuffer.h b/source/Platform/Win32/Win32MsgBuffer.h deleted file mode 100644 index e7bf87b..0000000 --- a/source/Platform/Win32/Win32MsgBuffer.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef PLATFORM_WIN32_MSG_BUFFER_H -#define PLATFORM_WIN32_MSG_BUFFER_H - -#include - -namespace sp { - -#define WIN32_MSG_BUFFER_MAX_SIZE 64 - -struct Win32MsgBuffer { - int index; - MSG messages[WIN32_MSG_BUFFER_MAX_SIZE]; - - Win32MsgBuffer(); - - bool postMessage(MSG msg); -}; - -} // namespace sp - -#endif /* PLATFORM_WIN32_MSG_BUFFER_H */ diff --git a/source/Platform/Win32/glad_wgl.c b/source/Platform/Win32/glad_wgl.c index b5543aa..c0ff712 100644 --- a/source/Platform/Win32/glad_wgl.c +++ b/source/Platform/Win32/glad_wgl.c @@ -14,6 +14,11 @@ #endif /* GLAD_IMPL_UTIL_C_ */ +#ifdef __cplusplus +extern "C" { +#endif + + int GLAD_WGL_VERSION_1_0 = 0; int GLAD_WGL_ARB_create_context = 0; @@ -32,21 +37,21 @@ PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT = NULL; static void glad_wgl_load_WGL_ARB_create_context(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_ARB_create_context) return; - glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)load(userptr, "wglCreateContextAttribsARB"); + if(!GLAD_WGL_ARB_create_context) return; + glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) load(userptr, "wglCreateContextAttribsARB"); } static void glad_wgl_load_WGL_ARB_extensions_string(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_ARB_extensions_string) return; - glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load(userptr, "wglGetExtensionsStringARB"); + if(!GLAD_WGL_ARB_extensions_string) return; + glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB"); } static void glad_wgl_load_WGL_EXT_extensions_string(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_EXT_extensions_string) return; - glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load(userptr, "wglGetExtensionsStringEXT"); + if(!GLAD_WGL_EXT_extensions_string) return; + glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT"); } static void glad_wgl_load_WGL_EXT_swap_control(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_EXT_swap_control) return; - glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)load(userptr, "wglGetSwapIntervalEXT"); - glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)load(userptr, "wglSwapIntervalEXT"); + if(!GLAD_WGL_EXT_swap_control) return; + glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) load(userptr, "wglGetSwapIntervalEXT"); + glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) load(userptr, "wglSwapIntervalEXT"); } @@ -54,85 +59,93 @@ static void glad_wgl_resolve_aliases(void) { } static int glad_wgl_has_extension(HDC hdc, const char *ext) { - const char *terminator; - const char *loc; - const char *extensions; + const char *terminator; + const char *loc; + const char *extensions; - if (wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL) - return 0; + if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL) + return 0; - if (wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE) - extensions = wglGetExtensionsStringEXT(); - else - extensions = wglGetExtensionsStringARB(hdc); + if(wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE) + extensions = wglGetExtensionsStringEXT(); + else + extensions = wglGetExtensionsStringARB(hdc); - if (extensions == NULL || ext == NULL) - return 0; + if(extensions == NULL || ext == NULL) + return 0; - while (1) { - loc = strstr(extensions, ext); - if (loc == NULL) - break; + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) + break; - terminator = loc + strlen(ext); - if ((loc == extensions || *(loc - 1) == ' ') && - (*terminator == ' ' || *terminator == '\0')) - { - return 1; - } - extensions = terminator; - } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) + { + return 1; + } + extensions = terminator; + } - return 0; + return 0; } static GLADapiproc glad_wgl_get_proc_from_userptr(void *userptr, const char* name) { - - return (GLAD_GNUC_EXTENSION(GLADapiproc(*)(const char *name)) userptr)(name); + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } static int glad_wgl_find_extensions_wgl(HDC hdc) { - GLAD_WGL_ARB_create_context = glad_wgl_has_extension(hdc, "WGL_ARB_create_context"); - GLAD_WGL_ARB_create_context_profile = glad_wgl_has_extension(hdc, "WGL_ARB_create_context_profile"); - GLAD_WGL_ARB_extensions_string = glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string"); - GLAD_WGL_EXT_extensions_string = glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string"); - GLAD_WGL_EXT_swap_control = glad_wgl_has_extension(hdc, "WGL_EXT_swap_control"); - return 1; + GLAD_WGL_ARB_create_context = glad_wgl_has_extension(hdc, "WGL_ARB_create_context"); + GLAD_WGL_ARB_create_context_profile = glad_wgl_has_extension(hdc, "WGL_ARB_create_context_profile"); + GLAD_WGL_ARB_extensions_string = glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string"); + GLAD_WGL_EXT_extensions_string = glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string"); + GLAD_WGL_EXT_swap_control = glad_wgl_has_extension(hdc, "WGL_EXT_swap_control"); + return 1; } static int glad_wgl_find_core_wgl(void) { - int major = 1, minor = 0; - GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; - return GLAD_MAKE_VERSION(major, minor); + int major = 1, minor = 0; + GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + return GLAD_MAKE_VERSION(major, minor); } int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr) { - int version; - wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load(userptr, "wglGetExtensionsStringARB"); - wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load(userptr, "wglGetExtensionsStringEXT"); - if (wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0; - version = glad_wgl_find_core_wgl(); + int version; + wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB"); + wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT"); + if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0; + version = glad_wgl_find_core_wgl(); - if (!glad_wgl_find_extensions_wgl(hdc)) return 0; - glad_wgl_load_WGL_ARB_create_context(load, userptr); - glad_wgl_load_WGL_ARB_extensions_string(load, userptr); - glad_wgl_load_WGL_EXT_extensions_string(load, userptr); - glad_wgl_load_WGL_EXT_swap_control(load, userptr); + if (!glad_wgl_find_extensions_wgl(hdc)) return 0; + glad_wgl_load_WGL_ARB_create_context(load, userptr); + glad_wgl_load_WGL_ARB_extensions_string(load, userptr); + glad_wgl_load_WGL_EXT_extensions_string(load, userptr); + glad_wgl_load_WGL_EXT_swap_control(load, userptr); - return version; + return version; } int gladLoadWGL(HDC hdc, GLADloadfunc load) { - return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION(void*) load); + return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } #ifdef GLAD_WGL +static GLADapiproc glad_wgl_get_proc(void *vuserptr, const char* name) { + (void) vuserptr; + return GLAD_GNUC_EXTENSION (GLADapiproc) wglGetProcAddress(name); +} + int gladLoaderLoadWGL(HDC hdc) { - return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION(void*) wglGetProcAddress); + return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc, NULL); } #endif /* GLAD_WGL */ + +#ifdef __cplusplus +} +#endif diff --git a/source/Platform/Win32/glad_wgl.h b/source/Platform/Win32/glad_wgl.h index daa6c29..268ea72 100644 --- a/source/Platform/Win32/glad_wgl.h +++ b/source/Platform/Win32/glad_wgl.h @@ -1,29 +1,29 @@ /** -* Loader generated by glad 2.0.0-beta on Sun Dec 22 19:55:16 2019 -* -* Generator: C/C++ -* Specification: wgl -* Extensions: 5 -* -* APIs: -* - wgl=1.0 -* -* Options: -* - MX_GLOBAL = False -* - ON_DEMAND = False -* - LOADER = True -* - ALIAS = True -* - HEADER_ONLY = False -* - DEBUG = False -* - MX = False -* -* Commandline: -* --api='wgl=1.0' --extensions='WGL_ARB_create_context,WGL_ARB_create_context_profile,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_EXT_swap_control' c --loader --alias -* -* Online: -* http://glad.sh/#api=wgl%3D1.0&extensions=WGL_ARB_create_context%2CWGL_ARB_create_context_profile%2CWGL_ARB_extensions_string%2CWGL_EXT_extensions_string%2CWGL_EXT_swap_control&generator=c&options=LOADER%2CALIAS -* -*/ + * Loader generated by glad 2.0.0-beta on Mon Sep 21 17:37:19 2020 + * + * Generator: C/C++ + * Specification: wgl + * Extensions: 5 + * + * APIs: + * - wgl=1.0 + * + * Options: + * - MX_GLOBAL = False + * - ON_DEMAND = False + * - LOADER = True + * - ALIAS = True + * - HEADER_ONLY = False + * - DEBUG = False + * - MX = False + * + * Commandline: + * --api='wgl=1.0' --extensions='WGL_ARB_create_context,WGL_ARB_create_context_profile,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_EXT_swap_control' c --loader --alias + * + * Online: + * http://glad.sh/#api=wgl%3D1.0&extensions=WGL_ARB_create_context%2CWGL_ARB_create_context_profile%2CWGL_ARB_extensions_string%2CWGL_EXT_extensions_string%2CWGL_EXT_swap_control&generator=c&options=LOADER%2CALIAS + * + */ #ifndef GLAD_WGL_H_ #define GLAD_WGL_H_ @@ -43,90 +43,90 @@ extern "C" { #define GLAD_PLATFORM_H_ #ifndef GLAD_PLATFORM_WIN32 -#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) -#define GLAD_PLATFORM_WIN32 1 -#else -#define GLAD_PLATFORM_WIN32 0 -#endif + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif #endif #ifndef GLAD_PLATFORM_APPLE -#ifdef __APPLE__ -#define GLAD_PLATFORM_APPLE 1 -#else -#define GLAD_PLATFORM_APPLE 0 -#endif + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif #endif #ifndef GLAD_PLATFORM_EMSCRIPTEN -#ifdef __EMSCRIPTEN__ -#define GLAD_PLATFORM_EMSCRIPTEN 1 -#else -#define GLAD_PLATFORM_EMSCRIPTEN 0 -#endif + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif #endif #ifndef GLAD_PLATFORM_UWP -#if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) -#ifdef __has_include -#if __has_include() -#define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 -#endif -#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ -#define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 -#endif -#endif + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif -#ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY -#include -#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) -#define GLAD_PLATFORM_UWP 1 -#endif -#endif + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif -#ifndef GLAD_PLATFORM_UWP -#define GLAD_PLATFORM_UWP 0 -#endif + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif #endif #ifdef __GNUC__ -#define GLAD_GNUC_EXTENSION __extension__ + #define GLAD_GNUC_EXTENSION __extension__ #else -#define GLAD_GNUC_EXTENSION + #define GLAD_GNUC_EXTENSION #endif #ifndef GLAD_API_CALL -#if defined(GLAD_API_CALL_EXPORT) -#if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) -#if defined(GLAD_API_CALL_EXPORT_BUILD) -#if defined(__GNUC__) -#define GLAD_API_CALL __attribute__ ((dllexport)) extern -#else -#define GLAD_API_CALL __declspec(dllexport) extern -#endif -#else -#if defined(__GNUC__) -#define GLAD_API_CALL __attribute__ ((dllimport)) extern -#else -#define GLAD_API_CALL __declspec(dllimport) extern -#endif -#endif -#elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) -#define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern -#else -#define GLAD_API_CALL extern -#endif -#else -#define GLAD_API_CALL extern -#endif + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif #endif #ifdef APIENTRY -#define GLAD_API_PTR APIENTRY + #define GLAD_API_PTR APIENTRY #elif GLAD_PLATFORM_WIN32 -#define GLAD_API_PTR __stdcall + #define GLAD_API_PTR __stdcall #else -#define GLAD_API_PTR + #define GLAD_API_PTR #endif #ifndef GLAPI @@ -143,13 +143,13 @@ extern "C" { #define GLAD_GENERATOR_VERSION "2.0.0-beta" - typedef void(*GLADapiproc)(void); +typedef void (*GLADapiproc)(void); - typedef GLADapiproc(*GLADloadfunc)(const char *name); - typedef GLADapiproc(*GLADuserptrloadfunc)(void *userptr, const char *name); +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); - typedef void(*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); - typedef void(*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); #endif /* GLAD_PLATFORM_H_ */ @@ -229,91 +229,101 @@ extern "C" { - struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; - }; - DECLARE_HANDLE(HPBUFFERARB); - DECLARE_HANDLE(HPBUFFEREXT); - DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); - DECLARE_HANDLE(HPVIDEODEV); - DECLARE_HANDLE(HPGPUNV); - DECLARE_HANDLE(HGPUNV); - DECLARE_HANDLE(HVIDEOINPUTDEVICENV); - typedef struct _GPU_DEVICE GPU_DEVICE; - typedef struct _GPU_DEVICE *PGPU_DEVICE; +struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +}; + +DECLARE_HANDLE(HPBUFFERARB); + +DECLARE_HANDLE(HPBUFFEREXT); + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +DECLARE_HANDLE(HPVIDEODEV); + +DECLARE_HANDLE(HPGPUNV); + +DECLARE_HANDLE(HGPUNV); + +DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + +typedef struct _GPU_DEVICE GPU_DEVICE; + +typedef struct _GPU_DEVICE *PGPU_DEVICE; + #define WGL_VERSION_1_0 1 - GLAD_API_CALL int GLAD_WGL_VERSION_1_0; +GLAD_API_CALL int GLAD_WGL_VERSION_1_0; #define WGL_ARB_create_context 1 - GLAD_API_CALL int GLAD_WGL_ARB_create_context; +GLAD_API_CALL int GLAD_WGL_ARB_create_context; #define WGL_ARB_create_context_profile 1 - GLAD_API_CALL int GLAD_WGL_ARB_create_context_profile; +GLAD_API_CALL int GLAD_WGL_ARB_create_context_profile; #define WGL_ARB_extensions_string 1 - GLAD_API_CALL int GLAD_WGL_ARB_extensions_string; +GLAD_API_CALL int GLAD_WGL_ARB_extensions_string; #define WGL_EXT_extensions_string 1 - GLAD_API_CALL int GLAD_WGL_EXT_extensions_string; +GLAD_API_CALL int GLAD_WGL_EXT_extensions_string; #define WGL_EXT_swap_control 1 - GLAD_API_CALL int GLAD_WGL_EXT_swap_control; +GLAD_API_CALL int GLAD_WGL_EXT_swap_control; - typedef int (GLAD_API_PTR *PFNCHOOSEPIXELFORMATPROC)(HDC hDc, const PIXELFORMATDESCRIPTOR * pPfd); - typedef int (GLAD_API_PTR *PFNDESCRIBEPIXELFORMATPROC)(HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR * ppfd); - typedef UINT(GLAD_API_PTR *PFNGETENHMETAFILEPIXELFORMATPROC)(HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR * ppfd); - typedef int (GLAD_API_PTR *PFNGETPIXELFORMATPROC)(HDC hdc); - typedef BOOL(GLAD_API_PTR *PFNSETPIXELFORMATPROC)(HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR * ppfd); - typedef BOOL(GLAD_API_PTR *PFNSWAPBUFFERSPROC)(HDC hdc); - typedef BOOL(GLAD_API_PTR *PFNWGLCOPYCONTEXTPROC)(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); - typedef HGLRC(GLAD_API_PTR *PFNWGLCREATECONTEXTPROC)(HDC hDc); - typedef HGLRC(GLAD_API_PTR *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int * attribList); - typedef HGLRC(GLAD_API_PTR *PFNWGLCREATELAYERCONTEXTPROC)(HDC hDc, int level); - typedef BOOL(GLAD_API_PTR *PFNWGLDELETECONTEXTPROC)(HGLRC oldContext); - typedef BOOL(GLAD_API_PTR *PFNWGLDESCRIBELAYERPLANEPROC)(HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR * plpd); - typedef HGLRC(GLAD_API_PTR *PFNWGLGETCURRENTCONTEXTPROC)(void); - typedef HDC(GLAD_API_PTR *PFNWGLGETCURRENTDCPROC)(void); - typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); - typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void); - typedef int (GLAD_API_PTR *PFNWGLGETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); - typedef PROC(GLAD_API_PTR *PFNWGLGETPROCADDRESSPROC)(LPCSTR lpszProc); - typedef int (GLAD_API_PTR *PFNWGLGETSWAPINTERVALEXTPROC)(void); - typedef BOOL(GLAD_API_PTR *PFNWGLMAKECURRENTPROC)(HDC hDc, HGLRC newContext); - typedef BOOL(GLAD_API_PTR *PFNWGLREALIZELAYERPALETTEPROC)(HDC hdc, int iLayerPlane, BOOL bRealize); - typedef int (GLAD_API_PTR *PFNWGLSETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); - typedef BOOL(GLAD_API_PTR *PFNWGLSHARELISTSPROC)(HGLRC hrcSrvShare, HGLRC hrcSrvSource); - typedef BOOL(GLAD_API_PTR *PFNWGLSWAPINTERVALEXTPROC)(int interval); - typedef BOOL(GLAD_API_PTR *PFNWGLSWAPLAYERBUFFERSPROC)(HDC hdc, UINT fuFlags); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTBITMAPSPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTBITMAPSAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTBITMAPSWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTOUTLINESPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTOUTLINESAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTOUTLINESWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); +typedef int (GLAD_API_PTR *PFNCHOOSEPIXELFORMATPROC)(HDC hDc, const PIXELFORMATDESCRIPTOR * pPfd); +typedef int (GLAD_API_PTR *PFNDESCRIBEPIXELFORMATPROC)(HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR * ppfd); +typedef UINT (GLAD_API_PTR *PFNGETENHMETAFILEPIXELFORMATPROC)(HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR * ppfd); +typedef int (GLAD_API_PTR *PFNGETPIXELFORMATPROC)(HDC hdc); +typedef BOOL (GLAD_API_PTR *PFNSETPIXELFORMATPROC)(HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR * ppfd); +typedef BOOL (GLAD_API_PTR *PFNSWAPBUFFERSPROC)(HDC hdc); +typedef BOOL (GLAD_API_PTR *PFNWGLCOPYCONTEXTPROC)(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); +typedef HGLRC (GLAD_API_PTR *PFNWGLCREATECONTEXTPROC)(HDC hDc); +typedef HGLRC (GLAD_API_PTR *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int * attribList); +typedef HGLRC (GLAD_API_PTR *PFNWGLCREATELAYERCONTEXTPROC)(HDC hDc, int level); +typedef BOOL (GLAD_API_PTR *PFNWGLDELETECONTEXTPROC)(HGLRC oldContext); +typedef BOOL (GLAD_API_PTR *PFNWGLDESCRIBELAYERPLANEPROC)(HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR * plpd); +typedef HGLRC (GLAD_API_PTR *PFNWGLGETCURRENTCONTEXTPROC)(void); +typedef HDC (GLAD_API_PTR *PFNWGLGETCURRENTDCPROC)(void); +typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); +typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void); +typedef int (GLAD_API_PTR *PFNWGLGETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); +typedef PROC (GLAD_API_PTR *PFNWGLGETPROCADDRESSPROC)(LPCSTR lpszProc); +typedef int (GLAD_API_PTR *PFNWGLGETSWAPINTERVALEXTPROC)(void); +typedef BOOL (GLAD_API_PTR *PFNWGLMAKECURRENTPROC)(HDC hDc, HGLRC newContext); +typedef BOOL (GLAD_API_PTR *PFNWGLREALIZELAYERPALETTEPROC)(HDC hdc, int iLayerPlane, BOOL bRealize); +typedef int (GLAD_API_PTR *PFNWGLSETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); +typedef BOOL (GLAD_API_PTR *PFNWGLSHARELISTSPROC)(HGLRC hrcSrvShare, HGLRC hrcSrvSource); +typedef BOOL (GLAD_API_PTR *PFNWGLSWAPINTERVALEXTPROC)(int interval); +typedef BOOL (GLAD_API_PTR *PFNWGLSWAPLAYERBUFFERSPROC)(HDC hdc, UINT fuFlags); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); - GLAD_API_CALL PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB; +GLAD_API_CALL PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB; #define wglCreateContextAttribsARB glad_wglCreateContextAttribsARB - GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB; +GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB; #define wglGetExtensionsStringARB glad_wglGetExtensionsStringARB - GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT; +GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT; #define wglGetExtensionsStringEXT glad_wglGetExtensionsStringEXT - GLAD_API_CALL PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT; +GLAD_API_CALL PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT; #define wglGetSwapIntervalEXT glad_wglGetSwapIntervalEXT - GLAD_API_CALL PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT; +GLAD_API_CALL PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT; #define wglSwapIntervalEXT glad_wglSwapIntervalEXT - GLAD_API_CALL int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr); - GLAD_API_CALL int gladLoadWGL(HDC hdc, GLADloadfunc load); +GLAD_API_CALL int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadWGL(HDC hdc, GLADloadfunc load); #ifdef GLAD_WGL - GLAD_API_CALL int gladLoaderLoadWGL(HDC hdc); +GLAD_API_CALL int gladLoaderLoadWGL(HDC hdc); #endif #ifdef __cplusplus diff --git a/source/System/Event.cpp b/source/System/Event.cpp new file mode 100644 index 0000000..43dee46 --- /dev/null +++ b/source/System/Event.cpp @@ -0,0 +1,56 @@ + +#include + +namespace sp { + +Event::Event(Type type) : +type (type) +{ +} + +std::string Event::KeyEvent::getKeyName() const +{ + return Keyboard::getKeyName(code); +} + +std::string Event::MouseButtonEvent::getName() const +{ + return Mouse::getButtonName(button); +} + +// Helper methods + +Event Event::createSize(Display *display, int width, int height) +{ + Event event(Size); + event.size.display = display; + event.size.width = width; + event.size.height = height; + return event; +} + +Event Event::createKey(Keyboard::Key code, bool pressed) +{ + Event event(Key); + event.key.code = code; + event.key.pressed = pressed; + return event; +} + +Event Event::createMouseButton(Mouse::Button button, bool pressed) +{ + Event event(MouseButton); + event.mouseButton.button = button; + event.mouseButton.pressed = pressed; + return event; +} + +Event Event::createMouseMove(unsigned int x, unsigned int y) +{ + Event event(MouseMove); + event.mouseMove.x = x; + event.mouseMove.y = y; + return event; +} + +} // namespace sp diff --git a/source/System/EventListener.cpp b/source/System/EventListener.cpp new file mode 100644 index 0000000..d2d6875 --- /dev/null +++ b/source/System/EventListener.cpp @@ -0,0 +1,14 @@ +#include +#include + +namespace sp { + +void EventListener::onSizeChanged(Display* display, int width, int height) +{ +} + +void EventListener::onEvent(const Event& event) +{ +} + +} // namespace sp diff --git a/source/System/MessageHandler.cpp b/source/System/MessageHandler.cpp index 6965904..f0eb45f 100644 --- a/source/System/MessageHandler.cpp +++ b/source/System/MessageHandler.cpp @@ -4,8 +4,42 @@ namespace sp { +void MessageHandler::registerListener(EventListener *listener) +{ + for(auto it = m_listeners.begin(); it != m_listeners.end(); it++) { + + if (listener == *it) { + // Already in vector. nothing to do. + return; + } + } + + m_listeners.push_back(listener); +} + +void MessageHandler::unregisterListener(EventListener *listener) +{ + for(auto it = m_listeners.begin(); it != m_listeners.end(); it++) { + + if (listener == *it) { + m_listeners.erase(it); + break; + } + } +} + void MessageHandler::onSizeChanged(Display* display, int width, int height) { + for(EventListener* listener : m_listeners) { + listener->onSizeChanged(display, width, height); + } +} + +void MessageHandler::onEvent(const Event& event) +{ + for(EventListener* listener : m_listeners) { + listener->onEvent(event); + } } } // namespace sp diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index 4054c1e..8ff7a3b 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -1,15 +1,38 @@ #include +#ifdef _WIN32 +#include +typedef sp::Win32EventQueue ImplType; +#else +#error "No MessageQueue implementation exists" +#endif + + namespace sp { -void MessageQueue::postEvent(SysEvent event) +MessageQueue::MessageQueue() +{ + m_impl = new ImplType(); +} + +MessageQueue::~MessageQueue() +{ + delete m_impl; +} + +void MessageQueue::postEvent(Event event) { m_queue.push_back(event); } -bool MessageQueue::pollEvent(SysEvent& event) +bool MessageQueue::pollEvent(Event& event) { + // Process platform events first. + if (m_impl->poll(event)) { + return true; + } + if (!isEmpty()) { event = m_queue.front(); m_queue.pop_front(); diff --git a/source/System/SystemEvent.cpp b/source/System/SystemEvent.cpp deleted file mode 100644 index 2d625be..0000000 --- a/source/System/SystemEvent.cpp +++ /dev/null @@ -1,20 +0,0 @@ - -#include - -namespace sp { - -SysEvent::SysEvent(Type type) : -type (type) -{ -} - -SysEvent SysEvent::sizeEvent(Display *display, int width, int height) -{ - SysEvent event(Size); - event.size.display = display; - event.size.width = width; - event.size.height = height; - return event; -} - -} // namespace sp