Skip to content
Snippets Groups Projects
Commit 520111ff authored by Michael Heyde's avatar Michael Heyde
Browse files

fixed several timing problems

parent e05954d8
No related branches found
No related tags found
No related merge requests found
......@@ -35,7 +35,7 @@ public class BigDataViewerAdapter {
* @param manager
*/
public static synchronized void connect(final BigDataViewer bdv,final VolumeDataManager manager){
updateData(bdv,manager);
//updateData(bdv,manager);
//updatedTestData(manager);
bdv.getViewer().addRenderTransformListener(new TransformListener<AffineTransform3D>() {
......
......@@ -173,9 +173,7 @@ public class InteraktionAnimator {
renderer.setDrawRect(hullVolume);
for(int i =0; i < partialVolumesInHullVolume.size(); i++){
manager.forceVolumeUpdate(i, time, partialVolumesInHullVolume.get(i));
}
manager.volumeUpdateTransaction( time, partialVolumesInHullVolume);
renderWindow.getScene().getCamera().centerOnBox(hullVolume,renderer.getSlice2Dplane());
renderWindow.getGlCanvas().repaint();
......
......@@ -11,14 +11,18 @@ import static bdv.jogl.VolumeRenderer.utils.VolumeDataUtils.createVolumeTexture;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import bdv.jogl.VolumeRenderer.Scene.Texture;
import bdv.jogl.VolumeRenderer.ShaderPrograms.MultiVolumeRenderer;
import bdv.jogl.VolumeRenderer.utils.CurvatureContainer;
import bdv.jogl.VolumeRenderer.utils.IVolumeDataManagerListener;
import bdv.jogl.VolumeRenderer.utils.VolumeDataBlock;
import bdv.jogl.VolumeRenderer.utils.VolumeDataManager;
import bdv.jogl.VolumeRenderer.utils.VolumeDataManagerAdapter;
import com.jogamp.common.nio.Buffers;
import com.jogamp.opengl.GL4;
......@@ -30,20 +34,25 @@ import com.jogamp.opengl.GL4;
*/
public class MaxCurvatureDifference extends AbstractVolumeAccumulator {
public MaxCurvatureDifference() {
super("curvature_difference");
super("difference_total_curvature");
}
private boolean needsReset = true;
private final Map<Integer, Texture> curvatureTexture = new HashMap<Integer, Texture>();
private final Map<Integer, CurvatureContainer> evaluatedCurvatures = new HashMap<Integer, CurvatureContainer>();
private final static String suvCurvatureTexture = "inCurvatureTexture";
private final static String suvCurvatureMax = "inCurvatureMax";
private final static String suvCurvatureMin = "inCurvatureMin";
private final Object mutex = new Object();
private final Set<Integer> needsUpdate = new HashSet<Integer>();
@Override
public void init(GL4 gl) {
getParent().mapUniforms(gl,new String[]{suvCurvatureTexture});
......@@ -61,38 +70,43 @@ public class MaxCurvatureDifference extends AbstractVolumeAccumulator {
evaluatedCurvatures.clear();
super.disposeGL(gl2);
}
@Override
public void updateData(GL4 gl) {
VolumeDataManager dataManager = getParent().getDataManager();
float globalMin = Float.MAX_VALUE;
float globalMax = Float.MIN_VALUE;
//create and update laplace textures
for(Integer key:dataManager.getVolumeKeys()){
VolumeDataBlock data = dataManager.getVolume(key);
Texture t;
//create texture objects
if(!curvatureTexture.containsKey(key)||needsReset){
t = createVolumeTexture(gl, getParent().getArrayEntryLocation(gl, suvCurvatureTexture,key)) ;
curvatureTexture.put(key, t);
}
t = curvatureTexture.get(key);
//update laplacians
if(data.needsUpdate()||!evaluatedCurvatures.containsKey(key)||needsReset){
CurvatureContainer container = calculateCurvatureOfVolume(data);
evaluatedCurvatures.put(key,container);
//fill textures
FloatBuffer buffer = Buffers.newDirectFloatBuffer(container.valueMesh3d);
t.update(gl, 0, buffer, container.dimension);
synchronized (mutex) {
//update laplacians
if(this.needsUpdate.contains(key)||!evaluatedCurvatures.containsKey(key)||needsReset){
CurvatureContainer container = calculateCurvatureOfVolume(data);
evaluatedCurvatures.put(key,container);
//fill textures
FloatBuffer buffer = Buffers.newDirectFloatBuffer(container.valueMesh3d);
t.update(gl, 0, buffer, container.dimension);
}
this.needsUpdate.remove(key);
}
CurvatureContainer tmp = evaluatedCurvatures.get(key);
//get global min max value of laplace
globalMax = Math.max(globalMax, tmp.maxValue);
globalMin = Math.min(globalMin, tmp.minValue);
......@@ -100,19 +114,32 @@ public class MaxCurvatureDifference extends AbstractVolumeAccumulator {
//update globals
gl.glUniform1f(getParent().getLocation(suvCurvatureMin), globalMin);
gl.glUniform1f(getParent().getLocation(suvCurvatureMax), globalMax);
needsReset = false;
super.updateData(gl);
}
@Override
public void setParent(MultiVolumeRenderer parent) {
needsReset = true;
if(!parent.equals(super.getParent())){
parent.getDataManager().addVolumeDataManagerListener(new VolumeDataManagerAdapter() {
@Override
public void dataUpdated(Integer i) {
synchronized (mutex) {
needsUpdate.add(i);
}
}
});
}
super.setParent(parent);
}
@Override
public String[] declaration() {
List<String> code = new ArrayList<String>();
......
......@@ -3,8 +3,10 @@ package bdv.jogl.VolumeRenderer.ShaderPrograms.ShaderSources.functions.accumulat
import java.nio.FloatBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.jogamp.common.nio.Buffers;
import com.jogamp.opengl.GL4;
......@@ -14,6 +16,7 @@ import bdv.jogl.VolumeRenderer.ShaderPrograms.MultiVolumeRenderer;
import bdv.jogl.VolumeRenderer.utils.LaplaceContainer;
import bdv.jogl.VolumeRenderer.utils.VolumeDataBlock;
import bdv.jogl.VolumeRenderer.utils.VolumeDataManager;
import bdv.jogl.VolumeRenderer.utils.VolumeDataManagerAdapter;
import static bdv.jogl.VolumeRenderer.ShaderPrograms.ShaderSources.MultiVolumeRendererShaderSource.*;
import static bdv.jogl.VolumeRenderer.utils.ShaderSourceUtil.addCodeArrayToList;
import static bdv.jogl.VolumeRenderer.utils.ShaderSourceUtil.appendNewLines;
......@@ -30,19 +33,23 @@ public class SharpnessVolumeAccumulator extends AbstractVolumeAccumulator {
public SharpnessVolumeAccumulator() {
super("sharpness_weight");
}
Map<Integer, LaplaceContainer> evalueatedLaplacians = new HashMap<Integer, LaplaceContainer>();
Map<Integer, Texture> laplacianTextures = new HashMap<Integer, Texture>();
private final static String suvLaplaceTextures = "inLaplaceTextures";
private final static String suvLaplaceMinValue = "intLaplaceMin";
private final static String suvLaplaceMaxValue = "intLaplaceMax";
boolean needsReset = false;
private final Object mutex = new Object();
private final Set<Integer> needsUpdate = new HashSet<Integer>();
@Override
public String[] declaration() {
List<String> code = new ArrayList<String>();
......@@ -90,7 +97,7 @@ public class SharpnessVolumeAccumulator extends AbstractVolumeAccumulator {
appendNewLines(codeArray);
return codeArray;
}
@Override
public void init(GL4 gl) {
getParent().mapUniforms(gl,new String[]{suvLaplaceTextures});
......@@ -108,38 +115,43 @@ public class SharpnessVolumeAccumulator extends AbstractVolumeAccumulator {
evalueatedLaplacians.clear();
super.disposeGL(gl2);
}
@Override
public void updateData(GL4 gl) {
VolumeDataManager dataManager = getParent().getDataManager();
float globalMin = Float.MAX_VALUE;
float globalMax = Float.MIN_VALUE;
//create and update laplace textures
for(Integer key:dataManager.getVolumeKeys()){
VolumeDataBlock data = dataManager.getVolume(key);
Texture t;
//create texture objects
if(!laplacianTextures.containsKey(key)||needsReset){
t = createVolumeTexture(gl, getParent().getArrayEntryLocation(gl, suvLaplaceTextures,key)) ;
laplacianTextures.put(key, t);
}
t = laplacianTextures.get(key);
//update laplacians
if(data.needsUpdate()||!evalueatedLaplacians.containsKey(key)||needsReset){
LaplaceContainer container = calulateLablacianSimple(data);
evalueatedLaplacians.put(key,container);
//fill textures
FloatBuffer buffer = Buffers.newDirectFloatBuffer(container.valueMesh3d);
t.update(gl, 0, buffer, container.dimension);
synchronized (mutex) {
//update laplacians
if(this.needsUpdate.contains(key)||!evalueatedLaplacians.containsKey(key)||needsReset){
LaplaceContainer container = calulateLablacianSimple(data);
evalueatedLaplacians.put(key,container);
//fill textures
FloatBuffer buffer = Buffers.newDirectFloatBuffer(container.valueMesh3d);
t.update(gl, 0, buffer, container.dimension);
}
this.needsUpdate.remove(key);
}
LaplaceContainer tmp = evalueatedLaplacians.get(key);
//get global min max value of laplace
globalMax = Math.max(globalMax, tmp.maxValue);
globalMin = Math.min(globalMin, tmp.minValue);
......@@ -147,16 +159,28 @@ public class SharpnessVolumeAccumulator extends AbstractVolumeAccumulator {
//update globals
gl.glUniform1f(getParent().getLocation(suvLaplaceMinValue), globalMin);
gl.glUniform1f(getParent().getLocation(suvLaplaceMaxValue), globalMax);
needsReset = false;
super.updateData(gl);
}
@Override
public void setParent(MultiVolumeRenderer parent) {
needsReset = true;
if(!parent.equals(super.getParent())){
parent.getDataManager().addVolumeDataManagerListener(new VolumeDataManagerAdapter() {
@Override
public void dataUpdated(Integer i) {
synchronized (mutex) {
needsUpdate.add(i);
}
}
});
}
super.setParent(parent);
}
}
......
......@@ -107,8 +107,9 @@ public class VolumeRendererExtension {
selector = new BigDataViewerDataSelector(bdv);
sampleController = new VolumeRendereSampleController(glWindow, controls.getSamplesSpinner(), volumeRenderer,64);
animator = new InteraktionAnimator(volumeRenderer, glWindow, dataManager,controls,sampleController);
createActionInToolBar();
createListeners();
createActionInToolBar();
}
......@@ -185,21 +186,7 @@ public class VolumeRendererExtension {
}
});
//listener on new selected data
selector.addBigDataViewerDataSelectorListener(new IBigDataViewerDataSelectorListener() {
@Override
public void selectedDataAvailable(AABBox hullVolume,
List<VolumeDataBlock> partialVolumesInHullVolume, int time) {
resetToFullView();
animator.startMoveToSelectionAnimation(hullVolume, partialVolumesInHullVolume, time);
controls.setVisible(true);
glWindow.setVisible(true);
}
});
//update seletor sizes
......@@ -256,6 +243,22 @@ public class VolumeRendererExtension {
sampleController.downSample();
}
});
//listener on new selected data
selector.addBigDataViewerDataSelectorListener(new IBigDataViewerDataSelectorListener() {
@Override
public void selectedDataAvailable(AABBox hullVolume,
List<VolumeDataBlock> partialVolumesInHullVolume, int time) {
resetToFullView();
animator.startMoveToSelectionAnimation(hullVolume, partialVolumesInHullVolume, time);
controls.setVisible(true);
glWindow.setVisible(true);
}
});
}
private void updateDownSamplerSize() {
......
......@@ -117,21 +117,29 @@ public class VolumeDataManager {
return volumes.get(i);
}
public void forceVolumeUpdate(Integer i, int time, VolumeDataBlock data){
boolean isAllreadyPresent = volumes.containsKey(i);
public void volumeUpdateTransaction(int time, List<VolumeDataBlock> data){
List<Boolean> wasPresent = new ArrayList<Boolean>();
if(time != this.currentTime){
currentTime = time;
}
}
volumes.put(i, data);
timestamps.put(i, time);
enabled.put(i, true);
updateGlobals();
if(!isAllreadyPresent){
fireAllAddedData(i);
for(int key =0; key < data.size();key++){
VolumeDataBlock volume = data.get(key);
wasPresent.add( volumes.containsKey(key));
volumes.put(key, volume);
timestamps.put(key, time);
enabled.put(key, true);
updateGlobals();
}
fireAllUpdatedData(i);
//end of transaction inform all listeners
for(int key =0; key < data.size();key++){
if(!wasPresent.get(key)){
fireAllAddedData(key);
}
fireAllUpdatedData(key);
}
}
public void setVolume(Integer i, int time , VolumeDataBlock data){
......@@ -226,6 +234,7 @@ public class VolumeDataManager {
ViewerState state = bdv.getViewer().getState();
List<SourceState<?>> sources = state.getSources();
int currentTimepoint = state.getCurrentTimepoint();
List<VolumeDataBlock> data = new ArrayList<VolumeDataBlock>();
int i =-1;
......@@ -235,11 +244,11 @@ public class VolumeDataManager {
//block transform
int midMapLevel = source.getSpimSource().getNumMipmapLevels()-1;
VolumeDataBlock data = getDataBlock(bdv,new AABBox(new float[]{0,0,0,0},new float[]{Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE}),i,midMapLevel);
forceVolumeUpdate(i,currentTimepoint, data);
data.add( getDataBlock(bdv,new AABBox(new float[]{0,0,0,0},new float[]{Float.MAX_VALUE,Float.MAX_VALUE,Float.MAX_VALUE}),i,midMapLevel));
}
volumeUpdateTransaction(currentTimepoint, data);
}
public float getGlobalLowestVolumeValue() {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment