From 6beb33c9c27de34bf83198c37f872d1a8d78ebfb Mon Sep 17 00:00:00 2001
From: Ulrich Kemloh <kemlohulrich@gmail.com>
Date: Thu, 17 Apr 2014 14:49:22 +0200
Subject: [PATCH] Captions and performance improvement

---
 TraVisTo.pro                | 220 ++++----
 src/Frame.cpp               |  25 +-
 src/Frame.h                 |   8 +-
 src/SaxParser.cpp           |  14 +-
 src/ThreadVisualisation.cpp |  38 +-
 src/TimerCallback.cpp       | 978 ++++++++++++++++++------------------
 src/TimerCallback.h         |   4 +-
 src/extern_var.h            |   6 +-
 8 files changed, 673 insertions(+), 620 deletions(-)

diff --git a/TraVisTo.pro b/TraVisTo.pro
index 75b7ac6..08ae183 100644
--- a/TraVisTo.pro
+++ b/TraVisTo.pro
@@ -5,7 +5,7 @@ QT += xml network
 
 greaterThan(QT_MAJOR_VERSION, 4):QT += widgets
 
-win32 { 
+win32 {
         INCLUDEPATH += C:/VTK/include/vtk-6.1
 	
 	LIBS += -LC:/VTK/bin \
@@ -128,7 +128,7 @@ win32 {
 win32_5 {
         INCLUDEPATH += C:/VTK/include/vtk-5.10
 
-        LIBS += -LC:/VTK/bin \
+        LIBS += -LC:/VTK/bin_5 \
             -lvtksys \
             -lvtkzlib \
             -lvtkjpeg \
@@ -278,113 +278,113 @@ unix_6 {
             -lvtkzlib-6.0  \
 }
    
-        unix_5 {
-        INCLUDEPATH += /usr/include/vtk-5.8
-        LIBS += -L/usr/lib/ \
-            -lvtkCommon \
-            -lvtkDICOMParser \
-            -lvtkFiltering \
-            -lvtkGenericFiltering \
-            -lvtkGraphics \
-            -lvtkHybrid \
-            -lvtkIO \
-            -lvtkImaging \
-            -lvtkRendering \
-            -lvtkVolumeRendering \
-            -lvtkWidgets \
-            -lvtkexoIIc \
-            -lvtkftgl \
-            -lvtksys \
-            -lvtkverdict \
-            -lvtkParallel \
-            -lvtkmetaio
-         }
+unix_5 {
+INCLUDEPATH += /usr/include/vtk-5.8
+LIBS += -L/usr/lib/ \
+    -lvtkCommon \
+    -lvtkDICOMParser \
+    -lvtkFiltering \
+    -lvtkGenericFiltering \
+    -lvtkGraphics \
+    -lvtkHybrid \
+    -lvtkIO \
+    -lvtkImaging \
+    -lvtkRendering \
+    -lvtkVolumeRendering \
+    -lvtkWidgets \
+    -lvtkexoIIc \
+    -lvtkftgl \
+    -lvtksys \
+    -lvtkverdict \
+    -lvtkParallel \
+    -lvtkmetaio
+ }
 
 
-    HEADERS += src/geometry/Building.h \
-        src/geometry/Crossing.h \
-        src/geometry/Goal.h \
-        src/geometry/Hline.h \
-        src/geometry/Line.h \
-        src/geometry/NavLine.h \
-        src/geometry/Obstacle.h \
-        src/geometry/Point.h \
-        src/geometry/Room.h \
-        src/geometry/SubRoom.h \
-        src/geometry/Transition.h \
-        src/geometry/Wall.h \
-        src/geometry/JPoint.h \
-        src/tinyxml/tinystr.h \
-        src/tinyxml/tinyxml.h \
-        src/general/Macros.h \
-        src/IO/OutputHandler.h \
-        src/IO/TraVisToClient.h \
-        forms/Settings.h \
-        src/SaxParser.h \
-        src/Debug.h \
-        src/travisto.h \
-        src/Frame.h \
-        src/InteractorStyle.h \
-        src/Message.h \
-        src/Pedestrian.h \
-        src/SimpleVisualisationWindow.h \
-        src/SyncData.h \
-        src/SystemSettings.h \
-        src/ThreadDataTransfert.h \
-        src/ThreadVisualisation.h \
-        src/TimerCallback.h \
-        src/TrajectoryPoint.h \
-        src/extern_var.h \
-        src/geometry/FacilityGeometry.h \
-        src/geometry/LinePlotter.h \
-        src/geometry/PointPlotter.h \
-        src/geometry/LinePlotter2D.h \
-        src/geometry/PointPlotter2D.h \
-        src/network/TraVisToServer.h
-        
-    SOURCES += src/geometry/Building.cpp \
-        src/geometry/Crossing.cpp \
-        src/geometry/Goal.cpp \
-        src/geometry/Hline.cpp \
-        src/geometry/Line.cpp \
-        src/geometry/NavLine.cpp \
-        src/geometry/Obstacle.cpp \
-        src/geometry/Point.cpp \
-        src/geometry/Room.cpp \
-        src/geometry/SubRoom.cpp \
-        src/geometry/Transition.cpp \
-        src/geometry/Wall.cpp \
-        src/geometry/JPoint.cpp \
-        src/tinyxml/tinystr.cpp \
-        src/tinyxml/tinyxml.cpp \
-        src/tinyxml/tinyxmlerror.cpp \
-        src/tinyxml/tinyxmlparser.cpp \
-        src/IO/OutputHandler.cpp \
-        src/IO/TraVisToClient.cpp \
-        forms/Settings.cpp \
-        src/SaxParser.cpp \
-        src/Debug.cpp \
-        src/main.cpp \
-        src/travisto.cpp \
-        src/Frame.cpp \
-        src/InteractorStyle.cpp \
-        src/Pedestrian.cpp \
-        src/SimpleVisualisationWindow.cpp \
-        src/SyncData.cpp \
-        src/SystemSettings.cpp \
-        src/ThreadDataTransfert.cpp \
-        src/ThreadVisualisation.cpp \
-        src/TimerCallback.cpp \
-        src/TrajectoryPoint.cpp \
-        src/geometry/LinePlotter2D.cpp \
-        src/geometry/PointPlotter2D.cpp \
-        src/geometry/FacilityGeometry.cpp \
-        src/geometry/LinePlotter.cpp \
-        src/geometry/PointPlotter.cpp \
-        src/network/TraVisToServer.cpp
-    FORMS += forms/settings.ui \
-        forms/travisto.ui
-    RESOURCES += forms/icons.qrc \
-        forms/icons.qrc \
-        forms/icons.qrc
-    RC_FILE = forms/travisto.rc
+HEADERS += src/geometry/Building.h \
+    src/geometry/Crossing.h \
+    src/geometry/Goal.h \
+    src/geometry/Hline.h \
+    src/geometry/Line.h \
+    src/geometry/NavLine.h \
+    src/geometry/Obstacle.h \
+    src/geometry/Point.h \
+    src/geometry/Room.h \
+    src/geometry/SubRoom.h \
+    src/geometry/Transition.h \
+    src/geometry/Wall.h \
+    src/geometry/JPoint.h \
+    src/tinyxml/tinystr.h \
+    src/tinyxml/tinyxml.h \
+    src/general/Macros.h \
+    src/IO/OutputHandler.h \
+    src/IO/TraVisToClient.h \
+    forms/Settings.h \
+    src/SaxParser.h \
+    src/Debug.h \
+    src/travisto.h \
+    src/Frame.h \
+    src/InteractorStyle.h \
+    src/Message.h \
+    src/Pedestrian.h \
+    src/SimpleVisualisationWindow.h \
+    src/SyncData.h \
+    src/SystemSettings.h \
+    src/ThreadDataTransfert.h \
+    src/ThreadVisualisation.h \
+    src/TimerCallback.h \
+    src/TrajectoryPoint.h \
+    src/extern_var.h \
+    src/geometry/FacilityGeometry.h \
+    src/geometry/LinePlotter.h \
+    src/geometry/PointPlotter.h \
+    src/geometry/LinePlotter2D.h \
+    src/geometry/PointPlotter2D.h \
+    src/network/TraVisToServer.h
+
+SOURCES += src/geometry/Building.cpp \
+    src/geometry/Crossing.cpp \
+    src/geometry/Goal.cpp \
+    src/geometry/Hline.cpp \
+    src/geometry/Line.cpp \
+    src/geometry/NavLine.cpp \
+    src/geometry/Obstacle.cpp \
+    src/geometry/Point.cpp \
+    src/geometry/Room.cpp \
+    src/geometry/SubRoom.cpp \
+    src/geometry/Transition.cpp \
+    src/geometry/Wall.cpp \
+    src/geometry/JPoint.cpp \
+    src/tinyxml/tinystr.cpp \
+    src/tinyxml/tinyxml.cpp \
+    src/tinyxml/tinyxmlerror.cpp \
+    src/tinyxml/tinyxmlparser.cpp \
+    src/IO/OutputHandler.cpp \
+    src/IO/TraVisToClient.cpp \
+    forms/Settings.cpp \
+    src/SaxParser.cpp \
+    src/Debug.cpp \
+    src/main.cpp \
+    src/travisto.cpp \
+    src/Frame.cpp \
+    src/InteractorStyle.cpp \
+    src/Pedestrian.cpp \
+    src/SimpleVisualisationWindow.cpp \
+    src/SyncData.cpp \
+    src/SystemSettings.cpp \
+    src/ThreadDataTransfert.cpp \
+    src/ThreadVisualisation.cpp \
+    src/TimerCallback.cpp \
+    src/TrajectoryPoint.cpp \
+    src/geometry/LinePlotter2D.cpp \
+    src/geometry/PointPlotter2D.cpp \
+    src/geometry/FacilityGeometry.cpp \
+    src/geometry/LinePlotter.cpp \
+    src/geometry/PointPlotter.cpp \
+    src/network/TraVisToServer.cpp
+FORMS += forms/settings.ui \
+    forms/travisto.ui
+RESOURCES += forms/icons.qrc \
+    forms/icons.qrc \
+    forms/icons.qrc
+RC_FILE = forms/travisto.rc
diff --git a/src/Frame.cpp b/src/Frame.cpp
index 3d2731d..90cdff1 100644
--- a/src/Frame.cpp
+++ b/src/Frame.cpp
@@ -40,6 +40,7 @@
 #include <vtkFloatArray.h>
 #include <vtkPointData.h>
 #include <vtkMath.h>
+#include <vtkIntArray.h>
 
 
 #define VTK_CREATE(type, name) \
@@ -48,6 +49,7 @@
 Frame::Frame() {
 	elementCursor=0;
 	_polydata = vtkPolyData::New();
+    _polydataLabels = vtkPolyData::New();
 }
 
 Frame::~Frame() {
@@ -58,6 +60,7 @@ Frame::~Frame() {
 	framePoints.clear();
 
 	_polydata->Delete();
+    _polydataLabels->Delete();
 }
 
 int Frame::getSize(){
@@ -146,6 +149,7 @@ vtkPolyData* Frame::GetPolyData() {
     VTK_CREATE (vtkPoints, points);
     VTK_CREATE (vtkFloatArray, colors);
     VTK_CREATE (vtkFloatArray, tensors);
+    VTK_CREATE (vtkIntArray, labels);
 
     colors->SetName("color");
     colors->SetNumberOfComponents(1);
@@ -153,6 +157,9 @@ vtkPolyData* Frame::GetPolyData() {
     tensors->SetName("tensors");
     tensors->SetNumberOfComponents(9);
 
+    labels->SetName("labels");
+    labels->SetNumberOfComponents(1);
+
     for (unsigned int i=0;i<framePoints.size();i++){
         double pos[3]={0,0,0};
         double rad[3];
@@ -160,6 +167,7 @@ vtkPolyData* Frame::GetPolyData() {
 
         framePoints[i]->getPos(pos); //pos[2]=90;
         points->InsertNextPoint(pos);
+        labels->InsertNextValue(framePoints[i]->getIndex()+1);
 
         double data[7];
         framePoints[i]->getEllipse(data);
@@ -234,12 +242,19 @@ vtkPolyData* Frame::GetPolyData() {
     _polydata->GetPointData()->SetActiveTensors("tensors");
 
 
-//    if(framePoints.size()<0) {
-//        cout<<"not good"<<endl;
-//        exit(0);
-//    }
+    // setting the labels
+    _polydata->GetPointData()->AddArray(labels);
+    //_polydata->GetPointData()->set
+
+    //labels
+    //_polydataLabels->SetPoints(points);
+
+    return _polydata;
+}
 
-	return _polydata;
+vtkPolyData *Frame::GetPolyDataLabels()
+{
+ return _polydataLabels;
 }
 
 unsigned int Frame::getElementCursor(){
diff --git a/src/Frame.h b/src/Frame.h
index 55101be..7392c98 100644
--- a/src/Frame.h
+++ b/src/Frame.h
@@ -57,12 +57,18 @@ public:
 
 	vtkPolyData* GetPolyData();
 
+    vtkPolyData* GetPolyDataLabels();
+
 	vtkPolyData* GetSclarData();
 
 private:
 	std::vector <TrajectoryPoint *> framePoints;
 
-	vtkPolyData * _polydata;
+    /// ellipse parameters
+    vtkPolyData * _polydata;
+
+    /// pedestrians labels
+    vtkPolyData * _polydataLabels;
 
 	/// points to the actual element in the frame
 	unsigned int elementCursor;
diff --git a/src/SaxParser.cpp b/src/SaxParser.cpp
index 29b6c62..c9bb2ce 100644
--- a/src/SaxParser.cpp
+++ b/src/SaxParser.cpp
@@ -668,14 +668,18 @@ void SaxParser::parseGeometryJPS(QString fileName, FacilityGeometry *geometry){
 
     //triagulate everything
     vtkSmartPointer<vtkTriangleFilter> filter=vtkSmartPointer<vtkTriangleFilter>::New();
-    filter->SetInputData(polygonPolyData);
 
-	// Create a mapper and actor
-	vtkSmartPointer<vtkPolyDataMapper> mapper =
-			vtkSmartPointer<vtkPolyDataMapper>::New();
+    // Create a mapper and actor
+    vtkSmartPointer<vtkPolyDataMapper> mapper =
+            vtkSmartPointer<vtkPolyDataMapper>::New();
+
+
+
 #if VTK_MAJOR_VERSION <= 5
-	mapper->SetInput(polygonPolyData);
+     filter->SetInput(polygonPolyData);
+    mapper->SetInput(filter->GetOutput());
 #else
+    filter->SetInputData(polygonPolyData);
     mapper->SetInputConnection(filter->GetOutputPort());
 #endif
 
diff --git a/src/ThreadVisualisation.cpp b/src/ThreadVisualisation.cpp
index cb8e47f..e769207 100644
--- a/src/ThreadVisualisation.cpp
+++ b/src/ThreadVisualisation.cpp
@@ -65,6 +65,8 @@
 #include <vtkSmartPointer.h>
 #include <vtkActor2DCollection.h>
 #include <vtkRegularPolygonSource.h>
+#include <vtkLabeledDataMapper.h>
+#include <vtkDiskSource.h>
 
 
 #include "geometry/FacilityGeometry.h"
@@ -443,23 +445,30 @@ void ThreadVisualisation::showDoors(bool status){
 void  ThreadVisualisation::initGlyphs(){
 
 
-	VTK_CREATE (vtkSphereSource, sphereSource);
-	sphereSource->SetRadius(30);
-	sphereSource->SetPhiResolution(20);
-	sphereSource->SetThetaResolution(20);
-    extern_glyphs_pedestrians->SetSourceConnection(sphereSource->GetOutputPort());
+    //VTK_CREATE (vtkSphereSource, agentShape);
+    //agentShape->SetRadius(30);
+    //agentShape->SetPhiResolution(20);
+    //agentShape->SetThetaResolution(20);
+
+    //now create the glyphs with ellipses
+    VTK_CREATE (vtkDiskSource, agentShape);
+    agentShape->SetCircumferentialResolution(20);
+    agentShape->SetInnerRadius(0);
+    agentShape->SetOuterRadius(30);
+
+    extern_glyphs_pedestrians->SetSourceConnection(agentShape->GetOutputPort());
 
 #if VTK_MAJOR_VERSION <= 5
-    extern_glyphs_pedestrians->SetSource(sphereSource->GetOutput());
+    extern_glyphs_pedestrians->SetSource(agentShape->GetOutput());
 #else
-    extern_glyphs_pedestrians->SetInputConnection(sphereSource->GetOutputPort());
+    extern_glyphs_pedestrians->SetInputConnection(agentShape->GetOutputPort());
 #endif
 
 
 /*
-    VTK_CREATE (vtkCylinderSource, cylinderSource);
-    cylinderSource->SetHeight(160);
-    cylinderSource->SetRadius(30);
+    VTK_CREATE (vtkCylinderSource, agentShape);
+    agentShape->SetHeight(160);
+    agentShape->SetRadius(30);
 
 
 #if VTK_MAJOR_VERSION <= 5
@@ -500,6 +509,15 @@ void  ThreadVisualisation::initGlyphs(){
 	VTK_CREATE(vtkActor, actor);
 	actor->SetMapper(mapper);
 	renderer->AddActor(actor);
+
+
+    // structure for the labels
+    VTK_CREATE(vtkLabeledDataMapper, labelMapper);
+    extern_pedestrians_labels->SetMapper(labelMapper);
+    labelMapper->SetFieldDataName("labels");
+    labelMapper->SetLabelModeToLabelFieldData();
+    renderer->AddActor2D(extern_pedestrians_labels);
+    extern_pedestrians_labels->SetVisibility(false);
 }
 
 void  ThreadVisualisation::init(){
diff --git a/src/TimerCallback.cpp b/src/TimerCallback.cpp
index 76a5fb4..5ebf3d6 100644
--- a/src/TimerCallback.cpp
+++ b/src/TimerCallback.cpp
@@ -73,9 +73,11 @@
 #include <vtkCamera.h>
 #include <vtkTextProperty.h>
 #include <vtkSphereSource.h>
-//#include <vtkGlyph3D.h>
+#include <vtkMapper2D.h>
+#include <vtkMapper.h>
 #include <vtkSmartPointer.h>
 #include <vtkPolyDataMapper.h>
+#include <vtkLabeledDataMapper.h>
 
 
 
@@ -91,256 +93,259 @@
 #include "TimerCallback.h"
 
 #define VTK_CREATE(type, name) \
-		vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
+    vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
 
 using namespace std;
 
 TimerCallback* TimerCallback::New()
 {
-	TimerCallback *cb = new TimerCallback;
-	cb->RenderTimerId = 0;
-	cb->windowToImageFilter=NULL;
-	cb->runningTime=NULL;
-	return cb;
+    TimerCallback *cb = new TimerCallback;
+    cb->RenderTimerId = 0;
+    cb->windowToImageFilter=NULL;
+    cb->runningTime=NULL;
+    return cb;
 }
 
 
 void TimerCallback::Execute(vtkObject *caller, unsigned long eventId,
-		void *callData){
-	if (vtkCommand::TimerEvent == eventId)
-	{
-		int  frameNumber=0;
-		int nPeds=0;
-		static bool isRecording =false;
-		int tid = * static_cast<int *>(callData);
-		//double renderingTime=0;
+                            void *callData){
+    if (vtkCommand::TimerEvent == eventId)
+    {
+        int  frameNumber=0;
+        int nPeds=0;
+        static bool isRecording =false;
+        int tid = * static_cast<int *>(callData);
+        //double renderingTime=0;
 
-		if (tid == this->RenderTimerId)
-		{
-			//dont update anything if the system is actually paused
-			//if(extern_is_pause) return;
+        if (tid == this->RenderTimerId)
+        {
+            //dont update anything if the system is actually paused
+            //if(extern_is_pause) return;
 
-			vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::SafeDownCast(caller);
-			vtkRenderWindow  *renderWindow = iren->GetRenderWindow();
-			vtkRenderer *renderer =renderWindow->GetRenderers()->GetFirstRenderer();
+            vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::SafeDownCast(caller);
+            vtkRenderWindow  *renderWindow = iren->GetRenderWindow();
+            vtkRenderer *renderer =renderWindow->GetRenderers()->GetFirstRenderer();
 
-			if (iren && renderWindow && renderer)
-			{
-				// very important
-				setAllPedestriansInvisible();
+            if (iren && renderWindow && renderer)
+            {
+                // very important
+                setAllPedestriansInvisible();
 
-				//first pedestrian group
-				if(extern_first_dataset_loaded) {
-					Frame * frame=NULL;
+                //first pedestrian group
+                if(extern_first_dataset_loaded) {
+                    Frame * frame=NULL;
 
-					// return the same frame if the system is paused
-					// in fact you could just return, but in this case no update will be made
-					// e.g showing captions/trails...
+                    // return the same frame if the system is paused
+                    // in fact you could just return, but in this case no update will be made
+                    // e.g showing captions/trails...
 
-					if(extern_is_pause)
-						frame=extern_trajectories_firstSet.getFrame(extern_trajectories_firstSet.getFrameCursor());
-					else
-						frame = extern_trajectories_firstSet.getNextFrame();
+                    if(extern_is_pause)
+                        frame=extern_trajectories_firstSet.getFrame(extern_trajectories_firstSet.getFrameCursor());
+                    else
+                        frame = extern_trajectories_firstSet.getNextFrame();
 
-					if(frame==NULL){
+                    if(frame==NULL){
 
-					}else{
+                    }else{
 
-						frameNumber=extern_trajectories_firstSet.getFrameCursor();
+                        frameNumber=extern_trajectories_firstSet.getFrameCursor();
+                        vtkPolyData* pData=frame->GetPolyData();
 
 #if VTK_MAJOR_VERSION <= 5
-						extern_glyphs_pedestrians->SetInput(frame->GetPolyData());
+                        extern_glyphs_pedestrians->SetInput(pData);
+                        ((vtkLabeledDataMapper*)extern_pedestrians_labels->GetMapper())->SetInput(pData);
 #else
-						extern_glyphs_pedestrians->SetInputData(frame->GetPolyData());
+                        extern_glyphs_pedestrians->SetInputData(pData);
+                        extern_pedestrians_labels->GetMapper()->SetInputDataObject(pData);
 #endif
 
                         extern_glyphs_pedestrians->Update();
 
-						nPeds= frame->getSize();
-
-					}
-				}
-
-				// TODO: restore this if you want to use actors instead of glyphs
-				if(extern_first_dataset_loaded && false) {
-					Frame * frame=NULL;
-
-					// return the same frame if the system is paused
-					// in fact you could just return, but in this case no update will be made
-					// e.g showing captions/trails...
-
-					if(extern_is_pause)
-						frame=extern_trajectories_firstSet.getFrame(extern_trajectories_firstSet.getFrameCursor());
-					else
-						frame = extern_trajectories_firstSet.getNextFrame();
-
-					if(frame==NULL){
-
-					}else{
-
-						// just take the frame number given by this dataset
-						frameNumber=extern_trajectories_firstSet.getFrameCursor();
-						if(extern_tracking_enable)
-						getTrail(1,frameNumber);
-
-						TrajectoryPoint* point=NULL;
-						while(NULL!=(point=frame->getNextElement())){
-
-							//point index start at 1. this  may needed to be fixed
-							extern_pedestrians_firstSet[point->getIndex()]->moveTo(point);
-							nPeds++;
-						}
-						//CAUTION: reset the fucking counter
-						frame->resetCursor();
-					}
-				}
-
-				//second pedestrian group
-				if(extern_second_dataset_loaded){
-
-					Frame * frame=NULL;
-					if(extern_is_pause)
-						frame=extern_trajectories_secondSet.getFrame(extern_trajectories_secondSet.getFrameCursor());
-					else
-						frame = extern_trajectories_secondSet.getNextFrame();
-
-					if(frame==NULL){
-
-					}else{
-						// just take the frame number given by this dataset
-						frameNumber=extern_trajectories_secondSet.getFrameCursor();
-						if(extern_tracking_enable)
-						getTrail(2,frameNumber);
-
-						TrajectoryPoint* point=NULL;
-						while(NULL!=(point=frame->getNextElement())){
-							extern_pedestrians_secondSet[point->getIndex()]->moveTo(point);
-						}
-						//CAUTION: reset the fucking counter
-						frame->resetCursor();
-					}
-				}
-
-				//third pedestrian group
-				if(extern_third_dataset_loaded){
-
-					Frame * frame=NULL;
-					if(extern_is_pause)
-						frame=extern_trajectories_thirdSet.getFrame(extern_trajectories_thirdSet.getFrameCursor());
-					else
-						frame = extern_trajectories_thirdSet.getNextFrame();
-
-					if(frame==NULL){
-
-					}else {
-						// just take the frame number given by this dataset
-						frameNumber=extern_trajectories_thirdSet.getFrameCursor();
-						if(extern_tracking_enable)
-						getTrail(3,frameNumber);
-
-						TrajectoryPoint* point=NULL;
-						while(NULL!=(point=frame->getNextElement())){
-							//point index start at 1. this  may needed to be fixed
-							extern_pedestrians_thirdSet[point->getIndex()]->moveTo(point);
-							//set visible to true
-						}
-						//CAUTION: reset the fucking counter
-						frame->resetCursor();
-					}
-				}
-
-				int* winSize=renderWindow->GetSize();
-				static int  lastWinX=winSize[0]+1; // +1 to trigger a first change
-				static int lastWinY=winSize[1];
-
-				sprintf(runningTimeText,"Pedestrians: %d      Time: %ld Sec",nPeds,frameNumber*iren->GetTimerDuration(tid)/1000);
-				runningTime->SetInput(runningTimeText);
-				runningTime->Modified();
-
-				if((lastWinX!=winSize[0]) || (lastWinY!=winSize[1]) || (frameNumber<10))
-				{
-					static std::string winBaseName(renderWindow->GetWindowName());
-					std::string winName=winBaseName;
-					std::string s;
-					winName.append(" [ ");
-					s=QString::number(winSize[0]).toStdString();
-					winName.append(s);
-					winName.append("X");
-					s=QString::number(winSize[1]).toStdString();
-					winName.append(s);
-					winName.append(" ] ");
-
-					int posY=winSize[1]*(1.0-30.0/536.0);
-					int posX=winSize[0]*(1.0-450.0/720.0);
-					runningTime->SetPosition(posX,posY);
-					renderWindow->SetWindowName(winName.c_str());
-
-					lastWinX=winSize[0];
-					lastWinY=winSize[1];
-				}
-
-				iren->Render();
-
-				if(extern_force_system_update){
-					updateSettings(renderWindow);
-				}
-				if(extern_take_screenshot){
-					takeScreenshot(renderWindow);
-				}
-				if(SystemSettings::getRecordPNGsequence()){
-					takeScreenshotSequence(renderWindow);
-				}
-
-				if (frameNumber!=0) {
-					int desiredfps=1000.0/iren->GetTimerDuration(tid);
-					int effectivefps=1/(renderer->GetLastRenderTimeInSeconds());
-
-					effectivefps = (effectivefps>desiredfps)?desiredfps:effectivefps;
-
-					emit signalFrameNumber(frameNumber);
-					emit signalRunningTime(frameNumber*iren->GetTimerDuration(tid));
-					emit signalRenderingTime(effectivefps);
-				}
+                        nPeds= frame->getSize();
+
+                    }
+                }
+
+                // TODO: restore this if you want to use actors instead of glyphs
+                if(extern_first_dataset_loaded && false) {
+                    Frame * frame=NULL;
+
+                    // return the same frame if the system is paused
+                    // in fact you could just return, but in this case no update will be made
+                    // e.g showing captions/trails...
+
+                    if(extern_is_pause)
+                        frame=extern_trajectories_firstSet.getFrame(extern_trajectories_firstSet.getFrameCursor());
+                    else
+                        frame = extern_trajectories_firstSet.getNextFrame();
+
+                    if(frame==NULL){
+
+                    }else{
+
+                        // just take the frame number given by this dataset
+                        frameNumber=extern_trajectories_firstSet.getFrameCursor();
+                        if(extern_tracking_enable)
+                            getTrail(1,frameNumber);
+
+                        TrajectoryPoint* point=NULL;
+                        while(NULL!=(point=frame->getNextElement())){
+
+                            //point index start at 1. this  may needed to be fixed
+                            extern_pedestrians_firstSet[point->getIndex()]->moveTo(point);
+                            nPeds++;
+                        }
+                        //CAUTION: reset the fucking counter
+                        frame->resetCursor();
+                    }
+                }
+
+                //second pedestrian group
+                if(extern_second_dataset_loaded){
+
+                    Frame * frame=NULL;
+                    if(extern_is_pause)
+                        frame=extern_trajectories_secondSet.getFrame(extern_trajectories_secondSet.getFrameCursor());
+                    else
+                        frame = extern_trajectories_secondSet.getNextFrame();
+
+                    if(frame==NULL){
+
+                    }else{
+                        // just take the frame number given by this dataset
+                        frameNumber=extern_trajectories_secondSet.getFrameCursor();
+                        if(extern_tracking_enable)
+                            getTrail(2,frameNumber);
+
+                        TrajectoryPoint* point=NULL;
+                        while(NULL!=(point=frame->getNextElement())){
+                            extern_pedestrians_secondSet[point->getIndex()]->moveTo(point);
+                        }
+                        //CAUTION: reset the fucking counter
+                        frame->resetCursor();
+                    }
+                }
+
+                //third pedestrian group
+                if(extern_third_dataset_loaded){
+
+                    Frame * frame=NULL;
+                    if(extern_is_pause)
+                        frame=extern_trajectories_thirdSet.getFrame(extern_trajectories_thirdSet.getFrameCursor());
+                    else
+                        frame = extern_trajectories_thirdSet.getNextFrame();
+
+                    if(frame==NULL){
+
+                    }else {
+                        // just take the frame number given by this dataset
+                        frameNumber=extern_trajectories_thirdSet.getFrameCursor();
+                        if(extern_tracking_enable)
+                            getTrail(3,frameNumber);
+
+                        TrajectoryPoint* point=NULL;
+                        while(NULL!=(point=frame->getNextElement())){
+                            //point index start at 1. this  may needed to be fixed
+                            extern_pedestrians_thirdSet[point->getIndex()]->moveTo(point);
+                            //set visible to true
+                        }
+                        //CAUTION: reset the fucking counter
+                        frame->resetCursor();
+                    }
+                }
+
+                int* winSize=renderWindow->GetSize();
+                static int  lastWinX=winSize[0]+1; // +1 to trigger a first change
+                static int lastWinY=winSize[1];
+
+                sprintf(runningTimeText,"Pedestrians: %d      Time: %ld Sec",nPeds,frameNumber*iren->GetTimerDuration(tid)/1000);
+                runningTime->SetInput(runningTimeText);
+                runningTime->Modified();
+
+                if((lastWinX!=winSize[0]) || (lastWinY!=winSize[1]) || (frameNumber<10))
+                {
+                    static std::string winBaseName(renderWindow->GetWindowName());
+                    std::string winName=winBaseName;
+                    std::string s;
+                    winName.append(" [ ");
+                    s=QString::number(winSize[0]).toStdString();
+                    winName.append(s);
+                    winName.append("X");
+                    s=QString::number(winSize[1]).toStdString();
+                    winName.append(s);
+                    winName.append(" ] ");
+
+                    int posY=winSize[1]*(1.0-30.0/536.0);
+                    int posX=winSize[0]*(1.0-450.0/720.0);
+                    runningTime->SetPosition(posX,posY);
+                    renderWindow->SetWindowName(winName.c_str());
+
+                    lastWinX=winSize[0];
+                    lastWinY=winSize[1];
+                }
+
+                iren->Render();
+
+                if(extern_force_system_update){
+                    updateSettings(renderWindow);
+                }
+                if(extern_take_screenshot){
+                    takeScreenshot(renderWindow);
+                }
+                if(SystemSettings::getRecordPNGsequence()){
+                    takeScreenshotSequence(renderWindow);
+                }
+
+                if (frameNumber!=0) {
+                    int desiredfps=1000.0/iren->GetTimerDuration(tid);
+                    int effectivefps=1/(renderer->GetLastRenderTimeInSeconds());
+
+                    effectivefps = (effectivefps>desiredfps)?desiredfps:effectivefps;
+
+                    emit signalFrameNumber(frameNumber);
+                    emit signalRunningTime(frameNumber*iren->GetTimerDuration(tid));
+                    emit signalRenderingTime(effectivefps);
+                }
 
 #ifdef TRAVISTO_FFMPEG
 
-				if(extern_launch_recording){
-					extern_launch_recording=false; //reset
+                if(extern_launch_recording){
+                    extern_launch_recording=false; //reset
 
-					windowToImageFilter=vtkWindowToImageFilter::New();
+                    windowToImageFilter=vtkWindowToImageFilter::New();
 #ifdef WIN32
-					pAVIWriter=vtkAVIWriter::New();
+                    pAVIWriter=vtkAVIWriter::New();
 #endif
 
 #ifdef __linux__
-					pAVIWriter=vtkFFMPEGWriter::New();
+                    pAVIWriter=vtkFFMPEGWriter::New();
 #endif
 
-					pAVIWriter->SetQuality(2);
-					pAVIWriter->SetRate(1000.0/iren->GetTimerDuration(tid));
+                    pAVIWriter->SetQuality(2);
+                    pAVIWriter->SetRate(1000.0/iren->GetTimerDuration(tid));
 
-					//static int videoID=0;
-					//char filename[20]={0};
-					//sprintf(filename,"travisto_video_%d.avi",videoID++);
-					//pAVIWriter->SetFileName(filename);
+                    //static int videoID=0;
+                    //char filename[20]={0};
+                    //sprintf(filename,"travisto_video_%d.avi",videoID++);
+                    //pAVIWriter->SetFileName(filename);
 
 
-					QString videoName;
-					SystemSettings::getOutputDirectory(videoName);
-					//create directory if not exits
-					if(!QDir(videoName).exists()){
-						QDir dir;
-						if(!dir.mkpath (videoName )){
-							cerr<<"could not create directory: "<< videoName.toStdString();
-							videoName=""; // current
-						}
-					}
+                    QString videoName;
+                    SystemSettings::getOutputDirectory(videoName);
+                    //create directory if not exits
+                    if(!QDir(videoName).exists()){
+                        QDir dir;
+                        if(!dir.mkpath (videoName )){
+                            cerr<<"could not create directory: "<< videoName.toStdString();
+                            videoName=""; // current
+                        }
+                    }
 
-					videoName += "/tvtvid_"+QDateTime::currentDateTime().toString("yyMMdd_hh_mm_").append(SystemSettings::getFilenamePrefix()).append(".avi");
+                    videoName += "/tvtvid_"+QDateTime::currentDateTime().toString("yyMMdd_hh_mm_").append(SystemSettings::getFilenamePrefix()).append(".avi");
 
-					pAVIWriter->SetFileName(videoName.toStdString().c_str());
+                    pAVIWriter->SetFileName(videoName.toStdString().c_str());
 
-					if(windowToImageFilter!=NULL)
+                    if(windowToImageFilter!=NULL)
                         if(windowToImageFilter->GetInput()==NULL){ //should be the case by first call
                             windowToImageFilter->SetInput(renderWindow);
 #if VTK_MAJOR_VERSION <= 5
@@ -349,320 +354,321 @@ void TimerCallback::Execute(vtkObject *caller, unsigned long eventId,
                             pAVIWriter->SetInputConnection(windowToImageFilter->GetOutputPort());
 #endif
                             pAVIWriter->Start();
-						}
-					extern_recording_enable=true;
-					isRecording=true;
-				}
-
-				if(isRecording){
-					windowToImageFilter->Modified();
-					// only write when not paused
-					if(!extern_is_pause) pAVIWriter->Write();
-
-					if(extern_recording_enable==false){ //stop the recording
-						pAVIWriter->End();
-						windowToImageFilter->Delete();
-						pAVIWriter->Delete();
-						isRecording=false;
-					}
-				}
+                        }
+                    extern_recording_enable=true;
+                    isRecording=true;
+                }
+
+                if(isRecording){
+                    windowToImageFilter->Modified();
+                    // only write when not paused
+                    if(!extern_is_pause) pAVIWriter->Write();
+
+                    if(extern_recording_enable==false){ //stop the recording
+                        pAVIWriter->End();
+                        windowToImageFilter->Delete();
+                        pAVIWriter->Delete();
+                        isRecording=false;
+                    }
+                }
 #endif //TRAVISTO_FFMPEG
 
-				if(extern_shutdown_visual_thread){
-					emit signalFrameNumber(0);
+                if(extern_shutdown_visual_thread){
+                    emit signalFrameNumber(0);
 
-					// this will force an update of the windows
-					lastWinX=0;
-					lastWinY=0;
-					//exit if and only if the recording process is terminated
-					if(isRecording) extern_recording_enable=false;
-					else iren->ExitCallback();
+                    // this will force an update of the windows
+                    lastWinX=0;
+                    lastWinY=0;
+                    //exit if and only if the recording process is terminated
+                    if(isRecording) extern_recording_enable=false;
+                    else iren->ExitCallback();
 
 
-				}
-			}
-		}
-	}
+                }
+            }
+        }
+    }
 }
 
 void TimerCallback::updateSettings(vtkRenderWindow* renderWindow) {
 
-	static bool fullscreen=false;
-
-	// check the caption colour mode
-	int captionSize, orientation;
-	bool automaticRotation, autoCaptionMode;
-	QColor captionColor;
-	SystemSettings::getCaptionsParameters(captionSize,captionColor,orientation,automaticRotation);
-
-	autoCaptionMode= !(captionColor.isValid());
-
-	if(autoCaptionMode==false){ // tODO set the colour to auto mode
-
-	}
-
-	if(extern_first_dataset_loaded){
-		int pedColor[3];
-		SystemSettings::getPedestrianColor(0,pedColor);
-		for(int i=0;i<extern_trajectories_firstSet.getNumberOfAgents();i++){
-			extern_pedestrians_firstSet[i]->enableCaption(SystemSettings::getShowCaption());
-			if(SystemSettings::getPedestrianColorProfileFromFile()==false){
-				extern_pedestrians_firstSet[i]->setColor(pedColor);
-			}
-			extern_pedestrians_firstSet[i]->setGroupVisibility(extern_first_dataset_visible);
-			extern_pedestrians_firstSet[i]->setCaptionSize(captionSize);
-			extern_pedestrians_firstSet[i]->setCaptionsColorModeToAuto(autoCaptionMode);
-			extern_pedestrians_firstSet[i]->setCaptionsColor(captionColor);
-			extern_pedestrians_firstSet[i]->setResolution(SystemSettings::getEllipseResolution());
-		}
-	}
-
-	if(extern_second_dataset_loaded){
-		int pedColor[3];
-		SystemSettings::getPedestrianColor(1,pedColor);
-		for(int i=0;i<extern_trajectories_secondSet.getNumberOfAgents();i++){
-			extern_pedestrians_secondSet[i]->enableCaption(SystemSettings::getShowCaption());
-			if(SystemSettings::getPedestrianColorProfileFromFile()==false){
-				extern_pedestrians_secondSet[i]->setColor(pedColor);
-			}
-			extern_pedestrians_secondSet[i]->setGroupVisibility(extern_second_dataset_visible);
-			extern_pedestrians_secondSet[i]->setCaptionSize(captionSize);
-			extern_pedestrians_secondSet[i]->setCaptionsColorModeToAuto(autoCaptionMode);
-			extern_pedestrians_secondSet[i]->setCaptionsColor(captionColor);
-			extern_pedestrians_secondSet[i]->setResolution(SystemSettings::getEllipseResolution());
-
-		}
-	}
-
-	if(extern_third_dataset_loaded){
-		int pedColor[3];
-		SystemSettings::getPedestrianColor(2,pedColor);
-		for(int i=0;i<extern_trajectories_thirdSet.getNumberOfAgents();i++){
-			extern_pedestrians_thirdSet[i]->enableCaption(SystemSettings::getShowCaption());
-
-			if(SystemSettings::getPedestrianColorProfileFromFile()==false){
-				extern_pedestrians_thirdSet[i]->setColor(pedColor);
-			}
-			extern_pedestrians_thirdSet[i]->setGroupVisibility(extern_third_dataset_visible);
-			extern_pedestrians_thirdSet[i]->setCaptionSize(captionSize);
-			extern_pedestrians_thirdSet[i]->setCaptionsColorModeToAuto(autoCaptionMode);
-			extern_pedestrians_thirdSet[i]->setCaptionsColor(captionColor);
-			extern_pedestrians_thirdSet[i]->setResolution(SystemSettings::getEllipseResolution());
-		}
-	}
-
-	//enable / disable full screen
-	if(fullscreen!=extern_fullscreen_enable){
-		renderWindow->SetFullScreen(extern_fullscreen_enable);
-		//renderWindow->GetRenderers()->GetFirstRenderer()->ResetCamera();
-		fullscreen=extern_fullscreen_enable;
-	}
-
-	// take
-	extern_force_system_update=false;
+    static bool fullscreen=false;
+
+    // check the caption colour mode
+    int captionSize, orientation;
+    bool automaticRotation, autoCaptionMode;
+    QColor captionColor;
+    SystemSettings::getCaptionsParameters(captionSize,captionColor,orientation,automaticRotation);
+
+    autoCaptionMode= !(captionColor.isValid());
+
+    if(autoCaptionMode==false){ // tODO set the colour to auto mode
+
+    }
+
+    if(extern_first_dataset_loaded){
+        int pedColor[3];
+        SystemSettings::getPedestrianColor(0,pedColor);
+        for(int i=0;i<extern_trajectories_firstSet.getNumberOfAgents();i++){
+            extern_pedestrians_firstSet[i]->enableCaption(SystemSettings::getShowCaption());
+            if(SystemSettings::getPedestrianColorProfileFromFile()==false){
+                extern_pedestrians_firstSet[i]->setColor(pedColor);
+            }
+            extern_pedestrians_firstSet[i]->setGroupVisibility(extern_first_dataset_visible);
+            extern_pedestrians_firstSet[i]->setCaptionSize(captionSize);
+            extern_pedestrians_firstSet[i]->setCaptionsColorModeToAuto(autoCaptionMode);
+            extern_pedestrians_firstSet[i]->setCaptionsColor(captionColor);
+            extern_pedestrians_firstSet[i]->setResolution(SystemSettings::getEllipseResolution());
+        }
+        extern_pedestrians_labels->SetVisibility(SystemSettings::getShowCaption());
+    }
+
+    if(extern_second_dataset_loaded){
+        int pedColor[3];
+        SystemSettings::getPedestrianColor(1,pedColor);
+        for(int i=0;i<extern_trajectories_secondSet.getNumberOfAgents();i++){
+            extern_pedestrians_secondSet[i]->enableCaption(SystemSettings::getShowCaption());
+            if(SystemSettings::getPedestrianColorProfileFromFile()==false){
+                extern_pedestrians_secondSet[i]->setColor(pedColor);
+            }
+            extern_pedestrians_secondSet[i]->setGroupVisibility(extern_second_dataset_visible);
+            extern_pedestrians_secondSet[i]->setCaptionSize(captionSize);
+            extern_pedestrians_secondSet[i]->setCaptionsColorModeToAuto(autoCaptionMode);
+            extern_pedestrians_secondSet[i]->setCaptionsColor(captionColor);
+            extern_pedestrians_secondSet[i]->setResolution(SystemSettings::getEllipseResolution());
+
+        }
+    }
+
+    if(extern_third_dataset_loaded){
+        int pedColor[3];
+        SystemSettings::getPedestrianColor(2,pedColor);
+        for(int i=0;i<extern_trajectories_thirdSet.getNumberOfAgents();i++){
+            extern_pedestrians_thirdSet[i]->enableCaption(SystemSettings::getShowCaption());
+
+            if(SystemSettings::getPedestrianColorProfileFromFile()==false){
+                extern_pedestrians_thirdSet[i]->setColor(pedColor);
+            }
+            extern_pedestrians_thirdSet[i]->setGroupVisibility(extern_third_dataset_visible);
+            extern_pedestrians_thirdSet[i]->setCaptionSize(captionSize);
+            extern_pedestrians_thirdSet[i]->setCaptionsColorModeToAuto(autoCaptionMode);
+            extern_pedestrians_thirdSet[i]->setCaptionsColor(captionColor);
+            extern_pedestrians_thirdSet[i]->setResolution(SystemSettings::getEllipseResolution());
+        }
+    }
+
+    //enable / disable full screen
+    if(fullscreen!=extern_fullscreen_enable){
+        renderWindow->SetFullScreen(extern_fullscreen_enable);
+        //renderWindow->GetRenderers()->GetFirstRenderer()->ResetCamera();
+        fullscreen=extern_fullscreen_enable;
+    }
+
+    // take
+    extern_force_system_update=false;
 }
 
 
 void TimerCallback::setAllPedestriansInvisible()
 {
-	if(extern_first_dataset_loaded){
-		for(int i=0;i<extern_trajectories_firstSet.getNumberOfAgents();i++)
-			extern_pedestrians_firstSet[i]->setVisibility(false);
-	}
-
-	if(extern_second_dataset_loaded){
-		for(int i=0;i<extern_trajectories_secondSet.getNumberOfAgents();i++)
-			extern_pedestrians_secondSet[i]->setVisibility(false);
-	}
-
-	if(extern_third_dataset_loaded){
-		for(int i=0;i<extern_trajectories_thirdSet.getNumberOfAgents();i++)
-			extern_pedestrians_thirdSet[i]->setVisibility(false);
-	}
+    if(extern_first_dataset_loaded){
+        for(int i=0;i<extern_trajectories_firstSet.getNumberOfAgents();i++)
+            extern_pedestrians_firstSet[i]->setVisibility(false);
+    }
+
+    if(extern_second_dataset_loaded){
+        for(int i=0;i<extern_trajectories_secondSet.getNumberOfAgents();i++)
+            extern_pedestrians_secondSet[i]->setVisibility(false);
+    }
+
+    if(extern_third_dataset_loaded){
+        for(int i=0;i<extern_trajectories_thirdSet.getNumberOfAgents();i++)
+            extern_pedestrians_thirdSet[i]->setVisibility(false);
+    }
 }
 
 
 
 void TimerCallback::getTrail(int datasetID, int frameNumber){
 
-	int trailCount=0;
-	int trailType=0;
-	int trailForm=0;
-	int tcMin=0;
-	int tcMax=0;
-
-	SystemSettings::getTrailsInfo(&trailCount,&trailType,&trailForm);
-
-	switch(trailType){
-	case 0://backward
-		tcMin=frameNumber-trailCount;
-		tcMax=frameNumber;
-		break;
-
-	case 1://symetric
-		tcMin=frameNumber-trailCount/2;
-		tcMax=frameNumber+trailCount/2;
-
-		break;
-
-	case 2://forward
-		tcMin=frameNumber;
-		tcMax=frameNumber+trailCount;
-		break;
-
-	}
-
-	switch(datasetID){
-	case 1:
-	{
-		for (int i=tcMin;i<tcMax;i++){
-			Frame* frame = extern_trajectories_firstSet.getFrame(i);
-			if(frame==NULL){
-				//		cerr<<"Trajectory not available in getTrail(), first data set"<<endl;
-			}else {
-				TrajectoryPoint* point=NULL;
-				while(NULL!=(point=frame->getNextElement())){
-					extern_pedestrians_firstSet[point->getIndex()]->plotTrail(point->getX(),point->getY(),point->getZ());
-					extern_pedestrians_firstSet[point->getIndex()]->setTrailGeometry(trailForm);
-				}
-				frame->resetCursor();
-			}
-		}
-	}
-	break;
-
-	case 2:
-	{
-		for (int i=tcMin;i<tcMax;i++){
-			Frame* frame = extern_trajectories_secondSet.getFrame(i);
-			if(frame==NULL){
-				//			cerr<<"Trajectory not available in getTrail(), second data set"<<endl;
-			}else {
-
-				TrajectoryPoint* point=NULL;
-				while(NULL!=(point=frame->getNextElement())){
-					extern_pedestrians_secondSet[point->getIndex()]->plotTrail(point->getX(),point->getY(),point->getZ());
-					extern_pedestrians_secondSet[point->getIndex()]->setTrailGeometry(trailForm);
-				}
-				frame->resetCursor();
-			}
-		}
-	}
-
-	break;
-
-	case 3:
-	{
-		for (int i=tcMin;i<tcMax;i++){
-			Frame* frame = extern_trajectories_thirdSet.getFrame(i);
-			if(frame==NULL){
-				//			cerr<<"Trajectory not available in getTrail(), third data set"<<endl;
-			}else {
-
-				TrajectoryPoint* point=NULL;
-				while(NULL!=(point=frame->getNextElement())){
-					extern_pedestrians_thirdSet[point->getIndex()]->plotTrail(point->getX(),point->getY(),point->getZ());
-					extern_pedestrians_thirdSet[point->getIndex()]->setTrailGeometry(trailForm);
-				}
-				frame->resetCursor();
-			}
-		}
-	}
-
-	break;
-
-	}
+    int trailCount=0;
+    int trailType=0;
+    int trailForm=0;
+    int tcMin=0;
+    int tcMax=0;
+
+    SystemSettings::getTrailsInfo(&trailCount,&trailType,&trailForm);
+
+    switch(trailType){
+    case 0://backward
+        tcMin=frameNumber-trailCount;
+        tcMax=frameNumber;
+        break;
+
+    case 1://symetric
+        tcMin=frameNumber-trailCount/2;
+        tcMax=frameNumber+trailCount/2;
+
+        break;
+
+    case 2://forward
+        tcMin=frameNumber;
+        tcMax=frameNumber+trailCount;
+        break;
+
+    }
+
+    switch(datasetID){
+    case 1:
+    {
+        for (int i=tcMin;i<tcMax;i++){
+            Frame* frame = extern_trajectories_firstSet.getFrame(i);
+            if(frame==NULL){
+                //		cerr<<"Trajectory not available in getTrail(), first data set"<<endl;
+            }else {
+                TrajectoryPoint* point=NULL;
+                while(NULL!=(point=frame->getNextElement())){
+                    extern_pedestrians_firstSet[point->getIndex()]->plotTrail(point->getX(),point->getY(),point->getZ());
+                    extern_pedestrians_firstSet[point->getIndex()]->setTrailGeometry(trailForm);
+                }
+                frame->resetCursor();
+            }
+        }
+    }
+        break;
+
+    case 2:
+    {
+        for (int i=tcMin;i<tcMax;i++){
+            Frame* frame = extern_trajectories_secondSet.getFrame(i);
+            if(frame==NULL){
+                //			cerr<<"Trajectory not available in getTrail(), second data set"<<endl;
+            }else {
+
+                TrajectoryPoint* point=NULL;
+                while(NULL!=(point=frame->getNextElement())){
+                    extern_pedestrians_secondSet[point->getIndex()]->plotTrail(point->getX(),point->getY(),point->getZ());
+                    extern_pedestrians_secondSet[point->getIndex()]->setTrailGeometry(trailForm);
+                }
+                frame->resetCursor();
+            }
+        }
+    }
+
+        break;
+
+    case 3:
+    {
+        for (int i=tcMin;i<tcMax;i++){
+            Frame* frame = extern_trajectories_thirdSet.getFrame(i);
+            if(frame==NULL){
+                //			cerr<<"Trajectory not available in getTrail(), third data set"<<endl;
+            }else {
+
+                TrajectoryPoint* point=NULL;
+                while(NULL!=(point=frame->getNextElement())){
+                    extern_pedestrians_thirdSet[point->getIndex()]->plotTrail(point->getX(),point->getY(),point->getZ());
+                    extern_pedestrians_thirdSet[point->getIndex()]->setTrailGeometry(trailForm);
+                }
+                frame->resetCursor();
+            }
+        }
+    }
+
+        break;
+
+    }
 }
 
 
 void TimerCallback::takeScreenshot(vtkRenderWindow *renderWindow){
-	static int imageID=0;
-	vtkWindowToImageFilter * winToImFilter  = vtkWindowToImageFilter::New();
-	winToImFilter->SetInput( renderWindow );
-	//winToImFilter->SetMagnification(4);
-	//renderWindow->Delete();
-	//vtkPostScriptWriter * image  = vtkPostScriptWriter::New();
-	vtkPNGWriter * image  = vtkPNGWriter::New();
+    static int imageID=0;
+    vtkWindowToImageFilter * winToImFilter  = vtkWindowToImageFilter::New();
+    winToImFilter->SetInput( renderWindow );
+    //winToImFilter->SetMagnification(4);
+    //renderWindow->Delete();
+    //vtkPostScriptWriter * image  = vtkPostScriptWriter::New();
+    vtkPNGWriter * image  = vtkPNGWriter::New();
     image->SetInputConnection(winToImFilter->GetOutputPort());
-	winToImFilter->Delete();
-
-	QString screenshots;
-	SystemSettings::getOutputDirectory(screenshots);
-	//create directory if not exits
-	if(!QDir(screenshots).exists()){
-		QDir dir;
-		if(!dir.mkpath (screenshots )){
-			//Debug::Error("could not create directory: %s",screenshots.toStdString().c_str());
-			//try with the current directory
-			screenshots="";
-		}
-	}
-
-
-	char filename[256]={0};
-	//	sprintf(filename,"travisto_video_%d.png",imageID++);
-	std::string date= QString(QDateTime::currentDateTime().toString("yyMMdd_hh")).toStdString();
-
-	sprintf(filename,"travisto_snap_%sh_%d.png",date.c_str(),imageID++);
-
-	//append the prefix
-	screenshots+=SystemSettings::getFilenamePrefix();
-	screenshots+=QString(filename);
-	image->SetFileName(screenshots.toStdString().c_str());
-	winToImFilter->Modified();
-
-	image->Write ();
-	image->Delete();
-	extern_take_screenshot=false;
+    winToImFilter->Delete();
+
+    QString screenshots;
+    SystemSettings::getOutputDirectory(screenshots);
+    //create directory if not exits
+    if(!QDir(screenshots).exists()){
+        QDir dir;
+        if(!dir.mkpath (screenshots )){
+            //Debug::Error("could not create directory: %s",screenshots.toStdString().c_str());
+            //try with the current directory
+            screenshots="";
+        }
+    }
+
+
+    char filename[256]={0};
+    //	sprintf(filename,"travisto_video_%d.png",imageID++);
+    std::string date= QString(QDateTime::currentDateTime().toString("yyMMdd_hh")).toStdString();
+
+    sprintf(filename,"travisto_snap_%sh_%d.png",date.c_str(),imageID++);
+
+    //append the prefix
+    screenshots+=SystemSettings::getFilenamePrefix();
+    screenshots+=QString(filename);
+    image->SetFileName(screenshots.toStdString().c_str());
+    winToImFilter->Modified();
+
+    image->Write ();
+    image->Delete();
+    extern_take_screenshot=false;
 }
 
 /// take png screenshot sequence
 void TimerCallback::takeScreenshotSequence(vtkRenderWindow* renderWindow){
-	static int imageID=0;
-	vtkWindowToImageFilter * winToImFilter  = vtkWindowToImageFilter::New();
-	winToImFilter->SetInput( renderWindow );
-	//renderWindow->Delete();
-	vtkPNGWriter * image  = vtkPNGWriter::New();
-	//vtkPostScriptWriter * image  = vtkPostScriptWriter::New();
+    static int imageID=0;
+    vtkWindowToImageFilter * winToImFilter  = vtkWindowToImageFilter::New();
+    winToImFilter->SetInput( renderWindow );
+    //renderWindow->Delete();
+    vtkPNGWriter * image  = vtkPNGWriter::New();
+    //vtkPostScriptWriter * image  = vtkPostScriptWriter::New();
     image->SetInputConnection( winToImFilter->GetOutputPort());
-	winToImFilter->Delete();
-
-	QString screenshots;
-	SystemSettings::getOutputDirectory(screenshots);
-
-	screenshots.append("./png_seq_"+QDateTime::currentDateTime().toString("yyMMddhh")+"_"+SystemSettings::getFilenamePrefix());
-	screenshots.truncate(screenshots.size()-1);
-
-	//create directory if not exits
-	if(!QDir(screenshots).exists()){
-		QDir dir;
-		if(!dir.mkpath (screenshots )){
-			cerr<<"could not create directory: "<< screenshots.toStdString();
-			//try with the current directory
-			screenshots="./png_seq_"+QDateTime::currentDateTime().toString("yyMMdd")+"_"+SystemSettings::getFilenamePrefix();
-			screenshots.truncate(screenshots.size()-1);
-		}
-	}
-
-
-	char filename[30]={0};
-	sprintf(filename,"/tmp_%07d.png",imageID++);
-	screenshots.append(filename);
-	image->SetFileName(screenshots.toStdString().c_str());
-	winToImFilter->Modified();
-
-	image->Write ();
-	image->Delete();
+    winToImFilter->Delete();
+
+    QString screenshots;
+    SystemSettings::getOutputDirectory(screenshots);
+
+    screenshots.append("./png_seq_"+QDateTime::currentDateTime().toString("yyMMddhh")+"_"+SystemSettings::getFilenamePrefix());
+    screenshots.truncate(screenshots.size()-1);
+
+    //create directory if not exits
+    if(!QDir(screenshots).exists()){
+        QDir dir;
+        if(!dir.mkpath (screenshots )){
+            cerr<<"could not create directory: "<< screenshots.toStdString();
+            //try with the current directory
+            screenshots="./png_seq_"+QDateTime::currentDateTime().toString("yyMMdd")+"_"+SystemSettings::getFilenamePrefix();
+            screenshots.truncate(screenshots.size()-1);
+        }
+    }
+
+
+    char filename[30]={0};
+    sprintf(filename,"/tmp_%07d.png",imageID++);
+    screenshots.append(filename);
+    image->SetFileName(screenshots.toStdString().c_str());
+    winToImFilter->Modified();
+
+    image->Write ();
+    image->Delete();
 }
 
 
 void TimerCallback::SetRenderTimerId(int tid)
 {
-	this->RenderTimerId = tid;
+    this->RenderTimerId = tid;
 }
 
 void TimerCallback::setTextActor(vtkTextActor* ra){
-	runningTime=ra;
+    runningTime=ra;
 }
 
 
diff --git a/src/TimerCallback.h b/src/TimerCallback.h
index ecb8134..d2c3bfa 100644
--- a/src/TimerCallback.h
+++ b/src/TimerCallback.h
@@ -64,6 +64,7 @@ class vtkWindowToImageFilter;
 class Frame;
 class vtkPNGWriter;
 class vtkTextActor;
+class vtkActor2D;
 
 //extern variables
 
@@ -80,9 +81,10 @@ extern Pedestrian** extern_pedestrians_firstSet;
 extern Pedestrian** extern_pedestrians_secondSet;
 extern Pedestrian** extern_pedestrians_thirdSet;
 
-//extern vtkSmartPointer<vtkGlyph3D> extern_glyphs_pedestrians;
+extern vtkSmartPointer<vtkActor2D> extern_pedestrians_labels;
 extern vtkSmartPointer<vtkTensorGlyph> extern_glyphs_pedestrians;
 
+
 extern SyncData extern_trajectories_firstSet;
 extern SyncData extern_trajectories_secondSet;
 extern SyncData extern_trajectories_thirdSet;
diff --git a/src/extern_var.h b/src/extern_var.h
index 7039792..67e5769 100644
--- a/src/extern_var.h
+++ b/src/extern_var.h
@@ -33,7 +33,7 @@
 #include "SyncData.h"
 #include "Pedestrian.h"
 
-//#include <vtkGlyph3D.h>
+#include <vtkActor2D.h>
 #include <vtkTensorGlyph.h>
 #include <vtkSmartPointer.h>
 #include <vtkPolyDataMapper.h>
@@ -84,8 +84,10 @@ Pedestrian** extern_pedestrians_thirdSet=NULL;
 //VTK_CREATE (vtkGlyph3D, extern_glyphs_pedestrians);
 VTK_CREATE (vtkTensorGlyph, extern_glyphs_pedestrians);
 
-// and here the corresponding dataset
+VTK_CREATE (vtkActor2D, extern_pedestrians_labels);
+
 
+// and here the corresponding dataset
 ///The first dataset
 SyncData extern_trajectories_firstSet;
 ///The second dataset
-- 
GitLab