Commit c165b337 authored by Pierre Kraemer's avatar Pierre Kraemer

import images & render colors

parent efc630d4
......@@ -28,6 +28,8 @@ ADD_SUBDIRECTORY(surface_modelisation)
ADD_SUBDIRECTORY(surface_distance)
ADD_SUBDIRECTORY(surface_radiance)
ADD_SUBDIRECTORY(cage2D_deformation)
ADD_SUBDIRECTORY(volume_import)
#ADD_SUBDIRECTORY(volume_render)
......
......@@ -113,7 +113,7 @@ void MapParameters::stop(MapHandlerGen* mh)
bool Surface_Deformation_Plugin::enable()
{
// 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_schnapps->addPluginDockTab(this, m_dockTab, "Surface_Deformation");
......@@ -380,16 +380,16 @@ void Surface_Deformation_Plugin::toggleMapDeformation(MapHandlerGen* map)
if(map)
{
MapParameters& p = h_parameterSet[map];
if(!p.initialized)
if (!p.initialized)
{
p.start(map);
if(p.initialized && map->isSelectedMap())
if (p.initialized && map->isSelectedMap())
m_dockTab->mapParametersInitialized(true);
}
else
{
p.stop(map);
if(!p.initialized && map->isSelectedMap())
if (!p.initialized && map->isSelectedMap())
m_dockTab->mapParametersInitialized(false);
}
}
......@@ -401,9 +401,9 @@ void Surface_Deformation_Plugin::matchDiffCoord(MapHandlerGen* mh)
MapParameters& p = h_parameterSet[mh];
nlMakeCurrent(p.nlContext);
if(nlGetCurrentState() == NL_STATE_INITIAL)
if (nlGetCurrentState() == NL_STATE_INITIAL)
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);
nlBegin(NL_MATRIX);
......@@ -421,13 +421,13 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
PFP2::MAP* map = static_cast<MapHandler<PFP2>*>(mh)->getMap();
MapParameters& p = h_parameterSet[mh];
if(p.initialized)
if (p.initialized)
{
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) ;
......@@ -441,11 +441,11 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
Dart neigh = map->phi1(it) ;
PFP2::VEC3 v = p.positionAttribute[neigh] - pp ;
PFP2::VEC3 vv = p.positionInit[neigh] - ppInit ;
for(unsigned int i = 0; i < 3; ++i)
for(unsigned int j = 0; j < 3; ++j)
for (unsigned int i = 0; i < 3; ++i)
for (unsigned int j = 0; j < 3; ++j)
cov(i,j) += v[i] * vv[j];// * perMap->edgeWeight[it] / area ;
Dart dboundary = map->phi_1(it) ;
if(map->phi2(dboundary) == dboundary)
if (map->phi2(dboundary) == dboundary)
{
v = p.positionAttribute[dboundary] - pp ;
vv = p.positionInit[dboundary] - pp ;
......@@ -454,15 +454,15 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
cov(i,j) += v[i] * vv[j];// * perMap->edgeWeight[dboundary] / area ;
}
it = map->alpha1(it) ;
} while(it != d) ;
} while (it != d) ;
Eigen::JacobiSVD<Eigen::Matrix3f> svd(cov, Eigen::ComputeFullU | Eigen::ComputeFullV) ;
Eigen::Matrix3f R = svd.matrixU() * svd.matrixV().transpose() ;
if(R.determinant() < 0)
if (R.determinant() < 0)
{
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 ;
R = U * svd.matrixV().transpose() ;
}
......@@ -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) ;
......@@ -491,7 +491,7 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
++degree ;
}
it = map->alpha1(it) ;
} while(it != d) ;
} while (it != d) ;
r += p.vertexRotationMatrix[d] ;
r /= degree + 1 ;
PFP2::VEC3& dc = p.diffCoord[d] ;
......@@ -531,9 +531,9 @@ void Surface_Deformation_Plugin::asRigidAsPossible(MapHandlerGen* mh)
}
nlMakeCurrent(p.nlContext);
if(nlGetCurrentState() == NL_STATE_INITIAL)
if (nlGetCurrentState() == NL_STATE_INITIAL)
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);
nlBegin(NL_MATRIX);
......
......@@ -29,11 +29,15 @@ private:
virtual void disable() {}
public slots:
MapHandlerGen* importFromFile(const QString& fileName);
void importFromFileDialog();
MapHandlerGen* importMeshFromFile(const QString& fileName);
void importMeshFromFileDialog();
MapHandlerGen* importImageFromFile(const QString& fileName);
void importImageFromFileDialog();
private:
QAction* importAction;
QAction* importMeshAction;
QAction* importImageAction;
};
} // namespace SCHNApps
......@@ -41,4 +45,3 @@ private:
} // namespace CGoGN
#endif
......@@ -4,6 +4,7 @@
#include "mapHandler.h"
#include "Algo/Import/import.h"
#include "Algo/Tiling/Surface/square.h"
#include <QFileDialog>
#include <QFileInfo>
......@@ -19,13 +20,18 @@ bool Surface_Import_Plugin::enable()
// magic line that init static variables of GenericMap in the plugins
GenericMap::copyAllStatics(m_schnapps->getStaticPointers());
importAction = new QAction("import", this);
m_schnapps->addMenuAction(this, "Surface;Import", importAction);
connect(importAction, SIGNAL(triggered()), this, SLOT(importFromFileDialog()));
importMeshAction = new QAction("import mesh", this);
m_schnapps->addMenuAction(this, "Surface;Import Mesh", importMeshAction);
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;
}
MapHandlerGen* Surface_Import_Plugin::importFromFile(const QString& fileName)
MapHandlerGen* Surface_Import_Plugin::importMeshFromFile(const QString& fileName)
{
QFileInfo fi(fileName);
if(fi.exists())
......@@ -58,12 +64,72 @@ MapHandlerGen* Surface_Import_Plugin::importFromFile(const QString& fileName)
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();
while(it != fileNames.end()) {
importFromFile(*it);
while(it != fileNames.end())
{
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;
}
}
......
......@@ -14,40 +14,17 @@
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="9" column="0" rowspan="2" 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>
<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 row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Position :</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="combo_normalVBO">
<item row="0" column="1">
<widget class="QComboBox" name="combo_positionVBO">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
......@@ -59,19 +36,6 @@
</item>
</widget>
</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">
<widget class="QLabel" name="label_3">
<property name="text">
......@@ -79,57 +43,32 @@
</property>
</widget>
</item>
<item row="15" column="1">
<widget class="QRadioButton" name="radio_phongShading">
<property name="text">
<string>Phong</string>
</property>
<attribute name="buttonGroup">
<string notr="true">group_faceShading</string>
</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>
<item row="1" column="1">
<widget class="QComboBox" name="combo_normalVBO">
<property name="sizePolicy">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<item>
<property name="text">
<string>- select VBO -</string>
</property>
</item>
</widget>
</item>
<item row="15" column="0">
<widget class="QRadioButton" name="radio_flatShading">
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Flat</string>
</property>
<property name="checked">
<bool>true</bool>
<string>Color :</string>
</property>
<attribute name="buttonGroup">
<string notr="true">group_faceShading</string>
</attribute>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="combo_positionVBO">
<item row="2" column="1">
<widget class="QComboBox" name="combo_colorVBO">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
......@@ -141,10 +80,106 @@
</item>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="3" column="0" colspan="2">
<widget class="Line" name="line"/>
</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>
</property>
<property name="text">
<string>Color</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="7" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QCheckBox" name="check_renderFaces">
......@@ -156,6 +191,19 @@
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_2">
<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="dcolorButton">
<property name="sizePolicy">
......@@ -295,35 +343,48 @@
</item>
</layout>
</item>
<item row="3" column="0" rowspan="2" 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>
<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 row="8" column="0">
<widget class="QRadioButton" name="radio_flatShading">
<property name="text">
<string>Flat</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
<attribute name="buttonGroup">
<string notr="true">group_faceShading</string>
</attribute>
</widget>
</item>
<item row="8" column="1">
<widget class="QRadioButton" name="radio_phongShading">
<property name="text">
<string>Phong</string>
</property>
<attribute name="buttonGroup">
<string notr="true">group_faceShading</string>
</attribute>
</widget>
</item>
<item row="9" column="0" colspan="2">
<widget class="QCheckBox" name="check_renderBoundary">
<property name="text">
<string>render boundary</string>
</property>
</widget>
</item>
<item row="10" 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>
</layout>
</widget>
......
......@@ -6,6 +6,7 @@
#include "Utils/Shaders/shaderFlat.h"
#include "Utils/Shaders/shaderPhong.h"
#include "Utils/Shaders/shaderColorPerVertex.h"
#include "Utils/Shaders/shaderSimpleColor.h"