Added overlay settings

This commit is contained in:
SSimco
2024-07-08 19:46:53 +03:00
parent bb10cfbf62
commit 7be7cf46d1
8 changed files with 278 additions and 3 deletions
+104
View File
@@ -413,3 +413,107 @@ Java_info_cemu_Cemu_NativeLibrary_onOverlayAxis([[maybe_unused]] JNIEnv* env, [[
{
s_emulationState.getEmulatedController(controllerIndex).setAxisValue(mappingId, value);
}
extern "C" JNIEXPORT jint JNICALL
Java_info_cemu_Cemu_NativeLibrary_getOverlayPosition([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return static_cast<jint>(g_config.data().overlay.position);
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayPosition([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jint position)
{
g_config.data().overlay.position = static_cast<ScreenPosition>(position);
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayFPSEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.fps;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayFPSEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.fps = enabled;
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayDrawCallsPerFrameEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.drawcalls;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayDrawCallsPerFrameEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.drawcalls = enabled;
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayCPUUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.cpu_usage;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayCPUUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.cpu_usage = enabled;
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayCPUPerCoreUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.cpu_per_core_usage;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayCPUPerCoreUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.cpu_per_core_usage = enabled;
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayRAMUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.ram_usage;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayRAMUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.ram_usage = enabled;
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayVRAMUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.vram_usage;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayVRAMUsageEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.vram_usage = enabled;
g_config.Save();
}
extern "C" JNIEXPORT jboolean JNICALL
Java_info_cemu_Cemu_NativeLibrary_isOverlayDebugEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz)
{
return g_config.data().overlay.debug;
}
extern "C" JNIEXPORT void JNICALL
Java_info_cemu_Cemu_NativeLibrary_setOverlayDebugEnabled([[maybe_unused]] JNIEnv* env, [[maybe_unused]] jclass clazz, jboolean enabled)
{
g_config.data().overlay.debug = enabled;
g_config.Save();
}
@@ -95,7 +95,6 @@ public class DPadInput extends Input {
iconDpadRightPressed,
iconDpadRightNotPressed
);
Log.i("INPUT", "Dpad reconfigure: " + rect);
}
public DPadInput(Resources resources, @DrawableRes int backgroundId, @DrawableRes int pressedButtonId, @DrawableRes int notPressedButtonId, ButtonStateChangeListener buttonStateChangeListener, InputOverlaySettingsProvider.InputOverlaySettings settings) {
@@ -29,8 +29,6 @@ public class NativeLibrary {
boolean exists(String uri);
}
public static native void setFileSystemCallbacks(FileSystemCallbacks fileSystemCallbacks);
public static native void setDPI(float dpi);
public static native void setSurface(Surface surface, boolean isMainCanvas);
@@ -383,4 +381,58 @@ public class NativeLibrary {
public static native void onOverlayButton(int controllerIndex, int mappingId, boolean value);
public static native void onOverlayAxis(int controllerIndex, int mappingId, float value);
static final int OVERLAY_SCREEN_POSITION_DISABLED = 0;
static final int OVERLAY_SCREEN_POSITION_TOP_LEFT = 1;
static final int OVERLAY_SCREEN_POSITION_TOP_CENTER = 2;
static final int OVERLAY_SCREEN_POSITION_TOP_RIGHT = 3;
static final int OVERLAY_SCREEN_POSITION_BOTTOM_LEFT = 4;
static final int OVERLAY_SCREEN_POSITION_BOTTOM_CENTER = 5;
static final int OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT = 6;
public static int overlayScreenPositionToResourceNameId(int overlayScreenPosition) {
return switch (overlayScreenPosition) {
case OVERLAY_SCREEN_POSITION_DISABLED -> R.string.overlay_position_disabled;
case OVERLAY_SCREEN_POSITION_TOP_LEFT -> R.string.overlay_position_top_left;
case OVERLAY_SCREEN_POSITION_TOP_CENTER -> R.string.overlay_position_top_center;
case OVERLAY_SCREEN_POSITION_TOP_RIGHT -> R.string.overlay_position_top_right;
case OVERLAY_SCREEN_POSITION_BOTTOM_LEFT -> R.string.overlay_position_bottom_left;
case OVERLAY_SCREEN_POSITION_BOTTOM_CENTER -> R.string.overlay_position_bottom_center;
case OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT -> R.string.overlay_position_bottom_right;
default ->
throw new RuntimeException("Invalid overlay position: " + overlayScreenPosition);
};
}
public static native int getOverlayPosition();
public static native void setOverlayPosition(int position);
public static native boolean isOverlayFPSEnabled();
public static native void setOverlayFPSEnabled(boolean enabled);
public static native boolean isOverlayDrawCallsPerFrameEnabled();
public static native void setOverlayDrawCallsPerFrameEnabled(boolean enabled);
public static native boolean isOverlayCPUUsageEnabled();
public static native void setOverlayCPUUsageEnabled(boolean enabled);
public static native boolean isOverlayCPUPerCoreUsageEnabled();
public static native void setOverlayCPUPerCoreUsageEnabled(boolean enabled);
public static native boolean isOverlayRAMUsageEnabled();
public static native void setOverlayRAMUsageEnabled(boolean enabled);
public static native boolean isOverlayVRAMUsageEnabled();
public static native void setOverlayVRAMUsageEnabled(boolean enabled);
public static native boolean isOverlayDebugEnabled();
public static native void setOverlayDebugEnabled(boolean enabled);
}
@@ -52,6 +52,7 @@ public class OptionsFragment extends Fragment {
genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.graphics_settings), () -> NavHostFragment.findNavController(OptionsFragment.this).navigate(R.id.action_optionsFragment_to_graphicSettingsFragment)));
genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.audio_settings), () -> NavHostFragment.findNavController(OptionsFragment.this).navigate(R.id.action_optionsFragment_to_audioSettingsFragment)));
genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.graphic_packs), () -> NavHostFragment.findNavController(OptionsFragment.this).navigate(R.id.action_optionsFragment_to_graphicPacksRootFragment)));
genericRecyclerViewAdapter.addRecyclerViewItem(new SimpleButtonRecyclerViewItem(getString(R.string.overlay), () -> NavHostFragment.findNavController(OptionsFragment.this).navigate(R.id.action_optionsFragment_to_overlaySettingsFragment)));
binding.optionsRecyclerView.setAdapter(genericRecyclerViewAdapter);
return binding.getRoot();
@@ -0,0 +1,74 @@
package info.cemu.Cemu;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import info.cemu.Cemu.databinding.FragmentOverlaySettingsBinding;
public class OverlaySettingsFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentOverlaySettingsBinding binding = FragmentOverlaySettingsBinding.inflate(inflater, container, false);
GenericRecyclerViewAdapter genericRecyclerViewAdapter = new GenericRecyclerViewAdapter();
var overlayPositionChoices = Stream.of(
NativeLibrary.OVERLAY_SCREEN_POSITION_DISABLED,
NativeLibrary.OVERLAY_SCREEN_POSITION_TOP_LEFT,
NativeLibrary.OVERLAY_SCREEN_POSITION_TOP_CENTER,
NativeLibrary.OVERLAY_SCREEN_POSITION_TOP_RIGHT,
NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_LEFT,
NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_CENTER,
NativeLibrary.OVERLAY_SCREEN_POSITION_BOTTOM_RIGHT)
.map(position -> new SelectionAdapter.ChoiceItem<>(t -> t.setText(NativeLibrary.overlayScreenPositionToResourceNameId(position)), position))
.collect(Collectors.toList());
int overlayPosition = NativeLibrary.getOverlayPosition();
SelectionAdapter<Integer> tvChannelsSelectionAdapter = new SelectionAdapter<>(overlayPositionChoices, overlayPosition);
SingleSelectionRecyclerViewItem<Integer> tvChannelsModeSelection = new SingleSelectionRecyclerViewItem<>(getString(R.string.overlay_position),
getString(NativeLibrary.overlayScreenPositionToResourceNameId(overlayPosition)), tvChannelsSelectionAdapter,
(position, selectionRecyclerViewItem) -> {
NativeLibrary.setOverlayPosition(position);
selectionRecyclerViewItem.setDescription(getString(NativeLibrary.overlayScreenPositionToResourceNameId(position)));
});
genericRecyclerViewAdapter.addRecyclerViewItem(tvChannelsModeSelection);
CheckboxRecyclerViewItem overlayFps = new CheckboxRecyclerViewItem(getString(R.string.fps_label),
getString(R.string.fps_description), NativeLibrary.isOverlayFPSEnabled(),
NativeLibrary::setOverlayFPSEnabled);
genericRecyclerViewAdapter.addRecyclerViewItem(overlayFps);
CheckboxRecyclerViewItem drawCallsCheckbox = new CheckboxRecyclerViewItem(getString(R.string.draw_calls_per_frame_label),
getString(R.string.draw_calls_per_frame_label_desription), NativeLibrary.isOverlayDrawCallsPerFrameEnabled(),
NativeLibrary::setOverlayDrawCallsPerFrameEnabled);
genericRecyclerViewAdapter.addRecyclerViewItem(drawCallsCheckbox);
CheckboxRecyclerViewItem cpuUsageCheckbox = new CheckboxRecyclerViewItem(getString(R.string.cpu_usage_label),
getString(R.string.cpu_usage_description), NativeLibrary.isOverlayCPUUsageEnabled(),
NativeLibrary::setOverlayCPUUsageEnabled);
genericRecyclerViewAdapter.addRecyclerViewItem(cpuUsageCheckbox);
CheckboxRecyclerViewItem ramUsageCheckbox = new CheckboxRecyclerViewItem(getString(R.string.ram_usage_label),
getString(R.string.ram_usage_description), NativeLibrary.isOverlayRAMUsageEnabled(),
NativeLibrary::setOverlayRAMUsageEnabled);
genericRecyclerViewAdapter.addRecyclerViewItem(ramUsageCheckbox);
CheckboxRecyclerViewItem vramUsageCheckbox = new CheckboxRecyclerViewItem(getString(R.string.vram_usage_label),
getString(R.string.vram_usage_description), NativeLibrary.isOverlayVRAMUsageEnabled(),
NativeLibrary::setOverlayVRAMUsageEnabled);
genericRecyclerViewAdapter.addRecyclerViewItem(vramUsageCheckbox);
binding.audioSettingsRecyclerView.setAdapter(genericRecyclerViewAdapter);
return binding.getRoot();
}
}
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".AudioSettingsFragment">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/audio_settings_recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
</FrameLayout>
@@ -55,6 +55,9 @@
<action
android:id="@+id/action_optionsFragment_to_graphicPacksRootFragment"
app:destination="@id/graphicPacksRootFragment" />
<action
android:id="@+id/action_optionsFragment_to_overlaySettingsFragment"
app:destination="@id/overlaySettingsFragment" />
</fragment>
<fragment
android:id="@+id/controllerInputsFragment"
@@ -70,6 +73,11 @@
android:name="info.cemu.Cemu.AudioSettingsFragment"
android:label="@string/audio_settings"
tools:layout="@layout/fragment_audio_settings" />
<fragment
android:id="@+id/overlaySettingsFragment"
android:name="info.cemu.Cemu.OverlaySettingsFragment"
android:label="@string/overlay_settings"
tools:layout="@layout/fragment_audio_settings" />
<fragment
android:id="@+id/inputOverlaySettingsFragment"
android:name="info.cemu.Cemu.InputOverlaySettingsFragment"
@@ -130,4 +130,24 @@
<string name="reset_overlay_button_desc">Reset the positions and sizes of the inputs</string>
<string name="vibrate">Vibrate</string>
<string name="enable_vibrate_on_touch">Enable vibrate on touch</string>
<string name="overlay_settings">Overlay settings</string>
<string name="overlay_position_disabled">Disabled</string>
<string name="overlay_position_top_left">Top left</string>
<string name="overlay_position_top_center">Top center</string>
<string name="overlay_position_top_right">Top right</string>
<string name="overlay_position_bottom_left">Bottom left</string>
<string name="overlay_position_bottom_center">Bottom center</string>
<string name="overlay_position_bottom_right">Bottom right</string>
<string name="overlay_position">Position</string>
<string name="overlay">Overlay</string>
<string name="fps_label">FPS</string>
<string name="fps_description">The number of frames per second. Average over last 5 seconds</string>
<string name="draw_calls_per_frame_label">Draw calls per frame</string>
<string name="draw_calls_per_frame_label_desription">The number of draw calls per frame. Average over last 5 seconds</string>
<string name="cpu_usage_label">CPU usage</string>
<string name="cpu_usage_description">CPU usage of Cemu in percent</string>
<string name="ram_usage_label">RAM usage</string>
<string name="ram_usage_description">Cemu RAM usage in MB</string>
<string name="vram_usage_label">VRAM usage</string>
<string name="vram_usage_description">The VRAM usage of Cemu in MB</string>
</resources>