package com.asha.vrlib;
import android.content.Context;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import com.asha.vrlib.common.Fps;
import com.asha.vrlib.common.MDGLHandler;
import com.asha.vrlib.plugins.MDAbsLinePipe;
import com.asha.vrlib.plugins.MDAbsPlugin;
import com.asha.vrlib.plugins.MDBarrelDistortionLinePipe;
import com.asha.vrlib.plugins.MDPluginManager;
import com.asha.vrlib.strategy.display.DisplayModeManager;
import com.asha.vrlib.strategy.projection.ProjectionModeManager;
import java.util.List;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import static com.asha.vrlib.common.GLUtil.glCheck;
/**
* Created by hzqiujiadi on 16/1/22.
* hzqiujiadi ashqalcn@gmail.com
*
* @see Builder
* @see #with(Context)
*/
public class MD360Renderer implements GLSurfaceView.Renderer {
private static final String TAG = "MD360Renderer";
private DisplayModeManager mDisplayModeManager;
private ProjectionModeManager mProjectionModeManager;
private MDPluginManager mPluginManager;
private MDAbsLinePipe mMainLinePipe;
private MDGLHandler mGLHandler;
private Fps mFps = new Fps();
private int mWidth;
private int mHeight;
// private MDBarrelDistortionPlugin mBarrelDistortionPlugin;
// final
private final Context mContext;
private MD360Renderer(Builder params){
mContext = params.context;
mDisplayModeManager = params.displayModeManager;
mProjectionModeManager = params.projectionModeManager;
mPluginManager = params.pluginManager;
mGLHandler = params.glHandler;
mMainLinePipe = new MDBarrelDistortionLinePipe(mDisplayModeManager);
}
@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config){
// set the background clear color to black.
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// use culling to remove back faces.
GLES20.glEnable(GLES20.GL_CULL_FACE);
// enable depth testing
// GLES20.glEnable(GLES20.GL_DEPTH_TEST);
}
@Override
public void onSurfaceChanged(GL10 glUnused, int width, int height){
this.mWidth = width;
this.mHeight = height;
mGLHandler.dealMessage();
}
@Override
public void onDrawFrame(GL10 glUnused){
// gl thread
// 切换策略
// 热点拾取
mGLHandler.dealMessage();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
glCheck("MD360Renderer onDrawFrame 1");
int size = mDisplayModeManager.getVisibleSize();
int width = (int) (this.mWidth * 1.0f / size);
int height = mHeight;
// take over
mMainLinePipe.setup(mContext);
mMainLinePipe.takeOver(mWidth,mHeight,size);
List<MD360Director> directors = mProjectionModeManager.getDirectors();
// main plugin
MDAbsPlugin mainPlugin = mProjectionModeManager.getMainPlugin();
if (mainPlugin != null){
mainPlugin.setupInGL(mContext);
mainPlugin.beforeRenderer(this.mWidth, this.mHeight);
}
for (MDAbsPlugin plugin : mPluginManager.getPlugins()) {
plugin.setupInGL(mContext);
plugin.beforeRenderer(this.mWidth, this.mHeight);
}
for (int i = 0; i < size; i++){
if (i >= directors.size()) break;
MD360Director director = directors.get(i);
GLES20.glViewport(width * i, 0, width, height);
GLES20.glEnable(GLES20.GL_SCISSOR_TEST);
GLES20.glScissor(width * i, 0, width, height);
if (mainPlugin != null){
mainPlugin.renderer(i, width, height, director);
}
for (MDAbsPlugin plugin : mPluginManager.getPlugins()) {
plugin.renderer(i, width, height, director);
}
GLES20.glDisable(GLES20.GL_SCISSOR_TEST);
}
mMainLinePipe.commit(mWidth,mHeight,size);
// mFps.step();
}
public static Builder with(Context context) {
Builder builder = new Builder();
builder.context = context;
return builder;
}
public static class Builder{
private Context context;
private DisplayModeManager displayModeManager;
private ProjectionModeManager projectionModeManager;
private MDGLHandler glHandler;
private MDPluginManager pluginManager;
private Builder() {
}
public MD360Renderer build(){
return new MD360Renderer(this);
}
public Builder setGLHandler(MDGLHandler glHandler){
this.glHandler = glHandler;
return this;
}
public Builder setPluginManager(MDPluginManager pluginManager) {
this.pluginManager = pluginManager;
return this;
}
public Builder setDisplayModeManager(DisplayModeManager displayModeManager) {
this.displayModeManager = displayModeManager;
return this;
}
public Builder setProjectionModeManager(ProjectionModeManager projectionModeManager) {
this.projectionModeManager = projectionModeManager;
return this;
}
}
}