1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
#include "window.h"
Window::Window(){
std::cout<<"Start"<<std::endl;
start();
std::cout<<"Loop"<<std::endl;
loop();
std::cout<<"End"<<std::endl;
end();
}
Window::~Window(){
}
void Window::start(){
srand(time(NULL));
// Testing glfw
if(!glfwInit()){
std::cout<<"GLFW init failed :("<<std::endl;
exit(EXIT_FAILURE);
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GLFW_TRUE);
m_GLFWwindow = glfwCreateWindow(640, 480, "Ninja Mouse", NULL, NULL);
if (!m_GLFWwindow)
{
std::cout<<"Window Creation Failed :("<<std::endl;
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(m_GLFWwindow);
Global::graphics.initializeGLEW(); // IMPORTANT: Can't make ANY OpenGL calls before this occurs!
Global::graphics.initialize();
int width, height;
glfwGetWindowSize(m_GLFWwindow, &width, &height);
Global::graphics.setWindowSize(glm::ivec2(width, height));
glfwGetFramebufferSize(m_GLFWwindow, &width, &height);
Global::graphics.setFramebufferSize(glm::ivec2(width, height));
glfwSwapInterval(1);
// Set up Core now that windowing and opengl are set up
m_core = new Core();
// Stores variable in glfw to reference our m_core object. This allows it to be accessed
// even in static methods such as keyCallback and windowSizeCallback
glfwSetWindowUserPointer(m_GLFWwindow, m_core);
glfwSetKeyCallback(m_GLFWwindow, keyCallback);
glfwSetMouseButtonCallback(m_GLFWwindow, mouseButtonCallback);
// glfwSetInputMode(m_GLFWwindow, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
// if (glfwRawMouseMotionSupported()){
// glfwSetInputMode(m_GLFWwindow, GLFW_RAW_MOUSE_MOTION, GLFW_TRUE);
// }
glfwSetCursorPosCallback(m_GLFWwindow, cursorPosCallback);
glfwSetScrollCallback(m_GLFWwindow, scrollCallback);
glfwSetWindowSizeCallback(m_GLFWwindow, windowSizeCallback);
glfwSetFramebufferSizeCallback(m_GLFWwindow, framebufferSizeCallback);
glfwSetInputMode(m_GLFWwindow, GLFW_STICKY_KEYS, GLFW_TRUE);
}
void Window::loop(){
double previous = glfwGetTime();
while (!glfwWindowShouldClose(m_GLFWwindow))
{
double current = glfwGetTime();
double difference = current-previous;
glfwPollEvents();
m_core->update(difference);
m_core->draw();
glfwSwapBuffers(m_GLFWwindow);
}
}
void Window::end(){
glfwDestroyWindow(m_GLFWwindow);
glfwTerminate();
exit(EXIT_SUCCESS);
}
void Window::keyCallback(GLFWwindow* window, int key, int scancode, int action, int mods){
if(key == GLFW_KEY_ESCAPE){
glfwSetWindowShouldClose(window, true);
}
Core* ptr = (Core*)glfwGetWindowUserPointer(window);
ptr->keyEvent(key, action);
}
void Window::cursorPosCallback(GLFWwindow* window, double xpos, double ypos){
Core* ptr = (Core*)glfwGetWindowUserPointer(window);
ptr->mousePosEvent(xpos, ypos);
}
void Window::mouseButtonCallback(GLFWwindow* window, int button, int action, int mods){
Core* ptr = (Core*)glfwGetWindowUserPointer(window);
ptr->mouseButtonEvent(button, action);
}
void Window::scrollCallback(GLFWwindow* window, double xoffset, double yoffset){
Core* ptr = (Core*)glfwGetWindowUserPointer(window);
ptr->scrollEvent(yoffset);
}
void Window::windowSizeCallback(GLFWwindow* window, int width, int height){
Core* ptr = (Core*)glfwGetWindowUserPointer(window);
ptr->windowResizeEvent(width, height);
}
void Window::framebufferSizeCallback(GLFWwindow* window, int width, int height){
Core* ptr = (Core*)glfwGetWindowUserPointer(window);
ptr->framebufferResizeEvent(width, height);
}
|