Commit 9d4aacc3 authored by Kenneth Vanhoey's avatar Kenneth Vanhoey

Merge branch 'master' of cgogn:~cgogn/CGoGN

parents 2651f5c4 8ce878a4
......@@ -35,7 +35,8 @@ ObjView::ObjView():
m_texcoordVBO(NULL),
m_shader(NULL),
m_shader2(NULL),
m_RenderStyle(2)
m_RenderStyle(2),
m_currentGroupDrawn(0xffffffff)
{}
ObjView::~ObjView()
......@@ -69,6 +70,23 @@ void ObjView::cb_keyPress(int k)
case 't':
m_RenderStyle=2;
break;
case 'o':
m_currentGroupDrawn=0xffffffff;
break;
case 'O':
m_currentGroupDrawn=0;
std::cout << "Group "<< m_obj.objGroupName(m_currentGroupDrawn)<< std::endl;
break;
case '-':
m_currentGroupDrawn--;
std::cout << "Group "<< m_obj.objGroupName(m_currentGroupDrawn)<< std::endl;
break;
case '+':
m_currentGroupDrawn++;
std::cout << "Group "<< m_obj.objGroupName(m_currentGroupDrawn)<< std::endl;
break;
default:
break;
}
......@@ -81,6 +99,8 @@ void ObjView::cb_initGL()
// choose to use GL version 2
Utils::GLSLShader::setCurrentOGLVersion(2);
m_dr = new Utils::Drawer;
// create VBO for position
m_positionVBO = new Utils::VBO;
m_texcoordVBO = new Utils::VBO;
......@@ -105,22 +125,130 @@ void ObjView::cb_initGL()
m_obj.createGroupMatVBO_PTN(m_positionVBO,m_texcoordVBO,m_normalVBO);
}
void ObjView::drawBB( const Geom::BoundingBox<VEC3>& bb)
{
const VEC3& mi = bb.min();
const VEC3& ma = bb.max();
m_dr->newList(GL_COMPILE_AND_EXECUTE);
m_dr->lineWidth(3.0f);
m_dr->begin(GL_LINE_LOOP);
m_dr->color3f(1.0f,1.0f,0.0f);
m_dr->vertex3f(mi[0],mi[1],mi[2]);
m_dr->vertex3f(ma[0],mi[1],mi[2]);
m_dr->vertex3f(ma[0],ma[1],mi[2]);
m_dr->vertex3f(mi[0],ma[1],mi[2]);
m_dr->end();
m_dr->begin(GL_LINE_LOOP);
m_dr->color3f(1.0f,1.0f,0.0f);
m_dr->vertex3f(mi[0],mi[1],ma[2]);
m_dr->vertex3f(ma[0],mi[1],ma[2]);
m_dr->vertex3f(ma[0],ma[1],ma[2]);
m_dr->vertex3f(mi[0],ma[1],ma[2]);
m_dr->end();
m_dr->begin(GL_LINES);
m_dr->color3f(1.0f,1.0f,0.0f);
m_dr->vertex3f(mi[0],mi[1],mi[2]);
m_dr->vertex3f(mi[0],mi[1],ma[2]);
m_dr->vertex3f(mi[0],ma[1],mi[2]);
m_dr->vertex3f(mi[0],ma[1],ma[2]);
m_dr->vertex3f(ma[0],ma[1],mi[2]);
m_dr->vertex3f(ma[0],ma[1],ma[2]);
m_dr->vertex3f(ma[0],mi[1],mi[2]);
m_dr->vertex3f(ma[0],mi[1],ma[2]);
m_dr->end();
m_dr->endList();
}
void ObjView::cb_redraw()
{
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
unsigned int nb = m_obj.nbMatGroups();
const std::vector<Algo::Surface::Import::MaterialOBJ*>& mats = m_obj.getMaterials();
unsigned int nb = m_obj.nbObjGroups();
// const std::vector<Algo::Surface::Import::MaterialOBJ*>& mats = m_obj.getMaterials();
if (m_currentGroupDrawn<(nb-1))
{
std::cout << "Draw Object "<< m_currentGroupDrawn << std::endl;
unsigned int i = m_currentGroupDrawn;
drawBB(m_obj.getGroupBB(i));
std::cout << "BB drawn" << std::endl;
switch(m_RenderStyle)
{
case 0: // MONO
for (unsigned int j=0; j<m_obj.nbSubGroup(i);++j)
{
Geom::Vec4f v(0.2f,1.0f,0.4f,0.0f); // color here green
m_phongShader->setAmbiant(0.2f*v) ;
m_phongShader->setDiffuse(v) ;
m_phongShader->setSpecular(v) ;
m_phongShader->setShininess(10000.0) ;
m_phongShader->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_phongShader->disableVertexAttribs();
}
break;
case 1: // COLOR
for (unsigned int j=0; j<m_obj.nbSubGroup(i);++j)
{
const Algo::Surface::Import::MaterialOBJ* mat = m_obj.materialOf(i,j);
Geom::Vec4f v(mat->diffuseColor[0],mat->diffuseColor[1],mat->diffuseColor[2],0.0f);
m_phongShader->setAmbiant(0.2f*v) ;
m_phongShader->setDiffuse(v) ;
m_phongShader->setSpecular(v) ;
m_phongShader->setShininess(10000.0) ;
m_phongShader->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_phongShader->disableVertexAttribs();
}
default:
for (unsigned int j=0; j<m_obj.nbSubGroup(i);++j)
{
const Algo::Surface::Import::MaterialOBJ* mat = m_obj.materialOf(i,j);
if (mat->textureDiffuse != NULL)
{
m_shader2->setTexture(mat->textureDiffuse);
m_shader2->setShininess(mat->shininess);
m_shader2->setAmbient(0.8f);
m_shader2->activeTexture();
m_shader2->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_shader2->disableVertexAttribs();
}
else
{
Geom::Vec4f v;
v[0] = 0.5f; v[1] = 0.5f; v[2] = 0.5f; v[3] = 0.0f;
m_phongShader->setAmbiant(v) ;
v[0] = mat->diffuseColor[0]; v[1] = mat->diffuseColor[1]; v[2] = mat->diffuseColor[2]; v[3] = 0.0f;
m_phongShader->setDiffuse(v) ;
v[0] = mat->specularColor[0]; v[1] = mat->specularColor[1]; v[2] = mat->specularColor[2]; v[3] = 0.0f;
m_phongShader->setSpecular(v) ;
m_phongShader->setShininess(mat->shininess) ;
m_phongShader->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_phongShader->disableVertexAttribs();
}
}
}
}
else
for (unsigned int i=0; i<nb; ++i)
{
drawBB(m_obj.getGroupBB(i));
switch(m_RenderStyle)
{
case 0: // MONO
{
for (unsigned int j=0; j<m_obj.nbSubGroup(i);++j)
{
Geom::Vec4f v(0.2f,1.0f,0.4f,0.0f); // color here green
m_phongShader->setAmbiant(0.2f*v) ;
m_phongShader->setDiffuse(v) ;
......@@ -128,33 +256,39 @@ void ObjView::cb_redraw()
m_phongShader->setSpecular(v) ;
m_phongShader->setShininess(10000.0) ;
m_phongShader->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i), m_obj.nbIndices(i));
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_phongShader->disableVertexAttribs();
}
break;
case 1: // COLOR
{
Geom::Vec4f v(mats[i]->diffuseColor[0],mats[i]->diffuseColor[1],mats[i]->diffuseColor[2],0.0f);
for (unsigned int j=0; j<m_obj.nbSubGroup(i);++j)
{
const Algo::Surface::Import::MaterialOBJ* mat = m_obj.materialOf(i,j);
Geom::Vec4f v(mat->diffuseColor[0],mat->diffuseColor[1],mat->diffuseColor[2],0.0f);
m_phongShader->setAmbiant(0.2f*v) ;
m_phongShader->setDiffuse(v) ;
// v[0] = 1.0f; v[1] = 1.0f; v[2] = 1.0f; v[3] = 0.0f; // use this for specular effected
m_phongShader->setSpecular(v) ;
m_phongShader->setShininess(10000.0) ;
m_phongShader->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i), m_obj.nbIndices(i));
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_phongShader->disableVertexAttribs();
}
default:
{
if (mats[i]->textureDiffuse != NULL)
for (unsigned int j=0; j<m_obj.nbSubGroup(i);++j)
{
const Algo::Surface::Import::MaterialOBJ* mat = m_obj.materialOf(i,j);
if (mat->textureDiffuse != NULL)
{
m_shader2->setTexture(mats[i]->textureDiffuse);
m_shader2->setShininess(mats[i]->shininess);
m_shader2->setTexture(mat->textureDiffuse);
m_shader2->setShininess(mat->shininess);
m_shader2->setAmbient(0.8f);
m_shader2->activeTexture();
m_shader2->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i), m_obj.nbIndices(i));
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_shader2->disableVertexAttribs();
}
else
......@@ -162,13 +296,13 @@ void ObjView::cb_redraw()
Geom::Vec4f v;
v[0] = 0.5f; v[1] = 0.5f; v[2] = 0.5f; v[3] = 0.0f;
m_phongShader->setAmbiant(v) ;
v[0] = mats[i]->diffuseColor[0]; v[1] = mats[i]->diffuseColor[1]; v[2] = mats[i]->diffuseColor[2]; v[3] = 0.0f;
v[0] = mat->diffuseColor[0]; v[1] = mat->diffuseColor[1]; v[2] = mat->diffuseColor[2]; v[3] = 0.0f;
m_phongShader->setDiffuse(v) ;
v[0] = mats[i]->specularColor[0]; v[1] = mats[i]->specularColor[1]; v[2] = mats[i]->specularColor[2]; v[3] = 0.0f;
v[0] = mat->specularColor[0]; v[1] = mat->specularColor[1]; v[2] = mat->specularColor[2]; v[3] = 0.0f;
m_phongShader->setSpecular(v) ;
m_phongShader->setShininess(mats[i]->shininess) ;
m_phongShader->setShininess(mat->shininess) ;
m_phongShader->enableVertexAttribs();
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i), m_obj.nbIndices(i));
glDrawArrays(GL_TRIANGLES, m_obj.beginIndex(i,j), m_obj.nbIndices(i,j));
m_phongShader->disableVertexAttribs();
}
}
......
......@@ -30,6 +30,7 @@
//#include "Utils/Qt/qtSimple.h"
#include "Utils/Qt/qtQGLV.h"
#include "Utils/textures.h"
#include "Utils/drawer.h"
#include "Utils/Shaders/shaderSimpleTexture.h"
#include "Utils/Shaders/shaderPhongTexture.h"
#include "Utils/Shaders/shaderPhong.h"
......@@ -66,6 +67,10 @@ public:
MAP myMap ;
Algo::Surface::Import::OBJModel<PFP> m_obj;
Utils::Drawer* m_dr;
unsigned int m_currentGroupDrawn;
void drawBB( const Geom::BoundingBox<VEC3>& bb);
// VBO
Utils::VBO* m_positionVBO;
Utils::VBO* m_normalVBO;
......
......@@ -30,6 +30,12 @@ QT4_WRAP_CPP(tilings_moc tilings.h)
add_executable(tilings tilings.cpp ${tilings_moc})
target_link_libraries(tilings ${CGoGN_LIBS_D} ${CGoGN_EXT_LIBS})
QT4_WRAP_UI( test_traversor2_ui test_traversor2.ui )
QT4_WRAP_CPP(test_traversor2_moc test_traversor2.h)
add_executable(test_traversor2 test_traversor2.cpp ${test_traversor2_ui} ${test_traversor2_moc})
target_link_libraries(test_traversor2 ${CGoGN_LIBS_D} ${CGoGN_EXT_LIBS})
# Example with Qt
#
#QT4_WRAP_CPP(tuto1_moc tuto1.h)
......
This diff is collapsed.
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps *
* version 0.1 *
* Copyright (C) 2009-2012, 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 *
* *
*******************************************************************************/
#ifndef _TEST_TRAVERSOR2_
#define _TEST_TRAVERSOR2_
//#define USE_GMAP
//#define PRIMAL_TOPO 1
#include "Topology/generic/parameters.h"
#include "Topology/gmap/embeddedGMap2.h"
#include "Topology/map/embeddedMap2.h"
#include "Algo/Render/GL2/topoRender.h"
#include "ui_test_traversor2.h"
#include "Utils/Qt/qtui.h"
#include "Utils/Qt/qtSimple.h"
#include "Utils/cgognStream.h"
using namespace CGoGN ;
/**
* Struct that contains some informations about the types of the manipulated objects
* Mainly here to be used by the algorithms that are parameterized by it
*/
struct PFP: public PFP_STANDARD
{
// definition of the type of the map
#ifdef USE_GMAP
typedef EmbeddedGMap2 MAP;
#else
typedef EmbeddedMap2 MAP;
#endif
};
typedef PFP::MAP MAP ;
typedef PFP::VEC3 VEC3 ;
class MyQT: public Utils::QT::SimpleQT
{
Q_OBJECT
public:
MyQT():m_render_topo(NULL),m_selected(NIL),m_selected2(NIL),dm(myMap),m_shift(0.01f) {}
void cb_redraw();
void cb_initGL();
void cb_mousePress(int button, int x, int y);
void cb_keyPress(int code);
void cb_Open();
void cb_Save();
Utils::QT::uiDockInterface dock;
protected:
// declaration of the map
MAP myMap;
VertexAttribute<VEC3> position;
DartAttribute<VEC3> colorDarts;
// render (for the topo)
Algo::Render::GL2::TopoRender* m_render_topo;
Dart m_selected;
Dart m_selected2;
DartMarker dm;
float m_shift;
// just for more compact writing
inline Dart PHI1(Dart d) {return myMap.phi1(d);}
inline Dart PHI_1(Dart d) {return myMap.phi_1(d);}
inline Dart PHI2(Dart d) {return myMap.phi2(d);}
template<int X>
Dart PHI(Dart d) {return myMap.phi<X>(d);}
public:
// example of simple map creation
void createMap(int n);
// void updateMap();
void importMesh(std::string& filename);
public slots:
void traversors(int x);
void svg();
void updateMap();
void width(int w);
};
#endif
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DockWidget</class>
<widget class="QDockWidget" name="DockWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>209</width>
<height>418</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>250</height>
</size>
</property>
<property name="windowTitle">
<string>Interface</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<property name="enabled">
<bool>true</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>150</width>
<height>200</height>
</size>
</property>
<layout class="QGridLayout" name="gridLayout">
<property name="margin">
<number>2</number>
</property>
<property name="spacing">
<number>4</number>
</property>
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QListWidget" name="listTravers">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<item>
<property name="text">
<string>Traversor2VVaE</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2VVaF</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2EEaV</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2EEaF</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2FFaV</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2FFaE</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2FV</string>
</property>
</item>
<item>
<property name="text">
<string>Traverosr2FE</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2EV</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2EF</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2VE</string>
</property>
</item>
<item>
<property name="text">
<string>Traversor2VF</string>
</property>
</item>
</widget>
</item>
<item>
<widget class="QCheckBox" name="withBoundary">
<property name="text">
<string>with boundary</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSlider" name="widthSlider">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
<property name="value">
<number>5</number>
</property>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="svg">
<property name="text">
<string>SnapshotSVG</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>
......@@ -151,8 +151,15 @@ IF(WIN32)
# set(CMAKE_CONFIGURATION_TYPES "Release Debug" CACHE STRING "Only Release or Debug" FORCE)
ELSE(WIN32)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fPIC")
# SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers -Wsign-compare -Wtype-limits -Wuninitialized -fPIC")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Woverride-init -fPIC")
# remove the 60000+ "no unused local typedefs" warnings with GCC4.8+
if(CMAKE_COMPILER_IS_GNUCXX)
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
if (GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-local-typedefs")
endif(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
endif(CMAKE_COMPILER_IS_GNUCXX)
add_subdirectory(Release)
add_subdirectory(Debug)
add_subdirectory(${CGoGN_ROOT_DIR}/Apps Apps)
......
......@@ -56,9 +56,10 @@ else( WIN32 )
PATH_SUFFIXES cholmod/ CHOLMOD/ )
FIND_PATH( SUITESPARSE_LIBRARY_DIR
NAMES libcholmod.so
NAMES libcholmod.so libcholmod.a
PATHS /usr/lib
/usr/lib64
/usr/lib/x86_64-linux-gnu
/usr/local/lib )
ENDIF(APPLE)
......
......@@ -56,9 +56,10 @@ else( WIN32 )
PATH_SUFFIXES cholmod/ CHOLMOD/ )
FIND_PATH( SUITESPARSE_LIBRARY_DIR
NAMES libcholmod.so
NAMES libcholmod.so libcholmod.a
PATHS /usr/lib
/usr/lib64
/usr/lib64
/usr/lib/x86_64-linux-gnu
/usr/local/lib )
ENDIF(APPLE)
......
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps *
* version 0.1 *
* Copyright (C) 2009-2012, 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 *
* *
*******************************************************************************/
#ifndef __ALGO_GEOMETRY_DISTANCE_H__
#define __ALGO_GEOMETRY_DISTANCE_H__
namespace CGoGN
{
namespace Algo
{
namespace Geometry
{
/**
* compute squared distance from point to the plane of a planar face
* @param map the map
* @param d a dart of the face
* @param P the point
* @return the squared distance to tha plane
*/
template <typename PFP>
typename PFP::REAL squaredDistancePoint2FacePlane(typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& position, const VEC3& P) ;
/**
* compute squared distance from point to face (assuming face is convex)
* Algo: min distance of each subtriangle of face (not optimum ?)
* @param map the map
* @param d a dart of the face
* @param P the point
* @return the squared distance
*/
template <typename PFP>
typename PFP::REAL squaredDistancePoint2Face(typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& position, const VEC3& P) ;
/**
* compute squared distance from point to an edge
* @param map the map
* @param d a dart of the edge
* @param P the point
* @return the squared distance
*/
template <typename PFP>
typename PFP::REAL squaredDistancePoint2Edge(typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& position, const VEC3& P) ;
template <typename PFP>
bool isPlanar(typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& position);
} // namespace Geometry
} // namespace Algo
} // namespace CGoGN
#include "Algo/Geometry/distances.hpp"
#endif
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps *
* version 0.1 *
* Copyright (C) 2009-2012, 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 "Geometry/distances.h"
#include "Algo/Geometry/normal.h"
#include <limits>
namespace CGoGN
{