Finished with the implementation

This commit is contained in:
Turingon 2024-07-05 13:00:39 +02:00
parent 269cedbf06
commit a71389d1dd
43 changed files with 671 additions and 47 deletions

View file

@ -24,3 +24,4 @@ QMAKE_CXX.LIBDIRS = \
QMAKE_LICHECK_TIMESTAMP = "Thu May 16"
QMAKE_LICHECK_TIMESTAMP = "Sat May 18"
QMAKE_LICHECK_TIMESTAMP = "Fri May 31"
QMAKE_LICHECK_TIMESTAMP = "Sat Jun 29"

File diff suppressed because one or more lines are too long

View file

@ -61,7 +61,9 @@ SOURCES = cartesiangridtohorizontalslicefilter.cpp \
main.cpp \
mainwindow.cpp \
opengldisplaywidget.cpp \
datavolumeboundingboxrenderer.cpp moc_mainwindow.cpp \
datavolumeboundingboxrenderer.cpp \
streamlinemapper.cpp \
streamlinerenderer.cpp moc_mainwindow.cpp \
moc_opengldisplaywidget.cpp
OBJECTS = cartesiangridtohorizontalslicefilter.o \
flowdatasource.o \
@ -73,13 +75,17 @@ OBJECTS = cartesiangridtohorizontalslicefilter.o \
mainwindow.o \
opengldisplaywidget.o \
datavolumeboundingboxrenderer.o \
streamlinemapper.o \
streamlinerenderer.o \
moc_mainwindow.o \
moc_opengldisplaywidget.o
DIST = lines_fshader.glsl \
lines_fshader_contour.glsl \
lines_fshader_streamline.glsl \
lines_fshader_texture.glsl \
lines_vshader.glsl \
lines_vshader_contour.glsl \
lines_vshader_streamline.glsl \
lines_vshader_texture.glsl \
uhhlogo.png \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/mkspecs/features/spec_pre.prf \
@ -303,7 +309,9 @@ DIST = lines_fshader.glsl \
horizontalslicetoimagemapper.h \
mainwindow.h \
opengldisplaywidget.h \
datavolumeboundingboxrenderer.h cartesiangridtohorizontalslicefilter.cpp \
datavolumeboundingboxrenderer.h \
streamlinemapper.h \
streamlinerenderer.h cartesiangridtohorizontalslicefilter.cpp \
flowdatasource.cpp \
horizontalcontourlinesrenderer.cpp \
horizontalslicerenderer.cpp \
@ -312,7 +320,9 @@ DIST = lines_fshader.glsl \
main.cpp \
mainwindow.cpp \
opengldisplaywidget.cpp \
datavolumeboundingboxrenderer.cpp
datavolumeboundingboxrenderer.cpp \
streamlinemapper.cpp \
streamlinerenderer.cpp
QMAKE_TARGET = DataVisualizationSoSe2024
DESTDIR =
TARGET = DataVisualizationSoSe2024
@ -768,8 +778,8 @@ distdir: FORCE
@test -d $(DISTDIR) || mkdir -p $(DISTDIR)
$(COPY_FILE) --parents $(DIST) $(DISTDIR)/
$(COPY_FILE) --parents /home/luxdragon/Qt5.15/5.15.13/gcc_64/mkspecs/features/data/dummy.cpp $(DISTDIR)/
$(COPY_FILE) --parents cartesiangridtohorizontalslicefilter.h flowdatasource.h horizontalcontourlinesrenderer.h horizontalslicerenderer.h horizontalslicetocontourlinemapper.h horizontalslicetoimagemapper.h mainwindow.h opengldisplaywidget.h datavolumeboundingboxrenderer.h $(DISTDIR)/
$(COPY_FILE) --parents cartesiangridtohorizontalslicefilter.cpp flowdatasource.cpp horizontalcontourlinesrenderer.cpp horizontalslicerenderer.cpp horizontalslicetocontourlinemapper.cpp horizontalslicetoimagemapper.cpp main.cpp mainwindow.cpp opengldisplaywidget.cpp datavolumeboundingboxrenderer.cpp $(DISTDIR)/
$(COPY_FILE) --parents cartesiangridtohorizontalslicefilter.h flowdatasource.h horizontalcontourlinesrenderer.h horizontalslicerenderer.h horizontalslicetocontourlinemapper.h horizontalslicetoimagemapper.h mainwindow.h opengldisplaywidget.h datavolumeboundingboxrenderer.h streamlinemapper.h streamlinerenderer.h $(DISTDIR)/
$(COPY_FILE) --parents cartesiangridtohorizontalslicefilter.cpp flowdatasource.cpp horizontalcontourlinesrenderer.cpp horizontalslicerenderer.cpp horizontalslicetocontourlinemapper.cpp horizontalslicetoimagemapper.cpp main.cpp mainwindow.cpp opengldisplaywidget.cpp datavolumeboundingboxrenderer.cpp streamlinemapper.cpp streamlinerenderer.cpp $(DISTDIR)/
clean: compiler_clean
@ -1027,10 +1037,18 @@ moc_opengldisplaywidget.cpp: opengldisplaywidget.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qt_windows.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopengles2ext.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglext.h \
datavolumeboundingboxrenderer.h \
flowdatasource.h \
cartesiangridtohorizontalslicefilter.h \
horizontalslicetoimagemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QImage \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QString \
horizontalslicetocontourlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
horizontalslicerenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLShaderProgram \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglshaderprogram.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector4d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qmatrix4x4.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qquaternion.h \
@ -1040,16 +1058,12 @@ moc_opengldisplaywidget.cpp: opengldisplaywidget.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLVertexArrayObject \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglvertexarrayobject.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QObject \
flowdatasource.h \
cartesiangridtohorizontalslicefilter.h \
horizontalslicetoimagemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QImage \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QString \
horizontalslicetocontourlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
horizontalslicerenderer.h \
horizontalcontourlinesrenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QTimer \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtimer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbasictimer.h \
streamlinemapper.h \
streamlinerenderer.h \
moc_predefs.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/bin/moc
/home/luxdragon/Qt5.15/5.15.13/gcc_64/bin/moc $(DEFINES) --include /home/luxdragon/Documents/Uni/DV/Tornado-Visualization/datenvisualisierung_sose2024/moc_predefs.h -I/home/luxdragon/Qt5.15/5.15.13/gcc_64/mkspecs/linux-g++ -I/home/luxdragon/Documents/Uni/DV/Tornado-Visualization/datenvisualisierung_sose2024 -I/home/luxdragon/Qt5.15/5.15.13/gcc_64/include -I/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtWidgets -I/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui -I/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore -I/usr/include/c++/11 -I/usr/include/x86_64-linux-gnu/c++/11 -I/usr/include/c++/11/backward -I/usr/lib/gcc/x86_64-linux-gnu/11/include -I/usr/local/include -I/usr/include/x86_64-linux-gnu -I/usr/include opengldisplaywidget.h -o moc_opengldisplaywidget.cpp
@ -1657,10 +1671,18 @@ mainwindow.o: mainwindow.cpp mainwindow.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qt_windows.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopengles2ext.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglext.h \
datavolumeboundingboxrenderer.h \
flowdatasource.h \
cartesiangridtohorizontalslicefilter.h \
horizontalslicetoimagemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QImage \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QString \
horizontalslicetocontourlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
horizontalslicerenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLShaderProgram \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglshaderprogram.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector4d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qmatrix4x4.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qquaternion.h \
@ -1670,16 +1692,12 @@ mainwindow.o: mainwindow.cpp mainwindow.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLVertexArrayObject \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglvertexarrayobject.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QObject \
flowdatasource.h \
cartesiangridtohorizontalslicefilter.h \
horizontalslicetoimagemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QImage \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QString \
horizontalslicetocontourlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
horizontalslicerenderer.h \
horizontalcontourlinesrenderer.h
horizontalcontourlinesrenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QTimer \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtimer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbasictimer.h \
streamlinemapper.h \
streamlinerenderer.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o mainwindow.o mainwindow.cpp
opengldisplaywidget.o: opengldisplaywidget.cpp opengldisplaywidget.h \
@ -1794,10 +1812,18 @@ opengldisplaywidget.o: opengldisplaywidget.cpp opengldisplaywidget.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qt_windows.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopengles2ext.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglext.h \
datavolumeboundingboxrenderer.h \
flowdatasource.h \
cartesiangridtohorizontalslicefilter.h \
horizontalslicetoimagemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QImage \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QString \
horizontalslicetocontourlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
horizontalslicerenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLShaderProgram \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglshaderprogram.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector4d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qmatrix4x4.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qquaternion.h \
@ -1807,16 +1833,12 @@ opengldisplaywidget.o: opengldisplaywidget.cpp opengldisplaywidget.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLVertexArrayObject \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglvertexarrayobject.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QObject \
flowdatasource.h \
cartesiangridtohorizontalslicefilter.h \
horizontalslicetoimagemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QImage \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QString \
horizontalslicetocontourlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
horizontalslicerenderer.h \
horizontalcontourlinesrenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QTimer \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtimer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbasictimer.h \
streamlinemapper.h \
streamlinerenderer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QMouseEvent \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QKeyEvent \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLFunctions \
@ -1924,6 +1946,158 @@ datavolumeboundingboxrenderer.o: datavolumeboundingboxrenderer.cpp datavolumebou
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLContext
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o datavolumeboundingboxrenderer.o datavolumeboundingboxrenderer.cpp
streamlinemapper.o: streamlinemapper.cpp streamlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qvector.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qalgorithms.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qglobal.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qconfig-bootstrapped.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qconfig.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtcore-config.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsystemdetection.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qprocessordetection.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcompilerdetection.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtypeinfo.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsysinfo.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qlogging.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qflags.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbasicatomic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic_bootstrap.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qgenericatomic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic_cxx11.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic_msvc.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qglobalstatic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qmutex.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qnumeric.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qversiontagging.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qiterator.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qrefcount.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qarraydata.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qhashfunctions.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstring.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qchar.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbytearray.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qnamespace.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringliteral.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringalgorithms.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringview.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringbuilder.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qpair.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcontainertools_impl.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qpoint.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qtguiglobal.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qtgui-config.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qmetatype.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qvarlengtharray.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcontainerfwd.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qobjectdefs.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qobjectdefs_impl.h
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o streamlinemapper.o streamlinemapper.cpp
streamlinerenderer.o: streamlinerenderer.cpp streamlinerenderer.h \
streamlinemapper.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QVector \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qvector.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qalgorithms.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qglobal.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qconfig-bootstrapped.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qconfig.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtcore-config.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsystemdetection.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qprocessordetection.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcompilerdetection.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtypeinfo.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsysinfo.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qlogging.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qflags.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbasicatomic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic_bootstrap.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qgenericatomic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic_cxx11.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qatomic_msvc.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qglobalstatic.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qmutex.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qnumeric.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qversiontagging.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qiterator.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qrefcount.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qarraydata.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qhashfunctions.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstring.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qchar.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbytearray.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qnamespace.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringliteral.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringalgorithms.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringview.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringbuilder.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qpair.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcontainertools_impl.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qpoint.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QVector3D \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector3d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qtguiglobal.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qtgui-config.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qmetatype.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qvarlengtharray.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcontainerfwd.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qobjectdefs.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qobjectdefs_impl.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLShaderProgram \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglshaderprogram.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopengl.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qt_windows.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopengles2ext.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglext.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector2d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qvector4d.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qmatrix4x4.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qquaternion.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qgenericmatrix.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qdebug.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qhash.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qlist.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qbytearraylist.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringlist.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qregexp.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qstringmatcher.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qmap.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qtextstream.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qiodevice.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qobject.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcoreevent.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qscopedpointer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qobject_impl.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qlocale.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qvariant.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qshareddata.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qset.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qcontiguouscache.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsharedpointer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsharedpointer_impl.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qdatastream.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qrect.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qmargins.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/qsize.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLBuffer \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglbuffer.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLVertexArrayObject \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglvertexarrayobject.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QObject \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLFunctions \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglfunctions.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglcontext.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtCore/QScopedPointer \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QSurfaceFormat \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qsurfaceformat.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/qopenglversionfunctions.h \
/home/luxdragon/Qt5.15/5.15.13/gcc_64/include/QtGui/QOpenGLContext
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o streamlinerenderer.o streamlinerenderer.cpp
moc_mainwindow.o: moc_mainwindow.cpp
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_mainwindow.o moc_mainwindow.cpp

