Skip to content

Commit

Permalink
WIP: Adding back JOGL implementation based on current LWJGL code
Browse files Browse the repository at this point in the history
  • Loading branch information
eduramiba committed Jul 28, 2023
1 parent 51c8484 commit 24c514a
Show file tree
Hide file tree
Showing 15 changed files with 1,618 additions and 813 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ public static boolean isAvailable(VizEngine engine, GLAutoDrawable drawable) {
final GLCapabilitiesSummary caps = engine.getLookup().lookup(GLCapabilitiesSummary.class);

return drawable.getGLProfile().isGL2ES3()
&& caps.isInstancingSupported()
&& caps.getExtensions().ARB_base_instance//Maybe we can avoid this extension with separated gl buffers...
;
&& caps.isInstancingSupported();
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package org.gephi.viz.engine.jogl.models;

import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL2ES2;
import com.jogamp.opengl.GL2ES3;
import com.jogamp.opengl.GL3ES3;
import org.gephi.viz.engine.util.gl.Constants;

import static com.jogamp.opengl.GL.GL_TRIANGLES;
import static org.gephi.viz.engine.util.gl.Constants.*;
import org.gephi.viz.engine.util.NumberUtils;
import org.gephi.viz.engine.jogl.util.gl.GLShaderProgram;
Expand All @@ -19,28 +20,25 @@ public class EdgeLineModelDirected {
public static final int POSITION_TARGET_FLOATS = 2;
public static final int SOURCE_COLOR_FLOATS = 1;
public static final int COLOR_FLOATS = 1;
public static final int COLOR_BIAS_FLOATS = 1;
public static final int COLOR_MULTIPLIER_FLOATS = 1;
public static final int TARGET_SIZE_FLOATS = 1;
public static final int SIZE_FLOATS = 1;

public static final int TOTAL_ATTRIBUTES_FLOATS
= POSITION_SOURCE_FLOATS
+ POSITION_TARGET_FLOATS
+ SOURCE_COLOR_FLOATS
+ COLOR_FLOATS
+ COLOR_BIAS_FLOATS
+ COLOR_MULTIPLIER_FLOATS
+ TARGET_SIZE_FLOATS
+ SIZE_FLOATS;
= POSITION_SOURCE_FLOATS
+ POSITION_TARGET_FLOATS
+ SOURCE_COLOR_FLOATS
+ COLOR_FLOATS
+ TARGET_SIZE_FLOATS
+ SIZE_FLOATS;

private static final int VERTEX_PER_TRIANGLE = 3;

public static final int TRIANGLE_COUNT = 3;
public static final int VERTEX_COUNT = TRIANGLE_COUNT * VERTEX_PER_TRIANGLE;
public static final int FLOATS_COUNT = VERTEX_COUNT * VERTEX_FLOATS;

private GLShaderProgram program;
private GLShaderProgram programWithSelectionSelected;
private GLShaderProgram programWithSelectionUnselected;

public int getVertexCount() {
return VERTEX_COUNT;
Expand All @@ -53,60 +51,93 @@ public void initGLPrograms(GL2ES2 gl) {
private static final String SHADERS_ROOT = Constants.SHADERS_ROOT + "edge";

private static final String SHADERS_EDGE_LINE_SOURCE = "edge-line-directed";
private static final String SHADERS_EDGE_LINE_SOURCE_WITH_SELECTION_SELECTED = "edge-line-directed_with_selection_selected";
private static final String SHADERS_EDGE_LINE_SOURCE_WITH_SELECTION_UNSELECTED = "edge-line-directed_with_selection_unselected";

private void initProgram(GL2ES2 gl) {
program = new GLShaderProgram(SHADERS_ROOT, SHADERS_EDGE_LINE_SOURCE, SHADERS_EDGE_LINE_SOURCE)
.addUniformName(UNIFORM_NAME_MODEL_VIEW_PROJECTION)
.addUniformName(UNIFORM_NAME_BACKGROUND_COLOR)
.addUniformName(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MIN)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX)
.addUniformName(UNIFORM_NAME_MIN_WEIGHT)
.addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR)
.addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION)
.addAttribLocation(ATTRIB_NAME_SIZE, SHADER_SIZE_LOCATION)
.addAttribLocation(ATTRIB_NAME_SOURCE_COLOR, SHADER_SOURCE_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_COLOR_BIAS, SHADER_COLOR_BIAS_LOCATION)
.addAttribLocation(ATTRIB_NAME_COLOR_MULTIPLIER, SHADER_COLOR_MULTIPLIER_LOCATION)
.addAttribLocation(ATTRIB_NAME_TARGET_SIZE, SHADER_TARGET_SIZE_LOCATION)
.init(gl);
.addUniformName(UNIFORM_NAME_MODEL_VIEW_PROJECTION)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MIN)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX)
.addUniformName(UNIFORM_NAME_MIN_WEIGHT)
.addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR)
.addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION)
.addAttribLocation(ATTRIB_NAME_SIZE, SHADER_SIZE_LOCATION)
.addAttribLocation(ATTRIB_NAME_SOURCE_COLOR, SHADER_SOURCE_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_TARGET_SIZE, SHADER_TARGET_SIZE_LOCATION)
.init(gl);

programWithSelectionSelected = new GLShaderProgram(SHADERS_ROOT, SHADERS_EDGE_LINE_SOURCE_WITH_SELECTION_SELECTED, SHADERS_EDGE_LINE_SOURCE)
.addUniformName(UNIFORM_NAME_MODEL_VIEW_PROJECTION)
.addUniformName(UNIFORM_NAME_COLOR_BIAS)
.addUniformName(UNIFORM_NAME_COLOR_MULTIPLIER)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MIN)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX)
.addUniformName(UNIFORM_NAME_MIN_WEIGHT)
.addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR)
.addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION)
.addAttribLocation(ATTRIB_NAME_SIZE, SHADER_SIZE_LOCATION)
.addAttribLocation(ATTRIB_NAME_SOURCE_COLOR, SHADER_SOURCE_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_TARGET_SIZE, SHADER_TARGET_SIZE_LOCATION)
.init(gl);

