From 0797b5b3c9f796c5ef9aab2f82a7853395c23b2a Mon Sep 17 00:00:00 2001
From: Florent Berthaut <florent.berthaut@univ-lille.fr>
Date: Wed, 20 Mar 2024 16:07:36 +0100
Subject: [PATCH] Fix audio uniforms

---
 src/audio/AudioManager.cpp      |  184 ++---
 src/modules/ProjectorModule.cpp | 1186 +++++++++++++++----------------
 src/shaders/render43.fs         |  994 +++++++++++++-------------
 3 files changed, 1182 insertions(+), 1182 deletions(-)

diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index 05ad254..a565d93 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -24,7 +24,7 @@
 
 void* audioThreadFunction(void* pvParam) {
     AudioManager *pThis=(AudioManager*)pvParam;
-	pThis->startStream();
+    pThis->startStream();
     return 0;
 }
 
@@ -48,116 +48,116 @@ int AudioManager::getMixSize(){
 }
 
 int AudioManager::rtaudio_callback(void *outbuf, void *inbuf, unsigned int nFrames, 
-			double streamtime, RtAudioStreamStatus	status, void *userdata) {
+        double streamtime, RtAudioStreamStatus	status, void *userdata) {
     (void)inbuf;
-	float *buf = (float*)outbuf;
-	AudioManager::CallbackData *data = (AudioManager::CallbackData*) userdata;
-
-	//if we've reached the first buffer again, retrieve values from the ring
-	if(data->bufCounter==0) {
-		if(ringbuffer_read_space(data->ringBuffer) >= data->bufSize) {
-		
-			//read all the audio values
-			ringbuffer_read(data->ringBuffer, data->buffer, data->bufSize);
-
-			//mix the first buffer with the last of the previous
-			float step = 1.0/float(nFrames);
-			float cnt = 0.0;
-			for(int i=0; i < nFrames; ++i) {
-				buf[i*2] = data->buffer[i]*cnt + data->mixBuffer[i]*(1.0-cnt);
-				buf[i*2+1] = buf[i*2];
-				cnt+=step;
-			}
-
-			//save the last buffer for crossfading
-			memcpy(&data->mixBuffer[0], 
-					data->buffer+(data->bufSize-data->mixSize), 
-					data->mixSize*sizeof(float));
-		}
-		else {
-			memset(buf, 0, nFrames*data->nChannel*sizeof(float));
-			memset(data->buffer, 0, data->bufSize*sizeof(float));
-			memset(data->mixBuffer, 0, nFrames*sizeof(float));
-			//cout<<"AudioManager : Could not read buffer"<<endl;
-		}
-	}
-	else {
-		//read the next buffer
-		for(int i=0; i<nFrames; ++i) {
-			buf[i*2] = data->buffer[data->bufCounter*nFrames+i];
-			buf[i*2+1] = buf[i*2];
-		}
-	}
-
-	//move to the next buffer
-	data->bufCounter=(data->bufCounter+1)%(data->nbBufs-1);
-
-	return 0;
+    float *buf = (float*)outbuf;
+    AudioManager::CallbackData *data = (AudioManager::CallbackData*) userdata;
+
+    //if we've reached the first buffer again, retrieve values from the ring
+    if(data->bufCounter==0) {
+        if(ringbuffer_read_space(data->ringBuffer) >= data->bufSize) {
+
+            //read all the audio values
+            ringbuffer_read(data->ringBuffer, data->buffer, data->bufSize);
+
+            //mix the first buffer with the last of the previous
+            float step = 1.0/float(nFrames);
+            float cnt = 0.0;
+            for(int i=0; i < nFrames; ++i) {
+                buf[i*2] = data->buffer[i]*cnt + data->mixBuffer[i]*(1.0-cnt);
+                buf[i*2+1] = buf[i*2];
+                cnt+=step;
+            }
+
+            //save the last buffer for crossfading
+            memcpy(&data->mixBuffer[0], 
+                    data->buffer+(data->bufSize-data->mixSize), 
+                    data->mixSize*sizeof(float));
+        }
+        else {
+            memset(buf, 0, nFrames*data->nChannel*sizeof(float));
+            memset(data->buffer, 0, data->bufSize*sizeof(float));
+            memset(data->mixBuffer, 0, nFrames*sizeof(float));
+            //cout<<"AudioManager : Could not read buffer"<<endl;
+        }
+    }
+    else {
+        //read the next buffer
+        for(int i=0; i<nFrames; ++i) {
+            buf[i*2] = data->buffer[data->bufCounter*nFrames+i];
+            buf[i*2+1] = buf[i*2];
+        }
+    }
+
+    //move to the next buffer
+    data->bufCounter=(data->bufCounter+1)%(data->nbBufs-1);
+
+    return 0;
 }
 
 AudioManager::AudioManager() {
-	m_init=false;
+    m_init=false;
 }
 
 void AudioManager::init() {
-	//m_rtAudio = new RtAudio(RtAudio::LINUX_PULSE);
+    //m_rtAudio = new RtAudio(RtAudio::LINUX_PULSE);
     m_rtAudio = new RtAudio(RtAudio::UNIX_JACK);
     param = new RtAudio::StreamParameters();
     param->deviceId = m_rtAudio->getDefaultOutputDevice();
     param->nChannels = 2;
-	options = new RtAudio::StreamOptions();
-	options->streamName = "Rivill";
+    options = new RtAudio::StreamOptions();
+    options->streamName = "Rivill";
     data.nRate = m_rtAudio->getDeviceInfo(param->deviceId).preferredSampleRate;
 
-	m_rtBufSize = 1024;
+    m_rtBufSize = 1024;
 
-	bool init=true;
+    bool init=true;
     try{
-		m_rtAudio->openStream(param, NULL, RTAUDIO_FLOAT32, data.nRate, 
-					&m_rtBufSize, 
-					AudioManager::rtaudio_callback, &data, options); 
-	}
-	catch(const exception& e) {
-		init=false;
-	}
-
-	if(init) {
-		int nbBufs = 5;
-		m_bufSize = m_rtBufSize*nbBufs;
-
-		data.ringBuffer = ringbuffer_create(m_bufSize*3);
-
-		data.nChannel = param->nChannels;
-		data.bufSize = m_bufSize;
-		data.buffer = new float[m_bufSize];
-		data.nbBufs = nbBufs;
-		data.bufCounter = 0;
-		memset(&data.buffer[0], 0, data.bufSize*sizeof(float));
-
-		data.mixSize = m_rtBufSize;
-		data.mixBuffer = new float[data.mixSize];
-		memset(&data.mixBuffer[0], 0, data.mixSize*sizeof(float));
-
-		m_thread = new std::thread(audioThreadFunction, this);
-		m_init = true;
-	}
+        m_rtAudio->openStream(param, NULL, RTAUDIO_FLOAT32, data.nRate, 
+                &m_rtBufSize, 
+                AudioManager::rtaudio_callback, &data, options); 
+    }
+    catch(const exception& e) {
+        init=false;
+    }
+
+    if(init) {
+        int nbBufs = 6-m_rtBufSize/256;
+        m_bufSize = m_rtBufSize*nbBufs;
+
+        data.ringBuffer = ringbuffer_create(m_bufSize*3);
+
+        data.nChannel = param->nChannels;
+        data.bufSize = m_bufSize;
+        data.buffer = new float[m_bufSize];
+        data.nbBufs = nbBufs;
+        data.bufCounter = 0;
+        memset(&data.buffer[0], 0, data.bufSize*sizeof(float));
+
+        data.mixSize = m_rtBufSize;
+        data.mixBuffer = new float[data.mixSize];
+        memset(&data.mixBuffer[0], 0, data.mixSize*sizeof(float));
+
+        m_thread = new std::thread(audioThreadFunction, this);
+        m_init = true;
+    }
 }
 
 
 bool AudioManager::changeBuf(float* outputBuf, float maxSinValue) {
-	if(m_init) {
-		//check if there is space to write the new values
-		size_t write_space = ringbuffer_write_space(data.ringBuffer);
-		if(write_space >= m_bufSize) {
-			//write all data to the ringbuffer
-			ringbuffer_write(data.ringBuffer, outputBuf, data.bufSize);	
-			return true;
-		}
-		else {
-			//cout<<"AudioManager : Could not write buffer"<<endl;
-		}
-	}
-	return false;
+    if(m_init) {
+        //check if there is space to write the new values
+        size_t write_space = ringbuffer_write_space(data.ringBuffer);
+        if(write_space >= m_bufSize) {
+            //write all data to the ringbuffer
+            ringbuffer_write(data.ringBuffer, outputBuf, data.bufSize);	
+            return true;
+        }
+        else {
+            //cout<<"AudioManager : Could not write buffer"<<endl;
+        }
+    }
+    return false;
 }
 
 
diff --git a/src/modules/ProjectorModule.cpp b/src/modules/ProjectorModule.cpp
index 1fe803f..45037c0 100644
--- a/src/modules/ProjectorModule.cpp
+++ b/src/modules/ProjectorModule.cpp
@@ -21,7 +21,7 @@
  */
 
 /*////////////
-Calibration heavily relies on code from :
+  Calibration heavily relies on code from :
 https://github.com/Kj1/ofxProjectorKinectCalibration
 https://github.com/kylemcdonald/ofxCv
 */////////////////////
@@ -59,11 +59,11 @@ ProjectorModule::ProjectorModule(): Module() {
     m_audioProcessType=0;
     m_active=true;
     m_postFilter=0;
-	m_transparentBackground=false;
+    m_transparentBackground=false;
 
     //create window
     m_projWindow = glfwCreateWindow(m_width, m_height,
-                                    "Rivill - Projector", NULL, NULL);
+            "Rivill - Projector", NULL, NULL);
     if(!m_projWindow) {
         glfwTerminate();
         exit(EXIT_FAILURE);
@@ -74,34 +74,34 @@ ProjectorModule::ProjectorModule(): Module() {
     glfwSetWindowSizeCallback(m_projWindow, windowSizeCallback);
     glfwSetWindowPosCallback(m_projWindow, windowPositionCallback);
     glfwSetFramebufferSizeCallback(m_projWindow, framebufferSizeCallback);
-	glfwSetInputMode(m_projWindow, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
+    glfwSetInputMode(m_projWindow, GLFW_CURSOR, GLFW_CURSOR_HIDDEN);
     addNameAttribute();
     addRemoveAttribute();
     addAttribute(new Attribute("active",
-                                Attribute::BOOL_ATTRIBUTE,
-                                activeCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::BOOL_ATTRIBUTE,
+                activeCallback, this, 1,
+                Attribute::LOCAL));
     addAttribute(new Attribute("window_dimensions",
-                                Attribute::INT_ATTRIBUTE,
-                                windowDimensionsCallback, this, 4,
-                                Attribute::LOCAL));
+                Attribute::INT_ATTRIBUTE,
+                windowDimensionsCallback, this, 4,
+                Attribute::LOCAL));
     addAttribute(new Attribute("fullscreen_monitor",
-                                Attribute::STRING_ATTRIBUTE,
-                                fullscreenMonitorCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::STRING_ATTRIBUTE,
+                fullscreenMonitorCallback, this, 1,
+                Attribute::LOCAL));
     addAttribute(new Attribute("view_matrix",
-                                Attribute::FLOAT_ATTRIBUTE,
-                                viewMatrixCallback, this, 16,
-                                Attribute::HIDDEN));
+                Attribute::FLOAT_ATTRIBUTE,
+                viewMatrixCallback, this, 16,
+                Attribute::HIDDEN));
     addAttribute(new Attribute("projection_matrix",
-                                Attribute::FLOAT_ATTRIBUTE,
-                                projectionMatrixCallback, this, 16,
-                                Attribute::HIDDEN));
+                Attribute::FLOAT_ATTRIBUTE,
+                projectionMatrixCallback, this, 16,
+                Attribute::HIDDEN));
 
     addAttribute(new Attribute("mirrored",
-                                Attribute::BOOL_ATTRIBUTE,
-                                mirroredCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::BOOL_ATTRIBUTE,
+                mirroredCallback, this, 1,
+                Attribute::LOCAL));
 
     addTransformationAttributes();
     m_attributesMap["scale"]->setAccessibility(Attribute::HIDDEN);
@@ -110,52 +110,52 @@ ProjectorModule::ProjectorModule(): Module() {
     m_attributesMap["position"]->setFloats(posVec);
 
     addAttribute(new Attribute("attached_to_camera",
-                                Attribute::STRING_ATTRIBUTE,
-                                attachToCamCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::STRING_ATTRIBUTE,
+                attachToCamCallback, this, 1,
+                Attribute::LOCAL));
     addAttribute(new Attribute("calibrate_with_camera",
-                                Attribute::ACTION_STRING_ATTRIBUTE,
-                                calibrateCallback, this, 1,
-                                Attribute::LOCAL,
-                                false));
+                Attribute::ACTION_STRING_ATTRIBUTE,
+                calibrateCallback, this, 1,
+                Attribute::LOCAL,
+                false));
     addAttribute(new Attribute("output_revealed",
-                                Attribute::BOOL_ATTRIBUTE,
-                                outputRevealedCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::BOOL_ATTRIBUTE,
+                outputRevealedCallback, this, 1,
+                Attribute::LOCAL));
     addAttribute(new Attribute("post_filter",
-                                Attribute::INT_ATTRIBUTE,
-                                postFilterCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::INT_ATTRIBUTE,
+                postFilterCallback, this, 1,
+                Attribute::LOCAL));
     addAttribute(new Attribute("transparent_window",
-                                Attribute::BOOL_ATTRIBUTE,
-                                transparentWindowCallback, this, 1,
-                                Attribute::LOCAL));
+                Attribute::BOOL_ATTRIBUTE,
+                transparentWindowCallback, this, 1,
+                Attribute::LOCAL));
     addAttribute(new Attribute("audio_process", 
-                               Attribute::STRING_ATTRIBUTE,
-                               audioProcessTypeCallback, this, 1,
-							   Attribute::LOCAL));
+                Attribute::STRING_ATTRIBUTE,
+                audioProcessTypeCallback, this, 1,
+                Attribute::LOCAL));
     m_audioProcessTypes.push_back("none");
     m_audioProcessTypes.push_back("additiveSynthesis");
     m_audioProcessTypes.push_back("pitchedAdditiveSynthesis");
     m_attributesMap["audio_process"]
-            ->editStringValuesChoices().assign(1, m_audioProcessTypes);
+        ->editStringValuesChoices().assign(1, m_audioProcessTypes);
     m_attributesMap["audio_process"]
-            ->setStrings(vector<string>(1,m_audioProcessTypes[0]));
+        ->setStrings(vector<string>(1,m_audioProcessTypes[0]));
 
     //initialize attributes
     vector<string> labels;
     labels.push_back("none");
     m_attributesMap["attached_to_camera"]
-            ->editStringValuesChoices().assign(1, labels);
+        ->editStringValuesChoices().assign(1, labels);
     m_attributesMap["attached_to_camera"]
-            ->initStrings(vector<string>(1, labels[0]));
+        ->initStrings(vector<string>(1, labels[0]));
     m_attributesMap["calibrate_with_camera"]
-            ->editStringValuesChoices().assign(1, labels);
+        ->editStringValuesChoices().assign(1, labels);
     m_attributesMap["calibrate_with_camera"]
-            ->initStrings(vector<string>(1, labels[0]));
+        ->initStrings(vector<string>(1, labels[0]));
     refreshMonitors();
     m_attributesMap["fullscreen_monitor"]
-            ->initStrings(vector<string>(1, "windowed"));
+        ->initStrings(vector<string>(1, "windowed"));
     m_attachedToCam=NULL;
     m_attributesMap["output_revealed"]->initBools(vector<bool>(1, true));
     m_attributesMap["post_filter"]->initInts(vector<int>(1, 0));
@@ -165,20 +165,20 @@ ProjectorModule::ProjectorModule(): Module() {
 
     //initialize matrices
     m_viewMat = lookAt(vec3(0.0, 0.0, 0.0),
-                       vec3(0.0, 0.0, 1.0),
-                       vec3(0.0, 1.0, 0.0));
+            vec3(0.0, 0.0, 1.0),
+            vec3(0.0, 1.0, 0.0));
     mat4 glCoordsMat(-1, 0, 0, 0,
-                      0, 1, 0, 0,
-                      0, 0, 1, 0,
-                      0, 0, 0, 1);
+            0, 1, 0, 0,
+            0, 0, 1, 0,
+            0, 0, 0, 1);
     m_viewMat=glCoordsMat*m_viewMat;
     m_attributesMap["view_matrix"]->setFloats(vector<float>(
-                                                      value_ptr(m_viewMat),
-                                                      value_ptr(m_viewMat)+16));
+                value_ptr(m_viewMat),
+                value_ptr(m_viewMat)+16));
     m_projMat = perspective(45.0, 4.0/3.0, 100.0, 10000.0);
     m_attributesMap["projection_matrix"]->setFloats(vector<float>(
-                                                      value_ptr(m_projMat),
-                                                      value_ptr(m_projMat)+16));
+                value_ptr(m_projMat),
+                value_ptr(m_projMat)+16));
 
     vector<int> dims(4,0);
     dims[0]=m_posX;
@@ -197,15 +197,15 @@ ProjectorModule::ProjectorModule(): Module() {
     m_patternPosOffset = Size(0,0);
 
 
-	//audio
-	m_nbTracks=3000;
+    //audio
+    m_nbTracks=200;
     m_maxAudioValue = (std::numeric_limits<int>::max())/(m_width * m_height);
     m_audioMixSize = AudioManager::getInstance()->getMixSize();
     m_audioBufSize = AudioManager::getInstance()->getBufferSize();
-	m_imgBufSize = m_audioBufSize+3;
+    m_imgBufSize = m_audioBufSize+3;
     m_audioBuffer = new float[m_audioBufSize];
     memset(&m_audioBuffer[0], 0, m_audioBufSize*sizeof(float));
-	m_audioNextBuf=1;
+    m_audioNextBuf=1;
 
 
     Reveal::getInstance()->addContextHandler(this);
@@ -238,22 +238,22 @@ void ProjectorModule::draw() {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glUseProgram(m_programs[Reveal::SLICEPROG]);
     glUniform1f(m_uniforms[Reveal::SLICEPROG][Reveal::MIRRORED],
-                float(m_mirrored));
+            float(m_mirrored));
     glUniformMatrix4fv(m_uniforms[Reveal::SLICEPROG][Reveal::VIEWPROJMAT], 1,
-                       GL_FALSE, value_ptr(m_viewProjMat));
+            GL_FALSE, value_ptr(m_viewProjMat));
     glUniformMatrix4fv(m_uniforms[Reveal::SLICEPROG][Reveal::VIEWMAT], 1,
-                       GL_FALSE, value_ptr(m_transViewMat));
+            GL_FALSE, value_ptr(m_transViewMat));
     const vector<Geometry*>& depthGeoms = m_space->getGeoms();
 
     vector<Geometry*>::const_iterator itDGeom=depthGeoms.begin();
     for(; itDGeom!=depthGeoms.end(); ++itDGeom) {
         (*itDGeom)->draw(m_contextHandlerID,
-                         Reveal::SLICEPROG,
-                         m_uniforms[Reveal::SLICEPROG],
-                         m_visibilityMask);
+                Reveal::SLICEPROG,
+                m_uniforms[Reveal::SLICEPROG],
+                m_visibilityMask);
     }
 
-	//select to texture for 3D models only
+    //select to texture for 3D models only
     glBindFramebuffer(GL_FRAMEBUFFER, m_selectFBO);
     glViewport(0, 0, m_rttWidth, m_rttHeight);
     glEnable(GL_DEPTH_TEST);
@@ -266,26 +266,26 @@ void ProjectorModule::draw() {
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     glUseProgram(m_programs[Reveal::SELECTPROG]);
     glUniform1f(m_uniforms[Reveal::SELECTPROG][Reveal::MIRRORED],
-                float(m_mirrored));
+            float(m_mirrored));
     glUniformMatrix4fv(m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPROJMAT], 1,
-                       GL_FALSE, value_ptr(m_viewProjMat));
+            GL_FALSE, value_ptr(m_viewProjMat));
     glUniformMatrix4fv(m_uniforms[Reveal::SELECTPROG][Reveal::VIEWMAT], 1,
-                       GL_FALSE, value_ptr(m_transViewMat));
+            GL_FALSE, value_ptr(m_transViewMat));
     glUniform1f(m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPORTWIDTH],
-                m_rttWidth);
+            m_rttWidth);
     glUniform1f(m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPORTHEIGHT],
-                m_rttHeight);
+            m_rttHeight);
     glUniform1i(m_uniforms[Reveal::SELECTPROG][Reveal::SLICETEX], 0);
     glActiveTexture(GL_TEXTURE0);
     glBindTexture(GL_TEXTURE_2D, m_sliceRttTex);
     const vector<Geometry*>& sceneGeoms = Reveal::getInstance()->getGeoms();
     for(auto& geom : sceneGeoms) {
-		if(geom->getIsModel()) {
-			geom->draw(m_contextHandlerID,
-					   Reveal::SELECTPROG,
-					   m_uniforms[Reveal::SELECTPROG],
-					   m_visibilityMask);
-		}
+        if(geom->getIsModel()) {
+            geom->draw(m_contextHandlerID,
+                    Reveal::SELECTPROG,
+                    m_uniforms[Reveal::SELECTPROG],
+                    m_visibilityMask);
+        }
     }
 
 
@@ -301,7 +301,7 @@ void ProjectorModule::draw() {
     glEnable(GL_DEPTH_TEST);
     glDepthFunc(GL_ALWAYS);
     glEnable(GL_CULL_FACE);
-	if(m_mirrored) {
+    if(m_mirrored) {
         glCullFace(GL_FRONT);
     }
     else {
@@ -314,22 +314,22 @@ void ProjectorModule::draw() {
     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
     glUseProgram(m_programs[Reveal::RENDERPROG]);
     glUniform1f(m_uniforms[Reveal::RENDERPROG][Reveal::MIRRORED],
-                float(m_mirrored));
+            float(m_mirrored));
     glUniformMatrix4fv(m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPROJMAT], 1,
-                       GL_FALSE, value_ptr(m_viewProjMat));
+            GL_FALSE, value_ptr(m_viewProjMat));
     glUniformMatrix4fv(m_uniforms[Reveal::RENDERPROG][Reveal::VIEWMAT], 1,
             GL_FALSE, value_ptr(m_transViewMat));
     if(m_postFilter>0) {
         glUniform1f(m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTWIDTH],
-                    m_rttWidth);
+                m_rttWidth);
         glUniform1f(m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTHEIGHT],
-                    m_rttHeight);
+                m_rttHeight);
     }
     else {
         glUniform1f(m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTWIDTH],
-                    m_width);
+                m_width);
         glUniform1f(m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTHEIGHT],
-                    m_height);
+                m_height);
     }
     glActiveTexture(GL_TEXTURE0);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::SLICETEX], 0);
@@ -338,44 +338,44 @@ void ProjectorModule::draw() {
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::SELECTTEX], 1);
     glBindTexture(GL_TEXTURE_2D, m_selectTex);
 #ifdef GL43
-	//glActiveTexture(GL_TEXTURE7);
+    //glActiveTexture(GL_TEXTURE7);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::OUTPUTTEX], 0);
     glBindImageTexture(0, m_outputTex, 0, GL_FALSE, 0,
-                       GL_READ_WRITE, GL_R32UI);
+            GL_READ_WRITE, GL_R32UI);
 
 
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::OUTSHAPESIZE], 
-                m_outShapeSize);
+            m_outShapeSize);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::OUTDEPTHSIZE], 
-                m_outDepthSize);
+            m_outDepthSize);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::OUTNBDEPTH], 
-                m_outNbDepth);
+            m_outNbDepth);
 
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::PROCESSAUDIO], 
-			m_audioProcessType);
+            m_audioProcessType);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOTEX], 1);
     glBindImageTexture(1, m_audioTex, 0, GL_FALSE, 0,
-                       GL_READ_WRITE, GL_R32I);
+            GL_READ_WRITE, GL_R32I);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIORATE], 
-			AudioManager::getInstance()->getRate());
+            AudioManager::getInstance()->getRate());
     glUniform1f(m_uniforms[Reveal::RENDERPROG][Reveal::MAXAUDIOVALUE], 
-			m_maxAudioValue);
+            m_maxAudioValue);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOBUFSIZE], 
-			m_audioBufSize);
+            m_audioBufSize);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOMIXSIZE], 
-			m_audioMixSize);
+            m_audioMixSize);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIONEXTBUF], 
-			m_audioNextBuf);
+            m_audioNextBuf);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIONBTRACKS], 
-			m_nbTracks);
+            m_nbTracks);
 #endif
 
-	//Draw everything
+    //Draw everything
     for(auto& geom : sceneGeoms) {
         geom->draw(m_contextHandlerID,
-				   Reveal::RENDERPROG,
-				   m_uniforms[Reveal::RENDERPROG],
-				   m_visibilityMask);
+                Reveal::RENDERPROG,
+                m_uniforms[Reveal::RENDERPROG],
+                m_visibilityMask);
     }
 
     //POST PROCESSING
@@ -392,11 +392,11 @@ void ProjectorModule::draw() {
         glUniform1i(m_uniforms[Reveal::POSTPROG][Reveal::RENDERTEX], 0);
         glBindTexture(GL_TEXTURE_2D, m_renderTex);
         glUniform1f(m_uniforms[Reveal::POSTPROG][Reveal::VIEWPORTWIDTH],
-                    m_width);
+                m_width);
         glUniform1f(m_uniforms[Reveal::POSTPROG][Reveal::VIEWPORTHEIGHT],
-                    m_height);
+                m_height);
         glUniform1f(m_uniforms[Reveal::POSTPROG][Reveal::POSTFILTER],
-                    m_postFilter);
+                m_postFilter);
         m_calibGeom->drawDirect(m_contextHandlerID);
     }
 
@@ -409,16 +409,16 @@ void ProjectorModule::draw() {
     if(m_processOutput) {
         processOutput();
     }
-	if(m_audioProcessType>0) {
-		processAudio();
-	}
+    if(m_audioProcessType>0) {
+        processAudio();
+    }
 #endif
 }
 
 void ProjectorModule::initGL() {
-    #ifdef OSX
-        glewExperimental = GL_TRUE;
-    #endif
+#ifdef OSX
+    glewExperimental = GL_TRUE;
+#endif
     glewInit();
 
 
@@ -426,362 +426,362 @@ void ProjectorModule::initGL() {
     {
 
 #ifdef GL43
-    m_programs[Reveal::POSTPROG]
-        = Reveal::getInstance()->createProgram(post43VS.c_str(), 
-				post43FS.c_str());
+        m_programs[Reveal::POSTPROG]
+            = Reveal::getInstance()->createProgram(post43VS.c_str(), 
+                    post43FS.c_str());
 #else
-    m_programs[Reveal::POSTPROG]
-        = Reveal::getInstance()->createProgram(post30VS.c_str(), 
-				post30FS.c_str());
+        m_programs[Reveal::POSTPROG]
+            = Reveal::getInstance()->createProgram(post30VS.c_str(), 
+                    post30FS.c_str());
 #endif
-    m_uniforms[Reveal::POSTPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
-    m_uniforms[Reveal::POSTPROG][Reveal::VIEWPORTWIDTH]
-        = glGetUniformLocation(m_programs[Reveal::POSTPROG],"viewportWidth");
-    m_uniforms[Reveal::POSTPROG][Reveal::VIEWPORTHEIGHT]
-        = glGetUniformLocation(m_programs[Reveal::POSTPROG],"viewportHeight");
-    m_uniforms[Reveal::POSTPROG][Reveal::POSTFILTER]
-        = glGetUniformLocation(m_programs[Reveal::POSTPROG],"postFilter");
-    m_uniforms[Reveal::POSTPROG][Reveal::RENDERTEX]
-        = glGetUniformLocation(m_programs[Reveal::POSTPROG],"renderTex");
+        m_uniforms[Reveal::POSTPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
+        m_uniforms[Reveal::POSTPROG][Reveal::VIEWPORTWIDTH]
+            = glGetUniformLocation(m_programs[Reveal::POSTPROG],"viewportWidth");
+        m_uniforms[Reveal::POSTPROG][Reveal::VIEWPORTHEIGHT]
+            = glGetUniformLocation(m_programs[Reveal::POSTPROG],"viewportHeight");
+        m_uniforms[Reveal::POSTPROG][Reveal::POSTFILTER]
+            = glGetUniformLocation(m_programs[Reveal::POSTPROG],"postFilter");
+        m_uniforms[Reveal::POSTPROG][Reveal::RENDERTEX]
+            = glGetUniformLocation(m_programs[Reveal::POSTPROG],"renderTex");
     }
 
     //RENDER
     {
 #ifdef GL43
-    m_programs[Reveal::RENDERPROG]
-        = Reveal::getInstance()->createProgram(render43VS.c_str(), 
-				render43FS.c_str());
+        m_programs[Reveal::RENDERPROG]
+            = Reveal::getInstance()->createProgram(render43VS.c_str(), 
+                    render43FS.c_str());
 #else
-    m_programs[Reveal::RENDERPROG]
-        = Reveal::getInstance()->createProgram(render30VS.c_str(), 
-				render30FS.c_str());
+        m_programs[Reveal::RENDERPROG]
+            = Reveal::getInstance()->createProgram(render30VS.c_str(), 
+                    render30FS.c_str());
 #endif
 
-    m_uniforms[Reveal::RENDERPROG] = map<Reveal::REVIL_UNIFORM, GLint>();
-    m_uniforms[Reveal::RENDERPROG][Reveal::MIRRORED]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "mirrored");
-    m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPROJMAT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "viewProjMat");
-    m_uniforms[Reveal::RENDERPROG][Reveal::VIEWMAT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "viewMat");
-    m_uniforms[Reveal::RENDERPROG][Reveal::MODELMAT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "modelMat");
-    m_uniforms[Reveal::RENDERPROG][Reveal::INVMODELMAT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "invModelMat");
-    m_uniforms[Reveal::RENDERPROG][Reveal::MODELSCALE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "modelScale");
-    m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTWIDTH]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "viewportWidth");
-    m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTHEIGHT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG],"viewportHeight");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SLICETEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "sliceTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SELECTTEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "selectTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::INSIDETEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "insideTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::COORDSTEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "coordsTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::TEXGRAY]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texGray");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REACTTEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "reactTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SURFDISTEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surfDistTex");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::SHAPEID]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeID");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SHAPEIDBIT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeIDBit");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SHAPEGEOM]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeGeom");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SHAPECOLOR]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeColor");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SUBSHAPEID]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "subShapeID");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SUBSHAPESNB]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "subShapesNb");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SUBSHAPEINVMAT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG],"subShapeInvMat");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVEALEDBY]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revealedBy");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::SURFACE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surface");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SURFACECOLOR]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surfaceColor");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SURFACETHICKNESS]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "thickness");
-    m_uniforms[Reveal::RENDERPROG][Reveal::SURFACETEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surfaceTex");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::INSIDEVISIBLE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "insideVisible");
-    m_uniforms[Reveal::RENDERPROG][Reveal::INSIDESTRUCT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "insideStructure");
-    m_uniforms[Reveal::RENDERPROG][Reveal::STRUCTRATIO]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "structureRatio");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTALPHA]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientAlpha");
-    m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTTYPE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientType");
-    m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTSTEPS]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientSteps");
-    m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTCURVERATIO]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientCurveRatio");
-    m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTTEXTURE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientTex");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYALPHA]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityAlpha");
-    m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYTYPE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityType");
-    m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYRATIO]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityRatio");
-    m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densitySize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYCURVERATIO]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityCurveRatio");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::TEXALPHA]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texAlpha");
-    m_uniforms[Reveal::RENDERPROG][Reveal::TEXOFFSET]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texOffset");
-    m_uniforms[Reveal::RENDERPROG][Reveal::TEXSCALE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texScale");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REACTIVITY]
-      = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "reactivity");
-
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::BBOXMIN]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxMin");
-    m_uniforms[Reveal::RENDERPROG][Reveal::BBOXSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::BBOXLOCALSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxLocalSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::BBOXROT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxRot");
+        m_uniforms[Reveal::RENDERPROG] = map<Reveal::REVIL_UNIFORM, GLint>();
+        m_uniforms[Reveal::RENDERPROG][Reveal::MIRRORED]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "mirrored");
+        m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPROJMAT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "viewProjMat");
+        m_uniforms[Reveal::RENDERPROG][Reveal::VIEWMAT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "viewMat");
+        m_uniforms[Reveal::RENDERPROG][Reveal::MODELMAT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "modelMat");
+        m_uniforms[Reveal::RENDERPROG][Reveal::INVMODELMAT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "invModelMat");
+        m_uniforms[Reveal::RENDERPROG][Reveal::MODELSCALE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "modelScale");
+        m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTWIDTH]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "viewportWidth");
+        m_uniforms[Reveal::RENDERPROG][Reveal::VIEWPORTHEIGHT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG],"viewportHeight");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SLICETEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "sliceTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SELECTTEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "selectTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::INSIDETEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "insideTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::COORDSTEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "coordsTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::TEXGRAY]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texGray");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REACTTEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "reactTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SURFDISTEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surfDistTex");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::SHAPEID]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeID");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SHAPEIDBIT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeIDBit");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SHAPEGEOM]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeGeom");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SHAPECOLOR]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeColor");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SUBSHAPEID]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "subShapeID");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SUBSHAPESNB]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "subShapesNb");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SUBSHAPEINVMAT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG],"subShapeInvMat");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVEALEDBY]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revealedBy");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::SURFACE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surface");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SURFACECOLOR]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surfaceColor");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SURFACETHICKNESS]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "thickness");
+        m_uniforms[Reveal::RENDERPROG][Reveal::SURFACETEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "surfaceTex");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::INSIDEVISIBLE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "insideVisible");
+        m_uniforms[Reveal::RENDERPROG][Reveal::INSIDESTRUCT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "insideStructure");
+        m_uniforms[Reveal::RENDERPROG][Reveal::STRUCTRATIO]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "structureRatio");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTALPHA]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientAlpha");
+        m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTTYPE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientType");
+        m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTSTEPS]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientSteps");
+        m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTCURVERATIO]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientCurveRatio");
+        m_uniforms[Reveal::RENDERPROG][Reveal::GRADIENTTEXTURE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "gradientTex");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYALPHA]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityAlpha");
+        m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYTYPE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityType");
+        m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYRATIO]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityRatio");
+        m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densitySize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::DENSITYCURVERATIO]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "densityCurveRatio");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::TEXALPHA]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texAlpha");
+        m_uniforms[Reveal::RENDERPROG][Reveal::TEXOFFSET]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texOffset");
+        m_uniforms[Reveal::RENDERPROG][Reveal::TEXSCALE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "texScale");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REACTIVITY]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "reactivity");
+
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::BBOXMIN]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxMin");
+        m_uniforms[Reveal::RENDERPROG][Reveal::BBOXSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::BBOXLOCALSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxLocalSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::BBOXROT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "bboxRot");
 #ifdef GL43
