imgui-bindings 0.1.10-arm64-darwin
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 +7 -0
- data/ChangeLog +361 -0
- data/LICENSE.txt +21 -0
- data/README.md +119 -0
- data/lib/imgui.arm64.dylib +0 -0
- data/lib/imgui.rb +5817 -0
- data/lib/imgui_impl_glfw.rb +511 -0
- data/lib/imgui_impl_opengl2.rb +212 -0
- data/lib/imgui_impl_opengl3.rb +509 -0
- data/lib/imgui_impl_raylib.rb +454 -0
- data/lib/imgui_impl_sdl2.rb +409 -0
- data/lib/imgui_impl_sdlrenderer.rb +200 -0
- data/lib/imgui_internal.rb +49 -0
- data/lib/imnodes.arm64.dylib +0 -0
- data/lib/imnodes.rb +161 -0
- metadata +87 -0
| @@ -0,0 +1,509 @@ | |
| 1 | 
            +
            require 'ffi'
         | 
| 2 | 
            +
            require 'opengl'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require_relative 'imgui'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module ImGui
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              @@g_GlVersion = 0 # Extracted at runtime using GL::MAJOR_VERSION, GL::MINOR_VERSION queries.
         | 
| 9 | 
            +
              @@g_GlslVersionString = "" # Specified by user or detected based on compile time
         | 
| 10 | 
            +
              @@g_FontTexture = nil
         | 
| 11 | 
            +
             | 
| 12 | 
            +
              @@g_ShaderHandle = 0
         | 
| 13 | 
            +
             | 
| 14 | 
            +
              @@g_AttribLocationTex = 0
         | 
| 15 | 
            +
              @@g_AttribLocationProjMtx = 0
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              @@g_AttribLocationVtxPos = 0
         | 
| 18 | 
            +
              @@g_AttribLocationVtxUV = 0
         | 
| 19 | 
            +
              @@g_AttribLocationVtxColor = 0
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              @@g_VboHandle = 0
         | 
| 22 | 
            +
              @@g_ElementsHandle = 0
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              @@g_BackendRendererName = FFI::MemoryPointer.from_string("imgui_impl_opengl3")
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def self.PrintShaderCompileStatus(handle)
         | 
| 27 | 
            +
                rvalue = ' ' * 4
         | 
| 28 | 
            +
                GL.GetShaderiv(handle, GL::COMPILE_STATUS, rvalue)
         | 
| 29 | 
            +
                rvalue = rvalue.unpack1('L')
         | 
| 30 | 
            +
                if rvalue == GL::FALSE
         | 
| 31 | 
            +
                  $stderr.puts "Error in compiling shader"
         | 
| 32 | 
            +
                  log_length = ' ' * 4
         | 
| 33 | 
            +
                  GL.GetShaderiv(handle, GL::INFO_LOG_LENGTH, log_length)
         | 
| 34 | 
            +
                  log_length = log_length.unpack1('L')
         | 
| 35 | 
            +
                  if log_length > 0
         | 
| 36 | 
            +
                    buf = ' ' * log_length
         | 
| 37 | 
            +
                    GL.GetShaderInfoLog(handle, log_length, nil, buf)
         | 
| 38 | 
            +
                    $stderr.puts(buf)
         | 
| 39 | 
            +
                    exit()
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
              end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              def self.PrintProgramLinkStatus(handle)
         | 
| 45 | 
            +
                rvalue = ' ' * 4
         | 
| 46 | 
            +
                GL.GetProgramiv(handle, GL::LINK_STATUS, rvalue)
         | 
| 47 | 
            +
                rvalue = rvalue.unpack1('L')
         | 
| 48 | 
            +
                if rvalue == GL::FALSE
         | 
| 49 | 
            +
                  $stderr.puts "Error in linking program"
         | 
| 50 | 
            +
                  log_length = ' ' * 4
         | 
| 51 | 
            +
                  GL.GetProgramiv(handle, GL::INFO_LOG_LENGTH, log_length)
         | 
| 52 | 
            +
                  log_length = log_length.unpack1('L')
         | 
| 53 | 
            +
                  if log_length > 0
         | 
| 54 | 
            +
                    buf = ' ' * log_length
         | 
| 55 | 
            +
                    GL.GetProgramInfoLog(handle, log_length, nil, buf)
         | 
| 56 | 
            +
                    $stderr.puts(buf)
         | 
| 57 | 
            +
                    exit()
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
                end
         | 
| 60 | 
            +
              end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
              def self.ImplOpenGL3_Init(glsl_version = nil)
         | 
| 63 | 
            +
                major, minor = ' ' * 4, ' ' * 4
         | 
| 64 | 
            +
                GL.GetIntegerv(GL::MAJOR_VERSION, major)
         | 
| 65 | 
            +
                GL.GetIntegerv(GL::MINOR_VERSION, minor)
         | 
| 66 | 
            +
                major = major.unpack1('L')
         | 
| 67 | 
            +
                minor = minor.unpack1('L')
         | 
| 68 | 
            +
                @@g_GlVersion = major * 1000 + minor
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                io = ImGuiIO.new(ImGui::GetIO())
         | 
| 71 | 
            +
                io[:BackendRendererName] = @@g_BackendRendererName
         | 
