From dcba33d26e5add77d703b1a1e8e77a91d6d6e27e Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Mon, 29 Jul 2019 15:09:22 +0530 Subject: [PATCH] implemented initial effects --- .../otaliastudios/cameraview/CameraView.java | 71 +++++++++++-------- .../cameraview/internal/egl/EglViewport.java | 41 ++++++++--- .../cameraview/preview/GlCameraPreview.java | 6 +- .../shadereffects/ShaderEffectFactory.java | 52 ++++++++++++++ .../shadereffects/effects/NoEffect.java | 13 ++++ .../effects/SharpnessEffect.java | 23 +++--- .../effects/TemperatureEffect.java | 11 +-- .../shadereffects/effects/TintEffect.java | 11 ++- .../shadereffects/effects/VignetteEffect.java | 20 ++++-- 9 files changed, 184 insertions(+), 64 deletions(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index c5f01edb..9089cbea 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -4,12 +4,6 @@ import android.Manifest; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Activity; - -import androidx.annotation.VisibleForTesting; -import androidx.lifecycle.Lifecycle; -import androidx.lifecycle.LifecycleObserver; -import androidx.lifecycle.LifecycleOwner; -import androidx.lifecycle.OnLifecycleEvent; import android.content.Context; import android.content.ContextWrapper; import android.content.pm.PackageInfo; @@ -23,9 +17,6 @@ import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Handler; import android.os.Looper; -import androidx.annotation.ColorInt; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; @@ -33,27 +24,35 @@ import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.OnLifecycleEvent; + import com.otaliastudios.cameraview.controls.Audio; import com.otaliastudios.cameraview.controls.Control; import com.otaliastudios.cameraview.controls.ControlParser; import com.otaliastudios.cameraview.controls.Engine; import com.otaliastudios.cameraview.controls.Facing; import com.otaliastudios.cameraview.controls.Flash; -import com.otaliastudios.cameraview.engine.Camera2Engine; -import com.otaliastudios.cameraview.engine.offset.Reference; -import com.otaliastudios.cameraview.markers.MarkerLayout; -import com.otaliastudios.cameraview.engine.Camera1Engine; -import com.otaliastudios.cameraview.engine.CameraEngine; -import com.otaliastudios.cameraview.frame.Frame; -import com.otaliastudios.cameraview.frame.FrameProcessor; -import com.otaliastudios.cameraview.gesture.Gesture; -import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.controls.Hdr; import com.otaliastudios.cameraview.controls.Mode; import com.otaliastudios.cameraview.controls.Preview; import com.otaliastudios.cameraview.controls.VideoCodec; import com.otaliastudios.cameraview.controls.WhiteBalance; +import com.otaliastudios.cameraview.engine.Camera1Engine; +import com.otaliastudios.cameraview.engine.Camera2Engine; +import com.otaliastudios.cameraview.engine.CameraEngine; +import com.otaliastudios.cameraview.engine.offset.Reference; +import com.otaliastudios.cameraview.frame.Frame; +import com.otaliastudios.cameraview.frame.FrameProcessor; +import com.otaliastudios.cameraview.gesture.Gesture; +import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.gesture.GestureFinder; import com.otaliastudios.cameraview.gesture.GestureParser; import com.otaliastudios.cameraview.gesture.PinchGestureFinder; @@ -63,6 +62,9 @@ import com.otaliastudios.cameraview.internal.GridLinesLayout; import com.otaliastudios.cameraview.internal.utils.CropHelper; import com.otaliastudios.cameraview.internal.utils.OrientationHelper; import com.otaliastudios.cameraview.internal.utils.WorkerHandler; +import com.otaliastudios.cameraview.markers.AutoFocusMarker; +import com.otaliastudios.cameraview.markers.AutoFocusTrigger; +import com.otaliastudios.cameraview.markers.MarkerLayout; import com.otaliastudios.cameraview.markers.MarkerParser; import com.otaliastudios.cameraview.overlay.OverlayLayout; import com.otaliastudios.cameraview.preview.CameraPreview; @@ -70,14 +72,15 @@ import com.otaliastudios.cameraview.preview.GlCameraPreview; import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; -import com.otaliastudios.cameraview.shadereffects.effects.BlackAndWhiteEffect; +import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; +import com.otaliastudios.cameraview.shadereffects.effects.SharpnessEffect; +import com.otaliastudios.cameraview.shadereffects.effects.TemperatureEffect; +import com.otaliastudios.cameraview.shadereffects.effects.TintEffect; import com.otaliastudios.cameraview.size.AspectRatio; import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.SizeSelector; import com.otaliastudios.cameraview.size.SizeSelectorParser; import com.otaliastudios.cameraview.size.SizeSelectors; -import com.otaliastudios.cameraview.markers.AutoFocusMarker; -import com.otaliastudios.cameraview.markers.AutoFocusTrigger; import java.io.File; import java.util.ArrayList; @@ -88,7 +91,6 @@ import java.util.concurrent.CopyOnWriteArrayList; import static android.view.View.MeasureSpec.AT_MOST; import static android.view.View.MeasureSpec.EXACTLY; import static android.view.View.MeasureSpec.UNSPECIFIED; - import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; /** @@ -580,8 +582,8 @@ public class CameraView extends FrameLayout implements LifecycleObserver { if( MotionEvent.ACTION_UP == event.getAction()) { Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); - BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(effect); + //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); + changeEffect(ShaderEffectFactory.ShaderEffects.SHARPNESS_EFFECT); } return true; @@ -2144,7 +2146,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { //region Effects - public GLSurfaceView getCurrentPreviewingGlSurfaceView(){ + public GLSurfaceView getCurrentPreviewingGlSurfaceView() { if (mCameraPreview instanceof GlCameraPreview) { return ((GlCameraPreview) mCameraPreview).getView(); } @@ -2153,12 +2155,23 @@ public class CameraView extends FrameLayout implements LifecycleObserver { return null; } - public void changeEffect(BaseShaderEffect shader) { + public void changeEffect(ShaderEffectFactory.ShaderEffects effect) { if (mCameraPreview instanceof GlCameraPreview) { - String effect = shader.getFragmentShader(); - ((GlCameraPreview) mCameraPreview).setEffectFragmentShader(effect); + GLSurfaceView previewingSurfaceView = getCurrentPreviewingGlSurfaceView(); + if (previewingSurfaceView != null) { + BaseShaderEffect shaderEffect = ShaderEffectFactory.getShaderFromFactory(effect, previewingSurfaceView); + + ((SharpnessEffect)shaderEffect).setSharpnessValue(1.0f); + ((GlCameraPreview) mCameraPreview).setShaderEffect(shaderEffect); + } + } else { + LOG.w("changeEffect", "changeEffect is supported only for GLSurfaceView"); + } + } - //doInstantiatePreview(); + public void changeEffect(BaseShaderEffect shaderEffect) { + if (mCameraPreview instanceof GlCameraPreview) { + ((GlCameraPreview) mCameraPreview).setShaderEffect(shaderEffect); } else { LOG.w("changeEffect", "changeEffect is supported only for GLSurfaceView"); } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java index 1859fb2e..3be83b2a 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java @@ -5,6 +5,8 @@ import android.opengl.GLES11Ext; import android.opengl.GLES20; import com.otaliastudios.cameraview.CameraLogger; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; import java.nio.FloatBuffer; @@ -74,19 +76,38 @@ public class EglViewport extends EglElement { // private int muTexOffsetLoc; // Used for filtering // private int muColorAdjustLoc; // Used for filtering - private String vertexShader = SIMPLE_VERTEX_SHADER; - private String fragmentShader = SIMPLE_FRAGMENT_SHADER; + private String mVertexShader = SIMPLE_VERTEX_SHADER; + private String mFragmentShader = SIMPLE_FRAGMENT_SHADER; - private boolean isShaderChanged = false; + private BaseShaderEffect mShaderEffect; + + private boolean mIsShaderChanged = false; public EglViewport() { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + mShaderEffect = new NoEffect(); initProgram(); } private void initProgram(){ - mProgramHandle = createProgram(vertexShader, fragmentShader); + release(); + + mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; + + mProgramHandle = createProgram(mShaderEffect.getVertextShader(), mShaderEffect.getFragmentShader()); + + maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getPositionVariableName()); + checkLocation(maPositionLocation, mShaderEffect.getPositionVariableName()); + maTextureCoordLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getTexttureCoordinateVariableName()); + checkLocation(maTextureCoordLocation, mShaderEffect.getTexttureCoordinateVariableName()); + muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getMVPMatrixVariableName()); + checkLocation(muMVPMatrixLocation, mShaderEffect.getMVPMatrixVariableName()); + muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, mShaderEffect.getTextureMatrixVariableName()); + checkLocation(muTexMatrixLocation, mShaderEffect.getTextureMatrixVariableName()); + + + /*mProgramHandle = createProgram(mVertexShader, mFragmentShader); maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, "aPosition"); checkLocation(maPositionLocation, "aPosition"); @@ -95,7 +116,7 @@ public class EglViewport extends EglElement { muMVPMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uMVPMatrix"); checkLocation(muMVPMatrixLocation, "uMVPMatrix"); muTexMatrixLocation = GLES20.glGetUniformLocation(mProgramHandle, "uTexMatrix"); - checkLocation(muTexMatrixLocation, "uTexMatrix"); + checkLocation(muTexMatrixLocation, "uTexMatrix");*/ // Stuff from Drawable2d.FULL_RECTANGLE } @@ -127,9 +148,9 @@ public class EglViewport extends EglElement { return texId; } - public void changeEffectFragmentShader(String fragmentShader){ - this.fragmentShader = fragmentShader; - isShaderChanged = true; + public void changeShaderEffect(BaseShaderEffect shaderEffect){ + this.mShaderEffect = shaderEffect; + mIsShaderChanged = true; } @@ -157,9 +178,9 @@ public class EglViewport extends EglElement { FloatBuffer vertexBuffer, FloatBuffer texBuffer) { - if (isShaderChanged){ + if (mIsShaderChanged){ initProgram(); - isShaderChanged = false; + mIsShaderChanged = false; } check("draw start"); diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java index b2ec5c5a..12ba0c79 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -7,7 +7,6 @@ import android.opengl.Matrix; import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; -import android.util.Log; import android.view.LayoutInflater; import android.view.SurfaceHolder; import android.view.View; @@ -16,6 +15,7 @@ import android.view.ViewGroup; import com.otaliastudios.cameraview.R; import com.otaliastudios.cameraview.internal.egl.EglViewport; import com.otaliastudios.cameraview.internal.utils.Op; +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.size.AspectRatio; import java.util.Collections; @@ -310,7 +310,7 @@ public class GlCameraPreview extends CameraPreview 1.0f) - scale = 1.0f; + public void setSharpnessValue(float value){ + if (value < 0.0f) + value = 0.0f; + if (value > 1.0f) + value = 1.0f; - this.scale = scale; + this.scale = value; } /** diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java index 15621adc..b6534270 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TemperatureEffect.java @@ -10,17 +10,20 @@ public class TemperatureEffect extends BaseShaderEffect { /** * Initialize Effect - * + */ + public TemperatureEffect() { + } + + /** * @param scale Float, between 0 and 1, with 0 indicating cool, and 1 - * indicating warm. A value of of 0.5 indicates no change. + * indicating warm. A value of of 0.5 indicates no change. */ - public TemperatureEffect(float scale) { + public void setTemperatureScale(float scale){ if (scale < 0.0f) scale = 0.0f; if (scale > 1.0f) scale = 1.0f; this.scale = scale; - } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java index 7ad49570..900df065 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/TintEffect.java @@ -9,17 +9,16 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; * Tints the preview with specified color.. */ public class TintEffect extends BaseShaderEffect { - private int mTint = 0xFF0000FF; + private int mTint = 0xFFFF0000; /** * Initialize Effect - * - * @param color Integer, representing an ARGB color with 8 bits per channel. - * May be created using Color class. */ - public TintEffect(int color) { - this.mTint = color; + public TintEffect() { + } + public void setTintColor(int color){ + this.mTint = color; } @Override diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java index ff92582d..d7870108 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/VignetteEffect.java @@ -11,21 +11,33 @@ import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; public class VignetteEffect extends BaseShaderEffect { private int mWidth = 0; private int mHeight = 0; - private float mScale = 0f; - private final float mShade = 0.85f; + private float mScale = 0.85f; + private float mShade = 0.5f; /** * Initialize Effect * - * @param scale Float, between 0 and 1. 0 means no change. + * @param glSurfaceView GLSurfaceView */ - public VignetteEffect(float scale) { + public VignetteEffect(GLSurfaceView glSurfaceView) { + this.mGlSurfaceView = glSurfaceView; + + } + + public void setVignetteEffectScale(float scale){ if (scale < 0.0f) scale = 0.0f; if (scale > 1.0f) scale = 1.0f; this.mScale = scale; + } + public void setVignetteEffectShade(float shade){ + if (shade < 0.0f) + shade = 0.0f; + if (shade > 1.0f) + shade = 1.0f; + this.mShade = shade; } /**