View file

@ -49,3 +49,11 @@ float* CartesianGridToHorizontalSliceFilter::passSlice(int xs, int ys) {
// We don't even need to pass information about which windcomponent we're using
// We just loop through each 3rd element for graphics
}
float* CartesianGridToHorizontalSliceFilter::passCube() {
// returns the whole cube, we'll perform operations on the cube
// in the mapper itself
// Yes, this is redundant, but I wish to adhere to the code
// structure as proposed in the lecture
return cartesianDataGrid;
}

View file

@ -13,6 +13,7 @@ public:
float *passSlice(int xs, int ys);
void changeWindComponent(int ic);
float *passSliceMagnitude(int xs, int ys);
float *passCube();
private:
float *cartesianDataGrid;
int windcomponent;

View file

@ -34,6 +34,8 @@ SOURCES += \
mainwindow.cpp \
opengldisplaywidget.cpp \
datavolumeboundingboxrenderer.cpp \
streamlinemapper.cpp \
streamlinerenderer.cpp \
tornadoSrc.c
HEADERS += \
@ -45,13 +47,17 @@ HEADERS += \
horizontalslicetoimagemapper.h \
mainwindow.h \
opengldisplaywidget.h \
datavolumeboundingboxrenderer.h
datavolumeboundingboxrenderer.h \
streamlinemapper.h \
streamlinerenderer.h
DISTFILES += \
lines_fshader.glsl \
lines_fshader_contour.glsl \
lines_fshader_streamline.glsl \
lines_fshader_texture.glsl \
lines_vshader.glsl \
lines_vshader_contour.glsl \
lines_vshader_streamline.glsl \
lines_vshader_texture.glsl \
uhhlogo.png

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 9.0.2, 2024-06-15T20:51:37. -->
<!-- Written by QtCreator 9.0.2, 2024-07-05T13:00:08. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View file

