From 00ff0ced07f0ee535fdd042cbcb8a94907a879df Mon Sep 17 00:00:00 2001 From: mittorn Date: Sun, 24 Sep 2017 06:26:51 +0700 Subject: [PATCH] Implement screen resolution changing --- res/layout/activity_launcher.xml | 49 +++++++++++++++++++ res/values/strings.xml | 4 ++ src/in/celest/xash3d/LauncherActivity.java | 27 ++++++++++- src/in/celest/xash3d/XashActivity.java | 55 +++++++++++++++++++--- 4 files changed, 127 insertions(+), 8 deletions(-) diff --git a/res/layout/activity_launcher.xml b/res/layout/activity_launcher.xml index b83b2760..0ee8c977 100644 --- a/res/layout/activity_launcher.xml +++ b/res/layout/activity_launcher.xml @@ -263,6 +263,55 @@ android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:text="@string/immersive_mode" /> + + + + + + + + + + + Due to writing politics of newer Android versions, you can\'t use this storage. Due to writing politics of Android 4.4, you can\'t use this storage. Seems you have read-only filesystem. + Fixed screen resolution (experimental) + Scale screen keeping aspect ratio + Specify custom screen width and height + diff --git a/src/in/celest/xash3d/LauncherActivity.java b/src/in/celest/xash3d/LauncherActivity.java index 547120ba..f8bf3164 100644 --- a/src/in/celest/xash3d/LauncherActivity.java +++ b/src/in/celest/xash3d/LauncherActivity.java @@ -16,6 +16,7 @@ import in.celest.xash3d.hl.*; import java.io.*; import java.net.*; import org.json.*; +import android.preference.*; public class LauncherActivity extends Activity { // public final static String ARGV = "in.celest.xash3d.MESSAGE"; @@ -31,7 +32,9 @@ public class LauncherActivity extends Activity { static SharedPreferences mPref; static Spinner pixelSpinner; static TextView tvResPath; - + static EditText resScale, resWidth, resHeight; + static RadioButton radioScale, radioCustom; + static CheckBox resolution; String getDefaultPath() { File dir = Environment.getExternalStorageDirectory(); @@ -126,6 +129,12 @@ public class LauncherActivity extends Activity { resizeWorkaround = (ToggleButton) findViewById( R.id.enableResizeWorkaround ); tvResPath = (TextView) findViewById( R.id.textView_path ); immersiveMode = (CheckBox) findViewById( R.id.immersive_mode ); + resolution = (CheckBox) findViewById(R.id.resolution); + resWidth = (EditText) findViewById(R.id.resolution_width); + resHeight = (EditText) findViewById(R.id.resolution_height); + resScale = (EditText) findViewById(R.id.resolution_scale); + radioCustom = (RadioButton) findViewById(R.id.resolution_custom_r); + radioScale = (RadioButton) findViewById(R.id.resolution_scale_r); final String[] list = { "32 bit (RGBA8888)", @@ -170,7 +179,13 @@ public class LauncherActivity extends Activity { cmdArgs.setText(mPref.getString("argv","-dev 3 -log")); pixelSpinner.setSelection(mPref.getInt("pixelformat", 0)); resizeWorkaround.setChecked(mPref.getBoolean("enableResizeWorkaround", true)); - + resolution.setChecked(mPref.getBoolean("resolution_fixed", false )); + resWidth.setText(String.valueOf(mPref.getInt("resolution_width",854))); + resHeight.setText(String.valueOf(mPref.getInt("resolution_height",480))); + resScale.setText(String.valueOf(mPref.getFloat("resolution_scale",2.0f))); + if( mPref.getBoolean("resolution_custom", false) ) + radioCustom.setChecked(true); + else radioScale.setChecked(true); if( sdk >= 19 ) { immersiveMode.setChecked(mPref.getBoolean("immersive_mode", true)); @@ -216,6 +231,14 @@ public class LauncherActivity extends Activity { editor.putInt("pixelformat", pixelSpinner.getSelectedItemPosition()); editor.putBoolean("enableResizeWorkaround",resizeWorkaround.isChecked()); editor.putBoolean("check_updates", checkUpdates.isChecked()); + editor.putBoolean("resolution_fixed", resolution.isChecked()); + editor.putBoolean("resolution_custom", radioCustom.isChecked()); + editor.putFloat("resolution_scale", Float.valueOf(resScale.getText().toString())); + editor.putInt("resolution_width", Integer.valueOf(resWidth.getText().toString())); + editor.putInt("resolution_height", Integer.valueOf(resHeight.getText().toString())); + + + if( sdk >= 19 ) editor.putBoolean("immersive_mode", immersiveMode.isChecked()); else diff --git a/src/in/celest/xash3d/XashActivity.java b/src/in/celest/xash3d/XashActivity.java index 5a8140b1..fae70378 100644 --- a/src/in/celest/xash3d/XashActivity.java +++ b/src/in/celest/xash3d/XashActivity.java @@ -58,6 +58,8 @@ public class XashActivity extends Activity { public static Vibrator mVibrator; public static boolean fMouseShown = true; public static boolean fGDBSafe = false; + public static float mScale = 0, mTouchScaleX = 1, mTouchScaleY = 1; + public static int mForceHeight = 0, mForceWidth = 0; private static boolean mHasVibrator; private int mReturingWithResultCode = 0; @@ -426,6 +428,21 @@ public class XashActivity extends Activity { mVibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); + if( mPref.getBoolean("resolution_fixed", false) ) + { + if( mPref.getBoolean("resolution_custom", false) ) + { + mForceWidth = mPref.getInt( "resolution_width", 854 ); + mForceHeight = mPref.getInt( "resolution_height", 480 ); + if( mForceWidth < 10 || mForceHeight < 10 ) + mForceWidth = mForceHeight = 0; + } + else + mScale = mPref.getFloat( "resolution_scale", 1 ); + if( mScale < 0.5 ) + mScale = 0; + } + mHasVibrator = ( mVibrator != null ); if( sdk >= 11 ) mHasVibrator = ( mVibrator != null ) && ( handler.hasVibrator() ); @@ -790,6 +807,7 @@ public class XashActivity extends Activity { { // Transfer the task to the main thread as a Runnable mSingleton.runOnUiThread(new ShowTextInputTask(show)); + //if( show == 1 )mSurface.getHolder().setSizeFromLayout(); } public static void setIcon(String path) @@ -883,6 +901,7 @@ class EngineSurface extends SurfaceView implements SurfaceHolder.Callback, View. private EGLDisplay mEGLDisplay; private EGL10 mEGL; private EGLConfig mEGLConfig; + private boolean resizing = false; public static final String TAG = "XASH3D-EngineSurface"; // Sensors @@ -911,6 +930,8 @@ class EngineSurface extends SurfaceView implements SurfaceHolder.Callback, View. return; XashActivity.nativeSetPause(0); XashActivity.mEnginePaused = false; + //holder.setFixedSize(640,480); + //SurfaceHolder.setFixedSize(640,480); } // Called when we lose the surface @@ -926,14 +947,36 @@ class EngineSurface extends SurfaceView implements SurfaceHolder.Callback, View. public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { Log.v(TAG, "surfaceChanged()"); + if( ( XashActivity.mForceHeight!= 0 && XashActivity.mForceWidth!= 0 || XashActivity.mScale!= 0 ) && !resizing ) + { + int newWidth, newHeight; + resizing = true; + if( XashActivity.mForceHeight != 0 && XashActivity.mForceWidth != 0 ) + { + newWidth = XashActivity.mForceWidth; + newHeight = XashActivity.mForceHeight; + } + else + { + newWidth = (int)(getWidth() / XashActivity.mScale); + newHeight = (int)(getHeight() / XashActivity.mScale); + } + holder.setFixedSize( newWidth, newHeight ); + XashActivity.mTouchScaleX = (float)newWidth / getWidth(); + XashActivity.mTouchScaleY = (float)newHeight / getHeight(); + + return; + } XashActivity.onNativeResize(width, height); + //holder.setFixedSize(width/2,height/2); // Now start up the C app thread if (mEngThread == null) { mEngThread = new Thread(new XashMain(), "EngineThread"); mEngThread.start(); } + resizing = false; } public void engineThreadJoin() @@ -1284,8 +1327,8 @@ class EngineTouchListener_v5 implements View.OnTouchListener{ } for (i = 0; i < pointerCount; i++) { pointerFingerId = event.getPointerId(i); - x = event.getX(i); - y = event.getY(i); + x = event.getX(i)*XashActivity.mTouchScaleX; + y = event.getY(i)*XashActivity.mTouchScaleY; XashActivity.nativeTouch(pointerFingerId, 2, x, y); } break; @@ -1324,8 +1367,8 @@ class EngineTouchListener_v5 implements View.OnTouchListener{ pointerFingerId = event.getPointerId(i); - x = event.getX(i); - y = event.getY(i); + x = event.getX(i)*XashActivity.mTouchScaleX; + y = event.getY(i)*XashActivity.mTouchScaleY; if( action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_POINTER_UP ) XashActivity.nativeTouch(pointerFingerId,1, x, y); if( action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_POINTER_DOWN ) @@ -1335,8 +1378,8 @@ class EngineTouchListener_v5 implements View.OnTouchListener{ case MotionEvent.ACTION_CANCEL: for (i = 0; i < pointerCount; i++) { pointerFingerId = event.getPointerId(i); - x = event.getX(i); - y = event.getY(i); + x = event.getX(i)*XashActivity.mTouchScaleX; + y = event.getY(i)*XashActivity.mTouchScaleY; XashActivity.nativeTouch(pointerFingerId, 1, x, y); } break;