diff --git a/examples/example_android_sdlrenderer3/main.cpp b/examples/example_android_sdlrenderer3/main.cpp deleted file mode 100644 index d23752495..000000000 --- a/examples/example_android_sdlrenderer3/main.cpp +++ /dev/null @@ -1,188 +0,0 @@ -// Dear ImGui: standalone example application for SDL3 + SDL_Renderer -// (SDL is a cross-platform general purpose library for handling windows, inputs, OpenGL/Vulkan/Metal graphics context creation, etc.) - -// Learn about Dear ImGui: -// - FAQ https://dearimgui.com/faq -// - Getting Started https://dearimgui.com/getting-started -// - Documentation https://dearimgui.com/docs (same as your local docs/ folder). -// - Introduction, links and more at the top of imgui.cpp - -// Important to understand: SDL_Renderer is an _optional_ component of SDL3. -// For a multi-platform app consider using e.g. SDL+DirectX on Windows and SDL+OpenGL on Linux/OSX. - -#include "imgui.h" -#include "imgui_impl_sdl3.h" -#include "imgui_impl_sdlrenderer3.h" -#include -#include -#if defined(IMGUI_IMPL_OPENGL_ES2) -#include -#else -#include -#endif - -#if defined(__ANDROID__) -#include -#endif - -// Main code -int main(int, char**) -{ - // Setup SDL - if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_GAMEPAD)) - { - printf("Error: SDL_Init(): %s\n", SDL_GetError()); - return -1; - } - - // Create window with SDL_Renderer graphics context - Uint32 window_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE | SDL_WINDOW_HIDDEN; - SDL_Window* window = SDL_CreateWindow("Dear ImGui SDL3+SDL_Renderer example", 1280, 720, window_flags); - if (window == nullptr) - { - printf("Error: SDL_CreateWindow(): %s\n", SDL_GetError()); - return -1; - } - SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr); - SDL_SetRenderVSync(renderer, 1); - if (renderer == nullptr) - { - SDL_Log("Error: SDL_CreateRenderer(): %s\n", SDL_GetError()); - return -1; - } - SDL_SetWindowPosition(window, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED); - SDL_ShowWindow(window); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO& io = ImGui::GetIO(); (void)io; - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - //ImGui::StyleColorsLight(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL3_InitForSDLRenderer(window, renderer); - ImGui_ImplSDLRenderer3_Init(renderer); - - // Load Fonts - // - If no fonts are loaded, dear imgui will use the default font. You can also load multiple fonts and use ImGui::PushFont()/PopFont() to select them. - // - AddFontFromFileTTF() will return the ImFont* so you can store it if you need to select the font among multiple. - // - If the file cannot be loaded, the function will return a nullptr. Please handle those errors in your application (e.g. use an assertion, or display an error and quit). - // - The fonts will be rasterized at a given size (w/ oversampling) and stored into a texture when calling ImFontAtlas::Build()/GetTexDataAsXXXX(), which ImGui_ImplXXXX_NewFrame below will call. - // - Use '#define IMGUI_ENABLE_FREETYPE' in your imconfig file to use Freetype for higher quality font rendering. - // - Read 'docs/FONTS.md' for more instructions and details. - // - Remember that in C/C++ if you want to include a backslash \ in a string literal you need to write a double backslash \\ ! - // - Our Emscripten build process allows embedding fonts to be accessible at runtime from the "fonts/" folder. See Makefile.emscripten for details. - //io.Fonts->AddFontDefault(); - //io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\segoeui.ttf", 18.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/DroidSans.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Roboto-Medium.ttf", 16.0f); - //io.Fonts->AddFontFromFileTTF("../../misc/fonts/Cousine-Regular.ttf", 15.0f); - //ImFont* font = io.Fonts->AddFontFromFileTTF("c:\\Windows\\Fonts\\ArialUni.ttf", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese()); - //IM_ASSERT(font != nullptr); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - // Main loop - bool done = false; -#ifdef __EMSCRIPTEN__ - // For an Emscripten build we are disabling file-system access, so let's not attempt to do a fopen() of the imgui.ini file. - // You may manually call LoadIniSettingsFromMemory() to load settings from your own storage. - io.IniFilename = nullptr; - EMSCRIPTEN_MAINLOOP_BEGIN -#else - while (!done) -#endif - { - // Poll and handle events (inputs, window resize, etc.) - // You can read the io.WantCaptureMouse, io.WantCaptureKeyboard flags to tell if dear imgui wants to use your inputs. - // - When io.WantCaptureMouse is true, do not dispatch mouse input data to your main application, or clear/overwrite your copy of the mouse data. - // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application, or clear/overwrite your copy of the keyboard data. - // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. - SDL_Event event; - while (SDL_PollEvent(&event)) - { - ImGui_ImplSDL3_ProcessEvent(&event); - if (event.type == SDL_EVENT_QUIT) - done = true; - if (event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED && event.window.windowID == SDL_GetWindowID(window)) - done = true; - } - if (SDL_GetWindowFlags(window) & SDL_WINDOW_MINIMIZED) - { - SDL_Delay(10); - continue; - } - - // Start the Dear ImGui frame - ImGui_ImplSDLRenderer3_NewFrame(); - ImGui_ImplSDL3_NewFrame(); - ImGui::NewFrame(); - - // 1. Show the big demo window (Most of the sample code is in ImGui::ShowDemoWindow()! You can browse its code to learn more about Dear ImGui!). - if (show_demo_window) - ImGui::ShowDemoWindow(&show_demo_window); - - // 2. Show a simple window that we create ourselves. We use a Begin/End pair to create a named window. - { - static float f = 0.0f; - static int counter = 0; - - ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. - - ImGui::Text("This is some useful text."); // Display some text (you can use a format strings too) - ImGui::Checkbox("Demo Window", &show_demo_window); // Edit bools storing our window open/close state - ImGui::Checkbox("Another Window", &show_another_window); - - ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f - ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color - - if (ImGui::Button("Button")) // Buttons return true when clicked (most widgets return true when edited/activated) - counter++; - ImGui::SameLine(); - ImGui::Text("counter = %d", counter); - - ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); - ImGui::End(); - } - - // 3. Show another simple window. - if (show_another_window) - { - ImGui::Begin("Another Window", &show_another_window); // Pass a pointer to our bool variable (the window will have a closing button that will clear the bool when clicked) - ImGui::Text("Hello from another window!"); - if (ImGui::Button("Close Me")) - show_another_window = false; - ImGui::End(); - } - - // Rendering - ImGui::Render(); - //SDL_RenderSetScale(renderer, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); - SDL_SetRenderDrawColorFloat(renderer, clear_color.x, clear_color.y, clear_color.z, clear_color.w); - SDL_RenderClear(renderer); - ImGui_ImplSDLRenderer3_RenderDrawData(ImGui::GetDrawData(), renderer); - SDL_RenderPresent(renderer); - } -#ifdef __EMSCRIPTEN__ - EMSCRIPTEN_MAINLOOP_END; -#endif - - // Cleanup - ImGui_ImplSDLRenderer3_Shutdown(); - ImGui_ImplSDL3_Shutdown(); - ImGui::DestroyContext(); - - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); - SDL_Quit(); - - return 0; -} diff --git a/examples/example_sdl3_opengl3/Makefile.android b/examples/example_sdl3_opengl3/Makefile.android new file mode 100644 index 000000000..aad1e3c5b --- /dev/null +++ b/examples/example_sdl3_opengl3/Makefile.android @@ -0,0 +1,69 @@ +# Makefile to use with SDL+Android +# See https://wiki.libsdl.org/SDL3/README/android +# for details on how SDL interacts with Android. +# +# This Makefile assumes you have wget or curl and Python v3 installed. +# +# Running `make -f Makefile.android` will produce these files or directories: +# - SDL-main.zip +# - SDL-main +# - com.imgui.example +# + +# Variables +PACKAGE_NAME := com.imgui.sdl3opengl3 +VARIANT := copy +VERSION := 0.1.0 +URL := https://github.com/libsdl-org/SDL/archive/refs/heads/main.zip +ARCHIVE_NAME := SDL-main.zip +SDL_ROOT := SDL-main +CREATED_ANDROID_PROJECT := $(CURDIR)/$(PACKAGE_NAME) +ANDROID_SRCS_DIR := $(CREATED_ANDROID_PROJECT)/app/jni/src +SDL_PYTHON_SCRIPT := $(SDL_ROOT)/build-scripts/create-android-project.py +IMGUI_ROOT := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))../..) + +SOURCES := \ + $(IMGUI_ROOT)/backends/imgui_impl_opengl3.cpp \ + $(IMGUI_ROOT)/backends/imgui_impl_sdl3.cpp \ + $(IMGUI_ROOT)/imgui.cpp \ + $(IMGUI_ROOT)/imgui_draw.cpp \ + $(IMGUI_ROOT)/imgui_widgets.cpp \ + $(IMGUI_ROOT)/imgui_demo.cpp \ + $(IMGUI_ROOT)/imgui_tables.cpp \ + main.cpp + +HEADERS := $(IMGUI_ROOT)/imstb_rectpack.h \ + $(IMGUI_ROOT)/imstb_textedit.h \ + $(IMGUI_ROOT)/imstb_truetype.h \ + $(IMGUI_ROOT)/imgui.h \ + $(IMGUI_ROOT)/imgui_internal.h \ + $(IMGUI_ROOT)/imconfig.h \ + $(IMGUI_ROOT)/backends/imgui_impl_sdl3.h \ + $(IMGUI_ROOT)/backends/imgui_impl_opengl3.h \ + $(IMGUI_ROOT)/backends/imgui_impl_opengl3_loader.h + +# Targets +.PHONY: all clean setup download extract run + +all: setup run + +clean: + rm -rf $(SDL_ROOT) $(ARCHIVE_NAME) $(CREATED_ANDROID_PROJECT) + +setup: download extract + @echo "Setting up the Android project..." + @which python3 > /dev/null || which python > /dev/null || { echo "Error: Python v3 is not installed."; exit 1;} + +download: + @echo "Downloading Android project..." + wget -O $(ARCHIVE_NAME) $(URL) || curl -L -o $(ARCHIVE_NAME) $(URL) + +extract: + @echo "Extracting Android project..." + mkdir -p $(SDL_ROOT) + unzip -o $(ARCHIVE_NAME) -d $(CURDIR) + +run: + @echo "Creating Android project..." + python3 $(SDL_PYTHON_SCRIPT) --variant $(VARIANT) --output $(CURDIR) $(PACKAGE_NAME) $(SOURCES) + cp -r $(HEADERS) $(ANDROID_SRCS_DIR) diff --git a/examples/example_sdl3_opengl3/README.md b/examples/example_sdl3_opengl3/README.md index a032f8752..62d9f567e 100644 --- a/examples/example_sdl3_opengl3/README.md +++ b/examples/example_sdl3_opengl3/README.md @@ -38,3 +38,65 @@ c++ `sdl3-config --cflags` -I .. -I ../.. -I ../../backends ## Emscripten As of 2023-05-30 Emscripten doesn't support SDL3 yet. + +## Android + +- You will need at least Java 9, preferably Java 17, to handle recent Gradle 8.9.x versions. + +- You need a way to install Android SDK and NDK and add their PATHS, and have access to a virtual device or real Android device to run the app. + - Android SDK version 21+ + - Android NDK version 19+ + +- Android Studio is an option for handling Java, Android SDK and NDK dependencies altogether: [https://developer.android.com/studio](https://developer.android.com/studio). + +- The provided Makefile will download SDL from the main Git branch and create an Android project using SDL's provided `create-android-project.py` script. + +- Run the Makefile using `make all`. It downloads and unpacks SDL, runs the included Python script, and generate a folder with the Android project in this directory. The project contains the Dear ImGui sources and SDL3 backends. + +- After the project is generated, the Gradle version can be automatically updated in Android Studio, or updated manually via setting the `classpath` and `distributionUrl` values. + +In `com.imgui.example/build.gradle`: +``` +dependencies { + classpath 'com.android.tools.build:gradle:8.7.2' + ... +} +``` + +In `com.imgui.example/gradle/wrapper/gradle-wrapper.properties`: +``` +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +``` + +In `com.imgui.example/app/build.grade`, update the min SDK version: +``` +minSdkVersion 21 +``` + +For this OpenGL3 example, add the `GLESv3` library links in `com.imgui.example/app/jni/src/Android.mk` +``` +LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -lGLESv3 -lOpenSLES -llog -landroid # SDL +``` + +## How to Run + +To run on a local machine using Windows PowerShell: + + 1. Run `make all` and change into the generated Android project folder, for example: `cd com.imgui.example/` + 2. Run `.\gradlew.bat build` to start the Gradle Daemons and build the project. This requires the `JAVA_HOME`, `ANDROID_HOME`, and `ANDROID_NDK_HOME` environment variables if not done in Android Studio. + - Android Studio handles these environment variables itself + 3. Run `.\gradlew.bat installDebug` to install the APK package file onto an Android virtual device or a connected real device. + + +## Some other notes + +On Windows, this variable may need to get set in the `com.imgui.sdlrenderer3/app/jni/SDL/Android.mk` file after variables are cleared. + +``` +include $(CLEAR_VARS) + +# Add this if there's Makefile error 87 +LOCAL_SHORT_COMMANDS := true + +LOCAL_MODULE := SDL3 +``` diff --git a/examples/example_sdl3_opengl3/main.cpp b/examples/example_sdl3_opengl3/main.cpp index e7f239f47..4cf72e7b0 100644 --- a/examples/example_sdl3_opengl3/main.cpp +++ b/examples/example_sdl3_opengl3/main.cpp @@ -23,6 +23,10 @@ #include "../libs/emscripten/emscripten_mainloop_stub.h" #endif +#if defined(__ANDROID__) +#include +#endif + // Main code int main(int, char**) { diff --git a/examples/example_android_sdlrenderer3/Makefile b/examples/example_sdl3_sdlrenderer3/Makefile.android similarity index 71% rename from examples/example_android_sdlrenderer3/Makefile rename to examples/example_sdl3_sdlrenderer3/Makefile.android index efbbbe277..ae84750af 100644 --- a/examples/example_android_sdlrenderer3/Makefile +++ b/examples/example_sdl3_sdlrenderer3/Makefile.android @@ -1,13 +1,25 @@ +# Makefile to use with SDL+Android +# See https://wiki.libsdl.org/SDL3/README/android +# for details on how SDL interacts with Android. +# +# This Makefile assumes you have wget or curl and Python v3 installed. +# +# Running `make -f Makefile.android` will produce these files or directories: +# - SDL-main.zip +# - SDL-main +# - com.imgui.example +# + # Variables -PACKAGE_NAME := com.imgui.example +PACKAGE_NAME := com.imgui.sdl3renderer3 VARIANT := copy VERSION := 0.1.0 URL := https://github.com/libsdl-org/SDL/archive/refs/heads/main.zip ARCHIVE_NAME := SDL-main.zip SDL_ROOT := SDL-main -SDL_ANDROID_PROJECT := $(CURDIR)/$(PACKAGE_NAME) +CREATED_ANDROID_PROJECT := $(CURDIR)/$(PACKAGE_NAME) +ANDROID_SRCS_DIR := $(CREATED_ANDROID_PROJECT)/app/jni/src SDL_PYTHON_SCRIPT := $(SDL_ROOT)/build-scripts/create-android-project.py -SDL_JNI_DIR := $(SDL_ANDROID_PROJECT)/app/jni/src IMGUI_ROOT := $(realpath $(dir $(lastword $(MAKEFILE_LIST)))../..) SOURCES := \ @@ -35,7 +47,7 @@ HEADERS := $(IMGUI_ROOT)/imstb_rectpack.h \ all: setup run clean: - rm -rf $(SDL_ROOT) $(ARCHIVE_NAME) $(SDL_ANDROID_PROJECT) + rm -rf $(SDL_ROOT) $(ARCHIVE_NAME) $(CREATED_ANDROID_PROJECT) setup: download extract @echo "Setting up the Android project..." @@ -49,9 +61,8 @@ extract: @echo "Extracting Android project..." mkdir -p $(SDL_ROOT) unzip -o $(ARCHIVE_NAME) -d $(CURDIR) - cp -r $(HEADERS) $(SDL_JNI_DIR) run: @echo "Creating Android project..." python3 $(SDL_PYTHON_SCRIPT) --variant $(VARIANT) --output $(CURDIR) $(PACKAGE_NAME) $(SOURCES) - + cp -r $(HEADERS) $(ANDROID_SRCS_DIR) diff --git a/examples/example_android_sdlrenderer3/README.md b/examples/example_sdl3_sdlrenderer3/README.md similarity index 74% rename from examples/example_android_sdlrenderer3/README.md rename to examples/example_sdl3_sdlrenderer3/README.md index b93099f85..b59b32eb0 100644 --- a/examples/example_android_sdlrenderer3/README.md +++ b/examples/example_sdl3_sdlrenderer3/README.md @@ -1,8 +1,8 @@ -## How to Build +## How to Build the Android project -- You will need at least Java 9, preferably Java 17, to handle recent Gradle 8.9 versions. +- You will need at least Java 9, preferably Java 17, to handle recent Gradle 8.9.x versions. -- You need a way to install Android SDK and NDK and have access to a virtual device for testing (real Android devices can be used as well). +- You need a way to install Android SDK and NDK and add their PATHS, and have access to a virtual device or real Android device to run the app. - Android SDK version 21+ - Android NDK version 19+ @@ -27,6 +27,12 @@ In `com.imgui.example/gradle/wrapper/gradle-wrapper.properties`: distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip ``` +In `com.imgui.example/app/build.grade`, update the min SDK version: +``` +minSdkVersion 21 +``` + + ## How to Run To run on a local machine using Windows PowerShell: @@ -35,3 +41,17 @@ To run on a local machine using Windows PowerShell: 2. Run `.\gradlew.bat build` to start the Gradle Daemons and build the project. This requires the `JAVA_HOME`, `ANDROID_HOME`, and `ANDROID_NDK_HOME` environment variables if not done in Android Studio. - Android Studio handles these environment variables itself 3. Run `.\gradlew.bat installDebug` to install the APK package file onto an Android virtual device or a connected real device. + + +## Some other notes + +On Windows, this variable may need to get set in the `com.imgui.sdlrenderer3/app/jni/SDL/Android.mk` file after variables are cleared. + +``` +include $(CLEAR_VARS) + +# Add this if there's Makefile error 87 +LOCAL_SHORT_COMMANDS := true + +LOCAL_MODULE := SDL3 +``` diff --git a/examples/example_sdl3_sdlrenderer3/main.cpp b/examples/example_sdl3_sdlrenderer3/main.cpp index 4b9b86e9b..d23752495 100644 --- a/examples/example_sdl3_sdlrenderer3/main.cpp +++ b/examples/example_sdl3_sdlrenderer3/main.cpp @@ -21,6 +21,10 @@ #include #endif +#if defined(__ANDROID__) +#include +#endif + // Main code int main(int, char**) {