From f4bc2333bf4d33ebfb568322cc4e652588f0c2b3 Mon Sep 17 00:00:00 2001 From: Trulio Date: Sun, 2 Aug 2026 01:04:17 -0300 Subject: [PATCH 1/8] Add android gradle build --- .gitignore | 10 + documentation/android-port.md | 41 +++ platform/android/app/build.gradle | 34 +++ .../android/app/src/main/AndroidManifest.xml | 19 ++ platform/android/build.gradle | 3 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 46175 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + platform/android/gradlew | 248 ++++++++++++++++++ platform/android/settings.gradle | 13 + src/SF_EXE/CMakeLists.txt | 9 +- src/SF_EXE/cmake/configure_platform.cmake | 3 + src/SF_EXE/cmake/platforms/Android.cmake | 27 ++ src/SF_EXE/runtime/game_runtime.hpp | 2 + src/SF_EXE/runtime/main.cpp | 11 +- .../platform/android/application_loop.cpp | 27 ++ thirdparty/lal/CMakeLists.txt | 3 + thirdparty/lal/lal_aaudio.c | 108 ++++++++ thirdparty/lwl/CMakeLists.txt | 7 + thirdparty/lwl/lwl.h | 2 + thirdparty/lwl/lwl_android.c | 189 +++++++++++++ thirdparty/lwl/lwl_android.h | 19 ++ thirdparty/lwl/lwl_emscripten.c | 6 + thirdparty/lwl/lwl_macos.c | 6 + thirdparty/lwl/lwl_win32.c | 6 + thirdparty/lwl/lwl_x11.c | 6 + tools/android/build-apk.sh | 30 +++ 26 files changed, 834 insertions(+), 2 deletions(-) create mode 100644 documentation/android-port.md create mode 100644 platform/android/app/build.gradle create mode 100644 platform/android/app/src/main/AndroidManifest.xml create mode 100644 platform/android/build.gradle create mode 100644 platform/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 platform/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 platform/android/gradlew create mode 100644 platform/android/settings.gradle create mode 100644 src/SF_EXE/cmake/platforms/Android.cmake create mode 100644 src/SF_EXE/runtime/platform/android/application_loop.cpp create mode 100644 thirdparty/lal/lal_aaudio.c create mode 100644 thirdparty/lwl/lwl_android.c create mode 100644 thirdparty/lwl/lwl_android.h create mode 100644 tools/android/build-apk.sh diff --git a/.gitignore b/.gitignore index 1e87e51e..76a5f4f3 100644 --- a/.gitignore +++ b/.gitignore @@ -38,7 +38,17 @@ __pycache__/ *.py[cod] .idea +*.iml .vs .vscode /build/ tmp/ + +# Gradle build products +/platform/android/.gradle/ +/platform/android/.idea/ +/platform/android/local.properties +/platform/android/build/ +/platform/android/app/build/ +/platform/android/app/.cxx/ +/platform/android/app/.externalNativeBuild/ diff --git a/documentation/android-port.md b/documentation/android-port.md new file mode 100644 index 00000000..d07b7ebb --- /dev/null +++ b/documentation/android-port.md @@ -0,0 +1,41 @@ +# Android port + +The Android build uses NativeActivity, the Android NDK, EGL/OpenGL ES 3 for +the existing LGL surface presenter, and AAudio for 44.1 kHz stereo output. +It supports Android 8.0 (API 26) or newer. + +## Build + +Android Studio is optional. Install a JDK 17 plus the Android command-line +SDK tools, then install Android API 35, Build Tools 35.0.0, NDK 27.0.12077973, +and CMake 4.1.2. + +```bash +sh tools/android/build-apk.sh +``` + +The installable debug APK is written to: + +```text +build/android/debug/OpenShadowFlare-android-debug.apk +``` + +The game data is not packaged. The app reads it from private app storage, so +copy a legally obtained `ShadowFlare` directory containing `SFlare.Cfg` and +`System/` after installing the APK. With an emulator connected through ADB: + +```bash +# Use ADB=adb when platform-tools is already on PATH. On Git Bash with the +# standard Windows SDK location, replace with your account name. +ADB=/... + +# From the repository root +tar -C tmp -cf - ShadowFlare | "$ADB" exec-in sh -c 'tar -xf - -C /sdcard/Android/data/org.openshadowflare.game/files' +"$ADB" shell run-as org.openshadowflare.game mkdir -p files +"$ADB" shell "cd /sdcard/Android/data/org.openshadowflare.game/files/ShadowFlare && tar -cf - . | run-as org.openshadowflare.game tar -xf - -C files" +``` + +The first command uses a temporary external staging folder; the second places +the files in the app-owned directory where Android permits native file access. +Repeat both commands after uninstalling the app, since uninstalling clears its +private data. diff --git a/platform/android/app/build.gradle b/platform/android/app/build.gradle new file mode 100644 index 00000000..24636dc5 --- /dev/null +++ b/platform/android/app/build.gradle @@ -0,0 +1,34 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'org.openshadowflare.game' + compileSdk 35 + + defaultConfig { + applicationId 'org.openshadowflare.game' + minSdk 26 + targetSdk 35 + versionCode 1 + versionName '0.1.0' + + ndk { + abiFilters 'arm64-v8a', 'x86_64' + } + + externalNativeBuild { + cmake { + cppFlags '-std=c++17' + arguments '-DBUILD_TESTING=OFF' + } + } + } + + externalNativeBuild { + cmake { + path file('../../../CMakeLists.txt') + version '4.1.2' + } + } +} diff --git a/platform/android/app/src/main/AndroidManifest.xml b/platform/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..0818f2c3 --- /dev/null +++ b/platform/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/platform/android/build.gradle b/platform/android/build.gradle new file mode 100644 index 00000000..5b7ccba7 --- /dev/null +++ b/platform/android/build.gradle @@ -0,0 +1,3 @@ +plugins { + id 'com.android.application' version '8.7.3' apply false +} diff --git a/platform/android/gradle/wrapper/gradle-wrapper.jar b/platform/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..61285a659d17295f1de7c53e24fdf13ad755c379 GIT binary patch literal 46175 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

