Elevate Engine 1
Loading...
Searching...
No Matches
GlfwWindow.cpp
Go to the documentation of this file.
1#include "GlfwWindow.h"
2
10
11static void Elevate_MouseButtonCallback(GLFWwindow* window, int button, int action, int mods)
12{
13 auto* dataPtr = static_cast<Elevate::WindowData*>(glfwGetWindowUserPointer(window));
14 if (!dataPtr)
15 return;
16
17 if (action == GLFW_PRESS)
18 {
20 dataPtr->EventCallback(event);
21 }
22 else if (action == GLFW_RELEASE)
23 {
25 dataPtr->EventCallback(event);
26 }
27}
28
29namespace Elevate
30{
31 static bool s_GLFWInitialized = false;
32
33 static void GLFWErrorCallback(int error, const char* description)
34 {
35 EE_CORE_ERROR("GLFW Error: ({0}): {1}", error, description);
36 }
37
39 {
40 Init(props);
41 }
42
44 {
45 Shutdown();
46 }
47
48 double GlfwWindow::GetTime() const
49 {
50 return glfwGetTime();
51 }
52
53 void GlfwWindow::Init(const WindowProps& props)
54 {
55 Window::Init(props);
56
57 if (!s_GLFWInitialized)
58 {
59 int success = glfwInit();
60 EE_CORE_ASSERT(success, "Could not initialize GLFW.");
61 glfwSetErrorCallback(GLFWErrorCallback);
62 s_GLFWInitialized = true;
63 }
64
65 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
66 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5);
67 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
68 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, true);
69
70 m_Window = glfwCreateWindow((int)props.Width, (int)props.Height, m_Data.Title.c_str(), nullptr, nullptr);
71
72 m_Context = new OpenGLContext(m_Window);
73 m_Context->Init();
74
75
76 SetVSync(props.VSync);
77
78 // Set GLFW callbacks
79 glfwSetWindowUserPointer(m_Window, &m_Data);
80
81 glfwSetWindowSizeCallback(m_Window, [](GLFWwindow* window, int width, int height)
82 {
83 void* userPtr = glfwGetWindowUserPointer(window);
84 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
85 dataPtr->Width = width;
86 dataPtr->Height = height;
87 WindowResizeEvent event(width, height);
88 dataPtr->EventCallback(event);
89 });
90
91 glfwSetWindowCloseCallback(m_Window, [](GLFWwindow* window)
92 {
93 void* userPtr = glfwGetWindowUserPointer(window);
94 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
95 WindowCloseEvent event;
96 dataPtr->EventCallback(event);
97 });
98
99 glfwSetWindowFocusCallback(m_Window, [](GLFWwindow* window, int focused)
100 {
101 void* userPtr = glfwGetWindowUserPointer(window);
102 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
103 WindowFocusEvent event(focused);
104 dataPtr->EventCallback(event);
105 });
106
107 glfwSetKeyCallback(m_Window, [](GLFWwindow* window, int key, int scancode, int action, int mods)
108 {
109 void* userPtr = glfwGetWindowUserPointer(window);
110 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
111
112 switch(action)
113 {
114 case GLFW_PRESS:
115 {
116 KeyPressedEvent event(key, 0);
117 dataPtr->EventCallback(event);
118 break;
119 }
120 case GLFW_RELEASE:
121 {
122 KeyReleasedEvent event(key);
123 dataPtr->EventCallback(event);
124 break;
125 }
126 case GLFW_REPEAT:
127 {
128 KeyPressedEvent event(key, 1);
129 dataPtr->EventCallback(event);
130 break;
131 }
132 }
133 });
134
135 glfwSetCharCallback(m_Window, [](GLFWwindow* window, unsigned int keycode)
136 {
137 void* userPtr = glfwGetWindowUserPointer(window);
138 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
139 KeyTypedEvent event(keycode);
140 dataPtr->EventCallback(event);
141 });
142
143 glfwSetMouseButtonCallback(m_Window, Elevate_MouseButtonCallback);
144
145 glfwSetScrollCallback(m_Window, [](GLFWwindow* window, double xOffset, double yOffset)
146 {
147 void* userPtr = glfwGetWindowUserPointer(window);
148 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
149 MouseScrolledEvent event((float)xOffset, (float)yOffset);
150 dataPtr->EventCallback(event);
151 });
152
153 glfwSetCursorPosCallback(m_Window, [](GLFWwindow* window, double xPos, double yPos)
154 {
155 void* userPtr = glfwGetWindowUserPointer(window);
156 WindowData* dataPtr = static_cast<WindowData*>(userPtr);
157 MouseMovedEvent event((float)xPos, (float)yPos);
158 dataPtr->EventCallback(event);
159 });
160 }
161
162 void GlfwWindow::Shutdown()
163 {
164 glfwDestroyWindow(m_Window);
165 }
166
168 {
169 glfwPollEvents();
170 m_Context->SwapBuffers();
171 }
172
173 void GlfwWindow::SetVSync(bool enabled)
174 {
175 if (enabled)
176 glfwSwapInterval(1);
177 else
178 glfwSwapInterval(0);
179
180 m_Data.VSync = enabled;
181 }
182
184 {
185 return m_Data.VSync;
186 }
187}
void OnUpdate() override
virtual double GetTime() const override
bool IsVSync() const override
virtual void Init(const WindowProps &props) override
void SetVSync(bool enabled) override
virtual void SwapBuffers()=0
WindowData m_Data
Definition Window.h:68
virtual void Init(const WindowProps &props)
Definition Window.cpp:82
unsigned int Width
Definition Window.h:14
unsigned int Height
Definition Window.h:14
std::string Title
Definition Window.h:13
EventCallbackFn EventCallback
Definition Window.h:18
unsigned int Height
Definition Window.h:25
unsigned int Width
Definition Window.h:24