| 72 | 
            +
                io[:BackendFlags] |= ImGuiBackendFlags_RendererHasVtxOffset if @@g_GlVersion >= 3200
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                # Ref.: Fix imgui_impl_opengl3 on MacOS
         | 
| 75 | 
            +
                #       https://github.com/ocornut/imgui/pull/3199
         | 
| 76 | 
            +
                if GL.get_platform() == :OPENGL_PLATFORM_MACOSX
         | 
| 77 | 
            +
                  glsl_version = "#version 150" if glsl_version == nil
         | 
| 78 | 
            +
                else
         | 
| 79 | 
            +
                  glsl_version = "#version 130" if glsl_version == nil
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                @@g_GlslVersionString = glsl_version.dup
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                return true
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              def self.ImplOpenGL3_Shutdown()
         | 
| 88 | 
            +
                ImplOpenGL3_DestroyDeviceObjects()
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              def self.ImplOpenGL3_NewFrame()
         | 
| 92 | 
            +
                ImplOpenGL3_CreateDeviceObjects() if @@g_ShaderHandle == 0
         | 
| 93 | 
            +
              end
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              def self.ImplOpenGL3_RenderDrawData(draw_data_raw)
         | 
| 96 | 
            +
                #  Avoid rendering when minimized, scale coordinates for retina displays (screen coordinates != framebuffer coordinates)
         | 
| 97 | 
            +
                draw_data = ImDrawData.new(draw_data_raw)
         | 
| 98 | 
            +
                fb_width = (draw_data[:DisplaySize][:x] * draw_data[:FramebufferScale][:x]).to_i
         | 
| 99 | 
            +
                fb_height = (draw_data[:DisplaySize][:y] * draw_data[:FramebufferScale][:y]).to_i
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                return if fb_width == 0 || fb_height == 0
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                #  Backup GL state
         | 
| 104 | 
            +
                last_active_texture = ' ' * 4;  GL.GetIntegerv(GL::ACTIVE_TEXTURE, last_active_texture)
         | 
| 105 | 
            +
                last_program = ' ' * 4;  GL.GetIntegerv(GL::CURRENT_PROGRAM, last_program)
         | 
| 106 | 
            +
                last_texture = ' ' * 4;  GL.GetIntegerv(GL::TEXTURE_BINDING_2D, last_texture)
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                last_sampler = ' ' * 4;  GL.GetIntegerv(GL::SAMPLER_BINDING, last_sampler)
         | 
| 109 | 
            +
                last_array_buffer = ' ' * 4;  GL.GetIntegerv(GL::ARRAY_BUFFER_BINDING, last_array_buffer)
         | 
| 110 | 
            +
                last_vertex_array_object = ' ' * 4;  GL.GetIntegerv(GL::VERTEX_ARRAY_BINDING, last_vertex_array_object)
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                last_polygon_mode = ' ' * 8;  GL.GetIntegerv(GL::POLYGON_MODE, last_polygon_mode)
         | 
| 113 | 
            +
                last_viewport = ' ' * 16;  GL.GetIntegerv(GL::VIEWPORT, last_viewport)
         | 
| 114 | 
            +
                last_scissor_box = ' ' * 16;  GL.GetIntegerv(GL::SCISSOR_BOX, last_scissor_box)
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                last_blend_src_rgb = ' ' * 4;  GL.GetIntegerv(GL::BLEND_SRC_RGB, last_blend_src_rgb)
         | 
| 117 | 
            +
                last_blend_dst_rgb = ' ' * 4;  GL.GetIntegerv(GL::BLEND_DST_RGB, last_blend_dst_rgb)
         | 
| 118 | 
            +
                last_blend_src_alpha = ' ' * 4;  GL.GetIntegerv(GL::BLEND_SRC_ALPHA, last_blend_src_alpha)
         | 
| 119 | 
            +
                last_blend_dst_alpha = ' ' * 4;  GL.GetIntegerv(GL::BLEND_DST_ALPHA, last_blend_dst_alpha)
         | 
| 120 | 
            +
                last_blend_equation_rgb = ' ' * 4;  GL.GetIntegerv(GL::BLEND_EQUATION_RGB, last_blend_equation_rgb)
         | 
| 121 | 
            +
                last_blend_equation_alpha = ' ' * 4;  GL.GetIntegerv(GL::BLEND_EQUATION_ALPHA, last_blend_equation_alpha)
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                last_enable_blend = GL.IsEnabled(GL::BLEND)
         | 
| 124 | 
            +
                last_enable_cull_face = GL.IsEnabled(GL::CULL_FACE)
         | 
| 125 | 
            +
                last_enable_depth_test = GL.IsEnabled(GL::DEPTH_TEST)
         | 
| 126 | 
            +
                last_enable_stencil_test = GL.IsEnabled(GL::STENCIL_TEST)
         | 
| 127 | 
            +
                last_enable_scissor_test = GL.IsEnabled(GL::SCISSOR_TEST)
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                #  Setup desired GL state
         | 
| 130 | 
            +
                vertex_array_object = ' ' * 4
         | 
| 131 | 
            +
                GL.GenVertexArrays(1, vertex_array_object)
         | 
| 132 | 
            +
                vertex_array_object = vertex_array_object.unpack1('L')
         | 
