#pragma once #include "trimeshsdfalgorithm.h" #include "ConvexUmbrellaTriMeshSdfAlgorithm.h" #include "PseudoNormalSdfAlgo.h" #include "SdfAlgoFactory.h" namespace SDF { //--------------------------------- // This is mainly a diagnostic tool //--------------------------------- class CUvsPN_CompareSdfAlgo : public TriMeshSdfAlgorithm { private: ConvexUmbrellaTriMeshSdfAlgorithm *cu_algo; PseudoNormalSdfAlgo *pn_algo; Point test_pt; public: CUvsPN_CompareSdfAlgo(void) : cu_algo(new ConvexUmbrellaTriMeshSdfAlgorithm()) , pn_algo(new PseudoNormalSdfAlgo()) { } ~CUvsPN_CompareSdfAlgo(void) { delete cu_algo; delete pn_algo; } virtual void start_new_computation(const Point &test_pt) { cu_algo->start_new_computation(test_pt); pn_algo->start_new_computation(test_pt); this->test_pt = test_pt; } virtual void feed_triangle(const MeshTriangle &tri) { cu_algo->feed_triangle(tri); pn_algo->feed_triangle(tri); } virtual SdfValue compute_sdf_result() { SdfValue cu_val = cu_algo->compute_sdf_result(); SdfValue pn_val = pn_algo->compute_sdf_result(); // Print stuff depending on their results compared if(cu_val.dist_class != pn_val.dist_class) { cout << "\n** Disagreement. CU: " << cu_val.dist_class << " PN: " << pn_val.dist_class << endl; cout << "\ttest pt: " << this->test_pt; } // Use the pn val return pn_val; } }; //--------------------------------- // The factory //--------------------------------- class CUvsPN_SdfAlgoFactory : public SdfAlgoFactory { virtual TriMeshSdfAlgorithm *create() { return new CUvsPN_CompareSdfAlgo(); } }; }