diff options
| author | JosJuice <josjuice@gmail.com> | 2022-07-23 17:14:26 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2022-07-23 21:58:45 +0200 |
| commit | 8f410bff15e1549a3f54e33ec0f4cf511ebea7df (patch) | |
| tree | 295e6373580fce23d1d93a403c17e6b5de87d292 /Source/Android | |
| parent | 45f6d36c4581b37d6b3eff0a8004301d685adf55 (diff) | |
Android: Add graphics mods support to CheatsActivity
Diffstat (limited to 'Source/Android')
10 files changed, 339 insertions, 2 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java index 0238628319..4d9900c168 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/CheatsViewModel.java @@ -24,10 +24,13 @@ public class CheatsViewModel extends ViewModel private final MutableLiveData<Integer> mGeckoCheatsDownloadedEvent = new MutableLiveData<>(null); private final MutableLiveData<Boolean> mOpenDetailsViewEvent = new MutableLiveData<>(false); + private GraphicsModGroup mGraphicsModGroup; + private ArrayList<GraphicsMod> mGraphicsMods; private ArrayList<PatchCheat> mPatchCheats; private ArrayList<ARCheat> mARCheats; private ArrayList<GeckoCheat> mGeckoCheats; + private boolean mGraphicsModsNeedSaving = false; private boolean mPatchCheatsNeedSaving = false; private boolean mARCheatsNeedSaving = false; private boolean mGeckoCheatsNeedSaving = false; @@ -37,13 +40,23 @@ public class CheatsViewModel extends ViewModel if (mLoaded) return; + mGraphicsModGroup = GraphicsModGroup.load(gameID); + mGraphicsMods = new ArrayList<>(); + Collections.addAll(mGraphicsMods, mGraphicsModGroup.getMods()); + mPatchCheats = new ArrayList<>(); Collections.addAll(mPatchCheats, PatchCheat.loadCodes(gameID, revision)); + mARCheats = new ArrayList<>(); Collections.addAll(mARCheats, ARCheat.loadCodes(gameID, revision)); + mGeckoCheats = new ArrayList<>(); Collections.addAll(mGeckoCheats, GeckoCheat.loadCodes(gameID, revision)); + for (GraphicsMod mod : mGraphicsMods) + { + mod.setChangedCallback(() -> mGraphicsModsNeedSaving = true); + } for (PatchCheat cheat : mPatchCheats) { cheat.setChangedCallback(() -> mPatchCheatsNeedSaving = true); @@ -62,6 +75,12 @@ public class CheatsViewModel extends ViewModel public void saveIfNeeded(String gameID, int revision) { + if (mGraphicsModsNeedSaving) + { + mGraphicsModGroup.save(); + mGraphicsModsNeedSaving = false; + } + if (mPatchCheatsNeedSaving) { PatchCheat.saveCodes(gameID, revision, mPatchCheats.toArray(new PatchCheat[0])); @@ -280,6 +299,11 @@ public class CheatsViewModel extends ViewModel mOpenDetailsViewEvent.setValue(false); } + public ArrayList<GraphicsMod> getGraphicsMods() + { + return mGraphicsMods; + } + public ArrayList<PatchCheat> getPatchCheats() { return mPatchCheats; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GraphicsMod.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GraphicsMod.java new file mode 100644 index 0000000000..241d15093f --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GraphicsMod.java @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class GraphicsMod extends ReadOnlyCheat +{ + @Keep + private final long mPointer; + + // When a C++ GraphicsModGroup object is destroyed, it also destroys the GraphicsMods it owns. + // To avoid getting dangling pointers, we keep a reference to the GraphicsModGroup here. + @Keep + private final GraphicsModGroup mParent; + + @Keep + private GraphicsMod(long pointer, GraphicsModGroup parent) + { + mPointer = pointer; + mParent = parent; + } + + public boolean supportsCreator() + { + return true; + } + + public boolean supportsNotes() + { + return true; + } + + public boolean supportsCode() + { + return false; + } + + @NonNull + public native String getName(); + + @NonNull + public native String getCreator(); + + @NonNull + public native String getNotes(); + + public boolean getUserDefined() + { + // Technically graphics mods can be user defined, but we don't support editing graphics mods + // in the GUI, and editability is what this really controls + return false; + } + + public native boolean getEnabled(); + + @Override + protected native void setEnabledImpl(boolean enabled); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup.java new file mode 100644 index 0000000000..0cb0a3c456 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup.java @@ -0,0 +1,27 @@ +package org.dolphinemu.dolphinemu.features.cheats.model; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; + +public class GraphicsModGroup +{ + @Keep + private final long mPointer; + + @Keep + private GraphicsModGroup(long pointer) + { + mPointer = pointer; + } + + @Override + public native void finalize(); + + @NonNull + public native GraphicsMod[] getMods(); + + public native void save(); + + @NonNull + public static native GraphicsModGroup load(String gameId); +} diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java index ec256cf6e2..e5be47a3f1 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/features/cheats/ui/CheatsAdapter.java @@ -13,6 +13,7 @@ import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.features.cheats.model.ARCheat; import org.dolphinemu.dolphinemu.features.cheats.model.CheatsViewModel; import org.dolphinemu.dolphinemu.features.cheats.model.GeckoCheat; +import org.dolphinemu.dolphinemu.features.cheats.model.GraphicsMod; import org.dolphinemu.dolphinemu.features.cheats.model.PatchCheat; import java.util.ArrayList; @@ -90,8 +91,8 @@ public class CheatsAdapter extends RecyclerView.Adapter<CheatItemViewHolder> @Override public int getItemCount() { - return mViewModel.getARCheats().size() + mViewModel.getGeckoCheats().size() + - mViewModel.getPatchCheats().size() + 7; + return mViewModel.getGraphicsMods().size() + mViewModel.getPatchCheats().size() + + mViewModel.getARCheats().size() + mViewModel.getGeckoCheats().size() + 8; } @Override @@ -108,6 +109,17 @@ public class CheatsAdapter extends RecyclerView.Adapter<CheatItemViewHolder> private CheatItem getItemAt(int position) { + // Graphics mods + + if (position == 0) + return new CheatItem(CheatItem.TYPE_HEADER, R.string.cheats_header_graphics_mod); + position -= 1; + + ArrayList<GraphicsMod> graphicsMods = mViewModel.getGraphicsMods(); + if (position < graphicsMods.size()) + return new CheatItem(graphicsMods.get(position)); + position -= graphicsMods.size(); + // Patches if (position == 0) diff --git a/Source/Android/app/src/main/res/values/strings.xml b/Source/Android/app/src/main/res/values/strings.xml index 8ae9374a50..7b1d1b7bf4 100644 --- a/Source/Android/app/src/main/res/values/strings.xml +++ b/Source/Android/app/src/main/res/values/strings.xml @@ -490,6 +490,7 @@ <string name="cheats_header_ar">AR Codes</string> <string name="cheats_header_gecko">Gecko Codes</string> <string name="cheats_header_patch">Patches</string> + <string name="cheats_header_graphics_mod">Graphics Mods</string> <string name="cheats_add_ar">Add New AR Code</string> <string name="cheats_add_gecko">Add New Gecko Code</string> <string name="cheats_add_patch">Add New Patch</string> diff --git a/Source/Android/jni/AndroidCommon/IDCache.cpp b/Source/Android/jni/AndroidCommon/IDCache.cpp index b125babb81..31511b485c 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.cpp +++ b/Source/Android/jni/AndroidCommon/IDCache.cpp @@ -70,6 +70,14 @@ static jclass s_patch_cheat_class; static jfieldID s_patch_cheat_pointer; static jmethodID s_patch_cheat_constructor; +static jclass s_graphics_mod_group_class; +static jfieldID s_graphics_mod_group_pointer; +static jmethodID s_graphics_mod_group_constructor; + +static jclass s_graphics_mod_class; +static jfieldID s_graphics_mod_pointer; +static jmethodID s_graphics_mod_constructor; + static jclass s_riivolution_patches_class; static jfieldID s_riivolution_patches_pointer; @@ -331,6 +339,36 @@ jmethodID GetPatchCheatConstructor() return s_patch_cheat_constructor; } +jclass GetGraphicsModClass() +{ + return s_graphics_mod_class; +} + +jfieldID GetGraphicsModPointer() +{ + return s_graphics_mod_pointer; +} + +jmethodID GetGraphicsModConstructor() +{ + return s_graphics_mod_constructor; +} + +jclass GetGraphicsModGroupClass() +{ + return s_graphics_mod_group_class; +} + +jfieldID GetGraphicsModGroupPointer() +{ + return s_graphics_mod_group_pointer; +} + +jmethodID GetGraphicsModGroupConstructor() +{ + return s_graphics_mod_group_constructor; +} + jclass GetRiivolutionPatchesClass() { return s_riivolution_patches_class; @@ -480,6 +518,23 @@ JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) s_patch_cheat_constructor = env->GetMethodID(patch_cheat_class, "<init>", "(J)V"); env->DeleteLocalRef(patch_cheat_class); + const jclass graphics_mod_group_class = + env->FindClass("org/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup"); + s_graphics_mod_group_class = + reinterpret_cast<jclass>(env->NewGlobalRef(graphics_mod_group_class)); + s_graphics_mod_group_pointer = env->GetFieldID(graphics_mod_group_class, "mPointer", "J"); + s_graphics_mod_group_constructor = env->GetMethodID(graphics_mod_group_class, "<init>", "(J)V"); + env->DeleteLocalRef(graphics_mod_group_class); + + const jclass graphics_mod_class = + env->FindClass("org/dolphinemu/dolphinemu/features/cheats/model/GraphicsMod"); + s_graphics_mod_class = reinterpret_cast<jclass>(env->NewGlobalRef(graphics_mod_class)); + s_graphics_mod_pointer = env->GetFieldID(graphics_mod_class, "mPointer", "J"); + s_graphics_mod_constructor = + env->GetMethodID(graphics_mod_class, "<init>", + "(JLorg/dolphinemu/dolphinemu/features/cheats/model/GraphicsModGroup;)V"); + env->DeleteLocalRef(graphics_mod_class); + const jclass riivolution_patches_class = env->FindClass("org/dolphinemu/dolphinemu/features/riivolution/model/RiivolutionPatches"); s_riivolution_patches_class = @@ -516,6 +571,8 @@ JNIEXPORT void JNI_OnUnload(JavaVM* vm, void* reserved) env->DeleteGlobalRef(s_ar_cheat_class); env->DeleteGlobalRef(s_gecko_cheat_class); env->DeleteGlobalRef(s_patch_cheat_class); + env->DeleteGlobalRef(s_graphics_mod_group_class); + env->DeleteGlobalRef(s_graphics_mod_class); env->DeleteGlobalRef(s_riivolution_patches_class); env->DeleteGlobalRef(s_wii_update_cb_class); } diff --git a/Source/Android/jni/AndroidCommon/IDCache.h b/Source/Android/jni/AndroidCommon/IDCache.h index 83eaa85894..58a0aa17bd 100644 --- a/Source/Android/jni/AndroidCommon/IDCache.h +++ b/Source/Android/jni/AndroidCommon/IDCache.h @@ -69,6 +69,14 @@ jclass GetPatchCheatClass(); jfieldID GetPatchCheatPointer(); jmethodID GetPatchCheatConstructor(); +jclass GetGraphicsModGroupClass(); +jfieldID GetGraphicsModGroupPointer(); +jmethodID GetGraphicsModGroupConstructor(); + +jclass GetGraphicsModClass(); +jfieldID GetGraphicsModPointer(); +jmethodID GetGraphicsModConstructor(); + jclass GetRiivolutionPatchesClass(); jfieldID GetRiivolutionPatchesPointer(); diff --git a/Source/Android/jni/CMakeLists.txt b/Source/Android/jni/CMakeLists.txt index 74d9d90e03..146019501e 100644 --- a/Source/Android/jni/CMakeLists.txt +++ b/Source/Android/jni/CMakeLists.txt @@ -2,6 +2,8 @@ add_library(main SHARED Cheats/ARCheat.cpp Cheats/Cheats.h Cheats/GeckoCheat.cpp + Cheats/GraphicsMod.cpp + Cheats/GraphicsModGroup.cpp Cheats/PatchCheat.cpp Config/NativeConfig.cpp Config/PostProcessing.cpp diff --git a/Source/Android/jni/Cheats/GraphicsMod.cpp b/Source/Android/jni/Cheats/GraphicsMod.cpp new file mode 100644 index 0000000000..627351f546 --- /dev/null +++ b/Source/Android/jni/Cheats/GraphicsMod.cpp @@ -0,0 +1,53 @@ +// Copyright 2022 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <string> + +#include <jni.h> + +#include "VideoCommon/GraphicsModSystem/Config/GraphicsMod.h" +#include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" + +static GraphicsModConfig* GetPointer(JNIEnv* env, jobject obj) +{ + return reinterpret_cast<GraphicsModConfig*>( + env->GetLongField(obj, IDCache::GetGraphicsModPointer())); +} + +extern "C" { + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getName(JNIEnv* env, jobject obj) +{ + return ToJString(env, GetPointer(env, obj)->m_title); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getCreator(JNIEnv* env, + jobject obj) +{ + return ToJString(env, GetPointer(env, obj)->m_author); +} + +JNIEXPORT jstring JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getNotes(JNIEnv* env, jobject obj) +{ + return ToJString(env, GetPointer(env, obj)->m_description); +} + +JNIEXPORT jboolean JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_getEnabled(JNIEnv* env, + jobject obj) +{ + return static_cast<jboolean>(GetPointer(env, obj)->m_enabled); +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsMod_setEnabledImpl(JNIEnv* env, + jobject obj, + jboolean enabled) +{ + GetPointer(env, obj)->m_enabled = static_cast<bool>(enabled); +} +} diff --git a/Source/Android/jni/Cheats/GraphicsModGroup.cpp b/Source/Android/jni/Cheats/GraphicsModGroup.cpp new file mode 100644 index 0000000000..e7a9329b53 --- /dev/null +++ b/Source/Android/jni/Cheats/GraphicsModGroup.cpp @@ -0,0 +1,92 @@ +// Copyright 2022 Dolphin Emulator Project +// SPDX-License-Identifier: GPL-2.0-or-later + +#include <jni.h> + +#include <set> +#include <vector> + +#include "VideoCommon/GraphicsModSystem/Config/GraphicsMod.h" +#include "VideoCommon/GraphicsModSystem/Config/GraphicsModGroup.h" +#include "jni/AndroidCommon/AndroidCommon.h" +#include "jni/AndroidCommon/IDCache.h" + +static GraphicsModGroupConfig* GetPointer(JNIEnv* env, jobject obj) +{ + return reinterpret_cast<GraphicsModGroupConfig*>( + env->GetLongField(obj, IDCache::GetGraphicsModGroupPointer())); +} + +jobject GraphicsModToJava(JNIEnv* env, GraphicsModConfig* mod, jobject jGraphicsModGroup) +{ + return env->NewObject(IDCache::GetGraphicsModClass(), IDCache::GetGraphicsModConstructor(), + reinterpret_cast<jlong>(mod), jGraphicsModGroup); +} + +extern "C" { + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_finalize(JNIEnv* env, + jobject obj) +{ + delete GetPointer(env, obj); +} + +JNIEXPORT jobjectArray JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_getMods(JNIEnv* env, + jobject obj) +{ + GraphicsModGroupConfig* mod_group = GetPointer(env, obj); + + std::set<std::string> groups; + + for (const GraphicsModConfig& mod : mod_group->GetMods()) + { + for (const GraphicsTargetGroupConfig& group : mod.m_groups) + groups.insert(group.m_name); + } + + std::vector<GraphicsModConfig*> mods; + + for (GraphicsModConfig& mod : mod_group->GetMods()) + { + // If no group matches the mod's features, or if the mod has no features, skip it + if (std::none_of(mod.m_features.begin(), mod.m_features.end(), + [&groups](const GraphicsModFeatureConfig& feature) { + return groups.count(feature.m_group) == 1; + })) + { + continue; + } + + mods.push_back(&mod); + } + + const jobjectArray array = + env->NewObjectArray(static_cast<jsize>(mods.size()), IDCache::GetGraphicsModClass(), nullptr); + + jsize i = 0; + for (GraphicsModConfig* mod : mods) + env->SetObjectArrayElement(array, i++, GraphicsModToJava(env, mod, obj)); + + return array; +} + +JNIEXPORT void JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_save(JNIEnv* env, jobject obj) +{ + GetPointer(env, obj)->Save(); +} + +JNIEXPORT jobject JNICALL +Java_org_dolphinemu_dolphinemu_features_cheats_model_GraphicsModGroup_load(JNIEnv* env, jclass, + jstring jGameId) +{ + auto* mod_group = new GraphicsModGroupConfig(GetJString(env, jGameId)); + + mod_group->Load(); + + return env->NewObject(IDCache::GetGraphicsModGroupClass(), + IDCache::GetGraphicsModGroupConstructor(), mod_group); +} +} |
