Fry3DX 0.5: builds for Windows, Linux and Android, a phone layout, Apache 2.0

- Apache License 2.0
- Windows: cross-built with clang-cl (cmake --preset windows), a window
  program with its icon; Linux: a portable preset (SDL and the C++
  library inside); Android: android/build_apk.py makes the APK
- tools/package.py packs the downloads; a GitHub workflow builds all
  three and makes a release for a v* tag
- A phone layout (fry_touch, on by default on Android): the UI drawn
  bigger, panels when asked for, a bar of big buttons, one finger to
  turn the view, two to move and pinch, a long press for a right-click;
  files through the phone's file picker
- Settings and autosaves now in a Nexoniarz folder (copied over once)
- README rewritten, the website shows the downloads and the phone

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NMSrd5oe1GpUD7E6d825KP
This commit is contained in:
Nexoniarz 2026-10-19 22:05:01 +02:00
commit f6f5e5f288
40 changed files with 1180 additions and 158 deletions

View file

@ -3,6 +3,7 @@
#include "fs/vfs.h"
#include <imgui.h>
#include <imgui_internal.h>
#include <algorithm>
#include <cstring>
@ -95,6 +96,29 @@ ImFont* font(Font f) {
float scale() { return g_scale; }
namespace {
float g_pixelScale = 1.0f;
ImU32 g_lastScaledEvent = 0;
}
void setPixelScale(float k) { g_pixelScale = std::clamp(k, 0.5f, 6.0f); }
float pixelScale() { return g_pixelScale; }
void applyPixelScale() {
const float k = g_pixelScale;
ImGuiIO& io = ImGui::GetIO();
io.DisplaySize.x /= k, io.DisplaySize.y /= k; // (set again each frame by the platform)
io.DisplayFramebufferScale.x *= k, io.DisplayFramebufferScale.y *= k;
// The mouse's positions queued since last frame, in the screen's pixels: into the UI's.
// (Events left over for the next frame were done already: by their number.)
ImU32 last = g_lastScaledEvent;
for (ImGuiInputEvent& e : GImGui->InputEventsQueue) {
if (e.EventId <= g_lastScaledEvent) continue;
last = std::max(last, e.EventId);
if (e.Type == ImGuiInputEventType_MousePos && e.MousePos.PosX > -FLT_MAX)
e.MousePos.PosX /= k, e.MousePos.PosY /= k;
}
g_lastScaledEvent = last;
}
void beginFrame(float windowHeight) {
g_scale = std::clamp(windowHeight / 1080.0f, 0.75f, 2.5f);
ImGui::GetStyle().FontScaleMain = g_scale;

View file

@ -18,6 +18,12 @@ ImFont* font(Font f);
// Sizes in pixels; scaled with the window height so 1080p looks like Source at 1080p.
float scale();
void beginFrame(float windowHeight);
// The UI laid out `k` times smaller than the screen's pixels and drawn scaled up, everything
// alike (a phone: its pixels are tiny). 1: as it is.
void setPixelScale(float k);
float pixelScale();
// The backends call this between the platform's NewFrame and ImGui::NewFrame.
void applyPixelScale();
// The highlight colour: highlights, the logo.
inline constexpr uint8_t kAccent[3] = {227, 34, 45};