Commit c165b337 authored by Pierre Kraemer's avatar Pierre Kraemer

import images & render colors

parent efc630d4
...@@ -28,6 +28,8 @@ ADD_SUBDIRECTORY(surface_modelisation) ...@@ -28,6 +28,8 @@ ADD_SUBDIRECTORY(surface_modelisation)
ADD_SUBDIRECTORY(surface_distance) ADD_SUBDIRECTORY(surface_distance)
ADD_SUBDIRECTORY(surface_radiance) ADD_SUBDIRECTORY(surface_radiance)
ADD_SUBDIRECTORY(cage2D_deformation)
ADD_SUBDIRECTORY(volume_import) ADD_SUBDIRECTORY(volume_import)
#ADD_SUBDIRECTORY(volume_render) #ADD_SUBDIRECTORY(volume_render)
......
...@@ -113,7 +113,7 @@ void MapParameters::stop(MapHandlerGen* mh) ...@@ -113,7 +113,7 @@ void MapParameters::stop(MapHandlerGen* mh)
bool Surface_Deformation_Plugin::enable() bool Surface_Deformation_Plugin::enable()
{ {
// magic line that init static variables of GenericMap in the plugins // magic line that init static variables of GenericMap in the plugins
GenericMap::copyAllStatics(m_schnapps->getStaticPointers()); GenericMap::copyAllStatics(m_schnapps->getStaticPointers());
m_dockTab = new Surface_Deformation_DockTab(m_schnapps, this); m_dockTab = new Surface_Deformation_DockTab(m_schnapps, this);
m_schnapps->addPluginDockTab(this, m_dockTab, "Surface_Deformation"); m_schnapps->addPluginDockTab(this, m_dockTab, "Surface_Deformation");
...@@ -380,16 +380,16 @@ void Surface_Deformation_Plugin::toggleMapDeformation(MapHandlerGen* map) ...@@ -380,16 +380,16 @@ void Surface_Deformation_Plugin::toggleMapDeformation(MapHandlerGen* map)
if(map) if(map)
{ {
MapParameters& p = h_parameterSet[map]; MapParameters& p = h_parameterSet[map];
if(!p.initialized) if (!p.initialized)
{ {
p.start(map); p.start(map);
if(p.initialized && map->isSelectedMap()) if (p.initialized && map->isSelectedMap())
m_dockTab->mapParametersInitialized(true); m_dockTab->mapParametersInitialized(true);
} }
else else
{ {
p.stop(map); p.stop(map);
if(!p.initialized && map->isSelectedMap()) if (!p.initialized && map->isSelectedMap())
m_dockTab->mapParametersInitialized(false); m_dockTab->mapParametersInitialized(false);
} }
} }
...@@ -401,9 +401,9 @@ void Surface_Deformation_Plugin::matchDiffCoord(MapHandlerGen* mh) ...@@ -401,9 +401,9 @@ void Surface_Deformation_Plugin::matchDiffCoord(MapHandlerGen* mh)
MapParameters& p = h_parameterSet[mh]; MapParameters& p = h_parameterSet[mh];
nlMakeCurrent(p.nlContext); nlMakeCurrent(p.nlContext);
if(nlGetCurrentState() == NL_STATE_INITIAL) if (nlGetCurrentState() == NL_STATE_INITIAL)
nlBegin(NL_SYSTEM) ; nlBegin(NL_SYSTEM) ;
for(int coord = 0; coord < 3; ++coord) for (int coord = 0; coord < 3; ++coord)
{ {
LinearSolving::setupVariables<PFP2>(*map, p.vIndex, p.freeSelector->getMarker(), p.positionAttribute, coord); LinearSolving::setupVariables<PFP2>(*map, p.vIndex, p.freeSelector->getMarker(), p.positionAttribute, coord);
nlBegin(NL_MATRIX); nlBegin(NL_MATRIX);
...@@ -421,13 +421,13 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh) ...@@ -421,13 +421,13 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
PFP2::MAP* map = static_cast<MapHandler<PFP2>*>(mh)->getMap(); PFP2::MAP* map = static_cast<MapHandler<PFP2>*>(mh)->getMap();
MapParameters& p = h_parameterSet[mh]; MapParameters& p = h_parameterSet[mh];
if(p.initialized) if (p.initialized)
{ {
CellMarkerNoUnmark<PFP2::MAP, VERTEX> m(*map) ; CellMarkerNoUnmark<PFP2::MAP, VERTEX> m(*map) ;
for(Dart d = map->begin(); d != map->end(); map->next(d)) for (Dart d = map->begin(); d != map->end(); map->next(d))
{ {
if(!m.isMarked(d)) if (!m.isMarked(d))
{ {
m.mark(d) ; m.mark(d) ;
...@@ -441,11 +441,11 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh) ...@@ -441,11 +441,11 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
Dart neigh = map->phi1(it) ; Dart neigh = map->phi1(it) ;
PFP2::VEC3 v = p.positionAttribute[neigh] - pp ; PFP2::VEC3 v = p.positionAttribute[neigh] - pp ;
PFP2::VEC3 vv = p.positionInit[neigh] - ppInit ; PFP2::VEC3 vv = p.positionInit[neigh] - ppInit ;
for(unsigned int i = 0; i < 3; ++i) for (unsigned int i = 0; i < 3; ++i)
for(unsigned int j = 0; j < 3; ++j) for (unsigned int j = 0; j < 3; ++j)
cov(i,j) += v[i] * vv[j];// * perMap->edgeWeight[it] / area ; cov(i,j) += v[i] * vv[j];// * perMap->edgeWeight[it] / area ;
Dart dboundary = map->phi_1(it) ; Dart dboundary = map->phi_1(it) ;
if(map->phi2(dboundary) == dboundary) if (map->phi2(dboundary) == dboundary)
{ {
v = p.positionAttribute[dboundary] - pp ; v = p.positionAttribute[dboundary] - pp ;
vv = p.positionInit[dboundary] - pp ; vv = p.positionInit[dboundary] - pp ;
...@@ -454,15 +454,15 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh) ...@@ -454,15 +454,15 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
cov(i,j) += v[i] * vv[j];// * perMap->edgeWeight[dboundary] / area ; cov(i,j) += v[i] * vv[j];// * perMap->edgeWeight[dboundary] / area ;
} }
it = map->alpha1(it) ; it = map->alpha1(it) ;
} while(it != d) ; } while (it != d) ;
Eigen::JacobiSVD<Eigen::Matrix3f> svd(cov, Eigen::ComputeFullU | Eigen::ComputeFullV) ; Eigen::JacobiSVD<Eigen::Matrix3f> svd(cov, Eigen::ComputeFullU | Eigen::ComputeFullV) ;
Eigen::Matrix3f R = svd.matrixU() * svd.matrixV().transpose() ; Eigen::Matrix3f R = svd.matrixU() * svd.matrixV().transpose() ;
if(R.determinant() < 0) if (R.determinant() < 0)
{ {
Eigen::Matrix3f U = svd.matrixU() ; Eigen::Matrix3f U = svd.matrixU() ;
for(unsigned int i = 0; i < 3; ++i) for (unsigned int i = 0; i < 3; ++i)
U(i,2) *= -1 ; U(i,2) *= -1 ;
R = U * svd.matrixV().transpose() ; R = U * svd.matrixV().transpose() ;
} }
...@@ -471,9 +471,9 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh) ...@@ -471,9 +471,9 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
} }
} }
for(Dart d = map->begin(); d != map->end(); map->next(d)) for (Dart d = map->begin(); d != map->end(); map->next(d))
{ {
if(m.isMarked(d)) if (m.isMarked(d))
{ {
m.unmark(d) ; m.unmark(d) ;
...@@ -491,7 +491,7 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh) ...@@ -491,7 +491,7 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
++degree ; ++degree ;
} }
it = map->alpha1(it) ; it = map->alpha1(it) ;
} while(it != d) ; } while (it != d) ;
r += p.vertexRotationMatrix[d] ; r += p.vertexRotationMatrix[d] ;
r /= degree + 1 ; r /= degree + 1 ;
PFP2::VEC3& dc = p.diffCoord[d] ; PFP2::VEC3& dc = p.diffCoord[d] ;
...@@ -531,9 +531,9 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh) ...@@ -531,9 +531,9 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
} }
nlMakeCurrent(p.nlContext); nlMakeCurrent(p.nlContext);
if(nlGetCurrentState() == NL_STATE_INITIAL) if (nlGetCurrentState() == NL_STATE_INITIAL)
nlBegin(NL_SYSTEM); nlBegin(NL_SYSTEM);
for(int coord = 0; coord < 3; ++coord) for (int coord = 0; coord < 3; ++coord)
{ {
LinearSolving::setupVariables<PFP2>(*map, p.vIndex, p.freeSelector->getMarker(), p.positionAttribute, coord); LinearSolving::setupVariables<PFP2>(*map, p.vIndex, p.freeSelector->getMarker(), p.positionAttribute, coord);
nlBegin(NL_MATRIX); nlBegin(NL_MATRIX);
......
...@@ -29,11 +29,15 @@ private: ...@@ -29,11 +29,15 @@ private:
virtual void disable() {} virtual void disable() {}
public slots: public slots:
MapHandlerGen* importFromFile(const QString& fileName); MapHandlerGen* importMeshFromFile(const QString& fileName);
void importFromFileDialog(); void importMeshFromFileDialog();
MapHandlerGen* importImageFromFile(const QString& fileName);
void importImageFromFileDialog();
private: private:
QAction* importAction; QAction* importMeshAction;
QAction* importImageAction;
}; };
} // namespace SCHNApps } // namespace SCHNApps
...@@ -41,4 +45,3 @@ private: ...@@ -41,4 +45,3 @@ private:
} // namespace CGoGN } // namespace CGoGN
#endif #endif
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "mapHandler.h" #include "mapHandler.h"
#include "Algo/Import/import.h" #include "Algo/Import/import.h"
#include "Algo/Tiling/Surface/square.h"
#include <QFileDialog> #include <QFileDialog>
#include <QFileInfo> #include <QFileInfo>
...@@ -19,13 +20,18 @@ bool Surface_Import_Plugin::enable() ...@@ -19,13 +20,18 @@ bool Surface_Import_Plugin::enable()
// magic line that init static variables of GenericMap in the plugins // magic line that init static variables of GenericMap in the plugins
GenericMap::copyAllStatics(m_schnapps->getStaticPointers()); GenericMap::copyAllStatics(m_schnapps->getStaticPointers());
importAction = new QAction("import", this); importMeshAction = new QAction("import mesh", this);
m_schnapps->addMenuAction(this, "Surface;Import", importAction); m_schnapps->addMenuAction(this, "Surface;Import Mesh", importMeshAction);
connect(importAction, SIGNAL(triggered()), this, SLOT(importFromFileDialog())); connect(importMeshAction, SIGNAL(triggered()), this, SLOT(importMeshFromFileDialog()));
importImageAction = new QAction("import image", this);
m_schnapps->addMenuAction(this, "Surface;Import Image", importImageAction);
connect(importImageAction, SIGNAL(triggered()), this, SLOT(importImageFromFileDialog()));
return true; return true;
} }
MapHandlerGen* Surface_Import_Plugin::importFromFile(const QString& fileName) MapHandlerGen* Surface_Import_Plugin::importMeshFromFile(const QString& fileName)
{ {
QFileInfo fi(fileName); QFileInfo fi(fileName);
if(fi.exists()) if(fi.exists())
...@@ -58,12 +64,72 @@ MapHandlerGen* Surface_Import_Plugin::importFromFile(const QString& fileName) ...@@ -58,12 +64,72 @@ MapHandlerGen* Surface_Import_Plugin::importFromFile(const QString& fileName)
return NULL; return NULL;
} }
void Surface_Import_Plugin::importFromFileDialog() void Surface_Import_Plugin::importMeshFromFileDialog()
{ {
QStringList fileNames = QFileDialog::getOpenFileNames(m_schnapps, "Import surfaces", m_schnapps->getAppPath(), "Surface mesh Files (*.ply *.off *.trian)"); QStringList fileNames = QFileDialog::getOpenFileNames(m_schnapps, "Import surface meshes", m_schnapps->getAppPath(), "Surface mesh Files (*.ply *.off *.trian)");
QStringList::Iterator it = fileNames.begin(); QStringList::Iterator it = fileNames.begin();
while(it != fileNames.end()) { while(it != fileNames.end())
importFromFile(*it); {
importMeshFromFile(*it);
++it;
}
}
MapHandlerGen* Surface_Import_Plugin::importImageFromFile(const QString& fileName)
{
QFileInfo fi(fileName);
if(fi.exists())
{
MapHandlerGen* mhg = m_schnapps->addMap(fi.baseName(), 2);
if(mhg)
{
MapHandler<PFP2>* mh = static_cast<MapHandler<PFP2>*>(mhg);
PFP2::MAP* map = mh->getMap();
VertexAttribute<PFP2::VEC3, PFP2::MAP> position = map->addAttribute<PFP2::VEC3, VERTEX, PFP2::MAP>("position");
VertexAttribute<PFP2::VEC3, PFP2::MAP> color = map->addAttribute<PFP2::VEC3, VERTEX, PFP2::MAP>("color");
QImage image;
QString extension = fi.suffix();
extension.toUpper();
if(!image.load(fileName, extension.toUtf8().constData()))
{
CGoGNout << "Image [" << fileName.toStdString() << "] has not been loaded correctly" << CGoGNendl;
return NULL;
}
int imageX = image.width();
int imageY = image.height();
Algo::Surface::Tilings::Square::Grid<PFP2> grid(*map, imageX - 1, imageY - 1);
grid.embedIntoGrid(position, imageX - 1, imageY - 1);
const std::vector<Dart>& vDarts = grid.getVertexDarts();
QRgb pixel;
for(int i = 0; i < imageX; ++i)
{
for(int j = 0; j < imageY; ++j)
{
pixel = image.pixel(i, (imageY-j) - 1);
color[vDarts[j*imageX + i]] = PFP2::VEC3(qRed(pixel)/255.f, qGreen(pixel)/255.f, qBlue(pixel)/255.f);
}
}
mh->registerAttribute(position);
mh->registerAttribute(color);
}
return mhg;
}
else
return NULL;
}
void Surface_Import_Plugin::importImageFromFileDialog()
{
QStringList fileNames = QFileDialog::getOpenFileNames(m_schnapps, "Import images", m_schnapps->getAppPath(), "Surface mesh Files (*.png *.jpg *.jpeg)");
QStringList::Iterator it = fileNames.begin();
while(it != fileNames.end())
{
importImageFromFile(*it);
++it; ++it;
} }
} }
......
...@@ -14,40 +14,17 @@ ...@@ -14,40 +14,17 @@
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="9" column="0" rowspan="2" colspan="2"> <item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_3"> <widget class="QLabel" name="label_2">
<item> <property name="text">
<widget class="QCheckBox" name="check_renderEdges"> <string>Position :</string>
<property name="text"> </property>
<string>render edges</string> </widget>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="scolorButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="text">
<string>Color</string>
</property>
</widget>
</item>
</layout>
</item> </item>
<item row="1" column="1"> <item row="0" column="1">
<widget class="QComboBox" name="combo_normalVBO"> <widget class="QComboBox" name="combo_positionVBO">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed"> <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
...@@ -59,19 +36,6 @@ ...@@ -59,19 +36,6 @@
</item> </item>
</widget> </widget>
</item> </item>
<item row="20" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>156</width>
<height>161</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="label_3"> <widget class="QLabel" name="label_3">
<property name="text"> <property name="text">
...@@ -79,57 +43,32 @@ ...@@ -79,57 +43,32 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="15" column="1"> <item row="1" column="1">
<widget class="QRadioButton" name="radio_phongShading"> <widget class="QComboBox" name="combo_normalVBO">
<property name="text"> <property name="sizePolicy">
<string>Phong</string> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
</property> <horstretch>0</horstretch>
<attribute name="buttonGroup"> <verstretch>0</verstretch>
<string notr="true">group_faceShading</string> </sizepolicy>
</attribute>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Position :</string>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<widget class="QSlider" name="slider_verticesScaleFactor">
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="16" column="0" colspan="2">
<widget class="QCheckBox" name="check_renderBoundary">
<property name="text">
<string>render boundary</string>
</property> </property>
<item>
<property name="text">
<string>- select VBO -</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item row="15" column="0"> <item row="2" column="0">
<widget class="QRadioButton" name="radio_flatShading"> <widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Flat</string> <string>Color :</string>
</property>
<property name="checked">
<bool>true</bool>
</property> </property>
<attribute name="buttonGroup">
<string notr="true">group_faceShading</string>
</attribute>
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="2" column="1">
<widget class="QComboBox" name="combo_positionVBO"> <widget class="QComboBox" name="combo_colorVBO">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"> <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
...@@ -141,10 +80,106 @@ ...@@ -141,10 +80,106 @@
</item> </item>
</widget> </widget>
</item> </item>
<item row="2" column="0" colspan="2"> <item row="3" column="0" colspan="2">
<widget class="Line" name="line"/> <widget class="Line" name="line"/>
</item> </item>
<item row="12" column="0" rowspan="2" colspan="2"> <item row="4" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="check_renderVertices">
<property name="text">
<string>render vertices</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="vcolorButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>
</property>
<property name="text">
<string>Color</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="0" colspan="2">
<widget class="QSlider" name="slider_verticesScaleFactor">
<property name="value">
<number>50</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item row="6" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="check_renderEdges">
<property name="text">
<string>render edges</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="scolorButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>32</height>
</size>