summaryrefslogtreecommitdiff
path: root/Source/Android/app/src/main/java/org
diff options
context:
space:
mode:
authormahdihijazi <mahdi.hijaz@hotmail.com>2018-01-28 01:51:42 +0100
committermahdihijazi <mahdi.hijaz@hotmail.com>2018-07-01 22:25:13 +0200
commitb924445e4894499a315769852fe5df7f747b739a (patch)
treea90875fccfc1187e6b6c1aa5a06929a87e58099d /Source/Android/app/src/main/java/org
parentb4bb213ffdca35d16491ef84348adfc38c76a001 (diff)
Android: Support Post Processing Shaders
Diffstat (limited to 'Source/Android/app/src/main/java/org')
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/SettingsItem.java1
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/model/settings/view/StringSingleChoiceSetting.java97
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/services/DirectoryInitializationService.java16
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsAdapter.java26
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/SettingsFragmentPresenter.java54
-rw-r--r--Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/ui/settings/viewholder/SingleChoiceViewHolder.java14
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);
+ }
}
}