diff --git a/Apps/SandBox/CMakeLists.txt b/Apps/SandBox/CMakeLists.txt index 8dd034131d384c57d4ae5503c5f52ab762c41be9..a9784c384452edc40c3760a228eb9973fd181eb0 100644 --- a/Apps/SandBox/CMakeLists.txt +++ b/Apps/SandBox/CMakeLists.txt @@ -36,6 +36,11 @@ add_executable(test_traversor2 test_traversor2.cpp ${test_traversor2_ui} ${test target_link_libraries(test_traversor2 ${CGoGN_LIBS_D} ${CGoGN_EXT_LIBS}) +QT4_WRAP_UI( testPlaneCutting_ui testPlaneCutting.ui ) +QT4_WRAP_CPP(testPlaneCutting_moc testPlaneCutting.h) +add_executable(testPlaneCutting testPlaneCutting.cpp ${testPlaneCutting_ui} ${testPlaneCutting_moc}) +target_link_libraries(testPlaneCutting ${CGoGN_LIBS_D} ${CGoGN_EXT_LIBS}) + # Example with Qt # #QT4_WRAP_CPP(tuto1_moc tuto1.h) diff --git a/Apps/SandBox/testPlaneCutting.cpp b/Apps/SandBox/testPlaneCutting.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dc2612f57d17df1966b3a0389e2bed353f59af6f --- /dev/null +++ b/Apps/SandBox/testPlaneCutting.cpp @@ -0,0 +1,430 @@ +/******************************************************************************* +* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * +* version 0.1 * +* Copyright (C) 2009, IGG Team, LSIIT, University of Strasbourg * +* * +* This library is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by the * +* Free Software Foundation; either version 2.1 of the License, or (at your * +* option) any later version. * +* * +* This library is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this library; if not, write to the Free Software Foundation, * +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * +* * +* Web site: http://cgogn.unistra.fr/ * +* Contact information: cgogn@unistra.fr * +* * +*******************************************************************************/ + +#include "testPlaneCutting.h" + +#include "Algo/Geometry/distances.h" +#include "Algo/Modelisation/subdivision.h" +#include "Utils/chrono.h" +#include "Algo/Modelisation/planeCutting.h" + +Viewer::Viewer() : + m_renderStyle(FLAT), + m_drawVertices(false), + m_drawEdges(false), + m_drawFaces(true), + m_drawNormals(false), + m_drawTopo(false), + m_drawBoundaryTopo(true), + m_render(NULL), + m_phongShader(NULL), + m_flatShader(NULL), + m_vectorShader(NULL), + m_simpleColorShader(NULL), + m_pointSprite(NULL) +{ + normalScaleFactor = 1.0f ; + vertexScaleFactor = 0.1f ; + faceShrinkage = 1.0f ; + + colClear = Geom::Vec4f(0.2f, 0.2f, 0.2f, 0.1f) ; + colDif = Geom::Vec4f(0.8f, 0.9f, 0.7f, 1.0f) ; + colSpec = Geom::Vec4f(0.9f, 0.9f, 0.9f, 1.0f) ; + colNormal = Geom::Vec4f(1.0f, 0.0f, 0.0f, 1.0f) ; + shininess = 80.0f ; +} + +void Viewer::initGUI() +{ + setDock(&dock) ; + + dock.check_drawVertices->setChecked(false) ; + dock.check_drawEdges->setChecked(false) ; + dock.check_drawFaces->setChecked(true) ; + dock.check_drawNormals->setChecked(false) ; + + dock.slider_verticesSize->setVisible(false) ; + dock.slider_normalsSize->setVisible(false) ; + + dock.slider_verticesSize->setSliderPosition(50) ; + dock.slider_normalsSize->setSliderPosition(50) ; + + setCallBack( dock.check_drawVertices, SIGNAL(toggled(bool)), SLOT(slot_drawVertices(bool)) ) ; + setCallBack( dock.slider_verticesSize, SIGNAL(valueChanged(int)), SLOT(slot_verticesSize(int)) ) ; + setCallBack( dock.check_drawEdges, SIGNAL(toggled(bool)), SLOT(slot_drawEdges(bool)) ) ; + setCallBack( dock.check_drawFaces, SIGNAL(toggled(bool)), SLOT(slot_drawFaces(bool)) ) ; + setCallBack( dock.combo_faceLighting, SIGNAL(currentIndexChanged(int)), SLOT(slot_faceLighting(int)) ) ; + setCallBack( dock.check_drawTopo, SIGNAL(toggled(bool)), SLOT(slot_drawTopo(bool)) ) ; + setCallBack( dock.check_drawNormals, SIGNAL(toggled(bool)), SLOT(slot_drawNormals(bool)) ) ; + setCallBack( dock.slider_normalsSize, SIGNAL(valueChanged(int)), SLOT(slot_normalsSize(int)) ) ; +} + +void Viewer::cb_initGL() +{ + Utils::GLSLShader::setCurrentOGLVersion(2) ; + + m_render = new Algo::Render::GL2::MapRender() ; + m_topoRender = new Algo::Render::GL2::TopoRender() ; + + m_topoRender->setInitialDartsColor(0.25f, 0.25f, 0.25f) ; + + m_positionVBO = new Utils::VBO() ; + m_normalVBO = new Utils::VBO() ; + + m_phongShader = new Utils::ShaderPhong() ; + m_phongShader->setAttributePosition(m_positionVBO) ; + m_phongShader->setAttributeNormal(m_normalVBO) ; + m_phongShader->setAmbiant(colClear) ; + m_phongShader->setDiffuse(colDif) ; + m_phongShader->setSpecular(colSpec) ; + m_phongShader->setShininess(shininess) ; + + m_flatShader = new Utils::ShaderFlat() ; + m_flatShader->setAttributePosition(m_positionVBO) ; + m_flatShader->setAmbiant(colClear) ; + m_flatShader->setDiffuse(colDif) ; + m_flatShader->setExplode(faceShrinkage) ; + + m_vectorShader = new Utils::ShaderVectorPerVertex() ; + m_vectorShader->setAttributePosition(m_positionVBO) ; + m_vectorShader->setAttributeVector(m_normalVBO) ; + m_vectorShader->setColor(colNormal) ; + + m_simpleColorShader = new Utils::ShaderSimpleColor() ; + m_simpleColorShader->setAttributePosition(m_positionVBO) ; + Geom::Vec4f c(0.0f, 0.0f, 0.0f, 1.0f) ; + m_simpleColorShader->setColor(c) ; + + m_pointSprite = new Utils::PointSprite() ; + m_pointSprite->setAttributePosition(m_positionVBO) ; + m_pointSprite->setColor(Geom::Vec4f(0.0f, 0.0f, 1.0f, 1.0f)) ; + + registerShader(m_phongShader) ; + registerShader(m_flatShader) ; + registerShader(m_vectorShader) ; + registerShader(m_simpleColorShader) ; + registerShader(m_pointSprite) ; +} + +void Viewer::cb_redraw() +{ + if(m_drawVertices) + { + m_pointSprite->setSize(vertexScaleFactor) ; + m_render->draw(m_pointSprite, Algo::Render::GL2::POINTS) ; + } + + if(m_drawEdges) + { + glLineWidth(1.0f) ; + m_render->draw(m_simpleColorShader, Algo::Render::GL2::LINES) ; + } + + if(m_drawFaces) + { + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL) ; + glEnable(GL_LIGHTING) ; + glEnable(GL_POLYGON_OFFSET_FILL) ; + glPolygonOffset(1.0f, 1.0f) ; + switch(m_renderStyle) + { + case FLAT : + m_flatShader->setExplode(faceShrinkage) ; + m_render->draw(m_flatShader, Algo::Render::GL2::TRIANGLES) ; + break ; + case PHONG : + m_render->draw(m_phongShader, Algo::Render::GL2::TRIANGLES) ; + break ; + } + glDisable(GL_POLYGON_OFFSET_FILL) ; + } + + if(m_drawTopo) + { + m_topoRender->drawTopo() ; + } + + if(m_drawNormals) + { + float size = normalBaseSize * normalScaleFactor ; + m_vectorShader->setScale(size) ; + glLineWidth(1.0f) ; + m_render->draw(m_vectorShader, Algo::Render::GL2::POINTS) ; + } +} + +void Viewer::cb_Open() +{ + std::string filters("all (*.*);; trian (*.trian);; ctm (*.ctm);; off (*.off);; ply (*.ply)") ; + std::string filename = selectFile("Open Mesh", "", filters) ; + if (filename.empty()) + return ; + + importMesh(filename) ; + updateGL() ; +} + +void Viewer::cb_Save() +{ + std::string filters("all (*.*);; map (*.map);; off (*.off);; ply (*.ply)") ; + std::string filename = selectFileSave("Save Mesh", "", filters) ; + + if (!filename.empty()) + exportMesh(filename) ; +} + +void Viewer::cb_keyPress(int keycode) +{ + switch(keycode) + { + case 'c' : + myMap.check(); + break; + + case 'p': + { + + std::cout << "PlaneCut"<< std::endl; + Geom::Vec3f n(0.1,0.1,1.0); + Geom::Vec3f o = bb.center(); + + Geom::Plane3D plan(n,o); + + CellMarker over(myMap); + Algo::Surface::Modelisation::planeCut(myMap, position, plan, over, false,true); + + std::cout << "PlaneCut Ok"<< std::endl; + n *= bb.diagSize()/20.0f; + + TraversorV trav(myMap); + for (Dart d=trav.begin(); d!=trav.end(); d=trav.next()) + { + if (over.isMarked(d)) + position[d]+= n; + } + + + m_render->initPrimitives(myMap, Algo::Render::GL2::POINTS) ; + m_render->initPrimitives(myMap, Algo::Render::GL2::LINES) ; + m_render->initPrimitives(myMap, Algo::Render::GL2::TRIANGLES) ; + + Algo::Surface::Geometry::computeNormalVertices(myMap, position, normal) ; + m_positionVBO->updateData(position) ; + m_normalVBO->updateData(normal) ; + + m_topoRender->updateData(myMap, position, 0.85f, 0.85f, m_drawBoundaryTopo) ; + updateGL(); + + } + break; + + case 'd': + { + Utils::Chrono ch; + ch.start(); + VEC3 P(0.6f,0.55f,0.51f); + float dist = 10000.0f; + TraversorF trav(myMap); + unsigned int nb=0; + for (Dart d=trav.begin(); d != trav.end(); d=trav.next()) + { + nb++; + float d2 = Algo::Geometry::squaredDistancePoint2Face(myMap,d,position,P); + if (d2("position") ; + } + else + { + std::vector attrNames ; + if(!Algo::Surface::Import::importMesh(myMap, filename.c_str(), attrNames)) + { + CGoGNerr << "could not import " << filename << CGoGNendl ; + return; + } + position = myMap.getAttribute(attrNames[0]) ; + } + +// myMap.enableQuickTraversal() ; + + m_render->initPrimitives(myMap, Algo::Render::GL2::POINTS) ; + m_render->initPrimitives(myMap, Algo::Render::GL2::LINES) ; + m_render->initPrimitives(myMap, Algo::Render::GL2::TRIANGLES) ; + + m_topoRender->updateData(myMap, position, 0.85f, 0.85f, m_drawBoundaryTopo) ; + + bb = Algo::Geometry::computeBoundingBox(myMap, position) ; + normalBaseSize = bb.diagSize() / 100.0f ; +// vertexBaseSize = normalBaseSize / 5.0f ; + + normal = myMap.getAttribute("normal") ; + if(!normal.isValid()) + normal = myMap.addAttribute("normal") ; + + Algo::Surface::Geometry::computeNormalVertices(myMap, position, normal) ; + + m_positionVBO->updateData(position) ; + m_normalVBO->updateData(normal) ; + + setParamObject(bb.maxSize(), bb.center().data()) ; + updateGLMatrices() ; +} + +void Viewer::exportMesh(std::string& filename, bool askExportMode) +{ + size_t pos = filename.rfind(".") ; // position of "." in filename + std::string extension = filename.substr(pos) ; + + if (extension == std::string(".off")) + Algo::Surface::Export::exportOFF(myMap, position, filename.c_str()) ; + else if (extension.compare(0, 4, std::string(".ply")) == 0) + { + int ascii = 0 ; + if (askExportMode) + Utils::QT::inputValues(Utils::QT::VarCombo("binary mode;ascii mode",ascii,"Save in")) ; + + std::vector*> attributes ; + attributes.push_back(&position) ; + Algo::Surface::Export::exportPLYnew(myMap, attributes, filename.c_str(), !ascii) ; + } + else if (extension == std::string(".map")) + myMap.saveMapBin(filename) ; + else + std::cerr << "Cannot save file " << filename << " : unknown or unhandled extension" << std::endl ; +} + +void Viewer::slot_drawVertices(bool b) +{ + m_drawVertices = b ; + updateGL() ; +} + +void Viewer::slot_verticesSize(int i) +{ + vertexScaleFactor = i / 500.0f ; + updateGL() ; +} + +void Viewer::slot_drawEdges(bool b) +{ + m_drawEdges = b ; + updateGL() ; +} + +void Viewer::slot_drawFaces(bool b) +{ + m_drawFaces = b ; + if (b) + { + Geom::Vec4f c(0.0f, 0.0f, 0.0f, 1.0f) ; + m_simpleColorShader->setColor(c) ; + } + else + { + Geom::Vec4f c(0.9f, 0.9f, 0.1f, 1.0f) ; + m_simpleColorShader->setColor(c) ; + } + + updateGL() ; +} + +void Viewer::slot_faceLighting(int i) +{ + m_renderStyle = i ; + updateGL() ; +} + +void Viewer::slot_drawTopo(bool b) +{ + m_drawTopo = b ; + updateGL() ; +} + +void Viewer::slot_drawNormals(bool b) +{ + m_drawNormals = b ; + updateGL() ; +} + +void Viewer::slot_normalsSize(int i) +{ + normalScaleFactor = i / 50.0f ; + updateGL() ; +} + +/********************************************************************************************** + * MAIN FUNCTION * + **********************************************************************************************/ + +int main(int argc, char **argv) +{ + QApplication app(argc, argv) ; + + Viewer sqt ; + sqt.setGeometry(0, 0, 1000, 800) ; + sqt.show() ; + + if(argc >= 2) + { + std::string filename(argv[1]) ; + sqt.importMesh(filename) ; + if(argc >= 3) + { + std::string filenameExp(argv[2]) ; + std::cout << "Exporting " << filename << " as " << filenameExp << " ... "<< std::flush ; + sqt.exportMesh(filenameExp, false) ; + std::cout << "done!" << std::endl ; + + return (0) ; + } + } + + sqt.initGUI() ; + + return app.exec() ; +} diff --git a/Apps/SandBox/testPlaneCutting.h b/Apps/SandBox/testPlaneCutting.h new file mode 100644 index 0000000000000000000000000000000000000000..186e87298648aed953ab312c5a74c688928a20f4 --- /dev/null +++ b/Apps/SandBox/testPlaneCutting.h @@ -0,0 +1,140 @@ +/******************************************************************************* +* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps * +* version 0.1 * +* Copyright (C) 2009, IGG Team, LSIIT, University of Strasbourg * +* * +* This library is free software; you can redistribute it and/or modify it * +* under the terms of the GNU Lesser General Public License as published by the * +* Free Software Foundation; either version 2.1 of the License, or (at your * +* option) any later version. * +* * +* This library is distributed in the hope that it will be useful, but WITHOUT * +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * +* for more details. * +* * +* You should have received a copy of the GNU Lesser General Public License * +* along with this library; if not, write to the Free Software Foundation, * +* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * +* * +* Web site: http://cgogn.unistra.fr/ * +* Contact information: cgogn@unistra.fr * +* * +*******************************************************************************/ + +#include + +#include "Utils/Qt/qtQGLV.h" +#include "ui_testPlaneCutting.h" +#include "Utils/Qt/qtui.h" + +#include "Topology/generic/parameters.h" +#include "Topology/map/embeddedMap2.h" + +#include "Geometry/vector_gen.h" +#include "Geometry/matrix.h" + +#include "Algo/Import/import.h" +#include "Algo/Export/export.h" + +#include "Algo/Render/GL2/mapRender.h" +#include "Algo/Render/GL2/topoRender.h" + +#include "Utils/Shaders/shaderPhong.h" +#include "Utils/Shaders/shaderFlat.h" +#include "Utils/Shaders/shaderSimpleColor.h" +#include "Utils/Shaders/shaderVectorPerVertex.h" +#include "Utils/pointSprite.h" +#include "Utils/text3d.h" +#include "Utils/vbo.h" + +#include "Utils/Qt/qtInputs.h" + +#include "Algo/Geometry/boundingbox.h" +#include "Algo/Geometry/normal.h" +#include "Algo/Geometry/convexity.h" + +using namespace CGoGN ; + +struct PFP: public PFP_STANDARD +{ + // definition of the map + typedef EmbeddedMap2 MAP ; +}; + +typedef PFP::MAP MAP ; +typedef PFP::VEC3 VEC3 ; + + +class Viewer : public Utils::QT::SimpleQGLV +{ + Q_OBJECT + +public: + MAP myMap ; + + Utils::QT::uiDockInterface dock ; + + enum renderMode { FLAT, PHONG } ; + + Geom::Vec4f colDif ; + Geom::Vec4f colSpec ; + Geom::Vec4f colClear ; + Geom::Vec4f colNormal ; + + float shininess ; + + Geom::BoundingBox bb ; + float normalBaseSize ; + float normalScaleFactor ; + float vertexBaseSize ; + float vertexScaleFactor ; + float faceShrinkage ; + + int m_renderStyle ; + bool m_drawVertices ; + bool m_drawEdges ; + bool m_drawFaces ; + bool m_drawNormals ; + bool m_drawTopo ; + bool m_drawBoundaryTopo; + + VertexAttribute position ; + VertexAttribute normal ; + + Algo::Render::GL2::MapRender* m_render ; + Algo::Render::GL2::TopoRender* m_topoRender ; + + Utils::VBO* m_positionVBO ; + Utils::VBO* m_normalVBO; + + Utils::ShaderPhong* m_phongShader ; + Utils::ShaderFlat* m_flatShader ; + Utils::ShaderVectorPerVertex* m_vectorShader ; + Utils::ShaderSimpleColor* m_simpleColorShader ; + Utils::PointSprite* m_pointSprite ; + + Viewer() ; + + void initGUI() ; + + void cb_initGL() ; + void cb_redraw() ; + void cb_Open() ; + void cb_Save() ; + + void cb_keyPress(int keycode); + + void importMesh(std::string& filename) ; + void exportMesh(std::string& filename, bool askExportMode = true); + +public slots: + void slot_drawVertices(bool b) ; + void slot_verticesSize(int i) ; + void slot_drawEdges(bool b) ; + void slot_drawFaces(bool b) ; + void slot_faceLighting(int i) ; + void slot_drawTopo(bool b) ; + void slot_drawNormals(bool b) ; + void slot_normalsSize(int i) ; +}; diff --git a/Apps/SandBox/testPlaneCutting.ui b/Apps/SandBox/testPlaneCutting.ui new file mode 100644 index 0000000000000000000000000000000000000000..cef95e3bcb8a3e1fc32f56025758823e571cf24d --- /dev/null +++ b/Apps/SandBox/testPlaneCutting.ui @@ -0,0 +1,168 @@ + + + DockWidget + + + + 0 + 0 + 174 + 393 + + + + + 174 + 393 + + + + Commands + + + + + + + 0 + + + + Visu + + + + + + draw vertices + + + + + + + Qt::Horizontal + + + + + + + draw edges + + + + + + + draw faces + + + + + + + + FLAT + + + + + PHONG + + + + + + + + draw topo + + + + + + + draw normals + + + + + + + Qt::Horizontal + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + check_drawFaces + toggled(bool) + combo_faceLighting + setVisible(bool) + + + 65 + 98 + + + 65 + 127 + + + + + check_drawNormals + toggled(bool) + slider_normalsSize + setVisible(bool) + + + 75 + 191 + + + 75 + 222 + + + + + check_drawVertices + toggled(bool) + slider_verticesSize + setVisible(bool) + + + 75 + 44 + + + 75 + 75 + + + + +