pVX@HRij*jw$g4?}Pn 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 literal 0 HcmV?d00001 diff --git a/platform/android/gradle/wrapper/gradle-wrapper.properties b/platform/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..19a6bdeb --- /dev/null +++ b/platform/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/platform/android/gradlew b/platform/android/gradlew new file mode 100644 index 00000000..adff685a --- /dev/null +++ b/platform/android/gradlew @@ -0,0 +1,248 @@ +#!/bin/sh + +# +# Copyright © 2015 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/platform/android/settings.gradle b/platform/android/settings.gradle new file mode 100644 index 00000000..2ce34538 --- /dev/null +++ b/platform/android/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { google(); mavenCentral() } +} +rootProject.name = "OpenShadowFlare" +include(":app") diff --git a/src/SF_EXE/CMakeLists.txt b/src/SF_EXE/CMakeLists.txt index 370aabf0..01008b5b 100644 --- a/src/SF_EXE/CMakeLists.txt +++ b/src/SF_EXE/CMakeLists.txt @@ -321,8 +321,15 @@ target_link_libraries( OpenShadowFlare::Render ) -add_executable( +if(ANDROID) + add_library(ShadowFlare_rebuilt SHARED) +else() + add_executable(ShadowFlare_rebuilt) +endif() + +target_sources( ShadowFlare_rebuilt + PRIVATE runtime/audio_system.cpp runtime/frontend_assets.cpp runtime/game_runtime.cpp diff --git a/src/SF_EXE/cmake/configure_platform.cmake b/src/SF_EXE/cmake/configure_platform.cmake index 7ca33e6c..aa01dce6 100644 --- a/src/SF_EXE/cmake/configure_platform.cmake +++ b/src/SF_EXE/cmake/configure_platform.cmake @@ -2,6 +2,9 @@ function(osf_configure_platform target) if(EMSCRIPTEN) include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/platforms/Emscripten.cmake") osf_configure_emscripten_platform(${target}) + elseif(ANDROID) + include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/platforms/Android.cmake") + osf_configure_android_platform(${target}) elseif( WIN32 OR APPLE diff --git a/src/SF_EXE/cmake/platforms/Android.cmake b/src/SF_EXE/cmake/platforms/Android.cmake new file mode 100644 index 00000000..020abdbe --- /dev/null +++ b/src/SF_EXE/cmake/platforms/Android.cmake @@ -0,0 +1,27 @@ +function(osf_configure_android_platform target) + target_sources( + ${target} + PRIVATE + runtime/platform/android/application_loop.cpp + ) + target_compile_definitions(${target} PRIVATE OSF_PLATFORM_ANDROID) + + target_sources( + ${target} + PRIVATE + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c" + ) + target_include_directories( + ${target} + PRIVATE + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" + ) + target_link_libraries( + ${target} + PRIVATE + android + log + ) + + set_target_properties(${target} PROPERTIES OUTPUT_NAME main) +endfunction() diff --git a/src/SF_EXE/runtime/game_runtime.hpp b/src/SF_EXE/runtime/game_runtime.hpp index a3b27770..d58dbaa2 100644 --- a/src/SF_EXE/runtime/game_runtime.hpp +++ b/src/SF_EXE/runtime/game_runtime.hpp @@ -11,4 +11,6 @@ int runGame( const GameConfig& game_config, bool smoke_test); +int runMain(int argc, char** argv); + } // namespace osf::runtime diff --git a/src/SF_EXE/runtime/main.cpp b/src/SF_EXE/runtime/main.cpp index 947875c5..5bbc10a5 100644 --- a/src/SF_EXE/runtime/main.cpp +++ b/src/SF_EXE/runtime/main.cpp @@ -56,6 +56,11 @@ std::filesystem::path findDataRoot() { }; std::error_code error; + char dataPath[4096]{}; + if (lwl_data_path(dataPath, static_cast(sizeof(dataPath)))) { + return std::filesystem::path(dataPath); + } + const std::filesystem::path fromWorkingDirectory = searchParents(std::filesystem::current_path(error)); if (!fromWorkingDirectory.empty()) { @@ -89,7 +94,7 @@ std::filesystem::path findDataRoot() { } // namespace -int main(int argc, char** argv) { +int osf::runtime::runMain(int argc, char** argv) { const std::filesystem::path dataRoot = findDataRoot(); osf::GameConfig gameConfig; @@ -103,3 +108,7 @@ int main(int argc, char** argv) { return osf::runtime::runGame( dataRoot, gameConfig, isSmokeTest(argc, argv)); } + +int main(int argc, char** argv) { + return osf::runtime::runMain(argc, argv); +} diff --git a/src/SF_EXE/runtime/platform/android/application_loop.cpp b/src/SF_EXE/runtime/platform/android/application_loop.cpp new file mode 100644 index 00000000..48e3a32e --- /dev/null +++ b/src/SF_EXE/runtime/platform/android/application_loop.cpp @@ -0,0 +1,27 @@ +#include "runtime/application_loop.hpp" + +#include "runtime/game_runtime.hpp" + +#include "lwl_android.h" + +#include + +#include + +extern "C" void android_main(android_app* application) { + lwl_android_set_application(application); + if (lwl_android_wait_for_window()) { + osf::runtime::runMain(0, nullptr); + } + lwl_android_set_application(nullptr); +} + +namespace osf::runtime { + +int runApplicationLoop(std::unique_ptr application) { + while (application->frame()) { + } + return 0; +} + +} // namespace osf::runtime diff --git a/thirdparty/lal/CMakeLists.txt b/thirdparty/lal/CMakeLists.txt index d6556d87..9f219344 100644 --- a/thirdparty/lal/CMakeLists.txt +++ b/thirdparty/lal/CMakeLists.txt @@ -39,6 +39,9 @@ endif() if(EMSCRIPTEN) target_sources(lal PRIVATE lal_webaudio.c) +elseif(ANDROID) + target_sources(lal PRIVATE lal_aaudio.c) + target_link_libraries(lal PRIVATE aaudio log) elseif(WIN32) target_sources(lal PRIVATE lal_waveout.c) target_link_libraries(lal PRIVATE winmm) diff --git a/thirdparty/lal/lal_aaudio.c b/thirdparty/lal/lal_aaudio.c new file mode 100644 index 00000000..33e8b18b --- /dev/null +++ b/thirdparty/lal/lal_aaudio.c @@ -0,0 +1,108 @@ +#include "lal_internal.h" + +#include + +#include +#include +#include +#include + +static AAudioStream *g_stream; +static pthread_mutex_t g_mutex; +static bool g_mutex_ready; +static bool g_running; + +static aaudio_data_callback_result_t lal_aaudio_callback( + AAudioStream *stream, void *user_data, void *audio_data, + int32_t frame_count) { + bool running; + (void) stream; + (void) user_data; + + pthread_mutex_lock(&g_mutex); + running = g_running; + if (running) { + lal_mix_frames((int16_t *) audio_data, (size_t) frame_count); + } + pthread_mutex_unlock(&g_mutex); + if (!running) { + memset(audio_data, 0, (size_t) frame_count * LAL_OUTPUT_CHANNELS * + sizeof(int16_t)); + } + return AAUDIO_CALLBACK_RESULT_CONTINUE; +} + +bool lal_platform_init(void) { + AAudioStreamBuilder *builder = NULL; + aaudio_result_t result; + + if (pthread_mutex_init(&g_mutex, NULL) != 0) { + lal_set_error("Could not create the Android audio mutex."); + return false; + } + g_mutex_ready = true; + result = AAudio_createStreamBuilder(&builder); + if (result != AAUDIO_OK) { + lal_set_error("Could not create the Android audio stream builder."); + lal_platform_shutdown(); + return false; + } + AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT); + AAudioStreamBuilder_setFormat(builder, AAUDIO_FORMAT_PCM_I16); + AAudioStreamBuilder_setSampleRate(builder, LAL_OUTPUT_SAMPLE_RATE); + AAudioStreamBuilder_setChannelCount(builder, LAL_OUTPUT_CHANNELS); + AAudioStreamBuilder_setPerformanceMode( + builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); + AAudioStreamBuilder_setDataCallback(builder, lal_aaudio_callback, NULL); + result = AAudioStreamBuilder_openStream(builder, &g_stream); + AAudioStreamBuilder_delete(builder); + if (result != AAUDIO_OK || !g_stream) { + lal_set_error("Could not open the Android audio output stream."); + lal_platform_shutdown(); + return false; + } + if (AAudioStream_getSampleRate(g_stream) != LAL_OUTPUT_SAMPLE_RATE || + AAudioStream_getChannelCount(g_stream) != LAL_OUTPUT_CHANNELS || + AAudioStream_getFormat(g_stream) != AAUDIO_FORMAT_PCM_I16) { + lal_set_error("Android audio did not accept 44.1 kHz stereo PCM."); + lal_platform_shutdown(); + return false; + } + g_running = true; + result = AAudioStream_requestStart(g_stream); + if (result != AAUDIO_OK) { + lal_set_error("Could not start the Android audio output stream."); + lal_platform_shutdown(); + return false; + } + return true; +} + +void lal_platform_shutdown(void) { + if (g_mutex_ready) { + pthread_mutex_lock(&g_mutex); + g_running = false; + pthread_mutex_unlock(&g_mutex); + } + if (g_stream) { + AAudioStream_requestStop(g_stream); + AAudioStream_close(g_stream); + g_stream = NULL; + } + if (g_mutex_ready) { + pthread_mutex_destroy(&g_mutex); + g_mutex_ready = false; + } +} + +void lal_platform_lock(void) { + if (g_mutex_ready) { + pthread_mutex_lock(&g_mutex); + } +} + +void lal_platform_unlock(void) { + if (g_mutex_ready) { + pthread_mutex_unlock(&g_mutex); + } +} diff --git a/thirdparty/lwl/CMakeLists.txt b/thirdparty/lwl/CMakeLists.txt index 65026b23..36b74a2c 100644 --- a/thirdparty/lwl/CMakeLists.txt +++ b/thirdparty/lwl/CMakeLists.txt @@ -39,6 +39,13 @@ if(EMSCRIPTEN) "-sMAX_WEBGL_VERSION=2" "-sGL_ENABLE_GET_PROC_ADDRESS=1" ) +elseif(ANDROID) + target_sources(lwl PRIVATE lwl_android.c) + target_include_directories( + lwl PRIVATE + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" + ) + target_link_libraries(lwl PRIVATE android EGL GLESv3 log) elseif(WIN32) target_sources(lwl PRIVATE lwl_win32.c) target_link_libraries( diff --git a/thirdparty/lwl/lwl.h b/thirdparty/lwl/lwl.h index c10d8ef5..bdc730a7 100644 --- a/thirdparty/lwl/lwl.h +++ b/thirdparty/lwl/lwl.h @@ -134,6 +134,8 @@ void lwl_sleep_until_seconds(double time_seconds); const char* lwl_platform_name(void); double lwl_display_scale(void); bool lwl_exe_path(char *buf, int size); +// Provides a platform-specific directory for user-managed game data, if any. +bool lwl_data_path(char *buf, int size); /* * OpenGL contexts are optional. Software-framebuffer users do not need to diff --git a/thirdparty/lwl/lwl_android.c b/thirdparty/lwl/lwl_android.c new file mode 100644 index 00000000..3ce673ec --- /dev/null +++ b/thirdparty/lwl/lwl_android.c @@ -0,0 +1,189 @@ +#include "lwl.h" +#include "lwl_android.h" + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +enum { LWL_EVENT_CAPACITY = 64 }; + +struct LwlWindow { int width, height; bool focused; }; +struct LwlGlContext { EGLDisplay display; EGLContext context; EGLSurface surface; }; + +static struct android_app *g_application; +static struct LwlWindow g_window; +static struct LwlGlContext *g_context; +static LwlEvent g_events[LWL_EVENT_CAPACITY]; +static int g_event_head, g_event_tail; +static int g_pointer_x, g_pointer_y; + +static void push_event(const LwlEvent *event) { + int next = (g_event_tail + 1) % LWL_EVENT_CAPACITY; + if (next == g_event_head) g_event_head = (g_event_head + 1) % LWL_EVENT_CAPACITY; + g_events[g_event_tail] = *event; + g_event_tail = next; +} + +static bool pop_event(LwlEvent *event) { + if (g_event_head == g_event_tail) return false; + *event = g_events[g_event_head]; + g_event_head = (g_event_head + 1) % LWL_EVENT_CAPACITY; + return true; +} + +static void resize_window(void) { + if (!g_application || !g_application->window) return; + g_window.width = ANativeWindow_getWidth(g_application->window); + g_window.height = ANativeWindow_getHeight(g_application->window); + LwlEvent event = {0}; + event.type = LWL_EVENT_RESIZED; + event.x = g_window.width; + event.y = g_window.height; + push_event(&event); +} + +static void on_command(struct android_app *app, int32_t command) { + (void) app; + switch (command) { + case APP_CMD_INIT_WINDOW: + case APP_CMD_WINDOW_RESIZED: + resize_window(); + break; + case APP_CMD_GAINED_FOCUS: g_window.focused = true; break; + case APP_CMD_LOST_FOCUS: g_window.focused = false; break; + case APP_CMD_DESTROY: { + LwlEvent event = {0}; event.type = LWL_EVENT_QUIT; push_event(&event); break; + } + } +} + +static void key_name(int32_t keycode, char *out, size_t size) { + const char *key = ""; + switch (keycode) { + case AKEYCODE_DPAD_UP: key = "up"; break; + case AKEYCODE_DPAD_DOWN: key = "down"; break; + case AKEYCODE_DPAD_LEFT: key = "left"; break; + case AKEYCODE_DPAD_RIGHT: key = "right"; break; + case AKEYCODE_ENTER: case AKEYCODE_DPAD_CENTER: key = "return"; break; + case AKEYCODE_BACK: key = "escape"; break; + case AKEYCODE_DEL: key = "backspace"; break; + case AKEYCODE_FORWARD_DEL: key = "delete"; break; + case AKEYCODE_TAB: key = "tab"; break; + case AKEYCODE_SPACE: key = "space"; break; + default: + if (keycode >= AKEYCODE_A && keycode <= AKEYCODE_Z) { + out[0] = (char) ('a' + keycode - AKEYCODE_A); out[1] = '\0'; return; + } + if (keycode >= AKEYCODE_0 && keycode <= AKEYCODE_9) { + out[0] = (char) ('0' + keycode - AKEYCODE_0); out[1] = '\0'; return; + } + break; + } + strncpy(out, key, size - 1); out[size - 1] = '\0'; +} + +static int32_t on_input(struct android_app *app, AInputEvent *input) { + (void) app; + if (AInputEvent_getType(input) == AINPUT_EVENT_TYPE_MOTION) { + int32_t action = AMotionEvent_getAction(input) & AMOTION_EVENT_ACTION_MASK; + LwlEvent event = {0}; + g_pointer_x = (int) AMotionEvent_getX(input, 0); + g_pointer_y = (int) AMotionEvent_getY(input, 0); + event.x = g_pointer_x; event.y = g_pointer_y; event.button = 1; + if (action == AMOTION_EVENT_ACTION_DOWN) { event.type = LWL_EVENT_MOUSE_DOWN; event.clicks = 1; } + else if (action == AMOTION_EVENT_ACTION_UP || action == AMOTION_EVENT_ACTION_CANCEL) { event.type = LWL_EVENT_MOUSE_UP; event.clicks = 1; } + else if (action == AMOTION_EVENT_ACTION_MOVE) event.type = LWL_EVENT_MOUSE_MOVE; + else return 0; + push_event(&event); return 1; + } + if (AInputEvent_getType(input) == AINPUT_EVENT_TYPE_KEY) { + int32_t action = AKeyEvent_getAction(input); + if (action != AKEY_EVENT_ACTION_DOWN && action != AKEY_EVENT_ACTION_UP) return 0; + LwlEvent event = {0}; + event.type = action == AKEY_EVENT_ACTION_DOWN ? LWL_EVENT_KEY_DOWN : LWL_EVENT_KEY_UP; + key_name(AKeyEvent_getKeyCode(input), event.key, sizeof(event.key)); + if (event.key[0]) { push_event(&event); return 1; } + } + return 0; +} + +static void pump_events(int timeout) { + int events; struct android_poll_source *source; + while (ALooper_pollOnce(timeout, NULL, &events, (void **) &source) >= 0) { + if (source) source->process(g_application, source); + if (!g_application || g_application->destroyRequested) break; + timeout = 0; + } +} + +void lwl_android_set_application(struct android_app *application) { + g_application = application; + if (!application) return; + application->onAppCmd = on_command; + application->onInputEvent = on_input; + if (application->activity->internalDataPath) { + chdir(application->activity->internalDataPath); + } +} + +bool lwl_android_wait_for_window(void) { + while (g_application && !g_application->destroyRequested && !g_application->window) pump_events(-1); + return g_application && !g_application->destroyRequested; +} + +bool lwl_init(void) { return g_application != NULL; } +void lwl_shutdown(void) { g_event_head = g_event_tail = 0; } +LwlWindow *lwl_window_create(const char *title, int width, int height) { + (void) title; g_window.width = width; g_window.height = height; g_window.focused = true; resize_window(); return &g_window; +} +LwlWindow *lwl_window_create_with_native_message_handler(const char *t, int w, int h, LwlNativeMessageHandler handler, void *data) { (void) handler; (void) data; return lwl_window_create(t,w,h); } +LwlWindow *lwl_window_attach_native(void *native_window, int width, int height) { (void) native_window; return lwl_window_create(NULL,width,height); } +void *lwl_window_get_native_handle(LwlWindow *window) { (void) window; return g_application ? g_application->window : NULL; } +void lwl_window_destroy(LwlWindow *window) { (void) window; } +void lwl_window_show(LwlWindow *window) { (void) window; } +void lwl_window_set_title(LwlWindow *window, const char *title) { (void) window; (void) title; } +void lwl_window_set_mode(LwlWindow *window, LwlWindowMode mode) { (void) window; (void) mode; } +bool lwl_window_has_focus(LwlWindow *window) { return window && window->focused; } +void lwl_window_set_cursor(LwlWindow *window, LwlCursor cursor) { (void) window; (void) cursor; } +bool lwl_window_set_cursor_image(LwlWindow *w,const LwlColor *p,int a,int b,int c,int d) { (void)w;(void)p;(void)a;(void)b;(void)c;(void)d; return false; } +void lwl_window_set_cursor_visible(LwlWindow *window, bool visible) { (void) window; (void) visible; } +bool lwl_window_set_size(LwlWindow *window, int width, int height) { if (!window) return false; window->width=width; window->height=height; return true; } +void lwl_window_get_size(LwlWindow *window, int *width, int *height) { if (width) *width=window?window->width:0; if (height) *height=window?window->height:0; } +LwlColor *lwl_window_get_framebuffer(LwlWindow *w,int *x,int *y) { (void)w; if(x)*x=0;if(y)*y=0;return NULL; } +bool lwl_window_resize_framebuffer(LwlWindow *w,int x,int y) { (void)w;(void)x;(void)y;return false; } +void lwl_window_update_rects(LwlWindow *w,const LwlRect *r,int c) { (void)w;(void)r;(void)c; } +bool lwl_poll_event(LwlWindow *window, LwlEvent *event) { (void) window; if (!event) return false; if (pop_event(event)) return true; pump_events(0); return pop_event(event); } +bool lwl_wait_event(LwlWindow *window, double timeout) { (void)window; if(g_event_head!=g_event_tail)return true; pump_events((int)(timeout*1000.0)); return g_event_head!=g_event_tail; } +char *lwl_clipboard_get(LwlWindow *w) { (void)w;return NULL; } void lwl_clipboard_set(LwlWindow *w,const char *t) { (void)w;(void)t; } char *lwl_select_folder(LwlWindow *w,const char *t) { (void)w;(void)t;return NULL; } void lwl_free(void *p) { free(p); } +double lwl_time_seconds(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC,&ts); return ts.tv_sec + ts.tv_nsec/1000000000.0; } +void lwl_sleep_seconds(double s) { if(s>0) usleep((useconds_t)(s*1000000.0)); } void lwl_sleep_until_seconds(double t) { double now=lwl_time_seconds(); if(t>now)lwl_sleep_seconds(t-now); } +const char *lwl_platform_name(void) { return "android"; } double lwl_display_scale(void) { return 1.0; } bool lwl_exe_path(char *b,int s) { (void)b;(void)s;return false; } +bool lwl_data_path(char *buffer, int size) { + if (!buffer || size <= 0 || !g_application || + !g_application->activity || + !g_application->activity->internalDataPath) return false; + int length = snprintf( + buffer, (size_t) size, "%s", + g_application->activity->internalDataPath); + return length >= 0 && length < size; +} +LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig c={0};c.api=LWL_GL_API_ES;c.major_version=3;c.depth_bits=24;c.double_buffer=true;return c; } +LwlGlContext *lwl_gl_context_create(LwlWindow *window,const LwlGlConfig *requested) { + const EGLint attrs[]={EGL_RENDERABLE_TYPE,EGL_OPENGL_ES3_BIT_KHR,EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RED_SIZE,8,EGL_GREEN_SIZE,8,EGL_BLUE_SIZE,8,EGL_NONE}; EGLConfig config; EGLint count; LwlGlConfig wanted=requested?*requested:lwl_gl_config_default(); + if(!window||!g_application||!g_application->window||wanted.api!=LWL_GL_API_ES||wanted.major_version!=3)return NULL; + LwlGlContext *c=calloc(1,sizeof(*c)); if(!c)return NULL; c->display=eglGetDisplay(EGL_DEFAULT_DISPLAY); if(c->display==EGL_NO_DISPLAY||!eglInitialize(c->display,NULL,NULL)||!eglChooseConfig(c->display,attrs,&config,1,&count)||count<1)goto fail; + const EGLint context_attrs[]={EGL_CONTEXT_CLIENT_VERSION,3,EGL_NONE}; c->context=eglCreateContext(c->display,config,EGL_NO_CONTEXT,context_attrs); c->surface=eglCreateWindowSurface(c->display,config,g_application->window,NULL); if(c->context==EGL_NO_CONTEXT||c->surface==EGL_NO_SURFACE||!eglMakeCurrent(c->display,c->surface,c->surface,c->context))goto fail; g_context=c; return c; +fail: if(c->display!=EGL_NO_DISPLAY)eglTerminate(c->display); free(c); return NULL; +} +void lwl_gl_context_destroy(LwlGlContext *c) { if(!c)return; if(c->display!=EGL_NO_DISPLAY){eglMakeCurrent(c->display,EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);if(c->surface!=EGL_NO_SURFACE)eglDestroySurface(c->display,c->surface);if(c->context!=EGL_NO_CONTEXT)eglDestroyContext(c->display,c->context);eglTerminate(c->display);} if(g_context==c)g_context=NULL;free(c); } +bool lwl_gl_context_make_current(LwlGlContext *c) { return c&&eglMakeCurrent(c->display,c->surface,c->surface,c->context)==EGL_TRUE; } +void lwl_gl_context_swap_buffers(LwlGlContext *c) { if(c)eglSwapBuffers(c->display,c->surface); } +bool lwl_gl_context_set_swap_interval(LwlGlContext *c,int interval) { return c&&eglSwapInterval(c->display,interval)==EGL_TRUE; } +void *lwl_gl_get_proc_address(const char *name) { return (void *)eglGetProcAddress(name); } diff --git a/thirdparty/lwl/lwl_android.h b/thirdparty/lwl/lwl_android.h new file mode 100644 index 00000000..1b1ec9f5 --- /dev/null +++ b/thirdparty/lwl/lwl_android.h @@ -0,0 +1,19 @@ +#ifndef LWL_ANDROID_H +#define LWL_ANDROID_H + +#include + +struct android_app; + +#ifdef __cplusplus +extern "C" { +#endif + +void lwl_android_set_application(struct android_app *application); +bool lwl_android_wait_for_window(void); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/lwl/lwl_emscripten.c b/thirdparty/lwl/lwl_emscripten.c index 407a5768..ba9bd387 100644 --- a/thirdparty/lwl/lwl_emscripten.c +++ b/thirdparty/lwl/lwl_emscripten.c @@ -472,6 +472,12 @@ bool lwl_exe_path(char *buf, int size) { return false; } +bool lwl_data_path(char *buf, int size) { + (void) buf; + (void) size; + return false; +} + /* --- OpenGL / WebGL2 ----------------------------------------------------- */ LwlGlConfig lwl_gl_config_default(void) { diff --git a/thirdparty/lwl/lwl_macos.c b/thirdparty/lwl/lwl_macos.c index 244bbcb3..2bbe579d 100644 --- a/thirdparty/lwl/lwl_macos.c +++ b/thirdparty/lwl/lwl_macos.c @@ -909,6 +909,12 @@ bool lwl_exe_path(char *buf, int size) { return _NSGetExecutablePath(buf, &n) == 0; } +bool lwl_data_path(char *buf, int size) { + (void) buf; + (void) size; + return false; +} + LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; config.api = LWL_GL_API_DESKTOP; diff --git a/thirdparty/lwl/lwl_win32.c b/thirdparty/lwl/lwl_win32.c index 7901c4a9..31d9b19a 100644 --- a/thirdparty/lwl/lwl_win32.c +++ b/thirdparty/lwl/lwl_win32.c @@ -691,6 +691,12 @@ bool lwl_exe_path(char *buf, int size) { return true; } +bool lwl_data_path(char *buf, int size) { + (void) buf; + (void) size; + return false; +} + LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; config.api = LWL_GL_API_DESKTOP; diff --git a/thirdparty/lwl/lwl_x11.c b/thirdparty/lwl/lwl_x11.c index caf9a523..10e8cdad 100644 --- a/thirdparty/lwl/lwl_x11.c +++ b/thirdparty/lwl/lwl_x11.c @@ -1049,6 +1049,12 @@ bool lwl_exe_path(char *buf, int size) { return true; } +bool lwl_data_path(char *buf, int size) { + (void) buf; + (void) size; + return false; +} + LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; config.api = LWL_GL_API_DESKTOP; diff --git a/tools/android/build-apk.sh b/tools/android/build-apk.sh new file mode 100644 index 00000000..49ad0a67 --- /dev/null +++ b/tools/android/build-apk.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env sh + +set -eu + +ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) +ANDROID_DIR="$ROOT_DIR/platform/android" +GRADLE_WRAPPER="$ANDROID_DIR/gradlew" +GRADLE_APK="$ANDROID_DIR/app/build/outputs/apk/debug/app-debug.apk" +OUTPUT_DIR="$ROOT_DIR/build/android/debug" +OUTPUT_APK="$OUTPUT_DIR/OpenShadowFlare-android-debug.apk" + +if [ ! -f "$GRADLE_WRAPPER" ]; then + echo "Android Gradle wrapper not found: $GRADLE_WRAPPER" >&2 + exit 1 +fi + +sh "$GRADLE_WRAPPER" \ + -p "$ANDROID_DIR" \ + --no-daemon \ + :app:assembleDebug \ + "$@" + +if [ ! -f "$GRADLE_APK" ]; then + echo "Gradle did not produce the expected APK: $GRADLE_APK" >&2 + exit 1 +fi + +mkdir -p "$OUTPUT_DIR" +cp "$GRADLE_APK" "$OUTPUT_APK" +echo "APK: $OUTPUT_APK" From 25d7eebf75a767a915a892a1dada2eb334c6a4c8 Mon Sep 17 00:00:00 2001 From: Trulio Date: Sun, 2 Aug 2026 01:57:10 -0300 Subject: [PATCH 2/8] add gh workflow --- .github/workflows/android.yml | 64 +++++++++++++++++++++++ documentation/android-port.md | 32 ++++++++++++ platform/android/app/build.gradle | 1 + platform/android/local.properties.example | 6 +++ tools/android/build-apk.sh | 13 +++++ 5 files changed, 116 insertions(+) create mode 100644 .github/workflows/android.yml create mode 100644 platform/android/local.properties.example diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml new file mode 100644 index 00000000..756b343c --- /dev/null +++ b/.github/workflows/android.yml @@ -0,0 +1,64 @@ +name: Build Android APK + +on: + push: + paths: + - '.github/workflows/android.yml' + - 'CMakeLists.txt' + - 'platform/android/**' + - 'src/**' + - 'thirdparty/**' + - 'tools/android/**' + pull_request: + paths: + - '.github/workflows/android.yml' + - 'CMakeLists.txt' + - 'platform/android/**' + - 'src/**' + - 'thirdparty/**' + - 'tools/android/**' + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-24.04 + + steps: + - name: Check out the repository + uses: actions/checkout@v6 + + - name: Set up JDK 17 + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '17' + cache: gradle + + - name: Install Android build dependencies + run: | + SDKMANAGER="$ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager" + yes | "$SDKMANAGER" --licenses > /dev/null + "$SDKMANAGER" \ + 'platforms;android-35' \ + 'build-tools;35.0.0' \ + 'ndk;27.0.12077973' \ + 'cmake;4.1.2' + + - name: Set the SDK location for Gradle + run: printf 'sdk.dir=%s\n' "$ANDROID_HOME" > platform/android/local.properties + + - name: Build the debug APK + run: sh tools/android/build-apk.sh + + - name: Verify the APK + run: test -s build/android/debug/OpenShadowFlare-android-debug.apk + + - name: Upload the APK + uses: actions/upload-artifact@v4 + with: + name: openshadowflare-android-debug + path: build/android/debug/OpenShadowFlare-android-debug.apk + if-no-files-found: error diff --git a/documentation/android-port.md b/documentation/android-port.md index d07b7ebb..d80a6e9f 100644 --- a/documentation/android-port.md +++ b/documentation/android-port.md @@ -10,6 +10,31 @@ Android Studio is optional. Install a JDK 17 plus the Android command-line SDK tools, then install Android API 35, Build Tools 35.0.0, NDK 27.0.12077973, and CMake 4.1.2. +### Set the SDK location + +Gradle reads the SDK path from the untracked +`platform/android/local.properties` file. Copy the tracked template, then edit +the path for your machine: + +```bash +cp platform/android/local.properties.example platform/android/local.properties +``` + +For a standard Windows installation, the resulting file contains: + +```properties +sdk.dir=C:/Users//AppData/Local/Android/Sdk +``` + +On Linux, use the SDK's absolute path instead, for example: + +```properties +sdk.dir=/home//Android/Sdk +``` + +Forward slashes work on Windows. Do not commit this file: it is already listed +in `.gitignore` because the SDK location is machine-specific. + ```bash sh tools/android/build-apk.sh ``` @@ -20,6 +45,13 @@ The installable debug APK is written to: build/android/debug/OpenShadowFlare-android-debug.apk ``` +## GitHub Actions + +`Build Android APK` installs the required Android components, writes a temporary +`platform/android/local.properties` using the hosted runner's SDK path, and +uploads `openshadowflare-android-debug` as a workflow artifact. It never uses +or commits a developer's local SDK path. + The game data is not packaged. The app reads it from private app storage, so copy a legally obtained `ShadowFlare` directory containing `SFlare.Cfg` and `System/` after installing the APK. With an emulator connected through ADB: diff --git a/platform/android/app/build.gradle b/platform/android/app/build.gradle index 24636dc5..0009fcb3 100644 --- a/platform/android/app/build.gradle +++ b/platform/android/app/build.gradle @@ -5,6 +5,7 @@ plugins { android { namespace 'org.openshadowflare.game' compileSdk 35 + ndkVersion '27.0.12077973' defaultConfig { applicationId 'org.openshadowflare.game' diff --git a/platform/android/local.properties.example b/platform/android/local.properties.example new file mode 100644 index 00000000..95acf2cc --- /dev/null +++ b/platform/android/local.properties.example @@ -0,0 +1,6 @@ +# Copy this file to local.properties, then edit the SDK path for your platform. +# Forward slashes work on Windows. +# Windows example: +sdk.dir=C:/Users//AppData/Local/Android/Sdk +# Linux example (replace the Windows line above): +# sdk.dir=/home//Android/Sdk diff --git a/tools/android/build-apk.sh b/tools/android/build-apk.sh index 49ad0a67..e4c4c571 100644 --- a/tools/android/build-apk.sh +++ b/tools/android/build-apk.sh @@ -5,6 +5,7 @@ set -eu ROOT_DIR=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) ANDROID_DIR="$ROOT_DIR/platform/android" GRADLE_WRAPPER="$ANDROID_DIR/gradlew" +LOCAL_PROPERTIES="$ANDROID_DIR/local.properties" GRADLE_APK="$ANDROID_DIR/app/build/outputs/apk/debug/app-debug.apk" OUTPUT_DIR="$ROOT_DIR/build/android/debug" OUTPUT_APK="$OUTPUT_DIR/OpenShadowFlare-android-debug.apk" @@ -14,6 +15,18 @@ if [ ! -f "$GRADLE_WRAPPER" ]; then exit 1 fi +if [ ! -f "$LOCAL_PROPERTIES" ]; then + cat >&2 < Date: Sun, 2 Aug 2026 05:28:07 -0300 Subject: [PATCH 3/8] Fix switch lwl --- thirdparty/lwl/lwl_switch.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/thirdparty/lwl/lwl_switch.c b/thirdparty/lwl/lwl_switch.c index 05cae448..b843e3eb 100644 --- a/thirdparty/lwl/lwl_switch.c +++ b/thirdparty/lwl/lwl_switch.c @@ -409,6 +409,12 @@ bool lwl_exe_path(char *buf, int size) { return false; } +bool lwl_data_path(char *buf, int size) { + (void) buf; + (void) size; + return false; +} + LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; memset(&config, 0, sizeof(config)); From f23e8c3b142f7d5d144e684abb648fe0065e2a78 Mon Sep 17 00:00:00 2001 From: Trulio Date: Sun, 2 Aug 2026 12:16:08 -0300 Subject: [PATCH 4/8] Fix android workflow --- .github/workflows/android.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 756b343c..e28460e4 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -2,6 +2,8 @@ name: Build Android APK on: push: + branches: + - master paths: - '.github/workflows/android.yml' - 'CMakeLists.txt' @@ -22,6 +24,10 @@ on: permissions: contents: read +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-24.04 From 5b33ae360778e78d563ecbdac3f890608dbc6901 Mon Sep 17 00:00:00 2001 From: Trulio Date: Tue, 4 Aug 2026 06:42:58 -0300 Subject: [PATCH 5/8] Revert android sf_exe build --- CMakeLists.txt | 9 +- platform/android/app/build.gradle | 2 +- platform/android/native/osf_android_main.c | 56 ++++++ shadowflare/CMakeLists.txt | 83 ++++++-- src/SF_EXE/cmake/configure_platform.cmake | 3 - src/SF_EXE/cmake/platforms/Android.cmake | 27 --- .../platform/android/application_loop.cpp | 27 --- thirdparty/lal/CMakeLists.txt | 3 - thirdparty/lal/lal_aaudio.c | 108 ---------- thirdparty/lwl/CMakeLists.txt | 7 - thirdparty/lwl/lwl_android.c | 189 ------------------ 11 files changed, 125 insertions(+), 389 deletions(-) create mode 100644 platform/android/native/osf_android_main.c delete mode 100644 src/SF_EXE/cmake/platforms/Android.cmake delete mode 100644 src/SF_EXE/runtime/platform/android/application_loop.cpp delete mode 100644 thirdparty/lal/lal_aaudio.c delete mode 100644 thirdparty/lwl/lwl_android.c diff --git a/CMakeLists.txt b/CMakeLists.txt index fa0f2a4b..a619eb15 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,11 +40,14 @@ set_property( PROPERTY STRINGS lgl nxfb ) -add_subdirectory(thirdparty/lwl) -add_subdirectory(thirdparty/lal) +if(OPENSHADOWFLARE_BUILD_EXE OR BUILD_TESTING) + add_subdirectory(thirdparty/lwl) + add_subdirectory(thirdparty/lal) +endif() add_subdirectory(thirdparty/twl) add_subdirectory(thirdparty/tal) -if(OPENSHADOWFLARE_PRESENTATION_BACKEND STREQUAL "lgl" OR BUILD_TESTING) +if((OPENSHADOWFLARE_BUILD_EXE AND + OPENSHADOWFLARE_PRESENTATION_BACKEND STREQUAL "lgl") OR BUILD_TESTING) add_subdirectory(thirdparty/lgl) endif() diff --git a/platform/android/app/build.gradle b/platform/android/app/build.gradle index 0009fcb3..790f578b 100644 --- a/platform/android/app/build.gradle +++ b/platform/android/app/build.gradle @@ -21,7 +21,7 @@ android { externalNativeBuild { cmake { cppFlags '-std=c++17' - arguments '-DBUILD_TESTING=OFF' + arguments '-DBUILD_TESTING=OFF', '-DOPENSHADOWFLARE_BUILD_EXE=OFF' } } } diff --git a/platform/android/native/osf_android_main.c b/platform/android/native/osf_android_main.c new file mode 100644 index 00000000..ab64017c --- /dev/null +++ b/platform/android/native/osf_android_main.c @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of OpenShadowFlare. + * + * OpenShadowFlare is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * + * OpenShadowFlare is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * details. + * + * You should have received a copy of the GNU General Public License along + * with OpenShadowFlare. If not, see . + */ + +/* + * Android entry glue for the C99 runtime. The app is a NativeActivity, so the + * entry point is android_main (via native_app_glue), not main(): this file + * provides the fixed memory pools (the job main.c does on other platforms), + * hands the android_app to the TWL Android backend, and resolves the retail + * data from the app's external files directory. It lives outside shadowflare/ + * because it uses the Android SDK. + */ + +#include + +#include "core/memory_budget.h" +#include "runtime/application.h" + +#include +#include +#include + +static uint8_t g_main_memory[SF_MAIN_ARENA_BYTES]; +static uint8_t g_video_memory[SF_VIDEO_MEMORY_LIMIT_BYTES]; + +void android_main(struct android_app *app) { + char data_root[512]; + const char *external = + (app && app->activity) ? app->activity->externalDataPath : NULL; + const char *requested = NULL; + if (external) { + /* App-scoped external storage, e.g. + * /sdcard/Android/data/org.openshadowflare.game/files/ShadowFlare */ + snprintf(data_root, sizeof(data_root), "%s/ShadowFlare", external); + requested = data_root; + } + sf_application_run( + g_main_memory, sizeof(g_main_memory), + g_video_memory, sizeof(g_video_memory), + NULL, requested); +} diff --git a/shadowflare/CMakeLists.txt b/shadowflare/CMakeLists.txt index 21bc6328..18ed2e1a 100644 --- a/shadowflare/CMakeLists.txt +++ b/shadowflare/CMakeLists.txt @@ -157,14 +157,51 @@ add_library( add_library(ShadowFlare::Core ALIAS shadowflare_core) sf_configure_c99_target(shadowflare_core) -add_executable( - osf - main.c - runtime/application.c - runtime/screen_runtime.c -) -add_executable(ShadowFlare::Game ALIAS osf) -sf_configure_c99_target(osf) +if(ANDROID) + add_library( + osf + SHARED + runtime/application.c + runtime/screen_runtime.c + ) + set_target_properties(osf PROPERTIES OUTPUT_NAME main) + add_library(ShadowFlare::Game ALIAS osf) + sf_configure_c99_target(osf) + + add_library( + osf_android_entry + STATIC + "${PROJECT_SOURCE_DIR}/platform/android/native/osf_android_main.c" + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c" + ) + target_include_directories( + osf_android_entry + PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" + ) + target_link_libraries(osf_android_entry PRIVATE android log) + target_link_libraries( + osf + PRIVATE + osf_android_entry + android + log + EGL + GLESv3 + aaudio + ) + target_link_options(osf PRIVATE "LINKER:-u,ANativeActivity_onCreate") +else() + add_executable( + osf + main.c + runtime/application.c + runtime/screen_runtime.c + ) + add_executable(ShadowFlare::Game ALIAS osf) + sf_configure_c99_target(osf) +endif() set( OPENSHADOWFLARE_C99_PRESENTATION_HZ "60" @@ -194,17 +231,21 @@ if(OPENSHADOWFLARE_ENABLE_DEBUG_TOOLS) target_link_libraries(osf PRIVATE ShadowFlare::Profiler) target_compile_definitions(osf PRIVATE SF_ENABLE_PROFILING=1) - add_executable( - osf-measure - ../utils/osf-measure.c - runtime/screen_runtime.c - ) - sf_configure_c99_target(osf-measure) - target_link_libraries( - osf-measure - PRIVATE - ShadowFlare::Core - Tal::Tal - Twl::Twl - ) + # osf-measure is a host measurement tool with a main(); Android ships only the + # NativeActivity shared library, so skip it there. + if(NOT ANDROID) + add_executable( + osf-measure + ../utils/osf-measure.c + runtime/screen_runtime.c + ) + sf_configure_c99_target(osf-measure) + target_link_libraries( + osf-measure + PRIVATE + ShadowFlare::Core + Tal::Tal + Twl::Twl + ) + endif() endif() diff --git a/src/SF_EXE/cmake/configure_platform.cmake b/src/SF_EXE/cmake/configure_platform.cmake index c6a45781..456288fc 100644 --- a/src/SF_EXE/cmake/configure_platform.cmake +++ b/src/SF_EXE/cmake/configure_platform.cmake @@ -2,9 +2,6 @@ function(osf_configure_platform target) if(EMSCRIPTEN) include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/platforms/Emscripten.cmake") osf_configure_emscripten_platform(${target}) - elseif(ANDROID) - include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/platforms/Android.cmake") - osf_configure_android_platform(${target}) elseif(NINTENDO_SWITCH) include("${CMAKE_CURRENT_FUNCTION_LIST_DIR}/platforms/Switch.cmake") osf_configure_switch_platform(${target}) diff --git a/src/SF_EXE/cmake/platforms/Android.cmake b/src/SF_EXE/cmake/platforms/Android.cmake deleted file mode 100644 index 020abdbe..00000000 --- a/src/SF_EXE/cmake/platforms/Android.cmake +++ /dev/null @@ -1,27 +0,0 @@ -function(osf_configure_android_platform target) - target_sources( - ${target} - PRIVATE - runtime/platform/android/application_loop.cpp - ) - target_compile_definitions(${target} PRIVATE OSF_PLATFORM_ANDROID) - - target_sources( - ${target} - PRIVATE - "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c" - ) - target_include_directories( - ${target} - PRIVATE - "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" - ) - target_link_libraries( - ${target} - PRIVATE - android - log - ) - - set_target_properties(${target} PROPERTIES OUTPUT_NAME main) -endfunction() diff --git a/src/SF_EXE/runtime/platform/android/application_loop.cpp b/src/SF_EXE/runtime/platform/android/application_loop.cpp deleted file mode 100644 index 48e3a32e..00000000 --- a/src/SF_EXE/runtime/platform/android/application_loop.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "runtime/application_loop.hpp" - -#include "runtime/game_runtime.hpp" - -#include "lwl_android.h" - -#include - -#include - -extern "C" void android_main(android_app* application) { - lwl_android_set_application(application); - if (lwl_android_wait_for_window()) { - osf::runtime::runMain(0, nullptr); - } - lwl_android_set_application(nullptr); -} - -namespace osf::runtime { - -int runApplicationLoop(std::unique_ptr application) { - while (application->frame()) { - } - return 0; -} - -} // namespace osf::runtime diff --git a/thirdparty/lal/CMakeLists.txt b/thirdparty/lal/CMakeLists.txt index d1b404c0..6d19e0ec 100644 --- a/thirdparty/lal/CMakeLists.txt +++ b/thirdparty/lal/CMakeLists.txt @@ -74,9 +74,6 @@ endif() if(EMSCRIPTEN) target_sources(lal PRIVATE lal_webaudio.c) -elseif(ANDROID) - target_sources(lal PRIVATE lal_aaudio.c) - target_link_libraries(lal PRIVATE aaudio log) elseif(WIN32) target_sources(lal PRIVATE lal_waveout.c) target_link_libraries(lal PRIVATE winmm) diff --git a/thirdparty/lal/lal_aaudio.c b/thirdparty/lal/lal_aaudio.c deleted file mode 100644 index 33e8b18b..00000000 --- a/thirdparty/lal/lal_aaudio.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "lal_internal.h" - -#include - -#include -#include -#include -#include - -static AAudioStream *g_stream; -static pthread_mutex_t g_mutex; -static bool g_mutex_ready; -static bool g_running; - -static aaudio_data_callback_result_t lal_aaudio_callback( - AAudioStream *stream, void *user_data, void *audio_data, - int32_t frame_count) { - bool running; - (void) stream; - (void) user_data; - - pthread_mutex_lock(&g_mutex); - running = g_running; - if (running) { - lal_mix_frames((int16_t *) audio_data, (size_t) frame_count); - } - pthread_mutex_unlock(&g_mutex); - if (!running) { - memset(audio_data, 0, (size_t) frame_count * LAL_OUTPUT_CHANNELS * - sizeof(int16_t)); - } - return AAUDIO_CALLBACK_RESULT_CONTINUE; -} - -bool lal_platform_init(void) { - AAudioStreamBuilder *builder = NULL; - aaudio_result_t result; - - if (pthread_mutex_init(&g_mutex, NULL) != 0) { - lal_set_error("Could not create the Android audio mutex."); - return false; - } - g_mutex_ready = true; - result = AAudio_createStreamBuilder(&builder); - if (result != AAUDIO_OK) { - lal_set_error("Could not create the Android audio stream builder."); - lal_platform_shutdown(); - return false; - } - AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT); - AAudioStreamBuilder_setFormat(builder, AAUDIO_FORMAT_PCM_I16); - AAudioStreamBuilder_setSampleRate(builder, LAL_OUTPUT_SAMPLE_RATE); - AAudioStreamBuilder_setChannelCount(builder, LAL_OUTPUT_CHANNELS); - AAudioStreamBuilder_setPerformanceMode( - builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); - AAudioStreamBuilder_setDataCallback(builder, lal_aaudio_callback, NULL); - result = AAudioStreamBuilder_openStream(builder, &g_stream); - AAudioStreamBuilder_delete(builder); - if (result != AAUDIO_OK || !g_stream) { - lal_set_error("Could not open the Android audio output stream."); - lal_platform_shutdown(); - return false; - } - if (AAudioStream_getSampleRate(g_stream) != LAL_OUTPUT_SAMPLE_RATE || - AAudioStream_getChannelCount(g_stream) != LAL_OUTPUT_CHANNELS || - AAudioStream_getFormat(g_stream) != AAUDIO_FORMAT_PCM_I16) { - lal_set_error("Android audio did not accept 44.1 kHz stereo PCM."); - lal_platform_shutdown(); - return false; - } - g_running = true; - result = AAudioStream_requestStart(g_stream); - if (result != AAUDIO_OK) { - lal_set_error("Could not start the Android audio output stream."); - lal_platform_shutdown(); - return false; - } - return true; -} - -void lal_platform_shutdown(void) { - if (g_mutex_ready) { - pthread_mutex_lock(&g_mutex); - g_running = false; - pthread_mutex_unlock(&g_mutex); - } - if (g_stream) { - AAudioStream_requestStop(g_stream); - AAudioStream_close(g_stream); - g_stream = NULL; - } - if (g_mutex_ready) { - pthread_mutex_destroy(&g_mutex); - g_mutex_ready = false; - } -} - -void lal_platform_lock(void) { - if (g_mutex_ready) { - pthread_mutex_lock(&g_mutex); - } -} - -void lal_platform_unlock(void) { - if (g_mutex_ready) { - pthread_mutex_unlock(&g_mutex); - } -} diff --git a/thirdparty/lwl/CMakeLists.txt b/thirdparty/lwl/CMakeLists.txt index 6829d0c4..f27651fc 100644 --- a/thirdparty/lwl/CMakeLists.txt +++ b/thirdparty/lwl/CMakeLists.txt @@ -39,13 +39,6 @@ if(EMSCRIPTEN) "-sMAX_WEBGL_VERSION=2" "-sGL_ENABLE_GET_PROC_ADDRESS=1" ) -elseif(ANDROID) - target_sources(lwl PRIVATE lwl_android.c) - target_include_directories( - lwl PRIVATE - "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" - ) - target_link_libraries(lwl PRIVATE android EGL GLESv3 log) elseif(WIN32) target_sources(lwl PRIVATE lwl_win32.c) target_link_libraries( diff --git a/thirdparty/lwl/lwl_android.c b/thirdparty/lwl/lwl_android.c deleted file mode 100644 index 3ce673ec..00000000 --- a/thirdparty/lwl/lwl_android.c +++ /dev/null @@ -1,189 +0,0 @@ -#include "lwl.h" -#include "lwl_android.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -enum { LWL_EVENT_CAPACITY = 64 }; - -struct LwlWindow { int width, height; bool focused; }; -struct LwlGlContext { EGLDisplay display; EGLContext context; EGLSurface surface; }; - -static struct android_app *g_application; -static struct LwlWindow g_window; -static struct LwlGlContext *g_context; -static LwlEvent g_events[LWL_EVENT_CAPACITY]; -static int g_event_head, g_event_tail; -static int g_pointer_x, g_pointer_y; - -static void push_event(const LwlEvent *event) { - int next = (g_event_tail + 1) % LWL_EVENT_CAPACITY; - if (next == g_event_head) g_event_head = (g_event_head + 1) % LWL_EVENT_CAPACITY; - g_events[g_event_tail] = *event; - g_event_tail = next; -} - -static bool pop_event(LwlEvent *event) { - if (g_event_head == g_event_tail) return false; - *event = g_events[g_event_head]; - g_event_head = (g_event_head + 1) % LWL_EVENT_CAPACITY; - return true; -} - -static void resize_window(void) { - if (!g_application || !g_application->window) return; - g_window.width = ANativeWindow_getWidth(g_application->window); - g_window.height = ANativeWindow_getHeight(g_application->window); - LwlEvent event = {0}; - event.type = LWL_EVENT_RESIZED; - event.x = g_window.width; - event.y = g_window.height; - push_event(&event); -} - -static void on_command(struct android_app *app, int32_t command) { - (void) app; - switch (command) { - case APP_CMD_INIT_WINDOW: - case APP_CMD_WINDOW_RESIZED: - resize_window(); - break; - case APP_CMD_GAINED_FOCUS: g_window.focused = true; break; - case APP_CMD_LOST_FOCUS: g_window.focused = false; break; - case APP_CMD_DESTROY: { - LwlEvent event = {0}; event.type = LWL_EVENT_QUIT; push_event(&event); break; - } - } -} - -static void key_name(int32_t keycode, char *out, size_t size) { - const char *key = ""; - switch (keycode) { - case AKEYCODE_DPAD_UP: key = "up"; break; - case AKEYCODE_DPAD_DOWN: key = "down"; break; - case AKEYCODE_DPAD_LEFT: key = "left"; break; - case AKEYCODE_DPAD_RIGHT: key = "right"; break; - case AKEYCODE_ENTER: case AKEYCODE_DPAD_CENTER: key = "return"; break; - case AKEYCODE_BACK: key = "escape"; break; - case AKEYCODE_DEL: key = "backspace"; break; - case AKEYCODE_FORWARD_DEL: key = "delete"; break; - case AKEYCODE_TAB: key = "tab"; break; - case AKEYCODE_SPACE: key = "space"; break; - default: - if (keycode >= AKEYCODE_A && keycode <= AKEYCODE_Z) { - out[0] = (char) ('a' + keycode - AKEYCODE_A); out[1] = '\0'; return; - } - if (keycode >= AKEYCODE_0 && keycode <= AKEYCODE_9) { - out[0] = (char) ('0' + keycode - AKEYCODE_0); out[1] = '\0'; return; - } - break; - } - strncpy(out, key, size - 1); out[size - 1] = '\0'; -} - -static int32_t on_input(struct android_app *app, AInputEvent *input) { - (void) app; - if (AInputEvent_getType(input) == AINPUT_EVENT_TYPE_MOTION) { - int32_t action = AMotionEvent_getAction(input) & AMOTION_EVENT_ACTION_MASK; - LwlEvent event = {0}; - g_pointer_x = (int) AMotionEvent_getX(input, 0); - g_pointer_y = (int) AMotionEvent_getY(input, 0); - event.x = g_pointer_x; event.y = g_pointer_y; event.button = 1; - if (action == AMOTION_EVENT_ACTION_DOWN) { event.type = LWL_EVENT_MOUSE_DOWN; event.clicks = 1; } - else if (action == AMOTION_EVENT_ACTION_UP || action == AMOTION_EVENT_ACTION_CANCEL) { event.type = LWL_EVENT_MOUSE_UP; event.clicks = 1; } - else if (action == AMOTION_EVENT_ACTION_MOVE) event.type = LWL_EVENT_MOUSE_MOVE; - else return 0; - push_event(&event); return 1; - } - if (AInputEvent_getType(input) == AINPUT_EVENT_TYPE_KEY) { - int32_t action = AKeyEvent_getAction(input); - if (action != AKEY_EVENT_ACTION_DOWN && action != AKEY_EVENT_ACTION_UP) return 0; - LwlEvent event = {0}; - event.type = action == AKEY_EVENT_ACTION_DOWN ? LWL_EVENT_KEY_DOWN : LWL_EVENT_KEY_UP; - key_name(AKeyEvent_getKeyCode(input), event.key, sizeof(event.key)); - if (event.key[0]) { push_event(&event); return 1; } - } - return 0; -} - -static void pump_events(int timeout) { - int events; struct android_poll_source *source; - while (ALooper_pollOnce(timeout, NULL, &events, (void **) &source) >= 0) { - if (source) source->process(g_application, source); - if (!g_application || g_application->destroyRequested) break; - timeout = 0; - } -} - -void lwl_android_set_application(struct android_app *application) { - g_application = application; - if (!application) return; - application->onAppCmd = on_command; - application->onInputEvent = on_input; - if (application->activity->internalDataPath) { - chdir(application->activity->internalDataPath); - } -} - -bool lwl_android_wait_for_window(void) { - while (g_application && !g_application->destroyRequested && !g_application->window) pump_events(-1); - return g_application && !g_application->destroyRequested; -} - -bool lwl_init(void) { return g_application != NULL; } -void lwl_shutdown(void) { g_event_head = g_event_tail = 0; } -LwlWindow *lwl_window_create(const char *title, int width, int height) { - (void) title; g_window.width = width; g_window.height = height; g_window.focused = true; resize_window(); return &g_window; -} -LwlWindow *lwl_window_create_with_native_message_handler(const char *t, int w, int h, LwlNativeMessageHandler handler, void *data) { (void) handler; (void) data; return lwl_window_create(t,w,h); } -LwlWindow *lwl_window_attach_native(void *native_window, int width, int height) { (void) native_window; return lwl_window_create(NULL,width,height); } -void *lwl_window_get_native_handle(LwlWindow *window) { (void) window; return g_application ? g_application->window : NULL; } -void lwl_window_destroy(LwlWindow *window) { (void) window; } -void lwl_window_show(LwlWindow *window) { (void) window; } -void lwl_window_set_title(LwlWindow *window, const char *title) { (void) window; (void) title; } -void lwl_window_set_mode(LwlWindow *window, LwlWindowMode mode) { (void) window; (void) mode; } -bool lwl_window_has_focus(LwlWindow *window) { return window && window->focused; } -void lwl_window_set_cursor(LwlWindow *window, LwlCursor cursor) { (void) window; (void) cursor; } -bool lwl_window_set_cursor_image(LwlWindow *w,const LwlColor *p,int a,int b,int c,int d) { (void)w;(void)p;(void)a;(void)b;(void)c;(void)d; return false; } -void lwl_window_set_cursor_visible(LwlWindow *window, bool visible) { (void) window; (void) visible; } -bool lwl_window_set_size(LwlWindow *window, int width, int height) { if (!window) return false; window->width=width; window->height=height; return true; } -void lwl_window_get_size(LwlWindow *window, int *width, int *height) { if (width) *width=window?window->width:0; if (height) *height=window?window->height:0; } -LwlColor *lwl_window_get_framebuffer(LwlWindow *w,int *x,int *y) { (void)w; if(x)*x=0;if(y)*y=0;return NULL; } -bool lwl_window_resize_framebuffer(LwlWindow *w,int x,int y) { (void)w;(void)x;(void)y;return false; } -void lwl_window_update_rects(LwlWindow *w,const LwlRect *r,int c) { (void)w;(void)r;(void)c; } -bool lwl_poll_event(LwlWindow *window, LwlEvent *event) { (void) window; if (!event) return false; if (pop_event(event)) return true; pump_events(0); return pop_event(event); } -bool lwl_wait_event(LwlWindow *window, double timeout) { (void)window; if(g_event_head!=g_event_tail)return true; pump_events((int)(timeout*1000.0)); return g_event_head!=g_event_tail; } -char *lwl_clipboard_get(LwlWindow *w) { (void)w;return NULL; } void lwl_clipboard_set(LwlWindow *w,const char *t) { (void)w;(void)t; } char *lwl_select_folder(LwlWindow *w,const char *t) { (void)w;(void)t;return NULL; } void lwl_free(void *p) { free(p); } -double lwl_time_seconds(void) { struct timespec ts; clock_gettime(CLOCK_MONOTONIC,&ts); return ts.tv_sec + ts.tv_nsec/1000000000.0; } -void lwl_sleep_seconds(double s) { if(s>0) usleep((useconds_t)(s*1000000.0)); } void lwl_sleep_until_seconds(double t) { double now=lwl_time_seconds(); if(t>now)lwl_sleep_seconds(t-now); } -const char *lwl_platform_name(void) { return "android"; } double lwl_display_scale(void) { return 1.0; } bool lwl_exe_path(char *b,int s) { (void)b;(void)s;return false; } -bool lwl_data_path(char *buffer, int size) { - if (!buffer || size <= 0 || !g_application || - !g_application->activity || - !g_application->activity->internalDataPath) return false; - int length = snprintf( - buffer, (size_t) size, "%s", - g_application->activity->internalDataPath); - return length >= 0 && length < size; -} -LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig c={0};c.api=LWL_GL_API_ES;c.major_version=3;c.depth_bits=24;c.double_buffer=true;return c; } -LwlGlContext *lwl_gl_context_create(LwlWindow *window,const LwlGlConfig *requested) { - const EGLint attrs[]={EGL_RENDERABLE_TYPE,EGL_OPENGL_ES3_BIT_KHR,EGL_SURFACE_TYPE,EGL_WINDOW_BIT,EGL_RED_SIZE,8,EGL_GREEN_SIZE,8,EGL_BLUE_SIZE,8,EGL_NONE}; EGLConfig config; EGLint count; LwlGlConfig wanted=requested?*requested:lwl_gl_config_default(); - if(!window||!g_application||!g_application->window||wanted.api!=LWL_GL_API_ES||wanted.major_version!=3)return NULL; - LwlGlContext *c=calloc(1,sizeof(*c)); if(!c)return NULL; c->display=eglGetDisplay(EGL_DEFAULT_DISPLAY); if(c->display==EGL_NO_DISPLAY||!eglInitialize(c->display,NULL,NULL)||!eglChooseConfig(c->display,attrs,&config,1,&count)||count<1)goto fail; - const EGLint context_attrs[]={EGL_CONTEXT_CLIENT_VERSION,3,EGL_NONE}; c->context=eglCreateContext(c->display,config,EGL_NO_CONTEXT,context_attrs); c->surface=eglCreateWindowSurface(c->display,config,g_application->window,NULL); if(c->context==EGL_NO_CONTEXT||c->surface==EGL_NO_SURFACE||!eglMakeCurrent(c->display,c->surface,c->surface,c->context))goto fail; g_context=c; return c; -fail: if(c->display!=EGL_NO_DISPLAY)eglTerminate(c->display); free(c); return NULL; -} -void lwl_gl_context_destroy(LwlGlContext *c) { if(!c)return; if(c->display!=EGL_NO_DISPLAY){eglMakeCurrent(c->display,EGL_NO_SURFACE,EGL_NO_SURFACE,EGL_NO_CONTEXT);if(c->surface!=EGL_NO_SURFACE)eglDestroySurface(c->display,c->surface);if(c->context!=EGL_NO_CONTEXT)eglDestroyContext(c->display,c->context);eglTerminate(c->display);} if(g_context==c)g_context=NULL;free(c); } -bool lwl_gl_context_make_current(LwlGlContext *c) { return c&&eglMakeCurrent(c->display,c->surface,c->surface,c->context)==EGL_TRUE; } -void lwl_gl_context_swap_buffers(LwlGlContext *c) { if(c)eglSwapBuffers(c->display,c->surface); } -bool lwl_gl_context_set_swap_interval(LwlGlContext *c,int interval) { return c&&eglSwapInterval(c->display,interval)==EGL_TRUE; } -void *lwl_gl_get_proc_address(const char *name) { return (void *)eglGetProcAddress(name); } From 6e15130837c16bd1362c40e6ef70d9c47debd5f0 Mon Sep 17 00:00:00 2001 From: Trulio Date: Tue, 4 Aug 2026 11:09:51 -0300 Subject: [PATCH 6/8] Add android twl and tal backends --- documentation/android-port.md | 70 ++-- platform/android/app/build.gradle | 7 +- .../android/app/src/main/AndroidManifest.xml | 1 + .../res/drawable/ic_launcher_foreground.xml | 4 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 85801 bytes .../app/src/main/res/values/colors.xml | 4 + platform/android/gradle.properties | 13 + platform/android/native/osf_android_main.c | 13 +- shadowflare/CMakeLists.txt | 12 +- thirdparty/tal/CMakeLists.txt | 3 + thirdparty/tal/tal_android.c | 194 +++++++++++ thirdparty/twl/CMakeLists.txt | 14 + thirdparty/twl/backends/android/backend.h | 61 ++++ thirdparty/twl/backends/android/input.c | 165 +++++++++ .../twl/backends/android/presentation.c | 89 +++++ thirdparty/twl/backends/android/twl_android.h | 34 ++ thirdparty/twl/backends/android/window.c | 329 ++++++++++++++++++ tools/android/build-apk.sh | 1 - 19 files changed, 961 insertions(+), 58 deletions(-) create mode 100644 platform/android/app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 platform/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 platform/android/app/src/main/res/values/colors.xml create mode 100644 platform/android/gradle.properties create mode 100644 thirdparty/tal/tal_android.c create mode 100644 thirdparty/twl/backends/android/backend.h create mode 100644 thirdparty/twl/backends/android/input.c create mode 100644 thirdparty/twl/backends/android/presentation.c create mode 100644 thirdparty/twl/backends/android/twl_android.h create mode 100644 thirdparty/twl/backends/android/window.c diff --git a/documentation/android-port.md b/documentation/android-port.md index d80a6e9f..b6ff5157 100644 --- a/documentation/android-port.md +++ b/documentation/android-port.md @@ -1,39 +1,45 @@ # Android port -The Android build uses NativeActivity, the Android NDK, EGL/OpenGL ES 3 for -the existing LGL surface presenter, and AAudio for 44.1 kHz stereo output. -It supports Android 8.0 (API 26) or newer. +OpenShadowFlare runs on Android 8.0 (API 26) or newer as a NativeActivity. It +draws through the TWL backend (EGL + OpenGL ES 2, GPU-scaled to an aspect-fit +rectangle) and plays audio through TAL on AAudio (44.1 kHz stereo). The game is +the native shared library `libmain.so`; there is no Java or Kotlin code. -## Build +## What to install + +Android Studio is optional. Install a JDK 17 and the Android command-line SDK +tools, then use them to install: -Android Studio is optional. Install a JDK 17 plus the Android command-line -SDK tools, then install Android API 35, Build Tools 35.0.0, NDK 27.0.12077973, -and CMake 4.1.2. +- Android SDK Platform 35 +- Build Tools 35.0.0 +- NDK 27.0.12077973 +- CMake 4.1.2 ### Set the SDK location Gradle reads the SDK path from the untracked -`platform/android/local.properties` file. Copy the tracked template, then edit -the path for your machine: +`platform/android/local.properties`. Copy the tracked template and edit the path +for your machine: ```bash cp platform/android/local.properties.example platform/android/local.properties ``` -For a standard Windows installation, the resulting file contains: +Windows (forward slashes are fine): ```properties sdk.dir=C:/Users//AppData/Local/Android/Sdk ``` -On Linux, use the SDK's absolute path instead, for example: +Linux: ```properties sdk.dir=/home//Android/Sdk ``` -Forward slashes work on Windows. Do not commit this file: it is already listed -in `.gitignore` because the SDK location is machine-specific. +Do not commit this file; it is machine-specific and already in `.gitignore`. + +## Build ```bash sh tools/android/build-apk.sh @@ -45,29 +51,23 @@ The installable debug APK is written to: build/android/debug/OpenShadowFlare-android-debug.apk ``` -## GitHub Actions - -`Build Android APK` installs the required Android components, writes a temporary -`platform/android/local.properties` using the hosted runner's SDK path, and -uploads `openshadowflare-android-debug` as a workflow artifact. It never uses -or commits a developer's local SDK path. +## Game data -The game data is not packaged. The app reads it from private app storage, so -copy a legally obtained `ShadowFlare` directory containing `SFlare.Cfg` and -`System/` after installing the APK. With an emulator connected through ADB: +The retail data is not packaged. After installing the APK, copy `ShadowFlare` directory to the app's external files directory so the game finds it at: -```bash -# Use ADB=adb when platform-tools is already on PATH. On Git Bash with the -# standard Windows SDK location, replace with your account name. -ADB=/... - -# From the repository root -tar -C tmp -cf - ShadowFlare | "$ADB" exec-in sh -c 'tar -xf - -C /sdcard/Android/data/org.openshadowflare.game/files' -"$ADB" shell run-as org.openshadowflare.game mkdir -p files -"$ADB" shell "cd /sdcard/Android/data/org.openshadowflare.game/files/ShadowFlare && tar -cf - . | run-as org.openshadowflare.game tar -xf - -C files" +```text +/sdcard/Android/data/org.openshadowflare.game/files/ShadowFlare/ ``` -The first command uses a temporary external staging folder; the second places -the files in the app-owned directory where Android permits native file access. -Repeat both commands after uninstalling the app, since uninstalling clears its -private data. +That folder must hold the retail data at its top level, for example: + +```text +ShadowFlare/ +├── SFlare.Cfg +├── System/ +├── Map/ +├── Player/ +├── Character/ +├── Scenario/ +└── Save/ +``` diff --git a/platform/android/app/build.gradle b/platform/android/app/build.gradle index 790f578b..7747245f 100644 --- a/platform/android/app/build.gradle +++ b/platform/android/app/build.gradle @@ -15,7 +15,12 @@ android { versionName '0.1.0' ndk { - abiFilters 'arm64-v8a', 'x86_64' + def osfAbi = project.findProperty('osfAbi') + if (osfAbi) { + abiFilters osfAbi.toString() + } else { + abiFilters 'arm64-v8a', 'x86_64' + } } externalNativeBuild { diff --git a/platform/android/app/src/main/AndroidManifest.xml b/platform/android/app/src/main/AndroidManifest.xml index 0818f2c3..5bfe2617 100644 --- a/platform/android/app/src/main/AndroidManifest.xml +++ b/platform/android/app/src/main/AndroidManifest.xml @@ -2,6 +2,7 @@ + diff --git a/platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..a8a8fa55 --- /dev/null +++ b/platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/platform/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/platform/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c1c9c1a86631985ce82fb3ae1e9169953a1f3b GIT binary patch literal 85801 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�`PjEyzA8x;2$v_e7ZN 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�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 + + #181410 + diff --git a/platform/android/gradle.properties b/platform/android/gradle.properties new file mode 100644 index 00000000..74cc53f4 --- /dev/null +++ b/platform/android/gradle.properties @@ -0,0 +1,13 @@ +# Reuse a warm Gradle daemon between builds instead of starting a fresh JVM each +# time (the build script no longer passes --no-daemon). +org.gradle.daemon=true + +# Run independent work in parallel and reuse task outputs across builds. +org.gradle.parallel=true +org.gradle.caching=true + +# Skip the configuration phase when nothing that affects it has changed. +org.gradle.configuration-cache=true + +# Give the daemon enough heap to avoid GC pauses on larger builds. +org.gradle.jvmargs=-Xmx2048m diff --git a/platform/android/native/osf_android_main.c b/platform/android/native/osf_android_main.c index ab64017c..7c612668 100644 --- a/platform/android/native/osf_android_main.c +++ b/platform/android/native/osf_android_main.c @@ -17,17 +17,9 @@ * with OpenShadowFlare. If not, see . */ -/* - * Android entry glue for the C99 runtime. The app is a NativeActivity, so the - * entry point is android_main (via native_app_glue), not main(): this file - * provides the fixed memory pools (the job main.c does on other platforms), - * hands the android_app to the TWL Android backend, and resolves the retail - * data from the app's external files directory. It lives outside shadowflare/ - * because it uses the Android SDK. - */ - #include +#include "backends/android/twl_android.h" #include "core/memory_budget.h" #include "runtime/application.h" @@ -44,11 +36,10 @@ void android_main(struct android_app *app) { (app && app->activity) ? app->activity->externalDataPath : NULL; const char *requested = NULL; if (external) { - /* App-scoped external storage, e.g. - * /sdcard/Android/data/org.openshadowflare.game/files/ShadowFlare */ snprintf(data_root, sizeof(data_root), "%s/ShadowFlare", external); requested = data_root; } + twl_android_set_app(app); sf_application_run( g_main_memory, sizeof(g_main_memory), g_video_memory, sizeof(g_video_memory), diff --git a/shadowflare/CMakeLists.txt b/shadowflare/CMakeLists.txt index 18ed2e1a..7abbbc95 100644 --- a/shadowflare/CMakeLists.txt +++ b/shadowflare/CMakeLists.txt @@ -178,19 +178,11 @@ if(ANDROID) osf_android_entry PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}" + "${PROJECT_SOURCE_DIR}/thirdparty/twl" "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" ) target_link_libraries(osf_android_entry PRIVATE android log) - target_link_libraries( - osf - PRIVATE - osf_android_entry - android - log - EGL - GLESv3 - aaudio - ) + target_link_libraries(osf PRIVATE osf_android_entry) target_link_options(osf PRIVATE "LINKER:-u,ANativeActivity_onCreate") else() add_executable( diff --git a/thirdparty/tal/CMakeLists.txt b/thirdparty/tal/CMakeLists.txt index 65935042..1a16ec4c 100644 --- a/thirdparty/tal/CMakeLists.txt +++ b/thirdparty/tal/CMakeLists.txt @@ -44,6 +44,9 @@ elseif(APPLE) "${TAL_AUDIOUNIT_FRAMEWORK}" Threads::Threads ) +elseif(ANDROID) + target_sources(tal PRIVATE tal_android.c) + target_link_libraries(tal PRIVATE aaudio) elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") target_sources(tal PRIVATE tal_alsa.c) find_package(ALSA REQUIRED) diff --git a/thirdparty/tal/tal_android.c b/thirdparty/tal/tal_android.c new file mode 100644 index 00000000..5390c0f3 --- /dev/null +++ b/thirdparty/tal/tal_android.c @@ -0,0 +1,194 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of TAL. + * + * TAL is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TAL is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with TAL. If not, see . + */ + +#include "tal_internal.h" + +#include + +#include + +#define TAL_ANDROID_OUTPUT_SAMPLE_RATE 44100 +#define TAL_ANDROID_OUTPUT_CHANNELS 2 +#define TAL_ANDROID_CALLBACK_FRAMES 256u +#define TAL_ANDROID_MAX_INPUT_FRAMES 256u + +typedef struct { + Tal *tal; + AAudioStream *stream; + pthread_mutex_t mutex; + uint32_t out_rate; + bool mutex_ready; + bool running; + int16_t input[TAL_ANDROID_MAX_INPUT_FRAMES]; +} TalAndroid; + +size_t tal_backend_memory_alignment(void) { + return _Alignof(TalAndroid); +} + +size_t tal_backend_memory_required(const TalConfig *config) { + (void) config; + return sizeof(TalAndroid); +} + +void tal_backend_lock(Tal *tal) { + TalAndroid *android = tal ? (TalAndroid *) tal->backend : NULL; + if (android && android->mutex_ready) { + pthread_mutex_lock(&android->mutex); + } +} + +void tal_backend_unlock(Tal *tal) { + TalAndroid *android = tal ? (TalAndroid *) tal->backend : NULL; + if (android && android->mutex_ready) { + pthread_mutex_unlock(&android->mutex); + } +} + +static aaudio_data_callback_result_t tal_android_callback( + AAudioStream *stream, void *user_data, void *audio_data, + int32_t frame_count) { + TalAndroid *android = (TalAndroid *) user_data; + int16_t *output = (int16_t *) audio_data; + const uint32_t frames = (uint32_t) frame_count; + const uint32_t input_rate = android->tal->config.sample_rate; + uint32_t input_frames; + uint32_t frame; + (void) stream; + + input_frames = (uint32_t) ((uint64_t) frames * input_rate / android->out_rate); + if (input_frames == 0u) { + input_frames = 1u; + } + if (input_frames > TAL_ANDROID_MAX_INPUT_FRAMES) { + input_frames = TAL_ANDROID_MAX_INPUT_FRAMES; + } + + pthread_mutex_lock(&android->mutex); + if (!android->running || + tal_internal_render(android->tal, android->input, input_frames) != + TAL_RESULT_OK) { + pthread_mutex_unlock(&android->mutex); + tal_internal_zero( + output, + (size_t) frames * TAL_ANDROID_OUTPUT_CHANNELS * sizeof(int16_t)); + return AAUDIO_CALLBACK_RESULT_CONTINUE; + } + pthread_mutex_unlock(&android->mutex); + + for (frame = 0u; frame < frames; ++frame) { + uint32_t index = + (uint32_t) ((uint64_t) frame * input_rate / android->out_rate); + if (index >= input_frames) { + index = input_frames - 1u; + } + output[frame * TAL_ANDROID_OUTPUT_CHANNELS] = android->input[index]; + output[frame * TAL_ANDROID_OUTPUT_CHANNELS + 1u] = android->input[index]; + } + return AAUDIO_CALLBACK_RESULT_CONTINUE; +} + +TalResult tal_backend_init( + Tal *tal, void *memory, size_t memory_size, const TalConfig *config) { + TalAndroid *android; + AAudioStreamBuilder *builder = NULL; + aaudio_result_t result; + if (!tal || !memory || !config || memory_size < sizeof(TalAndroid)) { + return TAL_RESULT_INVALID_ARGUMENT; + } + if (config->channels != 1u) { + return TAL_RESULT_BACKEND_UNAVAILABLE; + } + + android = (TalAndroid *) memory; + android->tal = tal; + android->stream = NULL; + android->running = false; + android->mutex_ready = false; + android->out_rate = TAL_ANDROID_OUTPUT_SAMPLE_RATE; + + if (pthread_mutex_init(&android->mutex, NULL) != 0) { + return TAL_RESULT_BACKEND_FAILURE; + } + android->mutex_ready = true; + + if (AAudio_createStreamBuilder(&builder) != AAUDIO_OK) { + tal_backend_shutdown(tal); + return TAL_RESULT_BACKEND_UNAVAILABLE; + } + AAudioStreamBuilder_setDirection(builder, AAUDIO_DIRECTION_OUTPUT); + AAudioStreamBuilder_setFormat(builder, AAUDIO_FORMAT_PCM_I16); + AAudioStreamBuilder_setChannelCount(builder, TAL_ANDROID_OUTPUT_CHANNELS); + AAudioStreamBuilder_setSampleRate(builder, TAL_ANDROID_OUTPUT_SAMPLE_RATE); + AAudioStreamBuilder_setPerformanceMode( + builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY); + AAudioStreamBuilder_setFramesPerDataCallback( + builder, TAL_ANDROID_CALLBACK_FRAMES); + AAudioStreamBuilder_setDataCallback(builder, tal_android_callback, android); + result = AAudioStreamBuilder_openStream(builder, &android->stream); + AAudioStreamBuilder_delete(builder); + if (result != AAUDIO_OK || !android->stream) { + tal_backend_shutdown(tal); + return TAL_RESULT_BACKEND_FAILURE; + } + + if (AAudioStream_getChannelCount(android->stream) != + TAL_ANDROID_OUTPUT_CHANNELS || + AAudioStream_getFormat(android->stream) != AAUDIO_FORMAT_PCM_I16) { + tal_backend_shutdown(tal); + return TAL_RESULT_BACKEND_UNAVAILABLE; + } + android->out_rate = (uint32_t) AAudioStream_getSampleRate(android->stream); + if (android->out_rate == 0u) { + android->out_rate = TAL_ANDROID_OUTPUT_SAMPLE_RATE; + } + + android->running = true; + result = AAudioStream_requestStart(android->stream); + if (result != AAUDIO_OK) { + tal_backend_shutdown(tal); + return TAL_RESULT_BACKEND_FAILURE; + } + return TAL_RESULT_OK; +} + +void tal_backend_shutdown(Tal *tal) { + TalAndroid *android = tal ? (TalAndroid *) tal->backend : NULL; + if (!android) { + return; + } + if (android->mutex_ready) { + pthread_mutex_lock(&android->mutex); + android->running = false; + pthread_mutex_unlock(&android->mutex); + } + if (android->stream) { + AAudioStream_requestStop(android->stream); + AAudioStream_close(android->stream); + android->stream = NULL; + } + if (android->mutex_ready) { + pthread_mutex_destroy(&android->mutex); + android->mutex_ready = false; + } +} + +TalResult tal_backend_update(Tal *tal) { + (void) tal; + return TAL_RESULT_OK; +} diff --git a/thirdparty/twl/CMakeLists.txt b/thirdparty/twl/CMakeLists.txt index 5e4388ae..f38d4ea1 100644 --- a/thirdparty/twl/CMakeLists.txt +++ b/thirdparty/twl/CMakeLists.txt @@ -74,6 +74,20 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux") find_package(X11 REQUIRED) find_package(OpenGL REQUIRED) target_link_libraries(twl PRIVATE X11::X11 OpenGL::GL) +elseif(ANDROID) + target_sources( + twl + PRIVATE + backends/android/window.c + backends/android/presentation.c + backends/android/input.c + ) + target_include_directories( + twl + PRIVATE + "${CMAKE_ANDROID_NDK}/sources/android/native_app_glue" + ) + target_link_libraries(twl PUBLIC EGL GLESv2 android log) else() target_sources(twl PRIVATE backends/null/backend.c) endif() diff --git a/thirdparty/twl/backends/android/backend.h b/thirdparty/twl/backends/android/backend.h new file mode 100644 index 00000000..af48ed4a --- /dev/null +++ b/thirdparty/twl/backends/android/backend.h @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of TWL. + * + * TWL is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TWL is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with TWL. If not, see . + */ + +#ifndef TWL_ANDROID_BACKEND_H +#define TWL_ANDROID_BACKEND_H + +#include "twl_internal.h" + +#include +#include +#include + +typedef struct { + struct android_app *app; + EGLDisplay display; + EGLConfig config; + EGLContext context; + EGLSurface surface; + GLuint program; + GLuint texture; + GLuint vbo; + GLint attr_pos; + GLint attr_uv; + GLint uniform_tex; + uint16_t *staging; + uint32_t frame_width; + uint32_t frame_height; + int32_t surface_width; + int32_t surface_height; + int32_t view_x; + int32_t view_y; + int32_t view_w; + int32_t view_h; + int32_t pointer_x; + int32_t pointer_y; + bool gl_ready; + bool window_ready; + bool touching; + bool quit_pushed; +} TwlAndroid; + +void twl_android_on_command(struct android_app *app, int32_t command); +int32_t twl_android_on_input(struct android_app *app, AInputEvent *event); +void twl_android_pump_once(TwlAndroid *android, int timeout_ms); + +#endif diff --git a/thirdparty/twl/backends/android/input.c b/thirdparty/twl/backends/android/input.c new file mode 100644 index 00000000..4ff2e486 --- /dev/null +++ b/thirdparty/twl/backends/android/input.c @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of TWL. + * + * TWL is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TWL is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + */ + +#include "backend.h" + +#include +#include + +static int32_t twl_android_clamp(int32_t value, int32_t low, int32_t high) { + if (value < low) return low; + if (value > high) return high; + return value; +} + +static void twl_android_push(Twl *twl, TwlEvent *event) { + event->timestamp_us = twl_backend_time_microseconds(twl); + twl_internal_push_event(twl, event); +} + +static void twl_android_push_pointer( + Twl *twl, TwlEventType type, int32_t x, int32_t y) { + TwlEvent event; + twl_internal_zero(&event, sizeof(event)); + event.type = type; + event.x = x; + event.y = y; + event.button = 1u; + twl_android_push(twl, &event); +} + +static void twl_android_push_key(Twl *twl, TwlEventType type, TwlKey key) { + TwlEvent event; + twl_internal_zero(&event, sizeof(event)); + event.type = type; + event.key = key; + twl_android_push(twl, &event); +} + +static void twl_android_motion_to_frame( + const TwlAndroid *android, float raw_x, float raw_y, + int32_t *out_x, int32_t *out_y) { + const int32_t view_w = android->view_w > 0 ? android->view_w : 1; + const int32_t view_h = android->view_h > 0 ? android->view_h : 1; + *out_x = twl_android_clamp( + ((int32_t) raw_x - android->view_x) * (int32_t) android->frame_width / + view_w, + 0, (int32_t) android->frame_width - 1); + *out_y = twl_android_clamp( + ((int32_t) raw_y - android->view_y) * (int32_t) android->frame_height / + view_h, + 0, (int32_t) android->frame_height - 1); +} + +static int32_t twl_android_on_motion( + Twl *twl, TwlAndroid *android, AInputEvent *event) { + const int32_t action = + AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK; + int32_t x; + int32_t y; + twl_android_motion_to_frame( + android, AMotionEvent_getX(event, 0), AMotionEvent_getY(event, 0), &x, &y); + + switch (action) { + case AMOTION_EVENT_ACTION_DOWN: + twl_android_push_pointer(twl, TWL_EVENT_POINTER_MOVE, x, y); + twl_android_push_pointer(twl, TWL_EVENT_POINTER_DOWN, x, y); + android->touching = true; + break; + case AMOTION_EVENT_ACTION_MOVE: + twl_android_push_pointer(twl, TWL_EVENT_POINTER_MOVE, x, y); + break; + case AMOTION_EVENT_ACTION_UP: + case AMOTION_EVENT_ACTION_CANCEL: + twl_android_push_pointer(twl, TWL_EVENT_POINTER_UP, x, y); + android->touching = false; + break; + default: + break; + } + android->pointer_x = x; + android->pointer_y = y; + return 1; +} + +static int32_t twl_android_on_key(Twl *twl, AInputEvent *event) { + const int32_t action = AKeyEvent_getAction(event); + const int32_t code = AKeyEvent_getKeyCode(event); + TwlKey key = TWL_KEY_UNKNOWN; + switch (code) { + case AKEYCODE_BACK: key = TWL_KEY_ESCAPE; break; + case AKEYCODE_ENTER: + case AKEYCODE_DPAD_CENTER: key = TWL_KEY_RETURN; break; + case AKEYCODE_DPAD_UP: key = TWL_KEY_UP; break; + case AKEYCODE_DPAD_DOWN: key = TWL_KEY_DOWN; break; + case AKEYCODE_DPAD_LEFT: key = TWL_KEY_LEFT; break; + case AKEYCODE_DPAD_RIGHT: key = TWL_KEY_RIGHT; break; + default: return 0; + } + if (action == AKEY_EVENT_ACTION_DOWN) { + twl_android_push_key(twl, TWL_EVENT_KEY_DOWN, key); + } else if (action == AKEY_EVENT_ACTION_UP) { + twl_android_push_key(twl, TWL_EVENT_KEY_UP, key); + } + return 1; +} + +int32_t twl_android_on_input(struct android_app *app, AInputEvent *event) { + Twl *twl = (Twl *) app->userData; + TwlAndroid *android = twl ? (TwlAndroid *) twl->backend : NULL; + if (!android) { + return 0; + } + if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) { + return twl_android_on_motion(twl, android, event); + } + if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_KEY) { + return twl_android_on_key(twl, event); + } + return 0; +} + +void twl_android_pump_once(TwlAndroid *android, int timeout_ms) { + struct android_poll_source *source = NULL; + int events = 0; + if (ALooper_pollOnce(timeout_ms, NULL, &events, (void **) &source) >= 0 && + source) { + source->process(android->app, source); + } +} + +void twl_backend_pump_events(Twl *twl) { + TwlAndroid *android = twl ? (TwlAndroid *) twl->backend : NULL; + struct android_poll_source *source = NULL; + int events = 0; + if (!android) { + return; + } + while (ALooper_pollOnce(0, NULL, &events, (void **) &source) >= 0) { + if (source) { + source->process(android->app, source); + } + if (android->app->destroyRequested) { + break; + } + } + if (android->app->destroyRequested && !android->quit_pushed) { + TwlEvent event; + twl_internal_zero(&event, sizeof(event)); + event.type = TWL_EVENT_QUIT; + twl_android_push(twl, &event); + android->quit_pushed = true; + } +} diff --git a/thirdparty/twl/backends/android/presentation.c b/thirdparty/twl/backends/android/presentation.c new file mode 100644 index 00000000..e748b3cf --- /dev/null +++ b/thirdparty/twl/backends/android/presentation.c @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of TWL. + * + * TWL is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TWL is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + */ + +#include "backend.h" + +#include + +TwlResult twl_backend_prepare_frame(Twl *twl, const TwlSurface *surface) { + TwlAndroid *android = twl ? (TwlAndroid *) twl->backend : NULL; + const uint16_t *src; + size_t src_stride; + uint32_t y; + uint32_t x; + if (!android || !surface || !surface->pixels) { + return TWL_RESULT_INVALID_ARGUMENT; + } + if (surface->format != TWL_PIXEL_RGB555 || + surface->width != android->frame_width || + surface->height != android->frame_height) { + return TWL_RESULT_INVALID_ARGUMENT; + } + if (!android->window_ready || !android->gl_ready) { + return TWL_RESULT_OK; + } + + src = (const uint16_t *) surface->pixels; + src_stride = surface->stride_bytes / sizeof(uint16_t); + for (y = 0; y < android->frame_height; ++y) { + const uint16_t *source_row = src + (size_t) y * src_stride; + uint16_t *dest_row = android->staging + (size_t) y * android->frame_width; + for (x = 0; x < android->frame_width; ++x) { + dest_row[x] = (uint16_t) ((source_row[x] << 1) | 1u); + } + } + + glBindTexture(GL_TEXTURE_2D, android->texture); + glTexSubImage2D( + GL_TEXTURE_2D, 0, 0, 0, (GLsizei) android->frame_width, + (GLsizei) android->frame_height, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, + android->staging); + return TWL_RESULT_OK; +} + +TwlResult twl_backend_display_frame(Twl *twl) { + TwlAndroid *android = twl ? (TwlAndroid *) twl->backend : NULL; + if (!android) { + return TWL_RESULT_INVALID_ARGUMENT; + } + if (!android->window_ready || !android->gl_ready) { + return TWL_RESULT_OK; + } + + glViewport(0, 0, android->surface_width, android->surface_height); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + glViewport( + android->view_x, android->view_y, android->view_w, android->view_h); + glUseProgram(android->program); + glBindBuffer(GL_ARRAY_BUFFER, android->vbo); + glEnableVertexAttribArray((GLuint) android->attr_pos); + glVertexAttribPointer( + (GLuint) android->attr_pos, 2, GL_FLOAT, GL_FALSE, + (GLsizei) (4 * sizeof(GLfloat)), (const void *) 0); + glEnableVertexAttribArray((GLuint) android->attr_uv); + glVertexAttribPointer( + (GLuint) android->attr_uv, 2, GL_FLOAT, GL_FALSE, + (GLsizei) (4 * sizeof(GLfloat)), + (const void *) (2 * sizeof(GLfloat))); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, android->texture); + glUniform1i(android->uniform_tex, 0); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + eglSwapBuffers(android->display, android->surface); + return TWL_RESULT_OK; +} diff --git a/thirdparty/twl/backends/android/twl_android.h b/thirdparty/twl/backends/android/twl_android.h new file mode 100644 index 00000000..118af067 --- /dev/null +++ b/thirdparty/twl/backends/android/twl_android.h @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of TWL. + * + * TWL is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TWL is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + * + * You should have received a copy of the GNU General Public License along + * with TWL. If not, see . + */ + +#ifndef TWL_ANDROID_H +#define TWL_ANDROID_H + +struct android_app; + +#ifdef __cplusplus +extern "C" { +#endif + +void twl_android_set_app(struct android_app *app); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/thirdparty/twl/backends/android/window.c b/thirdparty/twl/backends/android/window.c new file mode 100644 index 00000000..32690b7b --- /dev/null +++ b/thirdparty/twl/backends/android/window.c @@ -0,0 +1,329 @@ +/* + * Copyright (C) 2026 Michael Binder and contributors + * + * This file is part of TWL. + * + * TWL is free software: you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. + * + * TWL is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. + */ + +#include "backend.h" +#include "twl_android.h" + +#include + +#include + +#define TWL_ANDROID_LOG(...) \ + __android_log_print(ANDROID_LOG_INFO, "OpenShadowFlare", __VA_ARGS__) + +static const GLfloat twl_android_quad[] = { + -1.0f, -1.0f, 0.0f, 1.0f, + 1.0f, -1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 0.0f, 0.0f, + 1.0f, 1.0f, 1.0f, 0.0f, +}; + +static const char *const twl_android_vertex_source = + "attribute vec2 a_pos;\n" + "attribute vec2 a_uv;\n" + "varying vec2 v_uv;\n" + "void main() {\n" + " v_uv = a_uv;\n" + " gl_Position = vec4(a_pos, 0.0, 1.0);\n" + "}\n"; + +static const char *const twl_android_fragment_source = + "precision mediump float;\n" + "varying vec2 v_uv;\n" + "uniform sampler2D u_tex;\n" + "void main() {\n" + " gl_FragColor = texture2D(u_tex, v_uv).bgra;\n" + "}\n"; + +static struct android_app *twl_android_pending_app; + +void twl_android_set_app(struct android_app *app) { + twl_android_pending_app = app; +} + +static void twl_android_fit_viewport(TwlAndroid *android) { + const int64_t content_w = (int64_t) android->frame_width; + const int64_t content_h = (int64_t) android->frame_height; + const int32_t surface_w = android->surface_width; + const int32_t surface_h = android->surface_height; + if (surface_w <= 0 || surface_h <= 0) { + return; + } + if (content_w * surface_h >= content_h * surface_w) { + android->view_w = surface_w; + android->view_h = (int32_t) (content_h * surface_w / content_w); + } else { + android->view_h = surface_h; + android->view_w = (int32_t) (content_w * surface_h / content_h); + } + android->view_x = (surface_w - android->view_w) / 2; + android->view_y = (surface_h - android->view_h) / 2; +} + +static GLuint twl_android_compile(GLenum type, const char *source) { + GLuint shader = glCreateShader(type); + GLint compiled = 0; + if (!shader) { + return 0u; + } + glShaderSource(shader, 1, &source, NULL); + glCompileShader(shader); + glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled); + if (!compiled) { + char log[256]; + glGetShaderInfoLog(shader, (GLsizei) sizeof(log), NULL, log); + TWL_ANDROID_LOG("shader compile failed: %s", log); + glDeleteShader(shader); + return 0u; + } + return shader; +} + +static bool twl_android_build_gl(TwlAndroid *android) { + GLuint vertex = twl_android_compile(GL_VERTEX_SHADER, twl_android_vertex_source); + GLuint fragment = + twl_android_compile(GL_FRAGMENT_SHADER, twl_android_fragment_source); + GLint linked = 0; + if (!vertex || !fragment) { + if (vertex) glDeleteShader(vertex); + if (fragment) glDeleteShader(fragment); + return false; + } + android->program = glCreateProgram(); + glAttachShader(android->program, vertex); + glAttachShader(android->program, fragment); + glLinkProgram(android->program); + glDeleteShader(vertex); + glDeleteShader(fragment); + glGetProgramiv(android->program, GL_LINK_STATUS, &linked); + if (!linked) { + char log[256]; + glGetProgramInfoLog(android->program, (GLsizei) sizeof(log), NULL, log); + TWL_ANDROID_LOG("program link failed: %s", log); + return false; + } + android->attr_pos = glGetAttribLocation(android->program, "a_pos"); + android->attr_uv = glGetAttribLocation(android->program, "a_uv"); + android->uniform_tex = glGetUniformLocation(android->program, "u_tex"); + + glGenBuffers(1, &android->vbo); + glBindBuffer(GL_ARRAY_BUFFER, android->vbo); + glBufferData( + GL_ARRAY_BUFFER, sizeof(twl_android_quad), twl_android_quad, + GL_STATIC_DRAW); + + glGenTextures(1, &android->texture); + glBindTexture(GL_TEXTURE_2D, android->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D( + GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei) android->frame_width, + (GLsizei) android->frame_height, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, + NULL); + + android->gl_ready = true; + return true; +} + +static void twl_android_query_size(TwlAndroid *android) { + EGLint width = 0; + EGLint height = 0; + eglQuerySurface(android->display, android->surface, EGL_WIDTH, &width); + eglQuerySurface(android->display, android->surface, EGL_HEIGHT, &height); + android->surface_width = width; + android->surface_height = height; + twl_android_fit_viewport(android); +} + +static void twl_android_create_surface(TwlAndroid *android) { + if (android->surface != EGL_NO_SURFACE || !android->app->window) { + return; + } + android->surface = eglCreateWindowSurface( + android->display, android->config, android->app->window, NULL); + if (android->surface == EGL_NO_SURFACE) { + TWL_ANDROID_LOG("eglCreateWindowSurface failed: 0x%x", eglGetError()); + return; + } + if (!eglMakeCurrent( + android->display, android->surface, android->surface, + android->context)) { + TWL_ANDROID_LOG("eglMakeCurrent failed: 0x%x", eglGetError()); + eglDestroySurface(android->display, android->surface); + android->surface = EGL_NO_SURFACE; + return; + } + eglSwapInterval(android->display, 1); + if (!android->gl_ready && !twl_android_build_gl(android)) { + return; + } + twl_android_query_size(android); + android->window_ready = true; +} + +static void twl_android_destroy_surface(TwlAndroid *android) { + android->window_ready = false; + if (android->display == EGL_NO_DISPLAY) { + return; + } + eglMakeCurrent( + android->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (android->surface != EGL_NO_SURFACE) { + eglDestroySurface(android->display, android->surface); + android->surface = EGL_NO_SURFACE; + } +} + +void twl_android_on_command(struct android_app *app, int32_t command) { + Twl *twl = (Twl *) app->userData; + TwlAndroid *android = twl ? (TwlAndroid *) twl->backend : NULL; + if (!android) { + return; + } + switch (command) { + case APP_CMD_INIT_WINDOW: + twl_android_create_surface(android); + break; + case APP_CMD_TERM_WINDOW: + twl_android_destroy_surface(android); + break; + case APP_CMD_WINDOW_RESIZED: + case APP_CMD_CONFIG_CHANGED: + if (android->window_ready) { + twl_android_query_size(android); + } + break; + default: + break; + } +} + +size_t twl_backend_memory_alignment(void) { + return _Alignof(TwlAndroid); +} + +size_t twl_backend_memory_required(const TwlConfig *config) { + const uint32_t width = (config && config->width) ? config->width : 640u; + const uint32_t height = (config && config->height) ? config->height : 480u; + return sizeof(TwlAndroid) + + (size_t) width * (size_t) height * sizeof(uint16_t); +} + +TwlResult twl_backend_init( + Twl *twl, void *memory, size_t memory_size, const TwlConfig *config) { + TwlAndroid *android; + size_t required; + const EGLint config_attributes[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RED_SIZE, 8, + EGL_GREEN_SIZE, 8, + EGL_BLUE_SIZE, 8, + EGL_NONE + }; + const EGLint context_attributes[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE + }; + EGLint config_count = 0; + if (!twl || !memory || !config) { + return TWL_RESULT_INVALID_ARGUMENT; + } + if (!twl_android_pending_app) { + return TWL_RESULT_BACKEND_UNAVAILABLE; + } + android = (TwlAndroid *) memory; + android->frame_width = config->width ? config->width : 640u; + android->frame_height = config->height ? config->height : 480u; + required = sizeof(TwlAndroid) + + (size_t) android->frame_width * android->frame_height * sizeof(uint16_t); + if (memory_size < required) { + return TWL_RESULT_INSUFFICIENT_MEMORY; + } + android->staging = (uint16_t *) ((uint8_t *) memory + sizeof(TwlAndroid)); + android->app = twl_android_pending_app; + android->display = EGL_NO_DISPLAY; + android->surface = EGL_NO_SURFACE; + android->context = EGL_NO_CONTEXT; + android->pointer_x = (int32_t) (android->frame_width / 2u); + android->pointer_y = (int32_t) (android->frame_height / 2u); + + android->display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + if (android->display == EGL_NO_DISPLAY || + !eglInitialize(android->display, NULL, NULL)) { + return TWL_RESULT_BACKEND_FAILURE; + } + if (!eglChooseConfig( + android->display, config_attributes, &android->config, 1, + &config_count) || + config_count < 1) { + return TWL_RESULT_BACKEND_FAILURE; + } + android->context = eglCreateContext( + android->display, android->config, EGL_NO_CONTEXT, context_attributes); + if (android->context == EGL_NO_CONTEXT) { + return TWL_RESULT_BACKEND_FAILURE; + } + + android->app->userData = twl; + android->app->onAppCmd = twl_android_on_command; + android->app->onInputEvent = twl_android_on_input; + + twl_internal_set_display_size( + twl, android->frame_width, android->frame_height); + + while (!android->window_ready && !android->app->destroyRequested) { + twl_android_pump_once(android, -1); + } + return TWL_RESULT_OK; +} + +void twl_backend_shutdown(Twl *twl) { + TwlAndroid *android = twl ? (TwlAndroid *) twl->backend : NULL; + if (!android) { + return; + } + twl_android_destroy_surface(android); + if (android->display != EGL_NO_DISPLAY) { + if (android->context != EGL_NO_CONTEXT) { + eglDestroyContext(android->display, android->context); + android->context = EGL_NO_CONTEXT; + } + eglTerminate(android->display); + android->display = EGL_NO_DISPLAY; + } + if (android->app) { + android->app->userData = NULL; + android->app->onAppCmd = NULL; + android->app->onInputEvent = NULL; + } +} + +uint64_t twl_backend_time_microseconds(const Twl *twl) { + struct timespec now; + (void) twl; + clock_gettime(CLOCK_MONOTONIC, &now); + return (uint64_t) now.tv_sec * UINT64_C(1000000) + + (uint64_t) now.tv_nsec / UINT64_C(1000); +} + +void twl_backend_sleep_microseconds(Twl *twl, uint64_t duration) { + struct timespec request; + (void) twl; + request.tv_sec = (time_t) (duration / UINT64_C(1000000)); + request.tv_nsec = (long) ((duration % UINT64_C(1000000)) * UINT64_C(1000)); + nanosleep(&request, NULL); +} diff --git a/tools/android/build-apk.sh b/tools/android/build-apk.sh index e4c4c571..2c35d36e 100644 --- a/tools/android/build-apk.sh +++ b/tools/android/build-apk.sh @@ -29,7 +29,6 @@ fi sh "$GRADLE_WRAPPER" \ -p "$ANDROID_DIR" \ - --no-daemon \ :app:assembleDebug \ "$@" From 011dfdb66d81423584f83541b297a5047dc49d70 Mon Sep 17 00:00:00 2001 From: Trulio Date: Tue, 4 Aug 2026 11:38:34 -0300 Subject: [PATCH 7/8] Add app icon and fix input --- platform/android/app/build.gradle | 2 +- .../res/drawable/ic_launcher_foreground.xml | 4 -- .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 -- .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 7303 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 3583 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 12220 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 25489 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 85801 -> 43724 bytes .../app/src/main/res/values/colors.xml | 4 -- src/SF_EXE/CMakeLists.txt | 9 +-- src/SF_EXE/runtime/game_runtime.hpp | 2 - src/SF_EXE/runtime/main.cpp | 11 +-- thirdparty/lwl/lwl.h | 2 - thirdparty/lwl/lwl_android.h | 19 ------ thirdparty/lwl/lwl_emscripten.c | 6 -- thirdparty/lwl/lwl_macos.c | 6 -- thirdparty/lwl/lwl_switch.c | 6 -- thirdparty/lwl/lwl_win32.c | 6 -- thirdparty/lwl/lwl_x11.c | 6 -- thirdparty/twl/backends/android/input.c | 64 +++++++++++++++--- 20 files changed, 57 insertions(+), 95 deletions(-) delete mode 100644 platform/android/app/src/main/res/drawable/ic_launcher_foreground.xml delete mode 100644 platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 platform/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 platform/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 platform/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 platform/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 platform/android/app/src/main/res/values/colors.xml delete mode 100644 thirdparty/lwl/lwl_android.h diff --git a/platform/android/app/build.gradle b/platform/android/app/build.gradle index 7747245f..b3f0f916 100644 --- a/platform/android/app/build.gradle +++ b/platform/android/app/build.gradle @@ -11,7 +11,7 @@ android { applicationId 'org.openshadowflare.game' minSdk 26 targetSdk 35 - versionCode 1 + versionCode 2 versionName '0.1.0' ndk { diff --git a/platform/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/platform/android/app/src/main/res/drawable/ic_launcher_foreground.xml deleted file mode 100644 index d54af114..00000000 --- a/platform/android/app/src/main/res/drawable/ic_launcher_foreground.xml +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index a8a8fa55..00000000 --- a/platform/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/platform/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/platform/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..037cc48b98cc81a620b5c6e728ea3285d563df7f GIT binary patch literal 7303 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 literal 0 HcmV?d00001 diff --git a/platform/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/platform/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..3575cf64353c68494016d35da148352a47158b9e GIT binary patch literal 3583 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�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 Y166Sk87FQX)Bpeg07*qoM6N<$f~s$zc>n+a literal 0 HcmV?d00001 diff --git a/platform/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/platform/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png index f2c1c9c1a86631985ce82fb3ae1e9169953a1f3b..4fc1d00bbce03abef1b5cdbebc7e30c153a88459 100644 GIT binary patch literal 43724 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