@ -36,6 +36,13 @@ void FlowDataSource::updateT() {
gen_tornado(num_x, num_y, num_z, ct, cartesianDataGrid);
}
void FlowDataSource::decreaseT() {
if (ct > 0) {
ct--;
}
gen_tornado(num_x, num_y, num_z, ct, cartesianDataGrid);
}
void FlowDataSource::resetT() {
ct=0;
gen_tornado(num_x, num_y, num_z, ct, cartesianDataGrid);

View file

@ -16,6 +16,7 @@ public:
float *returnSource();
void updateT();
void resetT();
void decreaseT();
private:
float *cartesianDataGrid;
int num_x;

View file

@ -1,9 +1,11 @@
#include "horizontalslicetocontourlinemapper.h"
#include <iostream>
#include <math.h>
HorizontalSliceToContourLineMapper::HorizontalSliceToContourLineMapper(){
std::cout << "CONTOUR MAPPER CONSTRUCTOR CALLED - creating " << this << std::endl;
magnitude = false;
}
HorizontalSliceToContourLineMapper::~HorizontalSliceToContourLineMapper() {
@ -26,6 +28,10 @@ void HorizontalSliceToContourLineMapper::newZ(float* newsource, int z) {
iz = z;
}
void HorizontalSliceToContourLineMapper::setMagnitude(bool value) {
magnitude = value;
}
void HorizontalSliceToContourLineMapper::setIso(float* isos, int nums) {
isolist = new float[nums];
@ -51,6 +57,10 @@ int HorizontalSliceToContourLineMapper::marchingSquaresNum(float isoline, float
return result;
}
float HorizontalSliceToContourLineMapper::WindSpeed(float x, float y, float z) {
return sqrt(x*x + y*y + z*z);
}
QVector<QVector3D> HorizontalSliceToContourLineMapper::mapSliceToContourLineSegments() {
QVector<QVector3D> vectors; // We store all of our points in a dynamic array as Vector3Ds
QVector3D vector1; // Vector 1 and 2 will then be connected as a line (using GL_LINES)
@ -72,6 +82,14 @@ QVector<QVector3D> HorizontalSliceToContourLineMapper::mapSliceToContourLineSegm
v2 = slice[3*((y+1)*xs+x+1)]; //top right
v1 = slice[3*(y*xs+x+1)]; //botom right
v0 = slice[3*(y*xs+x)]; //bottom left
if (magnitude == true) {
v3 = WindSpeed(slice[3*((y+1)*xs+x)], slice[3*((y+1)*xs+x)+1], slice[3*((y+1)*xs+x)+2]);
v2 = WindSpeed(slice[3*((y+1)*xs+x+1)], slice[3*((y+1)*xs+x+1)+1], slice[3*((y+1)*xs+x+1)+2]);
v1 = WindSpeed(slice[3*(y*xs+x+1)], slice[3*(y*xs+x+1)+1], slice[3*(y*xs+x+1)+2]);
v0 = WindSpeed(slice[3*(y*xs+x)], slice[3*(y*xs+x)+1], slice[3*(y*xs+x)+2]);
}
iso = isolist[i];
squareCase = marchingSquaresNum(iso, v0, v1, v2, v3);
// Viet found the amazing way of reducing the number of cases (before that I used switch x3)

View file

@ -14,6 +14,8 @@ public:
int marchingSquaresNum(float isoline, float a, float b, float c, float d);
void setIso(float *isos, int nums);
void newZ(float *newsource, int z);
void setMagnitude(bool mag);
float WindSpeed(float x, float y, float z);
private:
int xs;
int ys;
@ -22,6 +24,7 @@ private:
int numIsos;
float *slice;
float *isolist;
bool magnitude;
};
#endif // HORIZONTALSLICETOCONTOURLINEMAPPER_H

View file

@ -33,6 +33,11 @@ float HorizontalSliceToImageMapper::totalWindSpeed(float x, float y, float z) {
}
QImage HorizontalSliceToImageMapper::mapSliceToImage() {
// We loop through the windspeed value and map a red colour to it, if positive
// otherwise it's a blue colour, the brightness determines the intensity
// We amplify the intensity by a factor 3 for a better visualization
//std::cout << xs << " hier kommt noch ys:" << ys << std::endl;
QImage image(xs, ys, QImage::Format_RGB32);
QRgb colour;
@ -76,6 +81,7 @@ QImage HorizontalSliceToImageMapper::mapSliceToImage() {
QImage HorizontalSliceToImageMapper::mapSliceToImage(QString fileName) {
// CREATED FOR LEARNING PURPOSES
// maps the UHH logo to a frame
QImage image;
if (!image.load(fileName)) {
std::cout << "ERROR! Image could not be read!" << std::endl;

View file

@ -0,0 +1,8 @@
#version 330
layout(location = 0) out vec4 fragColor;
void main()
{
fragColor = vec4(0.6, 1, 0.6, 1); // verda koloro
}

View file

@ -0,0 +1,8 @@
#version 330
uniform mat4 mvpMatrix; // model-view-projection matrix
in vec4 vertexPosition;
void main()
{
gl_Position = mvpMatrix * vertexPosition; // same kiel antaux
}

View file

@ -10,6 +10,7 @@
#include "flowdatasource.h"
// Define grid size here
#define XValue 16
#define YValue 16
#define ZValue 16
@ -27,13 +28,15 @@ OpenGLDisplayWidget::OpenGLDisplayWidget(QWidget *parent)
OpenGLDisplayWidget::~OpenGLDisplayWidget()
{
// Clean up visualization pipeline.
// Cleans up visualization pipeline
//delete bboxRenderer;
delete grid;
delete filter;
delete mapper;
delete renderer;
delete contourrenderer;
delete streamlinemapper;
delete streamlinerenderer;
// ....
}
@ -95,12 +98,13 @@ void OpenGLDisplayWidget::paintGL()
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Call renderer modules.
// Calls renderer modules
//bboxRenderer->drawBoundingBox(mvpMatrix);
renderer->drawBoundingBox(mvpMatrix);
renderer->drawFrame(mvpMatrix);
renderer->drawImage(mvpMatrix);
contourrenderer->draw(mvpMatrix);
streamlinerenderer->draw(mvpMatrix);
// ....
}
@ -161,6 +165,14 @@ void OpenGLDisplayWidget::wheelEvent(QWheelEvent *e)
void OpenGLDisplayWidget::keyPressEvent(QKeyEvent *e)
{
// This function looks for key presses and then executes the corresponding command
// up and down move the slice up and down
// x,y,z and m activate various wind components or display the magnitude
// note that we only need to change the i in the Filter pointer, which is why
// this implementation should be fast
// Space starts an animation (implemented with a timer)
// R resets the time
// left and right enable the user to check specific times
if (e->key() == Qt::Key_Up)
{
@ -181,16 +193,19 @@ void OpenGLDisplayWidget::keyPressEvent(QKeyEvent *e)
}
} else if (e->key() == Qt::Key_X) {
mapper->setMagnitude(false);
contourmapper->setMagnitude(false);
filter->changeWindComponent(0);
mapper->getSlice(filter->passSlice(XValue,YValue));
contourmapper->newZ(filter->passSlice(XValue,YValue), renderer->z);
} else if (e->key() == Qt::Key_Y) {
mapper->setMagnitude(false);
contourmapper->setMagnitude(false);
filter->changeWindComponent(1);
mapper->getSlice(filter->passSlice(XValue,YValue));
contourmapper->newZ(filter->passSlice(XValue,YValue), renderer->z);
} else if (e->key() == Qt::Key_Z) {
mapper->setMagnitude(false);
contourmapper->setMagnitude(false);
filter->changeWindComponent(2);
mapper->getSlice(filter->passSlice(XValue,YValue));
contourmapper->newZ(filter->passSlice(XValue,YValue), renderer->z);
@ -199,7 +214,12 @@ void OpenGLDisplayWidget::keyPressEvent(QKeyEvent *e)
filter->changeWindComponent(0);
mapper->getSlice(filter->passSlice(XValue,YValue));
mapper->setMagnitude(true);
// contour renderer does not work for the magnitude case!
contourmapper->setMagnitude(true);
} else if (e->key() == Qt::Key_Right) {
std::cout << "Right press\n";
grid->updateT();
} else if (e->key() == Qt::Key_Left) {
grid->decreaseT();
} else if (e->key() == Qt::Key_Space) {
if (!animate) {
animate = !animate;
@ -262,7 +282,7 @@ void OpenGLDisplayWidget::initVisualizationPipeline()
mapper->getSlice(filter->passSlice(XValue,YValue), XValue,YValue);
contourmapper = new HorizontalSliceToContourLineMapper(); //Mapper causes the program to crash
contourmapper = new HorizontalSliceToContourLineMapper(); //Mapper caused the program to crash, but not anymore
contourmapper->getSlice(filter->passSlice(XValue,YValue), XValue,YValue,ZValue, 0);
float *isos = new float[3];
isos[0] = 0.1;
@ -270,6 +290,10 @@ void OpenGLDisplayWidget::initVisualizationPipeline()
isos[2] = -0.1;
contourmapper->setIso(isos, 3);
delete[] isos;
streamlinemapper = new StreamlineMapper();
streamlinemapper->getData(filter->passCube(), XValue, YValue, ZValue);
streamlinemapper->setValues(125, 100);
// Initialize rendering modules.
//bboxRenderer = new DataVolumeBoundingBoxRenderer();
@ -277,4 +301,7 @@ void OpenGLDisplayWidget::initVisualizationPipeline()
contourrenderer = new HorizontalContourLinesRenderer();
renderer->setMapper(mapper);
contourrenderer->setContourMapper(contourmapper);
streamlinerenderer = new StreamlineRenderer();
streamlinerenderer->setMapper(streamlinemapper);
}

View file

@ -9,7 +9,8 @@
#include "horizontalslicerenderer.h"
#include "horizontalcontourlinesrenderer.h"
#include "QTimer"
#include "streamlinemapper.h"
#include "streamlinerenderer.h"
class OpenGLDisplayWidget : public QOpenGLWidget
{
@ -61,6 +62,9 @@ private:
//DataVolumeBoundingBoxRenderer *bboxRenderer;
HorizontalSliceRenderer *renderer;
HorizontalContourLinesRenderer *contourrenderer;
StreamlineMapper *streamlinemapper;
StreamlineRenderer *streamlinerenderer;
// ....
// Initialize the pipeline (create instances of data source, mapping,

View file

@ -0,0 +1,191 @@
#include "streamlinemapper.h"
#include <iostream>
StreamlineMapper::StreamlineMapper()
{
std::cout << "StreamlineMapper constructor called" << std::endl;
}
StreamlineMapper::~StreamlineMapper() {
std::cout << "StreamlineMapper destructor called" << std::endl;
}
void StreamlineMapper::getData(float *cube, int x, int y, int z) {
// Sets up the variables we will be working with
source = cube;
xs = x;
ys = y;
zs = z;
}
void StreamlineMapper::setValues(int seeds, int interpolation_length) {
// Sets up the seed point variables
num_steps = interpolation_length;
num_seeds = seeds;
}
float StreamlineMapper::bilinearInterpolation(float x_i, float y_i, int z_slice, int i) {
// We first implement bilinear interpolation, because the n-D expasion is then easier
// Check lecture and wikipedia for implementation idea
//
if (x_i > 1 or x_i < 0 or y_i > 1 or y_i < 0) {
//std::cout << "ERROR: Value outside of the valid range!" << std::endl;
return 1.0;
}
int x = x_i * (xs-1); //This is my simple trick to determine the index to the lower left of the point
int y = y_i * (ys-1);
int y_shift = xs;
int z_shift = z_slice*xs*ys + xs*y;
float xd = (x_i-x)/(xs-1);
float yd = (y_i-y)/(ys-1);
float new_x1 = (1-xd) * source[3*(x+z_shift)+i] + xd * source[3*(x+1+z_shift)+i]; //lower part of the rectangle
float new_x2 = (1-xd) * source[3*(x+y_shift+z_shift)+i] + xd * source[3*(x+1+y_shift+z_shift)+i]; // aaaand the upper part
// Tested on a small example on an online compiler
return (1-yd) * new_x1 + yd * new_x2;
}
float StreamlineMapper::trilinearInterpolation(float x_i, float y_i, float z_i, int i) {
// Neat trick allows us to simplify the trilinear interpolation
// We only need two bilinear interpolations
if (x_i > 1 or x_i < 0 or z_i > 1 or z_i < 0 or y_i > 1 or y_i < 0) {
//std::cout << "ERROR: Value outside of the valid range!" << std::endl;
return 1.0;
}
int z = z_i * (zs-1);
float zd = (z_i-z)/(zs-1);
float cLower = bilinearInterpolation(x_i, y_i, z, i);
float cUpper = bilinearInterpolation(x_i, y_i, z+1, i);
return (1-zd) * cLower + zd * cUpper; // analogous to bilinear interpolation, but we do it between two planes
}
QVector3D StreamlineMapper::euler2D(QVector3D coordinate, float deltaT) {
// Check definition in the lectures, the 2D version simply ignores the z-component
float v_x = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 0);
float v_y = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 1);
coordinate = coordinate + QVector3D(v_x, v_y, 0)*deltaT;
return coordinate;
}
QVector3D StreamlineMapper::euler3D(QVector3D coordinate, float deltaT) {
float v_x = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 0);
float v_y = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 1);
float v_z = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 2);
coordinate = coordinate + QVector3D(v_x, v_y, v_z)*deltaT;
return coordinate;
}
QVector3D StreamlineMapper::rungeKutta2D(QVector3D coordinate, float deltaT) {
// Check definition in the lectures, the 2D version simply ignores the z-component
// Parts of rungeKutta will exit the unitcube and that's OK, because I implemented
// bilinear and trilinear interpolations so that they return 1.0 when exiting the cube
// Should rungeKutta thus leave the cube, the final coordinate will be discarded
float v_x = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 0);
float v_y = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 1);
QVector3D k1 = QVector3D(v_x, v_y, 0) * deltaT;
QVector3D xNew = coordinate + (k1/2);
v_x = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 0);
v_y = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 1);
QVector3D k2 = QVector3D(v_x, v_y, 0) * deltaT;
xNew = coordinate + (k2/2);
v_x = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 0);
v_y = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 1);
QVector3D k3 = QVector3D(v_x, v_y, 0) * deltaT;
xNew = coordinate + k3;
v_x = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 0);
v_y = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 1);
QVector3D k4 = QVector3D(v_x, v_y, 0) * deltaT;
coordinate = coordinate + (k1/6) + (k2/3) + (k3/3) + (k4/6);
return coordinate;
}
QVector3D StreamlineMapper::rungeKutta3D(QVector3D coordinate, float deltaT) {
float v_x = trilinearInterpolation(coordinate.x(), coordinate.y(), coordinate.z(), 0);
float v_y = trilinearInterpolation(coordinate.y(), coordinate.y(), coordinate.z(), 1);
float v_z = trilinearInterpolation(coordinate.z(), coordinate.y(), coordinate.z(), 2);
QVector3D k1 = QVector3D(v_x, v_y, v_z) * deltaT;
QVector3D xNew = coordinate + (k1/2);
v_x = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 0);
v_y = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 1);
v_z = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 2);
QVector3D k2 = QVector3D(v_x, v_y, v_z) * deltaT;
xNew = coordinate + (k2/2);
v_x = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 0);
v_y = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 1);
v_z = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 2);
QVector3D k3 = QVector3D(v_x, v_y, v_z) * deltaT;
xNew = coordinate + k3;
v_x = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 0);
v_y = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 1);
v_z = trilinearInterpolation(xNew.x(),xNew.y(),xNew.z(), 2);
QVector3D k4 = QVector3D(v_x, v_y, v_z) * deltaT;
coordinate = coordinate + (k1/6) + (k2/3) + (k3/3) + (k4/6);
return coordinate;
}
int StreamlineMapper::get_num_seeds() {
// speeds everything up by allowing the renderer to obtain
// the number of seed points directly from the mapper
// makes the opengldisplaywidget.cpp file simpler
return num_seeds;
}
QVector<QVector<QVector3D>> StreamlineMapper::computeStreamlines() {
// The idea is to take a seed point (or many) and then iterate through the points
// with a certain procedure (euler3D/rungeKutta3D) and then terminate the streamline
// when it exists the unit cube OR when it reaches the maximum number of steps
// Note that the length of every streamline is NOT the same, hence why I pass
// QVector<QVector<QVector3D>> and not just a single QVector<QVector3D>
QVector<QVector<QVector3D>> vectors; // We store all of our points in a dynamic array as Vector3Ds
// Reminder that we had to debug A LOT:
/*// TEST IF RENDERER+SHADERS WORKS
QVector3D vector1 = QVector3D(0.0, 0.0, 0.0); // Vector 1 and 2 will then be connected as a line (using GL_LINES)
QVector3D vector2 = QVector3D(.0005;
for (int i = 0; i < num_seeds; i++) {
seed_point = QVector3D(0.2,0.2, 0.1*i);
container << seed_point;
for (int j = 0; j < num_st1.0, 1.0, 1.0);
vectors << vector1 << vector2; */
// STREAMLINE COMPUTATION
QVector3D seed_point;
QVector<QVector3D> container;
//vectors << seed_point;
float dT = 0.2;
for (int i = 0; i < num_seeds; i++) {
seed_point = QVector3D(0.2*(i%5) +0.01, 0.2*(i/5 % 5) +0.01, 0.2 * (i/25) +0.01);
container << seed_point;
for (int j = 0; j < num_steps-1; j++) {
seed_point = euler3D(seed_point, dT);
if (seed_point.x() < 0 or seed_point.x() > 1 or seed_point.y() < 0 or seed_point.y() > 1 or seed_point.z() < 0 or seed_point.z() > 1) {
break;
}
container << seed_point;
}
vectors << container;
container.clear();
}
return vectors;
}