| 133 | 
            +
                ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object)
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                #  Will project scissor/clipping rectangles into framebuffer space
         | 
| 136 | 
            +
                clip_off = draw_data[:DisplayPos]         #  (0,0) unless using multi-viewports
         | 
| 137 | 
            +
                clip_scale = draw_data[:FramebufferScale] #  (1,1) unless using retina display which are often (2,2)
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                #  Render command lists
         | 
| 140 | 
            +
                draw_data[:CmdListsCount].times do |n|
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                  cmd_list = ImDrawList.new((draw_data[:CmdLists][:Data] + 8 * n).read_pointer) # 8 == const ImDrawList*
         | 
| 143 | 
            +
                  # vtx_buffer = ImDrawVert.new(cmd_list[:VtxBuffer][:Data]) # const ImDrawVert*
         | 
| 144 | 
            +
                  # idx_buffer = cmd_list[:IdxBuffer][:Data] # const ImDrawIdx*
         | 
| 145 | 
            +
             | 
| 146 | 
            +
                  # Upload vertex/index buffers
         | 
| 147 | 
            +
                  GL.BufferData(GL::ARRAY_BUFFER, cmd_list[:VtxBuffer][:Size] * ImDrawVert.size, Fiddle::Pointer.new(cmd_list[:VtxBuffer][:Data]), GL::STREAM_DRAW)
         | 
| 148 | 
            +
                  # 2 == ImDrawIdx(:ushort).size
         | 
| 149 | 
            +
                  GL.BufferData(GL::ELEMENT_ARRAY_BUFFER, cmd_list[:IdxBuffer][:Size] * 2, Fiddle::Pointer.new(cmd_list[:IdxBuffer][:Data]), GL::STREAM_DRAW) # [TODO] Refer ImGui::ImDrawIdx
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                  cmd_list[:CmdBuffer][:Size].times do |cmd_i|
         | 
| 152 | 
            +
                    pcmd = ImDrawCmd.new(cmd_list[:CmdBuffer][:Data] + ImDrawCmd.size * cmd_i) # const ImDrawCmd*
         | 
| 153 | 
            +
                    if pcmd[:UserCallback] != nil
         | 
| 154 | 
            +
                      # [TODO] Handle user callback (Ref.: https://github.com/ffi/ffi/wiki/Callbacks )
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                      #  User callback, registered via ImDrawList::AddCallback()
         | 
| 157 | 
            +
                      #  (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.)
         | 
| 158 | 
            +
                      # if pcmd[:UserCallback] == :ImDrawCallback_ResetRenderState
         | 
| 159 | 
            +
                          ImGui_ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object)
         | 
| 160 | 
            +
                      # else
         | 
| 161 | 
            +
                      #   pcmd[:UserCallback](cmd_list, pcmd)
         | 
| 162 | 
            +
                      # end
         | 
| 163 | 
            +
                    else
         | 
| 164 | 
            +
                      #  Project scissor/clipping rectangles into framebuffer space
         | 
| 165 | 
            +
                      clip_rect = ImVec4.new
         | 
| 166 | 
            +
                      clip_rect[:x] = (pcmd[:ClipRect][:x] - clip_off[:x]) * clip_scale[:x]
         | 
| 167 | 
            +
                      clip_rect[:y] = (pcmd[:ClipRect][:y] - clip_off[:y]) * clip_scale[:y]
         | 
| 168 | 
            +
                      clip_rect[:z] = (pcmd[:ClipRect][:z] - clip_off[:x]) * clip_scale[:x]
         | 
| 169 | 
            +
                      clip_rect[:w] = (pcmd[:ClipRect][:w] - clip_off[:y]) * clip_scale[:y]
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                      if (clip_rect[:x] < fb_width && clip_rect[:y] < fb_height && clip_rect[:z] >= 0.0 && clip_rect[:w] >= 0.0)
         | 
| 172 | 
            +
                        #  Apply scissor/clipping rectangle
         | 
| 173 | 
            +
                        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)
         | 
| 174 | 
            +
             | 
| 175 | 
            +
                        #  Bind texture, Draw
         | 
| 176 | 
            +
                        GL.BindTexture(GL::TEXTURE_2D, pcmd[:TextureId].address)
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                        if @@g_GlVersion >= 3200
         | 
| 179 | 
            +
                          # 2 == ImDrawIdx(:ushort).size
         | 
| 180 | 
            +
                          GL.DrawElementsBaseVertex(GL::TRIANGLES, pcmd[:ElemCount], GL::UNSIGNED_SHORT, Fiddle::Pointer.new(pcmd[:IdxOffset] * 2), pcmd[:VtxOffset])
         | 
| 181 | 
            +
                        else
         | 
| 182 | 
            +
                          # 2 == ImDrawIdx(:ushort).size
         | 
| 183 | 
            +
                          GL.DrawElements(GL::TRIANGLES, pcmd[:ElemCount], GL::UNSIGNED_SHORT, Fiddle::Pointer.new(pcmd[:IdxOffset] * 2))
         | 
| 184 | 
            +
                        end
         | 
| 185 | 
            +
                      end
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                    end
         | 
| 188 | 
            +
                    # idx_buffer += pcmd[:ElemCount] * 2 # 2 == ImDrawIdx(:ushort).size
         | 
