imgui-bindings 0.0.1 → 0.0.2.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +12 -0
- data/README.md +4 -3
- data/lib/imgui_impl_glfw.rb +54 -54
- data/lib/imgui_impl_opengl2.rb +64 -65
- data/lib/imgui_impl_opengl3.rb +125 -129
- data/lib/imgui_impl_raylib.rb +334 -0
- metadata +36 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d7b45550f223f0cedd9d8f543e6d25bcc4988ab0bc59df341c527d0e0907f9a5
|
4
|
+
data.tar.gz: 4e48bb054f108f73e12777761a9d0b6eada3782ba76e437aaa9d848b69736294
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 238d51745983ded557d6d6e84effcbf70c18f7684e398e456cb168f85bde9ed10f16118b0dee60eb5b32773310edb2915681620221caf360f62e12dd9c298327
|
7
|
+
data.tar.gz: 1798e2c878227420b20cafa91ec98e4d272bdce78b7c4be2cc08f9b52b46fe9d73c60c508af88ed99a137f6e054f6af97f70640eb8ff48c6c0a4bea82ee9c333
|
data/ChangeLog
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
2022-01-08 vaiorabbit <http://twitter.com/vaiorabbit>
|
2
|
+
|
3
|
+
* imgui_impl_raylib.rb: Added. Use this with Ruby raylib-bindings ( https://github.com/vaiorabbit/raylib-bindings )
|
4
|
+
|
5
|
+
2022-01-07 vaiorabbit <http://twitter.com/vaiorabbit>
|
6
|
+
|
7
|
+
* Use opengl-bindings2
|
8
|
+
|
9
|
+
2022-01-01 vaiorabbit <http://twitter.com/vaiorabbit>
|
10
|
+
|
11
|
+
* imgui-bindings.gemspec: Added
|
12
|
+
|
1
13
|
2021-12-31 vaiorabbit <http://twitter.com/vaiorabbit>
|
2
14
|
|
3
15
|
* Added setup_dll.rb etc. for automatic library loading
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
# Yet another ImGui wrapper for Ruby #
|
4
4
|
|
5
5
|
* Created : 2019-01-05
|
6
|
-
* Last modified :
|
6
|
+
* Last modified : 2022-01-08
|
7
7
|
|
8
8
|
<img src="https://raw.githubusercontent.com/vaiorabbit/ruby-imgui/master/doc/jpfont_test.png" width="250">
|
9
9
|
|
@@ -18,8 +18,9 @@
|
|
18
18
|
* ~~ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x64-mingw32]~~
|
19
19
|
* ~~ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x64-mingw32]~~
|
20
20
|
* [macOS]
|
21
|
+
* ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin20]
|
21
22
|
* ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20]
|
22
|
-
* ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [arm64-darwin20]
|
23
|
+
* ~~ruby 3.0.1p64 (2021-04-05 revision 0fb782ee38) [arm64-darwin20]~~
|
23
24
|
* ~~ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [arm64-darwin20]~~
|
24
25
|
* ~~ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-darwin19]~~
|
25
26
|
* ~~ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-darwin18]~~
|
@@ -68,7 +69,7 @@
|
|
68
69
|
All ruby codes here are available under the terms of the zlib/libpng License ( http://opensource.org/licenses/Zlib ).
|
69
70
|
|
70
71
|
Ruby-Imgui : Yet another ImGui wrapper for Ruby
|
71
|
-
Copyright (c) 2019-
|
72
|
+
Copyright (c) 2019-2022 vaiorabbit <http://twitter.com/vaiorabbit>
|
72
73
|
|
73
74
|
This software is provided 'as-is', without any express or implied
|
74
75
|
warranty. In no event will the authors be held liable for any damages
|
data/lib/imgui_impl_glfw.rb
CHANGED
@@ -27,7 +27,7 @@ module ImGui
|
|
27
27
|
userfunc.call(window, button, action, mods)
|
28
28
|
end
|
29
29
|
|
30
|
-
if action ==
|
30
|
+
if action == GLFW::PRESS && button >= 0 && button < @@g_MouseJustPressed.size
|
31
31
|
@@g_MouseJustPressed[button] = true
|
32
32
|
end
|
33
33
|
end
|
@@ -50,14 +50,14 @@ module ImGui
|
|
50
50
|
end
|
51
51
|
|
52
52
|
io = ImGuiIO.new(ImGui::GetIO())
|
53
|
-
io[:KeysDown][key] = true if action ==
|
54
|
-
io[:KeysDown][key] = false if action ==
|
53
|
+
io[:KeysDown][key] = true if action == GLFW::PRESS
|
54
|
+
io[:KeysDown][key] = false if action == GLFW::RELEASE
|
55
55
|
|
56
56
|
# Modifiers are not reliable across systems
|
57
|
-
io[:KeyCtrl] = io[:KeysDown][
|
58
|
-
io[:KeyShift] = io[:KeysDown][
|
59
|
-
io[:KeyAlt] = io[:KeysDown][
|
60
|
-
io[:KeySuper] = io[:KeysDown][
|
57
|
+
io[:KeyCtrl] = io[:KeysDown][GLFW::KEY_LEFT_CONTROL] || io[:KeysDown][GLFW::KEY_RIGHT_CONTROL]
|
58
|
+
io[:KeyShift] = io[:KeysDown][GLFW::KEY_LEFT_SHIFT] || io[:KeysDown][GLFW::KEY_RIGHT_SHIFT]
|
59
|
+
io[:KeyAlt] = io[:KeysDown][GLFW::KEY_LEFT_ALT] || io[:KeysDown][GLFW::KEY_RIGHT_ALT]
|
60
|
+
io[:KeySuper] = io[:KeysDown][GLFW::KEY_LEFT_SUPER] || io[:KeysDown][GLFW::KEY_RIGHT_SUPER]
|
61
61
|
end
|
62
62
|
|
63
63
|
@@ImGui_ImplGlfw_CursorEnterCallback = GLFW::create_callback(:GLFWcursorenterfun) do |window, entered|
|
@@ -84,11 +84,11 @@ module ImGui
|
|
84
84
|
io = ImGuiIO.new(ImGui::GetIO())
|
85
85
|
io[:MouseDown].size.times do |i|
|
86
86
|
# If a mouse press event came, always pass it as "mouse held this frame", so we don't miss click-release events that are shorter than 1 frame.
|
87
|
-
io[:MouseDown][i] = (@@g_MouseJustPressed[i] ||
|
87
|
+
io[:MouseDown][i] = (@@g_MouseJustPressed[i] || GLFW.GetMouseButton(@@g_Window, i) != 0)
|
88
88
|
@@g_MouseJustPressed[i] = false
|
89
89
|
end
|
90
90
|
|
91
|
-
focused =
|
91
|
+
focused = GLFW.GetWindowAttrib(@@g_Window, GLFW::FOCUSED) != 0
|
92
92
|
mouse_window = (@@g_MouseWindow == @@g_Window || focused) ? @@g_Window : nil
|
93
93
|
|
94
94
|
# Update mouse position
|
@@ -97,12 +97,12 @@ module ImGui
|
|
97
97
|
io[:MousePos][:y] = -Float::MAX
|
98
98
|
if io[:WantSetMousePos]
|
99
99
|
if focused
|
100
|
-
|
100
|
+
GLFW.SetCursorPos(@@g_Window, mouse_pos_backup[:x].to_f, mouse_pos_backup[:y].to_f)
|
101
101
|
end
|
102
102
|
elsif @@g_MouseWindow != nil
|
103
103
|
mouse_x = ' ' * 8
|
104
104
|
mouse_y = ' ' * 8
|
105
|
-
|
105
|
+
GLFW.GetCursorPos(@@g_Window, mouse_x, mouse_y)
|
106
106
|
io[:MousePos][:x] = mouse_x.unpack1('d')
|
107
107
|
io[:MousePos][:y] = mouse_y.unpack1('d')
|
108
108
|
end
|
@@ -110,17 +110,17 @@ module ImGui
|
|
110
110
|
|
111
111
|
def self.ImplGlfw_UpdateMouseCursor()
|
112
112
|
io = ImGuiIO.new(ImGui::GetIO())
|
113
|
-
return if ((io[:ConfigFlags] & ImGuiConfigFlags_NoMouseCursorChange) ||
|
113
|
+
return if ((io[:ConfigFlags] & ImGuiConfigFlags_NoMouseCursorChange) || GLFW.GetInputMode(@@g_Window, GLFW::CURSOR) == GLFW::CURSOR_DISABLED)
|
114
114
|
|
115
115
|
imgui_cursor = ImGui::GetMouseCursor()
|
116
116
|
if imgui_cursor == ImGuiMouseCursor_None || io[:MouseDrawCursor]
|
117
117
|
# Hide OS mouse cursor if imgui is drawing it or if it wants no cursor
|
118
|
-
|
118
|
+
GLFW.SetInputMode(@@g_Window, GLFW::CURSOR, GLFW::CURSOR_HIDDEN)
|
119
119
|
else
|
120
120
|
# Show OS mouse cursor
|
121
121
|
# FIXME-PLATFORM: Unfocused windows seems to fail changing the mouse cursor with GLFW 3.2, but 3.3 works here.
|
122
|
-
|
123
|
-
|
122
|
+
GLFW.SetCursor(@@g_Window, @@g_MouseCursors[imgui_cursor] ? @@g_MouseCursors[imgui_cursor] : @@g_MouseCursors[ImGuiMouseCursor_Arrow])
|
123
|
+
GLFW.SetInputMode(@@g_Window, GLFW::CURSOR, GLFW::CURSOR_NORMAL)
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -130,7 +130,7 @@ module ImGui
|
|
130
130
|
|
131
131
|
def self.ImplGlfw_Shutdown()
|
132
132
|
ImGuiMouseCursor_COUNT.times do |cursor_n|
|
133
|
-
|
133
|
+
GLFW.DestroyCursor(@@g_MouseCursors[cursor_n])
|
134
134
|
@@g_MouseCursors[cursor_n] = nil
|
135
135
|
end
|
136
136
|
end
|
@@ -146,8 +146,8 @@ module ImGui
|
|
146
146
|
h = ' ' * 4
|
147
147
|
display_w = ' ' * 4
|
148
148
|
display_h = ' ' * 4
|
149
|
-
|
150
|
-
|
149
|
+
GLFW.GetWindowSize(@@g_Window, w, h)
|
150
|
+
GLFW.GetFramebufferSize(@@g_Window, display_w, display_h)
|
151
151
|
|
152
152
|
w = w.unpack1('L')
|
153
153
|
h = h.unpack1('L')
|
@@ -160,7 +160,7 @@ module ImGui
|
|
160
160
|
end
|
161
161
|
|
162
162
|
# Setup time step
|
163
|
-
current_time =
|
163
|
+
current_time = GLFW.GetTime()
|
164
164
|
io[:DeltaTime] = @@g_Time > 0.0 ? (current_time - @@g_Time).to_f : (1.0/60.0)
|
165
165
|
@@g_Time = current_time
|
166
166
|
|
@@ -181,28 +181,28 @@ module ImGui
|
|
181
181
|
io[:BackendPlatformName] = @@g_BackendPlatformName
|
182
182
|
|
183
183
|
# Keyboard mapping. ImGui will use those indices to peek into the io.KeysDown[] array.
|
184
|
-
io[:KeyMap][ImGuiKey_Tab] =
|
185
|
-
io[:KeyMap][ImGuiKey_LeftArrow] =
|
186
|
-
io[:KeyMap][ImGuiKey_RightArrow] =
|
187
|
-
io[:KeyMap][ImGuiKey_UpArrow] =
|
188
|
-
io[:KeyMap][ImGuiKey_DownArrow] =
|
189
|
-
io[:KeyMap][ImGuiKey_PageUp] =
|
190
|
-
io[:KeyMap][ImGuiKey_PageDown] =
|
191
|
-
io[:KeyMap][ImGuiKey_Home] =
|
192
|
-
io[:KeyMap][ImGuiKey_End] =
|
193
|
-
io[:KeyMap][ImGuiKey_Insert] =
|
194
|
-
io[:KeyMap][ImGuiKey_Delete] =
|
195
|
-
io[:KeyMap][ImGuiKey_Backspace] =
|
196
|
-
io[:KeyMap][ImGuiKey_Space] =
|
197
|
-
io[:KeyMap][ImGuiKey_Enter] =
|
198
|
-
io[:KeyMap][ImGuiKey_Escape] =
|
199
|
-
io[:KeyMap][ImGuiKey_KeyPadEnter] =
|
200
|
-
io[:KeyMap][ImGuiKey_A] =
|
201
|
-
io[:KeyMap][ImGuiKey_C] =
|
202
|
-
io[:KeyMap][ImGuiKey_V] =
|
203
|
-
io[:KeyMap][ImGuiKey_X] =
|
204
|
-
io[:KeyMap][ImGuiKey_Y] =
|
205
|
-
io[:KeyMap][ImGuiKey_Z] =
|
184
|
+
io[:KeyMap][ImGuiKey_Tab] = GLFW::KEY_TAB
|
185
|
+
io[:KeyMap][ImGuiKey_LeftArrow] = GLFW::KEY_LEFT
|
186
|
+
io[:KeyMap][ImGuiKey_RightArrow] = GLFW::KEY_RIGHT
|
187
|
+
io[:KeyMap][ImGuiKey_UpArrow] = GLFW::KEY_UP
|
188
|
+
io[:KeyMap][ImGuiKey_DownArrow] = GLFW::KEY_DOWN
|
189
|
+
io[:KeyMap][ImGuiKey_PageUp] = GLFW::KEY_PAGE_UP
|
190
|
+
io[:KeyMap][ImGuiKey_PageDown] = GLFW::KEY_PAGE_DOWN
|
191
|
+
io[:KeyMap][ImGuiKey_Home] = GLFW::KEY_HOME
|
192
|
+
io[:KeyMap][ImGuiKey_End] = GLFW::KEY_END
|
193
|
+
io[:KeyMap][ImGuiKey_Insert] = GLFW::KEY_INSERT
|
194
|
+
io[:KeyMap][ImGuiKey_Delete] = GLFW::KEY_DELETE
|
195
|
+
io[:KeyMap][ImGuiKey_Backspace] = GLFW::KEY_BACKSPACE
|
196
|
+
io[:KeyMap][ImGuiKey_Space] = GLFW::KEY_SPACE
|
197
|
+
io[:KeyMap][ImGuiKey_Enter] = GLFW::KEY_ENTER
|
198
|
+
io[:KeyMap][ImGuiKey_Escape] = GLFW::KEY_ESCAPE
|
199
|
+
io[:KeyMap][ImGuiKey_KeyPadEnter] = GLFW::KEY_KP_ENTER
|
200
|
+
io[:KeyMap][ImGuiKey_A] = GLFW::KEY_A
|
201
|
+
io[:KeyMap][ImGuiKey_C] = GLFW::KEY_C
|
202
|
+
io[:KeyMap][ImGuiKey_V] = GLFW::KEY_V
|
203
|
+
io[:KeyMap][ImGuiKey_X] = GLFW::KEY_X
|
204
|
+
io[:KeyMap][ImGuiKey_Y] = GLFW::KEY_Y
|
205
|
+
io[:KeyMap][ImGuiKey_Z] = GLFW::KEY_Z
|
206
206
|
|
207
207
|
# [TODO] Support ClipboardText & IME on Windows
|
208
208
|
# io.SetClipboardTextFn = ImGui_ImplGlfw_SetClipboardText;
|
@@ -212,14 +212,14 @@ module ImGui
|
|
212
212
|
# io.ImeWindowHandle = (void*)glfwGetWin32Window(g_Window);
|
213
213
|
# #endif
|
214
214
|
|
215
|
-
@@g_MouseCursors[ImGuiMouseCursor_Arrow] =
|
216
|
-
@@g_MouseCursors[ImGuiMouseCursor_TextInput] =
|
217
|
-
@@g_MouseCursors[ImGuiMouseCursor_ResizeAll] =
|
218
|
-
@@g_MouseCursors[ImGuiMouseCursor_ResizeNS] =
|
219
|
-
@@g_MouseCursors[ImGuiMouseCursor_ResizeEW] =
|
220
|
-
@@g_MouseCursors[ImGuiMouseCursor_ResizeNESW] =
|
221
|
-
@@g_MouseCursors[ImGuiMouseCursor_ResizeNWSE] =
|
222
|
-
@@g_MouseCursors[ImGuiMouseCursor_Hand] =
|
215
|
+
@@g_MouseCursors[ImGuiMouseCursor_Arrow] = GLFW.CreateStandardCursor(GLFW::ARROW_CURSOR)
|
216
|
+
@@g_MouseCursors[ImGuiMouseCursor_TextInput] = GLFW.CreateStandardCursor(GLFW::IBEAM_CURSOR)
|
217
|
+
@@g_MouseCursors[ImGuiMouseCursor_ResizeAll] = GLFW.CreateStandardCursor(GLFW::ARROW_CURSOR) # FIXME: GLFW doesn't have this.
|
218
|
+
@@g_MouseCursors[ImGuiMouseCursor_ResizeNS] = GLFW.CreateStandardCursor(GLFW::VRESIZE_CURSOR)
|
219
|
+
@@g_MouseCursors[ImGuiMouseCursor_ResizeEW] = GLFW.CreateStandardCursor(GLFW::HRESIZE_CURSOR)
|
220
|
+
@@g_MouseCursors[ImGuiMouseCursor_ResizeNESW] = GLFW.CreateStandardCursor(GLFW::ARROW_CURSOR) # FIXME: GLFW doesn't have this.
|
221
|
+
@@g_MouseCursors[ImGuiMouseCursor_ResizeNWSE] = GLFW.CreateStandardCursor(GLFW::ARROW_CURSOR) # FIXME: GLFW doesn't have this.
|
222
|
+
@@g_MouseCursors[ImGuiMouseCursor_Hand] = GLFW.CreateStandardCursor(GLFW::HAND_CURSOR)
|
223
223
|
|
224
224
|
# Chain GLFW callbacks: our callbacks will call the user's previously installed callbacks, if any.
|
225
225
|
@@g_PrevUserCallbackMousebutton = nil
|
@@ -227,11 +227,11 @@ module ImGui
|
|
227
227
|
@@g_PrevUserCallbackKey = nil
|
228
228
|
@@g_PrevUserCallbackChar = nil
|
229
229
|
if install_callbacks
|
230
|
-
@@g_PrevUserCallbackCursorEnter =
|
231
|
-
@@g_PrevUserCallbackMousebutton =
|
232
|
-
@@g_PrevUserCallbackScroll =
|
233
|
-
@@g_PrevUserCallbackKey =
|
234
|
-
@@g_PrevUserCallbackChar =
|
230
|
+
@@g_PrevUserCallbackCursorEnter = GLFW.SetCursorEnterCallback(window, @@ImGui_ImplGlfw_CursorEnterCallback)
|
231
|
+
@@g_PrevUserCallbackMousebutton = GLFW.SetMouseButtonCallback(window, @@ImplGlfw_MouseButtonCallback)
|
232
|
+
@@g_PrevUserCallbackScroll = GLFW.SetScrollCallback(window, @@ImplGlfw_ScrollCallback)
|
233
|
+
@@g_PrevUserCallbackKey = GLFW.SetKeyCallback(window, @@ImplGlfw_KeyCallback)
|
234
|
+
@@g_PrevUserCallbackChar = GLFW.SetCharCallback(window, @@ImplGlfw_CharCallback)
|
235
235
|
end
|
236
236
|
|
237
237
|
return true
|
data/lib/imgui_impl_opengl2.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'ffi'
|
2
2
|
require 'opengl'
|
3
|
-
include OpenGL
|
4
3
|
|
5
4
|
require_relative 'imgui'
|
6
5
|
|
@@ -34,18 +33,18 @@ module ImGui
|
|
34
33
|
|
35
34
|
# Backup GL state
|
36
35
|
last_texture = ' ' * 4
|
37
|
-
|
36
|
+
GL.GetIntegerv(GL::TEXTURE_BINDING_2D, last_texture)
|
38
37
|
last_polygon_mode = ' ' * 8
|
39
|
-
|
38
|
+
GL.GetIntegerv(GL::POLYGON_MODE, last_polygon_mode)
|
40
39
|
last_viewport = ' ' * 16
|
41
|
-
|
40
|
+
GL.GetIntegerv(GL::VIEWPORT, last_viewport)
|
42
41
|
last_scissor_box = ' ' * 16
|
43
|
-
|
44
|
-
|
42
|
+
GL.GetIntegerv(GL::SCISSOR_BOX, last_scissor_box)
|
43
|
+
GL.PushAttrib(GL::ENABLE_BIT | GL::COLOR_BUFFER_BIT | GL::TRANSFORM_BIT)
|
45
44
|
last_shade_model = ' ' * 4
|
46
|
-
|
45
|
+
GL.GetIntegerv(GL::SHADE_MODEL, last_shade_model)
|
47
46
|
last_tex_env_mode = ' ' * 4
|
48
|
-
|
47
|
+
GL.GetTexEnviv(GL::TEXTURE_ENV, GL::TEXTURE_ENV_MODE, last_tex_env_mode)
|
49
48
|
|
50
49
|
# Setup desired GL state
|
51
50
|
ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height)
|
@@ -59,9 +58,9 @@ module ImGui
|
|
59
58
|
cmd_list = ImDrawList.new((draw_data[:CmdLists].pointer + 8 * n).read_pointer) # 8 == const ImDrawList*
|
60
59
|
vtx_buffer = ImDrawVert.new(cmd_list[:VtxBuffer][:Data]) # const ImDrawVert*
|
61
60
|
idx_buffer = cmd_list[:IdxBuffer][:Data] # const ImDrawIdx*
|
62
|
-
|
63
|
-
|
64
|
-
|
61
|
+
GL.VertexPointer(2, GL::FLOAT, ImDrawVert.size, Fiddle::Pointer.new((cmd_list[:VtxBuffer][:Data] + vtx_buffer.offset_of(:pos))) )
|
62
|
+
GL.TexCoordPointer(2, GL::FLOAT, ImDrawVert.size, Fiddle::Pointer.new((cmd_list[:VtxBuffer][:Data] + vtx_buffer.offset_of(:uv))) )
|
63
|
+
GL.ColorPointer(4, GL::UNSIGNED_BYTE, ImDrawVert.size, Fiddle::Pointer.new((cmd_list[:VtxBuffer][:Data] + vtx_buffer.offset_of(:col))) )
|
65
64
|
|
66
65
|
cmd_list[:CmdBuffer][:Size].times do |cmd_i|
|
67
66
|
pcmd = ImDrawCmd.new(cmd_list[:CmdBuffer][:Data] + ImDrawCmd.size * cmd_i) # const ImDrawCmd*
|
@@ -85,11 +84,11 @@ module ImGui
|
|
85
84
|
|
86
85
|
if (clip_rect[:x] < fb_width && clip_rect[:y] < fb_height && clip_rect[:z] >= 0.0 && clip_rect[:w] >= 0.0)
|
87
86
|
# Apply scissor/clipping rectangle
|
88
|
-
|
87
|
+
GL.Scissor(clip_rect[:x].to_i, (fb_height - clip_rect[:w]).to_i, (clip_rect[:z] - clip_rect[:x]).to_i, (clip_rect[:w] - clip_rect[:y]).to_i)
|
89
88
|
|
90
89
|
# Bind texture, Draw
|
91
|
-
|
92
|
-
|
90
|
+
GL.BindTexture(GL::TEXTURE_2D, pcmd[:TextureId].address)
|
91
|
+
GL.DrawElements(GL::TRIANGLES, pcmd[:ElemCount], GL::UNSIGNED_SHORT, Fiddle::Pointer.new(idx_buffer.address))
|
93
92
|
end
|
94
93
|
|
95
94
|
end
|
@@ -98,69 +97,69 @@ module ImGui
|
|
98
97
|
end
|
99
98
|
|
100
99
|
# Restore modified GL state
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
100
|
+
GL.DisableClientState(GL::COLOR_ARRAY)
|
101
|
+
GL.DisableClientState(GL::TEXTURE_COORD_ARRAY)
|
102
|
+
GL.DisableClientState(GL::VERTEX_ARRAY)
|
103
|
+
GL.BindTexture(GL::TEXTURE_2D, last_texture.unpack1('L'))
|
104
|
+
GL.MatrixMode(GL::MODELVIEW)
|
105
|
+
GL.PopMatrix()
|
106
|
+
GL.MatrixMode(GL::PROJECTION)
|
107
|
+
GL.PopMatrix()
|
108
|
+
GL.PopAttrib()
|
110
109
|
last_polygon_mode = last_polygon_mode.unpack('L2')
|
111
|
-
|
112
|
-
|
110
|
+
GL.PolygonMode(GL::FRONT, last_polygon_mode[0])
|
111
|
+
GL.PolygonMode(GL::BACK, last_polygon_mode[1])
|
113
112
|
last_viewport = last_viewport.unpack('L4')
|
114
|
-
|
113
|
+
GL.Viewport(last_viewport[0], last_viewport[1], last_viewport[2], last_viewport[3])
|
115
114
|
last_scissor_box = last_scissor_box.unpack('L4')
|
116
|
-
|
117
|
-
|
118
|
-
|
115
|
+
GL.Scissor(last_scissor_box[0], last_scissor_box[1], last_scissor_box[2], last_scissor_box[3])
|
116
|
+
GL.ShadeModel(last_shade_model.unpack1('L'))
|
117
|
+
GL.TexEnvi(GL::TEXTURE_ENV, GL::TEXTURE_ENV_MODE, last_tex_env_mode.unpack1('L'))
|
119
118
|
end
|
120
119
|
|
121
120
|
# private
|
122
121
|
|
123
122
|
def self.ImplOpenGL2_SetupRenderState(draw_data, fb_width, fb_height)
|
124
123
|
# Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, vertex/texcoord/color pointers, polygon fill.
|
125
|
-
|
126
|
-
|
127
|
-
#
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
124
|
+
GL.Enable(GL::BLEND)
|
125
|
+
GL.BlendFunc(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA)
|
126
|
+
# GL.BlendFuncSeparate(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA, GL::ONE, GL::ONE_MINUS_SRC_ALPHA) # In order to composite our output buffer we need to preserve alpha
|
127
|
+
GL.Disable(GL::CULL_FACE)
|
128
|
+
GL.Disable(GL::STENCIL_TEST)
|
129
|
+
GL.Disable(GL::DEPTH_TEST)
|
130
|
+
GL.Disable(GL::LIGHTING)
|
131
|
+
GL.Disable(GL::COLOR_MATERIAL)
|
132
|
+
GL.Enable(GL::SCISSOR_TEST)
|
133
|
+
GL.EnableClientState(GL::VERTEX_ARRAY)
|
134
|
+
GL.EnableClientState(GL::TEXTURE_COORD_ARRAY)
|
135
|
+
GL.EnableClientState(GL::COLOR_ARRAY)
|
136
|
+
GL.DisableClientState(GL::NORMAL_ARRAY)
|
137
|
+
GL.Enable(GL::TEXTURE_2D)
|
138
|
+
GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL)
|
139
|
+
GL.ShadeModel(GL::SMOOTH)
|
140
|
+
GL.TexEnvi(GL::TEXTURE_ENV, GL::TEXTURE_ENV_MODE, GL::MODULATE)
|
142
141
|
|
143
142
|
# If you are using this code with non-legacy OpenGL header/contexts (which you should not, prefer using imgui_impl_opengl3.cpp!!),
|
144
143
|
# you may need to backup/reset/restore other state, e.g. for current shader using the commented lines below.
|
145
144
|
# (DO NOT MODIFY THIS FILE! Add the code in your calling function)
|
146
145
|
# GLint last_program;
|
147
|
-
# glGetIntegerv(
|
146
|
+
# glGetIntegerv(GL::CURRENT_PROGRAM, &last_program);
|
148
147
|
# glUseProgram(0);
|
149
148
|
# ImGui_ImplOpenGL2_RenderDrawData(...);
|
150
149
|
# glUseProgram(last_program)
|
151
150
|
# There are potentially many more states you could need to clear/setup that we can't access from default headers.
|
152
|
-
# e.g. glBindBuffer(
|
151
|
+
# e.g. glBindBuffer(GL::ARRAY_BUFFER, 0), glDisable(GL::TEXTURE_CUBE_MAP).
|
153
152
|
|
154
153
|
# Setup viewport, orthographic projection matrix
|
155
154
|
# Our visible imgui space lies from draw_data->DisplayPos (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single viewport apps.
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
155
|
+
GL.Viewport(0, 0, fb_width, fb_height)
|
156
|
+
GL.MatrixMode(GL::PROJECTION)
|
157
|
+
GL.PushMatrix()
|
158
|
+
GL.LoadIdentity()
|
159
|
+
GL.Ortho(draw_data[:DisplayPos][:x], draw_data[:DisplayPos][:x] + draw_data[:DisplaySize][:x], draw_data[:DisplayPos][:y] + draw_data[:DisplaySize][:y], draw_data[:DisplayPos][:y], -1.0, +1.0)
|
160
|
+
GL.MatrixMode(GL::MODELVIEW)
|
161
|
+
GL.PushMatrix()
|
162
|
+
GL.LoadIdentity()
|
164
163
|
end
|
165
164
|
|
166
165
|
def self.ImplOpenGL2_CreateFontsTexture()
|
@@ -174,28 +173,28 @@ module ImGui
|
|
174
173
|
# Upload texture to graphics system
|
175
174
|
last_texture = ' ' * 4
|
176
175
|
@@g_FontTexture = ' ' * 4
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
176
|
+
GL.GetIntegerv(GL::TEXTURE_BINDING_2D, last_texture)
|
177
|
+
GL.GenTextures(1, @@g_FontTexture)
|
178
|
+
GL.BindTexture(GL::TEXTURE_2D, @@g_FontTexture.unpack1('L'))
|
179
|
+
GL.TexParameteri(GL::TEXTURE_2D, GL::TEXTURE_MIN_FILTER, GL::LINEAR)
|
180
|
+
GL.TexParameteri(GL::TEXTURE_2D, GL::TEXTURE_MAG_FILTER, GL::LINEAR)
|
181
|
+
GL.PixelStorei(GL::UNPACK_ROW_LENGTH, 0)
|
183
182
|
# Ruby/FFI <-> Fiddle pointer exchange
|
184
183
|
pixels_ptr = Fiddle::Pointer.new(pixels.read_pointer.address)
|
185
|
-
|
184
|
+
GL.TexImage2D(GL::TEXTURE_2D, 0, GL::RGBA, width.read_uint, height.read_uint, 0, GL::RGBA, GL::UNSIGNED_BYTE, pixels_ptr)
|
186
185
|
|
187
186
|
# Store our identifier
|
188
187
|
io[:Fonts][:TexID] = @@g_FontTexture.unpack1('L')
|
189
188
|
|
190
189
|
# Restore state
|
191
|
-
|
190
|
+
GL.BindTexture(GL::TEXTURE_2D, last_texture.unpack1('L'))
|
192
191
|
|
193
192
|
return true
|
194
193
|
end
|
195
194
|
|
196
195
|
def self.ImplOpenGL2_DestroyFontsTexture()
|
197
196
|
if @@g_FontTexture != 0
|
198
|
-
|
197
|
+
GL.DeleteTextures(1, @@g_FontTexture)
|
199
198
|
io = ImGuiIO.new(ImGui::GetIO())
|
200
199
|
io[:Fonts][:TexID] = 0
|
201
200
|
@@g_FontTexture = 0
|