-    //output texture
-    m_outputImg = new unsigned int[m_outputImgSize*m_outputImgSize];
-    m_outputImgInit = new unsigned int[m_outputImgSize*m_outputImgSize];
-    memset(&m_outputImgInit[0], 0, m_outputImgSize*m_outputImgSize*4);
-    glGenTextures(1, &m_outputTex);
-    glBindTexture(GL_TEXTURE_2D, m_outputTex);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI,
-                 m_outputImgSize, m_outputImgSize, 0,
-                 GL_RED_INTEGER, GL_UNSIGNED_INT, m_outputImgInit);
-
-	//Audio texture
-    m_audioImg = new int[m_imgBufSize*m_nbTracks];
-    memset(&m_audioImg[0], 0, m_imgBufSize*m_nbTracks*sizeof(int));
-    m_audioImgInit = new int[3*m_nbTracks];
-    memset(&m_audioImgInit[0], 0, 3*m_nbTracks*sizeof(int));
-    glGenTextures(1, &m_audioTex);
-    glBindTexture(GL_TEXTURE_2D, m_audioTex);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-    glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I,
-                 m_imgBufSize, m_nbTracks, 0,
-				  GL_RED_INTEGER, GL_INT, m_audioImg);
-	
-    m_uniforms[Reveal::RENDERPROG][Reveal::PROCESSAUDIO]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "processAudio");
-    m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOTEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOMIXSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioMixSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOBUFSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioBufSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::MAXAUDIOVALUE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "maxAudioValue");
-    m_uniforms[Reveal::RENDERPROG][Reveal::AUDIORATE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioRate");
-    m_uniforms[Reveal::RENDERPROG][Reveal::AUDIONEXTBUF]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioNextBuf");
-    m_uniforms[Reveal::RENDERPROG][Reveal::AUDIONBTRACKS]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioNbTracks");
-
-    m_uniforms[Reveal::RENDERPROG][Reveal::OUTPUTTEX]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "outputTex");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVSURFACE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revSurface");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVINSIDE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revInside");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVCENTER]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revCenter");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVCURSOR]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revCursor");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVCOLOR]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revColor");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVHISTO]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revHisto");
-    m_uniforms[Reveal::RENDERPROG][Reveal::REVVOXELS]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revVoxels");
-    m_uniforms[Reveal::RENDERPROG][Reveal::OUTSHAPESIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeOutSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::OUTHISTOSIZE]
-     = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "histoOutSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::OUTVOXELSIZE]
-     = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "voxelOutSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::OUTDEPTHSIZE]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "depthOutSize");
-    m_uniforms[Reveal::RENDERPROG][Reveal::OUTNBDEPTH]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "depthOutNb");
-    m_uniforms[Reveal::RENDERPROG][Reveal::BRECT]
-        = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "boundingRect");
-    createRTT(m_renderTex, m_renderFBO, m_rttWidth, m_rttHeight, false);
+        //output texture
+        m_outputImg = new unsigned int[m_outputImgSize*m_outputImgSize];
+        m_outputImgInit = new unsigned int[m_outputImgSize*m_outputImgSize];
+        memset(&m_outputImgInit[0], 0, m_outputImgSize*m_outputImgSize*4);
+        glGenTextures(1, &m_outputTex);
+        glBindTexture(GL_TEXTURE_2D, m_outputTex);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI,
+                m_outputImgSize, m_outputImgSize, 0,
+                GL_RED_INTEGER, GL_UNSIGNED_INT, m_outputImgInit);
+
+        //Audio texture
+        m_audioImg = new int[m_imgBufSize*m_nbTracks];
+        memset(&m_audioImg[0], 0, m_imgBufSize*m_nbTracks*sizeof(int));
+        m_audioImgInit = new int[3*m_nbTracks];
+        memset(&m_audioImgInit[0], 0, 3*m_nbTracks*sizeof(int));
+        glGenTextures(1, &m_audioTex);
+        glBindTexture(GL_TEXTURE_2D, m_audioTex);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+        glTexImage2D(GL_TEXTURE_2D, 0, GL_R32I,
+                m_imgBufSize, m_nbTracks, 0,
+                GL_RED_INTEGER, GL_INT, m_audioImg);
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::PROCESSAUDIO]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "processAudio");
+        m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOTEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOMIXSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioMixSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOBUFSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioBufSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::MAXAUDIOVALUE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "maxAudioValue");
+        m_uniforms[Reveal::RENDERPROG][Reveal::AUDIORATE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioRate");
+        m_uniforms[Reveal::RENDERPROG][Reveal::AUDIONEXTBUF]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioNextBuf");
+        m_uniforms[Reveal::RENDERPROG][Reveal::AUDIONBTRACKS]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "audioNbTracks");
+
+        m_uniforms[Reveal::RENDERPROG][Reveal::OUTPUTTEX]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "outputTex");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVSURFACE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revSurface");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVINSIDE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revInside");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVCENTER]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revCenter");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVCURSOR]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revCursor");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVCOLOR]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revColor");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVHISTO]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revHisto");
+        m_uniforms[Reveal::RENDERPROG][Reveal::REVVOXELS]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "revVoxels");
+        m_uniforms[Reveal::RENDERPROG][Reveal::OUTSHAPESIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "shapeOutSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::OUTHISTOSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "histoOutSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::OUTVOXELSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "voxelOutSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::OUTDEPTHSIZE]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "depthOutSize");
+        m_uniforms[Reveal::RENDERPROG][Reveal::OUTNBDEPTH]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "depthOutNb");
+        m_uniforms[Reveal::RENDERPROG][Reveal::BRECT]
+            = glGetUniformLocation(m_programs[Reveal::RENDERPROG], "boundingRect");
+        createRTT(m_renderTex, m_renderFBO, m_rttWidth, m_rttHeight, false);
 #endif
     }
 
-   {
-    //select prog
+    {
+        //select prog
 #ifdef GL43
-    m_programs[Reveal::SELECTPROG]
-        = Reveal::getInstance()->createProgram(select43VS.c_str(), 
-				select43FS.c_str());
+        m_programs[Reveal::SELECTPROG]
+            = Reveal::getInstance()->createProgram(select43VS.c_str(), 
+                    select43FS.c_str());
 #else
-    m_programs[Reveal::SELECTPROG]
-        = Reveal::getInstance()->createProgram(select30VS.c_str(), 
-				select30FS.c_str());
+        m_programs[Reveal::SELECTPROG]
+            = Reveal::getInstance()->createProgram(select30VS.c_str(), 
+                    select30FS.c_str());
 #endif
-    m_uniforms[Reveal::SELECTPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
-    m_uniforms[Reveal::SELECTPROG][Reveal::MIRRORED]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "mirrored");
-    m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPROJMAT]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "viewProjMat");
-    m_uniforms[Reveal::SELECTPROG][Reveal::VIEWMAT]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "viewMat");
-    m_uniforms[Reveal::SELECTPROG][Reveal::MODELMAT]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "modelMat");
-    m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPORTWIDTH]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "viewportWidth");
-    m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPORTHEIGHT]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG],"viewportHeight");
-    m_uniforms[Reveal::SELECTPROG][Reveal::SLICETEX]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "sliceTex");
-    m_uniforms[Reveal::SELECTPROG][Reveal::SHAPEID]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "shapeID");
-    m_uniforms[Reveal::SELECTPROG][Reveal::SHAPEIDBIT]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "shapeIDBit");
-    m_uniforms[Reveal::SELECTPROG][Reveal::SURFACETHICKNESS]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "thickness");
-    m_uniforms[Reveal::SELECTPROG][Reveal::SURFACE]
-        = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "surface");
-    createRTT(m_selectTex, m_selectFBO, m_rttWidth, m_rttHeight, false);
+        m_uniforms[Reveal::SELECTPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
+        m_uniforms[Reveal::SELECTPROG][Reveal::MIRRORED]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "mirrored");
+        m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPROJMAT]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "viewProjMat");
+        m_uniforms[Reveal::SELECTPROG][Reveal::VIEWMAT]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "viewMat");
+        m_uniforms[Reveal::SELECTPROG][Reveal::MODELMAT]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "modelMat");
+        m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPORTWIDTH]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "viewportWidth");
+        m_uniforms[Reveal::SELECTPROG][Reveal::VIEWPORTHEIGHT]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG],"viewportHeight");
+        m_uniforms[Reveal::SELECTPROG][Reveal::SLICETEX]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "sliceTex");
+        m_uniforms[Reveal::SELECTPROG][Reveal::SHAPEID]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "shapeID");
+        m_uniforms[Reveal::SELECTPROG][Reveal::SHAPEIDBIT]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "shapeIDBit");
+        m_uniforms[Reveal::SELECTPROG][Reveal::SURFACETHICKNESS]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "thickness");
+        m_uniforms[Reveal::SELECTPROG][Reveal::SURFACE]
+            = glGetUniformLocation(m_programs[Reveal::SELECTPROG], "surface");
+        createRTT(m_selectTex, m_selectFBO, m_rttWidth, m_rttHeight, false);
     }
 
     //SLICE
     {
 #ifdef GL43
-    m_programs[Reveal::SLICEPROG]
-        = Reveal::getInstance()->createProgram(slice43VS.c_str(), 
-				slice43FS.c_str());
+        m_programs[Reveal::SLICEPROG]
+            = Reveal::getInstance()->createProgram(slice43VS.c_str(), 
+                    slice43FS.c_str());
 #else
-    m_programs[Reveal::SLICEPROG]
-        = Reveal::getInstance()->createProgram(slice30VS.c_str(), 
-				slice30FS.c_str());
+        m_programs[Reveal::SLICEPROG]
+            = Reveal::getInstance()->createProgram(slice30VS.c_str(), 
+                    slice30FS.c_str());
 #endif
 
-    m_uniforms[Reveal::SLICEPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
-    m_uniforms[Reveal::SLICEPROG][Reveal::BACKGROUND]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "background");
-    m_uniforms[Reveal::SLICEPROG][Reveal::MIRRORED]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "mirrored");
-    m_uniforms[Reveal::SLICEPROG][Reveal::VIEWPROJMAT]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "viewProjMat");
-    m_uniforms[Reveal::SLICEPROG][Reveal::VIEWMAT]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "viewMat");
-    m_uniforms[Reveal::SLICEPROG][Reveal::MODELMAT]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "modelMat");
-    m_uniforms[Reveal::SLICEPROG][Reveal::DEPTHTYPE]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthType");
-    m_uniforms[Reveal::SLICEPROG][Reveal::DEPTHID]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthID");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMXRESO]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camXReso");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMYRESO]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camYReso");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMXZFACTOR]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camXZFactor");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMYZFACTOR]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camYZFactor");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMTEX]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthCamTex");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMTEXFIL]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthCamTexFil");
-    m_uniforms[Reveal::SLICEPROG][Reveal::MARKTEX]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "markersTex");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMFILTER]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camFilter");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMCONTOURTHRESH]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camContThresh");
-    m_uniforms[Reveal::SLICEPROG][Reveal::CAMMARKERS]
-        = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camMarkers");
-    createRTT(m_sliceRttTex, m_sliceFBO, m_rttWidth, m_rttHeight, false);
+        m_uniforms[Reveal::SLICEPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
+        m_uniforms[Reveal::SLICEPROG][Reveal::BACKGROUND]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "background");
+        m_uniforms[Reveal::SLICEPROG][Reveal::MIRRORED]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "mirrored");
+        m_uniforms[Reveal::SLICEPROG][Reveal::VIEWPROJMAT]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "viewProjMat");
+        m_uniforms[Reveal::SLICEPROG][Reveal::VIEWMAT]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "viewMat");
+        m_uniforms[Reveal::SLICEPROG][Reveal::MODELMAT]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "modelMat");
+        m_uniforms[Reveal::SLICEPROG][Reveal::DEPTHTYPE]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthType");
+        m_uniforms[Reveal::SLICEPROG][Reveal::DEPTHID]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthID");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMXRESO]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camXReso");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMYRESO]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camYReso");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMXZFACTOR]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camXZFactor");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMYZFACTOR]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camYZFactor");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMTEX]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthCamTex");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMTEXFIL]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "depthCamTexFil");
+        m_uniforms[Reveal::SLICEPROG][Reveal::MARKTEX]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "markersTex");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMFILTER]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camFilter");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMCONTOURTHRESH]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camContThresh");
+        m_uniforms[Reveal::SLICEPROG][Reveal::CAMMARKERS]
+            = glGetUniformLocation(m_programs[Reveal::SLICEPROG], "camMarkers");
+        createRTT(m_sliceRttTex, m_sliceFBO, m_rttWidth, m_rttHeight, false);
     }
 
     //Calibration
     {
 #ifdef GL43
-    m_programs[Reveal::CALIBPROG]
-        = Reveal::getInstance()->createProgram(calib43VS.c_str(), 
-				calib43FS.c_str());
+        m_programs[Reveal::CALIBPROG]
+            = Reveal::getInstance()->createProgram(calib43VS.c_str(), 
+                    calib43FS.c_str());
 #else
-    m_programs[Reveal::CALIBPROG]
-        = Reveal::getInstance()->createProgram(calib30VS.c_str(), 
-				calib30FS.c_str());
+        m_programs[Reveal::CALIBPROG]
+            = Reveal::getInstance()->createProgram(calib30VS.c_str(), 
+                    calib30FS.c_str());
 #endif
-    m_uniforms[Reveal::CALIBPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
-    m_uniforms[Reveal::CALIBPROG][Reveal::VIEWPORTWIDTH]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"viewportWidth");
-    m_uniforms[Reveal::CALIBPROG][Reveal::VIEWPORTHEIGHT]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"viewportHeight");
-    
-    /*
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATTERNTEX]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patternTex");
-    */
-    
-    
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATW]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patW");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATPOSX]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patPosX");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATPOSY]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patPosY");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATNBX]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patNbX");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATNBY]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patNbY");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATRANGE]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patRange");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATOFFSET]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patOffset");
-    m_uniforms[Reveal::CALIBPROG][Reveal::PATBRIGHT]
-        = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patBright");
-        
-        
-    m_calibGeom = new QuadGeometry();
+        m_uniforms[Reveal::CALIBPROG]=map<Reveal::REVIL_UNIFORM, GLint>();
+        m_uniforms[Reveal::CALIBPROG][Reveal::VIEWPORTWIDTH]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"viewportWidth");
+        m_uniforms[Reveal::CALIBPROG][Reveal::VIEWPORTHEIGHT]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"viewportHeight");
+
+        /*
+           m_uniforms[Reveal::CALIBPROG][Reveal::PATTERNTEX]
+           = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patternTex");
+           */
+
+
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATW]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patW");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATPOSX]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patPosX");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATPOSY]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patPosY");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATNBX]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patNbX");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATNBY]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patNbY");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATRANGE]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patRange");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATOFFSET]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patOffset");
+        m_uniforms[Reveal::CALIBPROG][Reveal::PATBRIGHT]
+            = glGetUniformLocation(m_programs[Reveal::CALIBPROG],"patBright");
+
+
+        m_calibGeom = new QuadGeometry();
     }
 }
 
 void ProjectorModule::createRTT(GLuint& tex, GLuint& fbo, 
-                                const int& width, const int& height,
-                                bool filter) {
+        const int& width, const int& height,
+        bool filter) {
     glGenTextures(1, &tex);
     glBindTexture(GL_TEXTURE_2D, tex);
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height,
-                 0, GL_RGBA, GL_FLOAT, 0);
+            0, GL_RGBA, GL_FLOAT, 0);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
-                    filter?GL_LINEAR:GL_NEAREST);
+            filter?GL_LINEAR:GL_NEAREST);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
-                    filter?GL_LINEAR:GL_NEAREST);
+            filter?GL_LINEAR:GL_NEAREST);
     glGenFramebuffers(1, &fbo);
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
     glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex, 0);