| 189 | 
            +
                  end
         | 
| 190 | 
            +
                end
         | 
| 191 | 
            +
             | 
| 192 | 
            +
                # Destroy the temporary VAO
         | 
| 193 | 
            +
                GL.DeleteVertexArrays(1, [vertex_array_object].pack('L'))
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                #  Restore modified GL state
         | 
| 196 | 
            +
                GL.UseProgram(last_program.unpack1('L'))
         | 
| 197 | 
            +
                GL.BindTexture(GL::TEXTURE_2D, last_texture.unpack1('L'))
         | 
| 198 | 
            +
                GL.BindSampler(0, last_sampler.unpack1('L'))
         | 
| 199 | 
            +
                GL.ActiveTexture(last_active_texture.unpack1('L'))
         | 
| 200 | 
            +
                GL.BindVertexArray(last_vertex_array_object.unpack1('L'))
         | 
| 201 | 
            +
                GL.BindBuffer(GL::ARRAY_BUFFER, last_array_buffer.unpack1('L'))
         | 
| 202 | 
            +
                GL.BlendEquationSeparate(last_blend_equation_rgb.unpack1('L'), last_blend_equation_alpha.unpack1('L'))
         | 
| 203 | 
            +
             | 
| 204 | 
            +
                if last_enable_blend then GL.Enable(GL::BLEND) else GL.Disable(GL::BLEND) end
         | 
| 205 | 
            +
                if last_enable_cull_face then GL.Enable(GL::CULL_FACE) else GL.Disable(GL::CULL_FACE) end
         | 
| 206 | 
            +
                if last_enable_depth_test then GL.Enable(GL::DEPTH_TEST) else GL.Disable(GL::DEPTH_TEST) end
         | 
| 207 | 
            +
                if last_enable_stencil_test then GL.Enable(GL::STENCIL_TEST) else GL.Disable(GL::STENCIL_TEST) end
         | 
| 208 | 
            +
                if last_enable_scissor_test then GL.Enable(GL::SCISSOR_TEST) else GL.Disable(GL::SCISSOR_TEST) end
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                last_polygon_mode = last_polygon_mode.unpack('L2')
         | 
| 211 | 
            +
                GL.PolygonMode(GL::FRONT_AND_BACK, last_polygon_mode[0])
         | 
| 212 | 
            +
                last_viewport = last_viewport.unpack('L4')
         | 
| 213 | 
            +
                GL.Viewport(last_viewport[0], last_viewport[1], last_viewport[2], last_viewport[3])
         | 
| 214 | 
            +
                last_scissor_box = last_scissor_box.unpack('L4')
         | 
| 215 | 
            +
                GL.Scissor(last_scissor_box[0], last_scissor_box[1], last_scissor_box[2], last_scissor_box[3])
         | 
| 216 | 
            +
             | 
| 217 | 
            +
              end
         | 
| 218 | 
            +
             | 
| 219 | 
            +
              # private
         | 
| 220 | 
            +
             | 
| 221 | 
            +
              def self.ImplOpenGL3_SetupRenderState(draw_data, fb_width, fb_height, vertex_array_object)
         | 
| 222 | 
            +
                # Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled, polygon fill
         | 
| 223 | 
            +
                GL.Enable(GL::BLEND)
         | 
| 224 | 
            +
                GL.BlendEquation(GL::FUNC_ADD)
         | 
| 225 | 
            +
                GL.BlendFuncSeparate(GL::SRC_ALPHA, GL::ONE_MINUS_SRC_ALPHA, GL::ONE, GL::ONE_MINUS_SRC_ALPHA)
         | 
| 226 | 
            +
                GL.Disable(GL::CULL_FACE)
         | 
| 227 | 
            +
                GL.Disable(GL::DEPTH_TEST)
         | 
| 228 | 
            +
                GL.Disable(GL::STENCIL_TEST)
         | 
| 229 | 
            +
                GL.Enable(GL::SCISSOR_TEST)
         | 
| 230 | 
            +
                GL.PolygonMode(GL::FRONT_AND_BACK, GL::FILL) # GL::POLYGON_MODE
         | 
| 231 | 
            +
             | 
| 232 | 
            +
                # Setup viewport, orthographic projection matrix
         | 
| 233 | 
            +
                # 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.
         | 
| 234 | 
            +
                GL.Viewport(0, 0, fb_width, fb_height)
         | 
| 235 | 
            +
                l = draw_data[:DisplayPos][:x]
         | 
| 236 | 
            +
                r = draw_data[:DisplayPos][:x] + draw_data[:DisplaySize][:x]
         | 
| 237 | 
            +
                t = draw_data[:DisplayPos][:y]
         | 
| 238 | 
            +
                b = draw_data[:DisplayPos][:y] + draw_data[:DisplaySize][:y]
         | 
| 239 | 
            +
                ortho_projection = [
         | 
| 240 | 
            +
                    2.0/(r-l),   0.0,         0.0,   0.0,
         | 
| 241 | 
            +
                    0.0,         2.0/(t-b),   0.0,   0.0,
         | 
| 242 | 
            +
                    0.0,         0.0,        -1.0,   0.0,
         | 
| 243 | 
            +
                    (r+l)/(l-r),  (t+b)/(b-t),  0.0,   1.0,
         | 
| 244 | 
            +
                ]
         | 
