updated all effects

pull/527/head
Suneet Agrawal 6 years ago
parent fc05682eeb
commit 13429bcd9d
  1. 17
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  2. 6
      cameraview/src/main/java/com/otaliastudios/cameraview/internal/egl/EglViewport.java
  3. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/preview/GlCameraPreview.java
  4. 70
      cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/BaseShaderEffect.java
  5. 4
      cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/ShaderEffectFactory.java
  6. 26
      cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/CustomEffect.java
  7. 42
      cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoEffect.java
  8. 11
      cameraview/src/main/java/com/otaliastudios/cameraview/shadereffects/effects/NoFilterEffect.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;
}

@ -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());

@ -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<GLSurfaceView, SurfaceTexture
});
//init the default shader effect
mCurrectShaderEffect = new NoEffect();
mCurrectShaderEffect = new NoFilterEffect();
}
@RendererThread

@ -3,11 +3,56 @@ package com.otaliastudios.cameraview.shadereffects;
import android.opengl.GLSurfaceView;
/**
* An interface that every effect must implement so that there is a common
* getFragmentShader method that every effect class is force to override
* A Base abstract class that every effect must extend so that there is a common getShader method.
* <p>
* 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.
* <p>
* 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.
* <p>
* 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()
* <p>
* 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
* <p>
* 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;
}

@ -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;

@ -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;
}
}

@ -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;
}
}

@ -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;
}
}
Loading…
Cancel
Save