package com.asha.vrlib.plugins; import android.content.Context; import com.asha.vrlib.MDDirectorCamUpdate; import com.asha.vrlib.MD360Director; import com.asha.vrlib.MD360Program; import com.asha.vrlib.MDDirectorFilter; import com.asha.vrlib.model.MDMainPluginBuilder; import com.asha.vrlib.model.MDPosition; import com.asha.vrlib.objects.MDAbsObject3D; import com.asha.vrlib.strategy.projection.ProjectionModeManager; import com.asha.vrlib.texture.MD360Texture; import java.util.List; import static com.asha.vrlib.common.GLUtil.glCheck; /** * Created by hzqiujiadi on 16/7/22. * hzqiujiadi ashqalcn@gmail.com */ public class MDPanoramaPlugin extends MDAbsPlugin { private MD360Program mProgram; private MD360Texture mTexture; private ProjectionModeManager mProjectionModeManager; private MDDirectorCamUpdate mDirectorCameraUpdate; private MDDirectorFilter mDirectorFilter; public MDPanoramaPlugin(MDMainPluginBuilder builder) { mTexture = builder.getTexture(); mProgram = new MD360Program(builder.getContentType()); mProjectionModeManager = builder.getProjectionModeManager(); mDirectorCameraUpdate = builder.getCameraUpdate(); mDirectorFilter = builder.getFilter(); } @Override public void initInGL(Context context) { mProgram.build(context); mTexture.create(); } @Override public void beforeRenderer(int totalWidth, int totalHeight) { List<MD360Director> directors = mProjectionModeManager.getDirectors(); if (directors != null){ // apply the update for (MD360Director director : directors){ if (mDirectorCameraUpdate.isChanged()){ director.applyUpdate(mDirectorCameraUpdate); } director.applyFilter(mDirectorFilter); } mDirectorCameraUpdate.consumeChanged(); } } @Override public void renderer(int index, int width, int height, MD360Director director) { MDAbsObject3D object3D = mProjectionModeManager.getObject3D(); // check obj3d if (object3D == null) return; // Update Projection director.setViewport(width, height); // Set our per-vertex lighting program. mProgram.use(); glCheck("MDPanoramaPlugin mProgram use"); mTexture.texture(mProgram); object3D.uploadVerticesBufferIfNeed(mProgram, index); object3D.uploadTexCoordinateBufferIfNeed(mProgram, index); // Pass in the combined matrix. // model view projection matrix. director.beforeShot(); director.shot(mProgram, getModelPosition()); object3D.draw(); } @Override public void destroyInGL() { mTexture = null; } @Override protected MDPosition getModelPosition() { return mProjectionModeManager.getModelPosition(); } @Override protected boolean removable() { return false; } }