Skip to content

Instantly share code, notes, and snippets.

@vaiorabbit
Created June 26, 2016 05:08
Show Gist options
  • Save vaiorabbit/dfff40408c1b3ff36974827723dd43b0 to your computer and use it in GitHub Desktop.
Save vaiorabbit/dfff40408c1b3ff36974827723dd43b0 to your computer and use it in GitHub Desktop.
(Experimental) Ruby bindings for the Nuklear GUI toolkit ( https://github.com/vurtun/nuklear )
require 'ffi'
module Nuklear
extend FFI::Library
NK_UTF_INVALID = 0xFFFD
NK_UTF_SIZE = 4
NK_INPUT_MAX = 16
NK_MAX_NUMBER_BUFFER = 64
typedef :int16, :nk_short
typedef :uint16, :nk_ushort
typedef :int32, :nk_int
typedef :uint32, :nk_uint
typedef :uint32, :nk_hash
typedef :uintptr_t, :nk_size
typedef :uintptr_t, :nk_ptr
typedef :uint32, :nk_flags
typedef :uint32, :nk_rune
typedef :uint8, :nk_byte
NK_FALSE = 0
NK_TRUE = 1
class NK_COLOR < FFI::Struct
layout :r, :nk_byte,
:g, :nk_byte,
:b, :nk_byte,
:a, :nk_byte
end
class NK_VEC2 < FFI::Struct
layout :x, :float,
:y, :float
end
class NK_VEC2I < FFI::Struct
layout :x, :short,
:y, :short
end
class NK_RECT < FFI::Struct
layout :x, :float,
:y, :float,
:w, :float,
:h, :float
end
class NK_RECTI < FFI::Struct
layout :x, :short,
:y, :short,
:w, :short,
:h, :short
end
class NK_GLYPH < FFI::Struct
layout :val, [:char, 8]
def [](index) # Note
val[index]
end
end
class NK_HANDLE < FFI::Union
layout :ptr, :pointer,
:id, :int
end
class NK_IMAGE < FFI::Struct
layout :handle, NK_HANDLE,
:w, :ushort,
:h, :ushort,
:region, [:ushort, 4]
end
class NK_SCROLL < FFI::Struct
layout :x, :ushort,
:y, :ushort
end
NK_HEADING = enum :nk_up, :nk_right, :nk_down, :nk_left
callback :nk_filter, [:pointer, :nk_rune], :int32
callback :nk_paste_f, [NK_HANDLE, :pointer], :void
callback :nk_copy_f, [NK_HANDLE, :pointer, :int32], :void
NK_BUTTON_BEHAVIOR = enum :NK_BUTTON_DEFAULT, :NK_BUTTON_REPEATER
NK_MODIFY = enum :NK_FIXED, 0, :NK_MODIFIABLE, 1
NK_ORIENTATION = enum :NK_VERTICAL, :NK_HORIZONTAL
NK_COLLAPSE_STATES = enum :NK_MINIMIZED, 0, :NK_MAXIMIZED, 1
NK_SHOW_STATES = enum :NK_HIDDEN, 0, :NK_SHOWN, 1
NK_CHART_TYPE = enum :NK_CHART_LINES, :NK_CHART_COLUMN, :NK_CHART_MAX
NK_CHART_EVENT = enum :NK_CHART_HOVERING, 0x01, :NK_CHART_CLICKED, 0x02
NK_COLOR_FORMAT = enum :NK_RGB, :NK_RGBA
NK_POPUP_TYPE = enum :NK_POPUP_STATIC, :NK_POPUP_DYNAMIC
NK_LAYOUT_FORMAT = enum :NK_DYNAMIC, :NK_STATIC
NK_TREE_TYPE = enum :NK_TREE_NODE, :NK_TREE_TAB
NK_ANTI_ALIASING = enum :NK_ANTI_ALIASING_OFF, :NK_ANTI_ALIASING_ON
callback :nk_alloc_f, [NK_HANDLE, :pointer, :nk_size], :pointer # Added for Ruby
callback :nk_free_f, [NK_HANDLE, :pointer], :void # Added for Ruby
class NK_ALLOCATOR < FFI::Struct
layout :userdata, NK_HANDLE,
:alloc, :nk_alloc_f,
:free, :nk_free_f
end
class NK_DRAW_NULL_TEXTURE < FFI::Struct
layout :texture, NK_HANDLE,
:uv, NK_VEC2
end
class NK_CONVERT_CONFIG < FFI::Struct
layout :global_alpha, :float,
:line_AA, NK_ANTI_ALIASING,
:shape_AA, NK_ANTI_ALIASING,
:circle_segment_count, :uint32,
:arc_segment_count, :uint32,
:curve_segment_count, :uint32,
:null, NK_DRAW_NULL_TEXTURE
end
NK_SYMBOL_TYPE = enum :NK_SYMBOL_NONE,
:NK_SYMBOL_X,
:NK_SYMBOL_UNDERSCORE,
:NK_SYMBOL_CIRCLE,
:NK_SYMBOL_CIRCLE_FILLED,
:NK_SYMBOL_RECT,
:NK_SYMBOL_RECT_FILLED,
:NK_SYMBOL_TRIANGLE_UP,
:NK_SYMBOL_TRIANGLE_DOWN,
:NK_SYMBOL_TRIANGLE_LEFT,
:NK_SYMBOL_TRIANGLE_RIGHT,
:NK_SYMBOL_PLUS,
:NK_SYMBOL_MINUS,
:NK_SYMBOL_MAX
NK_KEYS = enum :NK_KEY_NONE,
:NK_KEY_SHIFT,
:NK_KEY_CTRL,
:NK_KEY_DEL,
:NK_KEY_ENTER,
:NK_KEY_TAB,
:NK_KEY_BACKSPACE,
:NK_KEY_COPY,
:NK_KEY_CUT,
:NK_KEY_PASTE,
:NK_KEY_UP,
:NK_KEY_DOWN,
:NK_KEY_LEFT,
:NK_KEY_RIGHT,
#
:NK_KEY_TEXT_INSERT_MODE,
:NK_KEY_TEXT_REPLACE_MODE,
:NK_KEY_TEXT_RESET_MODE,
:NK_KEY_TEXT_LINE_START,
:NK_KEY_TEXT_LINE_END,
:NK_KEY_TEXT_START,
:NK_KEY_TEXT_END,
:NK_KEY_TEXT_UNDO,
:NK_KEY_TEXT_REDO,
:NK_KEY_TEXT_WORD_LEFT,
:NK_KEY_TEXT_WORD_RIGHT,
#
:NK_KEY_SCROLL_START,
:NK_KEY_SCROLL_END,
:NK_KEY_SCROLL_DOWN,
:NK_KEY_SCROLL_UP,
#
:NK_KEY_MAX
NK_BUTTONS = enum :NK_BUTTON_LEFT,
:NK_BUTTON_MIDDLE,
:NK_BUTTON_RIGHT,
:NK_BUTTON_MAX
NK_STYLE_COLORS = enum :NK_COLOR_TEXT,
:NK_COLOR_WINDOW,
:NK_COLOR_HEADER,
:NK_COLOR_BORDER,
:NK_COLOR_BUTTON,
:NK_COLOR_BUTTON_HOVER,
:NK_COLOR_BUTTON_ACTIVE,
:NK_COLOR_TOGGLE,
:NK_COLOR_TOGGLE_HOVER,
:NK_COLOR_TOGGLE_CURSOR,
:NK_COLOR_SELECT,
:NK_COLOR_SELECT_ACTIVE,
:NK_COLOR_SLIDER,
:NK_COLOR_SLIDER_CURSOR,
:NK_COLOR_SLIDER_CURSOR_HOVER,
:NK_COLOR_SLIDER_CURSOR_ACTIVE,
:NK_COLOR_PROPERTY,
:NK_COLOR_EDIT,
:NK_COLOR_EDIT_CURSOR,
:NK_COLOR_COMBO,
:NK_COLOR_CHART,
:NK_COLOR_CHART_COLOR,
:NK_COLOR_CHART_COLOR_HIGHLIGHT,
:NK_COLOR_SCROLLBAR,
:NK_COLOR_SCROLLBAR_CURSOR,
:NK_COLOR_SCROLLBAR_CURSOR_HOVER,
:NK_COLOR_SCROLLBAR_CURSOR_ACTIVE,
:NK_COLOR_TAB_HEADER,
:NK_COLOR_COUNT
NK_WIDGET_LAYOUT_STATES = enum :NK_WIDGET_INVALID,
:NK_WIDGET_VALID,
:NK_WIDGET_ROM
NK_WIDGET_STATES = enum :NK_WIDGET_STATE_MODIFIED, (1 << 1),
:NK_WIDGET_STATE_INACTIVE, (1 << 2),
:NK_WIDGET_STATE_ENTERED, (1 << 3),
:NK_WIDGET_STATE_HOVER, (1 << 4),
:NK_WIDGET_STATE_ACTIVED, (1 << 5),
:NK_WIDGET_STATE_LEFT, (1 << 6),
:NK_WIDGET_STATE_HOVERED, ((1 << 4)|(1 << 1)), # (NK_WIDGET_STATE_HOVER|NK_WIDGET_STATE_MODIFIED),
:NK_WIDGET_STATE_ACTIVE, ((1 << 5)|(1 << 1)) # (:NK_WIDGET_STATE_ACTIVED|:NK_WIDGET_STATE_MODIFIED)
NK_TEXT_ALIGN = enum :NK_TEXT_ALIGN_LEFT, 0x01,
:NK_TEXT_ALIGN_CENTERED, 0x02,
:NK_TEXT_ALIGN_RIGHT, 0x04,
:NK_TEXT_ALIGN_TOP, 0x08,
:NK_TEXT_ALIGN_MIDDLE, 0x10,
:NK_TEXT_ALIGN_BOTTOM, 0x20
NK_TEXT_ALIGNMENT = enum :NK_TEXT_LEFT, 0x10|0x01, # :NK_TEXT_ALIGN_MIDDLE|:NK_TEXT_ALIGN_LEFT,
:NK_TEXT_CENTERED, 0x10|0x02, # :NK_TEXT_ALIGN_MIDDLE|:NK_TEXT_ALIGN_CENTERED,
:NK_TEXT_RIGHT, 0x10|0x04 # :NK_TEXT_ALIGN_MIDDLE|:NK_TEXT_ALIGN_RIGHT
NK_EDIT_FLAGS = enum :NK_EDIT_DEFAULT, 0,
:NK_EDIT_READ_ONLY, (1 << 0),
:NK_EDIT_AUTO_SELECT, (1 << 1),
:NK_EDIT_SIG_ENTER, (1 << 2),
:NK_EDIT_ALLOW_TAB, (1 << 3),
:NK_EDIT_NO_CURSOR, (1 << 4),
:NK_EDIT_SELECTABLE, (1 << 5),
:NK_EDIT_CLIPBOARD, (1 << 6),
:NK_EDIT_CTRL_ENTER_NEWLINE, (1 << 7),
:NK_EDIT_NO_HORIZONTAL_SCROLL, (1 << 8),
:NK_EDIT_ALWAYS_INSERT_MODE, (1 << 9),
:NK_EDIT_MULTILINE, (1 << 11)
NK_EDIT_TYPES = enum :NK_EDIT_SIMPLE, (1 << 9), # :NK_EDIT_ALWAYS_INSERT_MODE,
:NK_EDIT_FIELD, (1 << 9)|(1 << 5), # :NK_EDIT_SIMPLE|:NK_EDIT_SELECTABLE,
:NK_EDIT_BOX, (1 << 9)|(1 << 5)|(1 << 11)|(1 << 3), # :NK_EDIT_ALWAYS_INSERT_MODE| :NK_EDIT_SELECTABLE|:NK_EDIT_MULTILINE|:NK_EDIT_ALLOW_TAB,
:NK_EDIT_EDITOR, (1 << 5)|(1 << 11)|(1 << 3)|(1 << 6) # :NK_EDIT_SELECTABLE|:NK_EDIT_MULTILINE|:NK_EDIT_ALLOW_TAB|:NK_EDIT_CLIPBOARD
NK_EDIT_EVENTS = enum :NK_EDIT_ACTIVE, (1 << 0),
:NK_EDIT_INACTIVE, (1 << 1),
:NK_EDIT_ACTIVATED, (1 << 2),
:NK_EDIT_DEACTIVATED, (1 << 3),
:NK_EDIT_COMMITED, (1 << 4)
NK_PANEL_FLAGS = enum :NK_WINDOW_BORDER, (1 << 0),
:NK_WINDOW_BORDER_HEADER, (1 << 1),
:NK_WINDOW_MOVABLE, (1 << 2),
:NK_WINDOW_SCALABLE, (1 << 3),
:NK_WINDOW_CLOSABLE, (1 << 4),
:NK_WINDOW_MINIMIZABLE, (1 << 5),
:NK_WINDOW_DYNAMIC, (1 << 6),
:NK_WINDOW_NO_SCROLLBAR, (1 << 7),
:NK_WINDOW_TITLE, (1 << 8)
def nk_foreach(ctx, &blk)
cmd = nk__begin(ctx)
while cmd.null? == false
blk.call(ctx, cmd)
cmd = nk__next(ctx, cmd)
end
end
def nk_draw_foreach(ctx, buf, &blk)
cmd = nk__draw_begin(ctx, buf)
while cmd.null? == false
blk.call(cmd)
cmd = nk__draw_next(cmd, buf, ctx)
end
end
#
# MEMORY BUFFER
#
class NK_MEMORY_STATUS < FFI::Struct
layout :memory, :pointer,
:type, :uint32,
:size, :nk_size,
:allocated, :nk_size,
:needed, :nk_size,
:calls, :nk_size
end
NK_ALLOCATION_TYPE = enum :NK_BUFFER_FIXED,
:NK_BUFFER_DYNAMIC
NK_BUFFER_ALLOCATION_TYPE = enum :NK_BUFFER_FRONT,
:NK_BUFFER_BACK,
:NK_BUFFER_MAX
class NK_BUFFER_MARKER < FFI::Struct
layout :active, :int32,
:offset, :nk_size
end
class NK_MEMORY < FFI::Struct
layout :ptr, :pointer,
:size, :nk_size
end
class NK_BUFFER < FFI::Struct
layout :marker, [NK_BUFFER_MARKER, NK_BUFFER_ALLOCATION_TYPE[:NK_BUFFER_MAX]],
:pool, NK_ALLOCATOR,
:type, NK_ALLOCATION_TYPE,
:memory, NK_MEMORY,
:grow_factor, :float,
:allocated, :nk_size,
:needed, :nk_size,
:calls, :nk_size,
:size, :nk_size
end
#
# STRING
#
class NK_STR < FFI::Struct
layout :buffer, NK_BUFFER,
:len, :int32
end
#
# TEXT EDITOR
#
NK_TEXTEDIT_UNDOSTATECOUNT = 99
NK_TEXTEDIT_UNDOCHARCOUNT = 999
class NK_CLIPBOARD < FFI::Struct
layout :userdata, NK_HANDLE,
:paste, :nk_paste_f,
:copy, :nk_copy_f
end
class NK_TEXT_UNDO_RECORD < FFI::Struct
layout :where, :int32,
:insert_length, :short,
:delete_length, :short,
:char_storage, :short
end
class NK_TEXT_UNDO_STATE < FFI::Struct
layout :undo_rec, [NK_TEXT_UNDO_RECORD, NK_TEXTEDIT_UNDOSTATECOUNT],
:undo_char, [:nk_rune, NK_TEXTEDIT_UNDOCHARCOUNT],
:undo_point, :short,
:redo_point, :short,
:undo_char_point, :short,
:redo_char_point, :short
end
NK_TEXT_EDIT_TYPE = enum :NK_TEXT_EDIT_SINGLE_LINE,
:NK_TEXT_EDIT_MULTI_LINE
NK_TEXT_EDIT_MODE = enum :NK_TEXT_EDIT_MODE_VIEW,
:NK_TEXT_EDIT_MODE_INSERT,
:NK_TEXT_EDIT_MODE_REPLACE
class NK_TEXT_EDIT < FFI::Struct
layout :clip, NK_CLIPBOARD,
:string, NK_STR,
:filter, :nk_filter,
:scrollbar, NK_VEC2,
:cursor, :int32,
:select_start, :int32,
:select_end, :int32,
:mode, :uint8,
:cursor_at_end_of_line, :uint8,
:initialized, :uint8,
:has_preferred_x, :uint8,
:single_line, :uint8,
:active, :uint8,
:padding1, :uint8,
:preferred_x, :float,
:undo, NK_TEXT_UNDO_STATE
end
#
# FONT
#
callback :nk_text_width_f, [NK_HANDLE, :float, :pointer, :int32], :float
callback :nk_query_font_glyph_f, [NK_HANDLE, :float, :pointer, :nk_rune, :nk_rune], :float
class NK_USER_FONT_GLYPH < FFI::Struct
layout :uv, [NK_VEC2, 2],
:offset, NK_VEC2,
:width, :float,
:height, :float,
:xadvance, :float
end
class NK_USER_FONT < FFI::Struct
layout :userdata, NK_HANDLE,
:height, :float,
:width, :nk_text_width_f,
:query, :nk_query_font_glyph_f, # NOTE : available only if NK_INCLUDE_VERTEX_BUFFER_OUTPUT is defined.
:texture, NK_HANDLE # NOTE : available only if NK_INCLUDE_VERTEX_BUFFER_OUTPUT is defined.
end
# /// NOTE : The section below is available only if NK_INCLUDE_FONT_BAKING is defined. \\\
NK_FONT_COORD_TYPE = enum :NK_COORD_UV,
:NK_COORD_PIXEL
class NK_BAKED_FONT < FFI::Struct
layout :height, :float,
:ascent, :float,
:descent, :float,
:glyph_offset, :nk_rune,
:glyph_count, :nk_rune,
:ranges, :pointer # const nk_rune *ranges;
end
class NK_FONT_CONFIG < FFI::Struct
layout :ttf_blob, :pointer,
:ttf_size, :nk_size,
:ttf_data_owned_by_atlas, :uint8,
:merge_mode, :uint8,
:pixel_snap, :uint8,
:oversample_v, :uint8,
:oversample_h, :uint8,
:padding, [:uint8, 3],
:size, :float,
:coord_type, NK_FONT_COORD_TYPE,
:sapcing, NK_VEC2,
:range, :pointer, # const nk_rune *range;
:font, :pointer, # struct nk_baked_font *font;
:fallback_glyph, :nk_rune
end
class NK_FONT_GLYPH < FFI::Struct
layout :codepoint, :nk_rune,
:xadvance, :float,
:x0, :float,
:y0, :float,
:x1, :float,
:y1, :float,
:w, :float,
:h, :float,
:u0, :float,
:v0, :float,
:u1, :float,
:v1, :float
end
class NK_FONT < FFI::Struct
layout :handle, NK_USER_FONT,
:info, NK_BAKED_FONT,
:scale, :float,
:glyphs, :pointer, # struct nk_font_glyph *glyphs;
:fallback, :pointer, # const struct nk_font_glyph *fallback;
:fallback_codepoint, :nk_rune,
:texture, NK_HANDLE,
:config, :int32
end
NK_FONT_ATLAS_FORMAT = enum :NK_FONT_ATLAS_ALPHA8,
:NK_FONT_ATLAS_RGBA32
class NK_FONT_ATLAS < FFI::Struct
layout :pixel, :pointer,
:tex_width, :int32,
:tex_height, :int32,
:permanent, NK_ALLOCATOR,
:temporary, NK_ALLOCATOR,
:custom, NK_RECTI,
:glyph_count, :int32,
:default_font, :pointer, # struct nk_font *default_font;
:glyphs, :pointer, # struct nk_font_glyph *glyphs;
:fonts, :pointer, # struct nk_font **fonts;
:config, :pointer, # struct nk_font_config *config;
:font_num, :int32,
:font_cap, :int32
end
# Font Atlas
# Font
# Font Baking
# \\\ NOTE : The section above is available only if NK_INCLUDE_FONT_BAKING is defined. ///
#
# DRAWING
#
NK_COMMAND_TYPE = enum :NK_COMMAND_NOP,
:NK_COMMAND_SCISSOR,
:NK_COMMAND_LINE,
:NK_COMMAND_CURVE,
:NK_COMMAND_RECT,
:NK_COMMAND_RECT_FILLED,
:NK_COMMAND_RECT_MULTI_COLOR,
:NK_COMMAND_CIRCLE,
:NK_COMMAND_CIRCLE_FILLED,
:NK_COMMAND_ARC,
:NK_COMMAND_ARC_FILLED,
:NK_COMMAND_TRIANGLE,
:NK_COMMAND_TRIANGLE_FILLED,
:NK_COMMAND_POLYGON,
:NK_COMMAND_POLYGON_FILLED,
:NK_COMMAND_POLYLINE,
:NK_COMMAND_TEXT,
:NK_COMMAND_IMAGE
class NK_COMMAND < FFI::Struct
layout :type, NK_COMMAND_TYPE,
:next, :nk_size,
:userdata, NK_HANDLE # NOTE : available only if NK_INCLUDE_COMMAND_USERDATA is defined.
end
class NK_COMMAND_SCISSOR < FFI::Struct
layout :header, NK_COMMAND,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort
end
class NK_COMMAND_LINE < FFI::Struct
layout :header, NK_COMMAND,
:line_thickness, :ushort,
:begin, NK_VEC2I,
:end, NK_VEC2I,
:color, NK_COLOR
end
class NK_COMMAND_CURVE < FFI::Struct
layout :header, NK_COMMAND,
:line_thickness, :ushort,
:begin, NK_VEC2I,
:end, NK_VEC2I,
:ctrl, [NK_VEC2I, 2],
:color, NK_COLOR
end
class NK_COMMAND_RECT < FFI::Struct
layout :header, NK_COMMAND,
:rounding, :ushort,
:line_thickness, :ushort,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort,
:color, NK_COLOR
end
class NK_COMMAND_RECT_FILLED < FFI::Struct
layout :header, NK_COMMAND,
:rounding, :ushort,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort,
:color, NK_COLOR
end
class NK_COMMAND_RECT_MULTI_COLOR < FFI::Struct
layout :header, NK_COMMAND,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort,
:left, NK_COLOR,
:top, NK_COLOR,
:bottom, NK_COLOR,
:right, NK_COLOR
end
class NK_COMMAND_TRIANGLE < FFI::Struct
layout :header, NK_COMMAND,
:line_thickness, :ushort,
:a, NK_VEC2I,
:b, NK_VEC2I,
:c, NK_VEC2I,
:color, NK_COLOR
end
class NK_COMMAND_TRIANGLE_FILLED < FFI::Struct
layout :header, NK_COMMAND,
:a, NK_VEC2I,
:b, NK_VEC2I,
:c, NK_VEC2I,
:color, NK_COLOR
end
class NK_COMMAND_CIRCLE < FFI::Struct
layout :header, NK_COMMAND,
:x, :short,
:y, :short,
:line_thickness, :ushort,
:w, :ushort,
:h, :ushort,
:color, NK_COLOR
end
class NK_COMMAND_CIRCLE_FILLED < FFI::Struct
layout :header, NK_COMMAND,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort,
:color, NK_COLOR
end
class NK_COMMAND_ARC < FFI::Struct
layout :header, NK_COMMAND,
:cx, :short,
:cy, :short,
:r, :ushort,
:line_thickness, :ushort,
:a, [:float, 2],
:color, NK_COLOR
end
class NK_COMMAND_ARC_FILLED < FFI::Struct
layout :header, NK_COMMAND,
:cx, :short,
:cy, :short,
:r, :ushort,
:a, [:float, 2],
:color, NK_COLOR
end
class NK_COMMAND_POLYGON < FFI::Struct
layout :header, NK_COMMAND,
:color, NK_COLOR,
:line_thickness, :ushort,
:point_count, :ushort,
:points, :pointer # NOTE : Originally defined here is 'struct nk_vec2i points[1];'.
end
class NK_COMMAND_POLYGON_FILLED < FFI::Struct
layout :header, NK_COMMAND,
:color, NK_COLOR,
:point_count, :ushort,
:points, :pointer # NOTE : Originally defined here is 'struct nk_vec2i points[1];'.
end
class NK_COMMAND_POLYLINE < FFI::Struct
layout :header, NK_COMMAND,
:color, NK_COLOR,
:line_thickness, :ushort,
:point_count, :ushort,
:points, :pointer # NOTE : Originally defined here is 'struct nk_vec2i points[1];'.
end
class NK_COMMAND_IMAGE < FFI::Struct
layout :header, NK_COMMAND,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort,
:img, NK_IMAGE
end
class NK_COMMAND_TEXT < FFI::Struct
layout :header, NK_COMMAND,
:font, :pointer, # const struct nk_user_font *font;
:background, NK_COLOR,
:foreground, NK_COLOR,
:x, :short,
:y, :short,
:w, :ushort,
:h, :ushort,
:height, :float,
:length, :int32,
:strng, :pointer # NOTE : Originally defined here is 'char string[1];'.
end
NK_COMMAND_CLIPPING = enum :NK_CLIPPING_OFF, NK_FALSE,
:NK_CLIPPING_ON, NK_TRUE
class NK_COMMAND_BUFFER < FFI::Struct
layout :base, :pointer, # struct nk_buffer *base;
:clip, NK_RECT,
:use_clipping, :int32,
:userdata, NK_HANDLE,
:begin, :nk_size,
:end, :nk_size,
:last, :nk_size
end
#
# INPUT
#
class NK_MOUSE_BUTTON < FFI::Struct
layout :down, :int32,
:clicked, :uint32,
:clicked_pos, NK_VEC2
end
class NK_MOUSE < FFI::Struct
layout :buttons, [NK_MOUSE_BUTTON, NK_BUTTONS[:NK_BUTTON_MAX]],
:pos, NK_VEC2,
:prev, NK_VEC2,
:delta, NK_VEC2,
:scroll_delta, :float,
:grab, :uint8,
:grabbed, :uint8,
:ungrab, :uint8
end
class NK_KEY < FFI::Struct
layout :down, :int32,
:clicked, :uint32
end
class NK_KEYBOARD < FFI::Struct
layout :keys, [NK_KEY, NK_KEYS[:NK_KEY_MAX]],
:text, [:int8, NK_INPUT_MAX],
:text_en, :int32
end
class NK_INPUT < FFI::Struct
layout :keyboard, NK_KEYBOARD,
:mouse, NK_MOUSE
end
#
# DRAW LIST
#
# /// NOTE : The section below is available only if NK_INCLUDE_FONT_BAKING is defined. \\\
typedef :ushort, :nk_draw_index
typedef :nk_uint, :nk_draw_vertex_color
NK_DRAW_LIST_STROKE = enum :NK_STROKE_OPEN, NK_FALSE,
:NK_STROKE_CLOSED, NK_TRUE
class NK_DRAW_VERTEX < FFI::Struct
layout :position, NK_VEC2,
:uv, NK_VEC2,
:col, :nk_draw_vertex_color
end
class NK_DRAW_COMMAND < FFI::Struct
layout :elem_count, :uint32,
:clip_rect, NK_RECT,
:texture, NK_HANDLE
end
class NK_DRAW_LIST < FFI::Struct
layout :global_alpha, :float,
:shape_AA, NK_ANTI_ALIASING,
:line_AA, NK_ANTI_ALIASING,
:null, NK_DRAW_NULL_TEXTURE,
:clip_rect, NK_RECT,
:buffer, :pointer, # NK_BUFFER
:vertices, :pointer, # NK_BUFFER
:elements, :pointer, # NK_BUFFER
:element_count, :uint32,
:vertex_count, :uint32,
:cmd_offset, :nk_size,
:cmd_count, :uint32,
:path_count, :uint32,
:path_offset, :uint32,
:circle_vtx, [NK_VEC2, 12]
end
# \\\ NOTE : The section above is available only if NK_INCLUDE_FONT_BAKING is defined. ///
#
# GUI
#
NK_STYLE_ITEM_TYPE = enum :NK_STYLE_ITEM_COLOR,
:NK_STYLE_ITEM_IMAGE
class NK_STYLE_ITEM_DATA < FFI::Union
layout :image, NK_IMAGE,
:color, NK_COLOR
end
class NK_STYLE_ITEM < FFI::Struct
layout :type, NK_STYLE_ITEM_TYPE,
:data, NK_STYLE_ITEM_DATA
end
class NK_STYLE_TEXT < FFI::Struct
layout :color, NK_COLOR,
:padding, NK_VEC2
end
callback :nk_draw_begin_f, [:pointer, NK_HANDLE], :void # Added for Ruby
callback :nk_draw_end_f, [:pointer, NK_HANDLE], :void # Added for Ruby
class NK_STYLE_BUTTON < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:text_background, NK_COLOR,
:text_normal, NK_COLOR,
:text_hover, NK_COLOR,
:text_active, NK_COLOR,
:text_alignment, :nk_flags,
#
:border, :float,
:rounding, :float,
:padding, NK_VEC2,
:image_padding, NK_VEC2,
:touch_padding, NK_VEC2,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_TOGGLE < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:cursor_normal, NK_STYLE_ITEM,
:cursor_hover, NK_STYLE_ITEM,
#
:text_normal, NK_COLOR,
:text_hover, NK_COLOR,
:text_active, NK_COLOR,
:text_background, NK_COLOR,
:text_alignment, :nk_flags,
#
:padding, NK_VEC2,
:touch_padding, NK_VEC2,
:spacing, :float,
:border, :float,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_SELECTABLE < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:pressed, NK_STYLE_ITEM,
#
:normal_active, NK_STYLE_ITEM,
:hover_active, NK_STYLE_ITEM,
:pressed_active, NK_STYLE_ITEM,
#
:text_normal, NK_COLOR,
:text_hover, NK_COLOR,
:text_pressed, NK_COLOR,
#
:text_normal_active, NK_COLOR,
:text_hover_active, NK_COLOR,
:text_pressed_active, NK_COLOR,
:text_background, NK_COLOR,
:text_alignment, :nk_flags,
#
:rounding, :float,
:padding, NK_VEC2,
:touch_padding, NK_VEC2,
:image_padding, NK_VEC2,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_SLIDER < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:bar_normal, NK_COLOR,
:bar_hover, NK_COLOR,
:bar_active, NK_COLOR,
:bar_filled, NK_COLOR,
#
:cursor_normal, NK_STYLE_ITEM,
:cursor_hover, NK_STYLE_ITEM,
:cursor_active, NK_STYLE_ITEM,
#
:border, :float,
:rounding, :float,
:bar_height, :float,
:padding, NK_VEC2,
:spacing, NK_VEC2,
:cursor_size, NK_VEC2,
#
:show_buttons, :int32,
:inc_button, NK_STYLE_BUTTON,
:dec_button, NK_STYLE_BUTTON,
:inc_symbol, NK_SYMBOL_TYPE,
:dec_symbol, NK_SYMBOL_TYPE,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_PROGRESS < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:cursor_normal, NK_STYLE_ITEM,
:cursor_hover, NK_STYLE_ITEM,
:cursor_active, NK_STYLE_ITEM,
:cursor_border_color, NK_COLOR,
#
:rounding, :float,
:border, :float,
:cursor_border, :float,
:cursor_rounding, :float,
:padding, NK_VEC2,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_SCROLLBAR < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:cursor_normal, NK_STYLE_ITEM,
:cursor_hover, NK_STYLE_ITEM,
:cursor_active, NK_STYLE_ITEM,
:cursor_border_color, NK_COLOR,
#
:border, :float,
:rounding, :float,
:border_cursor, :float,
:rounding_cursor, :float,
:padding, NK_VEC2,
#
:show_buttons, :int32,
:inc_button, NK_STYLE_BUTTON,
:dec_button, NK_STYLE_BUTTON,
:inc_symbol, NK_SYMBOL_TYPE,
:dec_symbol, NK_SYMBOL_TYPE,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_EDIT < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
:scrollbar, NK_STYLE_SCROLLBAR,
#
:cursor_normal, NK_COLOR,
:cursor_hover, NK_COLOR,
:cursor_text_normal, NK_COLOR,
:cursor_text_hover, NK_COLOR,
#
:text_normal, NK_COLOR,
:text_hover, NK_COLOR,
:text_active, NK_COLOR,
#
:selected_normal, NK_COLOR,
:selected_hover, NK_COLOR,
:selected_text_normal, NK_COLOR,
:selected_text_hover, NK_COLOR,
#
:border, :float,
:rounding, :float,
:cursor_size, :float,
:scrollbar_size, NK_VEC2,
:padding, NK_VEC2,
:row_padding, :float
end
class NK_STYLE_PROPERTY < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:label_normal, NK_COLOR,
:label_hover, NK_COLOR,
:label_active, NK_COLOR,
#
:sym_left, NK_SYMBOL_TYPE,
:sym_right, NK_SYMBOL_TYPE,
#
:border, :float,
:rounding, :float,
:padding, NK_VEC2,
#
:edit, NK_STYLE_EDIT,
:inc_button, NK_STYLE_BUTTON,
:dec_button, NK_STYLE_BUTTON,
#
:userdata, NK_HANDLE,
:draw_begin, :nk_draw_begin_f,
:draw_end, :nk_draw_end_f
end
class NK_STYLE_CHART < FFI::Struct
layout :background, NK_STYLE_ITEM,
:border_color, NK_COLOR,
:selected_color, NK_COLOR,
:color, NK_COLOR,
#
:border, :float,
:rounding, :float,
:padding, NK_VEC2
end
class NK_STYLE_COMBO < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
:border_color, NK_COLOR,
#
:label_normal, NK_COLOR,
:label_hover, NK_COLOR,
:label_active, NK_COLOR,
#
:symbol_normal, NK_COLOR,
:symbol_hover, NK_COLOR,
:symbol_active, NK_COLOR,
#
:button, NK_STYLE_BUTTON,
:sym_normal, NK_SYMBOL_TYPE,
:sym_hover, NK_SYMBOL_TYPE,
:sym_active, NK_SYMBOL_TYPE,
#
:border, :float,
:rounding, :float,
:content_padding, NK_VEC2,
:border_padding, NK_VEC2,
:spacing, NK_VEC2
end
class NK_STYLE_TAB < FFI::Struct
layout :background, NK_STYLE_ITEM,
:border_color, NK_COLOR,
:text, NK_COLOR,
#
:tab_maximize_button, NK_STYLE_BUTTON,
:tab_minimize_button, NK_STYLE_BUTTON,
:node_maximize_button, NK_STYLE_BUTTON,
:node_minimize_button, NK_STYLE_BUTTON,
:sym_minimize, NK_SYMBOL_TYPE,
:sym_maximize, NK_SYMBOL_TYPE,
#
:border, :float,
:rounding, :float,
:indent, :float,
:padding, NK_VEC2,
:spacing, NK_VEC2
end
NK_STYLE_HEADER_ALIGN = enum :NK_HEADER_LEFT,
:NK_HEADER_RIGHT
class NK_STYLE_WINDOW_HEADER < FFI::Struct
layout :normal, NK_STYLE_ITEM,
:hover, NK_STYLE_ITEM,
:active, NK_STYLE_ITEM,
#
:close_button, NK_STYLE_BUTTON,
:minimize_button, NK_STYLE_BUTTON,
:close_symbol, NK_SYMBOL_TYPE,
:minimize_symbol, NK_SYMBOL_TYPE,
:maximize_symbol, NK_SYMBOL_TYPE,
#
:label_normal, NK_COLOR,
:label_hover, NK_COLOR,
:label_active, NK_COLOR,
#
:align, NK_STYLE_HEADER_ALIGN,
:padding, NK_VEC2,
:label_padding, NK_VEC2,
:spacing, NK_VEC2
end
class NK_STYLE_WINDOW < FFI::Struct
layout :header, NK_STYLE_WINDOW_HEADER,
:fixed_background, NK_STYLE_ITEM,
:background, NK_COLOR,
#
:border_color, NK_COLOR,
:combo_border_color, NK_COLOR,
:contextual_border_color, NK_COLOR,
:menu_border_color, NK_COLOR,
:group_border_color, NK_COLOR,
:tooltip_border_color, NK_COLOR,
#
:scaler, NK_STYLE_ITEM,
:footer_padding, NK_VEC2,
#
:border, :float,
:combo_border, :float,
:contextual_border, :float,
:menu_border, :float,
:group_border, :float,
:tooltip_border, :float,
#
:rounding, :float,
:scaler_size, NK_VEC2,
:padding, NK_VEC2,
:spacing, NK_VEC2,
:scrollbar_size, NK_VEC2,
:min_size, NK_VEC2
end
class NK_STYLE < FFI::Struct
layout :font , NK_USER_FONT,
:text , NK_STYLE_TEXT,
:button , NK_STYLE_BUTTON,
:contextual_button , NK_STYLE_BUTTON,
:menu_button , NK_STYLE_BUTTON,
:option , NK_STYLE_TOGGLE,
:checkbox , NK_STYLE_TOGGLE,
:selectable , NK_STYLE_SELECTABLE,
:slider , NK_STYLE_SLIDER,
:progress , NK_STYLE_PROGRESS,
:property , NK_STYLE_PROPERTY,
:edit , NK_STYLE_EDIT,
:chart , NK_STYLE_CHART,
:scrollh , NK_STYLE_SCROLLBAR,
:scrollv , NK_STYLE_SCROLLBAR,
:tab , NK_STYLE_TAB,
:combo , NK_STYLE_COMBO,
:window , NK_STYLE_WINDOW
end
#
# PANEL
#
NK_CHART_MAX_SLOT = 4
class NK_CHART_SLOT < FFI::Struct
layout :type, NK_CHART_TYPE,
:color, NK_COLOR,
:highlight, NK_COLOR,
:min, :float,
:max, :float,
:range, :float,
:count, :int32,
:last, NK_VEC2,
:index, :int32
end
class NK_CHART < FFI::Struct
layout :slots, [NK_CHART_SLOT, NK_CHART_MAX_SLOT],
:slot, :int32,
:x, :float,
:y, :float,
:w, :float,
:h, :float
end
class NK_ROW_LAYOUT < FFI::Struct
layout :type, :int32,
:index, :int32,
:height, :float,
:columns, :int32,
:ratio, :pointer,
:item_width, :float,
:item_height,:float,
:item_offset, :float,
:filled, :float,
:item, NK_RECT,
:tree_depth, :int32
end
class NK_POPUP_BUFFER < FFI::Struct
layout :begin, :nk_size,
:parent, :nk_size,
:last, :nk_size,
:end, :nk_size,
:active, :int32
end
class NK_MENU_STATE < FFI::Struct
layout :x, :float,
:y, :float,
:w, :float,
:h, :float,
:offset, NK_SCROLL
end
class NK_PANEL < FFI::Struct
layout :flags, :nk_flags,
:bounds, NK_RECT,
:offset, :pointer, # struct nk_scroll *offset;
:at_x, :float,
:at_y, :float,
:max_x, :float,
:width, :float,
:height, :float,
:footer_h, :float,
:header_h, :float,
:border, :float,
:has_scrolling, :uint32,
:clip, NK_RECT,
:menu, NK_MENU_STATE,
:row, NK_ROW_LAYOUT,
:chart, NK_CHART,
:popup_buffer, NK_POPUP_BUFFER,
:buffer, :pointer, # struct nk_command_buffer *buffer;
:parent, :pointer # struct nk_panel *parent;
end
#
# WINDOW
#
#
# CONTEXT
#
class NK_CONTEXT < FFI::Struct
layout :input, NK_INPUT,
:style, NK_STYLE,
:memory, NK_BUFFER,
:clip, NK_CLIPBOARD,
:last_widget_state, :nk_flags,
#
:draw_list, NK_DRAW_LIST, # NOTE : available only if NK_INCLUDE_VERTEX_BUFFER_OUTPUT is defined.
:text_edit, NK_TEXT_EDIT,
#
:build, :int32,
:pool, :pointer,
:begin, :pointer, # struct nk_window *
:end, :pointer, # struct nk_window *
:active, :pointer, # struct nk_window *
:current, :pointer, # struct nk_window *
:freelist, :pointer, # struct nk_page_element *
:count, :uint32,
:seq, :uint32
end
#
# Load native library.
#
@@nuklear_import_done = false
def self.load_lib(libpath = './libnuklear.dylib')
# ffi_lib_flags :now, :global # to force FFI to access nvgCreateInternal from nvgCreateGL2
ffi_lib libpath
import_symbols() unless @@nuklear_import_done
end
def self.import_symbols()
#
# API
#
# context
attach_function :nk_init_default, [:pointer, :pointer], :int # Note : NK_INCLUDE_DEFAULT_ALLOCATOR
attach_function :nk_init_fixed, [:pointer, :pointer, :nk_size, :pointer], :int32
attach_function :nk_init_custom, [:pointer, :pointer, :pointer, :pointer], :int32
attach_function :nk_init, [:pointer, :pointer, :pointer], :int32
attach_function :nk_clear, [:pointer], :void
attach_function :nk_free, [:pointer], :void
# window
attach_function :nk_begin, [:pointer, :pointer, :pointer, NK_RECT.by_value, :nk_flags], :int32
attach_function :nk_end, [:pointer], :void
# Layout
# Layout: Group
# Layout: Tree
# Widgets
# Widgets: Buttons
# Widgets: Checkbox
# Widgets: Radio
# Widgets: Selectable
# Widgets: Slider
# Widgets: Prograssbar
# Widgets: Color picker
# Widgets: Property
# Widgets: TextEdit
# Chart
# Popups
# Combobox
# Combobox: abstract
# Contextual
# Tooltip
# Menu
# Drawing
attach_function :nk_convert, [:pointer, :pointer, :pointer, :pointer, :pointer], :void # Note : NK_INCLUDE_VERTEX_BUFFER_OUTPUT
# User Input
# Style
attach_function :nk_style_default, [:pointer], :void
attach_function :nk_style_from_table, [:pointer, :pointer], :void
attach_function :nk_style_color_name, [NK_STYLE_COLORS], :pointer
attach_function :nk_style_set_font, [:pointer, :pointer], :void
# Utilities
# base widget function
# color (conversion user --> nuklear)
# color (conversion nuklear --> user)
# image
attach_function :nk_handle_ptr, [:pointer], NK_HANDLE
attach_function :nk_handle_id, [:int32], NK_HANDLE
# math
# string
# UTF-8
#
# MEMORY BUFFER
#
attach_function :nk_buffer_init_default, [:pointer], :void
attach_function :nk_buffer_init, [:pointer, :pointer, :nk_size], :void
attach_function :nk_buffer_init_fixed, [:pointer, :pointer, :nk_size], :void
attach_function :nk_buffer_info, [:pointer, :pointer], :void
attach_function :nk_buffer_push, [:pointer, NK_BUFFER_ALLOCATION_TYPE, :pointer, :nk_size, :nk_size], :void
attach_function :nk_buffer_mark, [:pointer, NK_BUFFER_ALLOCATION_TYPE], :void
attach_function :nk_buffer_reset, [:pointer, NK_BUFFER_ALLOCATION_TYPE], :void
attach_function :nk_buffer_clear, [:pointer], :void
attach_function :nk_buffer_free, [:pointer], :void
attach_function :nk_buffer_memory, [:pointer], :pointer
attach_function :nk_buffer_memory_const, [:pointer], :pointer
attach_function :nk_buffer_total, [:pointer], :nk_size
#
# STRING
#
#
# TEXT EDITOR
#
#
# FONT
#
attach_function :nk_font_atlas_init_default, [:pointer], :void # Note : NK_INCLUDE_DEFAULT_ALLOCATOR
attach_function :nk_font_atlas_init, [:pointer, :pointer], :void
attach_function :nk_font_atlas_init_custom, [:pointer, :pointer, :pointer], :void
attach_function :nk_font_atlas_begin, [:pointer], :void
attach_function :nk_font_config, [:float], NK_FONT_CONFIG
attach_function :nk_font_atlas_add, [:pointer, :pointer], :pointer
attach_function :nk_font_atlas_add_default, [:pointer, :float, :pointer], :pointer # Note : NK_INCLUDE_DEFAULT_FONT
attach_function :nk_font_atlas_add_from_memory, [:pointer, :pointer, :nk_size, :float, :pointer], :pointer
attach_function :nk_font_atlas_add_compressed, [:pointer, :pointer, :nk_size, :float, :pointer], :pointer
attach_function :nk_font_atlas_add_compressed_base85, [:pointer, :pointer, :float, :pointer], :pointer
attach_function :nk_font_atlas_bake, [:pointer, :pointer, :pointer, NK_FONT_ATLAS_FORMAT], :pointer
attach_function :nk_font_atlas_end, [:pointer, NK_HANDLE, :pointer], :void
attach_function :nk_font_atlas_clear, [:pointer], :void
#
# DRAWING
#
# misc
attach_function :nk_push_scissor, [:pointer, NK_RECT.by_value], :void
attach_function :nk_draw_image, [:pointer, NK_RECT.by_value, :pointer], :void
attach_function :nk_draw_text, [:pointer, NK_RECT.by_value, :pointer, :int32, :pointer, NK_COLOR.by_value, NK_COLOR.by_value], :void
attach_function :nk__next, [:pointer, :pointer], :pointer
attach_function :nk__begin, [:pointer], :pointer
#
# INPUT
#
#
# DRAW LIST
#
# draw list
attach_function :nk_draw_list_init, [:pointer], :void
attach_function :nk_draw_list_setup, [:pointer, :float, NK_ANTI_ALIASING, NK_ANTI_ALIASING, NK_DRAW_NULL_TEXTURE, :pointer, :pointer, :pointer], :void
attach_function :nk_draw_list_clear, [:pointer], :void
# drawing
attach_function :nk__draw_list_begin, [:pointer, :pointer], :pointer
attach_function :nk__draw_list_next, [:pointer, :pointer, :pointer], :pointer
attach_function :nk__draw_begin, [:pointer, :pointer], :pointer
attach_function :nk__draw_next, [:pointer, :pointer, :pointer], :pointer
# path
attach_function :nk_draw_list_path_clear, [:pointer], :void
attach_function :nk_draw_list_path_line_to, [:pointer, NK_VEC2.by_value], :void
attach_function :nk_draw_list_path_arc_to_fast, [:pointer, NK_VEC2.by_value, :float, :int32, :int32], :void
attach_function :nk_draw_list_path_arc_to, [:pointer, NK_VEC2.by_value, :float, :float, :float, :uint32], :void
attach_function :nk_draw_list_path_rect_to, [:pointer, NK_VEC2.by_value, NK_VEC2.by_value, :float], :void
attach_function :nk_draw_list_path_curve_to, [:pointer, NK_VEC2.by_value, NK_VEC2.by_value, NK_VEC2.by_value, :uint32], :void
attach_function :nk_draw_list_path_fill, [:pointer, NK_COLOR.by_value], :void
attach_function :nk_draw_list_path_stroke, [:pointer, NK_COLOR.by_value, NK_DRAW_LIST_STROKE, :float], :void
# stroke
attach_function :nk_draw_list_stroke_line, [:pointer, NK_VEC2.by_value, NK_VEC2.by_value, NK_COLOR.by_value, :float], :void
attach_function :nk_draw_list_stroke_rect, [:pointer, NK_RECT.by_value, NK_COLOR.by_value, :float, :float], :void
attach_function :nk_draw_list_stroke_triangle, [:pointer, NK_VEC2.by_value, NK_VEC2.by_value, NK_VEC2.by_value, NK_COLOR.by_value, :float], :void
attach_function :nk_draw_list_stroke_circle, [:pointer, NK_VEC2.by_value, :float, NK_COLOR.by_value, :uint32, :float], :void
attach_function :nk_draw_list_stroke_curve, [:pointer, NK_VEC2.by_value, NK_VEC2.by_value, NK_VEC2.by_value, NK_VEC2.by_value, NK_COLOR.by_value, :uint32, :float], :void
attach_function :nk_draw_list_stroke_poly_line, [:pointer, NK_VEC2.by_value, :uint32, NK_COLOR.by_value, NK_DRAW_LIST_STROKE, :float, NK_ANTI_ALIASING], :void
# fill
attach_function :nk_draw_list_fill_rect, [:pointer, NK_RECT.by_value, NK_COLOR.by_value, :float], :void
attach_function :nk_draw_list_fill_rect_multi_color, [:pointer, NK_RECT.by_value, NK_COLOR.by_value, NK_COLOR.by_value, NK_COLOR.by_value, NK_COLOR.by_value], :void
attach_function :nk_draw_list_fill_triangle, [:pointer, NK_VEC2.by_value, NK_VEC2.by_value, NK_VEC2.by_value, NK_COLOR.by_value], :void
attach_function :nk_draw_list_fill_circle, [:pointer, NK_VEC2.by_value, :float, NK_COLOR.by_value, :uint32], :void
attach_function :nk_draw_list_fill_poly_convex, [:pointer, NK_VEC2.by_value, :uint32, NK_COLOR.by_value, NK_ANTI_ALIASING], :void
# misc
attach_function :nk_draw_list_add_image, [:pointer, NK_IMAGE.by_value, NK_RECT.by_value, NK_COLOR.by_value], :void
attach_function :nk_draw_list_add_text, [:pointer, :pointer, NK_RECT.by_value, :pointer, :int32, :float, NK_COLOR.by_value], :void
#
# GUI
#
@@nuklear_import_done = true
end
end
=begin
Nuklear-Bindings : A Ruby bindings of Nuklear
Copyright (c) 2016 vaiorabbit
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source
distribution.
=end
require 'opengl'
require 'glfw'
require_relative '../nuklear'
OpenGL.load_lib()
GLFW.load_lib()
Nuklear.load_lib('libnuklear.dylib')
include OpenGL
include GLFW
include Nuklear
# Press ESC to exit.
key_callback = GLFW::create_callback(:GLFWkeyfun) do |window_handle, key, scancode, action, mods|
if key == GLFW_KEY_ESCAPE && action == GLFW_PRESS
glfwSetWindowShouldClose(window_handle, 1)
end
end
if __FILE__ == $0
glfwInit()
window = glfwCreateWindow( 640, 480, "Simple example", nil, nil )
glfwMakeContextCurrent( window )
glfwSetKeyCallback( window, key_callback )
nulldev = NK_DRAW_NULL_TEXTURE.new
ctx = NK_CONTEXT.new
nk_init_default(ctx, nil)
cmds = NK_BUFFER.new
nk_buffer_init_default(cmds)
atlas = NK_FONT_ATLAS.new
nk_font_atlas_init_default(atlas)
nk_font_atlas_begin(atlas)
w = ' ' * 4
h = ' ' * 4
image = nk_font_atlas_bake(atlas, w, h, NK_FONT_ATLAS_FORMAT[:NK_FONT_ATLAS_RGBA32])
font_tex = ' ' * 4
glGenTextures(1, font_tex)
glBindTexture(GL_TEXTURE_2D, font_tex.unpack('L')[0])
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w.unpack('L')[0], h.unpack('L')[0], 0, GL_RGBA, GL_UNSIGNED_BYTE, image)
nk_font_atlas_end(atlas, nk_handle_id(font_tex.unpack('L')[0]), nulldev)
if atlas[:default_font].null? == false
fnt = NK_FONT.new(atlas[:default_font])
nk_style_set_font(ctx, fnt[:handle])
end
glClearColor( 0.25, 0.55, 0.85, 0.0 )
while glfwWindowShouldClose( window ) == 0
glfwPollEvents()
# 3D
width_ptr = ' ' * 8
height_ptr = ' ' * 8
glfwGetFramebufferSize(window, width_ptr, height_ptr)
width = width_ptr.unpack('L')[0]
height = height_ptr.unpack('L')[0]
ratio = width.to_f / height.to_f
glViewport(0, 0, width, height)
glClear(GL_COLOR_BUFFER_BIT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(-ratio, ratio, -1.0, 1.0, 1.0, -1.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glRotatef(glfwGetTime() * 50.0, 0.0, 0.0, 1.0)
glBegin(GL_TRIANGLES)
glColor3f(1.0, 0.0, 0.0)
glVertex3f(-0.6, -0.4, 0.0)
glColor3f(0.0, 1.0, 0.0)
glVertex3f(0.6, -0.4, 0.0)
glColor3f(0.0, 0.0, 1.0)
glVertex3f(0.0, 0.6, 0.0)
glEnd()
# 2D
rect = NK_RECT.new
rect[:x] = 50.0
rect[:y] = 50.0
rect[:w] = 230.0
rect[:h] = 250.0
begin
# Setup widgets
layout = NK_PANEL.new
r = nk_begin(ctx, layout, "Nuklear Ruby Bindings", rect,
NK_PANEL_FLAGS[:NK_WINDOW_BORDER]|
NK_PANEL_FLAGS[:NK_WINDOW_MOVABLE]|
NK_PANEL_FLAGS[:NK_WINDOW_SCALABLE]|
NK_PANEL_FLAGS[:NK_WINDOW_MINIMIZABLE]|
NK_PANEL_FLAGS[:NK_WINDOW_TITLE])
if r != 0
# Setup Widgets Here
end
nk_end(ctx)
end
begin
# Render
glPushAttrib(GL_ENABLE_BIT|GL_COLOR_BUFFER_BIT|GL_TRANSFORM_BIT)
glDisable(GL_CULL_FACE)
glDisable(GL_DEPTH_TEST)
glEnable(GL_SCISSOR_TEST)
glEnable(GL_BLEND)
glEnable(GL_TEXTURE_2D)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glViewport(0,0,width,height)
glMatrixMode(GL_PROJECTION)
glPushMatrix()
glLoadIdentity()
glOrtho(0.0, width, height, 0.0, -1.0, 1.0)
glMatrixMode(GL_MODELVIEW)
glPushMatrix()
glLoadIdentity()
glEnableClientState(GL_VERTEX_ARRAY)
glEnableClientState(GL_TEXTURE_COORD_ARRAY)
glEnableClientState(GL_COLOR_ARRAY)
begin
vs = NK_DRAW_VERTEX.size
vp = NK_DRAW_VERTEX.offset_of(:position)
vt = NK_DRAW_VERTEX.offset_of(:uv)
vc = NK_DRAW_VERTEX.offset_of(:col)
config = NK_CONVERT_CONFIG.new
config[:global_alpha] = 1.0
config[:shape_AA] = NK_ANTI_ALIASING[:NK_ANTI_ALIASING_ON]
config[:line_AA] = NK_ANTI_ALIASING[:NK_ANTI_ALIASING_ON]
config[:circle_segment_count] = 22
config[:curve_segment_count] = 22
config[:arc_segment_count] = 22
config[:null] = nulldev
vbuf = NK_BUFFER.new
ebuf = NK_BUFFER.new
nk_buffer_init_default(vbuf)
nk_buffer_init_default(ebuf)
nk_convert(ctx, cmds, vbuf, ebuf, config)
vertices = nk_buffer_memory_const(vbuf)
glVertexPointer(2, GL_FLOAT, vs, (vertices+vp))
glTexCoordPointer(2, GL_FLOAT, vs, (vertices+vt))
glColorPointer(4, GL_UNSIGNED_BYTE, vs, (vertices+vc))
offset = nk_buffer_memory_const(ebuf)
begin
# draw widgets here
nk_draw_foreach(ctx, cmds) do |cmd_ptr|
window_height = 480.0
fb_scale_x = 1.0
fb_scale_y = 1.0
cmd = NK_DRAW_COMMAND.new(cmd_ptr)
next if cmd[:elem_count] == 0
glBindTexture(GL_TEXTURE_2D, cmd[:texture][:id])
glScissor(
(cmd[:clip_rect][:x] * fb_scale_x).to_i,
((window_height - (cmd[:clip_rect][:y] + cmd[:clip_rect][:h])).to_i * fb_scale_y).to_i,
(cmd[:clip_rect][:w] * fb_scale_x).to_i,
(cmd[:clip_rect][:h] * fb_scale_y)).to_i
glDrawElements(GL_TRIANGLES, cmd[:elem_count], GL_UNSIGNED_SHORT, offset);
offset += cmd[:elem_count]
end
end
nk_clear(ctx)
nk_buffer_free(vbuf)
nk_buffer_free(ebuf)
end
glDisableClientState(GL_VERTEX_ARRAY)
glDisableClientState(GL_TEXTURE_COORD_ARRAY)
glDisableClientState(GL_COLOR_ARRAY)
glDisable(GL_CULL_FACE)
glDisable(GL_DEPTH_TEST)
glDisable(GL_SCISSOR_TEST)
glDisable(GL_BLEND)
glDisable(GL_TEXTURE_2D)
glBindTexture(GL_TEXTURE_2D, 0)
glMatrixMode(GL_MODELVIEW)
glPopMatrix()
glMatrixMode(GL_PROJECTION)
glPopMatrix()
glPopAttrib()
end
glfwSwapBuffers( window )
end
nk_buffer_free(cmds)
nk_free(ctx)
glfwDestroyWindow( window )
glfwTerminate()
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment