/** * */ package org.goko.tools.autoleveler.modifier.renderer; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; import javax.media.opengl.GL; import javax.media.opengl.GL3; import javax.vecmath.Point4d; import org.apache.commons.collections.CollectionUtils; import org.goko.core.common.exception.GkException; import org.goko.core.log.GkLog; import org.goko.core.math.Tuple6b; import org.goko.tools.autoleveler.bean.grid.GridHeightMap; import org.goko.tools.autoleveler.modifier.AutoLevelerModifier; import org.goko.tools.viewer.jogl.service.JoglUtils; import org.goko.tools.viewer.jogl.shaders.EnumGokoShaderProgram; import org.goko.tools.viewer.jogl.shaders.ShaderLoader; import org.goko.tools.viewer.jogl.utils.render.internal.AbstractLineRenderer; /** * @author PsyKo * @date 18 janv. 2016 */ public class GridAutoLevelerRenderer extends AbstractLineRenderer { /** LOG */ private static GkLog LOG = GkLog.getLogger(GridAutoLevelerRenderer.class); /** The rendererd map */ private WeakReference<AutoLevelerModifier<GridHeightMap>> modifierReference; /** * Constructor */ public GridAutoLevelerRenderer(AutoLevelerModifier<GridHeightMap> modifier) { super(GL.GL_LINES, VERTICES); this.modifierReference = new WeakReference<AutoLevelerModifier<GridHeightMap>>(modifier); this.setUseAlpha(true); } /** (inheritDoc) * @see org.goko.tools.viewer.jogl.utils.render.internal.AbstractLineRenderer#loadShaderProgram(javax.media.opengl.GL3) */ @Override protected int loadShaderProgram(GL3 gl) throws GkException { return ShaderLoader.loadShader(gl, EnumGokoShaderProgram.Z_LEVEL_SHADER); } /** (inheritDoc) * @see org.goko.tools.viewer.jogl.utils.render.internal.AbstractVboJoglRenderer#updateShaderData(javax.media.opengl.GL3) */ @Override protected void updateShaderData(GL3 gl) throws GkException { super.updateShaderData(gl); if(modifierReference.get() == null){ return; } AutoLevelerModifier<GridHeightMap> modifier = modifierReference.get(); GridHeightMap map = modifier.getHeightMap(); int shaderProgram = getShaderProgram(); int zTop = gl.glGetUniformLocation(shaderProgram, "zTop"); int zCenter = gl.glGetUniformLocation(shaderProgram, "zCenter"); int zBottom = gl.glGetUniformLocation(shaderProgram, "zBottom"); if(zTop >= 0){ gl.glUniform1f(zTop, map.getProbeStartHeight().value(JoglUtils.JOGL_UNIT).floatValue() ); } if(zCenter >= 0){ gl.glUniform1f(zCenter, modifier.getTheoricHeight().value(JoglUtils.JOGL_UNIT).floatValue() ); } if(zBottom >= 0){ gl.glUniform1f(zBottom, map.getProbeLowerHeight().value(JoglUtils.JOGL_UNIT).floatValue() ); } int colorTop = gl.glGetUniformLocation(shaderProgram, "colorTop"); int colorCenter = gl.glGetUniformLocation(shaderProgram, "colorCenter"); int colorBottom = gl.glGetUniformLocation(shaderProgram, "colorBottom"); if(colorTop >= 0){ gl.glUniform4fv(colorTop, 1, new float[]{1f, 0f, 0f, 0.6f},0); } if(colorCenter >= 0){ gl.glUniform4fv(colorCenter, 1, new float[]{0f, 1f, 0f, 0.6f},0); } if(colorBottom >= 0){ gl.glUniform4fv(colorBottom, 1, new float[]{0f, 0f, 1f, 0.6f},0); } } /** (inheritDoc) * @see org.goko.tools.viewer.jogl.utils.render.internal.AbstractVboJoglRenderer#buildGeometry() */ @Override protected void buildGeometry() throws GkException { List<Point4d> lstVertices = new ArrayList<Point4d>(); GridHeightMap map = modifierReference.get().getHeightMap(); for (int x = 0; x <= map.getxDivisionCount(); x++) { for (int y = 0; y < map.getyDivisionCount(); y++) { Tuple6b p1 = map.getPoint(x, y); Tuple6b p2 = map.getPoint(x, y+1); lstVertices.add(new Point4d(p1.toPoint3d(JoglUtils.JOGL_UNIT))); lstVertices.add(new Point4d(p2.toPoint3d(JoglUtils.JOGL_UNIT))); } } for (int y = 0; y <= map.getyDivisionCount(); y++) { for (int x = 0; x < map.getxDivisionCount(); x++) { Tuple6b p1 = map.getPoint(x, y); Tuple6b p2 = map.getPoint(x+1, y); lstVertices.add(new Point4d(p1.toPoint3d(JoglUtils.JOGL_UNIT))); lstVertices.add(new Point4d(p2.toPoint3d(JoglUtils.JOGL_UNIT))); } } setVerticesCount(CollectionUtils.size(lstVertices)); setVerticesBuffer(JoglUtils.buildFloatBuffer4d(lstVertices)); } /** (inheritDoc) * @see org.goko.tools.viewer.jogl.utils.render.internal.AbstractVboJoglRenderer#update() */ @Override public void update() { super.update(); try { updateGeometry(); } catch (GkException e) { LOG.error(e); } updateShaderData(); } }