Merge branch 'lyonm/custom-property-writing' of https://www.graphics.rwth-aachen.de:9000/OpenMesh/OpenMesh into lyonm/custom-property-writing
This commit is contained in:
@@ -1,29 +1,135 @@
|
||||
include (VCICommon)
|
||||
|
||||
include_directories (
|
||||
../..
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
set ( headers
|
||||
Geometry/Config.hh
|
||||
Geometry/EigenVectorT.hh
|
||||
Geometry/LoopSchemeMaskT.hh
|
||||
Geometry/MathDefs.hh
|
||||
Geometry/NormalConeT.hh
|
||||
Geometry/NormalConeT_impl.hh
|
||||
Geometry/Plane3d.hh
|
||||
Geometry/QuadricT.hh
|
||||
Geometry/Vector11T.hh
|
||||
Geometry/VectorT.hh
|
||||
Geometry/VectorT_inc.hh
|
||||
IO/BinaryHelper.hh
|
||||
IO/IOInstances.hh
|
||||
IO/IOManager.hh
|
||||
IO/MeshIO.hh
|
||||
IO/OFFFormat.hh
|
||||
IO/OMFormat.hh
|
||||
IO/OMFormatT_impl.hh
|
||||
IO/Options.hh
|
||||
IO/SR_binary.hh
|
||||
IO/SR_binary_spec.hh
|
||||
IO/SR_binary_vector_of_bool.hh
|
||||
IO/SR_rbo.hh
|
||||
IO/SR_store.hh
|
||||
IO/SR_types.hh
|
||||
IO/StoreRestore.hh
|
||||
IO/exporter/BaseExporter.hh
|
||||
IO/exporter/ExporterT.hh
|
||||
IO/importer/BaseImporter.hh
|
||||
IO/importer/ImporterT.hh
|
||||
IO/reader/BaseReader.hh
|
||||
IO/reader/OBJReader.hh
|
||||
IO/reader/OFFReader.hh
|
||||
IO/reader/OMReader.hh
|
||||
IO/reader/PLYReader.hh
|
||||
IO/reader/STLReader.hh
|
||||
IO/writer/BaseWriter.hh
|
||||
IO/writer/OBJWriter.hh
|
||||
IO/writer/OFFWriter.hh
|
||||
IO/writer/OMWriter.hh
|
||||
IO/writer/PLYWriter.hh
|
||||
IO/writer/STLWriter.hh
|
||||
IO/writer/VTKWriter.hh
|
||||
Mesh/ArrayItems.hh
|
||||
Mesh/ArrayKernel.hh
|
||||
Mesh/ArrayKernelT_impl.hh
|
||||
Mesh/AttribKernelT.hh
|
||||
Mesh/Attributes.hh
|
||||
Mesh/BaseKernel.hh
|
||||
Mesh/BaseMesh.hh
|
||||
Mesh/Casts.hh
|
||||
Mesh/CirculatorsT.hh
|
||||
Mesh/DefaultPolyMesh.hh
|
||||
Mesh/DefaultTriMesh.hh
|
||||
Mesh/FinalMeshItemsT.hh
|
||||
Mesh/Handles.hh
|
||||
Mesh/IteratorsT.hh
|
||||
Mesh/PolyConnectivity.hh
|
||||
Mesh/PolyConnectivity_inline_impl.hh
|
||||
Mesh/PolyMeshT.hh
|
||||
Mesh/PolyMeshT_impl.hh
|
||||
Mesh/PolyMesh_ArrayKernelT.hh
|
||||
Mesh/SmartHandles.hh
|
||||
Mesh/SmartRange.hh
|
||||
Mesh/Status.hh
|
||||
Mesh/Tags.hh
|
||||
Mesh/Traits.hh
|
||||
Mesh/TriConnectivity.hh
|
||||
Mesh/TriMeshT.hh
|
||||
Mesh/TriMeshT_impl.hh
|
||||
Mesh/TriMesh_ArrayKernelT.hh
|
||||
Mesh/gen/circulators_header.hh
|
||||
Mesh/gen/circulators_template.hh
|
||||
Mesh/gen/footer.hh
|
||||
Mesh/gen/iterators_header.hh
|
||||
Mesh/gen/iterators_template.hh
|
||||
System/OpenMeshDLLMacros.hh
|
||||
System/compiler.hh
|
||||
System/config.hh
|
||||
System/mostream.hh
|
||||
System/omstream.hh
|
||||
Utils/AutoPropertyHandleT.hh
|
||||
Utils/BaseProperty.hh
|
||||
Utils/Endian.hh
|
||||
Utils/GenProg.hh
|
||||
Utils/HandleToPropHandle.hh
|
||||
Utils/Noncopyable.hh
|
||||
Utils/Predicates.hh
|
||||
Utils/Property.hh
|
||||
Utils/PropertyContainer.hh
|
||||
Utils/PropertyCreator.hh
|
||||
Utils/PropertyManager.hh
|
||||
Utils/RandomNumberGenerator.hh
|
||||
Utils/SingletonT.hh
|
||||
Utils/SingletonT_impl.hh
|
||||
Utils/color_cast.hh
|
||||
Utils/typename.hh
|
||||
Utils/vector_cast.hh
|
||||
Utils/vector_traits.hh
|
||||
)
|
||||
|
||||
# source code directories
|
||||
set (directories
|
||||
.
|
||||
Geometry
|
||||
IO
|
||||
IO/exporter
|
||||
IO/importer
|
||||
IO/reader
|
||||
IO/writer
|
||||
Mesh
|
||||
Mesh/gen
|
||||
System
|
||||
Utils
|
||||
set ( sources
|
||||
IO/BinaryHelper.cc
|
||||
IO/IOManager.cc
|
||||
IO/OMFormat.cc
|
||||
IO/reader/BaseReader.cc
|
||||
IO/reader/OBJReader.cc
|
||||
IO/reader/OFFReader.cc
|
||||
IO/reader/OMReader.cc
|
||||
IO/reader/PLYReader.cc
|
||||
IO/reader/STLReader.cc
|
||||
IO/writer/BaseWriter.cc
|
||||
IO/writer/OBJWriter.cc
|
||||
IO/writer/OFFWriter.cc
|
||||
IO/writer/OMWriter.cc
|
||||
IO/writer/PLYWriter.cc
|
||||
IO/writer/STLWriter.cc
|
||||
IO/writer/VTKWriter.cc
|
||||
Mesh/ArrayKernel.cc
|
||||
Mesh/BaseKernel.cc
|
||||
Mesh/PolyConnectivity.cc
|
||||
Mesh/TriConnectivity.cc
|
||||
System/omstream.cc
|
||||
Utils/BaseProperty.cc
|
||||
Utils/Endian.cc
|
||||
Utils/PropertyCreator.cc
|
||||
Utils/RandomNumberGenerator.cc
|
||||
)
|
||||
|
||||
# collect all header and source files
|
||||
vci_append_files (headers "*.hh" ${directories})
|
||||
vci_append_files (sources "*.cc" ${directories})
|
||||
|
||||
# Disable Library installation when not building OpenMesh on its own but as part of another project!
|
||||
if ( NOT ${CMAKE_PROJECT_NAME} MATCHES "OpenMesh")
|
||||
set(VCI_NO_LIBRARY_INSTALL true)
|
||||
@@ -36,12 +142,25 @@ if (WIN32)
|
||||
add_definitions( -DOPENMESHDLL -DBUILDOPENMESHDLL)
|
||||
vci_add_library (OpenMeshCore SHARED ${sources} ${headers})
|
||||
else()
|
||||
# OpenMesh has no dll exports so we have to build a static library on windows
|
||||
vci_add_library (OpenMeshCore STATIC ${sources} ${headers})
|
||||
endif()
|
||||
|
||||
target_include_directories(OpenMeshCore PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../..>
|
||||
$<INSTALL_INTERFACE:include>)
|
||||
|
||||
|
||||
else ()
|
||||
vci_add_library (OpenMeshCore SHAREDANDSTATIC ${sources} ${headers})
|
||||
|
||||
target_include_directories(OpenMeshCore PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../..>
|
||||
$<INSTALL_INTERFACE:include>)
|
||||
|
||||
target_include_directories(OpenMeshCoreStatic PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../..>
|
||||
$<INSTALL_INTERFACE:include>)
|
||||
|
||||
set_target_properties (OpenMeshCore PROPERTIES VERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
||||
SOVERSION ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} )
|
||||
endif ()
|
||||
@@ -53,18 +172,10 @@ endif ()
|
||||
# Add core as dependency before fixbundle
|
||||
if ( (${CMAKE_PROJECT_NAME} MATCHES "OpenMesh") AND BUILD_APPS )
|
||||
|
||||
if ( WIN32 )
|
||||
if ( NOT "${CMAKE_GENERATOR}" MATCHES "MinGW Makefiles" )
|
||||
if ( APPLE OR (WIN32 AND NOT "${CMAKE_GENERATOR}" MATCHES "MinGW Makefiles" ) )
|
||||
add_dependencies (fixbundle OpenMeshCore)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add core as dependency before fixbundle
|
||||
if ( APPLE )
|
||||
# let bundle generation depend on targets
|
||||
add_dependencies (fixbundle OpenMeshCore)
|
||||
endif ()
|
||||
|
||||
endif()
|
||||
|
||||
# if we build debug and release in the same dir, we want to install both!
|
||||
@@ -126,25 +237,8 @@ install(DIRECTORY .
|
||||
#install the config file
|
||||
install(FILES System/config.h DESTINATION include/OpenMesh/Core/System)
|
||||
|
||||
#install inlined Files from IO
|
||||
install(DIRECTORY IO/
|
||||
DESTINATION include/OpenMesh/Core/IO
|
||||
FILES_MATCHING
|
||||
PATTERN "*.inl"
|
||||
PATTERN "CVS" EXCLUDE
|
||||
PATTERN ".svn" EXCLUDE
|
||||
PATTERN "reader" EXCLUDE
|
||||
PATTERN "writer" EXCLUDE
|
||||
PATTERN "importer" EXCLUDE
|
||||
PATTERN "exporter" EXCLUDE
|
||||
PATTERN "tmp" EXCLUDE
|
||||
PATTERN "Debian*" EXCLUDE )
|
||||
endif ()
|
||||
|
||||
target_include_directories(OpenMeshCore PUBLIC
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../..>
|
||||
$<INSTALL_INTERFACE:include>)
|
||||
|
||||
install(TARGETS OpenMeshCore EXPORT OpenMeshConfig
|
||||
ARCHIVE DESTINATION ${VCI_PROJECT_LIBDIR}
|
||||
LIBRARY DESTINATION ${VCI_PROJECT_LIBDIR}
|
||||
|
||||
@@ -51,6 +51,7 @@
|
||||
|
||||
// OpenMesh
|
||||
#include <OpenMesh/Core/System/config.h>
|
||||
#include <string>
|
||||
|
||||
|
||||
//== NAMESPACES ==============================================================
|
||||
@@ -115,31 +116,24 @@ public:
|
||||
TexCoordST = 0x8000 ///< Write texture coordinates as ST instead of UV
|
||||
};
|
||||
|
||||
/// Texture filename. This will be written as
|
||||
/// map_Kd in the OBJ writer into the material file.
|
||||
std::string texture_file ;
|
||||
|
||||
/// Filename extension for material files when writing OBJs
|
||||
/// default is currently .mat
|
||||
std::string material_file_extension;
|
||||
|
||||
public:
|
||||
|
||||
/// Default constructor
|
||||
Options() : flags_( Default )
|
||||
Options() : texture_file(""), material_file_extension(".mat"), flags_( Default )
|
||||
{ }
|
||||
|
||||
|
||||
/// Copy constructor
|
||||
Options(const Options& _opt) : flags_(_opt.flags_)
|
||||
{ }
|
||||
|
||||
|
||||
/// Initializing constructor setting a single option
|
||||
Options(Flag _flg) : flags_( _flg)
|
||||
{ }
|
||||
|
||||
|
||||
/// Initializing constructor setting multiple options
|
||||
/// Initializing constructor setting multiple options
|
||||
Options(const value_type _flgs) : flags_( _flgs)
|
||||
{ }
|
||||
|
||||
|
||||
~Options()
|
||||
{ }
|
||||
|
||||
/// Restore state after default constructor.
|
||||
void cleanup(void)
|
||||
{ flags_ = Default; }
|
||||
@@ -154,17 +148,9 @@ public:
|
||||
public:
|
||||
|
||||
|
||||
//@{
|
||||
/// Copy options defined in _rhs.
|
||||
|
||||
Options& operator = ( const Options& _rhs )
|
||||
{ flags_ = _rhs.flags_; return *this; }
|
||||
|
||||
Options& operator = ( const value_type _rhs )
|
||||
{ flags_ = _rhs; return *this; }
|
||||
|
||||
//@}
|
||||
|
||||
|
||||
//@{
|
||||
/// Unset options defined in _rhs.
|
||||
|
||||
@@ -330,7 +330,7 @@ struct binary< std::vector< T >, typename std::enable_if<std::is_default_constru
|
||||
typedef typename value_type::value_type elem_type;
|
||||
|
||||
static const bool is_streamable = binary<T>::is_streamable;
|
||||
static size_t size_of(bool _store_size = true)
|
||||
static size_t size_of(bool /*_store_size*/ = true)
|
||||
{ return IO::UnknownSize; }
|
||||
|
||||
static size_t size_of(const value_type& _v, bool _store_size = true)
|
||||
@@ -424,7 +424,7 @@ struct binary< std::vector< T >, typename std::enable_if<std::is_default_constru
|
||||
}
|
||||
};
|
||||
|
||||
#include <OpenMesh/Core/IO/SR_binary_vector_of_bool.inl>
|
||||
#include <OpenMesh/Core/IO/SR_binary_vector_of_bool.hh>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ template <> struct binary< std::vector<bool> >
|
||||
|
||||
static const bool is_streamable = true;
|
||||
|
||||
static size_t size_of(bool _store_size = true) { return UnknownSize; }
|
||||
static size_t size_of(bool /*_store_size*/ = true) { return UnknownSize; }
|
||||
static size_t size_of(const value_type& _v, bool _store_size = true)
|
||||
{
|
||||
size_t size = _v.size() / 8 + ((_v.size() % 8)!=0);
|
||||
@@ -406,7 +406,8 @@ bool _OMReader_::read_binary_vertex_chunk(std::istream &_is, BaseImporter &_bi,
|
||||
{
|
||||
Chunk::PropertyName property_type;
|
||||
bytes_ += restore(_is, property_type, _swap);
|
||||
add_generic_property(property_type, _bi);
|
||||
if (_opt.check(Options::Custom))
|
||||
add_generic_property(property_type, _bi);
|
||||
}
|
||||
|
||||
bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_vprop(property_name_), header_.n_vertices_, _swap);
|
||||
@@ -563,7 +564,8 @@ bool _OMReader_::read_binary_face_chunk(std::istream &_is, BaseImporter &_bi, Op
|
||||
{
|
||||
Chunk::PropertyName property_type;
|
||||
bytes_ += restore(_is, property_type, _swap);
|
||||
add_generic_property(property_type, _bi);
|
||||
if (_opt.check(Options::Custom))
|
||||
add_generic_property(property_type, _bi);
|
||||
}
|
||||
|
||||
bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_fprop(property_name_), header_.n_faces_, _swap);
|
||||
@@ -604,7 +606,8 @@ bool _OMReader_::read_binary_edge_chunk(std::istream &_is, BaseImporter &_bi, Op
|
||||
{
|
||||
Chunk::PropertyName property_type;
|
||||
bytes_ += restore(_is, property_type, _swap);
|
||||
add_generic_property(property_type, _bi);
|
||||
if (_opt.check(Options::Custom))
|
||||
add_generic_property(property_type, _bi);
|
||||
}
|
||||
|
||||
bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_eprop(property_name_), header_.n_edges_, _swap);
|
||||
@@ -654,7 +657,8 @@ bool _OMReader_::read_binary_halfedge_chunk(std::istream &_is, BaseImporter &_bi
|
||||
{
|
||||
Chunk::PropertyName property_type;
|
||||
bytes_ += restore(_is, property_type, _swap);
|
||||
add_generic_property(property_type, _bi);
|
||||
if (_opt.check(Options::Custom))
|
||||
add_generic_property(property_type, _bi);
|
||||
}
|
||||
|
||||
bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_hprop(property_name_), 2 * header_.n_edges_, _swap);
|
||||
@@ -689,7 +693,7 @@ bool _OMReader_::read_binary_halfedge_chunk(std::istream &_is, BaseImporter &_bi
|
||||
{
|
||||
int next_id_0 = -1;
|
||||
int to_vertex_id_0 = -1;
|
||||
int face_id_0 = -1;
|
||||
int face_id_0 = -1;
|
||||
bytes_ += restore( _is, next_id_0, OMFormat::Chunk::Integer_Size(chunk_header_.bits_), _swap );
|
||||
bytes_ += restore( _is, to_vertex_id_0, OMFormat::Chunk::Integer_Size(chunk_header_.bits_), _swap );
|
||||
bytes_ += restore( _is, face_id_0, OMFormat::Chunk::Integer_Size(chunk_header_.bits_), _swap );
|
||||
@@ -745,7 +749,7 @@ bool _OMReader_::read_binary_halfedge_chunk(std::istream &_is, BaseImporter &_bi
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
bool _OMReader_::read_binary_mesh_chunk(std::istream &_is, BaseImporter &_bi, Options & /* _opt */, bool _swap) const
|
||||
bool _OMReader_::read_binary_mesh_chunk(std::istream &_is, BaseImporter &_bi, Options& _opt , bool _swap) const
|
||||
{
|
||||
using OMFormat::Chunk;
|
||||
|
||||
@@ -760,7 +764,8 @@ bool _OMReader_::read_binary_mesh_chunk(std::istream &_is, BaseImporter &_bi, Op
|
||||
{
|
||||
Chunk::PropertyName property_type;
|
||||
bytes_ += restore(_is, property_type, _swap);
|
||||
add_generic_property(property_type, _bi);
|
||||
if (_opt.check(Options::Custom))
|
||||
add_generic_property(property_type, _bi);
|
||||
}
|
||||
|
||||
bytes_ += restore_binary_custom_data(_is, _bi.kernel()->_get_mprop(property_name_), 1, _swap);
|
||||
|
||||
@@ -130,26 +130,31 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt, std::stream
|
||||
|
||||
size_t _OBJWriter_::getMaterial(OpenMesh::Vec3f _color) const
|
||||
{
|
||||
for (size_t i=0; i < material_.size(); i++)
|
||||
if(material_[i] == _color)
|
||||
return i;
|
||||
auto idx_it = material_idx_.find(_color);
|
||||
if (idx_it != material_idx_.end()) {
|
||||
return idx_it->second;
|
||||
} else {
|
||||
size_t idx = material_.size();
|
||||
material_.push_back(_color);
|
||||
material_idx_[_color] = idx;
|
||||
|
||||
//not found add new material
|
||||
material_.push_back( _color );
|
||||
return material_.size()-1;
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
size_t _OBJWriter_::getMaterial(OpenMesh::Vec4f _color) const
|
||||
{
|
||||
for (size_t i=0; i < materialA_.size(); i++)
|
||||
if(materialA_[i] == _color)
|
||||
return i;
|
||||
|
||||
//not found add new material
|
||||
materialA_.push_back( _color );
|
||||
return materialA_.size()-1;
|
||||
auto idx_it = materialA_idx_.find(_color);
|
||||
if (idx_it != materialA_idx_.end()) {
|
||||
return idx_it->second;
|
||||
} else {
|
||||
size_t idx = materialA_.size();
|
||||
materialA_.push_back(_color);
|
||||
materialA_idx_[_color] = idx;
|
||||
return idx;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
@@ -162,7 +167,9 @@ writeMaterial(std::ostream& _out, BaseExporter& _be, Options _opt) const
|
||||
OpenMesh::Vec4f cA;
|
||||
|
||||
material_.clear();
|
||||
material_idx_.clear();
|
||||
materialA_.clear();
|
||||
materialA_idx_.clear();
|
||||
|
||||
//iterate over faces
|
||||
for (size_t i=0, nF=_be.n_faces(); i<nF; ++i)
|
||||
@@ -195,6 +202,9 @@ writeMaterial(std::ostream& _out, BaseExporter& _be, Options _opt) const
|
||||
_out << "illum 1" << '\n';
|
||||
}
|
||||
|
||||
if (_opt.texture_file != "") {
|
||||
_out << "map_Kd " << _opt.texture_file << std::endl;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -219,8 +229,10 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _prec
|
||||
_out.precision(_precision);
|
||||
|
||||
// check exporter features
|
||||
if (!check( _be, _opt))
|
||||
return false;
|
||||
if (!check( _be, _opt)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// No binary mode for OBJ
|
||||
if ( _opt.check(Options::Binary) ) {
|
||||
@@ -240,9 +252,9 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _prec
|
||||
}
|
||||
|
||||
//create material file if needed
|
||||
if ( _opt.check(Options::FaceColor) ){
|
||||
if ( _opt.check(Options::FaceColor) || _opt.texture_file != ""){
|
||||
|
||||
std::string matFile = path_ + objName_ + ".mat";
|
||||
std::string matFile = path_ + objName_ + _opt.material_file_extension;
|
||||
|
||||
std::fstream matStream(matFile.c_str(), std::ios_base::out );
|
||||
|
||||
@@ -262,8 +274,8 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _prec
|
||||
_out << _be.n_faces() << " faces" << '\n';
|
||||
|
||||
// material file
|
||||
if (useMatrial && _opt.check(Options::FaceColor) )
|
||||
_out << "mtllib " << objName_ << ".mat" << '\n';
|
||||
if ( (useMatrial && _opt.check(Options::FaceColor)) || _opt.texture_file != "")
|
||||
_out << "mtllib " << objName_ << _opt.material_file_extension << '\n';
|
||||
|
||||
std::map<Vec2f,int> texMap;
|
||||
//collect Texturevertices from halfedges
|
||||
@@ -387,7 +399,9 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _prec
|
||||
}
|
||||
|
||||
material_.clear();
|
||||
material_idx_.clear();
|
||||
materialA_.clear();
|
||||
materialA_idx_.clear();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -103,7 +103,9 @@ private:
|
||||
mutable std::string objName_;
|
||||
|
||||
mutable std::vector< OpenMesh::Vec3f > material_;
|
||||
mutable std::map< OpenMesh::Vec3f, size_t> material_idx_;
|
||||
mutable std::vector< OpenMesh::Vec4f > materialA_;
|
||||
mutable std::map< OpenMesh::Vec4f, size_t> materialA_idx_;
|
||||
|
||||
size_t getMaterial(OpenMesh::Vec3f _color) const;
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ private:
|
||||
writeValue(_type, _out, _value);
|
||||
}
|
||||
template<typename T>
|
||||
void writeProxy(ValueType _type, std::ostream& _out, T _value, OpenMesh::GenProg::FalseType /*_binary*/) const
|
||||
void writeProxy(ValueType /*_type*/, std::ostream& _out, T _value, OpenMesh::GenProg::FalseType /*_binary*/) const
|
||||
{
|
||||
_out << " " << _value;
|
||||
}
|
||||
|
||||
@@ -456,13 +456,7 @@ public:
|
||||
}
|
||||
|
||||
/// calculated and returns the average of the two vertex normals
|
||||
Normal calc_normal(EdgeHandle _eh) const
|
||||
{
|
||||
HalfedgeHandle _heh = this->halfedge_handle(_eh, 0);
|
||||
VertexHandle vh0 = this->from_vertex_handle(_heh);
|
||||
VertexHandle vh1 = this->to_vertex_handle(_heh);
|
||||
return 0.5 * (this->calc_normal(vh0) + this->calc_normal(vh1));
|
||||
}
|
||||
Normal calc_normal(EdgeHandle _eh) const;
|
||||
|
||||
/** defines a consistent representation of a sector geometry:
|
||||
the halfedge _in_heh defines the sector orientation
|
||||
|
||||
@@ -109,7 +109,7 @@ PolyMeshT<Kernel>::calc_face_normal_impl(FaceHandle _fh, PointIs3DTag) const
|
||||
{
|
||||
assert(this->halfedge_handle(_fh).is_valid());
|
||||
ConstFaceVertexIter fv_it(this->cfv_iter(_fh));
|
||||
|
||||
|
||||
// Safeguard for 1-gons
|
||||
if (!(++fv_it).is_valid()) return Normal(0, 0, 0);
|
||||
|
||||
@@ -140,7 +140,7 @@ PolyMeshT<Kernel>::calc_face_normal_impl(FaceHandle _fh, PointIs3DTag) const
|
||||
}
|
||||
|
||||
const typename vector_traits<Normal>::value_type length = norm(n);
|
||||
|
||||
|
||||
// The expression ((n *= (1.0/norm)),n) is used because the OpenSG
|
||||
// vector class does not return self after component-wise
|
||||
// self-multiplication with a scalar!!!
|
||||
@@ -401,8 +401,8 @@ calc_halfedge_normal(HalfedgeHandle _heh, const double _feature_angle) const
|
||||
}
|
||||
|
||||
Normal n(0,0,0);
|
||||
for(unsigned int i=0; i<fhs.size(); ++i)
|
||||
n += Kernel::normal(fhs[i]);
|
||||
for (unsigned int i = 0; i < fhs.size(); ++i)
|
||||
n += Kernel::has_face_normals() ? Kernel::normal(fhs[i]) : calc_face_normal(fhs[i]);
|
||||
|
||||
return normalize(n);
|
||||
}
|
||||
@@ -424,6 +424,28 @@ calc_normal(HalfedgeHandle _heh, const double _feature_angle) const
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
template <class Kernel>
|
||||
typename PolyMeshT<Kernel>::Normal
|
||||
PolyMeshT<Kernel>::
|
||||
calc_normal(EdgeHandle _eh) const
|
||||
{
|
||||
Normal n(0);
|
||||
for (int i = 0; i < 2; ++i)
|
||||
{
|
||||
const auto heh = this->halfedge_handle(_eh, i);
|
||||
const auto fh = this->face_handle(heh);
|
||||
if (fh.is_valid())
|
||||
n += calc_normal(fh);
|
||||
}
|
||||
const auto length = norm(n);
|
||||
if (length != 0)
|
||||
n /= length;
|
||||
return n;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
template <class Kernel>
|
||||
bool
|
||||
PolyMeshT<Kernel>::
|
||||
@@ -444,8 +466,8 @@ is_estimated_feature_edge(HalfedgeHandle _heh, const double _feature_angle) cons
|
||||
FaceHandle fh0 = Kernel::face_handle(_heh);
|
||||
FaceHandle fh1 = Kernel::face_handle(Kernel::opposite_halfedge_handle(_heh));
|
||||
|
||||
Normal fn0 = Kernel::normal(fh0);
|
||||
Normal fn1 = Kernel::normal(fh1);
|
||||
Normal fn0 = Kernel::has_face_normals() ? Kernel::normal(fh0) : calc_face_normal(fh0);
|
||||
Normal fn1 = Kernel::has_face_normals() ? Kernel::normal(fh1) : calc_face_normal(fh1);
|
||||
|
||||
// dihedral angle above angle threshold
|
||||
return ( dot(fn0,fn1) < cos(_feature_angle) );
|
||||
|
||||
Reference in New Issue
Block a user