You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Two new built-in renderers: MobileGlues and SimpleFPEWrapper (#1971): MobileGlues (via POJAV_RENDERER=opengles3_mobileglues, with MG_DIR_PATH pointing at the app's private directory) and SimpleFPEWrapper (via POJAV_RENDERER=opengles3_sfpew, with the SFPEW_RELAXED_CONTEXT single-thread/single-context optimization on by default); a gear entry was added at the end of each built-in renderer row, opening configuration for environment variables and the full set of MobileGlues runtime options (enableANGLE, enableNoError, angleDepthClearFixMode, customGLVersion, maxGlslCacheSize, three extension toggles, FSR1 upscaling, etc.) — at launch only explicitly configured keys are merged into files/mobileglues/config.json (MG-managed keys are preserved) and applied via MG_DIR_PATH; the environment-variable dialog now renders an optional description line; also hardened gl_bridge against an empty LIBGL_ES (the previous strtol(NULL) SEGV'd in gl_init_context)
The 3D skin preview restored its voxelized solid second layer (replicating 3D Skin Layers): When 1.3.4.2 returned to the GLES renderer, the second layer had degraded to OverlayExtrusion edge extrusion (only 0.5px side walls), making the 3D skin layer toggle nearly indistinguishable on/off; the voxelized implementation is restored — every fully opaque pixel (alpha=255) of the second layer generates a six-face textured cube with adjacent-face culling, UV inset of 1/4096 against color bleeding, and head 1.05 / limbs 1.02 scale correction, plus directional lighting (ambient 0.70 + diffuse 0.42); two draw passes: the voxel layer draws first writing depth, then the second layer's zero-thickness faces draw with depth writes off, showing only translucent pixels; with the toggle off the second layer falls back to flat; slim-model switching rebuilds the arm voxel layer accordingly
Cross-group capabilities in the control editor (#1763): Cross-group copy/move of a single control — a new "cross-group" button in the edit bar, pick copy/move then tap a target group (copy generates a new control id, move keeps the id and deletes-then-adds to avoid double rendering); group merging — the group-edit dialog gains "merge this group's controls into another group", transferring all controls (ids preserved) while keeping the emptied source group, loading either side's data on demand when missing; viewing and editing multiple groups at once — a "cross-group editing" toggle in the left edit menu (off by default) makes reference-group (ghost) controls selectable/draggable/scalable/editable, with views holding real references to the owning group's data so edits write through; binding a control group to show/hide with an explicit state — the bind dialog now offers four states per group (none / toggle on press / show on press / hide on press), encoded as id:show / id:hide suffixes, backward compatible with old configurations
⚡ Improvements
OSMesa split out into a renderer plugin (#1959): The bundled libOSMesa_8/81, libvirgl_test_server and libvirglrenderer_1 and the built-in Freedreno/VirGL renderer entries were removed; OSMesa is now provided by an FCLRendererPlugin, keeping the full native loading path and completing VIRGL_TEST_SERVER / VTEST_SOCKET_NAME / MESA_GLSL_CACHE_DIR runtime paths for plugin renderers; three native defects were fixed along the way — dlsym_OSMesa now prefers LIB_MESA_NAME (a bare-soname dlopen can't find the plugin directory under the classloader namespace and SIGSEGVs), virglMakeCurrent no longer passes libc's setbuffer function address as the OSMesa color buffer (declared since bionic API23+; the first flush wrote to a read-only code page and SIGSEGV'd — now a real buffer is allocated from the saved dimensions), and virgl_ensure_framebuffer allocates before freeing (on calloc failure the old buffer is kept and NULL returned, avoiding passing NULL to OSMesaMakeCurrent on OOM)
🐛 Bug Fixes
Version list jumping abnormally when switching versions (#1974): Three jump sources fixed together — the category tab bar's scrollFlags included enterAlways|snap, so a tiny vertical drift while tapping triggered nested scrolling and the AppBarLayout expanded then snapped back, bouncing the whole list (now scroll-only; swiping up still collapses it); diff content changes returned a null payload, rebinding whole rows and replaying cross-fade/entry animations so every visible row slid and flickered on each refresh (now PAYLOAD_CONTENT partial rebinds that reuse the ViewHolder and refresh only data fields); render scrolled to the selected entry even when it was already visible (now scrolls only when it's out of view)
Cleanroom losing all vanilla sound (#1969/#1980): Two independent root causes — the jsound bridge called alcMakeContextCurrent on every backend call, hijacking the process-global current and clearing the calling thread's TLS, so AL calls on paulscode's thread all landed in the bridge's context (invalidating source IDs) while its own context was orphaned and implicitly destroyed by OpenAL Soft 1.25+'s alcCloseDevice, silently switching to No Sound; activation now goes through alcSetThreadContext (guard-style enter/leave that saves and restores the old TLS current, with the fallback path likewise saving/restoring the global current); and after Cleanroom replaced destroy(), AL.create() crashed on a null alcDevice — lwjgl-openal.jar was updated with the null check
Startup crash on 26.4 snapshots (JNA 5.19.1): When jna.boot.library.path missed, JNA extracted the glibc build of libjnidispatch.so from the MC jar, which always fails to dlopen on Android; fetch-jna.sh now covers 5.19.1 (the official AAR is the natives source of truth), the assets carry the 5.19.1 natives for the current ABI (the version hash updates with the new artifact to trigger reinstall), and a new JnaNatives fallback downloads the jna AAR from Aliyun/Huawei/repo1 and extracts the matching-architecture library into RUNTIME_DIR/jna// when the assets fast path is missing
NoSuchFileException when downloading via BMCLAPI without an explicit checksum: The FileDownloadTask fallback check introduced with 1.3.4.2's slow-node switching re-read the temp file in close(), but FileUtils.moveFile (copy then delete source) had already removed it, so any BMCLAPI-chain download without an explicit IntegrityCheck (e.g. OptiFine installs) failed 100% of the time after successfully landing, then re-downloaded in full on every retry; the hash is now computed incrementally — a MessageDigest is created via getContext, write() feeds it as data arrives, and close() compares the in-memory digest — with zero extra I/O and the same structure as the integrityCheck path
Occasional theme-background drawing crashes: The centerCrop bitmap Glide produced belonged to its bitmap pool; on view detach, another load into the same view, or pool recycling during trimMemory it got recycled while the background kept drawing it, throwing "Canvas: trying to use a recycled bitmap" on the main thread; the background is now set from a copied, self-owned bitmap, fixed at all four call sites (MainActivity/Splash/ThemeEngine.applyBackground/GameMenu)
Actinium's title screen setting the window to 0×0: GLFW now intercepts non-positive window size calls instead of passing them downstream
Download-page items showing the underlying swipe favorite button: With theme-color opacity below 100%, the favorite button behind SwipeMenuLayout showed through; the menu layer is now hidden in the closed state (INVISIBLE to preserve measurement)
Invisible links on the user agreement/privacy pages: Link color could match the theme-color background; links now pick a dark/light variant of the primary color based on background luminance
MioLibPatcher system report errors: The bundled MioLibPatcher's oshi-core-ffm 7.x references utmpx symbols missing on bionic, failing three sections of SystemReport; symbol stubs plus a fixed HAS_UDEV now cover it