-
Notifications
You must be signed in to change notification settings - Fork 0
/
GLFWHandler.h
122 lines (102 loc) · 4.25 KB
/
GLFWHandler.h
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
//A singleton class that handles all GLFW related functions
#include <iostream>
#include <string>
#include <unordered_map>
#include "GL/gl.h"
#include "GLFW/glfw3.h"
#include "owl/common/math/vec.h"
#include <cuda_runtime.h>
#include <cuda_gl_interop.h>
#include "owl/helper/cuda.h"
//#define DO_GL_CHECK
#ifdef DO_GL_CHECK
# define GL_CHECK( call ) \
do \
{ \
call; \
GLenum err = glGetError(); \
if( err != GL_NO_ERROR ) \
{ \
std::stringstream ss; \
ss << "GL error " << getGLErrorString( err ) << " at " \
<< __FILE__ << "(" << __LINE__ << "): " << #call \
<< std::endl; \
std::cerr << ss.str() << std::endl; \
throw std::runtime_error( ss.str().c_str() ); \
} \
} \
while (0)
# define GL_CHECK_ERRORS( ) \
do \
{ \
GLenum err = glGetError(); \
if( err != GL_NO_ERROR ) \
{ \
std::stringstream ss; \
ss << "GL error " << getGLErrorString( err ) << " at " \
<< __FILE__ << "(" << __LINE__ << ")"; \
std::cerr << ss.str() << std::endl; \
throw std::runtime_error( ss.str().c_str() ); \
} \
} \
while (0)
#else
# define GL_CHECK( call ) do { call; } while(0)
# define GL_CHECK_ERRORS( ) do { ; } while(0)
#endif
class GLFWHandler
{
public:
static GLFWHandler* getInstance();
GLFWwindow* getWindow();
void initWindow(int width, int height, std::string title);
void destroyWindow();
void swapBuffers();
void pollEvents();
int windowShouldClose();
void* getWindowUserPointer();
owl::vec2i getWindowSize();
void draw(const void* fbpointer);
void setWindowSize(int width, int height);
struct MouseState {
owl::vec2f position;
owl::vec2f delta;
bool imGuiPolling = false;
bool leftButtonDown = false;
bool rightButtonDown = false;
bool middleButtonDown = false;
} mouseState;
struct KeyboardState {
std::unordered_map<int, int> keys;// Keys and their last GLFW action
bool isDown(int key) {
if (keys.find(key) == keys.end())
{
return false;
}
return true;
}
bool isPressed(int key) {
if (keys.find(key) == keys.end())
{
return false;
}
return keys[key] == GLFW_PRESS;
}
bool isRepeated(int key) {
if (keys.find(key) == keys.end())
{
return false;
}
return keys[key] == GLFW_REPEAT;
}
} key;
private:
GLFWwindow* window;
owl::vec2i winSize;
GLuint fbTexture {0};
cudaGraphicsResource_t cuDisplayTexture { 0 };
static GLFWHandler* instance;
GLFWHandler();
~GLFWHandler();
void SetCallbacks();
};