imgui-bindings 0.0.2 → 0.0.3

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.
@@ -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