@@ -791,9 +791,9 @@ void ProjectorModule::createRTT(GLuint& tex, GLuint& fbo,
     glGenRenderbuffers(1, &idDepthrenderbuffer);
     glBindRenderbuffer(GL_RENDERBUFFER, idDepthrenderbuffer);
     glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT,
-                          width, height);
+            width, height);
     glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,
-                              GL_RENDERBUFFER, idDepthrenderbuffer);
+            GL_RENDERBUFFER, idDepthrenderbuffer);
     glBindFramebuffer(GL_FRAMEBUFFER, 0);
 }
 
@@ -817,9 +817,9 @@ void ProjectorModule::refreshDepthCamList(const vector<DepthCamModule*> cams) {
         labels.push_back((*itCam)->getName());
     }
     m_attributesMap["attached_to_camera"]
-            ->editStringValuesChoices().assign(1, labels);
+        ->editStringValuesChoices().assign(1, labels);
     m_attributesMap["calibrate_with_camera"]
-            ->editStringValuesChoices().assign(1, labels);
+        ->editStringValuesChoices().assign(1, labels);
 }
 
 void ProjectorModule::attachToCam(const string& camName) {
@@ -835,7 +835,7 @@ void ProjectorModule::attachToCam(const string& camName) {
 }
 
 void ProjectorModule::setWindowDimensions(const int& x, const int& y,
-                                          const int& w, const int& h) {
+        const int& w, const int& h) {
     glfwSetWindowPos(m_projWindow, x, y);
     glfwSetWindowSize(m_projWindow, w, h);
     m_width=w;
@@ -870,7 +870,7 @@ void ProjectorModule::fullscreenMonitor(const std::string& monitorName) {
     m_posX=posX;
     m_posY=posY;
     glfwSetWindowMonitor(m_projWindow, monitor, 0, 0,
-                         m_width, m_height, GLFW_DONT_CARE);
+            m_width, m_height, GLFW_DONT_CARE);
     updateWindowDims();
     refreshMonitors();
 }
@@ -889,17 +889,17 @@ void ProjectorModule::refreshMonitors(){
 
 void ProjectorModule::setViewMatrix(const vector<float>& vals) {
     m_viewMat = mat4(vals[0], vals[1], vals[2], vals[3],
-                     vals[4], vals[5], vals[6], vals[7],
-                     vals[8], vals[9], vals[10], vals[11],
-                     vals[12], vals[13], vals[14], vals[15]);
+            vals[4], vals[5], vals[6], vals[7],
+            vals[8], vals[9], vals[10], vals[11],
+            vals[12], vals[13], vals[14], vals[15]);
     updateViewProjMatrix();
 }
 
 void ProjectorModule::setProjectionMatrix(const vector<float>& vals) {
     m_projMat = mat4(vals[0], vals[1], vals[2], vals[3],
-                     vals[4], vals[5], vals[6], vals[7],
-                     vals[8], vals[9], vals[10], vals[11],
-                     vals[12], vals[13], vals[14], vals[15]);
+            vals[4], vals[5], vals[6], vals[7],
+            vals[8], vals[9], vals[10], vals[11],
+            vals[12], vals[13], vals[14], vals[15]);
     updateViewProjMatrix();
 }
 
@@ -954,52 +954,52 @@ void ProjectorModule::processOutput() {
     if(revModules.size()>0 || camModules.size()>0) {
         //retrieve output image
         glBindTexture(GL_TEXTURE_2D, m_outputTex);
-		glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, 
-							GL_INT,
-							m_outputImg);
+        glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, 
+                GL_INT,
+                m_outputImg);
     }
 
 
     //process shape revealing output
     if(revModules.size()>0) {
-		m_outNbDepth = m_space->getNbDepthModulesFromID();
+        m_outNbDepth = m_space->getNbDepthModulesFromID();
         //get output values for revealed modules with active output
         vector<RevealedModule*>::iterator itSh = revModules.begin();
         for(; itSh!=revModules.end(); ++itSh) {
-			//test if shape is visible from this projector
-			if((*itSh)->getVisibilityMask() & m_visibilityMask) {
-				for(int d=1; d<m_outNbDepth+1; ++d) {
-					DepthModule* mod = m_space->getDepthModuleFromID(d);
-					if(mod) {
-						if(mod->isDepthVisible(d)) {
-							(*itSh)->processReveal(d, 
-												   mod->getName(), 
-												   m_outNbDepth,
-												   m_outputImg);
-							outputProcessed=true;
-						}
-					}
-				}
-			}
+            //test if shape is visible from this projector
+            if((*itSh)->getVisibilityMask() & m_visibilityMask) {
+                for(int d=1; d<m_outNbDepth+1; ++d) {
+                    DepthModule* mod = m_space->getDepthModuleFromID(d);
+                    if(mod) {
+                        if(mod->isDepthVisible(d)) {
+                            (*itSh)->processReveal(d, 
+                                    mod->getName(), 
+                                    m_outNbDepth,
+                                    m_outputImg);
+                            outputProcessed=true;
+                        }
+                    }
+                }
+            }
         }
     }
 
     /*
     //process cam
     if(camModules.size()>0) {
-        unsigned int curs;
-        vector<float> pos(3,0);
-        vector<DepthCamModule*>::iterator itCa = camModules.begin();
-        for(; itCa!=camModules.end(); ++itCa) {
-            extractOutputValue((*itCa)->getDepthID()+500, 0, curs);
-            pos[0] = (int(curs) - int(curs/1000)*1000)*10-5000;
-            pos[1] = (int(curs/1000) - int(curs/1000000)*1000)*10-5000;
-            pos[2] = 10000-int(curs/1000000)*10;
-            //cout<<"got cursor "<<curs<<" from cam at pos "
-            //    <<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<endl;
-            (*itCa)->processCursor(pos);
-        }
-        outputProcessed=true;
+    unsigned int curs;
+    vector<float> pos(3,0);
+    vector<DepthCamModule*>::iterator itCa = camModules.begin();
+    for(; itCa!=camModules.end(); ++itCa) {
+    extractOutputValue((*itCa)->getDepthID()+500, 0, curs);
+    pos[0] = (int(curs) - int(curs/1000)*1000)*10-5000;
+    pos[1] = (int(curs/1000) - int(curs/1000000)*1000)*10-5000;
+    pos[2] = 10000-int(curs/1000000)*10;
+    //cout<<"got cursor "<<curs<<" from cam at pos "
+    //    <<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<endl;
+    (*itCa)->processCursor(pos);
+    }
+    outputProcessed=true;
     }
     */
 
@@ -1009,14 +1009,14 @@ void ProjectorModule::processOutput() {
 
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-		glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 
-						m_outputImgSize, m_outputImgSize,
-						GL_RED_INTEGER, GL_UNSIGNED_INT, m_outputImgInit);
-		/*
-        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
-                     m_outputImgSize, m_outputImgSize, 0,
-                     GL_RGBA, GL_UNSIGNED_BYTE, m_outputImgInit);
-					 */
+        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 
+                m_outputImgSize, m_outputImgSize,
+                GL_RED_INTEGER, GL_UNSIGNED_INT, m_outputImgInit);
+        /*
+           glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,
+           m_outputImgSize, m_outputImgSize, 0,
+           GL_RGBA, GL_UNSIGNED_BYTE, m_outputImgInit);
+           */
 
     }
 }
@@ -1027,59 +1027,59 @@ void ProjectorModule::setAudioProcessType(const std::string& type) {
         if(ptype == type) {
             m_audioProcessType = t;
         }
-		++t;
+        ++t;
     }
 }
 
 void ProjectorModule::processAudio() {
     glBindTexture(GL_TEXTURE_2D, m_audioTex);
     glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, 
-                        GL_INT,
-                        m_audioImg);
-                        
-	//FIXME mix in a compute shader
+            GL_INT,
+            m_audioImg);
+
+    //FIXME mix in a compute shader
     float totalGains = 0;
     for(int i = 0; i<m_nbTracks; i++) {
-		//check if the note has to be played this frame
-		float trackGain = m_audioImg[m_imgBufSize * i];
+        //check if the note has to be played this frame
+        float trackGain = m_audioImg[m_imgBufSize * i];
         if(trackGain>0) {
-			totalGains += trackGain;
-			//Mix all tracks with gain from number of voxels
+            totalGains += trackGain;
+            //Mix all tracks with gain from number of voxels
             for(int j=0; j<m_audioBufSize; j++) {
                 m_audioBuffer[j] += trackGain 
-					* (float(m_audioImg[(m_imgBufSize*i)+3+j])
-						/ m_maxAudioValue);
+                    * (float(m_audioImg[(m_imgBufSize*i)+3+j])
+                            / m_maxAudioValue);
             }
 
-			//copy the old and new phases
-			m_audioImgInit[3*i+1] = m_audioImg[m_imgBufSize*i+1];
-			m_audioImgInit[3*i+2] = m_audioImg[m_imgBufSize*i+2];
+            //copy the old and new phases
+            m_audioImgInit[3*i+1] = m_audioImg[m_imgBufSize*i+1];
+            m_audioImgInit[3*i+2] = m_audioImg[m_imgBufSize*i+2];
         }
     }
 
 
-	float gain = 0.4;
+    float gain = 0.4;
     if(totalGains > 0) {
         for(int i=0; i<m_audioBufSize; i++) {
             m_audioBuffer[i] = gain*m_audioBuffer[i]/totalGains;
         }
         m_audioNextBuf = AudioManager::getInstance()->changeBuf(m_audioBuffer, 
-							m_maxAudioValue);
+                m_maxAudioValue);
         memset(&m_audioBuffer[0], 0, (m_audioBufSize)*sizeof(float));
     }
     else{
         memset(&m_audioBuffer[0], 0, (m_audioBufSize)*sizeof(float));
         m_audioNextBuf = AudioManager::getInstance()->changeBuf(m_audioBuffer, 
-				m_maxAudioValue);
-	}
-	
-	//reset the gain and transfer the old and new phases
+                m_maxAudioValue);
+    }
+
+    //reset the gain and transfer the old and new phases
     glBindTexture(GL_TEXTURE_2D, m_audioTex);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 3, m_nbTracks,
-                	GL_RED_INTEGER, GL_INT, &m_audioImgInit[0]);
-   
+            GL_RED_INTEGER, GL_INT, &m_audioImgInit[0]);
+
 }
 
 void ProjectorModule::updateWindowSize(const int& w, const int& h) {
@@ -1107,12 +1107,12 @@ void ProjectorModule::updateWindowDims() {
 //-------------------------Calibration----------------------------------
 
 /*
-static void cbPatternSquareWidth(int w, void* mod) {
-    if(w>10) {
-        ProjectorModule* proj = static_cast<ProjectorModule*>(mod);
-        proj->setPatternSquareWidth(w);
-    }
-}*/
+   static void cbPatternSquareWidth(int w, void* mod) {
+   if(w>10) {
+   ProjectorModule* proj = static_cast<ProjectorModule*>(mod);
+   proj->setPatternSquareWidth(w);
+   }
+   }*/
 
 void ProjectorModule::setPatternSquareWidth(const int& w) {
     m_patternSquareWidth=w;
@@ -1223,17 +1223,17 @@ void ProjectorModule::calibrate(const std::string& camName) {
     namedWindow("DepthCamRGB");
     namedWindow("Controls");
     createTrackbar("Pattern Offset X", "Controls",
-                    &m_patternPosOffset.width, 1000, cbPatternPosOX, this);
+            &m_patternPosOffset.width, 1000, cbPatternPosOX, this);
     createTrackbar("Pattern Offset Y", "Controls",
-                    &m_patternPosOffset.height, 500, cbPatternPosOY, this);
+            &m_patternPosOffset.height, 500, cbPatternPosOY, this);
     createTrackbar("Pattern Range X", "Controls",
-                    &m_patternPosRange.width, 1920, cbPatternPosRX, this);
+            &m_patternPosRange.width, 1920, cbPatternPosRX, this);
     createTrackbar("Pattern Range Y", "Controls",
-                    &m_patternPosRange.height, 1080, cbPatternPosRY, this);
+            &m_patternPosRange.height, 1080, cbPatternPosRY, this);
     createTrackbar("Pattern Brightness", "Controls",
-                    &m_patternBrightness, 100, cbPatternBrightness, this);
+            &m_patternBrightness, 100, cbPatternBrightness, this);
     createTrackbar("Calibrate (1:Start, 0:Cancel)", "Controls",
-                    NULL, 1, cbCalib, this);
+            NULL, 1, cbCalib, this);
     vector<vector<Point3f> > objectPoints;
     vector<vector<Point2f> > imagePoints;
     Mat cameraMatrix = Mat::eye(3, 3, CV_64F);
@@ -1247,16 +1247,16 @@ void ProjectorModule::calibrate(const std::string& camName) {
         m_patternSquareWidth = m_height/20;
 
         m_patternPosition.width = (m_patternPosRange.width-m_patternSquareWidth)
-                                        / sqrt(m_neededFramesNb)
-                                    *(fmod(f,sqrt(m_neededFramesNb)))
-                                  +m_patternSquareWidth
-                                  +m_patternPosOffset.width;
+            / sqrt(m_neededFramesNb)
+            *(fmod(f,sqrt(m_neededFramesNb)))
+            +m_patternSquareWidth
+            +m_patternPosOffset.width;
 
         m_patternPosition.height=(m_patternPosRange.height-m_patternSquareWidth)
-                                        / sqrt(m_neededFramesNb)
-                                    *(floor(f/sqrt(m_neededFramesNb)))
-                                  +m_patternSquareWidth
-                                  +m_patternPosOffset.height;
+            / sqrt(m_neededFramesNb)
+            *(floor(f/sqrt(m_neededFramesNb)))
+            +m_patternSquareWidth
+            +m_patternPosOffset.height;
         updateCalibrationPattern();
 
         //display frame with calibration pattern
@@ -1268,25 +1268,25 @@ void ProjectorModule::calibrate(const std::string& camName) {
         glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
         glUseProgram(m_programs[Reveal::CALIBPROG]);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::VIEWPORTWIDTH],
-                    m_width);
+                m_width);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::VIEWPORTHEIGHT],
-                    m_height);
+                m_height);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::PATW],
-                    m_patternSquareWidth);
+                m_patternSquareWidth);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::PATPOSX],
-                    m_patternPosition.width);
+                m_patternPosition.width);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::PATPOSY],
-                    m_patternPosition.height);
+                m_patternPosition.height);
         glUniform2f(m_uniforms[Reveal::CALIBPROG][Reveal::PATOFFSET],
-                    m_patternPosOffset.width, m_patternPosOffset.height);
+                m_patternPosOffset.width, m_patternPosOffset.height);
         glUniform2f(m_uniforms[Reveal::CALIBPROG][Reveal::PATRANGE],
-                    m_patternPosRange.width, m_patternPosRange.height);
+                m_patternPosRange.width, m_patternPosRange.height);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::PATNBX],
-                    m_patternSize.width);
+                m_patternSize.width);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::PATNBY],
-                    m_patternSize.height);
+                m_patternSize.height);
         glUniform1f(m_uniforms[Reveal::CALIBPROG][Reveal::PATBRIGHT],
-                    float(m_patternBrightness)/100.0);
+                float(m_patternBrightness)/100.0);
         m_calibGeom->drawDirect(m_contextHandlerID);
         glfwSwapBuffers(m_projWindow);
 
@@ -1303,7 +1303,7 @@ void ProjectorModule::calibrate(const std::string& camName) {
                 for(int i=0; i<m_imageSize.width; ++i) {
                     cv::Vec3b& pix = kinectRgbImg.at<cv::Vec3b>(j,i);
                     int coord=0;
-					coord=j*m_imageSize.width+i;
+                    coord=j*m_imageSize.width+i;
                     openni::RGB888Pixel colorPix =
                         ((openni::RGB888Pixel*) colorFrame.getData())[coord];
                     pix[0]=colorPix.r;
@@ -1318,19 +1318,19 @@ void ProjectorModule::calibrate(const std::string& camName) {
                 m_foundCorners.clear();
                 //find chessboard in image
                 bool patternFound = findChessboardCorners(
-                                                  kinectRgbImg,
-                                                  m_patternSize,
-                                                  m_foundCorners,
-                                                  CALIB_CB_ADAPTIVE_THRESH);
+                        kinectRgbImg,
+                        m_patternSize,
+                        m_foundCorners,
+                        CALIB_CB_ADAPTIVE_THRESH);
                 //if we found it
                 if(patternFound) {
                     //refine
                     Mat gray;
                     cvtColor(kinectRgbImg, gray, COLOR_RGB2GRAY);
                     cornerSubPix(gray, m_foundCorners,
-                             cv::Size(1, 1), cv::Size(-1, -1),
-                             TermCriteria(TermCriteria::EPS,
-                                          30, 0.1));
+                            cv::Size(1, 1), cv::Size(-1, -1),
+                            TermCriteria(TermCriteria::EPS,
+                                30, 0.1));
 
 
                     bool validDepths=true;
@@ -1339,27 +1339,27 @@ void ProjectorModule::calibrate(const std::string& camName) {
                     vector<Point2f>::iterator itPnt=m_foundCorners.begin();
                     for(; itPnt!=m_foundCorners.end(); ++itPnt) {
                         float posX, posY, posZ;
-						Point2f coord = Point2f((*itPnt).x,(*itPnt).y);
-						Point2f depthCoord = coord;
+                        Point2f coord = Point2f((*itPnt).x,(*itPnt).y);
+                        Point2f depthCoord = coord;
 
                         openni::DepthPixel depthPix =
                             ((openni::DepthPixel*)depthFrame.getData())[int(
-                                    depthCoord.y*m_imageSize.width +
-                                    depthCoord.x)];
+                            depthCoord.y*m_imageSize.width +
+                            depthCoord.x)];
                         posZ=depthPix;
 
                         //filter the depth
                         int size=6;
                         vector<double> vals;
                         for(int x=depthCoord.x-size/2;
-                                    x<depthCoord.x+size/2; ++x) {
+                                x<depthCoord.x+size/2; ++x) {
                             for(int y=depthCoord.y-size/2;
                                     y<depthCoord.y+size/2; ++y) {
                                 if(x>=0 && x<m_imageSize.width &&
                                         y>=0 && y<m_imageSize.height) {
                                     vals.push_back(
-                                    ((openni::DepthPixel*)depthFrame.getData())
-                                        [int(y*m_imageSize.width + x)]);
+                                            ((openni::DepthPixel*)depthFrame.getData())
+                                            [int(y*m_imageSize.width + x)]);
                                 }
                             }
                         }
@@ -1368,11 +1368,11 @@ void ProjectorModule::calibrate(const std::string& camName) {
                         depthPix=posZ;
 
                         openni::CoordinateConverter::convertDepthToWorld(
-                                                    cam->getDepthStream(),
-                                                    int(depthCoord.x),
-                                                    int(depthCoord.y),
-                                                    depthPix,
-                                                    &posX, &posY, &posZ);
+                                cam->getDepthStream(),
+                                int(depthCoord.x),
+                                int(depthCoord.y),
+                                depthPix,
+                                &posX, &posY, &posZ);
                         //if(reversed) {
                         //    posX=-posX;
                         //    posY=-posY;
@@ -1400,22 +1400,22 @@ void ProjectorModule::calibrate(const std::string& camName) {
 
                         //draw corners
                         drawChessboardCorners(kinectRgbImg, m_patternSize,
-                                              m_foundCorners, patternFound);
+                                m_foundCorners, patternFound);
 
 
                         imshow("DepthCamRGB", kinectRgbImg);
                         waitKey(10);
 
                         //wait
-                        #ifdef POSIX
-                            sleep(1);
-                        #else
-                            Sleep(1000);
-                        #endif
+#ifdef POSIX
+                        sleep(1);
+#else
+                        Sleep(1000);
+#endif
 
                         //increase frame count
                         ++f;
-                     }
+                    }
                 }
             }
             waitKey(10);
@@ -1440,20 +1440,20 @@ void ProjectorModule::calibrate(const std::string& camName) {
         float w = m_width;
         float h = m_height;
         cameraMatrix = (Mat1d(3, 3) <<  w, 0, w/2.,
-                                        0, h, h / 2.,
-                                        0, 0, 1);
+                0, h, h / 2.,
+                0, 0, 1);
         distCoeffs = Mat::zeros(8, 1, CV_64F);
         rms=calibrateCamera(vvo, vvi,
-                               Size(w, h), cameraMatrix,
-                               distCoeffs, rvecs, tvecs,
-                               CALIB_FIX_K1+
-                               CALIB_FIX_K2+
-                               CALIB_FIX_K3+
-                               CALIB_FIX_K4+
-                               CALIB_FIX_K5+
-                               CALIB_FIX_K6+
-                               CALIB_ZERO_TANGENT_DIST+
-                               CALIB_USE_INTRINSIC_GUESS);
+                Size(w, h), cameraMatrix,
+                distCoeffs, rvecs, tvecs,
+                CALIB_FIX_K1+
+                CALIB_FIX_K2+
+                CALIB_FIX_K3+
+                CALIB_FIX_K4+
+                CALIB_FIX_K5+
+                CALIB_FIX_K6+
+                CALIB_ZERO_TANGENT_DIST+
+                CALIB_USE_INTRINSIC_GUESS);
 
         cout<<"... done , RMS="<<rms<<endl;
 
@@ -1464,24 +1464,24 @@ void ProjectorModule::calibrate(const std::string& camName) {
         Rodrigues(rot, rotMat);
 
         mat4 viewMatrix(rotMat.at<double>(0,0), rotMat.at<double>(1,0),
-                            rotMat.at<double>(2,0), 0,
-                        rotMat.at<double>(0,1), rotMat.at<double>(1,1),
-                            rotMat.at<double>(2,1), 0,
-                        rotMat.at<double>(0,2), rotMat.at<double>(1,2),
-                            rotMat.at<double>(2,2), 0,
-                        tvecs[0].at<double>(0,0), tvecs[0].at<double>(1,0),
-                            tvecs[0].at<double>(2,0), 1);
+                rotMat.at<double>(2,0), 0,
+                rotMat.at<double>(0,1), rotMat.at<double>(1,1),
+                rotMat.at<double>(2,1), 0,
+                rotMat.at<double>(0,2), rotMat.at<double>(1,2),
+                rotMat.at<double>(2,2), 0,
+                tvecs[0].at<double>(0,0), tvecs[0].at<double>(1,0),
+                tvecs[0].at<double>(2,0), 1);
 
         mat4 glCoordsMat(-1, 0, 0, 0,
-                          0, 1, 0, 0,
-                          0, 0, 1, 0,
-                          0, 0, 0, 1);
+                0, 1, 0, 0,
+                0, 0, 1, 0,
+                0, 0, 0, 1);
         m_viewMat=glCoordsMat*viewMatrix;
 
         m_attributesMap["view_matrix"]->setFloats(
-                                            vector<float>(
-                                               value_ptr(m_viewMat),
-                                               value_ptr(m_viewMat)+16));
+                vector<float>(
+                    value_ptr(m_viewMat),
+                    value_ptr(m_viewMat)+16));
         //build the opengl projection matrix
         double fx=cameraMatrix.at<double>(0,0);
         double cx=cameraMatrix.at<double>(0,2);
@@ -1499,8 +1499,8 @@ void ProjectorModule::calibrate(const std::string& camName) {
                 1.0-2.0*(cx)/w,-1.0+(2.0*(cy)+2.0)/h,   (f+n)/(n-f),    -1,
                 0,              0,                      (2.0*f*n)/(n-f), 0);
         m_attributesMap["projection_matrix"]->setFloats(
-                    vector<float>(value_ptr(projMatrix),
-                                  value_ptr(projMatrix)+16));
+                vector<float>(value_ptr(projMatrix),
+                    value_ptr(projMatrix)+16));
         m_attributesMap["attached_to_camera"]
             ->setStrings(vector<string>(1, cam->getName()));
     }
@@ -1528,19 +1528,19 @@ void ProjectorModule::calibrate(const std::string& camName) {
                     openni::DepthPixel depthPix =
                         ((openni::DepthPixel*)depthFrame.getData())[coord];
                     openni::CoordinateConverter::convertDepthToWorld(
-                                                        cam->getDepthStream(),
-                                                        i, j, depthPix,
-                                                        &posX, &posY, &posZ);
+                            cam->getDepthStream(),
+                            i, j, depthPix,
+                            &posX, &posY, &posZ);
                     objPnts.push_back(Point3f(posX,posY,posZ));
                     const openni::RGB888Pixel& colorPix =
                         ((openni::RGB888Pixel*) colorFrame.getData())[coord];
                     kinPnts.push_back(cv::Vec3b(colorPix.r,
-                                            colorPix.g,
-                                            colorPix.b));
+                                colorPix.g,
+                                colorPix.b));
                 }
             }
             projectPoints(objPnts, rvecs[0], tvecs[0],
-                          cameraMatrix, distCoeffs, imgPnts);
+                    cameraMatrix, distCoeffs, imgPnts);
 
             //for each of the image points
             vector<Point2f>::iterator itPnt=imgPnts.begin();
@@ -1553,8 +1553,8 @@ void ProjectorModule::calibrate(const std::string& camName) {
                         (*itPnt).x>0 &&
                         (*itPnt).y>0) {
                     reconstructionImg.at<cv::Vec3b>(
-                                    (*itPnt).y,
-                                    (*itPnt).x)
+                            (*itPnt).y,
+                            (*itPnt).x)
                         =(*itKin);
                 }
             }
diff --git a/src/shaders/render43.fs b/src/shaders/render43.fs
index 6730d51..e3efbf8 100644
--- a/src/shaders/render43.fs
+++ b/src/shaders/render43.fs
@@ -23,13 +23,13 @@ layout(binding=6) uniform sampler2D gradientTex;
 layout(r32ui, binding=0) uniform coherent uimage2D outputTex;
 layout(r32i, binding=1) uniform coherent iimage2D audioTex;
 
