package com.asha.vrlib;
import android.content.Context;
import android.opengl.GLES20;
import static com.asha.vrlib.common.GLUtil.compileShader;
import static com.asha.vrlib.common.GLUtil.createAndLinkProgram;
import static com.asha.vrlib.common.GLUtil.readTextFileFromRaw;
/**
* Created by hzqiujiadi on 16/1/22.
* hzqiujiadi ashqalcn@gmail.com
*/
public class MD360Program {
private int mMVPMatrixHandle;
private int mMVMatrixHandle;
private int mTextureUniformHandle;
private int mPositionHandle;
private int mTextureCoordinateHandle;
private int mProgramHandle;
private int mSTMatrixHandle;
private int mUseTextureTransformHandle;
private int mContentType;
public MD360Program(int type) {
mContentType = type;
}
/**
* build the program
*
* 1. create a program handle
* 2. compileShader
* 3. link program
* 4. get attribute handle && uniform handle
* @param context
*/
public void build(Context context){
final String vertexShader = getVertexShader(context);
final String fragmentShader = getFragmentShader(context);
final int vertexShaderHandle = compileShader(GLES20.GL_VERTEX_SHADER, vertexShader);
final int fragmentShaderHandle = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentShader);
mProgramHandle = createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle,
new String[] {"a_Position", "a_TexCoordinate"});
// Set program handles for cube drawing.
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
mMVMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVMatrix");
mTextureUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture");
mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position");
mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate");
mSTMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_STMatrix");
mUseTextureTransformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_UseSTM");
}
protected String getVertexShader(Context context){
return readTextFileFromRaw(context, R.raw.per_pixel_vertex_shader);
}
protected String getFragmentShader(Context context){
return FragmentShaderFactory.fs(context, mContentType);
}
public void use() {
GLES20.glUseProgram(mProgramHandle);
}
public int getMVPMatrixHandle() {
return mMVPMatrixHandle;
}
public int getMVMatrixHandle() {
return mMVMatrixHandle;
}
public int getTextureUniformHandle() {
return mTextureUniformHandle;
}
public int getPositionHandle() {
return mPositionHandle;
}
public int getSTMatrixHandle() {
return mSTMatrixHandle;
}
public int getUseTextureTransformHandle() {
return mUseTextureTransformHandle;
}
public int getTextureCoordinateHandle() {
return mTextureCoordinateHandle;
}
private static class FragmentShaderFactory {
static String fs(Context context, int type){
int resId;
switch (type){
case MDVRLibrary.ContentType.BITMAP:
resId = R.raw.per_pixel_fragment_shader_bitmap;
break;
case MDVRLibrary.ContentType.FBO:
resId = R.raw.per_pixel_fragment_shader_bitmap_fbo;
break;
case MDVRLibrary.ContentType.VIDEO:
default:
resId = R.raw.per_pixel_fragment_shader;
break;
}
return readTextFileFromRaw(context, resId);
}
}
}