| 245 | 
            +
                GL.UseProgram(@@g_ShaderHandle)
         | 
| 246 | 
            +
                GL.Uniform1i(@@g_AttribLocationTex, 0)
         | 
| 247 | 
            +
                GL.UniformMatrix4fv(@@g_AttribLocationProjMtx, 1, GL::FALSE, ortho_projection.pack('F16'))
         | 
| 248 | 
            +
                # GL::SAMPLER_BINDING
         | 
| 249 | 
            +
                GL.BindSampler(0, 0) # We use combined texture/sampler state. Applications using GL 3.3 may set that otherwise.
         | 
| 250 | 
            +
             | 
| 251 | 
            +
                GL.BindVertexArray(vertex_array_object)
         | 
| 252 | 
            +
             | 
| 253 | 
            +
                # Bind vertex/index buffers and setup attributes for ImDrawVert
         | 
| 254 | 
            +
                GL.BindBuffer(GL::ARRAY_BUFFER, @@g_VboHandle)
         | 
| 255 | 
            +
                GL.BindBuffer(GL::ELEMENT_ARRAY_BUFFER, @@g_ElementsHandle)
         | 
| 256 | 
            +
             | 
| 257 | 
            +
                GL.EnableVertexAttribArray(@@g_AttribLocationVtxPos)
         | 
| 258 | 
            +
                GL.EnableVertexAttribArray(@@g_AttribLocationVtxUV)
         | 
| 259 | 
            +
                GL.EnableVertexAttribArray(@@g_AttribLocationVtxColor)
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                GL.VertexAttribPointer(@@g_AttribLocationVtxPos,   2, GL::FLOAT,         GL::FALSE, ImDrawVert.size, ImDrawVert.offset_of(:pos))
         | 
| 262 | 
            +
                GL.VertexAttribPointer(@@g_AttribLocationVtxUV,    2, GL::FLOAT,         GL::FALSE, ImDrawVert.size, ImDrawVert.offset_of(:uv))
         | 
| 263 | 
            +
                GL.VertexAttribPointer(@@g_AttribLocationVtxColor, 4, GL::UNSIGNED_BYTE, GL::TRUE,  ImDrawVert.size, ImDrawVert.offset_of(:col))
         | 
| 264 | 
            +
             | 
| 265 | 
            +
              end
         | 
| 266 | 
            +
             | 
| 267 | 
            +
              def self.ImplOpenGL3_CreateFontsTexture()
         | 
| 268 | 
            +
                #  Build texture atlas
         | 
| 269 | 
            +
                io = ImGuiIO.new(ImGui::GetIO())
         | 
| 270 | 
            +
                pixels = FFI::MemoryPointer.new :pointer
         | 
| 271 | 
            +
                width = FFI::MemoryPointer.new :int
         | 
| 272 | 
            +
                height = FFI::MemoryPointer.new :int
         | 
| 273 | 
            +
                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.
         | 
| 274 | 
            +
             | 
| 275 | 
            +
                #  Upload texture to graphics system
         | 
| 276 | 
            +
                last_texture = ' ' * 4
         | 
| 277 | 
            +
                @@g_FontTexture = ' ' * 4
         | 
| 278 | 
            +
                GL.GetIntegerv(GL::TEXTURE_BINDING_2D, last_texture)
         | 
| 279 | 
            +
                GL.GenTextures(1, @@g_FontTexture)
         | 
| 280 | 
            +
                GL.BindTexture(GL::TEXTURE_2D, @@g_FontTexture.unpack1('L'))
         | 
| 281 | 
            +
                GL.TexParameteri(GL::TEXTURE_2D, GL::TEXTURE_MIN_FILTER, GL::LINEAR)
         | 
| 282 | 
            +
                GL.TexParameteri(GL::TEXTURE_2D, GL::TEXTURE_MAG_FILTER, GL::LINEAR)
         | 
| 283 | 
            +
                GL.PixelStorei(GL::UNPACK_ROW_LENGTH, 0)
         | 
| 284 | 
            +
                # Ruby/FFI <-> Fiddle pointer exchange
         | 
| 285 | 
            +
                # p pixels
         | 
| 286 | 
            +
                # p pixels.read_pointer
         | 
| 287 | 
            +
                # p pixels.read_pointer.address.to_s(16)
         | 
| 288 | 
            +
                pixels_ptr = Fiddle::Pointer.new(pixels.read_pointer.address)
         | 
| 289 | 
            +
                GL.TexImage2D(GL::TEXTURE_2D, 0, GL::RGBA, width.read_uint, height.read_uint, 0, GL::RGBA, GL::UNSIGNED_BYTE, pixels_ptr)
         | 
| 290 | 
            +
             | 
| 291 | 
            +
                #  Store our identifier
         | 
| 292 | 
            +
                io[:Fonts][:TexID] = @@g_FontTexture.unpack1('L')
         | 
| 293 | 
            +
             | 
| 294 | 
            +
                #  Restore state
         | 
| 295 | 
            +
                GL.BindTexture(GL::TEXTURE_2D, last_texture.unpack1('L'))
         | 
