From 396428f82d169bb0434ae7819d992b558bcf62ab Mon Sep 17 00:00:00 2001 From: Suneet Agrawal Date: Wed, 31 Jul 2019 12:18:37 +0530 Subject: [PATCH] updated all effects --- .../otaliastudios/cameraview/CameraView.java | 17 ----- .../cameraview/internal/egl/EglViewport.java | 6 +- .../cameraview/preview/GlCameraPreview.java | 4 +- .../shadereffects/BaseShaderEffect.java | 70 ++++++++++++++----- .../shadereffects/ShaderEffectFactory.java | 4 +- .../shadereffects/effects/CustomEffect.java | 26 +++++++ .../shadereffects/effects/NoEffect.java | 42 ----------- .../shadereffects/effects/NoFilterEffect.java | 11 +++ 8 files changed, 96 insertions(+), 84 deletions(-) create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java delete mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java create mode 100644 cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index 56605975..45a382be 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -9,7 +9,6 @@ import android.content.ContextWrapper; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.TypedArray; -import android.graphics.Color; import android.graphics.PointF; import android.graphics.Rect; import android.location.Location; @@ -74,15 +73,6 @@ import com.otaliastudios.cameraview.preview.SurfaceCameraPreview; import com.otaliastudios.cameraview.preview.TextureCameraPreview; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; import com.otaliastudios.cameraview.shadereffects.ShaderEffectFactory; -import com.otaliastudios.cameraview.shadereffects.effects.BrightnessEffect; -import com.otaliastudios.cameraview.shadereffects.effects.ContrastEffect; -import com.otaliastudios.cameraview.shadereffects.effects.DuotoneEffect; -import com.otaliastudios.cameraview.shadereffects.effects.GrainEffect; -import com.otaliastudios.cameraview.shadereffects.effects.HueEffect; -import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; -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; @@ -586,13 +576,6 @@ public class CameraView extends FrameLayout implements LifecycleObserver { onGesture(mTapGestureFinder, options); } - if( MotionEvent.ACTION_UP == event.getAction()) { - Log.d("Suneet Agrawal", "onTouchEvent " + event.getAction()); - - //BlackAndWhiteEffect effect = new BlackAndWhiteEffect(); - changeEffect(ShaderEffectFactory.ShaderEffects.SEPIA_EFFECT); - } - return true; } 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 8cd225a5..e0bee9d2 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 @@ -6,7 +6,7 @@ import android.opengl.GLES20; import com.otaliastudios.cameraview.CameraLogger; import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; -import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoFilterEffect; import java.nio.FloatBuffer; @@ -62,7 +62,7 @@ public class EglViewport extends EglElement { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; //init the default shader effect - mShaderEffect = new NoEffect(); + mShaderEffect = new NoFilterEffect(); initProgram(); } @@ -72,7 +72,7 @@ public class EglViewport extends EglElement { mTextureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES; - mProgramHandle = createProgram(mShaderEffect.getVertextShader(), mShaderEffect.getFragmentShader()); + mProgramHandle = createProgram(mShaderEffect.getVertexShader(), mShaderEffect.getFragmentShader()); maPositionLocation = GLES20.glGetAttribLocation(mProgramHandle, mShaderEffect.getPositionVariableName()); checkLocation(maPositionLocation, mShaderEffect.getPositionVariableName()); 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 77f1f061..35d36186 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java @@ -16,7 +16,7 @@ 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.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoFilterEffect; import com.otaliastudios.cameraview.size.AspectRatio; import java.util.Collections; @@ -167,7 +167,7 @@ public class GlCameraPreview extends CameraPreview + * This class has a default Vertex Shader implementation which in most cases not required to touch. + * In Effects like sepia, B/W any many, only pixel color changes which can be managed by only fragment shader. + * If there is some other effect which requires vertex shader also change, you can override it. + *

+ * If your provide your own vertex and fragment shader, + * please set the {@link #mPositionVariableName}, {@link #mTextureCoordinateVariableName}, + * {@link #mMVPMatrixVariableName}, {@link #mTextureMatrixVariableName} + * according to your shader code. + *

+ * Please note that these shader applies on live preview as well as pictureSnapshot and videoSnapshot, + * we only support GLES11Ext.GL_TEXTURE_EXTERNAL_OES + * check EglViewport() + *

+ * The default implementation of this class is NoEffect. */ public abstract class BaseShaderEffect { + /** + * Vertex shader code written in Shader Language (C) and stored as String. + * This wil be used by GL to apply any effect. + */ + + protected String mVertexShader = + "uniform mat4 uMVPMatrix;\n" + + "uniform mat4 uTexMatrix;\n" + + "attribute vec4 aPosition;\n" + + "attribute vec4 aTextureCoord;\n" + + "varying vec2 vTextureCoord;\n" + + "void main() {\n" + + " gl_Position = uMVPMatrix * aPosition;\n" + + " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + + "}\n"; + + + /** + * Fragment shader code written in Shader Language (C) and stored as String. + * This wil be used by GL to apply any effect. + */ + protected String mFragmentShader = + "#extension GL_OES_EGL_image_external : require\n" + + "precision mediump float;\n" + + "varying vec2 vTextureCoord;\n" + + "uniform samplerExternalOES sTexture;\n" + + "void main() {\n" + + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + + "}\n"; + + /** * Previewing GlSurfaceview. * This will be used by a few effects. @@ -18,10 +63,6 @@ public abstract class BaseShaderEffect { this.mGlSurfaceView = glSurfaceView; } - public String getPositionVariableName() { - return mPositionVariableName; - } - /** * Local variable name which were used in the shader code. * These will be used by openGL program to render these vertex and fragment shader @@ -31,6 +72,9 @@ public abstract class BaseShaderEffect { private String mMVPMatrixVariableName = "uMVPMatrix"; private String mTextureMatrixVariableName = "uTexMatrix"; + public String getPositionVariableName() { + return mPositionVariableName; + } public void setPositionVariableName(String positionVariableName) { this.mPositionVariableName = positionVariableName; @@ -64,19 +108,9 @@ public abstract class BaseShaderEffect { * Get vertex Shader code * * @return complete shader code in C - *

- * This is the default implementation, each effect can implement its own. */ - public String getVertextShader() { - return "uniform mat4 uMVPMatrix;\n" + - "uniform mat4 uTexMatrix;\n" + - "attribute vec4 aPosition;\n" + - "attribute vec4 aTextureCoord;\n" + - "varying vec2 vTextureCoord;\n" + - "void main() {\n" + - " gl_Position = uMVPMatrix * aPosition;\n" + - " vTextureCoord = (uTexMatrix * aTextureCoord).xy;\n" + - "}\n"; + public String getVertexShader() { + return mVertexShader; } diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java index c60b7a6c..da0ab453 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java @@ -15,7 +15,7 @@ import com.otaliastudios.cameraview.shadereffects.effects.GreyScaleEffect; import com.otaliastudios.cameraview.shadereffects.effects.HueEffect; import com.otaliastudios.cameraview.shadereffects.effects.InvertColorsEffect; import com.otaliastudios.cameraview.shadereffects.effects.LamoishEffect; -import com.otaliastudios.cameraview.shadereffects.effects.NoEffect; +import com.otaliastudios.cameraview.shadereffects.effects.NoFilterEffect; import com.otaliastudios.cameraview.shadereffects.effects.PosterizeEffect; import com.otaliastudios.cameraview.shadereffects.effects.SaturationEffect; import com.otaliastudios.cameraview.shadereffects.effects.SepiaEffect; @@ -137,7 +137,7 @@ public class ShaderEffectFactory { case NO_EFFECT: default: - shaderEffect = new NoEffect(); + shaderEffect = new NoFilterEffect(); } return shaderEffect; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java new file mode 100644 index 00000000..3bdb7139 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java @@ -0,0 +1,26 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; + + +/** + * This class is to implement any custom effect. + */ +public class CustomEffect extends BaseShaderEffect { + + /** + * Parameterized constructor with vertex and fragment shader as parameter + * + * @param vertexShader + * @param fragmentShader + */ + public CustomEffect(String vertexShader, String fragmentShader) { + this.mVertexShader = vertexShader; + this.mFragmentShader = fragmentShader; + } + + @Override + public String getFragmentShader() { + return mFragmentShader; + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java deleted file mode 100644 index 3a260a27..00000000 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.otaliastudios.cameraview.shadereffects.effects; - -import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; - -/** - * Displays the normal preview without any effect. - */ -public class NoEffect extends BaseShaderEffect { - /** - * Initialize - */ - public NoEffect() { - } - - @Override - public String getFragmentShader() { - - /*String shader = "#extension GL_OES_EGL_image_external : require\n" - + "precision mediump float;\n" - + "varying vec2 vTextureCoord;\n" - + "uniform samplerExternalOES sTexture;\n" - + "void main() {\n" - + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" - + "}\n";*/ - - //This fragment shader is copied from black and white, - //this is for testing purpose and need to be removed once testing is done. - String shader = "#extension GL_OES_EGL_image_external : require\n" - + "precision mediump float;\n" - + "varying vec2 vTextureCoord;\n" - + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" - + " vec4 color = texture2D(sTexture, vTextureCoord);\n" - + " float colorR = (color.r + color.g + color.b) / 3.0;\n" - + " float colorG = (color.r + color.g + color.b) / 3.0;\n" - + " float colorB = (color.r + color.g + color.b) / 3.0;\n" - + " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n" - + "}\n"; - - return shader; - - } -} \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java new file mode 100644 index 00000000..6474dd39 --- /dev/null +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.java @@ -0,0 +1,11 @@ +package com.otaliastudios.cameraview.shadereffects.effects; + +import com.otaliastudios.cameraview.shadereffects.BaseShaderEffect; + +public class NoFilterEffect extends BaseShaderEffect { + + @Override + public String getFragmentShader() { + return mFragmentShader; + } +}