Merge branch 'mesh_property_initialization' into 'master'

Mesh property initialization

See merge request OpenMesh/OpenMesh!283
This commit is contained in:
Jan Möbius
2020-10-14 10:43:43 +02:00
2 changed files with 17 additions and 4 deletions

View File

@@ -85,14 +85,17 @@ class PropertyManager {
private: private:
// Mesh properties (MPropHandleT<...>) are stored differently than the other properties. // Mesh properties (MPropHandleT<...>) are stored differently than the other properties.
// This class implements different behavior when copying or swapping data from one // This class implements different behavior when initializing a property or when
// property manager to a another one. // copying or swapping data from one property manager to a another one.
template <typename PropertyManager2, typename PropHandleT> template <typename PropertyManager2, typename PropHandleT>
struct StorageT; struct StorageT;
// specialization for Mesh Properties // specialization for Mesh Properties
template <typename PropertyManager2> template <typename PropertyManager2>
struct StorageT<PropertyManager2, MPropHandleT<Value>> { struct StorageT<PropertyManager2, MPropHandleT<Value>> {
static void initialize(PropertyManager<PROPTYPE, MeshT>& pm, const Value& initial_value ) {
pm() = initial_value;
}
static void copy(const PropertyManager<PROPTYPE, MeshT>& from, PropertyManager2& to) { static void copy(const PropertyManager<PROPTYPE, MeshT>& from, PropertyManager2& to) {
*to = *from; *to = *from;
} }
@@ -110,6 +113,9 @@ class PropertyManager {
// definition for other Mesh Properties // definition for other Mesh Properties
template <typename PropertyManager2, typename PropHandleT> template <typename PropertyManager2, typename PropHandleT>
struct StorageT { struct StorageT {
static void initialize(PropertyManager<PROPTYPE, MeshT>& pm, const Value& initial_value ) {
pm.set_range(pm.mesh_.template all_elements<Handle>(), initial_value);
}
static void copy(const PropertyManager& from, PropertyManager2& to) { static void copy(const PropertyManager& from, PropertyManager2& to) {
from.copy_to(from.mesh_.template all_elements<Handle>(), to, to.mesh_.template all_elements<Handle>()); from.copy_to(from.mesh_.template all_elements<Handle>(), to, to.mesh_.template all_elements<Handle>());
} }
@@ -190,7 +196,7 @@ class PropertyManager {
PropertyManager(const Value& initial_value, PolyConnectivity& mesh, const char *propname) : mesh_(mesh), retain_(true), name_(propname) { PropertyManager(const Value& initial_value, PolyConnectivity& mesh, const char *propname) : mesh_(mesh), retain_(true), name_(propname) {
if (!mesh_.get_property_handle(prop_, propname)) { if (!mesh_.get_property_handle(prop_, propname)) {
PropertyManager::mesh().add_property(prop_, propname); PropertyManager::mesh().add_property(prop_, propname);
set_range(mesh_.all_elements<Handle>(), initial_value); Storage::initialize(*this, initial_value);
} }
} }
@@ -215,7 +221,7 @@ class PropertyManager {
*/ */
PropertyManager(const Value& initial_value, const PolyConnectivity& mesh) : mesh_(mesh), retain_(false), name_("") { PropertyManager(const Value& initial_value, const PolyConnectivity& mesh) : mesh_(mesh), retain_(false), name_("") {
PropertyManager::mesh().add_property(prop_, name_); PropertyManager::mesh().add_property(prop_, name_);
set_range(mesh_.all_elements<Handle>(), initial_value); Storage::initialize(*this, initial_value);
} }
/** /**

View File

@@ -870,5 +870,12 @@ TEST_F(OpenMeshPropertyManager, return_property_from_function) {
} }
TEST_F(OpenMeshPropertyManager, mesh_property_initialization) {
OpenMesh::MProp<int> mesh_id(13, mesh_);
ASSERT_EQ(mesh_id(), 13);
}
} }