package org.geogebra.common.geogebra3D.euclidian3D.openGL;
import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D;
import org.geogebra.common.util.debug.Log;
public abstract class RendererImpl implements RendererShadersInterface {
protected EuclidianView3D view3D;
protected Renderer renderer;
public RendererImpl(Renderer renderer, EuclidianView3D view) {
this.renderer = renderer;
this.view3D = view;
}
/**
* enable flag
*
* @param flag
* GL flag
*/
public abstract void glEnable(int flag);
/**
* disable flag
*
* @param flag
* GL flag
*/
public abstract void glDisable(int flag);
/**
* clear buffers corresponding to flag
*
* @param flag
* buffers flag
*/
abstract public void glClear(int flag);
// GL flags getters
abstract public int getGL_BLEND();
abstract public int getGL_CULL_FACE();
abstract public int getGL_COLOR_BUFFER_BIT();
abstract public int getGL_DEPTH_BUFFER_BIT();
abstract public int getGL_DEPTH_TEST();
abstract public void disableCulling();
public abstract void setClipPlanes(double[][] minMax);
public abstract void setColor(float r, float g, float b, float a);
public abstract void initMatrix();
public abstract void initMatrixForFaceToScreen();
public abstract void resetMatrix();
public abstract void updateOrthoValues();
public abstract void enableTextures();
public abstract void disableTextures();
public abstract void enableFading();
public abstract void enableDash();
public abstract void setDashTexture(int index);
public abstract void setLabelOrigin(float[] origin);
public abstract void enableLighting();
public abstract void disableLighting();
public abstract void initLighting();
public abstract boolean useShaders();
public abstract void setMatrixView();
public abstract void unsetMatrixView();
public abstract void pushSceneMatrix();
public abstract void setLightPosition(float[] values);
public abstract void setLightAmbiantDiffuse(float ambiant0, float diffuse0,
float ambiant1, float diffuse1);
public abstract void setLight(int light);
public abstract void setColorMaterial();
public abstract void setLightModel();
public abstract void setAlphaFunc();
public abstract void setView();
public abstract void setStencilLines();
public abstract void viewOrtho();
public abstract void viewPersp();
public abstract void viewGlasses();
public abstract void viewOblique();
public abstract Manager createManager();
public abstract float[] getLightPosition();
public abstract void drawSurfacesOutline();
public abstract void enableClipPlanes();
public abstract void disableClipPlanes();
public abstract void useShaderProgram();
public abstract void draw();
public abstract void dispose();
public abstract void updatePerspValues();
public abstract void updateGlassesValues();
public abstract void updateProjectionObliqueValues();
public abstract void enableTexturesForText();
public abstract void initRenderingValues();
public abstract void drawFaceToScreenAbove();
public abstract void drawFaceToScreenBelow();
public abstract void enableLightingOnInit();
public abstract void initCulling();
public abstract void drawTranspNotCurved();
public abstract void setCullFaceFront();
public abstract void setCullFaceBack();
abstract public void initShaders();
public abstract void disableShine();
public abstract void enableShine();
abstract public void setBufferLeft();
abstract public void setBufferRight();
abstract public void setStencilFunc(int value);
abstract public void enableDepthMask();
abstract public void disableDepthMask();
abstract public void setColorMask(boolean r, boolean g, boolean b,
boolean a);
abstract public void setClearColor(float r, float g, float b, float a);
abstract public void setPolygonOffset(float factor, float units);
abstract public void setLayer(int layer);
abstract public void genTextures2D(int number, int[] index);
abstract public void bindTexture(int index);
abstract public void enableAlphaTest();
abstract public void disableAlphaTest();
abstract public void enableMultisample();
abstract public void disableMultisample();
final public void needExportImage(double scale, int w, int h) {
view3D.setFontScale(scale);
setExportImageDimension(w, h);
renderer.setNeedExportImage(true);
renderer.display();
}
private int fboWidth = 1;
private int fboHeight = 1;
private Object fboID;
private int fboColorTextureID;
private Object fboDepthTextureID;
private int oldRight;
private int oldLeft;
private int oldTop;
private int oldBottom;
final public void setExportImageDimension(int w, int h) {
fboWidth = w;
fboHeight = h;
}
public void endNeedExportImage() {
renderer.setNeedExportImage(false);
// set no font scale
view3D.setFontScale(1);
}
public final void selectFBO() {
if (fboID == null) {
view3D.setFontScale(1);
return;
}
updateFBOBuffers();
// bind the buffer
bindFramebuffer(fboID);
// store view values
oldRight = renderer.getRight();
oldLeft = renderer.getLeft();
oldTop = renderer.getTop();
oldBottom = renderer.getBottom();
// set view values for buffer
renderer.setView(0, 0, fboWidth, fboHeight);
}
public final void unselectFBO() {
if (fboID == null) {
return;
}
// set back the view
renderer.setView(0, 0, oldRight - oldLeft, oldTop - oldBottom);
// unbind the framebuffer ...
unbindFramebuffer();
}
public void updateFBOBuffers() {
// image texture
bindTexture(fboColorTextureID);
textureParametersNearest();
textureImage2DForBuffer(fboWidth, fboHeight);
bindTexture(0);
// depth buffer
bindRenderbuffer(fboDepthTextureID);
renderbufferStorage(fboWidth, fboHeight);
unbindRenderbuffer();
}
/**
* init frame buffer object for save image
*/
public final void initFBO() {
try {
// allocate the colour texture ...
int[] result = new int[1];
genTextures2D(1, result);
fboColorTextureID = result[0];
// allocate the depth texture ...
fboDepthTextureID = genRenderbuffer();
updateFBOBuffers();
// allocate the framebuffer object ...
fboID = genFramebuffer();
bindFramebuffer(fboID);
// attach the textures to the framebuffer
framebuffer(fboColorTextureID, fboDepthTextureID);
unbindFramebuffer();
// check if frame buffer is complete
if (!checkFramebufferStatus()) {
Log.error("Frame buffer is not complete");
fboID = null;
}
} catch (Exception e) {
Log.error(e.getMessage());
fboID = null;
}
}
protected abstract void bindFramebuffer(Object id);
protected abstract void bindRenderbuffer(Object id);
protected abstract void unbindFramebuffer();
protected abstract void unbindRenderbuffer();
protected abstract void textureParametersNearest();
protected abstract void textureImage2DForBuffer(int width, int height);
protected abstract void renderbufferStorage(int width, int height);
protected abstract Object genRenderbuffer();
protected abstract Object genFramebuffer();
protected abstract void framebuffer(Object colorId, Object depthId);
protected abstract boolean checkFramebufferStatus();
}