Merge branch 'main' of https://github.com/geode-sdk/geode into main

This commit is contained in:
HJfod 2024-02-12 16:56:28 +02:00
commit 628b7d2ec9
5 changed files with 249 additions and 17 deletions
CMakeLists.txt
loader
CMakeLists.txt
include/Geode/cocos/robtop/keyboard_dispatcher
src/platform/android

View file

@ -3,8 +3,19 @@ cmake_minimum_required(VERSION 3.25 FATAL_ERROR)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded)
cmake_policy(SET CMP0141 NEW)
if (NOT DEFINED CMAKE_C_COMPILER_LAUNCHER AND NOT DEFINED ENV{CMAKE_C_COMPILER_LAUNCHER} OR
NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER AND NOT DEFINED ENV{CMAKE_CXX_COMPILER_LAUNCHER})
if (CMAKE_GENERATOR MATCHES "Visual Studio")
# sccache does not work with msbuild,
# so no point in using it
set(GEODE_DISABLE_CACHE ON)
endif()
if (NOT DEFINED GEODE_DISABLE_CACHE)
set(GEODE_DISABLE_CACHE OFF)
endif()
if (NOT GEODE_DISABLE_CACHE AND
(NOT DEFINED CMAKE_C_COMPILER_LAUNCHER AND NOT DEFINED ENV{CMAKE_C_COMPILER_LAUNCHER} OR
NOT DEFINED CMAKE_CXX_COMPILER_LAUNCHER AND NOT DEFINED ENV{CMAKE_CXX_COMPILER_LAUNCHER}))
message(STATUS "Looking for ccache/sccache")
find_program(GEODE_CCACHE NAMES sccache ccache)
if (NOT GEODE_CCACHE)
@ -22,6 +33,14 @@ if (NOT DEFINED CMAKE_C_COMPILER_LAUNCHER AND NOT DEFINED ENV{CMAKE_C_COMPILER_L
endif()
endif()
if (GEODE_DISABLE_CACHE AND NOT DEFINED GEODE_DISABLE_PRECOMPILED_HEADERS)
set(GEODE_DISABLE_PRECOMPILED_HEADERS OFF)
endif()
if (NOT DEFINED GEODE_DISABLE_PRECOMPILED_HEADERS)
set(GEODE_DISABLE_PRECOMPILED_HEADERS ON)
endif()
if (DEFINED ENV{GEODE_CI})
message(STATUS "Building in CI")
endif()
@ -203,6 +222,12 @@ target_link_libraries(GeodeFilesystemImpl PUBLIC ghc_filesystem)
add_subdirectory(${GEODE_BINDINGS_REPO_PATH} ${CMAKE_BINARY_DIR}/bindings)
if (NOT GEODE_DISABLE_PRECOMPILED_HEADERS)
target_precompile_headers(GeodeBindings INTERFACE
"${GEODE_LOADER_PATH}/include/Geode/Bindings.hpp"
)
endif()
target_include_directories(GeodeBindings PUBLIC
${GEODE_LOADER_PATH}/include
${GEODE_LOADER_PATH}/include/Geode/cocos/include
@ -233,8 +258,15 @@ if (PROJECT_IS_TOP_LEVEL)
if (SUPPORTS_W_NO_EVERYTHING)
target_compile_options(geode-loader PRIVATE -Wno-inconsistent-missing-override)
endif()
elseif(EXISTS ${GEODE_PLATFORM_BIN_PATH})
elseif (EXISTS ${GEODE_PLATFORM_BIN_PATH})
target_link_libraries(${PROJECT_NAME} INTERFACE "${GEODE_PLATFORM_BIN_PATH}")
if (NOT GEODE_DISABLE_PRECOMPILED_HEADERS)
target_precompile_headers(${PROJECT_NAME} INTERFACE
"${GEODE_LOADER_PATH}/include/Geode/DefaultInclude.hpp"
"${GEODE_LOADER_PATH}/include/Geode/Geode.hpp"
# please stop adding modify here its not here because it makes windows compilation take longer than geode 1.0 release date
)
endif()
else()
message(FATAL_ERROR
"No valid loader binary to link to! Install pre-built binaries with `geode sdk install-binaries`, "

View file

@ -268,6 +268,13 @@ if (MSVC)
target_link_options(${PROJECT_NAME} PRIVATE /DELAYLOAD:libcocos2d.dll /DELAYLOAD:libExtensions.dll)
endif()
# Use precompiled headers for faster builds
if (NOT GEODE_DISABLE_PRECOMPILED_HEADERS)
target_precompile_headers(${PROJECT_NAME} PRIVATE
"${CMAKE_CURRENT_SOURCE_DIR}/include/Geode/Geode.hpp"
)
endif()
# Create launcher
if (APPLE)
set_target_properties(geode-loader PROPERTIES

View file

@ -21,8 +21,8 @@ RT_ADD(
static enumKeyCodes convertKeyCode(enumKeyCodes key);
bool dispatchKeyboardMSG(enumKeyCodes key, bool, bool);
bool dispatchKeyboardMSG(enumKeyCodes key, bool isKeyDown, bool isKeyRepeat);
inline bool getAltKeyPressed() const {
return m_bAltPressed;
}
@ -42,21 +42,28 @@ RT_ADD(
void updateModifierKeys(bool shft, bool ctrl, bool alt, bool cmd);
bool getBlockRepeat() const;
void setBlockRepeat(bool);
inline bool getBlockRepeat() const {
return m_bBlockRepeat;
}
inline void setBlockRepeat(bool blockRepeat) {
this->m_bBlockRepeat = blockRepeat;
}
protected:
CCArray* m_pDelegates; // 0x20
bool m_bUnknown24; // 0x24
bool m_bUnknown25; // 0x25
ccCArray* m_pUnknown28; // 0x28
ccCArray* m_pUnknown2c; // 0x2c
bool m_bShiftPressed; // 0x30
bool m_bControlPressed; // 0x31
bool m_bAltPressed; // 0x32
bool m_bCommandPressed; // 0x33
//there's more here, check the initializer
CCArray* m_pDelegates; // 0x34
bool m_bUnknown38; // 0x38
bool m_bUnknown39; // 0x39
bool m_bUnknown3a; // 0x3a
ccCArray* m_pUnknown3c; // 0x3c
ccCArray* m_pUnknown40; // 0x40
bool m_bShiftPressed; // 0x44
bool m_bControlPressed; // 0x45
bool m_bAltPressed; // 0x46
bool m_bCommandPressed; // 0x47
bool m_bBlockRepeat; // 0x48
// ~~there's more here, check the initializer~~ no there's not??
};
NS_CC_END

View file

@ -0,0 +1,158 @@
#include <unordered_map>
#include <android/keycodes.h>
#include <jni.h>
#include <cocos2d.h>
namespace {
std::unordered_map<int, cocos2d::enumKeyCodes> g_keymap = {
{AKEYCODE_ESCAPE, cocos2d::KEY_Escape},
{AKEYCODE_SPACE, cocos2d::KEY_Space},
{AKEYCODE_DPAD_LEFT, cocos2d::KEY_Left},
{AKEYCODE_DPAD_RIGHT, cocos2d::KEY_Right},
{AKEYCODE_DPAD_UP, cocos2d::KEY_Up},
{AKEYCODE_DPAD_DOWN, cocos2d::KEY_Down},
{AKEYCODE_0, cocos2d::KEY_Zero},
{AKEYCODE_1, cocos2d::KEY_One},
{AKEYCODE_2, cocos2d::KEY_Two},
{AKEYCODE_3, cocos2d::KEY_Three},
{AKEYCODE_4, cocos2d::KEY_Four},
{AKEYCODE_5, cocos2d::KEY_Five},
{AKEYCODE_6, cocos2d::KEY_Six},
{AKEYCODE_7, cocos2d::KEY_Seven},
{AKEYCODE_8, cocos2d::KEY_Eight},
{AKEYCODE_9, cocos2d::KEY_Nine},
{AKEYCODE_Q, cocos2d::KEY_Q},
{AKEYCODE_W, cocos2d::KEY_W},
{AKEYCODE_E, cocos2d::KEY_E},
{AKEYCODE_R, cocos2d::KEY_R},
{AKEYCODE_T, cocos2d::KEY_T},
{AKEYCODE_Y, cocos2d::KEY_Y},
{AKEYCODE_A, cocos2d::KEY_A},
{AKEYCODE_S, cocos2d::KEY_S},
{AKEYCODE_D, cocos2d::KEY_D},
{AKEYCODE_F, cocos2d::KEY_F},
{AKEYCODE_G, cocos2d::KEY_G},
{AKEYCODE_H, cocos2d::KEY_H},
{AKEYCODE_J, cocos2d::KEY_J},
{AKEYCODE_K, cocos2d::KEY_K},
{AKEYCODE_L, cocos2d::KEY_L},
{AKEYCODE_Z, cocos2d::KEY_Z},
{AKEYCODE_X, cocos2d::KEY_X},
{AKEYCODE_C, cocos2d::KEY_C},
{AKEYCODE_V, cocos2d::KEY_V},
{AKEYCODE_B, cocos2d::KEY_B},
{AKEYCODE_N, cocos2d::KEY_N},
{AKEYCODE_M, cocos2d::KEY_M},
{AKEYCODE_F1, cocos2d::KEY_F1},
{AKEYCODE_F2, cocos2d::KEY_F2},
{AKEYCODE_F3, cocos2d::KEY_F3},
{AKEYCODE_F4, cocos2d::KEY_F4},
{AKEYCODE_F5, cocos2d::KEY_F5},
{AKEYCODE_F6, cocos2d::KEY_F6},
{AKEYCODE_F7, cocos2d::KEY_F7},
{AKEYCODE_F8, cocos2d::KEY_F8},
{AKEYCODE_F9, cocos2d::KEY_F9},
{AKEYCODE_F10, cocos2d::KEY_F10},
{AKEYCODE_F11, cocos2d::KEY_F11},
{AKEYCODE_F12, cocos2d::KEY_F12},
{AKEYCODE_ENTER, cocos2d::KEY_Enter},
{AKEYCODE_FORWARD_DEL, cocos2d::KEY_Delete},
{AKEYCODE_DEL, cocos2d::KEY_Backspace},
{AKEYCODE_CTRL_LEFT, cocos2d::KEY_LeftControl},
{AKEYCODE_CTRL_RIGHT, cocos2d::KEY_RightContol}, // sic
{AKEYCODE_SHIFT_LEFT, cocos2d::KEY_LeftShift},
{AKEYCODE_SHIFT_RIGHT, cocos2d::KEY_RightShift},
{AKEYCODE_ALT_LEFT, cocos2d::KEY_Alt},
{AKEYCODE_ALT_RIGHT, cocos2d::KEY_Alt},
{AKEYCODE_BUTTON_A, cocos2d::CONTROLLER_A},
{AKEYCODE_BUTTON_B, cocos2d::CONTROLLER_B},
{AKEYCODE_BUTTON_X, cocos2d::CONTROLLER_X},
{AKEYCODE_BUTTON_Y, cocos2d::CONTROLLER_Y},
{AKEYCODE_BUTTON_START, cocos2d::CONTROLLER_Start},
{AKEYCODE_BUTTON_SELECT, cocos2d::CONTROLLER_Back},
{AKEYCODE_BUTTON_R1, cocos2d::CONTROLLER_RB},
{AKEYCODE_BUTTON_L1, cocos2d::CONTROLLER_LB},
{AKEYCODE_BUTTON_R2, cocos2d::CONTROLLER_RT},
{AKEYCODE_BUTTON_L2, cocos2d::CONTROLLER_LT},
};
cocos2d::enumKeyCodes translateAndroidKeyCodeToWindows(int keyCode) {
if (auto it = g_keymap.find(keyCode); it != g_keymap.end()) {
return it->second;
}
else {
return cocos2d::KEY_None;
}
}
}
extern "C" JNIEXPORT void JNICALL
Java_com_geode_launcher_utils_GeodeUtils_nativeKeyDown(
JNIEnv* env, jobject, jint keycode, jint modifiers, jboolean isRepeat
) {
if (keycode != AKEYCODE_BACK && keycode != AKEYCODE_MENU) {
auto keyboard_dispatcher = cocos2d::CCDirector::sharedDirector()->getKeyboardDispatcher();
auto translated_code = translateAndroidKeyCodeToWindows(keycode);
auto isShiftPressed = modifiers & 0x1;
auto isCtrlPressed = modifiers & 0x1000;
auto isAltPressed = modifiers & 0x2;
keyboard_dispatcher->updateModifierKeys(isShiftPressed, isCtrlPressed, isAltPressed, false);
keyboard_dispatcher->dispatchKeyboardMSG(translated_code, true, isRepeat);
} else {
auto keypad_dispatcher = cocos2d::CCDirector::sharedDirector()->getKeypadDispatcher();
if (keycode == AKEYCODE_BACK) {
keypad_dispatcher->dispatchKeypadMSG(cocos2d::kTypeBackClicked);
} else {
keypad_dispatcher->dispatchKeypadMSG(cocos2d::kTypeMenuClicked);
}
}
}
extern "C" JNIEXPORT void JNICALL Java_com_geode_launcher_utils_GeodeUtils_nativeKeyUp(
JNIEnv* env, jobject, jint keycode, jint modifiers
) {
// back/menu keys
if (keycode != AKEYCODE_BACK && keycode != AKEYCODE_MENU) {
auto keyboard_dispatcher = cocos2d::CCDirector::sharedDirector()->getKeyboardDispatcher();
auto translated_code = translateAndroidKeyCodeToWindows(keycode);
auto isShiftPressed = modifiers & 0x1;
auto isCtrlPressed = modifiers & 0x1000;
auto isAltPressed = modifiers & 0x2;
keyboard_dispatcher->updateModifierKeys(
isShiftPressed,
isCtrlPressed,
isAltPressed,
false
);
keyboard_dispatcher->dispatchKeyboardMSG(translated_code, false, false);
}
}
constexpr auto g_scrollFactor = -13.0f;
extern "C" JNIEXPORT void JNICALL Java_com_geode_launcher_utils_GeodeUtils_nativeActionScroll(
JNIEnv* env, jobject, jfloat scrollX, jfloat scrollY
) {
cocos2d::CCDirector::sharedDirector()->getMouseDispatcher()->dispatchScrollMSG(
scrollY * g_scrollFactor, scrollX * g_scrollFactor
);
}
extern "C" JNIEXPORT void JNICALL Java_com_geode_launcher_utils_GeodeUtils_resizeSurface(
JNIEnv* env, jobject, jint width, jint height
) {
auto fWidth = static_cast<float>(width);
auto fHeight = static_cast<float>(height);
cocos2d::CCEGLView::sharedOpenGLView()->setFrameSize(fWidth, fHeight);
cocos2d::CCDirector::sharedDirector()->updateScreenScale({fWidth, fHeight});
cocos2d::CCDirector::sharedDirector()->setViewport();
cocos2d::CCDirector::sharedDirector()->setProjection(cocos2d::kCCDirectorProjection2D);
}

View file

@ -2,6 +2,7 @@
#include "../load.hpp"
#include <jni.h>
#include <Geode/cocos/platform/android/jni/JniHelper.h>
#include "internalString.hpp"
#include <cocos2d.h>
#include <Geode/loader/Log.hpp>
@ -16,6 +17,31 @@ PFNGLGENVERTEXARRAYSOESPROC glGenVertexArraysOESEXT = 0;
PFNGLBINDVERTEXARRAYOESPROC glBindVertexArrayOESEXT = 0;
PFNGLDELETEVERTEXARRAYSOESPROC glDeleteVertexArraysOESEXT = 0;
namespace {
bool reportPlatformCapability(std::string id) {
JniMethodInfo t;
if (JniHelper::getStaticMethodInfo(t, "com/geode/launcher/utils/GeodeUtils", "reportPlatformCapability", "(Ljava/lang/String;)Z")) {
jstring stringArg1 = t.env->NewStringUTF(id.c_str());
auto r = t.env->CallStaticBooleanMethod(t.classID, t.methodID, stringArg1);
t.env->DeleteLocalRef(stringArg1);
t.env->DeleteLocalRef(t.classID);
return r;
} else {
auto vm = JniHelper::getJavaVM();
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) == JNI_OK) {
env->ExceptionClear();
}
}
return false;
}
}
extern "C" [[gnu::visibility("default")]] jint JNI_OnLoad(JavaVM* vm, void* reserved) {
glGenVertexArraysOESEXT = (PFNGLGENVERTEXARRAYSOESPROC)eglGetProcAddress("glGenVertexArraysOES");
glBindVertexArrayOESEXT = (PFNGLBINDVERTEXARRAYOESPROC)eglGetProcAddress("glBindVertexArrayOES");
@ -36,6 +62,8 @@ extern "C" [[gnu::visibility("default")]] jint JNI_OnLoad(JavaVM* vm, void* rese
delete cc;
}
reportPlatformCapability("extended_input");
geodeEntry(nullptr);
return JNI_VERSION_1_6;
}