From 2a3f88a3cf2a60f546616ad8bf40ed7145f4d1ef Mon Sep 17 00:00:00 2001 From: totetmatt Date: Tue, 13 Apr 2021 08:35:15 +0200 Subject: [PATCH 1/6] Add the current time --- .../org/gephi/viz/engine/util/TimeUtils.java | 3 +++ .../org/gephi/viz/engine/util/gl/Constants.java | 2 ++ .../org/gephi/viz-engine/shaders/node/node.vert | 1 + .../lwjgl/models/EdgeLineModelDirected.java | 1 + .../lwjgl/models/EdgeLineModelUndirected.java | 1 + .../viz/engine/lwjgl/models/NodeDiskModel.java | 16 +++++++++------- .../lwjgl/pipeline/arrays/ArrayDrawNodeData.java | 7 ++++++- .../pipeline/indirect/IndirectNodeData.java | 7 ++++++- .../pipeline/instanced/InstancedNodeData.java | 7 ++++++- 9 files changed, 35 insertions(+), 10 deletions(-) diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java index d3a001a..58dd3fc 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java @@ -9,4 +9,7 @@ public class TimeUtils { public static long getTimeMillis() { return System.nanoTime() / 1_000_000; } + public static float getFloatSecondGlobalTime() { + return getTimeMillis() /1000.f; + } } diff --git a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java index 601d85c..3bb937c 100644 --- a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java +++ b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java @@ -18,6 +18,7 @@ public class Constants { public static final String ATTRIB_NAME_SOURCE_SIZE = "sourceSize"; public static final String ATTRIB_NAME_TARGET_SIZE = "targetSize"; + public static final int SHADER_VERT_LOCATION = 0; public static final int SHADER_POSITION_LOCATION = 1; public static final int SHADER_COLOR_LOCATION = 2; @@ -42,6 +43,7 @@ public class Constants { public static final String UNIFORM_NAME_BACKGROUND_COLOR = "backgroundColor"; public static final String UNIFORM_NAME_COLOR_LIGHTEN_FACTOR = "colorLightenFactor"; + public static final String UNIFORM_NAME_GLOBAL_TIME_SIZE = "fGlobalTime"; //Rendering order: public static final int RENDERING_ORDER_NODES = 100; public static final int RENDERING_ORDER_EDGES = 50; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert index 6e9ef27..4b55ed4 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert @@ -3,6 +3,7 @@ uniform mat4 mvp; uniform vec4 backgroundColor; uniform float colorLightenFactor; +uniform float fGlobalTime; attribute vec2 vert; attribute vec2 position; diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java index e1277a4..916b774 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java @@ -63,6 +63,7 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX) .addUniformName(UNIFORM_NAME_MIN_WEIGHT) .addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR) + .addUniformName(UNIFORM_NAME_GLOBAL_TIME_SIZE) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION) diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java index e2b95bf..2026f89 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java @@ -63,6 +63,7 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX) .addUniformName(UNIFORM_NAME_MIN_WEIGHT) .addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR) + .addUniformName(UNIFORM_NAME_GLOBAL_TIME_SIZE) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION) diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java index ed9403e..9eea83b 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java @@ -67,6 +67,7 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_MODEL_VIEW_PROJECTION) .addUniformName(UNIFORM_NAME_BACKGROUND_COLOR) .addUniformName(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR) + .addUniformName(UNIFORM_NAME_GLOBAL_TIME_SIZE) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION) @@ -80,8 +81,8 @@ public void drawArraysSingleInstance(int firstVertexIndex, int vertexCount) { GL20.glDrawArrays(GL20.GL_TRIANGLES, firstVertexIndex, vertexCount); } - public void drawInstanced(int vertexOffset, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor); + public void drawInstanced(int vertexOffset, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime); if (instancesOffset > 0) { GL42.glDrawArraysInstancedBaseInstance(GL20.GL_TRIANGLES, vertexOffset, vertexCount, instanceCount, instancesOffset); } else { @@ -90,23 +91,24 @@ public void drawInstanced(int vertexOffset, float[] mvpFloats, float[] backgroun stopUsingProgram(); } - public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset) { - drawInstanced(0, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset); + public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime) { + drawInstanced(0, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime); } - public void drawIndirect(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor); + public void drawIndirect(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime); GL43.glMultiDrawArraysIndirect(GL20.GL_TRIANGLES, instancesOffset * GLConstants.INDIRECT_DRAW_COMMAND_BYTES, instanceCount, GLConstants.INDIRECT_DRAW_COMMAND_BYTES); stopUsingProgram(); } - public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor) { + public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float globalTime) { //Circle: program.use(); GL20.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), false, mvpFloats); GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME_SIZE),globalTime); } public void stopUsingProgram() { diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java index 10e5c22..be9df06 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java @@ -1,6 +1,8 @@ package org.gephi.viz.engine.lwjgl.pipeline.arrays; import java.nio.FloatBuffer; +import java.time.ZonedDateTime; + import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; import org.gephi.viz.engine.lwjgl.models.NodeDiskModel; @@ -19,6 +21,8 @@ import static org.lwjgl.opengl.GL20.glVertexAttrib1f; import static org.lwjgl.opengl.GL20.glVertexAttrib4f; import static org.lwjgl.opengl.GL20.glVertexAttrib2fv; + +import org.gephi.viz.engine.util.TimeUtils; import org.lwjgl.system.MemoryStack; /** @@ -75,6 +79,7 @@ public void update(VizEngine engine, GraphIndexImpl spatialIndex) { } public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { + final float globalTime = TimeUtils.getFloatSecondGlobalTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final float zoom = engine.getZoom(); @@ -94,7 +99,7 @@ public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats if (instanceCount > 0) { setupVertexArrayAttributes(engine); - diskModel64.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor); + diskModel64.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime); final float[] attrs = new float[ATTRIBS_STRIDE]; int index = instancesOffset * ATTRIBS_STRIDE; diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java index 8654c6e..87dc4d4 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java @@ -2,6 +2,8 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; +import java.time.ZonedDateTime; + import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; import org.gephi.viz.engine.lwjgl.models.NodeDiskModel; @@ -21,6 +23,8 @@ import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; import static org.lwjgl.opengl.GL20.glGenBuffers; + +import org.gephi.viz.engine.util.TimeUtils; import org.lwjgl.system.MemoryStack; /** @@ -85,6 +89,7 @@ public void update(VizEngine engine, GraphIndexImpl spatialIndex) { } public void drawIndirect(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { + final float globalTime = TimeUtils.getFloatSecondGlobalTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final int instanceCount; @@ -105,7 +110,7 @@ public void drawIndirect(RenderingLayer layer, VizEngine engine, float[] mvpFloa setupVertexArrayAttributes(engine); commandsGLBuffer.bind(); - diskModel64.drawIndirect(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset); + diskModel64.drawIndirect(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime); commandsGLBuffer.unbind(); unsetupVertexArrayAttributes(); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java index 4ede59a..234747e 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java @@ -1,6 +1,8 @@ package org.gephi.viz.engine.lwjgl.pipeline.instanced; import java.nio.FloatBuffer; +import java.time.ZonedDateTime; + import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; import org.gephi.viz.engine.pipeline.RenderingLayer; @@ -15,6 +17,8 @@ import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL20.glGenBuffers; + +import org.gephi.viz.engine.util.TimeUtils; import org.lwjgl.system.MemoryStack; /** @@ -73,6 +77,7 @@ public void update(VizEngine engine, GraphIndexImpl spatialIndex) { } public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { + final float globalTime = TimeUtils.getFloatSecondGlobalTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final float zoom = engine.getZoom(); @@ -110,7 +115,7 @@ public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFlo } setupVertexArrayAttributes(engine); - diskModelToRender.drawInstanced(firstVertex, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset); + diskModelToRender.drawInstanced(firstVertex, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime); unsetupVertexArrayAttributes(); } } From 9f07e82c5621503e6301964c377e658109598932 Mon Sep 17 00:00:00 2001 From: totetmatt Date: Tue, 13 Apr 2021 09:23:41 +0200 Subject: [PATCH 2/6] fGlobalTime in all shaders --- .../gephi/viz/engine/lwjgl/demo/MainGLFW.java | 2 +- .../shaders/edge/edge-line-directed.frag | 4 +++- .../shaders/edge/edge-line-directed.vert | 1 + .../shaders/edge/edge-line-undirected.frag | 2 ++ .../shaders/edge/edge-line-undirected.vert | 1 + .../org/gephi/viz-engine/shaders/node/node.frag | 7 ++++++- .../lwjgl/models/EdgeLineModelDirected.java | 12 +++++++----- .../lwjgl/models/EdgeLineModelUndirected.java | 12 +++++++----- .../pipeline/arrays/ArrayDrawEdgeData.java | 17 +++++++++-------- .../pipeline/instanced/InstancedEdgeData.java | 16 +++++++++------- 10 files changed, 46 insertions(+), 28 deletions(-) diff --git a/modules/demo-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/demo/MainGLFW.java b/modules/demo-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/demo/MainGLFW.java index fb1a09d..ea3ef2c 100644 --- a/modules/demo-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/demo/MainGLFW.java +++ b/modules/demo-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/demo/MainGLFW.java @@ -34,7 +34,7 @@ public class MainGLFW { private static final boolean DISABLE_INSTANCED_RENDERING = false; private static final boolean DISABLE_VAOS = false; - private static final boolean DEBUG = false; + private static final boolean DEBUG = true; private static final boolean USE_OPENGL_ES = false; private static final int WIDTH = 1024; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.frag b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.frag index 7af8936..e87b3cd 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.frag +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.frag @@ -4,8 +4,10 @@ precision lowp float; #endif +uniform float fGlobalTime; + varying lowp vec4 fragColor; void main() { gl_FragColor = fragColor; -} +} \ No newline at end of file diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert index c54e420..371f619 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert @@ -8,6 +8,7 @@ uniform float minWeight; uniform float weightDifferenceDivisor; uniform float edgeScaleMin; uniform float edgeScaleMax; +uniform float fGlobalTime; attribute vec3 vert; attribute vec2 position; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.frag b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.frag index 7af8936..9bdf3a8 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.frag +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.frag @@ -4,6 +4,8 @@ precision lowp float; #endif +uniform float fGlobalTime; + varying lowp vec4 fragColor; void main() { diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert index 6c5008f..48e57f2 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert @@ -7,6 +7,7 @@ uniform float minWeight; uniform float weightDifferenceDivisor; uniform float edgeScaleMin; uniform float edgeScaleMax; +uniform float fGlobalTime; attribute vec2 vert; attribute vec2 position; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag index 80b2c5b..5682ffa 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag @@ -4,8 +4,13 @@ precision lowp float; #endif +uniform float fGlobalTime; + varying vec4 fragColor; +mat2 rot(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);} void main() { - gl_FragColor = fragColor; + vec4 c = fragColor; + c.rg *=rot(fGlobalTime); + gl_FragColor = c; } diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java index 916b774..8e2576a 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java @@ -1,5 +1,6 @@ package org.gephi.viz.engine.lwjgl.models; +import org.gephi.viz.engine.util.TimeUtils; import org.gephi.viz.engine.util.gl.Constants; import static org.gephi.viz.engine.util.gl.Constants.*; import org.gephi.viz.engine.util.NumberUtils; @@ -85,8 +86,8 @@ public void drawArraysMultipleInstance(int drawBatchCount) { GL20.glDrawArrays(GL20.GL_TRIANGLES, 0, VERTEX_COUNT * drawBatchCount); } - public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight); + public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight, float globalTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); if (instancesOffset > 0) { GL42.glDrawArraysInstancedBaseInstance(GL20.GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount, instancesOffset); } else { @@ -95,22 +96,23 @@ public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, floa stopUsingProgram(); } - public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight) { + public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { program.use(); - prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight); + prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); } public void stopUsingProgram() { program.stopUsing(); } - private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight) { + private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { GL20.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), false, mvpFloats); GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME_SIZE), globalTime); if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java index 2026f89..0152e33 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java @@ -1,6 +1,7 @@ package org.gephi.viz.engine.lwjgl.models; import org.gephi.viz.engine.lwjgl.util.gl.GLShaderProgram; +import org.gephi.viz.engine.util.TimeUtils; import org.gephi.viz.engine.util.gl.Constants; import static org.gephi.viz.engine.util.gl.Constants.*; import org.gephi.viz.engine.util.NumberUtils; @@ -86,8 +87,8 @@ public void drawArraysMultipleInstance(int drawBatchCount) { GL20.glDrawArrays(GL20.GL_TRIANGLES, 0, VERTEX_COUNT * drawBatchCount); } - public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight); + public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight, float globalTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); if (instancesOffset > 0) { GL42.glDrawArraysInstancedBaseInstance(GL20.GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount, instancesOffset); } else { @@ -96,23 +97,24 @@ public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, floa stopUsingProgram(); } - public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight) { + public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { //Line: program.use(); - prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight); + prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); } public void stopUsingProgram() { program.stopUsing(); } - private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight) { + private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { GL20.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), false, mvpFloats); GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME_SIZE), globalTime); if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java index 64a7532..8792545 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java @@ -17,6 +17,8 @@ import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL15.glGenBuffers; + +import org.gephi.viz.engine.util.TimeUtils; import org.lwjgl.system.MemoryUtil; /** @@ -51,7 +53,7 @@ public void update(VizEngine engine, GraphIndexImpl graphIndex) { public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { final GraphRenderingOptions renderingOptions = engine.getLookup().lookup(GraphRenderingOptions.class); - + float globalTime = TimeUtils.getFloatSecondGlobalTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final float edgeScale = renderingOptions.getEdgeScale(); float lightenNonSelectedFactor = renderingOptions.getLightenNonSelectedFactor(); @@ -61,11 +63,11 @@ public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats final float minWeight = graphIndex.getEdgesMinWeight(); final float maxWeight = graphIndex.getEdgesMaxWeight(); - drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight); - drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight); + drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); + drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); } - private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight) { + private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -82,7 +84,7 @@ private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpF if (instanceCount > 0) { setupUndirectedVertexArrayAttributes(engine); - lineModelUndirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight); + lineModelUndirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight, globalTime); final FloatBuffer batchUpdateBuffer = attributesDrawBufferBatchOneCopyPerVertexManagedDirectBuffer.floatBuffer(); @@ -121,11 +123,10 @@ private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpF } } - private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight) { + private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; - if (layer == RenderingLayer.BACK) { instanceCount = directedInstanceCounter.unselectedCountToDraw; instancesOffset = undirectedInstanceCounter.totalToDraw(); @@ -138,7 +139,7 @@ private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFlo if (instanceCount > 0) { setupDirectedVertexArrayAttributes(engine); - lineModelDirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight); + lineModelDirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight, globalTime); final FloatBuffer batchUpdateBuffer = attributesDrawBufferBatchOneCopyPerVertexManagedDirectBuffer.floatBuffer(); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java index 36f252e..068a730 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java @@ -16,6 +16,8 @@ import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL15.glGenBuffers; + +import org.gephi.viz.engine.util.TimeUtils; import org.lwjgl.system.MemoryStack; /** @@ -50,7 +52,7 @@ public void update(VizEngine engine, GraphIndexImpl graphIndex) { public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { GraphRenderingOptions renderingOptions = engine.getLookup().lookup(GraphRenderingOptions.class); - + float globalTime = TimeUtils.getFloatSecondGlobalTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final float edgeScale = renderingOptions.getEdgeScale(); float lightenNonSelectedFactor = renderingOptions.getLightenNonSelectedFactor(); @@ -60,11 +62,11 @@ public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFlo final float minWeight = graphIndex.getEdgesMinWeight(); final float maxWeight = graphIndex.getEdgesMaxWeight(); - drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight); - drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight); + drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); + drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); } - private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight) { + private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -81,12 +83,12 @@ private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpF if (instanceCount > 0) { setupUndirectedVertexArrayAttributes(engine); - lineModelUndirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight); + lineModelUndirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight, globalTime); unsetupUndirectedVertexArrayAttributes(); } } - private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight) { + private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -103,7 +105,7 @@ private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFlo if (instanceCount > 0) { setupDirectedVertexArrayAttributes(engine); - lineModelDirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight); + lineModelDirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight, globalTime); unsetupDirectedVertexArrayAttributes(); } } From d562ecf74581b190e1c0be0fc5c5e8e32e5e637e Mon Sep 17 00:00:00 2001 From: totetmatt Date: Tue, 13 Apr 2021 18:07:36 +0200 Subject: [PATCH 3/6] animation state satisfying --- .../viz/engine/status/GraphSelection.java | 2 ++ .../viz/engine/status/GraphSelectionImpl.java | 2 ++ .../org/gephi/viz/engine/util/TimeUtils.java | 22 +++++++++++++++++++ .../util/actions/InputActionsProcessor.java | 5 +++++ .../gephi/viz/engine/util/gl/Constants.java | 3 ++- .../shaders/edge/edge-line-directed.vert | 6 ++++- .../shaders/edge/edge-line-undirected.vert | 6 ++++- .../gephi/viz-engine/shaders/node/node.frag | 5 +---- .../gephi/viz-engine/shaders/node/node.vert | 5 ++++- .../lwjgl/models/EdgeLineModelDirected.java | 6 +++-- .../lwjgl/models/EdgeLineModelUndirected.java | 6 +++-- .../engine/lwjgl/models/NodeDiskModel.java | 8 ++++--- 12 files changed, 61 insertions(+), 15 deletions(-) diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelection.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelection.java index caae5f8..abdf44a 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelection.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelection.java @@ -1,9 +1,11 @@ package org.gephi.viz.engine.status; import java.util.Collection; +import java.util.Optional; import java.util.Set; import org.gephi.graph.api.Edge; import org.gephi.graph.api.Node; +import org.gephi.viz.engine.util.TimeUtils; /** * diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java index e74be6a..6ae3971 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java @@ -7,6 +7,7 @@ import org.gephi.graph.api.Edge; import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; +import org.gephi.viz.engine.util.TimeUtils; public class GraphSelectionImpl implements GraphSelection { @@ -149,4 +150,5 @@ public void removeSelectedEdge(Edge edge) { public void clearSelectedEdges() { this.edges.clear(); } + } diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java index 58dd3fc..710b5e7 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java @@ -1,11 +1,33 @@ package org.gephi.viz.engine.util; +import java.util.Optional; + /** * * @author Eduardo Ramos */ public class TimeUtils { + static Optional ANIMATED_START_TIME = Optional.empty(); + + static public void setAnimatedStartTime() { + if(!ANIMATED_START_TIME.isPresent()){ + ANIMATED_START_TIME = Optional.of(getFloatSecondGlobalTime()); + } + } + static public float getAnimartedStardTime() { + if(ANIMATED_START_TIME.isPresent()) { + return ANIMATED_START_TIME.get(); + } else { + return getFloatSecondGlobalTime(); + } + } + static public void unsetAnimatedStartTime() { + if(ANIMATED_START_TIME.isPresent()){ + ANIMATED_START_TIME = Optional.empty(); + } + } + public static long getTimeMillis() { return System.nanoTime() / 1_000_000; } diff --git a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java index 7cf06d6..5db45ed 100644 --- a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java +++ b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java @@ -12,6 +12,7 @@ import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.status.GraphSelectionNeighbours; import org.gephi.viz.engine.structure.GraphIndex; +import org.gephi.viz.engine.util.TimeUtils; import org.joml.Vector2f; /** @@ -56,10 +57,14 @@ public void selectNodesUnderPosition(Vector2f worldCoords) { selection.setSelectedNode(frontNode); selection.setSelectedEdges(selectedEdges); neighboursSelection.setSelectedNodes(selectedNeighbours); + + TimeUtils.setAnimatedStartTime(); } else { selection.clearSelectedNodes(); selection.clearSelectedEdges(); neighboursSelection.clearSelectedNodes(); + + TimeUtils.unsetAnimatedStartTime(); } } finally { if (iterator.hasNext()) { diff --git a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java index 3bb937c..4b65d2c 100644 --- a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java +++ b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java @@ -43,7 +43,8 @@ public class Constants { public static final String UNIFORM_NAME_BACKGROUND_COLOR = "backgroundColor"; public static final String UNIFORM_NAME_COLOR_LIGHTEN_FACTOR = "colorLightenFactor"; - public static final String UNIFORM_NAME_GLOBAL_TIME_SIZE = "fGlobalTime"; + public static final String UNIFORM_NAME_GLOBAL_TIME = "fGlobalTime"; + public static final String UNIFORM_NAME_GLOBAL_SELECTED_START_TIME = "fSelectedStartGlobalTime"; //Rendering order: public static final int RENDERING_ORDER_NODES = 100; public static final int RENDERING_ORDER_EDGES = 50; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert index 371f619..35a0776 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert @@ -9,6 +9,7 @@ uniform float weightDifferenceDivisor; uniform float edgeScaleMin; uniform float edgeScaleMax; uniform float fGlobalTime; +uniform float fSelectedStartGlobalTime; attribute vec3 vert; attribute vec2 position; @@ -46,8 +47,11 @@ void main() { } color = color / 255.0; + float smoothTransition = smoothstep(0.000,.5,.0001+pow(fGlobalTime - fSelectedStartGlobalTime,.5)); + color.rgb = min(colorBias + color.rgb * colorMultiplier, 1.0); - color.rgb = mix(color.rgb, backgroundColor.rgb, colorLightenFactor); + + color.rgb = mix(color.rgb, backgroundColor.rgb, colorLightenFactor*smoothTransition); fragColor = color; } diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert index 48e57f2..e7e64f0 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert @@ -8,6 +8,7 @@ uniform float weightDifferenceDivisor; uniform float edgeScaleMin; uniform float edgeScaleMax; uniform float fGlobalTime; +uniform float fSelectedStartGlobalTime; attribute vec2 vert; attribute vec2 position; @@ -43,8 +44,11 @@ void main() { } color = color / 255.0; + float smoothTransition = smoothstep(0.001,.005,pow(fGlobalTime - fSelectedStartGlobalTime,.5)); + color.rgb = colorBias + color.rgb * colorMultiplier; - color.rgb = mix(color.rgb, backgroundColor.rgb, colorLightenFactor); + + color.rgb = mix(color.rgb, backgroundColor.rgb, colorLightenFactor*smoothTransition); fragColor = color; } diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag index 5682ffa..c0d2f36 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.frag @@ -8,9 +8,6 @@ uniform float fGlobalTime; varying vec4 fragColor; -mat2 rot(float a){float c=cos(a),s=sin(a);return mat2(c,-s,s,c);} void main() { - vec4 c = fragColor; - c.rg *=rot(fGlobalTime); - gl_FragColor = c; + gl_FragColor = fragColor; } diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert index 4b55ed4..594a9c9 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert @@ -4,6 +4,7 @@ uniform mat4 mvp; uniform vec4 backgroundColor; uniform float colorLightenFactor; uniform float fGlobalTime; +uniform float fSelectedStartGlobalTime; attribute vec2 vert; attribute vec2 position; @@ -21,7 +22,9 @@ void main() { //bgra -> rgba because Java color is argb big-endian vec4 color = elementColor.bgra / 255.0; color.rgb = colorBias + color.rgb * colorMultiplier; - color.rgb = mix(color.rgb, backgroundColor.rgb, colorLightenFactor); + + float smoothTransition = smoothstep(0.000,.5,.0001+pow(fGlobalTime - fSelectedStartGlobalTime,.5)); + color.rgb = mix(color.rgb, backgroundColor.rgb, colorLightenFactor*smoothTransition); fragColor = color; } diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java index 8e2576a..b0c5b96 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java @@ -64,7 +64,8 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX) .addUniformName(UNIFORM_NAME_MIN_WEIGHT) .addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR) - .addUniformName(UNIFORM_NAME_GLOBAL_TIME_SIZE) + .addUniformName(UNIFORM_NAME_GLOBAL_TIME) + .addUniformName(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION) @@ -112,7 +113,8 @@ private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight); - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME_SIZE), globalTime); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME), globalTime); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), TimeUtils.getAnimartedStardTime()); if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java index 0152e33..f403c9c 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java @@ -64,7 +64,8 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_EDGE_SCALE_MAX) .addUniformName(UNIFORM_NAME_MIN_WEIGHT) .addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR) - .addUniformName(UNIFORM_NAME_GLOBAL_TIME_SIZE) + .addUniformName(UNIFORM_NAME_GLOBAL_TIME) + .addUniformName(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION) @@ -114,7 +115,8 @@ private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MIN), EDGE_SCALE_MIN * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight); - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME_SIZE), globalTime); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME), globalTime); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), TimeUtils.getAnimartedStardTime()); if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java index 9eea83b..a351b09 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java @@ -1,6 +1,6 @@ package org.gephi.viz.engine.lwjgl.models; -import java.nio.IntBuffer; +import org.gephi.viz.engine.util.TimeUtils; import org.gephi.viz.engine.util.gl.Constants; import static org.gephi.viz.engine.util.gl.Constants.*; import org.gephi.viz.engine.lwjgl.util.gl.GLShaderProgram; @@ -67,7 +67,8 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_MODEL_VIEW_PROJECTION) .addUniformName(UNIFORM_NAME_BACKGROUND_COLOR) .addUniformName(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR) - .addUniformName(UNIFORM_NAME_GLOBAL_TIME_SIZE) + .addUniformName(UNIFORM_NAME_GLOBAL_TIME) + .addUniformName(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION) @@ -108,7 +109,8 @@ public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float c GL20.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), false, mvpFloats); GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME_SIZE),globalTime); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME),globalTime); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), TimeUtils.getAnimartedStardTime()); } public void stopUsingProgram() { From 2279b1cc3f92b6b0550b11f78b1c4dedff3d85bb Mon Sep 17 00:00:00 2001 From: totetmatt Date: Wed, 14 Apr 2021 14:26:57 +0200 Subject: [PATCH 4/6] Remove static on TimeUtils, now globalTime and selectedTime are part of engine instance --- .../java/org/gephi/viz/engine/VizEngine.java | 41 +++++++++++++++---- .../org/gephi/viz/engine/util/TimeUtils.java | 26 ------------ .../util/actions/InputActionsProcessor.java | 4 -- .../lwjgl/LWJGLRenderingTargetGLFW.java | 33 +++++++-------- .../lwjgl/models/EdgeLineModelDirected.java | 26 +++++++----- .../lwjgl/models/EdgeLineModelUndirected.java | 24 +++++++---- .../engine/lwjgl/models/NodeDiskModel.java | 30 +++++++++----- .../pipeline/arrays/ArrayDrawEdgeData.java | 36 ++++++++-------- .../pipeline/arrays/ArrayDrawNodeData.java | 22 +++++----- .../pipeline/indirect/IndirectNodeData.java | 26 ++++++------ .../pipeline/instanced/InstancedEdgeData.java | 36 ++++++++-------- .../pipeline/instanced/InstancedNodeData.java | 24 +++++------ .../renderers/EdgeRendererInstanced.java | 8 ++-- 13 files changed, 180 insertions(+), 156 deletions(-) diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/VizEngine.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/VizEngine.java index 48ccfe8..f436b38 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/VizEngine.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/VizEngine.java @@ -1,19 +1,14 @@ package org.gephi.viz.engine; import java.awt.Color; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; + +import jdk.nashorn.internal.runtime.options.Option; import org.gephi.graph.api.GraphModel; import org.gephi.graph.api.Rect2D; import org.gephi.viz.engine.pipeline.RenderingLayer; @@ -90,6 +85,36 @@ public class VizEngine { private final InstanceContent instanceContent; private final AbstractLookup lookup; + //Timer + private float globalTime; + private Optional selectedTime = Optional.empty(); + + public float getGlobalTime() { + return globalTime; + } + + public void setGlobalTime(float globalTime) { + this.globalTime = globalTime; + } + + public OptionalgetSelectedTime() { + return selectedTime; + } + + // Update only if empty + // Dev comments : I don't know if it make sense to take what's currently in globalTime ? + public void setSelectedTime() { + if(!this.selectedTime.isPresent()) { + this.selectedTime = Optional.of(globalTime); + } + } + + // Reset selected time + public void unsetSelectedTime() { + this.selectedTime = Optional.empty(); + } + + public VizEngine(GraphModel graphModel, R renderingTarget) { this.graphModel = Objects.requireNonNull(graphModel, "graphModel mandatory"); this.instanceContent = new InstanceContent(); diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java index 710b5e7..0803430 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/util/TimeUtils.java @@ -1,37 +1,11 @@ package org.gephi.viz.engine.util; -import java.util.Optional; - /** * * @author Eduardo Ramos */ public class TimeUtils { - - static Optional ANIMATED_START_TIME = Optional.empty(); - - static public void setAnimatedStartTime() { - if(!ANIMATED_START_TIME.isPresent()){ - ANIMATED_START_TIME = Optional.of(getFloatSecondGlobalTime()); - } - } - static public float getAnimartedStardTime() { - if(ANIMATED_START_TIME.isPresent()) { - return ANIMATED_START_TIME.get(); - } else { - return getFloatSecondGlobalTime(); - } - } - static public void unsetAnimatedStartTime() { - if(ANIMATED_START_TIME.isPresent()){ - ANIMATED_START_TIME = Optional.empty(); - } - } - public static long getTimeMillis() { return System.nanoTime() / 1_000_000; } - public static float getFloatSecondGlobalTime() { - return getTimeMillis() /1000.f; - } } diff --git a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java index 5db45ed..b16c3a9 100644 --- a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java +++ b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java @@ -57,14 +57,10 @@ public void selectNodesUnderPosition(Vector2f worldCoords) { selection.setSelectedNode(frontNode); selection.setSelectedEdges(selectedEdges); neighboursSelection.setSelectedNodes(selectedNeighbours); - - TimeUtils.setAnimatedStartTime(); } else { selection.clearSelectedNodes(); selection.clearSelectedEdges(); neighboursSelection.clearSelectedNodes(); - - TimeUtils.unsetAnimatedStartTime(); } } finally { if (iterator.hasNext()) { diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/LWJGLRenderingTargetGLFW.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/LWJGLRenderingTargetGLFW.java index 618b4f9..728795d 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/LWJGLRenderingTargetGLFW.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/LWJGLRenderingTargetGLFW.java @@ -1,30 +1,18 @@ package org.gephi.viz.engine.lwjgl; import org.gephi.viz.engine.VizEngine; +import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.util.TimeUtils; import org.gephi.viz.engine.util.gl.OpenGLOptions; import org.lwjgl.glfw.GLFW; -import static org.lwjgl.glfw.GLFW.glfwMakeContextCurrent; -import static org.lwjgl.glfw.GLFW.glfwPollEvents; -import static org.lwjgl.glfw.GLFW.glfwSetWindowCloseCallback; -import static org.lwjgl.glfw.GLFW.glfwSetWindowSizeCallback; -import static org.lwjgl.glfw.GLFW.glfwSwapBuffers; -import static org.lwjgl.glfw.GLFW.glfwSwapInterval; -import static org.lwjgl.glfw.GLFW.glfwWindowShouldClose; import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GL11; -import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; -import static org.lwjgl.opengl.GL11.GL_RENDERER; -import static org.lwjgl.opengl.GL11.GL_VENDOR; -import static org.lwjgl.opengl.GL11.GL_VERSION; -import static org.lwjgl.opengl.GL11.glClear; -import static org.lwjgl.opengl.GL11.glClearColor; -import static org.lwjgl.opengl.GL11.glDisable; -import static org.lwjgl.opengl.GL11.glGetString; -import static org.lwjgl.opengl.GL11.glViewport; import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.opengl.GLUtil; +import static org.lwjgl.glfw.GLFW.*; +import static org.lwjgl.opengl.GL11.*; + /** * * @author Eduardo Ramos @@ -133,6 +121,19 @@ public void loop() { glClear(GL_COLOR_BUFFER_BIT); // clear the framebuffer updateFPS(); + + // fGlobalTime for all program of the engine, using glfwGetTime retrive time since started; + engine.setGlobalTime((float) glfwGetTime()); + + // selectedTime for all program of the engine. + GraphSelection selection = engine.getLookup().lookup(GraphSelection.class); + + // A selection is currently active + if(selection.getSelectedNodesCount() > 0){ + engine.setSelectedTime(); + } else { + engine.unsetSelectedTime(); + } engine.display(); glfwSwapBuffers(windowHandle); // swap the color buffers diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java index b0c5b96..d85b7c6 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java @@ -1,14 +1,16 @@ package org.gephi.viz.engine.lwjgl.models; -import org.gephi.viz.engine.util.TimeUtils; -import org.gephi.viz.engine.util.gl.Constants; -import static org.gephi.viz.engine.util.gl.Constants.*; -import org.gephi.viz.engine.util.NumberUtils; import org.gephi.viz.engine.lwjgl.util.gl.GLShaderProgram; +import org.gephi.viz.engine.util.NumberUtils; +import org.gephi.viz.engine.util.gl.Constants; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL42; +import java.util.Optional; + +import static org.gephi.viz.engine.util.gl.Constants.*; + /** * * @author Eduardo Ramos @@ -87,8 +89,8 @@ public void drawArraysMultipleInstance(int drawBatchCount) { GL20.glDrawArrays(GL20.GL_TRIANGLES, 0, VERTEX_COUNT * drawBatchCount); } - public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight, float globalTime) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); + public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime, selectedTime); if (instancesOffset > 0) { GL42.glDrawArraysInstancedBaseInstance(GL20.GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount, instancesOffset); } else { @@ -97,16 +99,16 @@ public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, floa stopUsingProgram(); } - public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { + public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { program.use(); - prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); + prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime, selectedTime); } public void stopUsingProgram() { program.stopUsing(); } - private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { + private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { GL20.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), false, mvpFloats); GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); @@ -114,7 +116,11 @@ private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME), globalTime); - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), TimeUtils.getAnimartedStardTime()); + if(selectedTime.isPresent()){ + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), selectedTime.get()); + } else { + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), -1); + } if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java index f403c9c..4b44d95 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java @@ -1,14 +1,16 @@ package org.gephi.viz.engine.lwjgl.models; import org.gephi.viz.engine.lwjgl.util.gl.GLShaderProgram; -import org.gephi.viz.engine.util.TimeUtils; -import org.gephi.viz.engine.util.gl.Constants; -import static org.gephi.viz.engine.util.gl.Constants.*; import org.gephi.viz.engine.util.NumberUtils; +import org.gephi.viz.engine.util.gl.Constants; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL42; +import java.util.Optional; + +import static org.gephi.viz.engine.util.gl.Constants.*; + /** * * @author Eduardo Ramos @@ -88,8 +90,8 @@ public void drawArraysMultipleInstance(int drawBatchCount) { GL20.glDrawArrays(GL20.GL_TRIANGLES, 0, VERTEX_COUNT * drawBatchCount); } - public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight, float globalTime) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); + public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float scale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime, selectedTime); if (instancesOffset > 0) { GL42.glDrawArraysInstancedBaseInstance(GL20.GL_TRIANGLES, 0, VERTEX_COUNT, instanceCount, instancesOffset); } else { @@ -98,17 +100,17 @@ public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, floa stopUsingProgram(); } - public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { + public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { //Line: program.use(); - prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime); + prepareProgramData(mvpFloats, backgroundColorFloats, colorLightenFactor, scale, minWeight, maxWeight, globalTime, selectedTime); } public void stopUsingProgram() { program.stopUsing(); } - private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime) { + private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float scale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { GL20.glUniformMatrix4fv(program.getUniformLocation(UNIFORM_NAME_MODEL_VIEW_PROJECTION), false, mvpFloats); GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); @@ -116,7 +118,11 @@ private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_EDGE_SCALE_MAX), EDGE_SCALE_MAX * scale); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_MIN_WEIGHT), minWeight); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME), globalTime); - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), TimeUtils.getAnimartedStardTime()); + if(selectedTime.isPresent()){ + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), selectedTime.get()); + } else { + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), -1); + } if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR), 1); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java index a351b09..1a829d8 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java @@ -1,15 +1,17 @@ package org.gephi.viz.engine.lwjgl.models; -import org.gephi.viz.engine.util.TimeUtils; -import org.gephi.viz.engine.util.gl.Constants; -import static org.gephi.viz.engine.util.gl.Constants.*; import org.gephi.viz.engine.lwjgl.util.gl.GLShaderProgram; +import org.gephi.viz.engine.util.gl.Constants; import org.gephi.viz.engine.util.gl.GLConstants; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL31; import org.lwjgl.opengl.GL42; import org.lwjgl.opengl.GL43; +import java.util.Optional; + +import static org.gephi.viz.engine.util.gl.Constants.*; + /** * @author Eduardo Ramos */ @@ -82,8 +84,8 @@ public void drawArraysSingleInstance(int firstVertexIndex, int vertexCount) { GL20.glDrawArrays(GL20.GL_TRIANGLES, firstVertexIndex, vertexCount); } - public void drawInstanced(int vertexOffset, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime); + public void drawInstanced(int vertexOffset, float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime, Optional selectedTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime, selectedTime); if (instancesOffset > 0) { GL42.glDrawArraysInstancedBaseInstance(GL20.GL_TRIANGLES, vertexOffset, vertexCount, instanceCount, instancesOffset); } else { @@ -92,17 +94,17 @@ public void drawInstanced(int vertexOffset, float[] mvpFloats, float[] backgroun stopUsingProgram(); } - public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime) { - drawInstanced(0, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime); + public void drawInstanced(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime, Optional selectedTime) { + drawInstanced(0, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime, selectedTime); } - public void drawIndirect(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime) { - useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime); + public void drawIndirect(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, int instanceCount, int instancesOffset, float globalTime, Optional selectedTime) { + useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime, selectedTime); GL43.glMultiDrawArraysIndirect(GL20.GL_TRIANGLES, instancesOffset * GLConstants.INDIRECT_DRAW_COMMAND_BYTES, instanceCount, GLConstants.INDIRECT_DRAW_COMMAND_BYTES); stopUsingProgram(); } - public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float globalTime) { + public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float colorLightenFactor, float globalTime, Optional selectedTime) { //Circle: program.use(); @@ -110,7 +112,13 @@ public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float c GL20.glUniform4fv(program.getUniformLocation(UNIFORM_NAME_BACKGROUND_COLOR), backgroundColorFloats); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR), colorLightenFactor); GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME),globalTime); - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), TimeUtils.getAnimartedStardTime()); + if(selectedTime.isPresent()){ + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), selectedTime.get()); + } else { + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), -1); + } + + } public void stopUsingProgram() { diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java index 8792545..4db04b2 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawEdgeData.java @@ -1,26 +1,27 @@ package org.gephi.viz.engine.lwjgl.pipeline.arrays; -import java.nio.FloatBuffer; import org.gephi.graph.api.Edge; import org.gephi.graph.api.Graph; import org.gephi.viz.engine.VizEngine; +import org.gephi.viz.engine.lwjgl.models.EdgeLineModelDirected; +import org.gephi.viz.engine.lwjgl.models.EdgeLineModelUndirected; +import org.gephi.viz.engine.lwjgl.pipeline.common.AbstractEdgeData; +import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; +import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; import org.gephi.viz.engine.pipeline.RenderingLayer; import org.gephi.viz.engine.status.GraphRenderingOptions; import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.structure.GraphIndex; import org.gephi.viz.engine.structure.GraphIndexImpl; import org.gephi.viz.engine.util.ArrayUtils; -import org.gephi.viz.engine.lwjgl.models.EdgeLineModelDirected; -import org.gephi.viz.engine.lwjgl.models.EdgeLineModelUndirected; -import org.gephi.viz.engine.lwjgl.pipeline.common.AbstractEdgeData; -import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; -import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; +import org.lwjgl.system.MemoryUtil; + +import java.nio.FloatBuffer; +import java.util.Optional; + import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL15.glGenBuffers; -import org.gephi.viz.engine.util.TimeUtils; -import org.lwjgl.system.MemoryUtil; - /** * * @author Eduardo Ramos @@ -53,7 +54,10 @@ public void update(VizEngine engine, GraphIndexImpl graphIndex) { public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { final GraphRenderingOptions renderingOptions = engine.getLookup().lookup(GraphRenderingOptions.class); - float globalTime = TimeUtils.getFloatSecondGlobalTime(); + + float globalTime = engine.getGlobalTime(); + Optional selectedTime = engine.getSelectedTime(); + final float[] backgroundColorFloats = engine.getBackgroundColor(); final float edgeScale = renderingOptions.getEdgeScale(); float lightenNonSelectedFactor = renderingOptions.getLightenNonSelectedFactor(); @@ -63,11 +67,11 @@ public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats final float minWeight = graphIndex.getEdgesMinWeight(); final float maxWeight = graphIndex.getEdgesMaxWeight(); - drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); - drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); + drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime, selectedTime); + drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime, selectedTime); } - private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { + private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -84,7 +88,7 @@ private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpF if (instanceCount > 0) { setupUndirectedVertexArrayAttributes(engine); - lineModelUndirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight, globalTime); + lineModelUndirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight, globalTime, selectedTime); final FloatBuffer batchUpdateBuffer = attributesDrawBufferBatchOneCopyPerVertexManagedDirectBuffer.floatBuffer(); @@ -123,7 +127,7 @@ private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpF } } - private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { + private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -139,7 +143,7 @@ private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFlo if (instanceCount > 0) { setupDirectedVertexArrayAttributes(engine); - lineModelDirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight, globalTime); + lineModelDirected.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, edgeScale, minWeight, maxWeight, globalTime, selectedTime); final FloatBuffer batchUpdateBuffer = attributesDrawBufferBatchOneCopyPerVertexManagedDirectBuffer.floatBuffer(); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java index be9df06..2f65d0c 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/arrays/ArrayDrawNodeData.java @@ -1,8 +1,5 @@ package org.gephi.viz.engine.lwjgl.pipeline.arrays; -import java.nio.FloatBuffer; -import java.time.ZonedDateTime; - import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; import org.gephi.viz.engine.lwjgl.models.NodeDiskModel; @@ -15,15 +12,14 @@ import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.status.GraphSelectionNeighbours; import org.gephi.viz.engine.structure.GraphIndexImpl; +import org.lwjgl.system.MemoryStack; + +import java.nio.FloatBuffer; +import java.util.Optional; + import static org.gephi.viz.engine.util.gl.Constants.*; import static org.lwjgl.opengl.GL11.GL_FLOAT; -import static org.lwjgl.opengl.GL20.glGenBuffers; -import static org.lwjgl.opengl.GL20.glVertexAttrib1f; -import static org.lwjgl.opengl.GL20.glVertexAttrib4f; -import static org.lwjgl.opengl.GL20.glVertexAttrib2fv; - -import org.gephi.viz.engine.util.TimeUtils; -import org.lwjgl.system.MemoryStack; +import static org.lwjgl.opengl.GL20.*; /** * @@ -79,7 +75,9 @@ public void update(VizEngine engine, GraphIndexImpl spatialIndex) { } public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { - final float globalTime = TimeUtils.getFloatSecondGlobalTime(); + float globalTime = engine.getGlobalTime(); + Optional selectedTime = engine.getSelectedTime(); + final float[] backgroundColorFloats = engine.getBackgroundColor(); final float zoom = engine.getZoom(); @@ -99,7 +97,7 @@ public void drawArrays(RenderingLayer layer, VizEngine engine, float[] mvpFloats if (instanceCount > 0) { setupVertexArrayAttributes(engine); - diskModel64.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime); + diskModel64.useProgram(mvpFloats, backgroundColorFloats, colorLightenFactor, globalTime, selectedTime); final float[] attrs = new float[ATTRIBS_STRIDE]; int index = instancesOffset * ATTRIBS_STRIDE; diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java index 87dc4d4..82d2070 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/indirect/IndirectNodeData.java @@ -1,32 +1,31 @@ package org.gephi.viz.engine.lwjgl.pipeline.indirect; -import java.nio.FloatBuffer; -import java.nio.IntBuffer; -import java.time.ZonedDateTime; - import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; import org.gephi.viz.engine.lwjgl.models.NodeDiskModel; -import org.gephi.viz.engine.pipeline.RenderingLayer; import org.gephi.viz.engine.lwjgl.pipeline.common.AbstractNodeData; import org.gephi.viz.engine.lwjgl.util.gl.GLBuffer; import org.gephi.viz.engine.lwjgl.util.gl.GLBufferImmutable; +import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; +import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; +import org.gephi.viz.engine.pipeline.RenderingLayer; import org.gephi.viz.engine.pipeline.common.InstanceCounter; import org.gephi.viz.engine.status.GraphRenderingOptions; import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.status.GraphSelectionNeighbours; import org.gephi.viz.engine.structure.GraphIndexImpl; -import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; -import static org.gephi.viz.engine.util.gl.GLConstants.INDIRECT_DRAW_COMMAND_INTS_COUNT; -import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; +import org.lwjgl.system.MemoryStack; + +import java.nio.FloatBuffer; +import java.nio.IntBuffer; +import java.util.Optional; + import static org.gephi.viz.engine.util.gl.GLConstants.INDIRECT_DRAW_COMMAND_BYTES; +import static org.gephi.viz.engine.util.gl.GLConstants.INDIRECT_DRAW_COMMAND_INTS_COUNT; import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; import static org.lwjgl.opengl.GL20.glGenBuffers; -import org.gephi.viz.engine.util.TimeUtils; -import org.lwjgl.system.MemoryStack; - /** * * @author Eduardo Ramos @@ -89,7 +88,8 @@ public void update(VizEngine engine, GraphIndexImpl spatialIndex) { } public void drawIndirect(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { - final float globalTime = TimeUtils.getFloatSecondGlobalTime(); + float globalTime = engine.getGlobalTime(); + Optional selectedTime = engine.getSelectedTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final int instanceCount; @@ -110,7 +110,7 @@ public void drawIndirect(RenderingLayer layer, VizEngine engine, float[] mvpFloa setupVertexArrayAttributes(engine); commandsGLBuffer.bind(); - diskModel64.drawIndirect(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime); + diskModel64.drawIndirect(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime, selectedTime); commandsGLBuffer.unbind(); unsetupVertexArrayAttributes(); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java index 068a730..c55b0bb 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedEdgeData.java @@ -1,25 +1,26 @@ package org.gephi.viz.engine.lwjgl.pipeline.instanced; -import java.nio.FloatBuffer; import org.gephi.graph.api.Edge; import org.gephi.graph.api.Graph; import org.gephi.viz.engine.VizEngine; -import org.gephi.viz.engine.pipeline.RenderingLayer; -import org.gephi.viz.engine.status.GraphRenderingOptions; -import org.gephi.viz.engine.status.GraphSelection; -import org.gephi.viz.engine.structure.GraphIndex; -import org.gephi.viz.engine.structure.GraphIndexImpl; import org.gephi.viz.engine.lwjgl.models.EdgeLineModelDirected; import org.gephi.viz.engine.lwjgl.models.EdgeLineModelUndirected; import org.gephi.viz.engine.lwjgl.pipeline.common.AbstractEdgeData; import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; +import org.gephi.viz.engine.pipeline.RenderingLayer; +import org.gephi.viz.engine.status.GraphRenderingOptions; +import org.gephi.viz.engine.status.GraphSelection; +import org.gephi.viz.engine.structure.GraphIndex; +import org.gephi.viz.engine.structure.GraphIndexImpl; +import org.lwjgl.system.MemoryStack; + +import java.nio.FloatBuffer; +import java.util.Optional; + import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL15.glGenBuffers; -import org.gephi.viz.engine.util.TimeUtils; -import org.lwjgl.system.MemoryStack; - /** * * @author Eduardo Ramos @@ -52,7 +53,10 @@ public void update(VizEngine engine, GraphIndexImpl graphIndex) { public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { GraphRenderingOptions renderingOptions = engine.getLookup().lookup(GraphRenderingOptions.class); - float globalTime = TimeUtils.getFloatSecondGlobalTime(); + + float globalTime = engine.getGlobalTime(); + Optional selectedTime = engine.getSelectedTime(); + final float[] backgroundColorFloats = engine.getBackgroundColor(); final float edgeScale = renderingOptions.getEdgeScale(); float lightenNonSelectedFactor = renderingOptions.getLightenNonSelectedFactor(); @@ -62,11 +66,11 @@ public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFlo final float minWeight = graphIndex.getEdgesMinWeight(); final float maxWeight = graphIndex.getEdgesMaxWeight(); - drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); - drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime); + drawUndirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime, selectedTime); + drawDirected(engine, layer, mvpFloats, backgroundColorFloats, lightenNonSelectedFactor, edgeScale, minWeight, maxWeight, globalTime, selectedTime); } - private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { + private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -83,12 +87,12 @@ private void drawUndirected(VizEngine engine, RenderingLayer layer, float[] mvpF if (instanceCount > 0) { setupUndirectedVertexArrayAttributes(engine); - lineModelUndirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight, globalTime); + lineModelUndirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight, globalTime, selectedTime); unsetupUndirectedVertexArrayAttributes(); } } - private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime) { + private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFloats, float[] backgroundColorFloats, float lightenNonSelectedFactor, float edgeScale, float minWeight, float maxWeight, float globalTime, Optional selectedTime) { final int instanceCount; final int instancesOffset; final float colorLightenFactor; @@ -105,7 +109,7 @@ private void drawDirected(VizEngine engine, RenderingLayer layer, float[] mvpFlo if (instanceCount > 0) { setupDirectedVertexArrayAttributes(engine); - lineModelDirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight, globalTime); + lineModelDirected.drawInstanced(mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, edgeScale, minWeight, maxWeight, globalTime, selectedTime); unsetupDirectedVertexArrayAttributes(); } } diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java index 234747e..ede03b6 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/InstancedNodeData.java @@ -1,26 +1,25 @@ package org.gephi.viz.engine.lwjgl.pipeline.instanced; -import java.nio.FloatBuffer; -import java.time.ZonedDateTime; - import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; +import org.gephi.viz.engine.lwjgl.models.NodeDiskModel; +import org.gephi.viz.engine.lwjgl.pipeline.common.AbstractNodeData; +import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; +import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; import org.gephi.viz.engine.pipeline.RenderingLayer; import org.gephi.viz.engine.pipeline.common.InstanceCounter; import org.gephi.viz.engine.status.GraphRenderingOptions; import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.status.GraphSelectionNeighbours; import org.gephi.viz.engine.structure.GraphIndexImpl; -import org.gephi.viz.engine.lwjgl.models.NodeDiskModel; -import org.gephi.viz.engine.lwjgl.pipeline.common.AbstractNodeData; -import org.gephi.viz.engine.lwjgl.util.gl.GLBufferMutable; -import org.gephi.viz.engine.lwjgl.util.gl.ManagedDirectBuffer; +import org.lwjgl.system.MemoryStack; + +import java.nio.FloatBuffer; +import java.util.Optional; + import static org.lwjgl.opengl.GL11.GL_FLOAT; import static org.lwjgl.opengl.GL20.glGenBuffers; -import org.gephi.viz.engine.util.TimeUtils; -import org.lwjgl.system.MemoryStack; - /** * * @author Eduardo Ramos @@ -77,7 +76,8 @@ public void update(VizEngine engine, GraphIndexImpl spatialIndex) { } public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFloats) { - final float globalTime = TimeUtils.getFloatSecondGlobalTime(); + float globalTime = engine.getGlobalTime(); + Optional selectedTime = engine.getSelectedTime(); final float[] backgroundColorFloats = engine.getBackgroundColor(); final float zoom = engine.getZoom(); @@ -115,7 +115,7 @@ public void drawInstanced(RenderingLayer layer, VizEngine engine, float[] mvpFlo } setupVertexArrayAttributes(engine); - diskModelToRender.drawInstanced(firstVertex, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime); + diskModelToRender.drawInstanced(firstVertex, mvpFloats, backgroundColorFloats, colorLightenFactor, instanceCount, instancesOffset, globalTime, selectedTime); unsetupVertexArrayAttributes(); } } diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java index e9af743..c0bc0cd 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java @@ -1,15 +1,16 @@ package org.gephi.viz.engine.lwjgl.pipeline.instanced.renderers; -import java.util.EnumSet; import org.gephi.viz.engine.VizEngine; import org.gephi.viz.engine.lwjgl.LWJGLRenderingTarget; -import org.gephi.viz.engine.pipeline.PipelineCategory; -import org.gephi.viz.engine.pipeline.RenderingLayer; import org.gephi.viz.engine.lwjgl.availability.InstancedDraw; import org.gephi.viz.engine.lwjgl.pipeline.instanced.InstancedEdgeData; +import org.gephi.viz.engine.pipeline.PipelineCategory; +import org.gephi.viz.engine.pipeline.RenderingLayer; import org.gephi.viz.engine.spi.Renderer; import org.gephi.viz.engine.util.gl.Constants; +import java.util.EnumSet; + /** * TODO: self loops * @@ -40,6 +41,7 @@ public void worldUpdated(LWJGLRenderingTarget target) { @Override public void render(LWJGLRenderingTarget target, RenderingLayer layer) { engine.getModelViewProjectionMatrixFloats(mvpFloats); + edgeData.drawInstanced( layer, engine, mvpFloats From 9306ef51aa3c852bb1ccfc4bbab55e03defebe7d Mon Sep 17 00:00:00 2001 From: totetmatt Date: Wed, 14 Apr 2021 14:32:50 +0200 Subject: [PATCH 5/6] format --- .../java/org/gephi/viz/engine/status/GraphSelectionImpl.java | 2 -- .../gephi/viz/engine/util/actions/InputActionsProcessor.java | 1 - .../pipeline/instanced/renderers/EdgeRendererInstanced.java | 1 - 3 files changed, 4 deletions(-) diff --git a/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java b/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java index 6ae3971..e74be6a 100644 --- a/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java +++ b/modules/engine-core/src/main/java/org/gephi/viz/engine/status/GraphSelectionImpl.java @@ -7,7 +7,6 @@ import org.gephi.graph.api.Edge; import org.gephi.graph.api.Node; import org.gephi.viz.engine.VizEngine; -import org.gephi.viz.engine.util.TimeUtils; public class GraphSelectionImpl implements GraphSelection { @@ -150,5 +149,4 @@ public void removeSelectedEdge(Edge edge) { public void clearSelectedEdges() { this.edges.clear(); } - } diff --git a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java index b16c3a9..7cf06d6 100644 --- a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java +++ b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/actions/InputActionsProcessor.java @@ -12,7 +12,6 @@ import org.gephi.viz.engine.status.GraphSelection; import org.gephi.viz.engine.status.GraphSelectionNeighbours; import org.gephi.viz.engine.structure.GraphIndex; -import org.gephi.viz.engine.util.TimeUtils; import org.joml.Vector2f; /** diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java index c0bc0cd..51426b1 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/pipeline/instanced/renderers/EdgeRendererInstanced.java @@ -41,7 +41,6 @@ public void worldUpdated(LWJGLRenderingTarget target) { @Override public void render(LWJGLRenderingTarget target, RenderingLayer layer) { engine.getModelViewProjectionMatrixFloats(mvpFloats); - edgeData.drawInstanced( layer, engine, mvpFloats From a17ef212e1ccbd7c588e9a5a0571b17a6af28291 Mon Sep 17 00:00:00 2001 From: totetmatt Date: Wed, 14 Apr 2021 14:58:12 +0200 Subject: [PATCH 6/6] changing default value when non selected to 0. Adding uniform boolean for selection to facilitate the shader code --- .../main/java/org/gephi/viz/engine/util/gl/Constants.java | 1 + .../gephi/viz-engine/shaders/edge/edge-line-directed.vert | 1 + .../gephi/viz-engine/shaders/edge/edge-line-undirected.vert | 1 + .../resources/org/gephi/viz-engine/shaders/node/node.vert | 3 ++- .../gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java | 5 ++++- .../viz/engine/lwjgl/models/EdgeLineModelUndirected.java | 5 ++++- .../org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java | 5 ++++- 7 files changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java index 4b65d2c..dc512da 100644 --- a/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java +++ b/modules/opengl-commons/src/main/java/org/gephi/viz/engine/util/gl/Constants.java @@ -45,6 +45,7 @@ public class Constants { public static final String UNIFORM_NAME_GLOBAL_TIME = "fGlobalTime"; public static final String UNIFORM_NAME_GLOBAL_SELECTED_START_TIME = "fSelectedStartGlobalTime"; + public static final String UNIFORM_NAME_IS_SELECTION_ON = "bIsSelectionOn"; //Rendering order: public static final int RENDERING_ORDER_NODES = 100; public static final int RENDERING_ORDER_EDGES = 50; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert index 35a0776..f730f6f 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-directed.vert @@ -10,6 +10,7 @@ uniform float edgeScaleMin; uniform float edgeScaleMax; uniform float fGlobalTime; uniform float fSelectedStartGlobalTime; +uniform bool bIsSelectionOn; attribute vec3 vert; attribute vec2 position; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert index e7e64f0..dcfe3ab 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/edge/edge-line-undirected.vert @@ -9,6 +9,7 @@ uniform float edgeScaleMin; uniform float edgeScaleMax; uniform float fGlobalTime; uniform float fSelectedStartGlobalTime; +uniform bool bIsSelectionOn; attribute vec2 vert; attribute vec2 position; diff --git a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert index 594a9c9..24d07ea 100644 --- a/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert +++ b/modules/opengl-commons/src/main/resources/org/gephi/viz-engine/shaders/node/node.vert @@ -5,6 +5,7 @@ uniform vec4 backgroundColor; uniform float colorLightenFactor; uniform float fGlobalTime; uniform float fSelectedStartGlobalTime; +uniform bool bIsSelectionOn; attribute vec2 vert; attribute vec2 position; @@ -15,7 +16,7 @@ attribute float size; varying vec4 fragColor; -void main() { +void main() { vec2 instancePosition = size * vert + position; gl_Position = mvp * vec4(instancePosition, 0.0, 1.0); diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java index d85b7c6..110f999 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelDirected.java @@ -68,6 +68,7 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR) .addUniformName(UNIFORM_NAME_GLOBAL_TIME) .addUniformName(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME) + .addUniformName(UNIFORM_NAME_IS_SELECTION_ON) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION) @@ -118,8 +119,10 @@ private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME), globalTime); if(selectedTime.isPresent()){ GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), selectedTime.get()); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_IS_SELECTION_ON), selectedTime.get()); } else { - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), -1); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), 0); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_IS_SELECTION_ON), 0); } if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java index 4b44d95..2baf4d5 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/EdgeLineModelUndirected.java @@ -68,6 +68,7 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_WEIGHT_DIFFERENCE_DIVISOR) .addUniformName(UNIFORM_NAME_GLOBAL_TIME) .addUniformName(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME) + .addUniformName(UNIFORM_NAME_IS_SELECTION_ON) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION_TARGET, SHADER_POSITION_TARGET_LOCATION) @@ -120,8 +121,10 @@ private void prepareProgramData(float[] mvpFloats, float[] backgroundColorFloats GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME), globalTime); if(selectedTime.isPresent()){ GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), selectedTime.get()); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_IS_SELECTION_ON), selectedTime.get()); } else { - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), -1); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), 0); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_IS_SELECTION_ON), 0); } if (NumberUtils.equalsEpsilon(minWeight, maxWeight, 1e-3f)) { diff --git a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java index 1a829d8..ad47865 100644 --- a/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java +++ b/modules/opengl-lwjgl/src/main/java/org/gephi/viz/engine/lwjgl/models/NodeDiskModel.java @@ -71,6 +71,7 @@ private void initProgram() { .addUniformName(UNIFORM_NAME_COLOR_LIGHTEN_FACTOR) .addUniformName(UNIFORM_NAME_GLOBAL_TIME) .addUniformName(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME) + .addUniformName(UNIFORM_NAME_IS_SELECTION_ON) .addAttribLocation(ATTRIB_NAME_VERT, SHADER_VERT_LOCATION) .addAttribLocation(ATTRIB_NAME_POSITION, SHADER_POSITION_LOCATION) .addAttribLocation(ATTRIB_NAME_COLOR, SHADER_COLOR_LOCATION) @@ -114,8 +115,10 @@ public void useProgram(float[] mvpFloats, float[] backgroundColorFloats, float c GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_TIME),globalTime); if(selectedTime.isPresent()){ GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), selectedTime.get()); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_IS_SELECTION_ON), selectedTime.get()); } else { - GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), -1); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_GLOBAL_SELECTED_START_TIME), 0); + GL20.glUniform1f(program.getUniformLocation(UNIFORM_NAME_IS_SELECTION_ON), 0); }