v_hilDAJX%` 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 M07*qoM6N<$g22u|_y7O^ literal 85801 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�`PjEyzA8x;2$v_e7ZN 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�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 - - #181410 - diff --git a/src/SF_EXE/CMakeLists.txt b/src/SF_EXE/CMakeLists.txt index d4fcbdf1..2cf9a359 100644 --- a/src/SF_EXE/CMakeLists.txt +++ b/src/SF_EXE/CMakeLists.txt @@ -368,15 +368,8 @@ target_link_libraries( OpenShadowFlare::Render ) -if(ANDROID) - add_library(ShadowFlare_rebuilt SHARED) -else() - add_executable(ShadowFlare_rebuilt) -endif() - -target_sources( +add_executable( ShadowFlare_rebuilt - PRIVATE runtime/audio_system.cpp runtime/gameplay_artwork.cpp runtime/game_runtime.cpp diff --git a/src/SF_EXE/runtime/game_runtime.hpp b/src/SF_EXE/runtime/game_runtime.hpp index d58dbaa2..a3b27770 100644 --- a/src/SF_EXE/runtime/game_runtime.hpp +++ b/src/SF_EXE/runtime/game_runtime.hpp @@ -11,6 +11,4 @@ int runGame( const GameConfig& game_config, bool smoke_test); -int runMain(int argc, char** argv); - } // namespace osf::runtime diff --git a/src/SF_EXE/runtime/main.cpp b/src/SF_EXE/runtime/main.cpp index 5bbc10a5..947875c5 100644 --- a/src/SF_EXE/runtime/main.cpp +++ b/src/SF_EXE/runtime/main.cpp @@ -56,11 +56,6 @@ std::filesystem::path findDataRoot() { }; std::error_code error; - char dataPath[4096]{}; - if (lwl_data_path(dataPath, static_cast(sizeof(dataPath)))) { - return std::filesystem::path(dataPath); - } - const std::filesystem::path fromWorkingDirectory = searchParents(std::filesystem::current_path(error)); if (!fromWorkingDirectory.empty()) { @@ -94,7 +89,7 @@ std::filesystem::path findDataRoot() { } // namespace -int osf::runtime::runMain(int argc, char** argv) { +int main(int argc, char** argv) { const std::filesystem::path dataRoot = findDataRoot(); osf::GameConfig gameConfig; @@ -108,7 +103,3 @@ int osf::runtime::runMain(int argc, char** argv) { return osf::runtime::runGame( dataRoot, gameConfig, isSmokeTest(argc, argv)); } - -int main(int argc, char** argv) { - return osf::runtime::runMain(argc, argv); -} diff --git a/thirdparty/lwl/lwl.h b/thirdparty/lwl/lwl.h index bdc730a7..c10d8ef5 100644 --- a/thirdparty/lwl/lwl.h +++ b/thirdparty/lwl/lwl.h @@ -134,8 +134,6 @@ void lwl_sleep_until_seconds(double time_seconds); const char* lwl_platform_name(void); double lwl_display_scale(void); bool lwl_exe_path(char *buf, int size); -// Provides a platform-specific directory for user-managed game data, if any. -bool lwl_data_path(char *buf, int size); /* * OpenGL contexts are optional. Software-framebuffer users do not need to diff --git a/thirdparty/lwl/lwl_android.h b/thirdparty/lwl/lwl_android.h deleted file mode 100644 index 1b1ec9f5..00000000 --- a/thirdparty/lwl/lwl_android.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef LWL_ANDROID_H -#define LWL_ANDROID_H - -#include - -struct android_app; - -#ifdef __cplusplus -extern "C" { -#endif - -void lwl_android_set_application(struct android_app *application); -bool lwl_android_wait_for_window(void); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/thirdparty/lwl/lwl_emscripten.c b/thirdparty/lwl/lwl_emscripten.c index ba9bd387..407a5768 100644 --- a/thirdparty/lwl/lwl_emscripten.c +++ b/thirdparty/lwl/lwl_emscripten.c @@ -472,12 +472,6 @@ bool lwl_exe_path(char *buf, int size) { return false; } -bool lwl_data_path(char *buf, int size) { - (void) buf; - (void) size; - return false; -} - /* --- OpenGL / WebGL2 ----------------------------------------------------- */ LwlGlConfig lwl_gl_config_default(void) { diff --git a/thirdparty/lwl/lwl_macos.c b/thirdparty/lwl/lwl_macos.c index 2bbe579d..244bbcb3 100644 --- a/thirdparty/lwl/lwl_macos.c +++ b/thirdparty/lwl/lwl_macos.c @@ -909,12 +909,6 @@ bool lwl_exe_path(char *buf, int size) { return _NSGetExecutablePath(buf, &n) == 0; } -bool lwl_data_path(char *buf, int size) { - (void) buf; - (void) size; - return false; -} - LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; config.api = LWL_GL_API_DESKTOP; diff --git a/thirdparty/lwl/lwl_switch.c b/thirdparty/lwl/lwl_switch.c index 1d099119..d91db227 100644 --- a/thirdparty/lwl/lwl_switch.c +++ b/thirdparty/lwl/lwl_switch.c @@ -427,12 +427,6 @@ bool lwl_exe_path(char *buf, int size) { return false; } -bool lwl_data_path(char *buf, int size) { - (void) buf; - (void) size; - return false; -} - LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; memset(&config, 0, sizeof(config)); diff --git a/thirdparty/lwl/lwl_win32.c b/thirdparty/lwl/lwl_win32.c index 31d9b19a..7901c4a9 100644 --- a/thirdparty/lwl/lwl_win32.c +++ b/thirdparty/lwl/lwl_win32.c @@ -691,12 +691,6 @@ bool lwl_exe_path(char *buf, int size) { return true; } -bool lwl_data_path(char *buf, int size) { - (void) buf; - (void) size; - return false; -} - LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; config.api = LWL_GL_API_DESKTOP; diff --git a/thirdparty/lwl/lwl_x11.c b/thirdparty/lwl/lwl_x11.c index 10e8cdad..caf9a523 100644 --- a/thirdparty/lwl/lwl_x11.c +++ b/thirdparty/lwl/lwl_x11.c @@ -1049,12 +1049,6 @@ bool lwl_exe_path(char *buf, int size) { return true; } -bool lwl_data_path(char *buf, int size) { - (void) buf; - (void) size; - return false; -} - LwlGlConfig lwl_gl_config_default(void) { LwlGlConfig config; config.api = LWL_GL_API_DESKTOP; diff --git a/thirdparty/twl/backends/android/input.c b/thirdparty/twl/backends/android/input.c index 4ff2e486..ef23d967 100644 --- a/thirdparty/twl/backends/android/input.c +++ b/thirdparty/twl/backends/android/input.c @@ -94,22 +94,66 @@ static int32_t twl_android_on_motion( return 1; } +static void twl_android_push_text(Twl *twl, uint32_t codepoint) { + TwlEvent event; + twl_internal_zero(&event, sizeof(event)); + event.type = TWL_EVENT_TEXT; + event.codepoint = codepoint; + twl_android_push(twl, &event); +} + +static uint32_t twl_android_char_for(int32_t code, int32_t meta) { + const int upper = + ((meta & AMETA_SHIFT_ON) != 0) ^ ((meta & AMETA_CAPS_LOCK_ON) != 0); + if (code >= AKEYCODE_A && code <= AKEYCODE_Z) { + return (uint32_t) ((upper ? 'A' : 'a') + (code - AKEYCODE_A)); + } + if (code >= AKEYCODE_0 && code <= AKEYCODE_9) { + return (uint32_t) ('0' + (code - AKEYCODE_0)); + } + if (code == AKEYCODE_SPACE) { + return (uint32_t) ' '; + } + return 0u; +} + +static TwlKey twl_android_key_for(int32_t code) { + if (code >= AKEYCODE_A && code <= AKEYCODE_Z) { + return (TwlKey) (TWL_KEY_A + (code - AKEYCODE_A)); + } + if (code >= AKEYCODE_0 && code <= AKEYCODE_9) { + return (TwlKey) (TWL_KEY_0 + (code - AKEYCODE_0)); + } + switch (code) { + case AKEYCODE_BACK: return TWL_KEY_ESCAPE; + case AKEYCODE_ENTER: + case AKEYCODE_DPAD_CENTER: return TWL_KEY_RETURN; + case AKEYCODE_DPAD_UP: return TWL_KEY_UP; + case AKEYCODE_DPAD_DOWN: return TWL_KEY_DOWN; + case AKEYCODE_DPAD_LEFT: return TWL_KEY_LEFT; + case AKEYCODE_DPAD_RIGHT: return TWL_KEY_RIGHT; + case AKEYCODE_DEL: return TWL_KEY_BACKSPACE; + case AKEYCODE_FORWARD_DEL: return TWL_KEY_DELETE; + case AKEYCODE_SPACE: return TWL_KEY_SPACE; + case AKEYCODE_TAB: return TWL_KEY_TAB; + default: return TWL_KEY_UNKNOWN; + } +} + static int32_t twl_android_on_key(Twl *twl, AInputEvent *event) { const int32_t action = AKeyEvent_getAction(event); const int32_t code = AKeyEvent_getKeyCode(event); - TwlKey key = TWL_KEY_UNKNOWN; - switch (code) { - case AKEYCODE_BACK: key = TWL_KEY_ESCAPE; break; - case AKEYCODE_ENTER: - case AKEYCODE_DPAD_CENTER: key = TWL_KEY_RETURN; break; - case AKEYCODE_DPAD_UP: key = TWL_KEY_UP; break; - case AKEYCODE_DPAD_DOWN: key = TWL_KEY_DOWN; break; - case AKEYCODE_DPAD_LEFT: key = TWL_KEY_LEFT; break; - case AKEYCODE_DPAD_RIGHT: key = TWL_KEY_RIGHT; break; - default: return 0; + const TwlKey key = twl_android_key_for(code); + if (key == TWL_KEY_UNKNOWN) { + return 0; } if (action == AKEY_EVENT_ACTION_DOWN) { + const uint32_t codepoint = + twl_android_char_for(code, AKeyEvent_getMetaState(event)); twl_android_push_key(twl, TWL_EVENT_KEY_DOWN, key); + if (codepoint != 0u) { + twl_android_push_text(twl, codepoint); + } } else if (action == AKEY_EVENT_ACTION_UP) { twl_android_push_key(twl, TWL_EVENT_KEY_UP, key); } From 3e0a5ba077c402b492c63f28ed947853f6d003c5 Mon Sep 17 00:00:00 2001 From: Trulio Date: Tue, 4 Aug 2026 12:19:15 -0300 Subject: [PATCH 8/8] fix android ram headroom --- shadowflare/core/memory_budget.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/shadowflare/core/memory_budget.h b/shadowflare/core/memory_budget.h index 1d5def3b..52e8026d 100644 --- a/shadowflare/core/memory_budget.h +++ b/shadowflare/core/memory_budget.h @@ -23,12 +23,20 @@ #define SF_KIBIBYTE 1024u #define SF_MEBIBYTE (1024u * SF_KIBIBYTE) +#if defined(__ANDROID__) +#define SF_MAIN_MEMORY_LIMIT_BYTES (32u * SF_MEBIBYTE) +#else #define SF_MAIN_MEMORY_LIMIT_BYTES (8u * SF_MEBIBYTE) +#endif #define SF_MAIN_SYSTEM_RESERVE_BYTES (1u * SF_MEBIBYTE) #define SF_MAIN_ARENA_BYTES \ (SF_MAIN_MEMORY_LIMIT_BYTES - SF_MAIN_SYSTEM_RESERVE_BYTES) +#if defined(__ANDROID__) +#define SF_VIDEO_MEMORY_LIMIT_BYTES (16u * SF_MEBIBYTE) +#else #define SF_VIDEO_MEMORY_LIMIT_BYTES (4u * SF_MEBIBYTE) +#endif #define SF_FRAME_WIDTH 640u #define SF_FRAME_HEIGHT 480u #define SF_FRAME_BYTES_PER_PIXEL 2u