programWithSelectionUnselected = new GLShaderProgram(SHADERS_ROOT, SHADERS_EDGE_LINE_SOURCE_WITH_SELECTION_UNSELECTED, SHADERS_EDGE_LINE_SOURCE)
.addUniformName(UNIFORM_NAME_MODEL_VIEW_PROJECTION)
.addUniformName(UNIFORM_NAME_BACKGROUND_COLOR)
.addUniformName(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MIN)
.addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX)
.addUniformName(UNIFORM_NAME_MIN_WEIGHT)
.addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR)
.addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION)
.addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION)
.addAttribLocation(ATTRIB_NAME_SIZE, SHADER_SIZE_LOCATION)
.addAttribLocation(ATTRIB_NAME_SOURCE_COLOR, SHADER_SOURCE_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION)
.addAttribLocation(ATTRIB_NAME_TARGET_SIZE, SHADER_TARGET_SIZE_LOCATION)
.init(gl);
}

public void drawArraysSingleInstance(GL2ES2 gl) {
gl.glDrawArrays(GL.GL_TRIANGLES, 0, VERTEX_COUNT);
public void drawArraysMultipleInstance(GL2ES2 gl, final int drawBatchCount) {
if (drawBatchCount <= 0){
return;
}
//Multiple lines, attributes must be in the buffer once per vertex count:
gl.glDrawArrays(GL_TRIANGLES, 0, VERTEX_COUNT * drawBatchCount);
}

public void drawArraysMultipleInstance(GL2ES2 gl, int drawBatchCount) {
//Multiple lines, attributes must be in the buffer once per vertex count:
gl.glDrawArrays(GL.GL_TRIANGLES, 0, VERTEX_COUNT * drawBatchCount);
public void drawInstanced(GL3ES3 gl, int instanceCount) {
gl.glDrawArraysInstanced(GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount);
}

public void drawInstanced(GL2ES3 gl, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight) {
useProgram(gl, mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight);
if (instancesOffset > 0) {
gl.glDrawArraysInstancedBaseInstance(GL.GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount, instancesOffset);
} else {
gl.glDrawArraysInstanced(GL.GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount);
}
stopUsingProgram(gl);
public void stopUsingProgram(GL2ES2 gl) {
gl.glUseProgram(0);
}

public void useProgram(GL2ES2 gl, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight) {
public void useProgram(GL2ES2 gl, float[] mvpFloats, float scale, float minWeight, float maxWeight) {
program.use(gl);
prepareProgramData(gl, mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight);
prepareProgramData(gl, mvpFloats, scale, minWeight, maxWeight);
}

public void stopUsingProgram(GL2ES2 gl) {
program.stopUsing(gl);
public void useProgramWithSelectionSelected(GL2ES2 gl, float[] mvpFloats, float scale, float minWeight, float maxWeight, float colorBias, float colorMultiplier) {
programWithSelectionSelected.use(gl);
prepareProgramDataWithSelectionSelected(gl, mvpFloats, scale, minWeight, maxWeight, colorBias, colorMultiplier);
}

private void prepareProgramData(GL2ES2 gl, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight) {
public void useProgramWithSelectionUnselected(GL2ES2 gl, float[] mvpFloats, float scale, float minWeight, float maxWeight, float[] backgroundColorFloats, float colorLightenFactor) {
programWithSelectionUnselected.use(gl);
prepareProgramDataWithSelectionUnselected(gl, mvpFloats, scale, minWeight, maxWeight, backgroundColorFloats, colorLightenFactor);
}

private void prepareProgramData(GL2ES2 gl, float[] mvpFloats, float scale, float minWeight, float maxWeight) {
gl.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), 1, false, mvpFloats, 0);
gl.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), 1, backgroundColorFloats, 0);
gl.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor);
gl.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale);
gl.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale);
gl.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight);
Expand All @@ -118,6 +149,36 @@ private void prepareProgramData(GL2ES2 gl, float[] mvpFloats, float[] background
}
}

private void prepareProgramDataWithSelectionSelected(GL2ES2 gl, float[] mvpFloats, float scale, float minWeight, float maxWeight, float colorBias, float colorMultiplier) {
gl.glUniformMatrix4fv(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), 1, false, mvpFloats, 0);
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_COLOR_BIAS), colorBias);
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_COLOR_MULTIPLIER), colorMultiplier);
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale);
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale);
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight);

if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) {
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1);
} else {
gl.glUniform1f(programWithSelectionSelected.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), maxWeight - minWeight);
}
}

private void prepareProgramDataWithSelectionUnselected(GL2ES2 gl, float[] mvpFloats, float scale, float minWeight, float maxWeight, float[] backgroundColorFloats, float colorLightenFactor) {
gl.glUniformMatrix4fv(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), 1, false, mvpFloats, 0);
gl.glUniform4fv(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), 1, backgroundColorFloats, 0);
gl.glUniform1f(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor);
gl.glUniform1f(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale);
gl.glUniform1f(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale);
gl.glUniform1f(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight);

if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) {
gl.glUniform1f(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1);
} else {
gl.glUniform1f(programWithSelectionUnselected.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), maxWeight - minWeight);
}
}

public static float[] getVertexData() {
//lineEnd, sideVector, arrowHeight
return new float[]{
Expand Down
Loading

0 comments on commit 24c514a

Please sign in to comment.