diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt index b2d7d8b2b..53e18ac24 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/FloatSetting.kt @@ -6,8 +6,13 @@ package org.citron.citron_emu.features.settings.model import org.citron.citron_emu.utils.NativeConfig enum class FloatSetting(override val key: String) : AbstractFloatSetting { - // No float settings currently exist - EMPTY_SETTING(""); + // CRT Shader Settings + CRT_SCANLINE_STRENGTH("crt_scanline_strength"), + CRT_CURVATURE("crt_curvature"), + CRT_GAMMA("crt_gamma"), + CRT_BLOOM("crt_bloom"), + CRT_BRIGHTNESS("crt_brightness"), + CRT_ALPHA("crt_alpha"); override fun getFloat(needsGlobal: Boolean): Float = NativeConfig.getFloat(key, false) diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt index f540dacb8..b6b541371 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/IntSetting.kt @@ -39,6 +39,10 @@ enum class IntSetting(override val key: String) : AbstractIntSetting { SHADER_BACKEND("shader_backend"), VRAM_USAGE_MODE("vram_usage_mode"), EXTENDED_DYNAMIC_STATE("extended_dynamic_state"), + ANDROID_ASTC_MODE("android_astc_mode"), + + // CRT Shader Settings + CRT_MASK_TYPE("crt_mask_type"), // VRAM Management settings (FIXED: VRAM leak prevention) VRAM_LIMIT_MB("vram_limit_mb"), diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt index 87f685395..afeca9c37 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SettingsItem.kt @@ -14,6 +14,7 @@ import org.citron.citron_emu.features.settings.model.AbstractBooleanSetting import org.citron.citron_emu.features.settings.model.AbstractSetting import org.citron.citron_emu.features.settings.model.BooleanSetting import org.citron.citron_emu.features.settings.model.ByteSetting +import org.citron.citron_emu.features.settings.model.FloatSetting import org.citron.citron_emu.features.settings.model.IntSetting import org.citron.citron_emu.features.settings.model.LongSetting import org.citron.citron_emu.features.settings.model.ShortSetting @@ -425,6 +426,15 @@ abstract class SettingsItem( valuesId = R.array.astcRecompressionValues ) ) + put( + SingleChoiceSetting( + IntSetting.ANDROID_ASTC_MODE, + titleId = R.string.android_astc_mode, + descriptionId = R.string.android_astc_mode_description, + choicesId = R.array.androidAstcModeNames, + valuesId = R.array.androidAstcModeValues + ) + ) put( SingleChoiceSetting( IntSetting.SHADER_BACKEND, @@ -534,6 +544,83 @@ abstract class SettingsItem( ) ) + // CRT Shader Settings (shown conditionally in Zep Zone when CRT filter is selected) + put( + SliderSetting( + FloatSetting.CRT_SCANLINE_STRENGTH, + titleId = R.string.crt_scanline_strength, + descriptionId = R.string.crt_scanline_strength_description, + min = 0, + max = 200, + units = "%", + scale = 100.0f + ) + ) + put( + SliderSetting( + FloatSetting.CRT_CURVATURE, + titleId = R.string.crt_curvature, + descriptionId = R.string.crt_curvature_description, + min = 0, + max = 100, + units = "%", + scale = 100.0f + ) + ) + put( + SliderSetting( + FloatSetting.CRT_GAMMA, + titleId = R.string.crt_gamma, + descriptionId = R.string.crt_gamma_description, + min = 100, + max = 300, + units = "%", + scale = 100.0f + ) + ) + put( + SliderSetting( + FloatSetting.CRT_BLOOM, + titleId = R.string.crt_bloom, + descriptionId = R.string.crt_bloom_description, + min = 0, + max = 100, + units = "%", + scale = 100.0f + ) + ) + put( + SingleChoiceSetting( + IntSetting.CRT_MASK_TYPE, + titleId = R.string.crt_mask_type, + descriptionId = R.string.crt_mask_type_description, + choicesId = R.array.crtMaskTypeNames, + valuesId = R.array.crtMaskTypeValues + ) + ) + put( + SliderSetting( + FloatSetting.CRT_BRIGHTNESS, + titleId = R.string.crt_brightness, + descriptionId = R.string.crt_brightness_description, + min = 0, + max = 200, + units = "%", + scale = 100.0f + ) + ) + put( + SliderSetting( + FloatSetting.CRT_ALPHA, + titleId = R.string.crt_alpha, + descriptionId = R.string.crt_alpha_description, + min = 0, + max = 100, + units = "%", + scale = 100.0f + ) + ) + // Applet Mode Settings put( SingleChoiceSetting( diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt index 6d7f079da..6ed8fbf62 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/model/view/SliderSetting.kt @@ -19,7 +19,8 @@ class SliderSetting( descriptionString: String = "", val min: Int = 0, val max: Int = 100, - val units: String = "" + val units: String = "", + val scale: Float = 1.0f // Scale factor for float settings (e.g., 100.0 means UI value 100 = C++ value 1.0) ) : SettingsItem(setting, titleId, titleString, descriptionId, descriptionString) { override val type = TYPE_SLIDER @@ -28,7 +29,7 @@ class SliderSetting( is AbstractByteSetting -> setting.getByte(needsGlobal).toInt() is AbstractShortSetting -> setting.getShort(needsGlobal).toInt() is AbstractIntSetting -> setting.getInt(needsGlobal) - is AbstractFloatSetting -> setting.getFloat(needsGlobal).roundToInt() + is AbstractFloatSetting -> (setting.getFloat(needsGlobal) * scale).roundToInt() else -> -1 } @@ -36,7 +37,7 @@ class SliderSetting( when (setting) { is AbstractByteSetting -> setting.setByte(value.toByte()) is AbstractShortSetting -> setting.setShort(value.toShort()) - is AbstractFloatSetting -> setting.setFloat(value.toFloat()) + is AbstractFloatSetting -> setting.setFloat(value.toFloat() / scale) else -> (setting as AbstractIntSetting).setInt(value) } } diff --git a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt index f11a41d73..8bac821a8 100644 --- a/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt +++ b/src/android/app/src/main/java/org/citron/citron_emu/features/settings/ui/SettingsFragmentPresenter.kt @@ -19,6 +19,7 @@ import org.citron.citron_emu.features.settings.model.AbstractBooleanSetting import org.citron.citron_emu.features.settings.model.AbstractIntSetting import org.citron.citron_emu.features.settings.model.BooleanSetting import org.citron.citron_emu.features.settings.model.ByteSetting +import org.citron.citron_emu.features.settings.model.FloatSetting import org.citron.citron_emu.features.settings.model.IntSetting import org.citron.citron_emu.features.settings.model.LongSetting import org.citron.citron_emu.features.settings.model.Settings @@ -1026,6 +1027,7 @@ class SettingsFragmentPresenter( add(HeaderSetting(R.string.astc_settings_header)) add(IntSetting.ASTC_DECODE_MODE.key) add(IntSetting.ASTC_RECOMPRESSION.key) + add(IntSetting.ANDROID_ASTC_MODE.key) add(HeaderSetting(R.string.advanced_graphics_header)) add(IntSetting.SHADER_BACKEND.key) @@ -1045,6 +1047,20 @@ class SettingsFragmentPresenter( add(IntSetting.BUFFER_EVICTION_FRAMES.key) add(BooleanSetting.SPARSE_TEXTURE_PRIORITY_EVICTION.key) add(BooleanSetting.LOG_VRAM_USAGE.key) + + // CRT Shader Settings (only shown when CRT filter is enabled) + // CRTEasyMode = 9, CRTRoyale = 10 + val scalingFilter = IntSetting.RENDERER_SCALING_FILTER.getInt(false) + if (scalingFilter == 9 || scalingFilter == 10) { + add(HeaderSetting(R.string.crt_shader_header)) + add(FloatSetting.CRT_SCANLINE_STRENGTH.key) + add(FloatSetting.CRT_CURVATURE.key) + add(FloatSetting.CRT_GAMMA.key) + add(FloatSetting.CRT_BLOOM.key) + add(IntSetting.CRT_MASK_TYPE.key) + add(FloatSetting.CRT_BRIGHTNESS.key) + add(FloatSetting.CRT_ALPHA.key) + } } } diff --git a/src/android/app/src/main/res/values/arrays.xml b/src/android/app/src/main/res/values/arrays.xml index 7521cb1ed..542935195 100644 --- a/src/android/app/src/main/res/values/arrays.xml +++ b/src/android/app/src/main/res/values/arrays.xml @@ -400,6 +400,18 @@ 2 + + @string/android_astc_mode_auto + @string/android_astc_mode_native + @string/android_astc_mode_decompress + + + + 0 + 1 + 2 + + GLSL GLASM @@ -458,4 +470,17 @@ 1 + + + @string/crt_mask_none + @string/crt_mask_aperture + @string/crt_mask_shadow + + + + 0 + 1 + 2 + + diff --git a/src/android/app/src/main/res/values/strings.xml b/src/android/app/src/main/res/values/strings.xml index a1c175315..d80172b8c 100644 --- a/src/android/app/src/main/res/values/strings.xml +++ b/src/android/app/src/main/res/values/strings.xml @@ -1259,6 +1259,11 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Controls how ASTC textures are decoded. GPU decoding is faster but may cause issues on some devices. ASTC Recompression Method Controls how ASTC textures are recompressed when GPU doesn\'t support them natively. + Android ASTC Eviction + Controls texture cache eviction on Android devices with native ASTC support (Adreno 740+). Native mode uses compressed sizes for eviction, allowing more textures to be cached. + Auto (Detect Hardware) + Native (Adreno 740+ Optimized) + Decompress (Legacy) Shader Backend Controls which shader backend to use for rendering. VRAM Usage Mode @@ -1293,4 +1298,24 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Light (Recommended) Frame Skipping + + CRT Shader Settings + Scanline Strength + Controls the intensity of CRT scanlines. Higher values create darker, more visible scanlines. + Screen Curvature + Simulates the curved glass of old CRT monitors. 0 is flat, higher values add more curve. + Gamma + Adjusts the brightness curve of the image. Lower values make the image darker, higher values make it brighter. + Bloom + Adds a soft glow around bright areas. Creates a phosphor bloom effect typical of CRT displays. + Mask Type + Simulates the shadow mask or aperture grille of CRT displays. Affects how subpixels are rendered. + Brightness + Overall brightness adjustment. Values below 1.0 darken the image, above 1.0 brighten it. + Shader Intensity + Blends between the CRT effect and original image. 1.0 is full CRT effect, lower values show more of the original. + None + Aperture Grille + Shadow Mask +