1
0
Fork 0

Merge branch 'maint-platform' into dev

This commit is contained in:
Henrik Hautakoski 2020-09-24 17:17:12 +02:00
commit f86a1ae90c
45 changed files with 1091 additions and 1001 deletions

View file

@ -2,7 +2,6 @@
#include <iostream>
#include <Spectre/Display/Display.h>
#include <Spectre/Display/GLContext.h>
#include <Spectre/System/SystemEvent.h>
#include <Platform/PlatformDisplay.h>
namespace sp {

View file

@ -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

View file

@ -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);

View file

@ -1,23 +0,0 @@
#include <Spectre/Input/Mouse.h>
#include <Spectre/Input/Keyboard.h>
#include <Spectre/Input/InputEvent.h>
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

View file

@ -1,10 +0,0 @@
#include <Spectre/Input/InputListener.h>
namespace sp {
void InputListener::onInputEvent(const InputEvent& event)
{
}
} // namespace sp

View file

@ -2,7 +2,6 @@
#include <Platform/PlatformInput.h>
#include <Spectre/Input/Keyboard.h>
#include <Spectre/Input/Mouse.h>
#include <Spectre/Input/InputEvent.h>
#include <Spectre/Input/InputDevice.h>
#include <Spectre/Input/InputModule.h>
@ -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<InputEvent>::iterator it;
for(it = m_buffer.begin(); it != m_buffer.end(); it++) {
const InputEvent& event = *it;
// Call listeners.
std::vector<InputListener*>::iterator it;
for(it = m_listeners.begin(); it != m_listeners.end(); it++) {
(*it)->onInputEvent(event);
}
}
m_buffer.clear();
}
} // namespace sp

View file

@ -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;

View file

@ -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";
}

View file

@ -20,8 +20,6 @@ public :
virtual PlatformInput& getInput() = 0;
virtual MessageQueue& getMessageQueue() = 0;
virtual void update() = 0;
};
} // namespace sp

View file

@ -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 */

View file

@ -1,7 +1,4 @@
#include <windows.h>
#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

View file

@ -24,12 +24,6 @@ public :
virtual MessageQueue& getMessageQueue();
virtual void update();
protected :
LRESULT processMessage(MSG msg);
protected :
//Win32Display m_display;

View file

@ -3,7 +3,6 @@
#include <Spectre/Display/Display.h>
#include <Spectre/System/SystemEvent.h>
#include <Spectre/System/Log.h>
#include "Win32Application.h"
#include "Win32Internal.h"

View file

@ -0,0 +1,79 @@
#include <windows.h>
#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

View file

@ -0,0 +1,22 @@
#ifndef PLATFORM_WIN32_EVENT_QUEUE_H
#define PLATFORM_WIN32_EVENT_QUEUE_H
#include <windows.h>
#include <Spectre/System/Event.h>
#include <Platform/PlatformEventQueue.h>
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 */

View file

@ -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()

View file

@ -6,14 +6,6 @@
namespace sp {
Win32InputMsgBuffer Win32Input::inputMsgBuffer;
Win32InputMsgBuffer::Win32InputMsgBuffer() :
index (0),
enabled (false)
{
}
Keyboard* Win32Input::createKeyboard()
{
return new Win32Keyboard();

View file

@ -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 */
#endif /* PLATFORM_WIN32_INPUT_H */

View file

@ -1,123 +1,183 @@
#include <Windows.h>
#include <Spectre/Input/InputEvent.h>
#include <Spectre/System/Event.h>
#include <Spectre/Input/InputModule.h>
#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

View file

@ -3,6 +3,7 @@
#define PLATFORM_WIN32_KEYBOARD_H
#include <windows.h>
#include <Spectre/System/Event.h>
#include <Spectre/Input/Keyboard.h>
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

View file

@ -2,14 +2,11 @@
#include <Windows.h>
#include <Spectre/System/Log.h>
#include <Spectre/Input/InputModule.h>
#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

View file

@ -3,6 +3,7 @@
#define PLATFORM_WIN32_MOUSE_H
#include <Windows.h>
#include <Spectre/System/Event.h>
#include <Spectre/Input/Mouse.h>
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

View file

@ -1,22 +0,0 @@
#include <Spectre/System/Log.h>
#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

View file

@ -1,22 +0,0 @@
#ifndef PLATFORM_WIN32_MSG_BUFFER_H
#define PLATFORM_WIN32_MSG_BUFFER_H
#include <Windows.h>
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 */

View file

@ -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

View file

@ -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(<winapifamily.h>)
#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(<winapifamily.h>)
#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 <winapifamily.h>
#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 <winapifamily.h>
#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

56
source/System/Event.cpp Normal file
View file

@ -0,0 +1,56 @@
#include <Spectre/System/Event.h>
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

View file

@ -0,0 +1,14 @@
#include <Spectre/Display/Display.h>
#include <Spectre/System/EventListener.h>
namespace sp {
void EventListener::onSizeChanged(Display* display, int width, int height)
{
}
void EventListener::onEvent(const Event& event)
{
}
} // namespace sp

View file

@ -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

View file

@ -1,15 +1,38 @@
#include <Spectre/System/MessageQueue.h>
#ifdef _WIN32
#include <Platform/Win32/Win32EventQueue.h>
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();

View file

@ -1,20 +0,0 @@
#include <Spectre/System/SystemEvent.h>
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