Commit d12298e1 authored by Sylvain Thery's avatar Sylvain Thery

Merge icube-forge.unistra.fr:cgogn/cgogn into develop

Conflicts:
	README.md
parents 744f4d3f 7114af20
...@@ -168,7 +168,8 @@ void MCMesh::updateRender() ...@@ -168,7 +168,8 @@ void MCMesh::updateRender()
void MCMesh::fromFile(char* fname) void MCMesh::fromFile(char* fname)
{ {
myImg = new SAlgo::MC::Image<DATATYPE>(); myImg = new SAlgo::MC::Image<DATATYPE>();
myImg->loadInrgz(fname); //myImg->loadInrgz(fname);
myImg->loadVox(fname);
CGoGNout << "Image chargee"<<CGoGNendl; CGoGNout << "Image chargee"<<CGoGNendl;
CGoGNout << myImg->getWidthX() <<"x"<< myImg->getWidthY() <<"x"<< myImg->getWidthZ() << "voxels"<<CGoGNendl; CGoGNout << myImg->getWidthX() <<"x"<< myImg->getWidthY() <<"x"<< myImg->getWidthZ() << "voxels"<<CGoGNendl;
} }
......
...@@ -31,7 +31,7 @@ Viewer::Viewer() : ...@@ -31,7 +31,7 @@ Viewer::Viewer() :
m_drawFaces(true), m_drawFaces(true),
m_drawNormals(false), m_drawNormals(false),
m_drawTopo(false), m_drawTopo(false),
m_drawBoundaryTopo(true), m_drawBoundaryTopo(false),
m_render(NULL), m_render(NULL),
m_phongShader(NULL), m_phongShader(NULL),
m_flatShader(NULL), m_flatShader(NULL),
...@@ -87,7 +87,7 @@ void Viewer::cb_initGL() ...@@ -87,7 +87,7 @@ void Viewer::cb_initGL()
m_render = new Algo::Render::GL2::MapRender() ; m_render = new Algo::Render::GL2::MapRender() ;
m_topoRender = new Algo::Render::GL2::TopoRender() ; m_topoRender = new Algo::Render::GL2::TopoRender() ;
m_topoRender->setInitialDartsColor(0.25f, 0.25f, 0.25f) ; m_topoRender->setInitialDartsColor(1.0f, 1.00f, 1.00f) ;
m_positionVBO = new Utils::VBO() ; m_positionVBO = new Utils::VBO() ;
m_normalVBO = new Utils::VBO() ; m_normalVBO = new Utils::VBO() ;
...@@ -552,11 +552,14 @@ void Viewer::importMesh(std::string& filename) ...@@ -552,11 +552,14 @@ void Viewer::importMesh(std::string& filename)
// myMap.enableQuickTraversal<VERTEX>() ; // myMap.enableQuickTraversal<VERTEX>() ;
std::cout << "The mesh is " << (myMap.isOpen() ? "open" : "closed") << std::endl;
m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::POINTS) ; m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::POINTS) ;
m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::LINES) ; m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::LINES) ;
m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::TRIANGLES) ; m_render->initPrimitives<PFP>(myMap, Algo::Render::GL2::TRIANGLES) ;
m_topoRender->updateData<PFP>(myMap, position, 0.85f, 0.85f, m_drawBoundaryTopo) ; m_topoRender->updateData<PFP>(myMap, position, 0.85f, 0.85f, m_drawBoundaryTopo, true) ;
bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position) ; bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position) ;
normalBaseSize = bb.diagSize() / 100.0f ; normalBaseSize = bb.diagSize() / 100.0f ;
......
...@@ -29,8 +29,10 @@ ...@@ -29,8 +29,10 @@
#include "Algo/Modelisation/polyhedron.h" #include "Algo/Modelisation/polyhedron.h"
#include "Algo/Import/import.h" #include "Algo/Import/import.h"
#include "Algo/Geometry/volume.h" #include "Algo/Geometry/volume.h"
#include "Algo/Modelisation/tetrahedralization.h"
#include "Algo/Geometry/area.h" #include "Algo/Geometry/area.h"
#include "Utils/chrono.h" #include "Utils/chrono.h"
#include "Algo/Export/exportVol.h" #include "Algo/Export/exportVol.h"
...@@ -172,12 +174,14 @@ void MyQT::cb_Open() ...@@ -172,12 +174,14 @@ void MyQT::cb_Open()
for (Dart d = tra.begin(); d != tra.end(); d = tra.next()) for (Dart d = tra.begin(); d != tra.end(); d = tra.next())
{ {
// float v = Algo::Geometry::tetrahedronVolume<PFP>(myMap, d, position); // float v = Algo::Geometry::tetrahedronVolume<PFP>(myMap, d, position);
color[d] = PFP::VEC3(1.0,0,0);
// color[d] = VEC3(v,0,0); // color[d] = VEC3(v,0,0);
// if (v>maxV) // if (v>maxV)
// maxV=v; // maxV=v;
if(myMap.isVolumeIncidentToBoundary(d)) if(myMap.isVolumeIncidentToBoundary(d))
color[d] = VEC3(0,0,0); color[d] = VEC3(1,0.41,0.706);
} }
// for (unsigned int i = color.begin(); i != color.end(); color.next(i)) // for (unsigned int i = color.begin(); i != color.end(); color.next(i))
// { // {
...@@ -399,7 +403,7 @@ int main(int argc, char **argv) ...@@ -399,7 +403,7 @@ int main(int argc, char **argv)
{ {
*/ */
if(extension == std::string(".map")) if(extension == std::string(".mapbin"))
{ {
myMap.loadMapBin(filename); myMap.loadMapBin(filename);
position = myMap.getAttribute<VEC3, VERTEX,MAP>("position") ; position = myMap.getAttribute<VEC3, VERTEX,MAP>("position") ;
...@@ -421,6 +425,17 @@ int main(int argc, char **argv) ...@@ -421,6 +425,17 @@ int main(int argc, char **argv)
float maxV = 0.0f; float maxV = 0.0f;
for (Dart d = tra.begin(); d != tra.end(); d = tra.next()) for (Dart d = tra.begin(); d != tra.end(); d = tra.next())
{ {
// float v = Algo::Geometry::tetrahedronVolume<PFP>(myMap, d, position);
color[d] = PFP::VEC3(1.0,0,0);
// if (v>maxV)
// maxV=v;
if(myMap.isVolumeIncidentToBoundary(d))
color[d] = PFP::VEC3(1,0.41,0.706);
//else
// color[d] = PFP::VEC3(1.0,0,0);
/*
float v = Algo::Geometry::tetrahedronVolume<PFP>(myMap, d, position); float v = Algo::Geometry::tetrahedronVolume<PFP>(myMap, d, position);
color[d] = VEC3(v,0,0); color[d] = VEC3(v,0,0);
if (v>maxV) if (v>maxV)
...@@ -435,6 +450,7 @@ int main(int argc, char **argv) ...@@ -435,6 +450,7 @@ int main(int argc, char **argv)
{ {
color[i][0] /= maxV; color[i][0] /= maxV;
color[i][2] = 1.0f - color[i][0]; color[i][2] = 1.0f - color[i][0];
*/
} }
} }
...@@ -460,6 +476,9 @@ int main(int argc, char **argv) ...@@ -460,6 +476,9 @@ int main(int argc, char **argv)
// Algo::Volume::Export::exportNAS<PFP>(myMap,position,"/tmp/test1.nas"); // Algo::Volume::Export::exportNAS<PFP>(myMap,position,"/tmp/test1.nas");
// Algo::Volume::Export::exportVTU<PFP>(myMap,position,"/tmp/test3.vtu"); // Algo::Volume::Export::exportVTU<PFP>(myMap,position,"/tmp/test3.vtu");
} }
myMap.check();
// un peu d'interface // un peu d'interface
QApplication app(argc, argv); QApplication app(argc, argv);
MyQT sqt; MyQT sqt;
......
...@@ -157,6 +157,17 @@ void MyQT::operation(int x) ...@@ -157,6 +157,17 @@ void MyQT::operation(int x)
m_selected2=NIL; m_selected2=NIL;
} }
break; break;
case 10:
CGoGNout <<"split surface"<<CGoGNendl;
if (!m_selecteds.empty())
{
myMap.splitSurface(m_selecteds);
updateMap();
m_selected=NIL;
m_selected2=NIL;
m_selecteds.clear();
}
break;
default: default:
break; break;
...@@ -233,7 +244,15 @@ void MyQT::cb_redraw() ...@@ -233,7 +244,15 @@ void MyQT::cb_redraw()
m_render_topo->overdrawDart(myMap, m_selected, 11, 1.0f, 0.0f, 0.0f); m_render_topo->overdrawDart(myMap, m_selected, 11, 1.0f, 0.0f, 0.0f);
if (m_selected2 != NIL) if (m_selected2 != NIL)
if(!m_selecteds.empty())
{
for(std::vector<Dart>::iterator it = m_selecteds.begin() ; it != m_selecteds.end() ; ++it)
m_render_topo->overdrawDart(myMap, *it, 11, 0.0f, 0.0f, 1.0f);
}
m_render_topo->overdrawDart(myMap, m_selected2, 11, 0.0f, 1.0f, 0.0f); m_render_topo->overdrawDart(myMap, m_selected2, 11, 0.0f, 1.0f, 0.0f);
} }
void MyQT::cb_mousePress(int button, int x, int y) void MyQT::cb_mousePress(int button, int x, int y)
...@@ -253,6 +272,17 @@ void MyQT::cb_mousePress(int button, int x, int y) ...@@ -253,6 +272,17 @@ void MyQT::cb_mousePress(int button, int x, int y)
} }
updateGL(); updateGL();
} }
if(Control())
{
Dart d = m_render_topo->picking(myMap, x,y); // nb
if (button == Qt::LeftButton)
{
if (d == Dart::nil())
m_selecteds.clear();
else
m_selecteds.push_back(d);
}
}
} }
void MyQT::cb_keyPress(int keycode) void MyQT::cb_keyPress(int keycode)
......
...@@ -93,6 +93,7 @@ protected: ...@@ -93,6 +93,7 @@ protected:
#endif #endif
Dart m_selected; Dart m_selected;
Dart m_selected2; Dart m_selected2;
std::vector<Dart> m_selecteds;
DartMarker<MAP> dm; DartMarker<MAP> dm;
float m_shift; float m_shift;
......
...@@ -36,7 +36,16 @@ ...@@ -36,7 +36,16 @@
</size> </size>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<property name="margin"> <property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number> <number>2</number>
</property> </property>
<property name="spacing"> <property name="spacing">
...@@ -99,6 +108,11 @@ ...@@ -99,6 +108,11 @@
<string>deleteFace</string> <string>deleteFace</string>
</property> </property>
</item> </item>
<item>
<property name="text">
<string>splitSurface</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item> <item>
......
...@@ -245,6 +245,24 @@ void MyQT::operation(int x) ...@@ -245,6 +245,24 @@ void MyQT::operation(int x)
updateMap(); updateMap();
} }
break; break;
case 13 :
CGoGNout <<"split volume"<<CGoGNendl;
if (!m_selecteds.empty())
{
myMap.splitVolume(m_selecteds);
m_selecteds.clear();
updateMap();
}
break;
case 14 :
CGoGNout <<"cut volume"<<CGoGNendl;
if (!m_selecteds.empty())
{
myMap.cutVolume(m_selecteds);
m_selecteds.clear();
updateMap();
}
break;
default: default:
break; break;
} }
...@@ -459,12 +477,12 @@ void MyQT::cb_mousePress(int button, int x, int y) ...@@ -459,12 +477,12 @@ void MyQT::cb_mousePress(int button, int x, int y)
{ {
if (button == Qt::LeftButton) if (button == Qt::LeftButton)
{ {
Dart d = m_render_topo_boundary->picking(myMap, x,y,true); m_selecteds.push_back(Dart(173));
if (d != Dart::nil()) m_selecteds.push_back(Dart(186));
{ m_selecteds.push_back(Dart(185));
Dart e = myMap.phi2(d); m_selecteds.push_back(Dart(171));
std::cout << "Dart "<< d.index << " / phi2:" << e.index << std::endl; m_selecteds.push_back(Dart(170));
} m_selecteds.push_back(Dart(174));
} }
if (button == Qt::RightButton) if (button == Qt::RightButton)
{ {
...@@ -472,8 +490,6 @@ void MyQT::cb_mousePress(int button, int x, int y) ...@@ -472,8 +490,6 @@ void MyQT::cb_mousePress(int button, int x, int y)
if (d != Dart::nil()) if (d != Dart::nil())
{ {
m_selecteds.push_back(d); m_selecteds.push_back(d);
Dart e = myMap.phi2(d);
std::cout << "Dart "<< d.index << " / phi2:" << e.index << std::endl;
} }
} }
...@@ -836,7 +852,7 @@ void MyQT::importMesh(std::string& filename) ...@@ -836,7 +852,7 @@ void MyQT::importMesh(std::string& filename)
std::cerr << "could not import " << filename << std::endl ; std::cerr << "could not import " << filename << std::endl ;
return ; return ;
} }
else else
position = myMap.getAttribute<VEC3, VERTEX, MAP>(attrNames[0]) ; position = myMap.getAttribute<VEC3, VERTEX, MAP>(attrNames[0]) ;
m_selected = NIL; m_selected = NIL;
......
...@@ -155,6 +155,16 @@ ...@@ -155,6 +155,16 @@
<string>deleteVolume</string> <string>deleteVolume</string>
</property> </property>
</item> </item>
<item>
<property name="text">
<string>splitVolume</string>
</property>
</item>
<item>
<property name="text">
<string>cutVolume</string>
</property>
</item>
</widget> </widget>
</item> </item>
<item row="6" column="0"> <item row="6" column="0">
......
...@@ -135,7 +135,7 @@ SET (CGoGN_EXT_INCLUDES ...@@ -135,7 +135,7 @@ SET (CGoGN_EXT_INCLUDES
# define libs for external libs # define libs for external libs
SET (CGoGN_EXT_LIBS SET (CGoGN_EXT_LIBS
nl nl
${OPENGL_LIBRARY} ${OPENGL_LIBRARY}
${GLEW_LIBRARIES} ${GLEW_LIBRARIES}
${ZLIB_LIBRARIES} ${ZLIB_LIBRARIES}
......
French version bellow
Linux dependencies Linux dependencies
================== ==================
install the following packages: install the following packages:
cmake cmake-curses-gui cmake-qt-gui libXi-dev libXmu-dev libglew-dev libboost-all-dev zlib1g-dev libqt4-dev qt4-dev-tools uuid-dev libgsl0-dev libsuitesparse-dev libqglviewer-dev cmake cmake-curses-gui cmake-qt-gui libXi-dev libXmu-dev libglew-dev zlib1g-dev libqt4-dev qt4-dev-tools uuid-dev libgsl0-dev libsuitesparse-dev libqglviewer-dev
Mac Dependencies Mac Dependencies
================= =================
...@@ -13,7 +12,7 @@ To compile CGoGN on MAC ...@@ -13,7 +12,7 @@ To compile CGoGN on MAC
* install Qt4 (4.8) and QtCreator * install Qt4 (4.8) and QtCreator
* install (or build) libQGLViewer * install (or build) libQGLViewer
* install cmake (native or with homebrew) * install cmake (native or with homebrew)
* install with homebrew : lzlib, glew, boost, suite-sparse * install with homebrew : lzlib, glew, suite-sparse
To install suite-sparse package, you must first To install suite-sparse package, you must first
add the homebrew/science repository with the following command : add the homebrew/science repository with the following command :
...@@ -70,6 +69,7 @@ To compile CGoGN ...@@ -70,6 +69,7 @@ To compile CGoGN
* WITH_QT -> to minimize dependencies and compilation time * WITH_QT -> to minimize dependencies and compilation time
* WITH_GLEWMX -> to use GLEWMX (for VRJuggler users) * WITH_GLEWMX -> to use GLEWMX (for VRJuggler users)
* we can then compile SCHNApps and the provided plugins : * we can then compile SCHNApps and the provided plugins :
``` ```
...@@ -91,102 +91,3 @@ Binaries are generated in bin/Release and bin/Debug ...@@ -91,102 +91,3 @@ Binaries are generated in bin/Release and bin/Debug
Examples of data (trianbgz, off, etc.. files) are available at the following address: Examples of data (trianbgz, off, etc.. files) are available at the following address:
https://iggservis.u-strasbg.fr/Data/data.zip https://iggservis.u-strasbg.fr/Data/data.zip
FRENCH VERSION
==============
Dpendences Linux
=================
installer les paquets suivants:
cmake cmake-curses-gui cmake-qt-gui libXi-dev libXmu-dev libglew-dev libboost-all-dev zlib1g-dev libqt4-dev qt4-dev-tools uuid-dev libgsl0-dev libsuitesparse-dev libqglviewer-dev
Mac Dependencies
=================
To compile CGoGN on MAC
* installer XCode et les command line tools.
* installer Qt4 (4.8) et QtCreator
* installer (ou compiler) libQGLViewer
* installer cmake (native ou avec homebrew)
* installer with avec homebrew : lzlib, glew, boost, suite-sparse
Pour pouvoir installer le paquet suite-sparse, il faut avoir
prlablement ajout le dpt homebrew/science grce la commande suivante :
brew tap homebrew/science
Pour le reste la compilation se passe de la meme manire
Pour compiler CGoGN
===================
* on compile tout d'abord les bibliothques third-party :
```
cd CGoGN/ThirdParty/build
cmake ..
make (-j x si vous avez x cores)
make install
```
La mme chose en debug:
```
cd ../buildDebug
cmake ..
make (-j x si vous avez x cores)
make install
```
On peut fixer certaines option pour ne pas tout compiler:
* WITH_ASSIMP -> compile et utilise la librairie Assimp
* WITH_ZINRI -> compile et utilise la librairie Zinri
* WITH_PYTHONQT -> pour SCHNApps
* ensuite on compile CGoGN :
```
cd CGoGN/build
cmake ..
make (-j x si vous avez x cores)
```
Et en Debug avec:
```
cd ../buildDebug
cmake ..
make (-j x si vous avez x cores)
```
Certaines options sont disponibles :
* BUILD_SHARED_LIBS -Q experimental !
* ONELIB -> compilation en une seule lib (libcgogn.a) au lieu de 4
* WITH_ASSIMP -> utilise Assimp (auto set par third party compil)
* WITH_ZINRI -> utilise Zinri (auto set par third party compil)
* WITH_QT -> minimize les dependence si pas besoin de Qt (VRJuggler)
* WITH_GLEWMX -> pour utiliser GLEWMX a la place de GELW (pour VRJuggler)
Les librairies sont generees dans lib/Release et lib/Debug
Les binaires sont generes dans bin/Release et bin/Debug
* on peut ensuite compiler SCHNApps ainsi que les plugins fournis :
```
cd CGoGN/SCHNApps/build
cmake ..
make (-j x si vous avez x cores)
```
Et en Debug avec:
```
cd ../buildDebug
cmake ..
make (-j x si vous avez x cores)
```
Des exemples de donnes (fichiers trianbgz, off, etc..) sont accessible l'adresse suivante:
https://iggservis.u-strasbg.fr/Data/data.zip
...@@ -11,6 +11,9 @@ ADD_SUBDIRECTORY(surface_selection) ...@@ -11,6 +11,9 @@ ADD_SUBDIRECTORY(surface_selection)
ADD_SUBDIRECTORY(surface_deformation) ADD_SUBDIRECTORY(surface_deformation)
ADD_SUBDIRECTORY(surface_modelisation) ADD_SUBDIRECTORY(surface_modelisation)
#ADD_SUBDIRECTORY(surface_tilings) #ADD_SUBDIRECTORY(surface_tilings)
ADD_SUBDIRECTORY(surface_distance)
ADD_SUBDIRECTORY(volume_import) ADD_SUBDIRECTORY(volume_import)
#ADD_SUBDIRECTORY(volume_render) #ADD_SUBDIRECTORY(volume_render)
ADD_SUBDIRECTORY(volumetric)
cmake_minimum_required(VERSION 2.8)
SET( PLUGIN_NAME Surface_Distance )
SET( PLUGIN_ROOT_DIR ${SCHNApps_ROOT_DIR}/Plugins/surface_distance )
INCLUDE_DIRECTORIES(
${PLUGIN_ROOT_DIR}/include
${CMAKE_CURRENT_BINARY_DIR}
)
file(
GLOB_RECURSE
PLUGIN_FILES
${PLUGIN_ROOT_DIR}/src/*.cpp
${PLUGIN_ROOT_DIR}/include/*.h
${PLUGIN_ROOT_DIR}/include/*.hpp
)
file(
GLOB_RECURSE
PLUGIN_UI_FILES
${PLUGIN_ROOT_DIR}/forms/*.ui
)
SET(
PLUGIN_QOBJECT_FILES
${PLUGIN_ROOT_DIR}/include/surface_distance.h
${PLUGIN_ROOT_DIR}/include/dialog_computeDistance.h
)
include( ${SCHNApps_ROOT_DIR}/Plugins/plugins_cmake.txt )
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog_ComputeDistance</class>
<widget class="QDialog" name="Dialog_ComputeDistance">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>607</width>
<height>359</height>
</rect>
</property>
<property name="windowTitle">
<string>Compute Distance</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_8">
<item>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QListWidget" name="list_maps_1"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Position attribute :</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="combo_positionAttribute_1">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Distance attribute</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Existing attribute :</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="combo_distanceAttribute_1">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>New attribute :</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="distanceAttributeName_1"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QListWidget" name="list_maps_2"/>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Position attribute :</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="combo_positionAttribute_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>