imgui-bindings 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,201 +1,201 @@
1
- require 'ffi'
2
- require 'sdl2'
3
- require_relative 'imgui'
4
-
5
- module ImGui
6
-
7
- class ImGui_ImplSDLRenderer_Data < FFI::Struct
8
- layout(
9
- :SDLRenderer, :pointer,
10
- :FontTexture, :pointer
11
- )
12
- end
13
-
14
- def self.ImGui_ImplSDLRenderer_GetBackendData()
15
- if ImGui::GetCurrentContext() != nil
16
- io = ImGuiIO.new(ImGui::GetIO())
17
- instance = ImGui_ImplSDLRenderer_Data.new(io[:BackendRendererUserData])
18
- return instance
19
- else
20
- return nil
21
- end
22
- end
23
-
24
- @@g_BackendRendererName = FFI::MemoryPointer.from_string("imgui_impl_sdlrenderer")
25
- @@g_BackendRendererUserData = nil
26
-
27
- def self.ImplSDLRenderer_Init(renderer)
28
- io = ImGuiIO.new(ImGui::GetIO())
29
-
30
- # Setup backend capabilities flags
31
-
32
- io[:BackendRendererName] = @@g_BackendRendererName
33
-
34
- @@g_BackendRendererUserData = ImGui_ImplSDLRenderer_Data.new
35
- @@g_BackendRendererUserData[:SDLRenderer] = renderer
36
- @@g_BackendRendererUserData[:FontTexture] = nil
37
- io[:BackendRendererUserData] = @@g_BackendRendererUserData
38
-
39
- io[:BackendFlags] |= ImGuiBackendFlags_RendererHasVtxOffset # We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
40
-
41
- return true
42
- end
43
-
44
- def self.ImplSDLRenderer_Shutdown()
45
- ImplSDLRenderer_DestroyDeviceObjects()
46
- io = ImGuiIO.new(ImGui::GetIO())
47
- io[:BackendRendererName] = nil
48
- io[:BackendRendererUserData] = nil
49
- @@g_BackendRendererUserData = nil
50
- end
51
-
52
- # [Internal]
53
- def self.ImplSDLRenderer_SetupRenderState()
54
- bd = ImGui_ImplSDLRenderer_GetBackendData()
55
-
56
- # Clear out any viewports and cliprect set by the user
57
- # FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process.
58
- SDL_RenderSetViewport(bd[:SDLRenderer], nil)
59
- SDL_RenderSetClipRect(bd[:SDLRenderer], nil)
60
- end
61
-
62
- def self.ImplSDLRenderer_NewFrame()
63
- io = ImGuiIO.new(ImGui::GetIO())
64
- bd = ImGui_ImplSDLRenderer_GetBackendData()
65
- ImGui::ImplSDLRenderer_CreateDeviceObjects() if bd[:FontTexture] == nil
66
- end
67
-
68
- def self.ImplSDLRenderer_RenderDrawData(draw_data_raw)
69
- draw_data = ImDrawData.new(draw_data_raw)
70
- bd = ImGui_ImplSDLRenderer_GetBackendData()
71
-
72
- # If there's a scale factor set by the user, use that instead
73
- # If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass
74
- # to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here.
75
- rsx = FFI::MemoryPointer.new :float
76
- rsy = FFI::MemoryPointer.new :float
77
- SDL_RenderGetScale(bd[:SDLRenderer], rsx, rsy)
78
- render_scale = ImVec2.create(0, 0)
79
- render_scale[:x] = (rsx.read_float() == 1.0) ? draw_data[:FramebufferScale][:x] : 1.0
80
- render_scale[:y] = (rsy.read_float() == 1.0) ? draw_data[:FramebufferScale][:y] : 1.0
81
-
82
- # Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
83
- fb_width = (draw_data[:DisplaySize][:x] * render_scale[:x]).to_i
84
- fb_height = (draw_data[:DisplaySize][:y] * render_scale[:y]).to_i
85
- return if fb_width == 0 || fb_height == 0
86
-
87
- # Backup SDL_Renderer state that will be modified to restore it afterwards
88
- oldViewport = SDL_Rect.new
89
- oldClipEnabled = FFI::MemoryPointer.new :bool
90
- oldClipRect = SDL_Rect.new
91
-
92
- oldClipEnabled = (SDL_RenderIsClipEnabled(bd[:SDLRenderer]) == SDL_TRUE)
93
- SDL_RenderGetViewport(bd[:SDLRenderer], oldViewport)
94
- SDL_RenderGetClipRect(bd[:SDLRenderer], oldClipRect)
95
-
96
- # Will project scissor/clipping rectangles into framebuffer space
97
- clip_off = draw_data[:DisplayPos] # (0,0) unless using multi-viewports
98
- clip_scale = render_scale
99
-
100
- # Render command lists
101
- ImplSDLRenderer_SetupRenderState()
102
- draw_data[:CmdListsCount].times do |n|
103
- cmd_list = ImDrawList.new((draw_data[:CmdLists].pointer + FFI.type_size(:pointer) * n).read_pointer)
104
- vtx_buffer = cmd_list[:VtxBuffer][:Data] # const ImDrawVert*
105
- idx_buffer = cmd_list[:IdxBuffer][:Data] # const ImDrawIdx*
106
-
107
- cmd_list[:CmdBuffer][:Size].times do |cmd_i|
108
- pcmd = ImDrawCmd.new(cmd_list[:CmdBuffer][:Data] + ImDrawCmd.size * cmd_i) # const ImDrawCmd*
109
- if pcmd[:UserCallback] != nil
110
- # [TODO] Handle user callback (Ref.: https://github.com/ffi/ffi/wiki/Callbacks )
111
-
112
- # User callback, registered via ImDrawList::AddCallback()
113
- # (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
114
- # if pcmd[:UserCallback] == :ImDrawCallback_ResetRenderState
115
- ImGui_ImplSDLRenderer_SetupRenderState()
116
- # else
117
- # pcmd[:UserCallback](cmd_list, pcmd)
118
- # end
119
- else
120
- clip_min = ImVec2.create((pcmd[:ClipRect][:x] - clip_off[:x]) * clip_scale[:x], (pcmd[:ClipRect][:y] - clip_off[:y]) * clip_scale[:y])
121
- clip_max = ImVec2.create((pcmd[:ClipRect][:z] - clip_off[:x]) * clip_scale[:x], (pcmd[:ClipRect][:w] - clip_off[:y]) * clip_scale[:y])
122
-
123
- clip_min[:x] = 0.0 if clip_min[:x] < 0.0
124
- clip_min[:y] = 0.0 if clip_min[:y] < 0.0
125
- clip_max[:x] = fb_width.to_f if clip_max[:x] > fb_width
126
- clip_max[:y] = fb_height.to_f if clip_max[:y] > fb_height
127
- next if (clip_max[:x] <= clip_min[:x] || clip_max[:y] <= clip_min[:y])
128
-
129
- r = SDL_Rect.new
130
- r[:x] = clip_min[:x].to_i
131
- r[:y] = clip_min[:y].to_i
132
- r[:w] = (clip_max[:x] - clip_min[:x]).to_i
133
- r[:h] = (clip_max[:y] - clip_min[:y]).to_i
134
-
135
- SDL_RenderSetClipRect(bd[:SDLRenderer], r.to_ptr)
136
-
137
- xy = vtx_buffer + (pcmd[:VtxOffset] + ImDrawVert.offset_of(:pos))
138
- uv = vtx_buffer + (pcmd[:VtxOffset] + ImDrawVert.offset_of(:uv))
139
- color = vtx_buffer + (pcmd[:VtxOffset] + ImDrawVert.offset_of(:col))
140
-
141
- SDL_RenderGeometryRaw(bd[:SDLRenderer], pcmd[:TextureId],
142
- xy, ImDrawVert.size,
143
- color, ImDrawVert.size,
144
- uv, ImDrawVert.size,
145
- cmd_list[:VtxBuffer][:Size] - pcmd[:VtxOffset],
146
- idx_buffer + FFI.type_size(:ImDrawIdx) * pcmd[:IdxOffset], pcmd[:ElemCount], FFI.type_size(:ImDrawIdx)) # FFI.type_size(:ImDrawIdx) == FFI::Type::UINT16.size
147
-
148
- # Restore modified SDL_Renderer state
149
- SDL_RenderSetViewport(bd[:SDLRenderer], oldViewport)
150
- SDL_RenderSetClipRect(bd[:SDLRenderer], oldClipEnabled ? oldClipRect : nil)
151
- end
152
- end
153
- end
154
- end
155
-
156
- # Called by Init/NewFrame/Shutdown
157
- def self.ImplSDLRenderer_CreateFontsTexture()
158
- io = ImGuiIO.new(ImGui::GetIO())
159
- bd = ImGui_ImplSDLRenderer_GetBackendData()
160
-
161
- # Build texture atlas
162
- pixels = FFI::MemoryPointer.new :pointer
163
- width = FFI::MemoryPointer.new :int
164
- height = FFI::MemoryPointer.new :int
165
- io[:Fonts].GetTexDataAsRGBA32(pixels, width, height, nil) # Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
166
-
167
- # Upload texture to graphics system
168
- bd[:FontTexture] = SDL_CreateTexture(bd[:SDLRenderer], SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STATIC, width.read_int, height.read_int)
169
- if bd[:FontTexture] == nil
170
- SDL_Log("error creating texture")
171
- return false
172
- end
173
-
174
- SDL_UpdateTexture(bd[:FontTexture], nil, pixels.read_pointer, 4 * width.read_int)
175
- SDL_SetTextureBlendMode(bd[:FontTexture], SDL_BLENDMODE_BLEND)
176
-
177
- # Store our identifier
178
- io[:Fonts].SetTexID(bd[:FontTexture])
179
-
180
- return true
181
- end
182
-
183
- def self.ImplSDLRenderer_DestroyFontsTexture()
184
- io = ImGuiIO.new(ImGui::GetIO())
185
- bd = ImGui_ImplSDLRenderer_GetBackendData()
186
- if bd[:FontTexture] != nil
187
- io[:Fonts].SetTexID(nil)
188
- SDL_DestroyTexture(bd[:FontTexture])
189
- bd[:FontTexture] = nil
190
- end
191
- end
192
-
193
- def self.ImplSDLRenderer_CreateDeviceObjects()
194
- return ImGui::ImplSDLRenderer_CreateFontsTexture()
195
- end
196
-
197
- def self.ImplSDLRenderer_DestroyDeviceObjects()
198
- ImGui::ImplSDLRenderer_DestroyFontsTexture()
199
- end
200
-
201
- end
1
+ require 'ffi'
2
+ require 'sdl2'
3
+ require_relative 'imgui'
4
+
5
+ module ImGui
6
+
7
+ class ImGui_ImplSDLRenderer_Data < FFI::Struct
8
+ layout(
9
+ :SDLRenderer, :pointer,
10
+ :FontTexture, :pointer
11
+ )
12
+ end
13
+
14
+ def self.ImGui_ImplSDLRenderer_GetBackendData()
15
+ if ImGui::GetCurrentContext() != nil
16
+ io = ImGuiIO.new(ImGui::GetIO())
17
+ instance = ImGui_ImplSDLRenderer_Data.new(io[:BackendRendererUserData])
18
+ return instance
19
+ else
20
+ return nil
21
+ end
22
+ end
23
+
24
+ @@g_BackendRendererName = FFI::MemoryPointer.from_string("imgui_impl_sdlrenderer")
25
+ @@g_BackendRendererUserData = nil
26
+
27
+ def self.ImplSDLRenderer_Init(renderer)
28
+ io = ImGuiIO.new(ImGui::GetIO())
29
+
30
+ # Setup backend capabilities flags
31
+
32
+ io[:BackendRendererName] = @@g_BackendRendererName
33
+
34
+ @@g_BackendRendererUserData = ImGui_ImplSDLRenderer_Data.new
35
+ @@g_BackendRendererUserData[:SDLRenderer] = renderer
36
+ @@g_BackendRendererUserData[:FontTexture] = nil
37
+ io[:BackendRendererUserData] = @@g_BackendRendererUserData
38
+
39
+ io[:BackendFlags] |= ImGuiBackendFlags_RendererHasVtxOffset # We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes.
40
+
41
+ return true
42
+ end
43
+
44
+ def self.ImplSDLRenderer_Shutdown()
45
+ ImplSDLRenderer_DestroyDeviceObjects()
46
+ io = ImGuiIO.new(ImGui::GetIO())
47
+ io[:BackendRendererName] = nil
48
+ io[:BackendRendererUserData] = nil
49
+ @@g_BackendRendererUserData = nil
50
+ end
51
+
52
+ # [Internal]
53
+ def self.ImplSDLRenderer_SetupRenderState()
54
+ bd = ImGui_ImplSDLRenderer_GetBackendData()
55
+
56
+ # Clear out any viewports and cliprect set by the user
57
+ # FIXME: Technically speaking there are lots of other things we could backup/setup/restore during our render process.
58
+ SDL.RenderSetViewport(bd[:SDLRenderer], nil)
59
+ SDL.RenderSetClipRect(bd[:SDLRenderer], nil)
60
+ end
61
+
62
+ def self.ImplSDLRenderer_NewFrame()
63
+ io = ImGuiIO.new(ImGui::GetIO())
64
+ bd = ImGui_ImplSDLRenderer_GetBackendData()
65
+ ImGui::ImplSDLRenderer_CreateDeviceObjects() if bd[:FontTexture] == nil
66
+ end
67
+
68
+ def self.ImplSDLRenderer_RenderDrawData(draw_data_raw)
69
+ draw_data = ImDrawData.new(draw_data_raw)
70
+ bd = ImGui_ImplSDLRenderer_GetBackendData()
71
+
72
+ # If there's a scale factor set by the user, use that instead
73
+ # If the user has specified a scale factor to SDL_Renderer already via SDL_RenderSetScale(), SDL will scale whatever we pass
74
+ # to SDL_RenderGeometryRaw() by that scale factor. In that case we don't want to be also scaling it ourselves here.
75
+ rsx = FFI::MemoryPointer.new :float
76
+ rsy = FFI::MemoryPointer.new :float
77
+ SDL.RenderGetScale(bd[:SDLRenderer], rsx, rsy)
78
+ render_scale = ImVec2.create(0, 0)
79
+ render_scale[:x] = (rsx.read_float() == 1.0) ? draw_data[:FramebufferScale][:x] : 1.0
80
+ render_scale[:y] = (rsy.read_float() == 1.0) ? draw_data[:FramebufferScale][:y] : 1.0
81
+
82
+ # Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
83
+ fb_width = (draw_data[:DisplaySize][:x] * render_scale[:x]).to_i
84
+ fb_height = (draw_data[:DisplaySize][:y] * render_scale[:y]).to_i
85
+ return if fb_width == 0 || fb_height == 0
86
+
87
+ # Backup SDL_Renderer state that will be modified to restore it afterwards
88
+ oldViewport = SDL::Rect.new
89
+ oldClipEnabled = FFI::MemoryPointer.new :bool
90
+ oldClipRect = SDL::Rect.new
91
+
92
+ oldClipEnabled = (SDL.RenderIsClipEnabled(bd[:SDLRenderer]) == SDL::TRUE)
93
+ SDL.RenderGetViewport(bd[:SDLRenderer], oldViewport)
94
+ SDL.RenderGetClipRect(bd[:SDLRenderer], oldClipRect)
95
+
96
+ # Will project scissor/clipping rectangles into framebuffer space
97
+ clip_off = draw_data[:DisplayPos] # (0,0) unless using multi-viewports
98
+ clip_scale = render_scale
99
+
100
+ # Render command lists
101
+ ImplSDLRenderer_SetupRenderState()
102
+ draw_data[:CmdListsCount].times do |n|
103
+ cmd_list = ImDrawList.new((draw_data[:CmdLists].pointer + FFI.type_size(:pointer) * n).read_pointer)
104
+ vtx_buffer = cmd_list[:VtxBuffer][:Data] # const ImDrawVert*
105
+ idx_buffer = cmd_list[:IdxBuffer][:Data] # const ImDrawIdx*
106
+
107
+ cmd_list[:CmdBuffer][:Size].times do |cmd_i|
108
+ pcmd = ImDrawCmd.new(cmd_list[:CmdBuffer][:Data] + ImDrawCmd.size * cmd_i) # const ImDrawCmd*
109
+ if pcmd[:UserCallback] != nil
110
+ # [TODO] Handle user callback (Ref.: https://github.com/ffi/ffi/wiki/Callbacks )
111
+
112
+ # User callback, registered via ImDrawList::AddCallback()
113
+ # (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
114
+ # if pcmd[:UserCallback] == :ImDrawCallback_ResetRenderState
115
+ ImGui_ImplSDLRenderer_SetupRenderState()
116
+ # else
117
+ # pcmd[:UserCallback](cmd_list, pcmd)
118
+ # end
119
+ else
120
+ clip_min = ImVec2.create((pcmd[:ClipRect][:x] - clip_off[:x]) * clip_scale[:x], (pcmd[:ClipRect][:y] - clip_off[:y]) * clip_scale[:y])
121
+ clip_max = ImVec2.create((pcmd[:ClipRect][:z] - clip_off[:x]) * clip_scale[:x], (pcmd[:ClipRect][:w] - clip_off[:y]) * clip_scale[:y])
122
+
123
+ clip_min[:x] = 0.0 if clip_min[:x] < 0.0
124
+ clip_min[:y] = 0.0 if clip_min[:y] < 0.0
125
+ clip_max[:x] = fb_width.to_f if clip_max[:x] > fb_width
126
+ clip_max[:y] = fb_height.to_f if clip_max[:y] > fb_height
127
+ next if (clip_max[:x] <= clip_min[:x] || clip_max[:y] <= clip_min[:y])
128
+
129
+ r = SDL::Rect.new
130
+ r[:x] = clip_min[:x].to_i
131
+ r[:y] = clip_min[:y].to_i
132
+ r[:w] = (clip_max[:x] - clip_min[:x]).to_i
133
+ r[:h] = (clip_max[:y] - clip_min[:y]).to_i
134
+
135
+ SDL.RenderSetClipRect(bd[:SDLRenderer], r.to_ptr)
136
+
137
+ xy = vtx_buffer + (pcmd[:VtxOffset] + ImDrawVert.offset_of(:pos))
138
+ uv = vtx_buffer + (pcmd[:VtxOffset] + ImDrawVert.offset_of(:uv))
139
+ color = vtx_buffer + (pcmd[:VtxOffset] + ImDrawVert.offset_of(:col))
140
+
141
+ SDL.RenderGeometryRaw(bd[:SDLRenderer], pcmd[:TextureId],
142
+ xy, ImDrawVert.size,
143
+ color, ImDrawVert.size,
144
+ uv, ImDrawVert.size,
145
+ cmd_list[:VtxBuffer][:Size] - pcmd[:VtxOffset],
146
+ idx_buffer + FFI.type_size(:ImDrawIdx) * pcmd[:IdxOffset], pcmd[:ElemCount], FFI.type_size(:ImDrawIdx)) # FFI.type_size(:ImDrawIdx) == FFI::Type::UINT16.size
147
+
148
+ # Restore modified SDL_Renderer state
149
+ SDL.RenderSetViewport(bd[:SDLRenderer], oldViewport)
150
+ SDL.RenderSetClipRect(bd[:SDLRenderer], oldClipEnabled ? oldClipRect : nil)
151
+ end
152
+ end
153
+ end
154
+ end
155
+
156
+ # Called by Init/NewFrame/Shutdown
157
+ def self.ImplSDLRenderer_CreateFontsTexture()
158
+ io = ImGuiIO.new(ImGui::GetIO())
159
+ bd = ImGui_ImplSDLRenderer_GetBackendData()
160
+
161
+ # Build texture atlas
162
+ pixels = FFI::MemoryPointer.new :pointer
163
+ width = FFI::MemoryPointer.new :int
164
+ height = FFI::MemoryPointer.new :int
165
+ io[:Fonts].GetTexDataAsRGBA32(pixels, width, height, nil) # Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
166
+
167
+ # Upload texture to graphics system
168
+ bd[:FontTexture] = SDL.CreateTexture(bd[:SDLRenderer], SDL::PIXELFORMAT_ABGR8888, SDL::TEXTUREACCESS_STATIC, width.read_int, height.read_int)
169
+ if bd[:FontTexture] == nil
170
+ SDL.Log("error creating texture")
171
+ return false
172
+ end
173
+
174
+ SDL.UpdateTexture(bd[:FontTexture], nil, pixels.read_pointer, 4 * width.read_int)
175
+ SDL.SetTextureBlendMode(bd[:FontTexture], SDL::BLENDMODE_BLEND)
176
+
177
+ # Store our identifier
178
+ io[:Fonts].SetTexID(bd[:FontTexture])
179
+
180
+ return true
181
+ end
182
+
183
+ def self.ImplSDLRenderer_DestroyFontsTexture()
184
+ io = ImGuiIO.new(ImGui::GetIO())
185
+ bd = ImGui_ImplSDLRenderer_GetBackendData()
186
+ if bd[:FontTexture] != nil
187
+ io[:Fonts].SetTexID(nil)
188
+ SDL.DestroyTexture(bd[:FontTexture])
189
+ bd[:FontTexture] = nil
190
+ end
191
+ end
192
+
193
+ def self.ImplSDLRenderer_CreateDeviceObjects()
194
+ return ImGui::ImplSDLRenderer_CreateFontsTexture()
195
+ end
196
+
197
+ def self.ImplSDLRenderer_DestroyDeviceObjects()
198
+ ImGui::ImplSDLRenderer_DestroyFontsTexture()
199
+ end
200
+
201
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imgui-bindings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - vaiorabbit
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-09 00:00:00.000000000 Z
11
+ date: 2022-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi