diff --git a/imgui-binding/src/main/java/imgui/ImDrawList.java b/imgui-binding/src/main/java/imgui/ImDrawList.java index 7879596..b8a2363 100644 --- a/imgui-binding/src/main/java/imgui/ImDrawList.java +++ b/imgui-binding/src/main/java/imgui/ImDrawList.java @@ -11,16 +11,16 @@ package imgui; * but you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well) * Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects. */ -public final class ImDrawList { - public static final int TYPE_WINDOW = 0; - public static final int TYPE_BACKGROUND = 1; - public static final int TYPE_FOREGROUND = 2; +public final class ImDrawList implements ImDestroyable { + final long ptr; - @SuppressWarnings({"FieldCanBeLocal", "unused"}) - private final int drawListType; + ImDrawList(final long ptr) { + this.ptr = ptr; + } - ImDrawList(final int drawListType) { - this.drawListType = drawListType; + @Override + public void destroy() { + nDestroy(ptr); } /*JNI @@ -28,31 +28,18 @@ public final class ImDrawList { #include #include "jni_common.h" - const static int DRAWLIST_TYPE_WINDOW = 0; - const static int DRAWLIST_TYPE_BACKGROUND = 1; - const static int DRAWLIST_TYPE_FOREGROUND = 2; + jfieldID imDrawListPtrID; - ImDrawList* getDrawList(int drawListType) { - switch (drawListType) { - case DRAWLIST_TYPE_WINDOW: - return ImGui::GetWindowDrawList(); - case DRAWLIST_TYPE_BACKGROUND: - return ImGui::GetBackgroundDrawList(); - case DRAWLIST_TYPE_FOREGROUND: - return ImGui::GetForegroundDrawList(); - default: - return NULL; - } - } - - jfieldID drawListTypeID; - - #define IM_DRAW_LIST getDrawList(env->GetIntField(object, drawListTypeID)) + #define IM_DRAW_LIST ((ImDrawList*)env->GetLongField(object, imDrawListPtrID)) */ static native void nInit(); /* jclass jImDrawListClass = env->FindClass("imgui/ImDrawList"); - drawListTypeID = env->GetFieldID(jImDrawListClass, "drawListType", "I"); + imDrawListPtrID = env->GetFieldID(jImDrawListClass, "ptr", "J"); + */ + + private native void nDestroy(long ptr); /* + delete (ImDrawList*)ptr; */ /** diff --git a/imgui-binding/src/main/java/imgui/ImGui.java b/imgui-binding/src/main/java/imgui/ImGui.java index f198a06..28be399 100644 --- a/imgui-binding/src/main/java/imgui/ImGui.java +++ b/imgui-binding/src/main/java/imgui/ImGui.java @@ -18,13 +18,12 @@ public final class ImGui { private static final ImGuiIO IMGUI_IO; - private static final ImDrawList IM_DRAW_LIST_WINDOW = new ImDrawList(ImDrawList.TYPE_WINDOW); - private static final ImDrawList IM_DRAW_LIST_BACKGROUND = new ImDrawList(ImDrawList.TYPE_BACKGROUND); - private static final ImDrawList IM_DRAW_LIST_FOREGROUND = new ImDrawList(ImDrawList.TYPE_FOREGROUND); - private static ImDrawData drawData; private static ImFont font; private static ImGuiStyle style; + private static ImDrawList windowDrawList; + private static ImDrawList backgroundDrawList; + private static ImDrawList foregroundDrawList; static { final String libPath = System.getProperty(LIB_PATH_PROP); @@ -465,9 +464,16 @@ public final class ImGui { * Get draw list associated to the current window, to append your own drawing primitives */ public static ImDrawList getWindowDrawList() { - return IM_DRAW_LIST_WINDOW; + if (windowDrawList == null) { + windowDrawList = new ImDrawList(nGetWindowDrawList()); + } + return windowDrawList; } + private static native long nGetWindowDrawList(); /* + return (intptr_t)ImGui::GetWindowDrawList(); + */ + /** * Get current window position in screen space (useful if you want to do your own drawing via the DrawList API) */ @@ -4412,16 +4418,30 @@ public final class ImGui { * This draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents. */ public static ImDrawList getBackgroundDrawList() { - return IM_DRAW_LIST_BACKGROUND; + if (backgroundDrawList == null) { + backgroundDrawList = new ImDrawList(nGetBackgroundDrawList()); + } + return backgroundDrawList; } + private static native long nGetBackgroundDrawList(); /* + return (intptr_t)ImGui::GetBackgroundDrawList(); + */ + /** * This draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents. */ public static ImDrawList getForegroundDrawList() { - return IM_DRAW_LIST_FOREGROUND; + if (foregroundDrawList == null) { + foregroundDrawList = new ImDrawList(nGetForegroundDrawList()); + } + return foregroundDrawList; } + private static native long nGetForegroundDrawList(); /* + return (intptr_t)ImGui::GetForegroundDrawList(); + */ + // TODO GetDrawListSharedData /** diff --git a/imgui-binding/src/main/java/imgui/ImGuiIO.java b/imgui-binding/src/main/java/imgui/ImGuiIO.java index cf6edb5..7a65446 100644 --- a/imgui-binding/src/main/java/imgui/ImGuiIO.java +++ b/imgui-binding/src/main/java/imgui/ImGuiIO.java @@ -199,15 +199,13 @@ public final class ImGuiIO { * Font atlas: load, rasterize and pack one or more fonts into a single texture. */ public ImFontAtlas getFonts() { - // on demand instantiation - // will throw native exception if Dear ImGui context isn't created (like in the original library) if (imFontAtlas == null) { - imFontAtlas = new ImFontAtlas(nGetFontsPtr()); + imFontAtlas = new ImFontAtlas(nGetFonts()); } return imFontAtlas; } - private native long nGetFontsPtr(); /* + private native long nGetFonts(); /* return (intptr_t)ImGui::GetIO().Fonts; */