| 296 | 
            +
             | 
| 297 | 
            +
                return true
         | 
| 298 | 
            +
              end
         | 
| 299 | 
            +
             | 
| 300 | 
            +
              def self.ImplOpenGL3_DestroyFontsTexture()
         | 
| 301 | 
            +
                if @@g_FontTexture != 0
         | 
| 302 | 
            +
                  GL.DeleteTextures(1, @@g_FontTexture)
         | 
| 303 | 
            +
                  io = ImGuiIO.new(ImGui::GetIO())
         | 
| 304 | 
            +
                  io[:Fonts][:TexID] = 0
         | 
| 305 | 
            +
                  @@g_FontTexture = 0
         | 
| 306 | 
            +
                end
         | 
| 307 | 
            +
              end
         | 
| 308 | 
            +
             | 
| 309 | 
            +
              def self.ImplOpenGL3_CreateDeviceObjects()
         | 
| 310 | 
            +
                # Backup GL state
         | 
| 311 | 
            +
                last_texture, last_array_buffer = ' ' * 4, ' ' * 4
         | 
| 312 | 
            +
                GL.GetIntegerv(GL::TEXTURE_BINDING_2D, last_texture)
         | 
| 313 | 
            +
                GL.GetIntegerv(GL::ARRAY_BUFFER_BINDING, last_array_buffer)
         | 
| 314 | 
            +
                last_texture = last_texture.unpack1('L')
         | 
| 315 | 
            +
                last_array_buffer = last_array_buffer.unpack1('L')
         | 
| 316 | 
            +
             | 
| 317 | 
            +
                last_vertex_array = ' ' * 4
         | 
| 318 | 
            +
                GL.GetIntegerv(GL::VERTEX_ARRAY_BINDING, last_vertex_array)
         | 
| 319 | 
            +
                last_vertex_array = last_vertex_array.unpack1('L')
         | 
| 320 | 
            +
             | 
| 321 | 
            +
                glsl_version = @@g_GlslVersionString.split[1].to_i # == scanf(@@g_GlslVersionString, "#version %d")
         | 
| 322 | 
            +
             | 
| 323 | 
            +
                vertex_shader_glsl_120 = <<-'SRC'
         | 
| 324 | 
            +
                uniform mat4 ProjMtx;
         | 
| 325 | 
            +
                attribute vec2 Position;
         | 
| 326 | 
            +
                attribute vec2 UV;
         | 
| 327 | 
            +
                attribute vec4 Color;
         | 
| 328 | 
            +
                varying vec2 Frag_UV;
         | 
| 329 | 
            +
                varying vec4 Frag_Color;
         | 
| 330 | 
            +
                void main()
         | 
| 331 | 
            +
                {
         | 
| 332 | 
            +
                    Frag_UV = UV;
         | 
| 333 | 
            +
                    Frag_Color = Color;
         | 
| 334 | 
            +
                    gl_Position = ProjMtx * vec4(Position.xy,0,1);
         | 
| 335 | 
            +
                }
         | 
| 336 | 
            +
                SRC
         | 
| 337 | 
            +
             | 
| 338 | 
            +
                vertex_shader_glsl_130 = <<-'SRC'
         | 
| 339 | 
            +
                uniform mat4 ProjMtx;
         | 
| 340 | 
            +
                in vec2 Position;
         | 
| 341 | 
            +
                in vec2 UV;
         | 
| 342 | 
            +
                in vec4 Color;
         | 
| 343 | 
            +
                out vec2 Frag_UV;
         | 
| 344 | 
            +
                out vec4 Frag_Color;
         | 
| 345 | 
            +
                void main()
         | 
| 346 | 
            +
                {
         | 
| 347 | 
            +
                    Frag_UV = UV;
         | 
| 348 | 
            +
                    Frag_Color = Color;
         | 
| 349 | 
            +
                    gl_Position = ProjMtx * vec4(Position.xy,0,1);
         | 
| 350 | 
            +
                }
         | 
| 351 | 
            +
                SRC
         | 
| 352 | 
            +
             | 
| 353 | 
            +
                vertex_shader_glsl_300_es = <<-'SRC'
         | 
| 354 | 
            +
                precision mediump float;
         | 
| 355 | 
            +
                layout (location = 0) in vec2 Position;
         | 
| 356 | 
            +
                layout (location = 1) in vec2 UV;
         | 
| 357 | 
            +
                layout (location = 2) in vec4 Color;
         | 
| 358 | 
            +
                uniform mat4 ProjMtx;
         | 
| 359 | 
            +
                out vec2 Frag_UV;
         | 
| 360 | 
            +
                out vec4 Frag_Color;
         | 
| 361 | 
            +
                void main()
         | 
| 362 | 
            +
                {
         | 
| 363 | 
            +
                    Frag_UV = UV;
         | 
| 364 | 
            +
                    Frag_Color = Color;
         | 
| 365 | 
            +
                    gl_Position = ProjMtx * vec4(Position.xy,0,1);
         | 
| 366 | 
            +
                }
         | 
| 367 | 
            +
                SRC
         | 
| 368 | 
            +
             | 
| 369 | 
            +
                vertex_shader_glsl_410_core = <<-'SRC'
         | 
| 370 | 
            +
                layout (location = 0) in vec2 Position;
         | 
| 371 | 
            +
                layout (location = 1) in vec2 UV;
         | 
| 372 | 
            +
                layout (location = 2) in vec4 Color;
         | 
| 373 | 
            +
                uniform mat4 ProjMtx;
         | 
| 374 | 
            +
                out vec2 Frag_UV;
         | 
| 375 | 
            +
                out vec4 Frag_Color;
         | 
| 376 | 
            +
                void main()
         | 
| 377 | 
            +
                {
         | 
| 378 | 
            +
                    Frag_UV = UV;
         | 
| 379 | 
            +
                    Frag_Color = Color;
         | 
| 380 | 
            +
                    gl_Position = ProjMtx * vec4(Position.xy,0,1);
         | 
| 381 | 
            +
                }
         | 
| 382 | 
            +
                SRC
         | 
| 383 | 
            +
             | 
| 384 | 
            +
                fragment_shader_glsl_120 = <<-'SRC'
         | 
| 385 | 
            +
                #ifdef GL::ES
         | 
| 386 | 
            +
                    precision mediump float;
         | 
| 387 | 
            +
                #endif
         | 
| 388 | 
            +
                uniform sampler2D Texture;
         | 
| 389 | 
            +
                varying vec2 Frag_UV;
         | 
| 390 | 
            +
                varying vec4 Frag_Color;
         | 
| 391 | 
            +
                void main()
         | 
| 392 | 
            +
                {
         | 
| 393 | 
            +
                    gl_FragColor = Frag_Color * texture2D(Texture, Frag_UV.st);
         | 
| 394 | 
            +
                }
         | 
| 395 | 
            +
                SRC
         | 
| 396 | 
            +
             | 
| 397 | 
            +
                fragment_shader_glsl_130 = <<-'SRC'
         | 
| 398 | 
            +
                uniform sampler2D Texture;
         | 
| 399 | 
            +
                in vec2 Frag_UV;
         | 
| 400 | 
            +
                in vec4 Frag_Color;
         | 
| 401 | 
            +
                out vec4 Out_Color;
         | 
| 402 | 
            +
                void main()
         | 
| 403 | 
            +
                {
         | 
| 404 | 
            +
                    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);
         | 
| 405 | 
            +
                }
         | 
| 406 | 
            +
                SRC
         | 
| 407 | 
            +
             | 
| 408 | 
            +
                fragment_shader_glsl_300_es = <<-'SRC'
         | 
| 409 | 
            +
                precision mediump float;
         | 
| 410 | 
            +
                uniform sampler2D Texture;
         | 
| 411 | 
            +
                in vec2 Frag_UV;
         | 
| 412 | 
            +
                in vec4 Frag_Color;
         | 
| 413 | 
            +
                layout (location = 0) out vec4 Out_Color;
         | 
| 414 | 
            +
                void main()
         | 
| 415 | 
            +
                {
         | 
| 416 | 
            +
                    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);
         | 
| 417 | 
            +
                }
         | 
| 418 | 
            +
                SRC
         | 
| 419 | 
            +
             | 
| 420 | 
            +
                fragment_shader_glsl_410_core = <<-'SRC'
         | 
| 421 | 
            +
                in vec2 Frag_UV;
         | 
| 422 | 
            +
                in vec4 Frag_Color;
         | 
| 423 | 
            +
                uniform sampler2D Texture;
         | 
| 424 | 
            +
                layout (location = 0) out vec4 Out_Color;
         | 
| 425 | 
            +
                void main()
         | 
| 426 | 
            +
                {
         | 
| 427 | 
            +
                    Out_Color = Frag_Color * texture(Texture, Frag_UV.st);
         | 
| 428 | 
            +
                }
         | 
| 429 | 
            +
                SRC
         | 
| 430 | 
            +
             | 
| 431 | 
            +
                vertex_shader, fragment_shader = if glsl_version < 130
         | 
| 432 | 
            +
                                                   [vertex_shader_glsl_120, fragment_shader_glsl_120]
         | 
| 433 | 
            +
                                                 elsif glsl_version >= 410
         | 
| 434 | 
            +
                                                   [vertex_shader_glsl_410_core, fragment_shader_glsl_410_core]
         | 
| 435 | 
            +
                                                 elsif glsl_version == 300
         | 
| 436 | 
            +
                                                   [vertex_shader_glsl_300_es, fragment_shader_glsl_300_es]
         | 
| 437 | 
            +
                                                 else
         | 
| 438 | 
            +
                                                   [vertex_shader_glsl_130, fragment_shader_glsl_130]
         | 
| 439 | 
            +
                                                 end
         | 
| 440 | 
            +
             | 
| 441 | 
            +
                vertex_shader.prepend(@@g_GlslVersionString + "\n")
         | 
| 442 | 
            +
                vert_handle = GL.CreateShader(GL::VERTEX_SHADER)
         | 
| 443 | 
            +
                GL.ShaderSource(vert_handle, 1, [vertex_shader].pack('p'), nil)
         | 
| 444 | 
            +
                GL.CompileShader(vert_handle)
         | 
| 445 | 
            +
                PrintShaderCompileStatus(vert_handle)
         | 
| 446 | 
            +
             | 