View file

@ -0,0 +1,32 @@
#ifndef STREAMLINEMAPPER_H
#define STREAMLINEMAPPER_H
#include <QVector>
#include <QVector3D>
class StreamlineMapper
{
public:
StreamlineMapper();
~StreamlineMapper();
void getData(float *source, int x, int y, int z);
QVector<QVector3D> ComputeStreamlines();
void SetSourcePoints(float *points, int num);
float bilinearInterpolation(float x_i, float y_i, int z_slice, int i);
float trilinearInterpolation(float x_i, float y_i, float z_i, int i);
QVector3D euler2D(QVector3D coordinate, float deltaT);
QVector3D euler3D(QVector3D coordinate, float deltaT);
QVector3D rungeKutta2D(QVector3D coordinate, float deltaT);
QVector3D rungeKutta3D(QVector3D coordinate, float deltaT);
void setValues(int seeds, int interpolation_length);
QVector<QVector<QVector3D>> computeStreamlines();
int get_num_seeds();
private:
float* source;
float* sourcepoints;
int numPoints;
int xs, ys, zs;
int num_seeds;
int num_steps;
};
#endif // STREAMLINEMAPPER_H

Binary file not shown.

View file

@ -0,0 +1,101 @@
#include "streamlinerenderer.h"
#include <QOpenGLFunctions>
#include <QOpenGLContext>
#include <iostream>
StreamlineRenderer::StreamlineRenderer() : vertexBuffer(QOpenGLBuffer::VertexBuffer)
{
initOpenGLShaders();
initContours();
std::cout << "STREAMLINE RENDERER CALLED";
}
StreamlineRenderer::~StreamlineRenderer() {
vertexBuffer.destroy();
std::cout << "Destructor called";
}
void StreamlineRenderer::setMapper(StreamlineMapper* mappy) {
mapper = mappy;
num_seeds = mapper->get_num_seeds();
}
void StreamlineRenderer::initContours()
{
vertexBuffer.create(); // Make sure to destroy it in the destructor!
}
void StreamlineRenderer::initOpenGLShaders()
{
// For the contours
if (!shaderProgram.addShaderFromSourceFile(QOpenGLShader::Vertex,
"lines_vshader_streamline.glsl"))
{
std::cout << "Vertex shader error:\n"
<< shaderProgram.log().toStdString() << "\n" << std::flush;
return;
}
if (!shaderProgram.addShaderFromSourceFile(QOpenGLShader::Fragment,
"lines_fshader_streamline.glsl"))
{
std::cout << "Fragment shader error:\n"
<< shaderProgram.log().toStdString() << "\n" << std::flush;
return;
}
if (!shaderProgram.link())
{
std::cout << "Shader link error:\n"
<< shaderProgram.log().toStdString() << "\n" << std::flush;
return;
}
}
void StreamlineRenderer::setValues(int seeds) {
num_seeds = seeds;
}
void StreamlineRenderer::draw(QMatrix4x4 mvpMatrix)
{
QVector<QVector<QVector3D>> vector_list = mapper->computeStreamlines();
for (int i = 0; i<num_seeds; i++) {
render(vector_list.at(i), mvpMatrix);
}
}
void StreamlineRenderer::render(QVector<QVector3D> vectors, QMatrix4x4 mvpMatrix) {
std::cout << vectors.size() << std::endl;
vertexBuffer.bind();
vertexBuffer.allocate(vectors.data(), vectors.size() * sizeof(QVector3D));
vertexBuffer.release();
QOpenGLVertexArrayObject::Binder vaoBinder(&vertexArrayObject);
if (vertexArrayObject.isCreated())
{
vertexBuffer.bind();
shaderProgram.setAttributeBuffer("vertexPosition", GL_FLOAT, 0, 3, sizeof(QVector3D));
shaderProgram.enableAttributeArray("vertexPosition");
vertexBuffer.release();
}
// Tell OpenGL to use the shader program of this class.
shaderProgram.bind();
// Bind the vertex array object that links to the bounding box vertices.
vertexArrayObject.bind();
// Set the model-view-projection matrix as a uniform value.
shaderProgram.setUniformValue("mvpMatrix", mvpMatrix);
// Issue OpenGL draw commands.
QOpenGLFunctions *f = QOpenGLContext::currentContext()->functions();
f->glLineWidth(10);
f->glDrawArrays(GL_LINE_STRIP, 0, vectors.size()); // GL_LINES verbindet Vektore paarenweise, wahrend GL_LINE_STRIP jeden Vektor mit seinen 2 Nachbarn im Array verbindet
// Release objects until next render cycle.
vertexArrayObject.release();
shaderProgram.release();
}

View file

@ -0,0 +1,28 @@
#ifndef STREAMLINERENDERER_H
#define STREAMLINERENDERER_H
#include "streamlinemapper.h"
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
class StreamlineRenderer
{
public:
StreamlineRenderer();
~StreamlineRenderer();
void setMapper(StreamlineMapper* mappy);
void initOpenGLShaders();
void initContours();
void draw(QMatrix4x4 mvpMatrix);
void setValues(int seeds);
void render(QVector<QVector3D> vectors, QMatrix4x4 mvpMatrix);
private:
StreamlineMapper* mapper;
QOpenGLShaderProgram shaderProgram;
QOpenGLBuffer vertexBuffer;
QOpenGLVertexArrayObject vertexArrayObject;
int num_seeds;
};
#endif // STREAMLINERENDERER_H

Binary file not shown.