-uniform int audioMixSize;
-uniform int audioBufSize;
-uniform float maxAudioValue;
-uniform int audioRate;
-uniform int processAudio;
-uniform int audioNextBuf;
-uniform int audioNbTracks;
+layout(location=100) uniform int audioMixSize;
+layout(location=101) uniform int audioBufSize;
+layout(location=102) uniform float maxAudioValue;
+layout(location=103) uniform int audioRate;
+layout(location=104) uniform int processAudio;
+layout(location=105) uniform int audioNextBuf;
+layout(location=106) uniform int audioNbTracks;
 
 uniform float viewportWidth;
 uniform float viewportHeight;
@@ -94,513 +94,513 @@ uniform int depthOutNb;
 uniform vec4 boundingRect;
 
 vec3 rgb2hsv(vec3 c){
-	vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
-	vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
-	vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
-	float d = q.x - min(q.w, q.y);
-	float e = 1.0e-10;
-	return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)),d/(q.x + e), q.x);
+    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);
+    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));
+    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));
+    float d = q.x - min(q.w, q.y);
+    float e = 1.0e-10;
+    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)),d/(q.x + e), q.x);
 }
 
 float random (vec3 st){
-	return fract(sin(dot(st.xyz,
-					vec3(12.9898,78.233, 102.234)))*
-			43758.5453123);
+    return fract(sin(dot(st.xyz,
+                    vec3(12.9898,78.233, 102.234)))*
+            43758.5453123);
 }
 
 out vec4 color;
 
 void additiveSynth(vec4 color) {
 
-	float note = 20.0 
-		+ floor(color.x * float(audioNbTracks))/float(audioNbTracks)*80.0;
-	int ind = int(color.x*float(audioNbTracks));
-	float freq=0.0;
-
-	//count this fragment
-	if(imageAtomicAdd(audioTex, ivec2(0, ind), 1)<1) {
-		//if the audio has not been generated by another fragment
-		//compute frequency
-		freq = float(440.0 * pow(2.0, (note-69.0)/12.0));
-		//retrieve either new or old phase, depending on if audio was processed
-		float phase = float(imageLoad(audioTex, ivec2(1, ind)).x);
-		if(audioNextBuf>0) {//if new phase
-			//retrieve it
-			phase = float(imageLoad(audioTex, ivec2(2, ind)).x);
-			//store it as previous phase
-			imageStore(audioTex, ivec2(1, ind), ivec4(int(phase)));
-		}
-
-		float outputPhase = phase;
-		float samplesPerPeriod = (audioRate/freq);
-		float phaseStep = 1.0;
-		for(int i=0; i<audioBufSize; i++) {
-			//compute and store value starting from 3rd column
-			float s = sin((phase/samplesPerPeriod) * 2.0 * M_PI);
-			imageStore(audioTex, ivec2(i+3, ind), ivec4(int(s*maxAudioValue)));
-
-			//increase phase
-			phase=mod(phase + phaseStep, samplesPerPeriod);
-		}
-
-		//remove audioMixSize steps and write phase to output
-		outputPhase=mod(outputPhase+phaseStep*(audioBufSize-audioMixSize), 
-						samplesPerPeriod);
-		imageStore(audioTex, ivec2(2, ind), ivec4(int(outputPhase)));
-	}
+    float note = 20.0 
+        + floor(color.x * float(audioNbTracks))/float(audioNbTracks)*80.0;
+    int ind = int(color.x*float(audioNbTracks));
+    float freq=0.0;
+
+    //count this fragment
+    if(imageAtomicAdd(audioTex, ivec2(0, ind), 1)<1) {
+        //if the audio has not been generated by another fragment
+        //compute frequency
+        freq = float(440.0 * pow(2.0, (note-69.0)/12.0));
+        //retrieve either new or old phase, depending on if audio was processed
+        float phase = float(imageLoad(audioTex, ivec2(1, ind)).x);
+        if(audioNextBuf>0) {//if new phase
+                            //retrieve it
+            phase = float(imageLoad(audioTex, ivec2(2, ind)).x);
+            //store it as previous phase
+            imageStore(audioTex, ivec2(1, ind), ivec4(int(phase)));
+        }
+
+        float outputPhase = phase;
+        float samplesPerPeriod = (audioRate/freq);
+        float phaseStep = 1.0;
+        for(int i=0; i<audioBufSize; i++) {
+            //compute and store value starting from 3rd column
+            float s = sin((phase/samplesPerPeriod) * 2.0 * M_PI);
+            imageStore(audioTex, ivec2(i+3, ind), ivec4(int(s*maxAudioValue)));
+
+            //increase phase
+            phase=mod(phase + phaseStep, samplesPerPeriod);
+        }
+
+        //remove audioMixSize steps and write phase to output
+        outputPhase=mod(outputPhase+phaseStep*(audioBufSize-audioMixSize), 
+                samplesPerPeriod);
+        imageStore(audioTex, ivec2(2, ind), ivec4(int(outputPhase)));
+    }
 }
 
 void pitchedAdditiveSynth(vec4 color) {
-	float freq=0.0;
-	float note = 20 + color.x * 80;
-	int ind=0;
-	
-	int octave = int(note/12);
-	float modNote = mod(note, 12.0);
-
-	if(modNote >= 8.5){
-		note = octave * 12 + 10;
-		ind = 4 * octave + 3;
-	}
-	else if(modNote >= 5.5){
-		note = octave * 12 + 7;
-		ind = 4 * octave + 2;
-	}
-	else if(modNote >= 2.0){
-		note = octave * 12 + 4;
-		ind = 4 * octave + 1;
-	}
-	else{
-		note = octave * 12;
-		ind = 4 * octave;
-	}
-
-	//count this fragment
-	if(imageAtomicAdd(audioTex, ivec2(0, ind), 1)<1) {
-		//if the audio has not been generated by another fragment
-		//compute frequency
-		freq = float(440.0 * pow(2.0, (note-69.0)/12.0));
-		//retrieve either new or old phase, depending on if audio was processed
-		float phase = float(imageLoad(audioTex, ivec2(1, ind)).x);
-		if(audioNextBuf>0) {//if new phase
-			//retrieve it
-			phase = float(imageLoad(audioTex, ivec2(2, ind)).x);
-			//store it as previous phase
-			imageStore(audioTex, ivec2(1, ind), ivec4(int(phase)));
-		}
-
-		float outputPhase = phase;
-		float samplesPerPeriod = (audioRate/freq);
-		float phaseStep = 1.0;
-		for(int i=0; i<audioBufSize; i++) {
-			//compute and store value starting from 3rd column
-			float s = sin((phase/samplesPerPeriod) * 2.0 * M_PI);
-			imageStore(audioTex, ivec2(i+3, ind), ivec4(int(s*maxAudioValue)));
-
-			//increase phase
-			phase=mod(phase + phaseStep, samplesPerPeriod);
-		}
-
-		//remove audioMixSize steps and write phase to output
-		outputPhase=mod(outputPhase+phaseStep*(audioBufSize-audioMixSize), 
-						samplesPerPeriod);
-		imageStore(audioTex, ivec2(2, ind), ivec4(int(outputPhase)));
-	}
+    float freq=0.0;
+    float note = 20 + color.x * 80;
+    int ind=0;
+
+    int octave = int(note/12);
+    float modNote = mod(note, 12.0);
+
+    if(modNote >= 8.5){
+        note = octave * 12 + 10;
+        ind = 4 * octave + 3;
+    }
+    else if(modNote >= 5.5){
+        note = octave * 12 + 7;
+        ind = 4 * octave + 2;
+    }
+    else if(modNote >= 2.0){
+        note = octave * 12 + 4;
+        ind = 4 * octave + 1;
+    }
+    else{
+        note = octave * 12;
+        ind = 4 * octave;
+    }
+
+    //count this fragment
+    if(imageAtomicAdd(audioTex, ivec2(0, ind), 1)<1) {
+        //if the audio has not been generated by another fragment
+        //compute frequency
+        freq = float(440.0 * pow(2.0, (note-69.0)/12.0));
+        //retrieve either new or old phase, depending on if audio was processed
+        float phase = float(imageLoad(audioTex, ivec2(1, ind)).x);
+        if(audioNextBuf>0) {//if new phase
+                            //retrieve it
+            phase = float(imageLoad(audioTex, ivec2(2, ind)).x);
+            //store it as previous phase
+            imageStore(audioTex, ivec2(1, ind), ivec4(int(phase)));
+        }
+
+        float outputPhase = phase;
+        float samplesPerPeriod = (audioRate/freq);
+        float phaseStep = 1.0;
+        for(int i=0; i<audioBufSize; i++) {
+            //compute and store value starting from 3rd column
+            float s = sin((phase/samplesPerPeriod) * 2.0 * M_PI);
+            imageStore(audioTex, ivec2(i+3, ind), ivec4(int(s*maxAudioValue)));
+
+            //increase phase
+            phase=mod(phase + phaseStep, samplesPerPeriod);
+        }
+
+        //remove audioMixSize steps and write phase to output
+        outputPhase=mod(outputPhase+phaseStep*(audioBufSize-audioMixSize), 
+                samplesPerPeriod);
+        imageStore(audioTex, ivec2(2, ind), ivec4(int(outputPhase)));
+    }
 }
 
 void main(void) {
-	//get fragment coordinates
-	float coordX = (gl_FragCoord.x-0.5)/viewportWidth;
-	float coordY = (gl_FragCoord.y-0.5)/viewportHeight;
-	ivec2 sliSize = textureSize(sliceTex, 0);
-
-	//retrieve pixel in slicing texture
-	vec4 sli = texelFetch(sliceTex, ivec2(coordX*float(sliSize.x), coordY*float(sliSize.y)), 0);
-	float pixZ=abs(gl_FragCoord.z);
-	float cutZ=abs(sli.z);
-	int depthID=int(sli.y)-1;
-
-	int outCols=imageSize(outputTex).x;
-	int outOffset=(int(shapeID-1)*depthOutNb+(depthID-1))*revSize;
-
-	int rendered=0;
-	vec3 finalColor = shapeColor;
-	float alpha=0;
-	vec3 pixelPosW;
-	vec3 pixelPos = vec3(0.0, 0.0, 1.0);
-	vec3 ratioWithinBox = vec3(0.0, 0.0, 0.0);
-	vec3 outRatioWithinBox = vec3(0.0, 0.0, 0.0);
-
-	//if there is a slicing pixel aligned with our coordinate
-	//and we are revealed by this depth module
-	if(cutZ>0 && (revealedBy & (1<<(1+depthID)))>0 ) {
-		//compute the slicing pixel world position
-		pixelPosW = vec3(viewMat[3][0], viewMat[3][1], viewMat[3][2]) + vec3(normalize(viewRay) * sli.w);
-		pixelPosW.x = pixelPosW.x*(-2.0*(1-mirrored)+1.0);
-		//compute the slicing pixel position in model coords
-		pixelPos = (invModelMat * vec4(pixelPosW,1.0)).xyz;
-
-		//depending on type, test if slicing pixel inside 
-		//and retrieve distance to the surface on each axis
-		vec3 diffMin = vec3(1.0);
-		vec3 diffMax = vec3(1.0);
-
-		switch(shapeGeom) {
-			case PATH : {
-				//use min/max/size of current segment
-				pixelPos = (subShapeInvMat*vec4(pixelPos,1.0)).xyz;
-				if(length(vec2(pixelPos.x, pixelPos.y))<=0.5 && (pixelPos.z>-0.5 && pixelPos.z<0.5)) {
-					float xx = (pixelPos.x)*(pixelPos.x);
-					float yy = (pixelPos.y)*(pixelPos.y);
-					float ax = sqrt(0.25-yy);
-					diffMin.x = pixelPos.x+ax;
-					diffMax.x = ax-pixelPos.x;
-					float ay = sqrt(0.25-xx);
-					diffMin.y = pixelPos.y+ay;
-					diffMax.y = ay-pixelPos.y;
-					diffMin.z = pixelPos.z+0.5;
-					diffMax.z = 0.5-pixelPos.z;
-					rendered=1;
-				}
-			} break;
-			case CONE : {
-				if(pixelPos.y<0.5 && pixelPos.y>-0.5) {
-					float xx = (pixelPos.x)*(pixelPos.x);
-					float yy = (pixelPos.y-0.5)*(pixelPos.y-0.5);
-					float zz = (pixelPos.z)*(pixelPos.z);
-					if((xx+zz)/yy<0.25){
-						float ax = sqrt(0.25*yy-zz);
-						diffMin.x = pixelPos.x+ax;
-						diffMax.x = ax-pixelPos.x;
-						float ay = sqrt((yy+xx)/0.25);
-						diffMin.y = pixelPos.y+0.5;
-						diffMax.y = 0.5-pixelPos.y;
-						float az = sqrt(0.25*yy-xx);
-						diffMin.z = pixelPos.z+az;
-						diffMax.z = az-pixelPos.z;
-						rendered=1;
-					}
-				}
-			} break;
-			case TUBE : {
-				if(length(vec2(pixelPos.x, pixelPos.z))<=0.5 && (pixelPos.y>-0.5 && pixelPos.y<0.5)) {
-					float xx = (pixelPos.x)*(pixelPos.x);
-					float zz = (pixelPos.z)*(pixelPos.z);
-					float ax = sqrt(0.25-zz);
-					diffMin.x = pixelPos.x+ax;
-					diffMax.x = ax-pixelPos.x;
-					float az = sqrt(0.25-xx);
-					diffMin.z = pixelPos.z+az;
-					diffMax.z = az-pixelPos.z;
-					diffMin.y = pixelPos.y+0.5;
-					diffMax.y = 0.5-pixelPos.y;
-					rendered=1;
-				}
-			} break;
-			case SPHERE : {
-				if(length(pixelPos)<=0.5) {
-					float xx = (pixelPos.x)*(pixelPos.x);
-					float yy = (pixelPos.y)*(pixelPos.y);
-					float zz = (pixelPos.z)*(pixelPos.z);
-					float ax = sqrt(0.25-yy-zz);
-					diffMin.x = pixelPos.x+ax;
-					diffMax.x = ax-pixelPos.x;
-					float ay = sqrt(0.25-xx-zz);
-					diffMin.y = pixelPos.y+ay;
-					diffMax.y = ay-pixelPos.y;
-					float az = sqrt(0.25-xx-yy);
-					diffMin.z = pixelPos.z+az;
-					diffMax.z = az-pixelPos.z;
-					rendered=1;
-				}
-			} break;
-			case BOX : {
-				diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
-				diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
-				if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 
-						&& diffMin.z>0 && diffMax.z>0){
-					rendered=1;
-				}
-			} break;
-			case FRAME : {
-				diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
-				diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
-				if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 
-						&& diffMin.z>0 && diffMax.z>0){
-					rendered=1;
-				}
-			} break;
-			case MODEL : {
-				ivec2 selSize = textureSize(selectTex, 0);
-				vec4 sel = texelFetch(selectTex,
-				ivec2(coordX*float(selSize.x), coordY*float(selSize.y)), 0);
-				//get front surfaces before depth map
-				if(pixZ<=cutZ+thickness/1000.0) {
-					if(sel.z==0) {
-						if(sel.x==shapeID) {
-							rendered=1;
-						}
-						else if((int(shapeIDBit)&int(sel.w))>0) {
-							diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
-							diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
-							if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 
-									&& diffMax.y>0 && diffMin.z>0 
-									&& diffMax.z>0){
-								rendered=1;
-							}
-						}
-					}
-					if(surface>0 
-							&& (pixZ>cutZ || (sel.z>0 
-									&& (int(shapeIDBit)&int(sel.w))>0))) {
-						rendered=2;
-					}
-				}
-			} break;
-		}
-		if(rendered>0) {
-			ratioWithinBox = (pixelPos)+0.5;
-			//test if on the surface
-			if(diffMin.x*modelScale.x<thickness 
-					|| diffMax.x*modelScale.x<thickness 
-					|| diffMin.y*modelScale.y<thickness 
-					|| diffMax.y*modelScale.y<thickness 
-					|| diffMin.z*modelScale.z<thickness 
-					|| diffMax.z*modelScale.z<thickness) {
-				rendered=2;
-			}
-			//extend ratiowithinbox to multiplesubshapes
-			//and get gradient ratio according to type
-			float gradRatio = 0;
-			vec3 subAdd;
-			vec3 subDiv;
-			if(insideStructure==0) {
-				//from center
-				subAdd = vec3(subShapeID, subShapeID, subShapeID);
-				subDiv = vec3(subShapesNb, subShapesNb, subShapesNb);
-				ratioWithinBox.xyz=(ratioWithinBox.xyz+subAdd)/subDiv;
-				outRatioWithinBox.xyz=ratioWithinBox.xyz;
-				gradRatio = length(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))/0.5;
-			}
-			else {
-				//from surface or along axes
-				subAdd = vec3(0,0, subShapeID);
-				subDiv = vec3(1,1, subShapesNb);
-				ratioWithinBox.xyz=(ratioWithinBox.xyz+subAdd)/subDiv;
-				outRatioWithinBox.xyz=ratioWithinBox.xyz;
-				if(insideStructure==1) {
-					ratioWithinBox.x=0.5;
-				}
-				else if(insideStructure==2) {
-					ratioWithinBox.y=0.5;
-				}
-				else if(insideStructure==3 && shapeGeom!=PATH) {
-					ratioWithinBox.z=0.5;
-				}
-				switch(shapeGeom) {
+    //get fragment coordinates
+    float coordX = (gl_FragCoord.x-0.5)/viewportWidth;
+    float coordY = (gl_FragCoord.y-0.5)/viewportHeight;
+    ivec2 sliSize = textureSize(sliceTex, 0);
+
+    //retrieve pixel in slicing texture
+    vec4 sli = texelFetch(sliceTex, ivec2(coordX*float(sliSize.x), coordY*float(sliSize.y)), 0);
+    float pixZ=abs(gl_FragCoord.z);
+    float cutZ=abs(sli.z);
+    int depthID=int(sli.y)-1;
+
+    int outCols=imageSize(outputTex).x;
+    int outOffset=(int(shapeID-1)*depthOutNb+(depthID-1))*revSize;
+
+    int rendered=0;
+    vec3 finalColor = shapeColor;
+    float alpha=0;
+    vec3 pixelPosW;
+    vec3 pixelPos = vec3(0.0, 0.0, 1.0);
+    vec3 ratioWithinBox = vec3(0.0, 0.0, 0.0);
+    vec3 outRatioWithinBox = vec3(0.0, 0.0, 0.0);
+
+    //if there is a slicing pixel aligned with our coordinate
+    //and we are revealed by this depth module
+    if(cutZ>0 && (revealedBy & (1<<(1+depthID)))>0 ) {
+        //compute the slicing pixel world position
+        pixelPosW = vec3(viewMat[3][0], viewMat[3][1], viewMat[3][2]) + vec3(normalize(viewRay) * sli.w);
+        pixelPosW.x = pixelPosW.x*(-2.0*(1-mirrored)+1.0);
+        //compute the slicing pixel position in model coords
+        pixelPos = (invModelMat * vec4(pixelPosW,1.0)).xyz;
+
+        //depending on type, test if slicing pixel inside 
+        //and retrieve distance to the surface on each axis
+        vec3 diffMin = vec3(1.0);
+        vec3 diffMax = vec3(1.0);
+
+        switch(shapeGeom) {
+            case PATH : {
+                            //use min/max/size of current segment
+                            pixelPos = (subShapeInvMat*vec4(pixelPos,1.0)).xyz;
+                            if(length(vec2(pixelPos.x, pixelPos.y))<=0.5 && (pixelPos.z>-0.5 && pixelPos.z<0.5)) {
+                                float xx = (pixelPos.x)*(pixelPos.x);
+                                float yy = (pixelPos.y)*(pixelPos.y);
+                                float ax = sqrt(0.25-yy);
+                                diffMin.x = pixelPos.x+ax;
+                                diffMax.x = ax-pixelPos.x;
+                                float ay = sqrt(0.25-xx);
+                                diffMin.y = pixelPos.y+ay;
+                                diffMax.y = ay-pixelPos.y;
+                                diffMin.z = pixelPos.z+0.5;
+                                diffMax.z = 0.5-pixelPos.z;
+                                rendered=1;
+                            }
+                        } break;
+            case CONE : {
+                            if(pixelPos.y<0.5 && pixelPos.y>-0.5) {
+                                float xx = (pixelPos.x)*(pixelPos.x);
+                                float yy = (pixelPos.y-0.5)*(pixelPos.y-0.5);
+                                float zz = (pixelPos.z)*(pixelPos.z);
+                                if((xx+zz)/yy<0.25){
+                                    float ax = sqrt(0.25*yy-zz);
+                                    diffMin.x = pixelPos.x+ax;
+                                    diffMax.x = ax-pixelPos.x;
+                                    float ay = sqrt((yy+xx)/0.25);
+                                    diffMin.y = pixelPos.y+0.5;
+                                    diffMax.y = 0.5-pixelPos.y;
+                                    float az = sqrt(0.25*yy-xx);
+                                    diffMin.z = pixelPos.z+az;
+                                    diffMax.z = az-pixelPos.z;
+                                    rendered=1;
+                                }
+                            }
+                        } break;
+            case TUBE : {
+                            if(length(vec2(pixelPos.x, pixelPos.z))<=0.5 && (pixelPos.y>-0.5 && pixelPos.y<0.5)) {
+                                float xx = (pixelPos.x)*(pixelPos.x);
+                                float zz = (pixelPos.z)*(pixelPos.z);
+                                float ax = sqrt(0.25-zz);
+                                diffMin.x = pixelPos.x+ax;
+                                diffMax.x = ax-pixelPos.x;
+                                float az = sqrt(0.25-xx);
+                                diffMin.z = pixelPos.z+az;
+                                diffMax.z = az-pixelPos.z;
+                                diffMin.y = pixelPos.y+0.5;
+                                diffMax.y = 0.5-pixelPos.y;
+                                rendered=1;
+                            }
+                        } break;
+            case SPHERE : {
+                              if(length(pixelPos)<=0.5) {
+                                  float xx = (pixelPos.x)*(pixelPos.x);
+                                  float yy = (pixelPos.y)*(pixelPos.y);
+                                  float zz = (pixelPos.z)*(pixelPos.z);
+                                  float ax = sqrt(0.25-yy-zz);
+                                  diffMin.x = pixelPos.x+ax;
+                                  diffMax.x = ax-pixelPos.x;
+                                  float ay = sqrt(0.25-xx-zz);
+                                  diffMin.y = pixelPos.y+ay;
+                                  diffMax.y = ay-pixelPos.y;
+                                  float az = sqrt(0.25-xx-yy);
+                                  diffMin.z = pixelPos.z+az;
+                                  diffMax.z = az-pixelPos.z;
+                                  rendered=1;
+                              }
+                          } break;
+            case BOX : {
+                           diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
+                           diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
+                           if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 
+                                   && diffMin.z>0 && diffMax.z>0){
+                               rendered=1;
+                           }
+                       } break;
+            case FRAME : {
+                             diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
+                             diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
+                             if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 
+                                     && diffMin.z>0 && diffMax.z>0){
+                                 rendered=1;
+                             }
+                         } break;
+            case MODEL : {
+                             ivec2 selSize = textureSize(selectTex, 0);
+                             vec4 sel = texelFetch(selectTex,
+                                     ivec2(coordX*float(selSize.x), coordY*float(selSize.y)), 0);
+                             //get front surfaces before depth map
+                             if(pixZ<=cutZ+thickness/1000.0) {
+                                 if(sel.z==0) {
+                                     if(sel.x==shapeID) {
+                                         rendered=1;
+                                     }
+                                     else if((int(shapeIDBit)&int(sel.w))>0) {
+                                         diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
+                                         diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
+                                         if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 
+                                                 && diffMax.y>0 && diffMin.z>0 
+                                                 && diffMax.z>0){
+                                             rendered=1;
+                                         }
+                                     }
+                                 }
+                                 if(surface>0 
+                                         && (pixZ>cutZ || (sel.z>0 
+                                                 && (int(shapeIDBit)&int(sel.w))>0))) {
+                                     rendered=2;
+                                 }
+                             }
+                         } break;
+        }
+        if(rendered>0) {
+            ratioWithinBox = (pixelPos)+0.5;
+            //test if on the surface
+            if(diffMin.x*modelScale.x<thickness 
+                    || diffMax.x*modelScale.x<thickness 
+                    || diffMin.y*modelScale.y<thickness 
+                    || diffMax.y*modelScale.y<thickness 
+                    || diffMin.z*modelScale.z<thickness 
+                    || diffMax.z*modelScale.z<thickness) {
+                rendered=2;
+            }
+            //extend ratiowithinbox to multiplesubshapes
+            //and get gradient ratio according to type
+            float gradRatio = 0;
+            vec3 subAdd;
+            vec3 subDiv;
+            if(insideStructure==0) {
+                //from center
+                subAdd = vec3(subShapeID, subShapeID, subShapeID);
+                subDiv = vec3(subShapesNb, subShapesNb, subShapesNb);
+                ratioWithinBox.xyz=(ratioWithinBox.xyz+subAdd)/subDiv;
+                outRatioWithinBox.xyz=ratioWithinBox.xyz;
+                gradRatio = length(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))/0.5;
+            }
+            else {
+                //from surface or along axes
+                subAdd = vec3(0,0, subShapeID);
+                subDiv = vec3(1,1, subShapesNb);
+                ratioWithinBox.xyz=(ratioWithinBox.xyz+subAdd)/subDiv;
+                outRatioWithinBox.xyz=ratioWithinBox.xyz;
+                if(insideStructure==1) {
+                    ratioWithinBox.x=0.5;
+                }
+                else if(insideStructure==2) {
+                    ratioWithinBox.y=0.5;
+                }
+                else if(insideStructure==3 && shapeGeom!=PATH) {
+                    ratioWithinBox.z=0.5;
+                }
+                switch(shapeGeom) {
                     case BOX : {
-                        vec3 q = abs(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))*2.0 - vec3(1.0,1.0,1.0);
-                        gradRatio = 1.0-abs(length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0));
-                    } break;
-					case SPHERE : {
-                        gradRatio = length(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))/0.5;
-                    } break;
-					case PATH  : {
-					    vec2 d = abs(vec2(length((ratioWithinBox.xy-vec2(0.5, 0.5))*2.0), (ratioWithinBox.z-0.5)*2.0)) - vec2(1.0,1.0);
-                        gradRatio = 1.0 - abs(min(max(d.x,d.y),0.0) + length(max(d,0.0)));
-
-                    } break;
-					case TUBE  : {
-                        vec2 d = abs(vec2(length((ratioWithinBox.xz-vec2(0.5, 0.5))*2.0), (ratioWithinBox.y-0.5)*2.0)) - vec2(1.0,1.0);
-                        gradRatio = 1.0 - abs(min(max(d.x,d.y),0.0) + length(max(d,0.0)));
-                    } break;
-					case CONE : {
-                        float q = length((ratioWithinBox.xz - vec2(0.5,0.5))*2.0);
-						gradRatio = 1.0-abs(max(dot(vec2(0.5,0.5), vec2(q,(ratioWithinBox.y-1.0))), -1.0-(ratioWithinBox.y-1.0)));
-                    } break;
-					case FRAME : {
-                        //FIXME compute frame SDF
-                        vec3 q = abs(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))*2.0 - vec3(1.0,1.0,1.0);
-                        gradRatio = 1.0-abs(length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0));
-                    } break;
-					case MODEL : {
-                        gradRatio = texture(surfDistTex, ratioWithinBox).r * structureRatio;
-                    } break;
-					default :{
-                    //defaults to sphere
-					    gradRatio = length(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))/0.5;
-			        } break;
-				}
-			}
-
-			//texture coordinates
-			vec3 texCoords = vec3(1-ratioWithinBox.x, 1-ratioWithinBox.y, ratioWithinBox.z);
-
-			//start with shapeColor
-			finalColor = shapeColor;
-			//test gradient
-			if(gradientAlpha>0) {
-				float gradColor = pow(gradientCurveRatio<0?1.0-gradRatio:gradRatio, abs(gradientCurveRatio));
-				if(gradientSteps>1) {
-					gradColor = floor(gradColor*gradientSteps) / gradientSteps;
-				}
-				gradColor*=(gradRatio<=1.0)?1.0:0.0;
-				if(gradientType>0) {
-					//gradient texture
-					finalColor=finalColor*(1.0-gradientAlpha) + finalColor*gradientAlpha * texture(gradientTex, vec2(gradRatio, 0.0)).xyz;
-				}
-				else {
-					finalColor=finalColor*(1.0-gradientAlpha) + finalColor*gradColor*gradientAlpha;
-				}
-			}
-			//test density
-			if(densityAlpha>0) {
-				float densColor = pow(densityCurveRatio<0?1.0-gradRatio:gradRatio, abs(densityCurveRatio));
-				if(densityType==0 && //layers
-						length(mod(densColor*100.0, densitySize*100.0)) < densityRatio*densitySize*100.0) {
-					densColor = 1.0;
-					densColor*=(gradRatio<=1.0)?1.0:0.0;
-				}
-				else if(densityType==1 //grid
-						&& (length(mod(ratioWithinBox.x*100, densitySize*100.0)) < densitySize*densityRatio*100.0
-							|| length(mod(ratioWithinBox.y*100, densitySize*100.0)) < densitySize*densityRatio*100.0
-							|| length(mod(ratioWithinBox.z*100, densitySize*100.0)) < densitySize*densityRatio*100.0)) {
-					densColor = 1.0;
-				}
-				else if(densityType==2 //pointcloud
-						&& floor(random(ratioWithinBox.xyz)*floor(100.0))>100.0*densColor) {
-					densColor = 1.0;
-					densColor*=(gradRatio<=1.0)?1.0:0.0;
-				}
-				else {
-					densColor = 0.0;
-				}
-				finalColor=finalColor*(1.0-densityAlpha) + finalColor*densColor*densityAlpha;
-			}
-			//test texture
-			if(texAlpha>0) {
-				vec3 texColor = texture(insideTex, texOffset+texScale*texCoords).xyz;
-				if(texGray>0) {
-					texColor=vec3((texColor.r+texColor.g+texColor.b) / 3.0);
-				}
-				finalColor=finalColor*(1.0-texAlpha) + finalColor*texColor*texAlpha;
-			}
-
-			//if revealing something, output values
-			if(sli.x>=1.0 && depthID<=depthOutNb) {
-				//inside output
-				if(revInside>0 && rendered==1) {
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revInside,outCols), floor((outOffset+revInside))/outCols), 1);					
-				}
-				outRatioWithinBox.x=clamp(outRatioWithinBox.x, 0, 1);
-				outRatioWithinBox.y=clamp(outRatioWithinBox.y, 0, 1);
-				outRatioWithinBox.z=clamp(outRatioWithinBox.z, 0, 1);
-				//compute min,max on the three axes
-				int xk=int(outRatioWithinBox.x*1000.0);
-				int yk=int(outRatioWithinBox.y*1000.0);
-				int zk=int(outRatioWithinBox.z*1000.0);
-				//output min/max ratios
-				if(revCenter>0) {
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+0,outCols), floor((outOffset+revCenter+0)/outCols)), 1000-xk);
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+1,outCols), floor((outOffset+revCenter+1)/outCols)), xk);
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+2,outCols), floor((outOffset+revCenter+2)/outCols)), 1000-yk);
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+3,outCols), floor((outOffset+revCenter+3)/outCols)), yk);
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+4,outCols), floor((outOffset+revCenter+4)/outCols)), 1000-zk);
-					imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+5,outCols), floor((outOffset+revCenter+5)/outCols)), zk);
-				}
-				//convert from rgb to hsv
-				vec3 hsv = rgb2hsv(finalColor);
-				//Sum color channels
-				if(revColor>0) {
-					//count nb revealed points
-					imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+0,outCols), floor((outOffset+revColor+0)/outCols)), 1);
-					//sum point h
-					imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+1,outCols), floor((outOffset+revColor+1)/outCols)), clamp(int(hsv.x*1000.0),0,1000));
-					//sum s
-					imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+2,outCols), floor((outOffset+revColor+2)/outCols)), clamp(int(hsv.y*1000.0),0,1000));
-					//sum v
-					imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+3,outCols), floor((outOffset+revColor+3)/outCols)), clamp(int(hsv.z*1000.0),0,1000));
-				}
-				//histo : accumulate on luminance bins
-				if(revHisto>0) {
-					//count nb revealed points
-					imageAtomicAdd(outputTex, ivec2(mod(outOffset+revHisto,outCols), 
-								floor((outOffset+revHisto)/outCols)), 1);
-					int bin = int(hsv.z*float(histoOutSize-1));
-					imageAtomicAdd(outputTex, ivec2(mod(outOffset+revHisto+1+bin,outCols), floor((outOffset+revHisto+1+bin)/outCols)), 1);
-				}
-
-				//2D grid of projected voxels (nbvox, 3D coords, lum)
-				if(revVoxels>0) {
-					//compute pixel ratio within 2D bounding rect
-					vec2 pixRatio = (vec2(coordX, coordY) - boundingRect.xy) / (boundingRect.zw-boundingRect.xy);
-					pixRatio.x = clamp(pixRatio.x, 0.0, 1.0);
-					pixRatio.y = clamp(pixRatio.y, 0.0, 1.0);
-					//compute offset in voxel output
-					int voxOff = outOffset+revVoxels;
-					voxOff+=5*(int(pixRatio.x*voxelOutSize) 
-							+ int((1.0-pixRatio.y)*voxelOutSize)*voxelOutSize);
-					//accumulate points
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff,outCols), 
-							floor((voxOff)/outCols)), 1);
-					//accumulate coords
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+1,outCols), 
-							floor((voxOff+1)/outCols)),
-							clamp(int(outRatioWithinBox.x*1000.0),0,1000));
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+2,outCols), 
-							floor((voxOff+2)/outCols)), 
-							clamp(int(outRatioWithinBox.y*1000.0),0,1000));
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+3,outCols), 
-							floor((voxOff+3)/outCols)), 
-							clamp(int(outRatioWithinBox.z*1000.0),0,1000));
-					//accumulate lum
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+4,outCols), 
-							floor((voxOff+4)/outCols)),
-							clamp(int(hsv.z*1000.0),0,1000));
-				}
-			}
-		}
-
-		//SURFACE test
-		if(rendered>1) {
-			finalColor = surfaceColor;
-
-			if(revSurface>0 && sli.x>=1.0 && depthID<=depthOutNb) {
-				imageAtomicMax(outputTex, 
-						ivec2(mod(outOffset+revSurface,outCols), 
-							floor((outOffset+revSurface)/outCols)), 1);
-			}
-		}
-	}
-	//final test, output if rendered or not, output final color
-	//if(rendered>0 && length(finalColor)>0) { 
-	if(rendered>0) { 
-		if(revSize>0) {
-			imageAtomicOr(outputTex, ivec2(mod(outOffset,outCols), 
-						floor((outOffset))/outCols), rendered);
-		}
-
-		if((insideVisible>0 && rendered==1) || (surface>0 && rendered==2)) {
-			color = vec4(finalColor, 1.0);
-			switch(processAudio) {
-				case 1 : {
-					additiveSynth(color);
-				}break;
-				case 2 : {
-					pitchedAdditiveSynth(color);
-				}break;
-				default:break;
-			}
-		}
-		else {
-			color = vec4(0.0, 0.0, 0.0, 1.0);
-		}
+                                   vec3 q = abs(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))*2.0 - vec3(1.0,1.0,1.0);
+                                   gradRatio = 1.0-abs(length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0));
+                               } break;
+                    case SPHERE : {
+                                      gradRatio = length(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))/0.5;
+                                  } break;
+                    case PATH  : {
+                                     vec2 d = abs(vec2(length((ratioWithinBox.xy-vec2(0.5, 0.5))*2.0), (ratioWithinBox.z-0.5)*2.0)) - vec2(1.0,1.0);
+                                     gradRatio = 1.0 - abs(min(max(d.x,d.y),0.0) + length(max(d,0.0)));
+
+                                 } break;
+                    case TUBE  : {
+                                     vec2 d = abs(vec2(length((ratioWithinBox.xz-vec2(0.5, 0.5))*2.0), (ratioWithinBox.y-0.5)*2.0)) - vec2(1.0,1.0);
+                                     gradRatio = 1.0 - abs(min(max(d.x,d.y),0.0) + length(max(d,0.0)));
+                                 } break;
+                    case CONE : {
+                                    float q = length((ratioWithinBox.xz - vec2(0.5,0.5))*2.0);
+                                    gradRatio = 1.0-abs(max(dot(vec2(0.5,0.5), vec2(q,(ratioWithinBox.y-1.0))), -1.0-(ratioWithinBox.y-1.0)));
+                                } break;
+                    case FRAME : {
+                                     //FIXME compute frame SDF
+                                     vec3 q = abs(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))*2.0 - vec3(1.0,1.0,1.0);
+                                     gradRatio = 1.0-abs(length(max(q,0.0)) + min(max(q.x,max(q.y,q.z)),0.0));
+                                 } break;
+                    case MODEL : {
+                                     gradRatio = texture(surfDistTex, ratioWithinBox).r * structureRatio;
+                                 } break;
+                    default :{
+                                 //defaults to sphere
+                                 gradRatio = length(ratioWithinBox.xyz - vec3(0.5,0.5,0.5))/0.5;
+                             } break;
+                }
+            }
+
+            //texture coordinates
+            vec3 texCoords = vec3(1-ratioWithinBox.x, 1-ratioWithinBox.y, ratioWithinBox.z);
+
+            //start with shapeColor
+            finalColor = shapeColor;
+            //test gradient
+            if(gradientAlpha>0) {
+                float gradColor = pow(gradientCurveRatio<0?1.0-gradRatio:gradRatio, abs(gradientCurveRatio));
+                if(gradientSteps>1) {
+                    gradColor = floor(gradColor*gradientSteps) / gradientSteps;
+                }
+                gradColor*=(gradRatio<=1.0)?1.0:0.0;
+                if(gradientType>0) {
+                    //gradient texture
+                    finalColor=finalColor*(1.0-gradientAlpha) + finalColor*gradientAlpha * texture(gradientTex, vec2(gradRatio, 0.0)).xyz;
+                }
+                else {
+                    finalColor=finalColor*(1.0-gradientAlpha) + finalColor*gradColor*gradientAlpha;
+                }
+            }
+            //test density
+            if(densityAlpha>0) {
+                float densColor = pow(densityCurveRatio<0?1.0-gradRatio:gradRatio, abs(densityCurveRatio));
+                if(densityType==0 && //layers
+                        length(mod(densColor*100.0, densitySize*100.0)) < densityRatio*densitySize*100.0) {
+                    densColor = 1.0;
+                    densColor*=(gradRatio<=1.0)?1.0:0.0;
+                }
+                else if(densityType==1 //grid
+                        && (length(mod(ratioWithinBox.x*100, densitySize*100.0)) < densitySize*densityRatio*100.0
+                            || length(mod(ratioWithinBox.y*100, densitySize*100.0)) < densitySize*densityRatio*100.0
+                            || length(mod(ratioWithinBox.z*100, densitySize*100.0)) < densitySize*densityRatio*100.0)) {
+                    densColor = 1.0;
+                }
+                else if(densityType==2 //pointcloud
+                        && floor(random(ratioWithinBox.xyz)*floor(100.0))>100.0*densColor) {
+                    densColor = 1.0;
+                    densColor*=(gradRatio<=1.0)?1.0:0.0;
+                }
+                else {
+                    densColor = 0.0;
+                }
+                finalColor=finalColor*(1.0-densityAlpha) + finalColor*densColor*densityAlpha;
+            }
+            //test texture
+            if(texAlpha>0) {
+                vec3 texColor = texture(insideTex, texOffset+texScale*texCoords).xyz;
+                if(texGray>0) {
+                    texColor=vec3((texColor.r+texColor.g+texColor.b) / 3.0);
+                }
+                finalColor=finalColor*(1.0-texAlpha) + finalColor*texColor*texAlpha;
+            }
+
+            //if revealing something, output values
+            if(sli.x>=1.0 && depthID<=depthOutNb) {
+                //inside output
+                if(revInside>0 && rendered==1) {
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revInside,outCols), floor((outOffset+revInside))/outCols), 1);					
+                }
+                outRatioWithinBox.x=clamp(outRatioWithinBox.x, 0, 1);
+                outRatioWithinBox.y=clamp(outRatioWithinBox.y, 0, 1);
+                outRatioWithinBox.z=clamp(outRatioWithinBox.z, 0, 1);
+                //compute min,max on the three axes
+                int xk=int(outRatioWithinBox.x*1000.0);
+                int yk=int(outRatioWithinBox.y*1000.0);
+                int zk=int(outRatioWithinBox.z*1000.0);
+                //output min/max ratios
+                if(revCenter>0) {
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+0,outCols), floor((outOffset+revCenter+0)/outCols)), 1000-xk);
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+1,outCols), floor((outOffset+revCenter+1)/outCols)), xk);
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+2,outCols), floor((outOffset+revCenter+2)/outCols)), 1000-yk);
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+3,outCols), floor((outOffset+revCenter+3)/outCols)), yk);
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+4,outCols), floor((outOffset+revCenter+4)/outCols)), 1000-zk);
+                    imageAtomicMax(outputTex, ivec2(mod(outOffset+revCenter+5,outCols), floor((outOffset+revCenter+5)/outCols)), zk);
+                }
+                //convert from rgb to hsv
+                vec3 hsv = rgb2hsv(finalColor);
+                //Sum color channels
+                if(revColor>0) {
+                    //count nb revealed points
+                    imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+0,outCols), floor((outOffset+revColor+0)/outCols)), 1);
+                    //sum point h
+                    imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+1,outCols), floor((outOffset+revColor+1)/outCols)), clamp(int(hsv.x*1000.0),0,1000));
+                    //sum s
+                    imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+2,outCols), floor((outOffset+revColor+2)/outCols)), clamp(int(hsv.y*1000.0),0,1000));
+                    //sum v
+                    imageAtomicAdd(outputTex, ivec2(mod(outOffset+revColor+3,outCols), floor((outOffset+revColor+3)/outCols)), clamp(int(hsv.z*1000.0),0,1000));
+                }
+                //histo : accumulate on luminance bins
+                if(revHisto>0) {
+                    //count nb revealed points
+                    imageAtomicAdd(outputTex, ivec2(mod(outOffset+revHisto,outCols), 
+                                floor((outOffset+revHisto)/outCols)), 1);
+                    int bin = int(hsv.z*float(histoOutSize-1));
+                    imageAtomicAdd(outputTex, ivec2(mod(outOffset+revHisto+1+bin,outCols), floor((outOffset+revHisto+1+bin)/outCols)), 1);
+                }
+
+                //2D grid of projected voxels (nbvox, 3D coords, lum)
+                if(revVoxels>0) {
+                    //compute pixel ratio within 2D bounding rect
+                    vec2 pixRatio = (vec2(coordX, coordY) - boundingRect.xy) / (boundingRect.zw-boundingRect.xy);
+                    pixRatio.x = clamp(pixRatio.x, 0.0, 1.0);
+                    pixRatio.y = clamp(pixRatio.y, 0.0, 1.0);
+                    //compute offset in voxel output
+                    int voxOff = outOffset+revVoxels;
+                    voxOff+=5*(int(pixRatio.x*voxelOutSize) 
+                            + int((1.0-pixRatio.y)*voxelOutSize)*voxelOutSize);
+                    //accumulate points
+                    imageAtomicAdd(outputTex, ivec2(mod(voxOff,outCols), 
+                                floor((voxOff)/outCols)), 1);
+                    //accumulate coords
+                    imageAtomicAdd(outputTex, ivec2(mod(voxOff+1,outCols), 
+                                floor((voxOff+1)/outCols)),
+                            clamp(int(outRatioWithinBox.x*1000.0),0,1000));
+                    imageAtomicAdd(outputTex, ivec2(mod(voxOff+2,outCols), 
+                                floor((voxOff+2)/outCols)), 
+                            clamp(int(outRatioWithinBox.y*1000.0),0,1000));
+                    imageAtomicAdd(outputTex, ivec2(mod(voxOff+3,outCols), 
+                                floor((voxOff+3)/outCols)), 
+                            clamp(int(outRatioWithinBox.z*1000.0),0,1000));
+                    //accumulate lum
+                    imageAtomicAdd(outputTex, ivec2(mod(voxOff+4,outCols), 
+                                floor((voxOff+4)/outCols)),
+                            clamp(int(hsv.z*1000.0),0,1000));
+                }
+            }
+        }
+
+        //SURFACE test
+        if(rendered>1) {
+            finalColor = surfaceColor;
+
+            if(revSurface>0 && sli.x>=1.0 && depthID<=depthOutNb) {
+                imageAtomicMax(outputTex, 
+                        ivec2(mod(outOffset+revSurface,outCols), 
+                            floor((outOffset+revSurface)/outCols)), 1);
+            }
+        }
+    }
+    //final test, output if rendered or not, output final color
+    //if(rendered>0 && length(finalColor)>0) { 
+    if(rendered>0) { 
+        if(revSize>0) {
+            imageAtomicOr(outputTex, ivec2(mod(outOffset,outCols), 
+                        floor((outOffset))/outCols), rendered);
+        }
+
+        if((insideVisible>0 && rendered==1) || (surface>0 && rendered==2)) {
+            color = vec4(finalColor, 1.0);
+            switch(processAudio) {
+                case 1 : {
+                             additiveSynth(color);
+                         }break;
+                case 2 : {
+                             pitchedAdditiveSynth(color);
+                         }break;
+                default:break;
+            }
+        }
+        else {
+            color = vec4(0.0, 0.0, 0.0, 1.0);
+        }
 
         //color = vec4(0.0, 1.0, 0.0, 1.0);//for testing purposes
-	}
-	else { //DISCARD
-        //color = vec4(1.0, 0.0, 0.0, 1.0);//for testing purposes
-		discard;
-	}
+    }
+    else { //DISCARD
+           //color = vec4(1.0, 0.0, 0.0, 1.0);//for testing purposes
+        discard;
+    }
 };
 
-- 
GitLab