| 447 | 
            +
                fragment_shader.prepend(@@g_GlslVersionString + "\n")
         | 
| 448 | 
            +
                frag_handle = GL.CreateShader(GL::FRAGMENT_SHADER)
         | 
| 449 | 
            +
                GL.ShaderSource(frag_handle, 1, [fragment_shader].pack('p'), [fragment_shader.size].pack('I'))
         | 
| 450 | 
            +
                GL.CompileShader(frag_handle)
         | 
| 451 | 
            +
                PrintShaderCompileStatus(frag_handle)
         | 
| 452 | 
            +
             | 
| 453 | 
            +
                @@g_ShaderHandle = GL.CreateProgram()
         | 
| 454 | 
            +
                GL.AttachShader(@@g_ShaderHandle, vert_handle)
         | 
| 455 | 
            +
                GL.AttachShader(@@g_ShaderHandle, frag_handle)
         | 
| 456 | 
            +
                GL.LinkProgram(@@g_ShaderHandle)
         | 
| 457 | 
            +
                PrintProgramLinkStatus(@@g_ShaderHandle)
         | 
| 458 | 
            +
             | 
| 459 | 
            +
                GL.DetachShader(@@g_ShaderHandle, vert_handle)
         | 
| 460 | 
            +
                GL.DetachShader(@@g_ShaderHandle, frag_handle)
         | 
| 461 | 
            +
                GL.DeleteShader(vert_handle)
         | 
| 462 | 
            +
                GL.DeleteShader(frag_handle)
         | 
| 463 | 
            +
             | 
| 464 | 
            +
                @@g_AttribLocationTex = GL.GetUniformLocation(@@g_ShaderHandle, "Texture")
         | 
| 465 | 
            +
                @@g_AttribLocationProjMtx = GL.GetUniformLocation(@@g_ShaderHandle, "ProjMtx")
         | 
| 466 | 
            +
             | 
| 467 | 
            +
                @@g_AttribLocationVtxPos = GL.GetAttribLocation(@@g_ShaderHandle, "Position")
         | 
| 468 | 
            +
                @@g_AttribLocationVtxUV = GL.GetAttribLocation(@@g_ShaderHandle, "UV")
         | 
| 469 | 
            +
                @@g_AttribLocationVtxColor = GL.GetAttribLocation(@@g_ShaderHandle, "Color")
         | 
| 470 | 
            +
             | 
| 471 | 
            +
                # Create buffers
         | 
| 472 | 
            +
                posBuf = ' ' * 4
         | 
| 473 | 
            +
                GL.GenBuffers(1, posBuf)
         | 
| 474 | 
            +
                GL.BindBuffer(GL::ARRAY_BUFFER, posBuf.unpack('L')[0])
         | 
| 475 | 
            +
             | 
| 476 | 
            +
                @@g_VboHandle, @@g_ElementsHandle = ' ' * 4, ' ' * 4
         | 
| 477 | 
            +
                GL.GenBuffers(1, @@g_VboHandle)
         | 
| 478 | 
            +
                GL.GenBuffers(1, @@g_ElementsHandle)
         | 
| 479 | 
            +
                @@g_VboHandle = @@g_VboHandle.unpack1('L')
         | 
| 480 | 
            +
                @@g_ElementsHandle = @@g_ElementsHandle.unpack1('L')
         | 
| 481 | 
            +
             | 
| 482 | 
            +
                ImplOpenGL3_CreateFontsTexture()
         | 
| 483 | 
            +
             | 
| 484 | 
            +
                # Restore modified GL state
         | 
| 485 | 
            +
                GL.BindTexture(GL::TEXTURE_2D, last_texture)
         | 
| 486 | 
            +
                GL.BindBuffer(GL::ARRAY_BUFFER, last_array_buffer)
         | 
| 487 | 
            +
                GL.BindVertexArray(last_vertex_array)
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                return true
         | 
| 490 | 
            +
              end
         | 
| 491 | 
            +
             | 
| 492 | 
            +
              def self.ImplOpenGL3_DestroyDeviceObjects()
         | 
| 493 | 
            +
                if @@g_VboHandle != 0
         | 
| 494 | 
            +
                  GL.DeleteBuffers(1, [@@g_VboHandle].pack('L'))
         | 
| 495 | 
            +
                  @@g_VboHandle = 0
         | 
| 496 | 
            +
                end
         | 
| 497 | 
            +
                if @@g_ElementsHandle != 0
         | 
| 498 | 
            +
                  GL.DeleteBuffers(1, [@@g_ElementsHandle].pack('L'))
         | 
| 499 | 
            +
                  @@g_ElementsHandle = 0
         | 
| 500 | 
            +
                end
         | 
| 501 | 
            +
                if @@g_ShaderHandle != 0
         | 
| 502 | 
            +
                  GL.DeleteProgram(@@g_ShaderHandle)
         | 
| 503 | 
            +
                  @@g_ShaderHandle = 0
         | 
| 504 | 
            +
                end
         | 
| 505 | 
            +
             | 
| 506 | 
            +
                ImplOpenGL3_DestroyFontsTexture()
         | 
| 507 | 
            +
              end
         | 
| 508 | 
            +
             | 
| 509 | 
            +
            end
         |