| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2021-2022 INRIA | ||
| 3 | // | ||
| 4 | |||
| 5 | #ifndef COAL_SERIALIZATION_BVH_MODEL_H | ||
| 6 | #define COAL_SERIALIZATION_BVH_MODEL_H | ||
| 7 | |||
| 8 | #include "coal/BVH/BVH_model.h" | ||
| 9 | |||
| 10 | #include "coal/serialization/fwd.h" | ||
| 11 | #include "coal/serialization/BV_node.h" | ||
| 12 | #include "coal/serialization/BV_splitter.h" | ||
| 13 | #include "coal/serialization/collision_object.h" | ||
| 14 | #include "coal/serialization/memory.h" | ||
| 15 | #include "coal/serialization/triangle.h" | ||
| 16 | |||
| 17 | namespace boost { | ||
| 18 | namespace serialization { | ||
| 19 | |||
| 20 | namespace internal { | ||
| 21 | struct BVHModelBaseAccessor : coal::BVHModelBase { | ||
| 22 | typedef coal::BVHModelBase Base; | ||
| 23 | using Base::num_tris_allocated; | ||
| 24 | using Base::num_vertices_allocated; | ||
| 25 | }; | ||
| 26 | } // namespace internal | ||
| 27 | |||
| 28 | template <class Archive> | ||
| 29 | 18 | void save(Archive &ar, const coal::BVHModelBase &bvh_model, | |
| 30 | const unsigned int /*version*/) { | ||
| 31 | using namespace coal; | ||
| 32 | 36 | if (!(bvh_model.build_state == BVH_BUILD_STATE_PROCESSED || | |
| 33 |
2/8✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
|
18 | bvh_model.build_state == BVH_BUILD_STATE_UPDATED) && |
| 34 | ✗ | (bvh_model.getModelType() == BVH_MODEL_TRIANGLES)) { | |
| 35 | ✗ | COAL_THROW_PRETTY( | |
| 36 | "The BVH model is not in a BVH_BUILD_STATE_PROCESSED or " | ||
| 37 | "BVH_BUILD_STATE_UPDATED state.\n" | ||
| 38 | "The BVHModel could not be serialized.", | ||
| 39 | std::invalid_argument); | ||
| 40 | } | ||
| 41 | |||
| 42 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | ar &make_nvp( |
| 43 | "base", | ||
| 44 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | boost::serialization::base_object<coal::CollisionGeometry>(bvh_model)); |
| 45 | |||
| 46 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("num_vertices", bvh_model.num_vertices); |
| 47 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("vertices", bvh_model.vertices); |
| 48 | |||
| 49 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("num_tris", bvh_model.num_tris); |
| 50 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("tri_indices", bvh_model.tri_indices); |
| 51 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("build_state", bvh_model.build_state); |
| 52 | |||
| 53 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("prev_vertices", bvh_model.prev_vertices); |
| 54 | |||
| 55 | // if(bvh_model.convex) | ||
| 56 | // { | ||
| 57 | // const bool has_convex = true; | ||
| 58 | // ar << make_nvp("has_convex",has_convex); | ||
| 59 | // } | ||
| 60 | // else | ||
| 61 | // { | ||
| 62 | // const bool has_convex = false; | ||
| 63 | // ar << make_nvp("has_convex",has_convex); | ||
| 64 | // } | ||
| 65 | 18 | } | |
| 66 | |||
| 67 | template <class Archive> | ||
| 68 | 18 | void load(Archive &ar, coal::BVHModelBase &bvh_model, | |
| 69 | const unsigned int /*version*/) { | ||
| 70 | using namespace coal; | ||
| 71 | |||
| 72 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | ar >> make_nvp("base", |
| 73 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | boost::serialization::base_object<coal::CollisionGeometry>( |
| 74 | bvh_model)); | ||
| 75 | |||
| 76 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("num_vertices", bvh_model.num_vertices); |
| 77 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("vertices", bvh_model.vertices); |
| 78 | |||
| 79 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("num_tris", bvh_model.num_tris); |
| 80 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("tri_indices", bvh_model.tri_indices); |
| 81 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("build_state", bvh_model.build_state); |
| 82 | |||
| 83 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("prev_vertices", bvh_model.prev_vertices); |
| 84 | |||
| 85 | // bool has_convex = true; | ||
| 86 | // ar >> make_nvp("has_convex",has_convex); | ||
| 87 | 18 | } | |
| 88 | |||
| 89 | 36 | COAL_SERIALIZATION_SPLIT(coal::BVHModelBase) | |
| 90 | |||
| 91 | namespace internal { | ||
| 92 | template <typename BV> | ||
| 93 | struct BVHModelAccessor : coal::BVHModel<BV> { | ||
| 94 | typedef coal::BVHModel<BV> Base; | ||
| 95 | using Base::bvs; | ||
| 96 | using Base::num_bvs; | ||
| 97 | using Base::num_bvs_allocated; | ||
| 98 | using Base::primitive_indices; | ||
| 99 | }; | ||
| 100 | } // namespace internal | ||
| 101 | |||
| 102 | template <class Archive, typename BV> | ||
| 103 | 36 | void serialize(Archive &ar, coal::BVHModel<BV> &bvh_model, | |
| 104 | const unsigned int version) { | ||
| 105 | 36 | split_free(ar, bvh_model, version); | |
| 106 | 36 | } | |
| 107 | |||
| 108 | template <class Archive, typename BV> | ||
| 109 | 18 | void save(Archive &ar, const coal::BVHModel<BV> &bvh_model_, | |
| 110 | const unsigned int /*version*/) { | ||
| 111 | using namespace coal; | ||
| 112 | typedef internal::BVHModelAccessor<BV> Accessor; | ||
| 113 | typedef BVNode<BV> Node; | ||
| 114 | |||
| 115 | 18 | const Accessor &bvh_model = reinterpret_cast<const Accessor &>(bvh_model_); | |
| 116 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | ar &make_nvp("base", |
| 117 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | boost::serialization::base_object<BVHModelBase>(bvh_model)); |
| 118 | |||
| 119 | // if(bvh_model.primitive_indices) | ||
| 120 | // { | ||
| 121 | // const bool with_primitive_indices = true; | ||
| 122 | // ar & make_nvp("with_primitive_indices",with_primitive_indices); | ||
| 123 | // | ||
| 124 | // int num_primitives = 0; | ||
| 125 | // switch(bvh_model.getModelType()) | ||
| 126 | // { | ||
| 127 | // case BVH_MODEL_TRIANGLES: | ||
| 128 | // num_primitives = bvh_model.num_tris; | ||
| 129 | // break; | ||
| 130 | // case BVH_MODEL_POINTCLOUD: | ||
| 131 | // num_primitives = bvh_model.num_vertices; | ||
| 132 | // break; | ||
| 133 | // default: | ||
| 134 | // ; | ||
| 135 | // } | ||
| 136 | // | ||
| 137 | // ar & make_nvp("num_primitives",num_primitives); | ||
| 138 | // if(num_primitives > 0) | ||
| 139 | // { | ||
| 140 | // typedef Eigen::Matrix<unsigned int,1,Eigen::Dynamic> | ||
| 141 | // AsPrimitiveIndexVector; const Eigen::Map<const | ||
| 142 | // AsPrimitiveIndexVector> | ||
| 143 | // primitive_indices_map(reinterpret_cast<const unsigned int | ||
| 144 | // *>(bvh_model.primitive_indices),1,num_primitives); ar & | ||
| 145 | // make_nvp("primitive_indices",primitive_indices_map); | ||
| 146 | //// ar & | ||
| 147 | /// make_nvp("primitive_indices",make_array(bvh_model.primitive_indices,num_primitives)); | ||
| 148 | // } | ||
| 149 | // } | ||
| 150 | // else | ||
| 151 | // { | ||
| 152 | // const bool with_primitive_indices = false; | ||
| 153 | // ar & make_nvp("with_primitive_indices",with_primitive_indices); | ||
| 154 | // } | ||
| 155 | // | ||
| 156 | |||
| 157 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | if (bvh_model.bvs.get()) { |
| 158 | 18 | const bool with_bvs = true; | |
| 159 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("with_bvs", with_bvs); |
| 160 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar &make_nvp("num_bvs", bvh_model.num_bvs); |
| 161 |
2/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
|
18 | ar &make_nvp( |
| 162 | "bvs", | ||
| 163 | make_array( | ||
| 164 | 18 | reinterpret_cast<const char *>(bvh_model.bvs->data()), | |
| 165 | sizeof(Node) * | ||
| 166 | 18 | (std::size_t)bvh_model.num_bvs)); // Assuming BVs are POD. | |
| 167 | } else { | ||
| 168 | ✗ | const bool with_bvs = false; | |
| 169 | ✗ | ar &make_nvp("with_bvs", with_bvs); | |
| 170 | } | ||
| 171 | 18 | } | |
| 172 | |||
| 173 | template <class Archive, typename BV> | ||
| 174 | 18 | void load(Archive &ar, coal::BVHModel<BV> &bvh_model_, | |
| 175 | const unsigned int /*version*/) { | ||
| 176 | using namespace coal; | ||
| 177 | typedef internal::BVHModelAccessor<BV> Accessor; | ||
| 178 | typedef BVNode<BV> Node; | ||
| 179 | |||
| 180 | 18 | Accessor &bvh_model = reinterpret_cast<Accessor &>(bvh_model_); | |
| 181 | |||
| 182 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | ar >> make_nvp("base", |
| 183 |
1/2✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
|
18 | boost::serialization::base_object<BVHModelBase>(bvh_model)); |
| 184 | |||
| 185 | // bool with_primitive_indices; | ||
| 186 | // ar >> make_nvp("with_primitive_indices",with_primitive_indices); | ||
| 187 | // if(with_primitive_indices) | ||
| 188 | // { | ||
| 189 | // int num_primitives; | ||
| 190 | // ar >> make_nvp("num_primitives",num_primitives); | ||
| 191 | // | ||
| 192 | // delete[] bvh_model.primitive_indices; | ||
| 193 | // if(num_primitives > 0) | ||
| 194 | // { | ||
| 195 | // bvh_model.primitive_indices = new unsigned int[num_primitives]; | ||
| 196 | // ar & | ||
| 197 | // make_nvp("primitive_indices",make_array(bvh_model.primitive_indices,num_primitives)); | ||
| 198 | // } | ||
| 199 | // else | ||
| 200 | // bvh_model.primitive_indices = NULL; | ||
| 201 | // } | ||
| 202 | |||
| 203 | bool with_bvs; | ||
| 204 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("with_bvs", with_bvs); |
| 205 |
1/2✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
|
18 | if (with_bvs) { |
| 206 | unsigned int num_bvs; | ||
| 207 |
1/2✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
|
18 | ar >> make_nvp("num_bvs", num_bvs); |
| 208 | |||
| 209 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 5 times.
|
18 | if (num_bvs != bvh_model.num_bvs) { |
| 210 | 8 | bvh_model.bvs.reset(); | |
| 211 | 8 | bvh_model.num_bvs = num_bvs; | |
| 212 |
1/2✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
|
8 | if (num_bvs > 0) |
| 213 |
3/8✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
8 | bvh_model.bvs.reset(new |
| 214 | typename BVHModel<BV>::bv_node_vector_t(num_bvs)); | ||
| 215 | } | ||
| 216 |
1/2✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
|
18 | if (num_bvs > 0) { |
| 217 |
2/4✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
|
18 | ar >> make_nvp("bvs", |
| 218 | 18 | make_array(reinterpret_cast<char *>(bvh_model.bvs->data()), | |
| 219 | 18 | sizeof(Node) * (std::size_t)num_bvs)); | |
| 220 | } else | ||
| 221 | ✗ | bvh_model.bvs.reset(); | |
| 222 | } | ||
| 223 | 18 | } | |
| 224 | |||
| 225 | } // namespace serialization | ||
| 226 | } // namespace boost | ||
| 227 | |||
| 228 | namespace coal { | ||
| 229 | |||
| 230 | namespace internal { | ||
| 231 | template <typename BV> | ||
| 232 | struct memory_footprint_evaluator<::coal::BVHModel<BV>> { | ||
| 233 | 3 | static size_t run(const ::coal::BVHModel<BV> &bvh_model) { | |
| 234 | 3 | return static_cast<size_t>(bvh_model.memUsage(false)); | |
| 235 | } | ||
| 236 | }; | ||
| 237 | } // namespace internal | ||
| 238 | |||
| 239 | } // namespace coal | ||
| 240 | |||
| 241 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::AABB>) | |
| 242 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::OBB>) | |
| 243 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::RSS>) | |
| 244 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::OBBRSS>) | |
| 245 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::kIOS>) | |
| 246 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::KDOP<16>>) | |
| 247 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::KDOP<18>>) | |
| 248 | 36 | COAL_SERIALIZATION_DECLARE_EXPORT(::coal::BVHModel<::coal::KDOP<24>>) | |
| 249 | |||
| 250 | #endif // ifndef COAL_SERIALIZATION_BVH_MODEL_H | ||
| 251 |