imgui-bindings 0.1.16 → 1.0.0

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.
@@ -0,0 +1,254 @@
1
+ require 'ffi'
2
+ require 'sdl3'
3
+ require_relative 'imgui'
4
+
5
+ module ImGui
6
+
7
+ class ImGui_ImplSDLRenderer3_Data < FFI::Struct
8
+ layout(
9
+ :Renderer, :pointer
10
+ )
11
+ end
12
+
13
+ @@g_BackendRendererName = FFI::MemoryPointer.from_string('imgui_impl_sdlrenderer3')
14
+ @@g_BackendRendererUserData = {}
15
+
16
+ def self.ImGui_ImplSDLRenderer3_GetBackendData()
17
+ return nil if ImGui::GetCurrentContext() == nil
18
+
19
+ @@g_BackendRendererUserData[ImGui::GetCurrentContext().address]
20
+ end
21
+
22
+ def self.ImplSDL3Renderer_Init(renderer)
23
+ io = ImGuiIO.new(ImGui::GetIO())
24
+
25
+ backend_data = {
26
+ bd: ImGui_ImplSDLRenderer3_Data.new,
27
+ color_buffer: nil,
28
+ color_buffer_capacity: 0
29
+ }
30
+ backend_data[:bd][:Renderer] = renderer
31
+
32
+ @@g_BackendRendererUserData[ImGui::GetCurrentContext().address] = backend_data
33
+
34
+ io[:BackendRendererUserData] = backend_data[:bd]
35
+ io[:BackendRendererName] = @@g_BackendRendererName
36
+ io[:BackendFlags] |= ImGuiBackendFlags_RendererHasVtxOffset
37
+ io[:BackendFlags] |= ImGuiBackendFlags_RendererHasTextures
38
+
39
+ true
40
+ end
41
+
42
+ def self.ImplSDL3Renderer_Shutdown()
43
+ io = ImGuiIO.new(ImGui::GetIO())
44
+ platform_io = ImGuiPlatformIO.new(ImGui::GetPlatformIO())
45
+
46
+ ImplSDL3Renderer_DestroyDeviceObjects()
47
+
48
+ if ImGui::GetCurrentContext() != nil
49
+ @@g_BackendRendererUserData.delete(ImGui::GetCurrentContext().address)
50
+ end
51
+
52
+ io[:BackendRendererName] = nil
53
+ io[:BackendRendererUserData] = nil
54
+ io[:BackendFlags] &= ~(ImGuiBackendFlags_RendererHasVtxOffset | ImGuiBackendFlags_RendererHasTextures)
55
+ platform_io.ClearRendererHandlers()
56
+ end
57
+
58
+ def self.ImplSDL3Renderer_SetupRenderState(renderer)
59
+ SDL.SetRenderViewport(renderer, nil)
60
+ SDL.SetRenderClipRect(renderer, nil)
61
+ end
62
+
63
+ def self.ImplSDL3Renderer_NewFrame()
64
+ backend_data = ImGui_ImplSDLRenderer3_GetBackendData()
65
+ raise 'Context or backend not initialized! Did you call ImGui::ImplSDL3Renderer_Init()?' if backend_data == nil
66
+ end
67
+
68
+ def self.ImplSDL3Renderer_EnsureColorBuffer(backend_data, num_vertices)
69
+ if backend_data[:color_buffer] == nil || backend_data[:color_buffer_capacity] < num_vertices
70
+ backend_data[:color_buffer] = FFI::MemoryPointer.new(SDL::FColor, num_vertices)
71
+ backend_data[:color_buffer_capacity] = num_vertices
72
+ end
73
+ backend_data[:color_buffer]
74
+ end
75
+
76
+ def self.ImplSDL3Renderer_UpdateColorBuffer(backend_data, color_src, color_stride, num_vertices)
77
+ color_dst = ImplSDL3Renderer_EnsureColorBuffer(backend_data, num_vertices)
78
+ num_vertices.times do |i|
79
+ packed = (color_src + i * color_stride).read_uint
80
+ c = SDL::FColor.new(color_dst + i * SDL::FColor.size)
81
+ c[:r] = ((packed >> 0) & 0xff) / 255.0
82
+ c[:g] = ((packed >> 8) & 0xff) / 255.0
83
+ c[:b] = ((packed >> 16) & 0xff) / 255.0
84
+ c[:a] = ((packed >> 24) & 0xff) / 255.0
85
+ end
86
+ color_dst
87
+ end
88
+
89
+ def self.ImplSDL3Renderer_UpdateTexture(tex_raw)
90
+ backend_data = ImGui_ImplSDLRenderer3_GetBackendData()
91
+ return if backend_data == nil
92
+
93
+ tex = tex_raw.kind_of?(ImTextureData) ? tex_raw : ImTextureData.new(tex_raw)
94
+
95
+ case tex[:Status]
96
+ when ImTextureStatus_WantCreate
97
+ return if tex[:Format] != ImTextureFormat_RGBA32
98
+
99
+ sdl_texture = SDL.CreateTexture(backend_data[:bd][:Renderer], SDL::PIXELFORMAT_RGBA32, SDL::TEXTUREACCESS_STATIC, tex[:Width], tex[:Height])
100
+ if sdl_texture == nil
101
+ error = SDL.GetError()
102
+ puts "SDL_CreateTexture failed: #{error.read_string}"
103
+ end
104
+ raise 'Backend failed to create SDL texture!' if sdl_texture == nil
105
+
106
+ SDL.UpdateTexture(sdl_texture, nil, tex.GetPixels(), tex.GetPitch())
107
+ SDL.SetTextureBlendMode(sdl_texture, SDL::BLENDMODE_BLEND)
108
+ SDL.SetTextureScaleMode(sdl_texture, SDL::SCALEMODE_LINEAR)
109
+
110
+ tex.SetTexID(sdl_texture.address)
111
+ tex.SetStatus(ImTextureStatus_OK)
112
+
113
+ when ImTextureStatus_WantUpdates
114
+ sdl_texture = tex.GetTexID() == 0 ? nil : FFI::Pointer.new(tex.GetTexID())
115
+ return if sdl_texture == nil
116
+
117
+ updates = tex[:Updates]
118
+ updates[:Size].times do |i|
119
+ r = ImTextureRect.new(updates[:Data] + ImTextureRect.size * i)
120
+ sdl_rect = SDL::Rect.new
121
+ sdl_rect[:x] = r[:x]
122
+ sdl_rect[:y] = r[:y]
123
+ sdl_rect[:w] = r[:w]
124
+ sdl_rect[:h] = r[:h]
125
+ SDL.UpdateTexture(sdl_texture, sdl_rect, tex.GetPixelsAt(r[:x], r[:y]), tex.GetPitch())
126
+ end
127
+ tex.SetStatus(ImTextureStatus_OK)
128
+
129
+ when ImTextureStatus_WantDestroy
130
+ if tex.GetTexID() != 0
131
+ sdl_texture = FFI::Pointer.new(tex.GetTexID())
132
+ SDL.DestroyTexture(sdl_texture)
133
+ end
134
+ tex.SetTexID(0)
135
+ tex.SetStatus(ImTextureStatus_Destroyed)
136
+ end
137
+ end
138
+
139
+ def self.ImplSDL3Renderer_RenderDrawData(draw_data_raw, renderer = nil)
140
+ draw_data = draw_data_raw.kind_of?(ImDrawData) ? draw_data_raw : ImDrawData.new(draw_data_raw)
141
+ backend_data = ImGui_ImplSDLRenderer3_GetBackendData()
142
+ return if backend_data == nil
143
+
144
+ renderer = backend_data[:bd][:Renderer] if renderer == nil
145
+ return if renderer == nil
146
+
147
+ rsx = FFI::MemoryPointer.new(:float)
148
+ rsy = FFI::MemoryPointer.new(:float)
149
+ SDL.GetRenderScale(renderer, rsx, rsy)
150
+ render_scale = ImVec2.create(0, 0)
151
+ render_scale[:x] = (rsx.read_float == 1.0) ? draw_data[:FramebufferScale][:x] : 1.0
152
+ render_scale[:y] = (rsy.read_float == 1.0) ? draw_data[:FramebufferScale][:y] : 1.0
153
+
154
+ fb_width = (draw_data[:DisplaySize][:x] * render_scale[:x]).to_i
155
+ fb_height = (draw_data[:DisplaySize][:y] * render_scale[:y]).to_i
156
+ return if fb_width == 0 || fb_height == 0
157
+
158
+ if draw_data[:Textures] != nil && draw_data[:Textures].address != 0
159
+ textures = ImVector_ImTextureDataPtr.new(draw_data[:Textures])
160
+ textures[:Size].times do |i|
161
+ tex_ptr = (textures[:Data] + FFI.type_size(:pointer) * i).read_pointer
162
+ next if tex_ptr == nil || tex_ptr.address == 0
163
+ tex = ImTextureData.new(tex_ptr)
164
+ ImplSDL3Renderer_UpdateTexture(tex) if tex[:Status] != ImTextureStatus_OK
165
+ end
166
+ end
167
+
168
+ old_viewport_enabled = SDL.RenderViewportSet(renderer)
169
+ old_clip_enabled = SDL.RenderClipEnabled(renderer)
170
+ old_viewport = SDL::Rect.new
171
+ old_clip_rect = SDL::Rect.new
172
+ SDL.GetRenderViewport(renderer, old_viewport)
173
+ SDL.GetRenderClipRect(renderer, old_clip_rect)
174
+
175
+ ImplSDL3Renderer_SetupRenderState(renderer)
176
+
177
+ platform_io = ImGuiPlatformIO.new(ImGui::GetPlatformIO())
178
+ platform_io[:Renderer_RenderState] = nil
179
+
180
+ clip_off = draw_data[:DisplayPos]
181
+ clip_scale = render_scale
182
+
183
+ draw_data[:CmdListsCount].times do |n|
184
+ cmd_list = ImDrawList.new((draw_data[:CmdLists][:Data] + FFI.type_size(:pointer) * n).read_pointer)
185
+ vtx_buffer = cmd_list[:VtxBuffer][:Data]
186
+ idx_buffer = cmd_list[:IdxBuffer][:Data]
187
+
188
+ cmd_list[:CmdBuffer][:Size].times do |cmd_i|
189
+ pcmd = ImDrawCmd.new(cmd_list[:CmdBuffer][:Data] + ImDrawCmd.size * cmd_i)
190
+ if pcmd[:UserCallback] != nil && pcmd[:UserCallback].address != 0
191
+ ImplSDL3Renderer_SetupRenderState(renderer)
192
+ next
193
+ end
194
+
195
+ clip_min = ImVec2.create((pcmd[:ClipRect][:x] - clip_off[:x]) * clip_scale[:x], (pcmd[:ClipRect][:y] - clip_off[:y]) * clip_scale[:y])
196
+ clip_max = ImVec2.create((pcmd[:ClipRect][:z] - clip_off[:x]) * clip_scale[:x], (pcmd[:ClipRect][:w] - clip_off[:y]) * clip_scale[:y])
197
+
198
+ clip_min[:x] = 0.0 if clip_min[:x] < 0.0
199
+ clip_min[:y] = 0.0 if clip_min[:y] < 0.0
200
+ clip_max[:x] = fb_width.to_f if clip_max[:x] > fb_width
201
+ clip_max[:y] = fb_height.to_f if clip_max[:y] > fb_height
202
+ next if clip_max[:x] <= clip_min[:x] || clip_max[:y] <= clip_min[:y]
203
+
204
+ sdl_rect = SDL::Rect.new
205
+ sdl_rect[:x] = clip_min[:x].to_i
206
+ sdl_rect[:y] = clip_min[:y].to_i
207
+ sdl_rect[:w] = (clip_max[:x] - clip_min[:x]).to_i
208
+ sdl_rect[:h] = (clip_max[:y] - clip_min[:y]).to_i
209
+ SDL.SetRenderClipRect(renderer, sdl_rect)
210
+
211
+ vtx_base = pcmd[:VtxOffset] * ImDrawVert.size
212
+ xy = vtx_buffer + vtx_base + ImDrawVert.offset_of(:pos)
213
+ uv = vtx_buffer + vtx_base + ImDrawVert.offset_of(:uv)
214
+ color_src = vtx_buffer + vtx_base + ImDrawVert.offset_of(:col)
215
+
216
+ num_vertices = cmd_list[:VtxBuffer][:Size] - pcmd[:VtxOffset]
217
+ color_f = ImplSDL3Renderer_UpdateColorBuffer(backend_data, color_src, ImDrawVert.size, num_vertices)
218
+
219
+ tex_id = pcmd.GetTexID()
220
+ tex_ptr = tex_id == 0 ? nil : FFI::Pointer.new(tex_id)
221
+
222
+ SDL.RenderGeometryRaw(renderer, tex_ptr,
223
+ xy, ImDrawVert.size,
224
+ color_f, SDL::FColor.size,
225
+ uv, ImDrawVert.size,
226
+ num_vertices,
227
+ idx_buffer + FFI.type_size(:ImDrawIdx) * pcmd[:IdxOffset], pcmd[:ElemCount], FFI.type_size(:ImDrawIdx))
228
+ end
229
+ end
230
+
231
+ platform_io[:Renderer_RenderState] = nil
232
+
233
+ SDL.SetRenderViewport(renderer, old_viewport_enabled ? old_viewport : nil)
234
+ SDL.SetRenderClipRect(renderer, old_clip_enabled ? old_clip_rect : nil)
235
+ end
236
+
237
+ def self.ImplSDL3Renderer_CreateDeviceObjects()
238
+ end
239
+
240
+ def self.ImplSDL3Renderer_DestroyDeviceObjects()
241
+ platform_io = ImGuiPlatformIO.new(ImGui::GetPlatformIO())
242
+ textures = platform_io[:Textures]
243
+ textures[:Size].times do |i|
244
+ tex_ptr = (textures[:Data] + FFI.type_size(:pointer) * i).read_pointer
245
+ next if tex_ptr == nil || tex_ptr.address == 0
246
+ tex = ImTextureData.new(tex_ptr)
247
+ if tex[:RefCount] == 1
248
+ tex.SetStatus(ImTextureStatus_WantDestroy)
249
+ ImplSDL3Renderer_UpdateTexture(tex)
250
+ end
251
+ end
252
+ end
253
+
254
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imgui-bindings
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.16
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - vaiorabbit
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-01-01 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ffi
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '1.16'
18
+ version: '1.17'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '1.16'
25
+ version: '1.17'
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: opengl-bindings2
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '2'
40
+ - !ruby/object:Gem::Dependency
41
+ name: sdl3-bindings
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1'
40
54
  description: 'Ruby bindings for Dear ImGui ( https://github.com/ocornut/imgui ).
41
55
 
42
56
  '
@@ -52,22 +66,20 @@ files:
52
66
  - lib/imgui.aarch64.so
53
67
  - lib/imgui.arm64.dylib
54
68
  - lib/imgui.dll
69
+ - lib/imgui.dll.release
70
+ - lib/imgui.pdb
55
71
  - lib/imgui.rb
72
+ - lib/imgui.rb.cimgui
56
73
  - lib/imgui.x86_64.dylib
57
74
  - lib/imgui.x86_64.so
58
- - lib/imgui_impl_glfw.rb
59
- - lib/imgui_impl_opengl2.rb
75
+ - lib/imgui_impl_docking_opengl3.rb
76
+ - lib/imgui_impl_docking_raylib.rb
77
+ - lib/imgui_impl_docking_sdl3.rb
78
+ - lib/imgui_impl_docking_sdl3renderer.rb
60
79
  - lib/imgui_impl_opengl3.rb
61
80
  - lib/imgui_impl_raylib.rb
62
- - lib/imgui_impl_sdl2.rb
63
- - lib/imgui_impl_sdlrenderer.rb
64
- - lib/imgui_internal.rb
65
- - lib/imnodes.aarch64.so
66
- - lib/imnodes.arm64.dylib
67
- - lib/imnodes.dll
68
- - lib/imnodes.rb
69
- - lib/imnodes.x86_64.dylib
70
- - lib/imnodes.x86_64.so
81
+ - lib/imgui_impl_sdl3.rb
82
+ - lib/imgui_impl_sdl3renderer.rb
71
83
  homepage: https://github.com/vaiorabbit/ruby-imgui
72
84
  licenses:
73
85
  - Zlib
@@ -79,14 +91,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
79
91
  requirements:
80
92
  - - ">="
81
93
  - !ruby/object:Gem::Version
82
- version: 3.0.0
94
+ version: 4.0.0
83
95
  required_rubygems_version: !ruby/object:Gem::Requirement
84
96
  requirements:
85
97
  - - ">="
86
98
  - !ruby/object:Gem::Version
87
99
  version: '0'
88
100
  requirements: []
89
- rubygems_version: 3.6.2
101
+ rubygems_version: 4.0.6
90
102
  specification_version: 4
91
103
  summary: Bindings for Dear ImGui
92
104
  test_files: []