Advertisement
Guest User

Untitled

a guest
Feb 21st, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.04 KB | None | 0 0
  1. import bgfx, nuklear, glfw3 as glfw
  2.  
  3. import vs_nuklear_texture
  4. import fs_nuklear_texture
  5.  
  6. import ../../graphics, ../../fpumath
  7.  
  8. import ../../font/robotomono_regular.nim
  9.  
  10. const MAX_VERTEX_BUFFER_SIZE = 512 * 1024
  11. const MAX_INDEX_BUFFER_SIZE = 128 * 1024
  12.  
  13. template offsetof(typ, field): untyped = (var dummy: typ; cast[uint](addr(dummy.field)) - cast[uint](addr(dummy)))
  14.  
  15. template alignof(typ) : uint =
  16. if sizeof(typ) > 1:
  17. offsetof(tuple[c: char, x: typ], x)
  18. else:
  19. 1
  20.  
  21. type
  22. nk_bgfx_vertex* = object
  23. position: array[2, cfloat]
  24. uv: array[2, cfloat]
  25. col: array[4, nk_byte]
  26.  
  27. type
  28. NuklearBGFXDevice = object
  29. cmds: nk_buffer
  30. vsh: ShaderHandle
  31. fsh: ShaderHandle
  32. sph: ProgramHandle
  33. vdecl: ptr VertexDecl
  34. uh: UniformHandle
  35. vbh: DynamicVertexBufferHandle
  36. ibh: DynamicIndexBufferHandle
  37. cc: nk_convert_config
  38. null: nk_draw_null_texture
  39. fah: TextureHandle
  40. vb: nk_buffer
  41. ib: nk_buffer
  42.  
  43. NuklearBGFX* = object
  44. ctx*: nk_context
  45. dev*: NuklearBGFXDevice
  46. fa*: nk_font_atlas
  47.  
  48. proc nk_bgfx_init*(nkbgfx: ptr NuklearBGFX) =
  49. nk_buffer_init_default(addr nkbgfx.dev.cmds)
  50. nkbgfx.dev.vsh = CreateShader(MakeRef(addr vs_nuklear_texture.vs[0], uint32_t sizeof(vs_nuklear_texture.vs)))
  51. nkbgfx.dev.fsh = CreateShader(MakeRef(addr fs_nuklear_texture.fs[0], uint32_t sizeof(fs_nuklear_texture.fs)))
  52. nkbgfx.dev.sph = CreateProgram(nkbgfx.dev.vsh, nkbgfx.dev.fsh)
  53. nkbgfx.dev.vdecl = createShared(VertexDecl)
  54. nkbgfx.dev.vdecl.Begin()
  55. nkbgfx.dev.vdecl.Add(bgfx.Attrib_Position, 2, bgfx.AttribType_Float)
  56. nkbgfx.dev.vdecl.Add(bgfx.Attrib_TexCoord0, 2, bgfx.AttribType_Float)
  57. nkbgfx.dev.vdecl.Add(bgfx.Attrib_Color0, 4, bgfx.AttribType_Uint8, true, false)
  58. nkbgfx.dev.vdecl.End()
  59. nkbgfx.dev.uh = CreateUniform("s_texColor", UniformType_Int1)
  60.  
  61. var vertexLayout : seq[nk_draw_vertex_layout_element] = @[
  62. nk_draw_vertex_layout_element(
  63. attribute: NK_VERTEX_POSITION,
  64. format: NK_FORMAT_FLOAT,
  65. offset: nkbgfx.dev.vdecl.offset[Attrib_Position]
  66. ),
  67. nk_draw_vertex_layout_element(
  68. attribute: NK_VERTEX_TEXCOORD,
  69. format: NK_FORMAT_FLOAT,
  70. offset: nkbgfx.dev.vdecl.offset[Attrib_TexCoord0]
  71. ),
  72. nk_draw_vertex_layout_element(
  73. attribute: NK_VERTEX_COLOR,
  74. format: NK_FORMAT_R8G8B8A8,
  75. offset: nkbgfx.dev.vdecl.offset[Attrib_Color0]
  76. ),
  77. nk_draw_vertex_layout_element(
  78. attribute: NK_VERTEX_ATTRIBUTE_COUNT,
  79. format: NK_FORMAT_COUNT,
  80. offset: 0
  81. )
  82. ]
  83.  
  84. nkbgfx.dev.vbh = CreateDynamicVertexBuffer(MAX_VERTEX_BUFFER_SIZE, nkbgfx.dev.vdecl, BGFX_BUFFER_ALLOW_RESIZE)
  85. nkbgfx.dev.ibh = CreateDynamicIndexBuffer(MAX_INDEX_BUFFER_SIZE, BGFX_BUFFER_ALLOW_RESIZE)
  86.  
  87. nkbgfx.dev.cc.vertex_layout = addr vertexLayout[0]
  88. nkbgfx.dev.cc.vertex_size = nk_size sizeof(nk_bgfx_vertex)
  89. nkbgfx.dev.cc.vertex_alignment = alignof(nk_bgfx_vertex)
  90. nkbgfx.dev.cc.null = nkbgfx.dev.null
  91. nkbgfx.dev.cc.circle_segment_count = 22
  92. nkbgfx.dev.cc.curve_segment_count = 22
  93. nkbgfx.dev.cc.arc_segment_count = 22
  94. nkbgfx.dev.cc.global_alpha = 1.0
  95. nkbgfx.dev.cc.shape_AA = NK_ANTIALIASING_ON
  96. nkbgfx.dev.cc.line_AA = NK_ANTIALIASING_ON
  97.  
  98. nk_font_atlas_init_default(addr nkbgfx.fa)
  99.  
  100. nk_font_atlas_begin(addr nkbgfx.fa)
  101.  
  102. let roboto_ttf = addr s_robotoMonoRegularTtf
  103.  
  104. var font = nk_font_atlas_add_from_memory(addr nkbgfx.fa, roboto_ttf, uint sizeof(s_robotoMonoRegularTtf), 13, nil)
  105. # Uncomment for default font
  106. #var font = nk_font_atlas_add_default(addr fa, 13, nil)
  107.  
  108. var w, h : cint
  109. let image = nk_font_atlas_bake(addr nkbgfx.fa, addr w, addr h, NK_FONT_ATLAS_RGBA32)
  110. let size : uint32_t = uint32_t(w * h * 4)
  111.  
  112. var mem : ptr bgfx.Memory = bgfx.Alloc(size)
  113. copymem(mem.data, image, size)
  114. nkbgfx.dev.fah = CreateTexture2D(uint16_t w, uint16_t h, false, 1, TextureFormat_RGBA8, 0, mem)
  115. nk_font_atlas_end(addr nkbgfx.fa, nk_handle_ptr(addr nkbgfx.dev.fah), addr nkbgfx.dev.null)
  116.  
  117. discard nk_init_default(addr nkbgfx.ctx, addr font.handle)
  118.  
  119. proc nk_bgfx_render*(nkbgfx: var NuklearBGFX) =
  120. var width, height : cint
  121. var displayWidth, displayHeight : cint
  122.  
  123. glfw.GetWindowSize(graphics.rootWindow, addr width, addr height);
  124. glfw.GetFramebufferSize(graphics.rootWindow, addr displayWidth, addr displayHeight)
  125.  
  126. var ortho : Mat4
  127. mtxOrtho(ortho, 0.0, float displayWidth, float displayHeight, 0.0, 0.0, 1.0)
  128.  
  129. SetViewRect(uint8_t 0, uint16_t 0, uint16_t 0, uint16_t displayWidth, uint16_t displayHeight)
  130. SetViewTransform(uint8_t 0, nil, addr ortho[0])
  131.  
  132. var scale : nuk_vec2
  133. scale.x = float(displayWidth) / float(width)
  134. scale.y = float(displayHeight) / float(height)
  135.  
  136. nk_buffer_init_default(addr nkbgfx.dev.vb)
  137. nk_buffer_init_default(addr nkbgfx.dev.ib)
  138. nk_convert(addr nkbgfx.ctx, addr nkbgfx.dev.cmds, addr nkbgfx.dev.vb, addr nkbgfx.dev.ib, addr nkbgfx.dev.cc)
  139.  
  140. let vertexData = nkbgfx.dev.vb.memory.`ptr`
  141. let elementData = nkbgfx.dev.ib.memory.`ptr`
  142. let vertexDataSize = nkbgfx.dev.vb.allocated
  143. let elementDataSize = nkbgfx.dev.ib.allocated
  144. let vertexMemory = MakeRef(vertexData, uint32_t vertexDataSize)
  145. let elementMemory = MakeRef(elementdata, uint32_t elementDataSize)
  146.  
  147. UpdateDynamicVertexBuffer(nkbgfx.dev.vbh, 0, vertexMemory)
  148. UpdateDynamicIndexBuffer(nkbgfx.dev.ibh, 0, elementMemory)
  149.  
  150. var offset : uint32_t = 0
  151. var vertexCount = uint32_t(vertexDataSize div nkbgfx.dev.vdecl.stride)
  152.  
  153. var cmd : ptr nk_draw_command = nk_draw_begin(addr nkbgfx.ctx, addr nkbgfx.dev.cmds)
  154. while not isNil(cmd):
  155. SetState( BGFX_STATE_RGB_WRITE or BGFX_STATE_ALPHA_WRITE or BGFX_STATE_BLEND_EQUATION_ADD or
  156. BGFX_STATE_BLEND_FUNC( BGFX_STATE_BLEND_SRC_ALPHA, BGFX_STATE_BLEND_INV_SRC_ALPHA ) )
  157.  
  158. if not cmd.texture.`ptr`.isNil:
  159. let textureHandle = cast[ptr TextureHandle](cmd.texture.`ptr`)[]
  160. SetTexture(0, nkbgfx.dev.uh, textureHandle)
  161.  
  162. SetVertexBuffer( nkbgfx.dev.vbh, 0, vertexCount )
  163. SetIndexBuffer( nkbgfx.dev.ibh, offset, cmd.elem_count)
  164.  
  165. Submit(0, nkbgfx.dev.sph)
  166.  
  167. offset += cmd.elem_count
  168.  
  169. cmd = nk_draw_next(cmd, addr nkbgfx.dev.cmds, addr nkbgfx.ctx)
  170. nk_clear(addr nkbgfx.ctx)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement