From e6496665dfde4349cbf9b24abe6e11a80c5131c8 Mon Sep 17 00:00:00 2001 From: Leonardo Mariscal Date: Mon, 3 Jun 2019 18:07:34 -0500 Subject: [PATCH] Fixed #19 changing decl status for procs in imgui and other misc data types incompatibility issues --- nimgl.nimble | 2 +- src/nimgl/glfw.nim | 4 +- src/nimgl/imgui.nim | 109 +++++++++++++++++----------------- src/nimgl/imgui/impl_glfw.nim | 16 +++-- src/nimgl/private/cimgui | 2 +- src/nimgl/private/ncimgui.h | 5 ++ src/nimgl/stb/image.nim | 2 +- 7 files changed, 76 insertions(+), 64 deletions(-) create mode 100644 src/nimgl/private/ncimgui.h diff --git a/nimgl.nimble b/nimgl.nimble index cd5d08c..3e5ca11 100644 --- a/nimgl.nimble +++ b/nimgl.nimble @@ -1,6 +1,6 @@ # Package -version = "0.3.5" +version = "0.3.6" author = "Leonardo Mariscal" description = "Nim Game Library" license = "MIT" diff --git a/src/nimgl/glfw.nim b/src/nimgl/glfw.nim index 57098b9..4b7b457 100644 --- a/src/nimgl/glfw.nim +++ b/src/nimgl/glfw.nim @@ -95,7 +95,7 @@ type ## GlfwImage data width*: int32 height*: int32 - pixels*: ptr char + pixels*: ptr cuchar # Constants const @@ -621,7 +621,7 @@ proc glfwCreateWindow*(width: int32, height: int32, title: cstring = "NimGL", mo ## Utility to create the window with a proper icon. result = glfwCreateWindowC(width, height, title, monitor, share) if not icon: return result - let data: ImageData = stbiLoadFromMemory(cast[ptr char](nimgl_logo[0].addr), nimgl_logo.len.int32) + let data: ImageData = stbiLoadFromMemory(cast[ptr cuchar](nimgl_logo[0].addr), nimgl_logo.len.int32) var image: GLFWImage = GLFWImage(pixels: data.data, width: data.width, height: data.height) result.setWindowIcon(1, image.addr) image.pixels.stbiImageFree() diff --git a/src/nimgl/imgui.nim b/src/nimgl/imgui.nim index 6504803..73bd5f2 100644 --- a/src/nimgl/imgui.nim +++ b/src/nimgl/imgui.nim @@ -38,15 +38,18 @@ when not defined(imguiSrc): else: const imgui_dll* = "cimgui.so" {.pragma: imgui_lib, dynlib: imgui_dll, cdecl.} + {.pragma: imgui_header, header: "cimgui.h".} + {.passC: "-DCIMGUI_DEFINE_ENUMS_AND_STRUCTS".} else: - {.compile: "private/cimgui/imgui/imgui.cpp", + {.compile: "private/cimgui/cimgui.cpp", + compile: "private/cimgui/imgui/imgui.cpp", compile: "private/cimgui/imgui/imgui_draw.cpp", compile: "private/cimgui/imgui/imgui_demo.cpp", - compile: "private/cimgui/imgui/imgui_widgets.cpp", - compile: "private/cimgui/cimgui/cimgui.cpp".} - {.pragma: imgui_lib, cdecl.} + compile: "private/cimgui/imgui/imgui_widgets.cpp".} + {.pragma: imgui_lib, nodecl.} + {.pragma: imgui_header, header: "../ncimgui.h".} -{.passC: "-I" & currentSourceDir() & "/private/cimgui" & " -DCIMGUI_DEFINE_ENUMS_AND_STRUCTS".} +{.passC: "-I" & currentSourceDir() & "/private/cimgui" & " -DIMGUI_DISABLE_OBSOLETE_FUNCTIONS=1".} const ImDrawCornerFlags_TopLeft* = 1 @@ -420,7 +423,7 @@ type ImWchar* = uint16 carray*[T] = UncheckedArray[T] - ImDrawData* {.importc: "ImDrawData", header: "".} = object + ImDrawData* {.importc: "ImDrawData", imgui_header.} = object valid* {.importc: "Valid".} : bool cmdLists* {.importc: "CmdLists".} : carray[ptr ImDrawList] cmdListsCount* {.importc: "CmdListsCount".} : int32 @@ -428,95 +431,95 @@ type totalVtxCount* {.importc: "TotalVtxCount".} : int32 displayPos* {.importc: "DisplayPos".} : ImVec2 displaySize* {.importc: "DisplaySize".} : ImVec2 - Pair* {.importc: "Pair", header: "".} = object + Pair* {.importc: "Pair", imgui_header.} = object key*: ImGuiID val*: int32 - ImVector* {.importc: "ImVector", header: "".} = object + ImVector* {.importc: "ImVector", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[pointer] - ImVector_float* {.importc: "ImVector_float", header: "".} = object + ImVector_float* {.importc: "ImVector_float", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[float32] - ImVector_int* {.importc: "ImVector_int", header: "".} = object + ImVector_int* {.importc: "ImVector_int", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[int32] - ImVector_ImWchar* {.importc: "ImVector_ImWchar", header: "".} = object + ImVector_ImWchar* {.importc: "ImVector_ImWchar", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImWchar] - ImVector_ImFontConfig* {.importc: "ImVector_ImFontConfig", header: "".} = object + ImVector_ImFontConfig* {.importc: "ImVector_ImFontConfig", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImFontConfig] - ImVector_ImFontGlyph* {.importc: "ImVector_ImFontGlyph", header: "".} = object + ImVector_ImFontGlyph* {.importc: "ImVector_ImFontGlyph", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImFontGlyph] - ImVector_unsigned_char* {.importc: "ImVector_unsigned_char", header: "".} = object + ImVector_unsigned_char* {.importc: "ImVector_unsigned_char", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[cuchar] - ImVector_Pair* {.importc: "ImVector_Pair", header: "".} = object + ImVector_Pair* {.importc: "ImVector_Pair", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[Pair] - ImVector_CustomRect* {.importc: "ImVector_CustomRect", header: "".} = object + ImVector_CustomRect* {.importc: "ImVector_CustomRect", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[CustomRect] - ImVector_ImDrawChannel* {.importc: "ImVector_ImDrawChannel", header: "".} = object + ImVector_ImDrawChannel* {.importc: "ImVector_ImDrawChannel", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImDrawChannel] - ImVector_char* {.importc: "ImVector_char", header: "".} = object + ImVector_char* {.importc: "ImVector_char", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[char] - ImVector_ImTextureID* {.importc: "ImVector_ImTextureID", header: "".} = object + ImVector_ImTextureID* {.importc: "ImVector_ImTextureID", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImTextureID] - ImVector_unsigned_short* {.importc: "ImVector_unsigned_short", header: "".} = object + ImVector_unsigned_short* {.importc: "ImVector_unsigned_short", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[cushort] - ImVector_ImDrawVert* {.importc: "ImVector_ImDrawVert", header: "".} = object + ImVector_ImDrawVert* {.importc: "ImVector_ImDrawVert", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImDrawVert] - ImVector_ImDrawCmd* {.importc: "ImVector_ImDrawCmd", header: "".} = object + ImVector_ImDrawCmd* {.importc: "ImVector_ImDrawCmd", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImDrawCmd] - ImVector_TextRange* {.importc: "ImVector_TextRange", header: "".} = object + ImVector_TextRange* {.importc: "ImVector_TextRange", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[TextRange] - ImVector_ImVec4* {.importc: "ImVector_ImVec4", header: "".} = object + ImVector_ImVec4* {.importc: "ImVector_ImVec4", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImVec4] - ImVector_ImDrawIdx* {.importc: "ImVector_ImDrawIdx", header: "".} = object + ImVector_ImDrawIdx* {.importc: "ImVector_ImDrawIdx", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImDrawIdx] - ImVector_ImVec2* {.importc: "ImVector_ImVec2", header: "".} = object + ImVector_ImVec2* {.importc: "ImVector_ImVec2", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ImVec2] - ImVector_ImFontPtr* {.importc: "ImVector_ImFontPtr", header: "".} = object + ImVector_ImFontPtr* {.importc: "ImVector_ImFontPtr", imgui_header.} = object size* {.importc: "Size".}: int32 capacity* {.importc: "Capacity".}: int32 data* {.importc: "Data".}: carray[ptr ImFont] - ImDrawListSharedData* {.importc: "ImDrawListSharedData", header: "".} = object - ImGuiContext* {.importc: "ImGuiContext", header: "".} = object + ImDrawListSharedData* {.importc: "ImDrawListSharedData", imgui_header.} = object + ImGuiContext* {.importc: "ImGuiContext", imgui_header.} = object igGLFWwindow* = object igSDL_Window* = object igSDL_Event* = object - CustomRect* {.importc: "CustomRect", header: "".} = object + CustomRect* {.importc: "CustomRect", imgui_header.} = object iD* {.importc: "ID".} : uint32 width* {.importc: "Width".} : uint16 height* {.importc: "Height".} : uint16 @@ -525,18 +528,18 @@ type glyphAdvanceX* {.importc: "GlyphAdvanceX".} : float32 glyphOffset* {.importc: "GlyphOffset".} : ImVec2 font* {.importc: "Font".} : ptr ImFont - ImColor* {.importc: "ImColor", header: "".} = object + ImColor* {.importc: "ImColor", imgui_header.} = object value* {.importc: "Value".} : ImVec4 - ImDrawChannel* {.importc: "ImDrawChannel", header: "".} = object + ImDrawChannel* {.importc: "ImDrawChannel", imgui_header.} = object cmdBuffer* {.importc: "CmdBuffer".} : ImVector_ImDrawCmd idxBuffer* {.importc: "IdxBuffer".} : ImVector_ImDrawIdx - ImDrawCmd* {.importc: "ImDrawCmd", header: "".} = object + ImDrawCmd* {.importc: "ImDrawCmd", imgui_header.} = object elemCount* {.importc: "ElemCount".} : uint32 clipRect* {.importc: "ClipRect".} : ImVec4 textureId* {.importc: "TextureId".} : ImTextureID userCallback* {.importc: "UserCallback".} : ImDrawCallback userCallbackData* {.importc: "UserCallbackData".} : pointer - ImDrawList* {.importc: "ImDrawList", header: "".} = object + ImDrawList* {.importc: "ImDrawList", imgui_header.} = object cmdBuffer* {.importc: "CmdBuffer".} : ImVector_ImDrawCmd idxBuffer* {.importc: "IdxBuffer".} : ImVector_ImDrawIdx vtxBuffer* {.importc: "VtxBuffer".} : ImVector_ImDrawVert @@ -552,11 +555,11 @@ type channelsCurrent* {.importc: "_ChannelsCurrent".} : int32 channelsCount* {.importc: "_ChannelsCount".} : int32 channels* {.importc: "_Channels".} : ImVector_ImDrawChannel - ImDrawVert* {.importc: "ImDrawVert", header: "".} = object + ImDrawVert* {.importc: "ImDrawVert", imgui_header.} = object pos* {.importc: "pos".} : ImVec2 uv* {.importc: "uv".} : ImVec2 col* {.importc: "col".} : ImU32 - ImFont* {.importc: "ImFont", header: "".} = object + ImFont* {.importc: "ImFont", imgui_header.} = object indexAdvanceX* {.importc: "IndexAdvanceX".} : ImVector_float fallbackAdvanceX* {.importc: "FallbackAdvanceX".} : float32 fontSize* {.importc: "FontSize".} : float32 @@ -573,7 +576,7 @@ type descent* {.importc: "Descent".} : float32 metricsTotalSurface* {.importc: "MetricsTotalSurface".} : int32 dirtyLookupTables* {.importc: "DirtyLookupTables".} : bool - ImFontAtlas* {.importc: "ImFontAtlas", header: "".} = object + ImFontAtlas* {.importc: "ImFontAtlas", imgui_header.} = object locked* {.importc: "Locked".} : bool flags* {.importc: "Flags".} : ImFontAtlasFlags texID* {.importc: "TexID".} : ImTextureID @@ -589,7 +592,7 @@ type customRects* {.importc: "CustomRects".} : ImVector_CustomRect configData* {.importc: "ConfigData".} : ImVector_ImFontConfig customRectIds* {.importc: "CustomRectIds".} : array[1, int32] - ImFontConfig* {.importc: "ImFontConfig", header: "".} = object + ImFontConfig* {.importc: "ImFontConfig", imgui_header.} = object fontData* {.importc: "FontData".} : pointer fontDataSize* {.importc: "FontDataSize".} : int32 fontDataOwnedByAtlas* {.importc: "FontDataOwnedByAtlas".} : bool @@ -608,7 +611,7 @@ type rasterizerMultiply* {.importc: "RasterizerMultiply".} : float32 name* {.importc: "Name".} : array[40, char] dstFont* {.importc: "DstFont".} : ptr ImFont - ImFontGlyph* {.importc: "ImFontGlyph", header: "".} = object + ImFontGlyph* {.importc: "ImFontGlyph", imgui_header.} = object codepoint* {.importc: "Codepoint".} : ImWchar advanceX* {.importc: "AdvanceX".} : float32 x0* {.importc: "X0".} : float32 @@ -619,9 +622,9 @@ type v0* {.importc: "V0".} : float32 u1* {.importc: "U1".} : float32 v1* {.importc: "V1".} : float32 - ImFontGlyphRangesBuilder* {.importc: "ImFontGlyphRangesBuilder", header: "".} = object + ImFontGlyphRangesBuilder* {.importc: "ImFontGlyphRangesBuilder", imgui_header.} = object usedChars* {.importc: "UsedChars".} : ImVector_int - ImGuiIO* {.importc: "ImGuiIO", header: "".} = object + ImGuiIO* {.importc: "ImGuiIO", imgui_header.} = object configFlags* {.importc: "ConfigFlags".} : ImGuiConfigFlags backendFlags* {.importc: "BackendFlags".} : ImGuiBackendFlags displaySize* {.importc: "DisplaySize".} : ImVec2 @@ -698,7 +701,7 @@ type navInputsDownDuration* {.importc: "NavInputsDownDuration".} : array[ImGuiNavInput_COUNT, float32] navInputsDownDurationPrev* {.importc: "NavInputsDownDurationPrev".} : array[ImGuiNavInput_COUNT, float32] inputQueueCharacters* {.importc: "InputQueueCharacters".} : ImVector_ImWchar - ImGuiInputTextCallbackData* {.importc: "ImGuiInputTextCallbackData", header: "".} = object + ImGuiInputTextCallbackData* {.importc: "ImGuiInputTextCallbackData", imgui_header.} = object eventFlag* {.importc: "EventFlag".} : ImGuiInputTextFlags flags* {.importc: "Flags".} : ImGuiInputTextFlags userData* {.importc: "UserData".} : pointer @@ -711,16 +714,16 @@ type cursorPos* {.importc: "CursorPos".} : int32 selectionStart* {.importc: "SelectionStart".} : int32 selectionEnd* {.importc: "SelectionEnd".} : int32 - ImGuiListClipper* {.importc: "ImGuiListClipper", header: "".} = object + ImGuiListClipper* {.importc: "ImGuiListClipper", imgui_header.} = object startPosY* {.importc: "StartPosY".} : float32 itemsHeight* {.importc: "ItemsHeight".} : float32 itemsCount* {.importc: "ItemsCount".} : int32 stepNo* {.importc: "StepNo".} : int32 displayStart* {.importc: "DisplayStart".} : int32 displayEnd* {.importc: "DisplayEnd".} : int32 - ImGuiOnceUponAFrame* {.importc: "ImGuiOnceUponAFrame", header: "".} = object + ImGuiOnceUponAFrame* {.importc: "ImGuiOnceUponAFrame", imgui_header.} = object refFrame* {.importc: "RefFrame".} : int32 - ImGuiPayload* {.importc: "ImGuiPayload", header: "".} = object + ImGuiPayload* {.importc: "ImGuiPayload", imgui_header.} = object data* {.importc: "Data".} : pointer dataSize* {.importc: "DataSize".} : int32 sourceId* {.importc: "SourceId".} : ImGuiID @@ -729,14 +732,14 @@ type dataType* {.importc: "DataType".} : array[32+1, char] preview* {.importc: "Preview".} : bool delivery* {.importc: "Delivery".} : bool - ImGuiSizeCallbackData* {.importc: "ImGuiSizeCallbackData", header: "".} = object + ImGuiSizeCallbackData* {.importc: "ImGuiSizeCallbackData", imgui_header.} = object userData* {.importc: "UserData".} : pointer pos* {.importc: "Pos".} : ImVec2 currentSize* {.importc: "CurrentSize".} : ImVec2 desiredSize* {.importc: "DesiredSize".} : ImVec2 - ImGuiStorage* {.importc: "ImGuiStorage", header: "".} = object + ImGuiStorage* {.importc: "ImGuiStorage", imgui_header.} = object data* {.importc: "Data".} : ImVector_Pair - ImGuiStyle* {.importc: "ImGuiStyle", header: "".} = object + ImGuiStyle* {.importc: "ImGuiStyle", imgui_header.} = object alpha* {.importc: "Alpha".} : float32 windowPadding* {.importc: "WindowPadding".} : ImVec2 windowRounding* {.importc: "WindowRounding".} : float32 @@ -770,21 +773,21 @@ type antiAliasedFill* {.importc: "AntiAliasedFill".} : bool curveTessellationTol* {.importc: "CurveTessellationTol".} : float32 colors* {.importc: "Colors".} : array[ImGuiCol_COUNT, ImVec4] - ImGuiTextBuffer* {.importc: "ImGuiTextBuffer", header: "".} = object + ImGuiTextBuffer* {.importc: "ImGuiTextBuffer", imgui_header.} = object buf* {.importc: "Buf".} : ImVector_char - ImGuiTextFilter* {.importc: "ImGuiTextFilter", header: "".} = object + ImGuiTextFilter* {.importc: "ImGuiTextFilter", imgui_header.} = object inputBuf* {.importc: "InputBuf".} : array[256, char] filters* {.importc: "Filters".} : ImVector_TextRange countGrep* {.importc: "CountGrep".} : int32 - ImVec2* {.importc: "ImVec2", header: "".} = object + ImVec2* {.importc: "ImVec2", imgui_header.} = object x* {.importc: "x".} : float32 y* {.importc: "y".} : float32 - ImVec4* {.importc: "ImVec4", header: "".} = object + ImVec4* {.importc: "ImVec4", imgui_header.} = object x* {.importc: "x".} : float32 y* {.importc: "y".} : float32 z* {.importc: "z".} : float32 w* {.importc: "w".} : float32 - TextRange* {.importc: "TextRange", header: "".} = object + TextRange* {.importc: "TextRange", imgui_header.} = object b* {.importc: "b".} : cstring e* {.importc: "e".} : cstring diff --git a/src/nimgl/imgui/impl_glfw.nim b/src/nimgl/imgui/impl_glfw.nim index fedadd1..e219f4b 100644 --- a/src/nimgl/imgui/impl_glfw.nim +++ b/src/nimgl/imgui/impl_glfw.nim @@ -8,10 +8,11 @@ import ../imgui, ../glfw -type GlfwClientApi = enum - igGlfwClientApi_Unkown - igGlfwClientApi_OpenGl - igGlfwClientApi_Vulkan +type + GlfwClientApi = enum + igGlfwClientApi_Unkown + igGlfwClientApi_OpenGl + igGlfwClientApi_Vulkan var gWindow: GLFWwindow @@ -108,8 +109,11 @@ proc igGlfwInit(window: GLFWwindow, install_callbacks: bool, client_api: GlfwCli io.keyMap[ImGuiKey_Y] = keyY.ord io.keyMap[ImGuiKey_Z] = keyZ.ord - io.setClipboardTextFn = igGlfwSetClipboardText - io.getClipboardTextFn = igGlfwGetClipboardText + # HELP: If you know how to convert char * to const char * through Nim pragmas + # and types, I would love to know. + when not defined(cpp): + io.setClipboardTextFn = igGlfwSetClipboardText + io.getClipboardTextFn = igGlfwGetClipboardText io.clipboardUserData = gWindow when defined windows: io.imeWindowHandle = gWindow.getWin32Window() diff --git a/src/nimgl/private/cimgui b/src/nimgl/private/cimgui index 4be0522..84932b4 160000 --- a/src/nimgl/private/cimgui +++ b/src/nimgl/private/cimgui @@ -1 +1 @@ -Subproject commit 4be0522d9f1513e9f14dd3510c396325007f58ad +Subproject commit 84932b4830669ff359eeb9fe2bdb186b326d61e6 diff --git a/src/nimgl/private/ncimgui.h b/src/nimgl/private/ncimgui.h new file mode 100644 index 0000000..71ff285 --- /dev/null +++ b/src/nimgl/private/ncimgui.h @@ -0,0 +1,5 @@ +#include "imgui/imgui.h" +#include "cimgui.h" + +// Should open an issue in cimgui about this... +// This isn't best practice in c++ so bear with me. diff --git a/src/nimgl/stb/image.nim b/src/nimgl/stb/image.nim index 66562df..c32b7ca 100644 --- a/src/nimgl/stb/image.nim +++ b/src/nimgl/stb/image.nim @@ -68,7 +68,7 @@ proc stbiLoadFromMemory*(buffer: ptr cuchar, len: int32, components: int32 = 0): ## more info in the original proc result.data = stbi_load_from_memory(buffer, len, result.width.addr, result.height.addr, result.channels.addr, components) -proc stbiImageFree*(data: ptr cuchar): void {.stb_image, importc: "stbi_image_free".} +proc stbiImageFree*(data: pointer): void {.stb_image, importc: "stbi_image_free".} ## frees the data, loaded from stbi_load proc imageFree*(image: ImageData): void =