13 #ifndef NK_SFML_GL2_H_
14 #define NK_SFML_GL2_H_
16 #include <SFML/Window.hpp>
33 #ifdef NK_SFML_GL2_IMPLEMENTATION
35 struct nk_sfml_device {
41 struct nk_sfml_vertex {
47 static struct nk_sfml {
49 struct nk_sfml_device ogl;
51 struct nk_font_atlas atlas;
55 nk_sfml_device_upload_atlas(
const void* image,
int width,
int height)
57 struct nk_sfml_device* dev = &sfml.ogl;
58 glGenTextures(1, &dev->font_tex);
59 glBindTexture(GL_TEXTURE_2D, dev->font_tex);
60 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
61 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
62 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0,
63 GL_RGBA, GL_UNSIGNED_BYTE, image);
70 struct nk_sfml_device* dev = &sfml.ogl;
72 int window_width = sfml.window->getSize().x;
73 int window_height = sfml.window->getSize().y;
75 glPushAttrib(GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT | GL_TRANSFORM_BIT);
76 glDisable(GL_CULL_FACE);
77 glDisable(GL_DEPTH_TEST);
78 glEnable(GL_SCISSOR_TEST);
80 glEnable(GL_TEXTURE_2D);
81 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
83 glViewport(0, 0, (GLsizei)window_width, (GLsizei)window_height);
84 glMatrixMode(GL_TEXTURE);
87 glMatrixMode(GL_PROJECTION);
90 glOrtho(0.0f, window_width, window_height, 0.0f, -1.0f, 1.0f);
91 glMatrixMode(GL_MODELVIEW);
95 glEnableClientState(GL_VERTEX_ARRAY);
96 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
97 glEnableClientState(GL_COLOR_ARRAY);
99 GLsizei vs =
sizeof(
struct nk_sfml_vertex);
100 size_t vp =
NK_OFFSETOF(
struct nk_sfml_vertex, position);
101 size_t vt =
NK_OFFSETOF(
struct nk_sfml_vertex, uv);
102 size_t vc =
NK_OFFSETOF(
struct nk_sfml_vertex, col);
105 const struct nk_draw_command* cmd;
106 const nk_draw_index* offset = NULL;
111 static const struct nk_draw_vertex_layout_element vertex_layout[] = {
112 {NK_VERTEX_POSITION, NK_FORMAT_FLOAT,
NK_OFFSETOF(
struct nk_sfml_vertex, position)},
113 {NK_VERTEX_TEXCOORD, NK_FORMAT_FLOAT,
NK_OFFSETOF(
struct nk_sfml_vertex, uv)},
114 {NK_VERTEX_COLOR, NK_FORMAT_R8G8B8A8,
NK_OFFSETOF(
struct nk_sfml_vertex, col)},
115 {NK_VERTEX_LAYOUT_END}
117 NK_MEMSET(&config, 0,
sizeof(config));
118 config.vertex_layout = vertex_layout;
119 config.vertex_size =
sizeof(
struct nk_sfml_vertex);
120 config.vertex_alignment =
NK_ALIGNOF(
struct nk_sfml_vertex);
121 config.null = dev->null;
122 config.circle_segment_count = 22;
123 config.curve_segment_count = 22;
124 config.arc_segment_count = 22;
125 config.global_alpha = 1.0f;
126 config.shape_AA = AA;
130 nk_buffer_init_default(&vbuf);
131 nk_buffer_init_default(&ebuf);
132 nk_convert(&sfml.ctx, &dev->cmds, &vbuf, &ebuf, &config);
136 glVertexPointer(2, GL_FLOAT, vs, (
const void*)((
const nk_byte*)vertices + vp));
137 glTexCoordPointer(2, GL_FLOAT, vs, (
const void*)((
const nk_byte*)vertices + vt));
138 glColorPointer(4, GL_UNSIGNED_BYTE, vs, (
const void*)((
const nk_byte*)vertices + vc));
142 nk_draw_foreach(cmd, &sfml.ctx, &dev->cmds)
144 if(!cmd->elem_count)
continue;
145 glBindTexture(GL_TEXTURE_2D, (GLuint)cmd->texture.id);
147 (GLint)(cmd->clip_rect.x),
148 (GLint)((window_height - (GLint)(cmd->clip_rect.y + cmd->clip_rect.h))),
149 (GLint)(cmd->clip_rect.w),
150 (GLint)(cmd->clip_rect.h));
151 glDrawElements(GL_TRIANGLES, (GLsizei)cmd->elem_count, GL_UNSIGNED_SHORT, offset);
152 offset += cmd->elem_count;
160 glDisableClientState(GL_VERTEX_ARRAY);
161 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
162 glDisableClientState(GL_COLOR_ARRAY);
164 glDisable(GL_CULL_FACE);
165 glDisable(GL_DEPTH_TEST);
166 glDisable(GL_SCISSOR_TEST);
168 glDisable(GL_TEXTURE_2D);
170 glBindTexture(GL_TEXTURE_2D, 0);
171 glMatrixMode(GL_TEXTURE);
173 glMatrixMode(GL_MODELVIEW);
175 glMatrixMode(GL_PROJECTION);
185 sf::Clipboard clipboard(sfml.window);
186 const char* text = clipboard.getText();
195 nk_sfml_clipboard_copy(
nk_handle usr,
const char* text,
int len)
201 str = (
char*)malloc((
size_t)len+1);
203 memcpy(str, text, (
size_t)len);
207 sf::Clipboard clipboard(sfml.window);
208 clipboard.setText(str);
216 sfml.window = window;
217 nk_init_default(&sfml.ctx, 0);
218 sfml.ctx.clip.copy = nk_sfml_clipboard_copy;
219 sfml.ctx.clip.paste = nk_sfml_clipboard_paste;
221 nk_buffer_init_default(&sfml.ogl.cmds);
228 nk_font_atlas_init_default(&sfml.atlas);
229 nk_font_atlas_begin(&sfml.atlas);
230 *atlas = &sfml.atlas;
238 img = nk_font_atlas_bake(&sfml.atlas, &w, &h, NK_FONT_ATLAS_RGBA32);
239 nk_sfml_device_upload_atlas(img, w, h);
240 nk_font_atlas_end(&sfml.atlas,
nk_handle_id((
int)sfml.ogl.font_tex), &sfml.ogl.null);
241 if(sfml.atlas.default_font)
255 sf::Mouse::setPosition(sf::Vector2i(x, y), *sfml.window);
258 if(evt->type == sf::Event::KeyReleased || evt->type == sf::Event::KeyPressed)
260 int down = evt->type == sf::Event::KeyPressed;
261 sf::Keyboard::Key key = evt->key.code;
262 if(key == sf::Keyboard::RShift || key == sf::Keyboard::LShift)
264 else if(key == sf::Keyboard::Delete)
266 else if(key == sf::Keyboard::Return)
268 else if(key == sf::Keyboard::Tab)
270 else if(key == sf::Keyboard::BackSpace)
272 else if(key == sf::Keyboard::Home) {
275 }
else if(key == sf::Keyboard::End) {
278 }
else if(key == sf::Keyboard::PageDown)
280 else if(key == sf::Keyboard::PageUp)
282 else if(key == sf::Keyboard::Z)
284 else if(key == sf::Keyboard::R)
286 else if(key == sf::Keyboard::C)
288 else if(key == sf::Keyboard::V)
290 else if(key == sf::Keyboard::X)
292 else if(key == sf::Keyboard::B)
294 else if(key == sf::Keyboard::E)
296 else if(key == sf::Keyboard::Up)
298 else if(key == sf::Keyboard::Down)
300 else if(key == sf::Keyboard::Left) {
301 if(sf::Keyboard::isKeyPressed(sf::Keyboard::LControl))
304 }
else if(key == sf::Keyboard::Right) {
305 if(sf::Keyboard::isKeyPressed(sf::Keyboard::LControl))
310 }
else if(evt->type == sf::Event::MouseButtonPressed || evt->type == sf::Event::MouseButtonReleased) {
311 int down = evt->type == sf::Event::MouseButtonPressed;
312 const int x = evt->mouseButton.x, y = evt->mouseButton.y;
313 if(evt->mouseButton.button == sf::Mouse::Left)
315 if(evt->mouseButton.button == sf::Mouse::Middle)
317 if(evt->mouseButton.button == sf::Mouse::Right)
321 }
else if(evt->type == sf::Event::MouseMoved) {
324 }
else if(evt->type == sf::Event::TouchBegan || evt->type == sf::Event::TouchEnded) {
325 int down = evt->type == sf::Event::TouchBegan;
326 const int x = evt->touch.x, y = evt->touch.y;
331 }
else if(evt->type == sf::Event::TouchMoved) {
338 }
else if(evt->type == sf::Event::TextEntered) {
341 }
else if(evt->type == sf::Event::MouseWheelScrolled) {
351 struct nk_sfml_device* dev = &sfml.ogl;
352 nk_font_atlas_clear(&sfml.atlas);
354 glDeleteTextures(1, &dev->font_tex);
356 memset(&sfml, 0,
sizeof(sfml));