diff options
| author | mahdihijazi <mahdi.hijaz@hotmail.com> | 2018-01-28 01:51:42 +0100 |
|---|---|---|
| committer | mahdihijazi <mahdi.hijaz@hotmail.com> | 2018-07-01 22:25:13 +0200 |
| commit | b924445e4894499a315769852fe5df7f747b739a (patch) | |
| tree | a90875fccfc1187e6b6c1aa5a06929a87e58099d /Source/Android/app/src/main/java/org | |
| parent | b4bb213ffdca35d16491ef84348adfc38c76a001 (diff) | |
Android: Support Post Processing Shaders
Diffstat (limited to 'Source/Android/app/src/main/java/org')
6 files changed, 202 insertions, 6 deletions
diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/SettingsItem.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/SettingsItem.java index 094e8be91d..95a926038a 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/SettingsItem.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/SettingsItem.java @@ -17,6 +17,7 @@ public abstract class SettingsItem public static final int TYPE_SLIDER = 3; public static final int TYPE_SUBMENU = 4; public static final int TYPE_INPUT_BINDING = 5; + public static final int TYPE_STRING_SINGLE_CHOICE = 6; private String mKey; private String mSection; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/StringSingleChoiceSetting.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/StringSingleChoiceSetting.java new file mode 100644 index 0000000000..161ee0f567 --- /dev/null +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/StringSingleChoiceSetting.java @@ -0,0 +1,97 @@ +package org.dolphinemu.dolphinemu.model.settings.view; + +import org.dolphinemu.dolphinemu.model.settings.Setting; +import org.dolphinemu.dolphinemu.model.settings.StringSetting; + +public class StringSingleChoiceSetting extends SettingsItem +{ + private String mDefaultValue; + + private String[] mChoicesId; + private String[] mValuesId; + + public StringSingleChoiceSetting(String key, String section, int file, int titleId, int descriptionId, String[] choicesId, String[] valuesId, String defaultValue, Setting setting) + { + super(key, section, file, setting, titleId, descriptionId); + mValuesId = valuesId; + mChoicesId = choicesId; + mDefaultValue = defaultValue; + } + + public String[] getChoicesId() + { + return mChoicesId; + } + + public String[] getValuesId() + { + return mValuesId; + } + + public String getValueAt(int index) + { + if (mValuesId == null) + return null; + + if (index >= 0 && index < mValuesId.length) + { + return mValuesId[index]; + } + + return ""; + } + + public String getSelectedValue() + { + if (getSetting() != null) + { + StringSetting setting = (StringSetting) getSetting(); + return setting.getValue(); + } + else + { + return mDefaultValue; + } + } + + public int getSelectValueIndex() { + String selectedValue = getSelectedValue(); + for(int i=0;i<mValuesId.length;i++) { + if(mValuesId[i].equals(selectedValue)) { + return i; + } + } + + return -1; + } + /** + * Write a value to the backing int. If that int was previously null, + * initializes a new one and returns it, so it can be added to the Hashmap. + * + * @param selection New value of the int. + * @return null if overwritten successfully otherwise; a newly created IntSetting. + */ + public StringSetting setSelectedValue(String selection) + { + if (getSetting() == null) + { + StringSetting setting = new StringSetting(getKey(), getSection(), getFile(), selection); + setSetting(setting); + return setting; + } + else + { + StringSetting setting = (StringSetting) getSetting(); + setting.setValue(selection); + return null; + } + } + + @Override + public int getType() + { + return TYPE_STRING_SINGLE_CHOICE; + } +} + + diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java index 9dde847d35..795a0b74ae 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java @@ -37,6 +37,7 @@ public final class DirectoryInitializationService extends IntentService public static final String EXTRA_STATE = "directoryState"; private static volatile DirectoryInitializationState directoryState = null; private static String userPath; + private static String internalPath; private static AtomicBoolean isDolphinDirectoryInitializationRunning = new AtomicBoolean(false); public enum DirectoryInitializationState @@ -110,6 +111,7 @@ public final class DirectoryInitializationService extends IntentService private void initializeInternalStorage() { File sysDirectory = new File(getFilesDir(), "Sys"); + internalPath = sysDirectory.getAbsolutePath(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); String revision = NativeLibrary.GetGitRevision(); @@ -177,6 +179,20 @@ public final class DirectoryInitializationService extends IntentService } + public static String getDolphinInternalDirectory() + { + if (directoryState == null) + { + throw new IllegalStateException("DirectoryInitializationService has to run at least once!"); + } + else if (isDolphinDirectoryInitializationRunning.get()) + { + throw new IllegalStateException("DirectoryInitializationService has to finish running first!"); + } + return internalPath; + + } + private void sendBroadcastState(DirectoryInitializationState state) { Intent localIntent = diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java index 6c10c1b3a6..5e27be4059 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java @@ -23,6 +23,7 @@ import org.dolphinemu.dolphinemu.model.settings.view.InputBindingSetting; import org.dolphinemu.dolphinemu.model.settings.view.SettingsItem; import org.dolphinemu.dolphinemu.model.settings.view.SingleChoiceSetting; import org.dolphinemu.dolphinemu.model.settings.view.SliderSetting; +import org.dolphinemu.dolphinemu.model.settings.view.StringSingleChoiceSetting; import org.dolphinemu.dolphinemu.model.settings.view.SubmenuSetting; import org.dolphinemu.dolphinemu.ui.settings.viewholder.CheckBoxSettingViewHolder; import org.dolphinemu.dolphinemu.ui.settings.viewholder.HeaderViewHolder; @@ -71,6 +72,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde view = inflater.inflate(R.layout.list_item_setting_checkbox, parent, false); return new CheckBoxSettingViewHolder(view, this); + case SettingsItem.TYPE_STRING_SINGLE_CHOICE: case SettingsItem.TYPE_SINGLE_CHOICE: view = inflater.inflate(R.layout.list_item_setting, parent, false); return new SingleChoiceViewHolder(view, this); @@ -161,6 +163,18 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde mDialog = builder.show(); } + public void onStringSingleChoiceClick(StringSingleChoiceSetting item) + { + mClickedItem = item; + + AlertDialog.Builder builder = new AlertDialog.Builder(mView.getActivity()); + + builder.setTitle(item.getNameId()); + builder.setSingleChoiceItems(item.getChoicesId(), item.getSelectValueIndex(), this); + + mDialog = builder.show(); + } + public void onSliderClick(SliderSetting item) { mClickedItem = item; @@ -274,6 +288,18 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde closeDialog(); } + else if (mClickedItem instanceof StringSingleChoiceSetting) + { + StringSingleChoiceSetting scSetting = (StringSingleChoiceSetting) mClickedItem; + String value = scSetting.getValueAt(which); + StringSetting setting = scSetting.setSelectedValue(value); + if (setting != null) + { + mView.putSetting(setting); + } + + closeDialog(); + } else if (mClickedItem instanceof SliderSetting) { SliderSetting sliderSetting = (SliderSetting) mClickedItem; diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentPresenter.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentPresenter.java index d90d29920d..f6733e7a09 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentPresenter.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentPresenter.java @@ -17,10 +17,14 @@ import org.dolphinemu.dolphinemu.model.settings.view.InputBindingSetting; import org.dolphinemu.dolphinemu.model.settings.view.SettingsItem; import org.dolphinemu.dolphinemu.model.settings.view.SingleChoiceSetting; import org.dolphinemu.dolphinemu.model.settings.view.SliderSetting; +import org.dolphinemu.dolphinemu.model.settings.view.StringSingleChoiceSetting; import org.dolphinemu.dolphinemu.model.settings.view.SubmenuSetting; +import org.dolphinemu.dolphinemu.services.DirectoryInitializationService; import org.dolphinemu.dolphinemu.utils.EGLHelper; +import org.dolphinemu.dolphinemu.utils.Log; import org.dolphinemu.dolphinemu.utils.SettingsFile; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; @@ -330,6 +334,7 @@ public final class SettingsFragmentPresenter Setting resolution = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_SETTINGS).getSetting(SettingsFile.KEY_INTERNAL_RES); Setting fsaa = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_SETTINGS).getSetting(SettingsFile.KEY_FSAA); Setting anisotropic = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_ENHANCEMENTS).getSetting(SettingsFile.KEY_ANISOTROPY); + Setting shader = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_ENHANCEMENTS).getSetting(SettingsFile.KEY_POST_SHADER); Setting efbScaledCopy = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_HACKS).getSetting(SettingsFile.KEY_SCALED_EFB); Setting perPixel = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_SETTINGS).getSetting(SettingsFile.KEY_PER_PIXEL); Setting forceFilter = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_ENHANCEMENTS).getSetting(SettingsFile.KEY_FORCE_FILTERING); @@ -341,9 +346,14 @@ public final class SettingsFragmentPresenter sl.add(new SingleChoiceSetting(SettingsFile.KEY_FSAA, SettingsFile.SECTION_GFX_SETTINGS, SettingsFile.SETTINGS_GFX, R.string.FSAA, R.string.FSAA_description, R.array.FSAAEntries, R.array.FSAAValues, 0, fsaa)); sl.add(new SingleChoiceSetting(SettingsFile.KEY_ANISOTROPY, SettingsFile.SECTION_GFX_ENHANCEMENTS, SettingsFile.SETTINGS_GFX, R.string.anisotropic_filtering, R.string.anisotropic_filtering_description, R.array.anisotropicFilteringEntries, R.array.anisotropicFilteringValues, 0, anisotropic)); - // TODO -// Setting shader = mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_GFX_ENHANCEMENTS).getSetting(SettingsFile.KEY_POST_SHADER) -// sl.add(new SingleChoiceSetting(.getKey(), , R.string., R.string._description, R.array., R.array.)); + IntSetting stereoModeValue = (IntSetting) mSettings.get(SettingsFile.SETTINGS_GFX).get(SettingsFile.SECTION_STEREOSCOPY).getSetting(SettingsFile.KEY_STEREO_MODE); + int anaglyphMode = 3; + String subDir = stereoModeValue != null && stereoModeValue.getValue() == anaglyphMode ? "Anaglyph" : null; + String[] shaderListEntries = getShaderList(subDir); + String[] shaderListValues = new String[shaderListEntries.length]; + System.arraycopy(shaderListEntries, 0, shaderListValues, 0, shaderListEntries.length); + shaderListValues[0] = ""; + sl.add(new StringSingleChoiceSetting(SettingsFile.KEY_POST_SHADER, SettingsFile.SECTION_GFX_ENHANCEMENTS, SettingsFile.SETTINGS_GFX, R.string.post_processing_shader, R.string.post_processing_shader_description, shaderListEntries, shaderListValues, "", shader)); sl.add(new CheckBoxSetting(SettingsFile.KEY_SCALED_EFB, SettingsFile.SECTION_GFX_HACKS, SettingsFile.SETTINGS_GFX, R.string.scaled_efb_copy, R.string.scaled_efb_copy_description, true, efbScaledCopy)); sl.add(new CheckBoxSetting(SettingsFile.KEY_PER_PIXEL, SettingsFile.SECTION_GFX_SETTINGS, SettingsFile.SETTINGS_GFX, R.string.per_pixel_lighting, R.string.per_pixel_lighting_description, false, perPixel)); @@ -366,6 +376,44 @@ public final class SettingsFragmentPresenter } } + private String[] getShaderList(String subDir) + { + try + { + String shadersPath = DirectoryInitializationService.getDolphinInternalDirectory() + "/Shaders"; + if(!TextUtils.isEmpty(subDir)) { + shadersPath += "/" + subDir; + } + + File file = new File(shadersPath); + File[] shaderFiles = file.listFiles(); + if (shaderFiles != null) + { + String[] result = new String[shaderFiles.length + 1]; + result[0] = "Off"; + for (int i = 0; i < shaderFiles.length; i++) + { + String name = shaderFiles[i].getName(); + int extensionIndex = name.indexOf(".glsl"); + if (extensionIndex > 0) + { + name = name.substring(0, extensionIndex); + } + result[i+1] = name; + } + + return result; + } + } + catch (Exception ex) + { + Log.debug("[Settings] Unable to find shader files"); + // return empty list + } + + return new String[]{}; + } + private void addHackSettings(ArrayList<SettingsItem> sl) { boolean skipEFBValue = getInvertedBooleanValue(SettingsFile.SETTINGS_GFX, SettingsFile.SECTION_GFX_HACKS, SettingsFile.KEY_SKIP_EFB, false); diff --git a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/viewholder/SingleChoiceViewHolder.java b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/viewholder/SingleChoiceViewHolder.java index add1b76637..c44d64b79b 100644 --- a/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/viewholder/SingleChoiceViewHolder.java +++ b/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/viewholder/SingleChoiceViewHolder.java @@ -6,11 +6,12 @@ import android.widget.TextView; import org.dolphinemu.dolphinemu.R; import org.dolphinemu.dolphinemu.model.settings.view.SettingsItem; import org.dolphinemu.dolphinemu.model.settings.view.SingleChoiceSetting; +import org.dolphinemu.dolphinemu.model.settings.view.StringSingleChoiceSetting; import org.dolphinemu.dolphinemu.ui.settings.SettingsAdapter; public final class SingleChoiceViewHolder extends SettingViewHolder { - private SingleChoiceSetting mItem; + private SettingsItem mItem; private TextView mTextSettingName; private TextView mTextSettingDescription; @@ -30,7 +31,7 @@ public final class SingleChoiceViewHolder extends SettingViewHolder @Override public void bind(SettingsItem item) { - mItem = (SingleChoiceSetting) item; + mItem = item; mTextSettingName.setText(item.getNameId()); @@ -43,6 +44,13 @@ public final class SingleChoiceViewHolder extends SettingViewHolder @Override public void onClick(View clicked) { - getAdapter().onSingleChoiceClick(mItem); + if (mItem instanceof SingleChoiceSetting) + { + getAdapter().onSingleChoiceClick((SingleChoiceSetting) mItem); + } + else if (mItem instanceof StringSingleChoiceSetting) + { + getAdapter().onStringSingleChoiceClick((StringSingleChoiceSetting) mItem); + } } } |
