Build offline OpenPrestige release bundles
Rename the injector and package it with an embedded payload for Windows, Linux, and macOS x64/ARM64. Add a core-only ImGui native build, multi-platform CI and release packaging, and shared per-user storage with legacy config migration.
This commit is contained in:
1 parent
5152e6e0a6
commit
2d6b2a3cd1
37 files changed
+1284
-451
No files matched your search
@@ -0,0 +1,58 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(openprestige_imgui LANGUAGES CXX)
|
||||
|
||||
file(GLOB GENERATED CONFIGURE_DEPENDS "${CORE_JNI_DIR}/imgui_*.cpp")
|
||||
add_library(imgui-java64 SHARED
|
||||
${GENERATED}
|
||||
"${CORE_JNI_DIR}/imgui.cpp"
|
||||
"${CORE_JNI_DIR}/imgui_draw.cpp"
|
||||
"${CORE_JNI_DIR}/imgui_tables.cpp"
|
||||
"${CORE_JNI_DIR}/imgui_widgets.cpp"
|
||||
"${CORE_JNI_DIR}/imgui_demo.cpp"
|
||||
"${CORE_JNI_DIR}/jni_jvm.cpp"
|
||||
"${CORE_JNI_DIR}/jni_common.cpp"
|
||||
"${CORE_JNI_DIR}/jni_binding_struct.cpp"
|
||||
"${CORE_JNI_DIR}/jni_callbacks.cpp"
|
||||
"${CORE_JNI_DIR}/jni_assertion.cpp"
|
||||
"${CORE_JNI_DIR}/jni_internal.cpp"
|
||||
)
|
||||
target_compile_features(imgui-java64 PRIVATE cxx_std_17)
|
||||
if(WIN32)
|
||||
set(JNI_OS win32)
|
||||
elseif(APPLE)
|
||||
set(JNI_OS mac)
|
||||
else()
|
||||
set(JNI_OS linux)
|
||||
endif()
|
||||
target_include_directories(imgui-java64 PRIVATE
|
||||
"${CORE_JNI_DIR}"
|
||||
"${CORE_JNI_DIR}/jni-headers"
|
||||
"${CORE_JNI_DIR}/jni-headers/${JNI_OS}"
|
||||
)
|
||||
target_compile_definitions(imgui-java64 PRIVATE IMGUI_DISABLE_DEMO_WINDOWS)
|
||||
set_target_properties(imgui-java64 PROPERTIES
|
||||
CXX_VISIBILITY_PRESET hidden
|
||||
VISIBILITY_INLINES_HIDDEN YES
|
||||
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>"
|
||||
LIBRARY_OUTPUT_DIRECTORY "${CORE_OUTPUT_DIR}"
|
||||
RUNTIME_OUTPUT_DIRECTORY "${CORE_OUTPUT_DIR}"
|
||||
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CORE_OUTPUT_DIR}"
|
||||
)
|
||||
if(MSVC)
|
||||
target_compile_options(imgui-java64 PRIVATE /O1 /Gy /GL /utf-8)
|
||||
target_link_options(imgui-java64 PRIVATE /LTCG /OPT:REF /OPT:ICF)
|
||||
else()
|
||||
target_compile_options(imgui-java64 PRIVATE -Os -ffunction-sections -fdata-sections)
|
||||
if(APPLE)
|
||||
target_link_options(imgui-java64 PRIVATE -Wl,-dead_strip)
|
||||
else()
|
||||
target_link_options(imgui-java64 PRIVATE -Wl,--gc-sections -s)
|
||||
endif()
|
||||
if(MINGW)
|
||||
target_link_options(imgui-java64 PRIVATE -static-libgcc -static-libstdc++)
|
||||
endif()
|
||||
endif()
|
||||
if(WIN32)
|
||||
set_target_properties(imgui-java64 PROPERTIES PREFIX "")
|
||||
target_link_libraries(imgui-java64 PRIVATE imm32 user32)
|
||||
endif()
|
||||
@@ -0,0 +1,8 @@
|
||||
import com.badlogic.gdx.jnigen.NativeCodeGenerator;
|
||||
|
||||
public final class GenerateCore {
|
||||
public static void main(String[] args) throws Exception {
|
||||
new NativeCodeGenerator().generate(args[0], args[1], args[2], null,
|
||||
new String[] {"**/extension/**", "**/lwjgl3/**"});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
# Core ImGui JNI build
|
||||
|
||||
OpenPrestige uses core ImGui with its Java OpenGL backend. This build keeps all core and internal
|
||||
JNI methods from imgui-java 1.92.7.1, and removes the native extension implementations for ImPlot,
|
||||
ImNodes, ImGuizmo, imgui-node-editor, text editor, file dialog, knobs, and memory editor. Demo
|
||||
windows are disabled. Core callbacks, font rendering, tables, docking, and draw lists remain available.
|
||||
|
||||
The source revisions and generator dependencies are pinned in `../build_imgui_core.py`.
|
||||
The build consumes upstream generated Java without modifying it. A portability step replaces
|
||||
GNU variable-length arrays in the generated C++ with standard C++ vectors for MSVC.
|
||||
|
||||
## Windows x64
|
||||
|
||||
Set `JAVA_HOME` to JDK 21 and install Visual Studio C++ tools and CMake. From the repository root run
|
||||
|
||||
```powershell
|
||||
python scripts/build_imgui_core.py --output build/core-natives/windows-x86_64 --architecture x64
|
||||
```
|
||||
|
||||
The output contains `imgui-java64.dll` and the upstream licenses. Gradle picks up
|
||||
`build/core-natives`, embeds it under `prestige-natives`, and omits the corresponding upstream
|
||||
native. The Java extension wrappers are omitted from the shaded payload.
|
||||
|
||||
Use a distinct `--build-dir` for each target. ARM64 cross builds use the toolchain files in
|
||||
`toolchains`, which require LLVM-MinGW on Windows targets and an aarch64 Linux cross compiler on
|
||||
Linux targets. The macOS toolchain produces a universal library. CI builds all five variants.
|
||||
|
||||
## Full release build on Windows
|
||||
|
||||
`build-release.bat` calls `python scripts/build_release_imgui.py` before Gradle builds the JAR.
|
||||
The helper fetches the pinned sources and generator dependencies, installs CMake, Ninja and Zig
|
||||
when needed, and builds Windows and Linux x64/ARM64 plus both macOS slices. It combines the macOS
|
||||
slices into a universal library. Downloads are cached in `build/imgui-core-cache`, and compilation
|
||||
is incremental under `build/imgui-core-release`.
|
||||
|
||||
The complete release still requires JDK 21, Rust, and the MSVC x64/ARM64 build tools used by the
|
||||
Rust Windows targets. Python's package installer needs network access on the first run.
|
||||
|
||||
To diagnose one cross build, use `python scripts/build_release_imgui.py --platform windows-aarch64`.
|
||||
Running the helper without arguments builds the entire ImGui release set.
|
||||
|
||||
## JNI verification
|
||||
|
||||
```powershell
|
||||
java -Dimgui.library.path=build/core-natives/windows-x86_64 -cp build/imgui-core/deps/imgui-java-binding-1.92.7.1.jar scripts/imgui-core/SmokeTest.java src/main/resources/prestige_ui/fonts/DMSans-Regular.ttf
|
||||
```
|
||||
|
||||
This initializes JNI, builds the real UI font atlas, and generates geometry from widgets and draw
|
||||
lists. A Minecraft smoke test should additionally exercise the ClickGUI and OpenGL backend.
|
||||
@@ -0,0 +1,59 @@
|
||||
import imgui.ImDrawList;
|
||||
import imgui.ImFontConfig;
|
||||
import imgui.ImGui;
|
||||
import imgui.ImGuiIO;
|
||||
import imgui.type.ImInt;
|
||||
import imgui.type.ImString;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
|
||||
/** Exercises core JNI entry points, real UI fonts, input widgets and draw data without a game. */
|
||||
public final class SmokeTest {
|
||||
public static void main(String[] args) throws Exception {
|
||||
ImGui.createContext();
|
||||
try {
|
||||
ImGuiIO io = ImGui.getIO();
|
||||
io.setIniFilename(null);
|
||||
io.setDisplaySize(1000, 600);
|
||||
io.setDeltaTime(1.0f / 60);
|
||||
ImFontConfig config = new ImFontConfig();
|
||||
try {
|
||||
config.setPixelSnapH(true);
|
||||
io.getFonts().addFontFromMemoryTTF(Files.readAllBytes(Path.of(args[0])), 18, config);
|
||||
} finally {
|
||||
config.destroy();
|
||||
}
|
||||
if (!io.getFonts().build()) throw new AssertionError("Font atlas did not build");
|
||||
ImInt width = new ImInt();
|
||||
ImInt height = new ImInt();
|
||||
ByteBuffer pixels = io.getFonts().getTexDataAsRGBA32(width, height);
|
||||
if (pixels == null || width.get() <= 0 || height.get() <= 0) {
|
||||
throw new AssertionError("Font atlas is empty");
|
||||
}
|
||||
ImString input = new ImString("OpenPrestige", 64);
|
||||
float[] value = {0.5f};
|
||||
int vertices = 0;
|
||||
for (int frame = 0; frame < 3; frame++) {
|
||||
ImGui.newFrame();
|
||||
ImGui.setNextWindowSize(500, 350);
|
||||
ImGui.begin("Core JNI smoke test");
|
||||
ImGui.text("OpenPrestige core-only ImGui");
|
||||
ImGui.button("Inject");
|
||||
ImGui.sliderFloat("Scale", value, 0, 1);
|
||||
ImGui.inputText("Config name", input);
|
||||
ImDrawList draw = ImGui.getWindowDrawList();
|
||||
draw.addCircleFilled(100, 100, 20, 0xff80a0ff);
|
||||
draw.addText(120, 100, 0xffffffff, "Draw list");
|
||||
ImGui.end();
|
||||
ImGui.render();
|
||||
vertices = ImGui.getDrawData().getTotalVtxCount();
|
||||
}
|
||||
if (vertices <= 0) throw new AssertionError("No UI geometry was generated");
|
||||
System.out.println("Core JNI passed. Font atlas " + width.get() + "x" + height.get()
|
||||
+ ", vertices " + vertices);
|
||||
} finally {
|
||||
ImGui.destroyContext();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
set(CMAKE_SYSTEM_NAME Linux)
|
||||
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
||||
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
|
||||
@@ -0,0 +1,2 @@
|
||||
set(CMAKE_OSX_ARCHITECTURES "x86_64;arm64" CACHE STRING "" FORCE)
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0" CACHE STRING "" FORCE)
|
||||
@@ -0,0 +1,4 @@
|
||||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_PROCESSOR aarch64)
|
||||
set(CMAKE_CXX_COMPILER aarch64-w64-mingw32-clang++)
|
||||
set(CMAKE_RC_COMPILER aarch64-w64-mingw32-windres)
|
||||
@@ -0,0 +1,4 @@
|
||||
set(CMAKE_SYSTEM_NAME Windows)
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-clang++)
|
||||
set(CMAKE_RC_COMPILER x86_64-w64-mingw32-windres)
|
||||
Reference in new issue
Block a user