diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2014-12-28 15:15:27 -0600 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2014-12-28 15:15:27 -0600 |
| commit | 83d9942ca3a4b076cfee761045865359c09515dc (patch) | |
| tree | 58bf5e368c8e3231b89ddbdeb28a98caf24d706f /Source | |
| parent | 15f074dd21af20426d94a4174ac87aae4cafb8f1 (diff) | |
| parent | 859e103ce6d65c0a08ed1912b2fbe3248d193543 (diff) | |
Merge pull request #1761 from Sonicadvance1/Android_stereoscopy
Adds stereoscopy configuration support to Android.
Diffstat (limited to 'Source')
8 files changed, 226 insertions, 1 deletions
diff --git a/Source/Android/res/layout/slider_layout.xml b/Source/Android/res/layout/slider_layout.xml new file mode 100644 index 0000000000..1448bf44ad --- /dev/null +++ b/Source/Android/res/layout/slider_layout.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:weightSum="1" + android:gravity="center_horizontal"> + + <SeekBar + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:id="@+id/seekBar" + /> + + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:text="New Text" + android:id="@+id/textView" + android:textStyle="bold"/> + +</LinearLayout>
\ No newline at end of file diff --git a/Source/Android/res/values/arrays.xml b/Source/Android/res/values/arrays.xml index 8e9ba5ede3..0c0a60d8d8 100644 --- a/Source/Android/res/values/arrays.xml +++ b/Source/Android/res/values/arrays.xml @@ -155,5 +155,18 @@ <item>3</item> <item>4</item> </string-array> - + + <!-- Stereoscopy Preference --> + <string-array name="stereoscopyEntries" translatable="false"> + <item>Off</item> + <item>Side-by-Side</item> + <item>Top-and-Bottom</item> + <item>Anaglyph</item> + </string-array> + <string-array name="stereoscopyValues" translatable="false"> + <item>0</item> + <item>1</item> + <item>2</item> + <item>3</item> + </string-array> </resources> diff --git a/Source/Android/res/values/strings.xml b/Source/Android/res/values/strings.xml index 6c68328e8b..80e1b3f909 100644 --- a/Source/Android/res/values/strings.xml +++ b/Source/Android/res/values/strings.xml @@ -174,6 +174,16 @@ <string name="force_texture_filtering_descrip">Force texture filtering even if the emulated game explicitly disabled it. Improves texture quality slightly but causes glitches in some games.</string> <string name="disable_fog">Disable Fog</string> <string name="disable_fog_descrip">Makes distant objects more visible by removing fog, thus increasing the overall detail. Disabling fog will break some games which rely on proper fog emulation.</string> + <string name="stereoscopy">Stereoscopy</string> + <string name="stereoscopy_descrip">Stereoscopy allows you to get a better feeling of depth if you have the necessary hardware.\nHeavily decreases emulation speed and sometimes causes issues</string> + <string name="stereoscopy_mode">Stereoscopy Mode</string> + <string name="stereoscopy_mode_descrip">Select the stereoscopic 3D mode.</string> + <string name="sterescopy_depth">Depthn</string> + <string name="sterescopy_depth_descrip">Control the distance between the virtual cameras.\nA higher value creates a stronger feeling of depth while a lower value is more comfortable.</string> + <string name="convergence">Convergence</string> + <string name="convergence_descrip">Control the distance of the convergence plane, this is the distance at which objects will appear to be in front of the screen.\nA higher value creates stronger out-of-screen effects while a lower value is more comfortable.</string> + <string name="swap_eyes">Swap Eyes</string> + <string name="swap_eyes_descrip">Swap the left and right eye, mostly useful if you want to view side-by-side cross-eyed.</string> <string name="hacks">Hacks</string> <string name="embedded_frame_buffer">Embedded Frame Buffer</string> diff --git a/Source/Android/res/xml/video_prefs.xml b/Source/Android/res/xml/video_prefs.xml index b52dc7dcf6..9ace18dd4e 100644 --- a/Source/Android/res/xml/video_prefs.xml +++ b/Source/Android/res/xml/video_prefs.xml @@ -57,6 +57,38 @@ android:summary="@string/disable_fog_descrip" android:title="@string/disable_fog"/> + <PreferenceScreen + android:title="@string/stereoscopy" + android:key="StereoscopyScreen" + android:summary="@string/stereoscopy_descrip"> + + <ListPreference + android:entries="@array/stereoscopyEntries" + android:entryValues="@array/stereoscopyValues" + android:key="stereoscopyMode" + android:summary="@string/stereoscopy_mode_descrip" + android:title="@string/stereoscopy_mode"/> + + <org.dolphinemu.dolphinemu.utils.SliderPreference + android:defaultValue="20" + android:key="stereoDepth" + android:max="100" + android:summary="@string/sterescopy_depth_descrip" + android:title="@string/sterescopy_depth" /> + + <org.dolphinemu.dolphinemu.utils.SliderPreference + android:defaultValue="20" + android:key="stereoConvergence" + android:max="500" + android:summary="@string/convergence_descrip" + android:title="@string/convergence" /> + + <CheckBoxPreference + android:defaultValue="false" + android:key="stereoSwapEyes" + android:summary="@string/swap_eyes_descrip" + android:title="@string/swap_eyes"/> + </PreferenceScreen> </PreferenceScreen> <!-- Video Hacks --> diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java index d2ae56b40f..710ebca7ee 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/UserPreferences.java @@ -57,6 +57,10 @@ public final class UserPreferences editor.putBoolean("disableFog", getConfig("gfx_opengl.ini", "Settings", "DisableFog", "False").equals("True")); editor.putBoolean("skipEFBAccess", getConfig("gfx_opengl.ini", "Hacks", "EFBAccessEnable", "False").equals("True")); editor.putBoolean("ignoreFormatChanges", getConfig("gfx_opengl.ini", "Hacks", "EFBEmulateFormatChanges", "False").equals("False")); + editor.putString("stereoscopyMode", getConfig("gfx_opengl.ini", "Enhancements", "StereoMode", "0")); + editor.putBoolean("stereoSwapEyes", getConfig("gfx_opengl.ini", "Enhancements", "StereoSwapEyes", "False").equals("True")); + editor.putString("stereoDepth", getConfig("gfx_opengl.ini", "Enhancements", "StereoDepth", "20")); + editor.putString("stereoConvergence", getConfig("gfx_opengl.ini", "Enhancements", "StereoConvergence", "20")); String efbCopyOn = getConfig("gfx_opengl.ini", "Hacks", "EFBCopyEnable", "True"); String efbToTexture = getConfig("gfx_opengl.ini", "Hacks", "EFBToTextureEnable", "True"); @@ -182,6 +186,17 @@ public final class UserPreferences // Whether or not fog is disabled. boolean fogIsDisabled = prefs.getBoolean("disableFog", false); + // Stereoscopy setting + String stereoscopyMode = prefs.getString("stereoscopyMode", "0"); + + // Stereoscopy swap eyes + boolean stereoscopyEyeSwap = prefs.getBoolean("stereoSwapEyes", false); + + // Stereoscopy separation + String stereoscopySeparation = prefs.getString("stereoDepth", "20"); + + // Stereoscopy convergence + String stereoscopyConvergence = prefs.getString("stereoConvergence", "20"); // CPU related Settings NativeLibrary.SetConfig("Dolphin.ini", "Core", "CPUCore", currentEmuCore); @@ -251,5 +266,9 @@ public final class UserPreferences NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "EnablePixelLighting", usingPerPixelLighting ? "True" : "False"); NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "ForceFiltering", isForcingTextureFiltering ? "True" : "False"); NativeLibrary.SetConfig("gfx_opengl.ini", "Settings", "DisableFog", fogIsDisabled ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoMode", stereoscopyMode); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoSwapEyes", stereoscopyEyeSwap ? "True" : "False"); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoDepth", stereoscopySeparation); + NativeLibrary.SetConfig("gfx_opengl.ini", "Enhancements", "StereoConvergence", stereoscopyConvergence); } } diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java b/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java index e5444e8c3b..214612f895 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/settings/video/VideoSettingsFragment.java @@ -121,6 +121,15 @@ public final class VideoSettingsFragment extends PreferenceFragment mainScreen.getPreference(0).setEnabled(true); mainScreen.getPreference(1).setEnabled(true); mainScreen.getPreference(3).setEnabled(true); + + // Check if we support stereo + // If we support desktop GL then we must support at least OpenGL 3.2 + // If we only support OpenGLES then we need both OpenGLES 3.1 and AEP + if ((eglHelper.supportsOpenGL() && eglHelper.GetVersion() >= 320) || + (eglHelper.supportsGLES3() && eglHelper.GetVersion() >= 310 && eglHelper.SupportsExtension("GL_ANDROID_extension_pack_es31a"))) + mainScreen.findPreference("StereoscopyScreen").setEnabled(true); + else + mainScreen.findPreference("StereoscopyScreen").setEnabled(false); } // Also set a listener, so that if someone changes the video backend, it will disable diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java b/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java index c908a7631f..4eef5f6a3d 100644 --- a/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java +++ b/Source/Android/src/org/dolphinemu/dolphinemu/utils/EGLHelper.java @@ -354,6 +354,29 @@ public final class EGLHelper return GLES30.glGetStringi(glEnum, index); } + public boolean SupportsExtension(String extension) + { + int[] num_ext = new int[1]; + GLES30.glGetIntegerv(GLES30.GL_NUM_EXTENSIONS, num_ext, 0); + + for (int i = 0; i < num_ext[0]; ++i) + { + String ext = GLES30.glGetStringi(GLES30.GL_EXTENSIONS, i); + if (ext.equals(extension)) + return true; + } + return false; + } + + public int GetVersion() + { + int[] major = new int[1]; + int[] minor = new int[1]; + GLES30.glGetIntegerv(GLES30.GL_MAJOR_VERSION, major, 0); + GLES30.glGetIntegerv(GLES30.GL_MINOR_VERSION, minor, 0); + return major[0] * 100 + minor[0] * 10; + } + /** * Simplified call to {@link GL10#glGetIntegerv(int, int[], int) * diff --git a/Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java b/Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java new file mode 100644 index 0000000000..b5b394ed83 --- /dev/null +++ b/Source/Android/src/org/dolphinemu/dolphinemu/utils/SliderPreference.java @@ -0,0 +1,97 @@ +package org.dolphinemu.dolphinemu.utils; + +import android.app.AlertDialog; +import android.content.Context; +import android.os.Bundle; +import android.preference.DialogPreference; +import android.util.AttributeSet; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import org.dolphinemu.dolphinemu.R; + +public class SliderPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener, View.OnClickListener +{ + private static final String androidns = "http://schemas.android.com/apk/res/android"; + + private Context m_context; + + // SeekBar + private int m_max, m_value; + private SeekBar m_seekbar; + + // TextView + private TextView m_textview; + + public SliderPreference(Context context, AttributeSet attrs) + { + super(context,attrs); + m_context = context; + + // Seekbar values + m_value = attrs.getAttributeIntValue(androidns, "defaultValue", 0); + m_max = attrs.getAttributeIntValue(androidns, "max", 100); + } + + @Override + protected View onCreateDialogView() + { + LayoutInflater inflater = LayoutInflater.from(m_context); + LinearLayout layout = (LinearLayout)inflater.inflate(R.layout.slider_layout, null, false); + + m_seekbar = (SeekBar)layout.getChildAt(0); + m_textview = (TextView)layout.getChildAt(1); + + if (shouldPersist()) + m_value = Integer.valueOf(getPersistedString(Integer.toString(m_value))); + + m_seekbar.setMax(m_max); + m_seekbar.setProgress(m_value); + setProgressText(m_value); + m_seekbar.setOnSeekBarChangeListener(this); + + return layout; + } + + // SeekBar overrides + @Override + public void onProgressChanged(SeekBar seek, int value, boolean fromTouch) + { + m_value = value; + setProgressText(value); + } + + @Override + public void onStartTrackingTouch(SeekBar seek) {} + @Override + public void onStopTrackingTouch(SeekBar seek) {} + + void setProgressText(int value) + { + m_textview.setText(String.valueOf(value)); + } + + @Override + public void showDialog(Bundle state) { + + super.showDialog(state); + + Button positiveButton = ((AlertDialog) getDialog()).getButton(AlertDialog.BUTTON_POSITIVE); + positiveButton.setOnClickListener(this); + } + + @Override + public void onClick(View v) { + if (shouldPersist()) + { + persistString(Integer.toString(m_seekbar.getProgress())); + callChangeListener(m_seekbar.getProgress()); + } + ((AlertDialog) getDialog()).dismiss(); + } +} |
