Commit c27d2145 authored by untereiner's avatar untereiner

some changes (see another time what)

parent df531a08
......@@ -30,87 +30,120 @@
SimpleGMap3::SimpleGMap3()
{
position = myMap.addAttribute<VEC3, VERTEX>("position");
normal = myMap.addAttribute<VEC3, VERTEX>("normal");
volume = myMap.addAttribute<VEC3, VOLUME>("volume");
position = myMap.addAttribute<VEC3, VERTEX>("position");
volume = myMap.addAttribute<VEC3, VOLUME>("volume");
CellMarker<EDGE> mE(myMap);
// CellMarker<EDGE> mE(myMap);
Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap,position);
Dart d = primCat.hexaGrid_topo(3,1,1);
primCat.embedHexaGrid(2,1,1);
myMap.check();
Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap,position);
Dart d = primCat.hexaGrid_topo(1,1,1);
primCat.embedHexaGrid(1,1,1);
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));
Algo::Volume::Modelisation::sliceConvexVolume<PFP>(myMap, position, d, pl);
Dart dp = Algo::Surface::Modelisation::createQuadrangularPyramid<PFP>(myMap);
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))
position[i] += VEC3(2,0,0);
Dart dtemp = myMap.beta1(myMap.beta0(myMap.beta1(myMap.beta2(myMap.beta1(myMap.beta0(myMap.beta1(myMap.beta2(d))))))));
Algo::Volume::Modelisation::Primitive3D<PFP> prim(myMap, position);
d = prim.hexaGrid_topo(2,2,1);
prim.embedHexaGrid(1,1,1);
myMap.sewVolumes(dtemp,dp);
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;
// Geom::Plane3D<PFP::REAL> pl(VEC3(-1,-0.5,-0.5),VEC3(-1,-0.5,0.5),VEC3(1,0.5,0.5));
// Algo::Volume::Modelisation::sliceConvexVolume<PFP>(myMap, position, d, pl);
VEC3 mid1 = (position[d] + position[myMap.phi1(d)]) / 2.0f;
myMap.cutEdge(d);
position[myMap.phi1(d)] = mid1;
// myMap.check();
d = myMap.phi1(myMap.phi1(myMap.phi2(myMap.phi1(myMap.phi1(d)))));
VEC3 mid = (position[d] + position[myMap.phi1(d)]) / 2.0f;
myMap.cutEdge(d);
position[myMap.phi1(d)] = mid;
// for(unsigned int i = position.begin() ; i != position.end() ; position.next(i))
// position[i] += VEC3(2,0,0);
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))
position[i] += VEC3(0,2,0);
// VEC3 mid1 = (position[d] + position[myMap.phi1(d)]) / 2.0f;
// myMap.cutEdge(d);
// position[myMap.phi1(d)] = mid1;
Algo::Volume::Modelisation::Primitive3D<PFP> prim2(myMap,position);
d = prim2.hexaGrid_topo(2,1,1);
prim2.embedHexaGrid(1,1,1);
// d = myMap.phi1(myMap.phi1(myMap.phi2(myMap.phi1(myMap.phi1(d)))));
// VEC3 mid = (position[d] + position[myMap.phi1(d)]) / 2.0f;
// myMap.cutEdge(d);
// position[myMap.phi1(d)] = mid;
d = myMap.phi2(myMap.phi1(myMap.phi1(myMap.phi2(d))));
myMap.unsewVolumes(d);
// myMap.splitFace(d,myMap.phi1(myMap.phi1(myMap.phi1(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::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()
{
Utils::GLSLShader::setCurrentOGLVersion(2) ;
Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position) ;
VEC3 gPosObj = bb.center() ;
float tailleX = bb.size(0) ;
float tailleY = bb.size(1) ;
float tailleZ = bb.size(2) ;
float gWidthObj = std::max<float>(std::max<float>(tailleX, tailleY), tailleZ) ;
setParamObject(gWidthObj, gPosObj.data());
m_render_topo = new Algo::Render::GL2::Topo3Render();
m_render_topo->setDartWidth(2.0f);
m_render_topo->setInitialDartsColor(1.0f,1.0f,1.0f);
m_render_topo->updateData<PFP>(myMap, position, 0.9f,0.9f,0.9f);
Utils::GLSLShader::setCurrentOGLVersion(2) ;
Geom::BoundingBox<PFP::VEC3> bb = Algo::Geometry::computeBoundingBox<PFP>(myMap, position) ;
VEC3 gPosObj = bb.center() ;
float tailleX = bb.size(0) ;
float tailleY = bb.size(1) ;
float tailleZ = bb.size(2) ;
float gWidthObj = std::max<float>(std::max<float>(tailleX, tailleY), tailleZ) ;
setParamObject(gWidthObj, gPosObj.data());
m_render_topo = new Algo::Render::GL2::Topo3Render();
m_render_topo->setDartWidth(2.0f);
m_render_topo->setInitialDartsColor(1.0f,1.0f,1.0f);
m_render_topo->updateData<PFP>(myMap, position, 0.9f,0.9f,0.8f);
}
void SimpleGMap3::cb_redraw()
{
glDisable(GL_LIGHTING);
glLineWidth(1.0f);
m_render_topo->drawTopo();
glDisable(GL_LIGHTING);
glLineWidth(1.0f);
m_render_topo->drawTopo();
}
/**********************************************************************************************
......@@ -119,13 +152,13 @@ void SimpleGMap3::cb_redraw()
int main(int argc, char **argv)
{
QApplication app(argc, argv) ;
QApplication app(argc, argv) ;
SimpleGMap3 sqt ;
sqt.setGeometry(0, 0, 1000, 800) ;
sqt.show() ;
SimpleGMap3 sqt ;
sqt.setGeometry(0, 0, 1000, 800) ;
sqt.show() ;
sqt.initGUI() ;
sqt.initGUI() ;
return app.exec() ;
return app.exec() ;
}
......@@ -53,7 +53,6 @@ public:
MAP myMap ;
VertexAttribute<VEC3> position ;
VertexAttribute<VEC3> normal ;
VolumeAttribute<VEC3> volume ;
Algo::Render::GL2::Topo3Render* m_render_topo;
......@@ -64,4 +63,5 @@ public:
void cb_initGL() ;
void cb_redraw() ;
void cb_keyPress(int c);
};
......@@ -32,44 +32,62 @@ SimpleMap3::SimpleMap3()
{
position = myMap.addAttribute<VEC3, VERTEX>("position");
Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap, position);
Dart d = primCat.hexaGrid_topo(2,1,1);
primCat.embedHexaGrid(1,1,1);
myMap.closeMap();
Algo::Volume::Modelisation::Primitive3D<PFP> primCat(myMap,position);
Dart d = primCat.hexaGrid_topo(1,1,1);
primCat.embedHexaGrid(1,1,1);
myMap.closeMap();
myMap.check();
unsigned int nb=0;
for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
nb++;
Dart dp = Algo::Surface::Modelisation::createQuadrangularPyramid<PFP>(myMap);
std::cout << "Nb vertices (equals 12) : " << nb << std::endl;
assert(nb==12);
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);
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;
assert(nb==16);
// d = myMap.phi2(myMap.phi1(myMap.phi1(myMap.phi2(d))));
myMap.sewVolumes(d,dd);
// Dart dd = myMap.phi3(d);
myMap.check();
// myMap.unsewVolumes(d);
nb=0;
for(unsigned int i = position.begin(); i!=position.end(); position.next(i))
nb++;
// myMap.check();
std::cout << "Nb vertices after resew (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;
// 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()
m_render_topo = new Algo::Render::GL2::Topo3Render();
m_render_topo->setDartWidth(2.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->setDartWidth(2.0f);
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_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()
{
glDisable(GL_LIGHTING);
glLineWidth(1.0f);
m_render_topo->drawTopo();
m_render_topo_boundary->drawTopo();
m_render_topo->drawTopo();
//m_render_topo_boundary->drawTopo();
//m_render_topo_primal->drawTopo();
}
/**********************************************************************************************
......
......@@ -33,6 +33,7 @@
#include "Geometry/vector_gen.h"
#include "Algo/Render/GL2/topo3Render.h"
#include "Algo/Render/GL2/topo3PrimalRender.h"
#include "Algo/Render/GL2/topoRender.h"
using namespace CGoGN ;
......@@ -58,6 +59,7 @@ public:
Algo::Render::GL2::Topo3Render* m_render_topo;
Algo::Render::GL2::TopoRender* m_render_topo_boundary;
Algo::Render::GL2::Topo3PrimalRender* m_render_topo_primal;
SimpleMap3() ;
......@@ -65,5 +67,6 @@ public:
void cb_initGL() ;
void cb_redraw() ;
void cb_keyPress(int code);
};
......@@ -26,6 +26,7 @@
#define __IMPLICIT_HIERARCHICAL_MAP3__
#include "Topology/map/embeddedMap3.h"
#include "Algo/Multiresolution/filter.h"
namespace CGoGN
{
......@@ -64,6 +65,9 @@ public:
AttributeMultiVector<unsigned int>* m_nextLevelCell[NB_ORBITS] ;
std::vector<Algo::MR::Filter*> synthesisFilters ;
std::vector<Algo::MR::Filter*> analysisFilters ;
public:
ImplicitHierarchicalMap3() ;
......@@ -153,6 +157,19 @@ public:
*/
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()
}
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 *
***************************************************/
......
......@@ -44,6 +44,13 @@ enum SubdivideType
S_QUAD
} ;
template <typename PFP>
void newLevelHexa(typename PFP::MAP& map, AttributeHandler<typename PFP::VEC3, VERTEX>& position);
/***********************************************************************************
* Subdivision *
***********************************************************************************/
......
......@@ -305,8 +305,12 @@ Dart embedPrism(typename PFP::MAP& map, VertexAttribute<typename PFP::VEC3>& pos
return dres;
}
//VertexAttribute<typename PFP::VEC3>
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 ;
......
......@@ -42,6 +42,10 @@ namespace Volume
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
* @param d dart of the point of the ear
......
......@@ -42,6 +42,28 @@ namespace Volume
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++;
if(nbFaces > 6) //too much faces
return false;
//test the valency of this face
if(the_map.faceDegree(dit) != 4)
return false;
}
return true;
}
template <typename PFP>
Dart cut3Ear(typename PFP::MAP& map, Dart d)
{
......
......@@ -410,36 +410,49 @@ void swapGen3To2(typename PFP::MAP& map, Dart d)
{
unsigned int n = map.edgeDegree(d);
if(n >= 4)
{
Dart dit = d;
if(map.isBoundaryEdge(dit))
{
for(unsigned int i = 0 ; i < n - 2 ; ++i)
{
dit = map.phi2(Tetrahedralization::swap2To3<PFP>(map, dit));
}
Tetrahedralization::swap2To2<PFP>(map, dit);
}
else
{
for(unsigned int i = 0 ; i < n - 4 ; ++i)
{
dit = map.phi2(Tetrahedralization::swap2To3<PFP>(map, dit));
}
Tetrahedralization::swap4To4<PFP>(map, map.alpha2(dit));
}
}
else if (n == 3)
{
Dart dres = Tetrahedralization::swap2To3<PFP>(map, d);
Tetrahedralization::swap2To2<PFP>(map, map.phi2(dres));
}
else // si (n == 2)
{
Tetrahedralization::swap2To2<PFP>(map, d);
}
if(n >= 4)
{
Dart dit = d;
for(unsigned int i = 0 ; i < n - 4 ; ++i)
{
dit = map.phi2(Tetrahedralization::swap2To3<PFP>(map, dit));
}
Tetrahedralization::swap4To4<PFP>(map, map.alpha2(dit));
}
// if(n >= 4)
// {
// Dart dit = d;
// if(map.isBoundaryEdge(dit))
// {
// for(unsigned int i = 0 ; i < n - 2 ; ++i)
// {
// dit = map.phi2(Tetrahedralization::swap2To3<PFP>(map, dit));
// }
// Tetrahedralization::swap2To2<PFP>(map, dit);
// }
// else
// {
// for(unsigned int i = 0 ; i < n - 4 ; ++i)
// {
// dit = map.phi2(Tetrahedralization::swap2To3<PFP>(map, dit));
// }
// Tetrahedralization::swap4To4<PFP>(map, map.alpha2(dit));
// }
// }
// else if (n == 3)
// {
// Dart dres = Tetrahedralization::swap2To3<PFP>(map, d);
// Tetrahedralization::swap2To2<PFP>(map, map.phi2(dres));
// }
// else // si (n == 2)
// {
// Tetrahedralization::swap2To2<PFP>(map, d);
// }
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment