Commit c27d2145 authored by untereiner's avatar untereiner

some changes (see another time what)

parent df531a08
...@@ -30,87 +30,120 @@ ...@@ -30,87 +30,120 @@
SimpleGMap3::SimpleGMap3() SimpleGMap3::SimpleGMap3()
{ {
position = myMap.addAttribute<VEC3, VERTEX>("position"); position = myMap.addAttribute<VEC3, VERTEX>("position");
normal = myMap.addAttribute<VEC3, VERTEX>("normal"); volume = myMap.addAttribute<VEC3, VOLUME>("volume");
volume = myMap.addAttribute<VEC3, VOLUME>("volume");
CellMarker<EDGE> mE(myMap); // CellMarker<EDGE> mE(myMap);
Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap,position); Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap,position);
Dart d = primCat.hexaGrid_topo(3,1,1); Dart d = primCat.hexaGrid_topo(1,1,1);
primCat.embedHexaGrid(2,1,1); primCat.embedHexaGrid(1,1,1);
myMap.check(); myMap.check();
Geom::Plane3D<PFP::REAL> pl(VEC3(-1,-0.5,-0.5),VEC3(-1,-0.5,0.5),VEC3(1,0.5,0.5)); Dart dp = Algo::Surface::Modelisation::createQuadrangularPyramid<PFP>(myMap);
Algo::Volume::Modelisation::sliceConvexVolume<PFP>(myMap, position, d, pl);
myMap.check(); position[dp] = typename PFP::VEC3(0.5,0.5,-0.5);
position[myMap.phi1(dp)] = typename PFP::VEC3(0.5,0.5,0.5);
position[myMap.phi1(myMap.phi1(dp))] = typename PFP::VEC3(0.5,-0.5,0.5);
position[myMap.phi_1(dp)] = typename PFP::VEC3(0.5,-0.5,-0.5);
position[myMap.phi_1(myMap.phi2(dp))] = typename PFP::VEC3(1.5f, 0.0f, 0.0f);
for(unsigned int i = position.begin() ; i != position.end() ; position.next(i)) Dart dtemp = myMap.beta1(myMap.beta0(myMap.beta1(myMap.beta2(myMap.beta1(myMap.beta0(myMap.beta1(myMap.beta2(d))))))));
position[i] += VEC3(2,0,0);
Algo::Volume::Modelisation::Primitive3D<PFP> prim(myMap, position); myMap.sewVolumes(dtemp,dp);
d = prim.hexaGrid_topo(2,2,1);
prim.embedHexaGrid(1,1,1);
Dart d1 = myMap.phi1(myMap.phi1(myMap.phi2(myMap.phi1(myMap.phi1(d))))); // Geom::Plane3D<PFP::REAL> pl(VEC3(-1,-0.5,-0.5),VEC3(-1,-0.5,0.5),VEC3(1,0.5,0.5));
VEC3 mid0 = (position[d1] + position[myMap.phi1(d1)]) / 2.0f; // Algo::Volume::Modelisation::sliceConvexVolume<PFP>(myMap, position, d, pl);
myMap.cutEdge(d1);
position[myMap.phi1(d1)] = mid0;
VEC3 mid1 = (position[d] + position[myMap.phi1(d)]) / 2.0f; // myMap.check();
myMap.cutEdge(d);
position[myMap.phi1(d)] = mid1;
d = myMap.phi1(myMap.phi1(myMap.phi2(myMap.phi1(myMap.phi1(d))))); // for(unsigned int i = position.begin() ; i != position.end() ; position.next(i))
VEC3 mid = (position[d] + position[myMap.phi1(d)]) / 2.0f; // position[i] += VEC3(2,0,0);
myMap.cutEdge(d);
position[myMap.phi1(d)] = mid;
myMap.splitFace(d,myMap.phi1(myMap.phi1(myMap.phi1(d)))); // Algo::Volume::Modelisation::Primitive3D<PFP> prim(myMap, position);
// d = prim.hexaGrid_topo(2,2,1);
// prim.embedHexaGrid(1,1,1);
myMap.check(); // Dart d1 = myMap.phi1(myMap.phi1(myMap.phi2(myMap.phi1(myMap.phi1(d)))));
// VEC3 mid0 = (position[d1] + position[myMap.phi1(d1)]) / 2.0f;
// myMap.cutEdge(d1);
// position[myMap.phi1(d1)] = mid0;
for(unsigned int i = position.begin() ; i != position.end() ; position.next(i)) // VEC3 mid1 = (position[d] + position[myMap.phi1(d)]) / 2.0f;
position[i] += VEC3(0,2,0); // myMap.cutEdge(d);
// position[myMap.phi1(d)] = mid1;
Algo::Volume::Modelisation::Primitive3D<PFP> prim2(myMap,position); // d = myMap.phi1(myMap.phi1(myMap.phi2(myMap.phi1(myMap.phi1(d)))));
d = prim2.hexaGrid_topo(2,1,1); // VEC3 mid = (position[d] + position[myMap.phi1(d)]) / 2.0f;
prim2.embedHexaGrid(1,1,1); // myMap.cutEdge(d);
// position[myMap.phi1(d)] = mid;
d = myMap.phi2(myMap.phi1(myMap.phi1(myMap.phi2(d)))); // myMap.splitFace(d,myMap.phi1(myMap.phi1(myMap.phi1(d))));
myMap.unsewVolumes(d);
myMap.check(); // myMap.check();
// for(unsigned int i = position.begin() ; i != position.end() ; position.next(i))
// position[i] += VEC3(0,2,0);
// Algo::Volume::Modelisation::Primitive3D<PFP> prim2(myMap,position);
// d = prim2.hexaGrid_topo(2,1,1);
// prim2.embedHexaGrid(1,1,1);
// d = myMap.phi2(myMap.phi1(myMap.phi1(myMap.phi2(d))));
// myMap.unsewVolumes(d);
// myMap.check();
} }
void SimpleGMap3::initGUI() void SimpleGMap3::initGUI()
{ {
} }
void SimpleGMap3::cb_keyPress(int code)
{
switch(code)
{
case 'e':
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,".%F.%H:%M:%S",timeinfo);
std::string filename = std::string("topo_screenshot") + std::string(buffer) + std::string(".svg");
m_render_topo->svgout2D(filename, modelViewMatrix(), projectionMatrix());
break;
}
}
}
void SimpleGMap3::cb_initGL() void SimpleGMap3::cb_initGL()
{ {
Utils::GLSLShader::setCurrentOGLVersion(2) ; Utils::GLSLShader::setCurrentOGLVersion(2) ;
Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position) ; Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position) ;
VEC3 gPosObj = bb.center() ; VEC3 gPosObj = bb.center() ;
float tailleX = bb.size(0) ; float tailleX = bb.size(0) ;
float tailleY = bb.size(1) ; float tailleY = bb.size(1) ;
float tailleZ = bb.size(2) ; float tailleZ = bb.size(2) ;
float gWidthObj = std::max<float>(std::max<float>(tailleX, tailleY), tailleZ) ; float gWidthObj = std::max<float>(std::max<float>(tailleX, tailleY), tailleZ) ;
setParamObject(gWidthObj, gPosObj.data()); setParamObject(gWidthObj, gPosObj.data());
m_render_topo = new Algo::Render::GL2::Topo3Render(); m_render_topo = new Algo::Render::GL2::Topo3Render();
m_render_topo->setDartWidth(2.0f); m_render_topo->setDartWidth(2.0f);
m_render_topo->setInitialDartsColor(1.0f,1.0f,1.0f); m_render_topo->setInitialDartsColor(1.0f,1.0f,1.0f);
m_render_topo->updateData<PFP>(myMap, position, 0.9f,0.9f,0.9f); m_render_topo->updateData<PFP>(myMap, position, 0.9f,0.9f,0.8f);
} }
void SimpleGMap3::cb_redraw() void SimpleGMap3::cb_redraw()
{ {
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glLineWidth(1.0f); glLineWidth(1.0f);
m_render_topo->drawTopo(); m_render_topo->drawTopo();
} }
/********************************************************************************************** /**********************************************************************************************
...@@ -119,13 +152,13 @@ void SimpleGMap3::cb_redraw() ...@@ -119,13 +152,13 @@ void SimpleGMap3::cb_redraw()
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
QApplication app(argc, argv) ; QApplication app(argc, argv) ;
SimpleGMap3 sqt ; SimpleGMap3 sqt ;
sqt.setGeometry(0, 0, 1000, 800) ; sqt.setGeometry(0, 0, 1000, 800) ;
sqt.show() ; sqt.show() ;
sqt.initGUI() ; sqt.initGUI() ;
return app.exec() ; return app.exec() ;
} }
...@@ -53,7 +53,6 @@ public: ...@@ -53,7 +53,6 @@ public:
MAP myMap ; MAP myMap ;
VertexAttribute<VEC3> position ; VertexAttribute<VEC3> position ;
VertexAttribute<VEC3> normal ;
VolumeAttribute<VEC3> volume ; VolumeAttribute<VEC3> volume ;
Algo::Render::GL2::Topo3Render* m_render_topo; Algo::Render::GL2::Topo3Render* m_render_topo;
...@@ -64,4 +63,5 @@ public: ...@@ -64,4 +63,5 @@ public:
void cb_initGL() ; void cb_initGL() ;
void cb_redraw() ; void cb_redraw() ;
void cb_keyPress(int c);
}; };
...@@ -32,44 +32,62 @@ SimpleMap3::SimpleMap3() ...@@ -32,44 +32,62 @@ SimpleMap3::SimpleMap3()
{ {
position = myMap.addAttribute<VEC3, VERTEX>("position"); position = myMap.addAttribute<VEC3, VERTEX>("position");
Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap, position); Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap,position);
Dart d = primCat.hexaGrid_topo(2,1,1); Dart d = primCat.hexaGrid_topo(1,1,1);
primCat.embedHexaGrid(1,1,1); primCat.embedHexaGrid(1,1,1);
myMap.closeMap(); myMap.closeMap();
myMap.check();
unsigned int nb=0; Dart dp = Algo::Surface::Modelisation::createQuadrangularPyramid<PFP>(myMap);
for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
nb++;
std::cout << "Nb vertices (equals 12) : " << nb << std::endl; position[dp] = typename PFP::VEC3(0.5,0.5,-0.5);
assert(nb==12); position[myMap.phi1(dp)] = typename PFP::VEC3(0.5,0.5,0.5);
position[myMap.phi1(myMap.phi1(dp))] = typename PFP::VEC3(0.5,-0.5,0.5);
position[myMap.phi_1(dp)] = typename PFP::VEC3(0.5,-0.5,-0.5);
position[myMap.phi_1(myMap.phi2(dp))] = typename PFP::VEC3(1.5f, 0.0f, 0.0f);
Dart dtemp = myMap.phi_1(myMap.phi2(myMap.phi_1(myMap.phi_1(myMap.phi2(d)))));
d = myMap.phi2(myMap.phi1(myMap.phi1(myMap.phi2(d)))); myMap.sewVolumes(dtemp,dp);
Dart dd = myMap.phi3(d); // Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap, position);
// Dart d = primCat.hexaGrid_topo(2,1,1);
// primCat.embedHexaGrid(1,1,1);
// myMap.closeMap();
myMap.unsewVolumes(d); // unsigned int nb=0;
// for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
// nb++;
myMap.check(); // std::cout << "Nb vertices (equals 12) : " << nb << std::endl;
// assert(nb==12);
nb=0;
for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
nb++;
std::cout << "Nb vertices after unsew (equals 16) : " << nb << std::endl; // d = myMap.phi2(myMap.phi1(myMap.phi1(myMap.phi2(d))));
assert(nb==16);
myMap.sewVolumes(d,dd); // Dart dd = myMap.phi3(d);
myMap.check(); // myMap.unsewVolumes(d);
nb=0; // myMap.check();
for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
nb++;
std::cout << "Nb vertices after resew (equals 12) : " << nb << std::endl; // nb=0;
assert(nb==12); // for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
// nb++;
// std::cout << "Nb vertices after unsew (equals 16) : " << nb << std::endl;
// assert(nb==16);
// myMap.sewVolumes(d,dd);
// myMap.check();
// nb=0;
// for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
// nb++;
// std::cout << "Nb vertices after resew (equals 12) : " << nb << std::endl;
// assert(nb==12);
} }
...@@ -92,22 +110,64 @@ void SimpleMap3::cb_initGL() ...@@ -92,22 +110,64 @@ void SimpleMap3::cb_initGL()
m_render_topo = new Algo::Render::GL2::Topo3Render(); m_render_topo = new Algo::Render::GL2::Topo3Render();
m_render_topo->setDartWidth(2.0f); m_render_topo->setDartWidth(2.0f);
m_render_topo->setInitialDartsColor(1.0f,1.0f,1.0f); m_render_topo->setInitialDartsColor(1.0f,1.0f,1.0f);
m_render_topo->updateData<PFP>(myMap, position, 0.9f,0.9f,0.9f); m_render_topo->updateData<PFP>(myMap, position, 0.9f,0.9f,0.8f);
m_render_topo_boundary = new Algo::Render::GL2::TopoRender(); m_render_topo_boundary = new Algo::Render::GL2::TopoRender();
m_render_topo_boundary->setDartWidth(2.0f); m_render_topo_boundary->setDartWidth(2.0f);
m_render_topo_boundary->setInitialDartsColor(0.4f,0.8f,0.4f); m_render_topo_boundary->setInitialDartsColor(0.4f,0.8f,0.4f);
m_render_topo_boundary->updateDataBoundary<PFP>(myMap, position, 0.9f,0.9f,bb.maxSize()/50.0f); m_render_topo_boundary->updateDataBoundary<PFP>(myMap, position, 0.9f,0.9f,bb.maxSize()/50.0f);
m_render_topo_primal = new Algo::Render::GL2::Topo3PrimalRender();
m_render_topo_primal->setDartWidth(2.0f);
m_render_topo_primal->setInitialDartsColor(1.0f,1.0f,1.0f);
m_render_topo_primal->updateData<PFP>(myMap, position, 0.95f,0.85f);
} }
void SimpleMap3::cb_keyPress(int code)
{
switch(code)
{
case 'e':
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,".%F.%H:%M:%S",timeinfo);
std::string filename = std::string("topo_screenshot") + std::string(buffer) + std::string(".svg");
m_render_topo->svgout2D(filename, modelViewMatrix(), projectionMatrix());
break;
}
case 'E':
{
time_t rawtime;
struct tm * timeinfo;
char buffer[80];
time (&rawtime);
timeinfo = localtime (&rawtime);
strftime (buffer,80,".%F.%H:%M:%S",timeinfo);
std::string filename = std::string("topo_screenshot") + std::string(buffer) + std::string(".svg");
m_render_topo_primal->svgout2D(filename, modelViewMatrix(), projectionMatrix());
break;
}
}
}
void SimpleMap3::cb_redraw() void SimpleMap3::cb_redraw()
{ {
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glLineWidth(1.0f); glLineWidth(1.0f);
m_render_topo->drawTopo(); m_render_topo->drawTopo();
m_render_topo_boundary->drawTopo(); //m_render_topo_boundary->drawTopo();
//m_render_topo_primal->drawTopo();
} }
/********************************************************************************************** /**********************************************************************************************
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include "Geometry/vector_gen.h" #include "Geometry/vector_gen.h"
#include "Algo/Render/GL2/topo3Render.h" #include "Algo/Render/GL2/topo3Render.h"
#include "Algo/Render/GL2/topo3PrimalRender.h"
#include "Algo/Render/GL2/topoRender.h" #include "Algo/Render/GL2/topoRender.h"
using namespace CGoGN ; using namespace CGoGN ;
...@@ -58,6 +59,7 @@ public: ...@@ -58,6 +59,7 @@ public:
Algo::Render::GL2::Topo3Render* m_render_topo; Algo::Render::GL2::Topo3Render* m_render_topo;
Algo::Render::GL2::TopoRender* m_render_topo_boundary; Algo::Render::GL2::TopoRender* m_render_topo_boundary;
Algo::Render::GL2::Topo3PrimalRender* m_render_topo_primal;
SimpleMap3() ; SimpleMap3() ;
...@@ -65,5 +67,6 @@ public: ...@@ -65,5 +67,6 @@ public:
void cb_initGL() ; void cb_initGL() ;
void cb_redraw() ; void cb_redraw() ;
void cb_keyPress(int code);
}; };
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#define __IMPLICIT_HIERARCHICAL_MAP3__ #define __IMPLICIT_HIERARCHICAL_MAP3__
#include "Topology/map/embeddedMap3.h" #include "Topology/map/embeddedMap3.h"
#include "Algo/Multiresolution/filter.h"
namespace CGoGN namespace CGoGN
{ {
...@@ -64,6 +65,9 @@ public: ...@@ -64,6 +65,9 @@ public:
AttributeMultiVector<unsigned int>* m_nextLevelCell[NB_ORBITS] ; AttributeMultiVector<unsigned int>* m_nextLevelCell[NB_ORBITS] ;
std::vector<Algo::MR::Filter*> synthesisFilters ;
std::vector<Algo::MR::Filter*> analysisFilters ;
public: public:
ImplicitHierarchicalMap3() ; ImplicitHierarchicalMap3() ;
...@@ -153,6 +157,19 @@ public: ...@@ -153,6 +157,19 @@ public:
*/ */
void swapEdges(Dart d, Dart e); void swapEdges(Dart d, Dart e);
void addSynthesisFilter(Algo::MR::Filter* f) { synthesisFilters.push_back(f) ; }
void addAnalysisFilter(Algo::MR::Filter* f) { analysisFilters.push_back(f) ; }
void clearSynthesisFilters() { synthesisFilters.clear() ; }
void clearAnalysisFilters() { analysisFilters.clear() ; }
void analysis() ;
void synthesis() ;
//! //!
/*! /*!
* *
......
...@@ -655,6 +655,36 @@ inline bool ImplicitHierarchicalMap3::isWellEmbedded() ...@@ -655,6 +655,36 @@ inline bool ImplicitHierarchicalMap3::isWellEmbedded()
} }
void ImplicitHierarchicalMap3::analysis()
{
assert(getCurrentLevel() > 0 || !"analysis : called on level 0") ;
decCurrentLevel() ;
for(unsigned int i = 0; i < analysisFilters.size(); ++i)
(*analysisFilters[i])() ;
}
void ImplicitHierarchicalMap3::synthesis()
{
assert(getCurrentLevel() < getMaxLevel() || !"synthesis : called on max level") ;
for(unsigned int i = 0; i < synthesisFilters.size(); ++i)
(*synthesisFilters[i])() ;
incCurrentLevel() ;
}
/*************************************************** /***************************************************
* ATTRIBUTE HANDLER * * ATTRIBUTE HANDLER *
***************************************************/ ***************************************************/
......
...@@ -44,6 +44,13 @@ enum SubdivideType ...@@ -44,6 +44,13 @@ enum SubdivideType
S_QUAD S_QUAD
} ; } ;
template <typename PFP>
void newLevelHexa(typename PFP::MAP& map, AttributeHandler<typename PFP::VEC3, VERTEX>& position);
/*********************************************************************************** /***********************************************************************************
* Subdivision * * Subdivision *
***********************************************************************************/ ***********************************************************************************/
......
...@@ -305,8 +305,12 @@ Dart embedPrism(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& pos ...@@ -305,8 +305,12 @@ Dart embedPrism(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& pos
return dres; return dres;
} }
//VertexAttribute<typename PFP::VEC3>
template <typename PFP> template <typename PFP>
Dart embedPyramid(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& position, unsigned int n, bool withBoundary, float radius, float height) Dart embedPyramid(typename PFP::MAP& map, AttributeHandler<typename PFP::VEC3, VERTEX>& position, unsigned int n, bool withBoundary, float radius, float height)
{ {
typedef typename PFP::VEC3 VEC3 ; typedef typename PFP::VEC3 VEC3 ;
......
...@@ -42,6 +42,10 @@ namespace Volume ...@@ -42,6 +42,10 @@ namespace Volume
namespace Modelisation namespace Modelisation
{ {
template <typename PFP>
bool isHexahedron(typename PFP::MAP& the_map, Dart d, unsigned int thread=0);
/** /**
* Cut a 3D ear from a mesh : the ear is sewn by phi3 to the rest of the volume * Cut a 3D ear from a mesh : the ear is sewn by phi3 to the rest of the volume
* @param d dart of the point of the ear * @param d dart of the point of the ear
......
...@@ -42,6 +42,28 @@ namespace Volume ...@@ -42,6 +42,28 @@ namespace Volume
namespace Modelisation namespace Modelisation
{ {
template <typename PFP>
bool isHexahedron(typename PFP::MAP& the_map, Dart d, unsigned int thread)
{
unsigned int nbFaces = 0;
//Test the number of faces end its valency
Traversor3WF<typename PFP::MAP> travWF(the_map, d, false, thread);
for(Dart dit = travWF.begin() ; dit != travWF.end(); dit = travWF.next())
{
//increase the number of faces
nbFaces++;