mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	WIP: own AABBTreeIndirect, builds up the tree 4x quicker than libigl.
This commit is contained in:
		
							parent
							
								
									abf279fc44
								
							
						
					
					
						commit
						eeb9590d28
					
				
					 3 changed files with 618 additions and 0 deletions
				
			
		|  | @ -3,6 +3,7 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME) | |||
| add_executable(${_TEST_NAME}_tests  | ||||
| 	${_TEST_NAME}_tests.cpp | ||||
| 	test_3mf.cpp | ||||
| 	test_aabbindirect.cpp | ||||
| 	test_clipper_offset.cpp | ||||
| 	test_clipper_utils.cpp | ||||
| 	test_config.cpp | ||||
|  |  | |||
							
								
								
									
										61
									
								
								tests/libslic3r/test_aabbindirect.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								tests/libslic3r/test_aabbindirect.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,61 @@ | |||
| #include <catch2/catch.hpp> | ||||
| #include <test_utils.hpp> | ||||
| 
 | ||||
| #include <libslic3r/TriangleMesh.hpp> | ||||
| #include <libslic3r/AABBTreeIndirect.hpp> | ||||
| 
 | ||||
| using namespace Slic3r; | ||||
| 
 | ||||
| TEST_CASE("Building a tree over a box, ray caster and closest query", "[AABBIndirect]") | ||||
| { | ||||
|     TriangleMesh tmesh = make_cube(1., 1., 1.); | ||||
|     tmesh.repair(); | ||||
| 
 | ||||
|     auto tree = AABBTreeIndirect::build_aabb_tree(tmesh.its.vertices, tmesh.its.indices); | ||||
|     REQUIRE(! tree.empty()); | ||||
| 
 | ||||
|     igl::Hit hit; | ||||
| 	bool intersected = AABBTreeIndirect::intersect_ray_first_hit( | ||||
| 		tmesh.its.vertices, tmesh.its.indices, | ||||
| 		tree, | ||||
| 		Vec3d(0.5, 0.5, -5.), | ||||
| 		Vec3d(0., 0., 1.), | ||||
| 		hit); | ||||
| 
 | ||||
|     REQUIRE(intersected); | ||||
|     REQUIRE(hit.t == Approx(5.)); | ||||
| 
 | ||||
|     std::vector<igl::Hit> hits; | ||||
| 	bool intersected2 = AABBTreeIndirect::intersect_ray_all_hits( | ||||
| 		tmesh.its.vertices, tmesh.its.indices, | ||||
| 		tree, | ||||
|         Vec3d(0.3, 0.5, -5.), | ||||
| 		Vec3d(0., 0., 1.), | ||||
| 		hits); | ||||
|     REQUIRE(intersected2); | ||||
|     REQUIRE(hits.size() == 2); | ||||
|     REQUIRE(hits.front().t == Approx(5.)); | ||||
|     REQUIRE(hits.back().t == Approx(6.)); | ||||
| 
 | ||||
|     size_t hit_idx; | ||||
|     Vec3d  closest_point; | ||||
|     double squared_distance = AABBTreeIndirect::squared_distance( | ||||
| 		tmesh.its.vertices, tmesh.its.indices, | ||||
| 		tree, | ||||
|         Vec3d(0.3, 0.5, -5.), | ||||
| 		hit_idx, closest_point); | ||||
|     REQUIRE(squared_distance == Approx(5. * 5.)); | ||||
|     REQUIRE(closest_point.x() == Approx(0.3)); | ||||
|     REQUIRE(closest_point.y() == Approx(0.5)); | ||||
|     REQUIRE(closest_point.z() == Approx(0.)); | ||||
| 
 | ||||
|     squared_distance = AABBTreeIndirect::squared_distance( | ||||
| 		tmesh.its.vertices, tmesh.its.indices, | ||||
| 		tree, | ||||
|         Vec3d(0.3, 0.5, 5.), | ||||
| 		hit_idx, closest_point); | ||||
|     REQUIRE(squared_distance == Approx(4. * 4.)); | ||||
|     REQUIRE(closest_point.x() == Approx(0.3)); | ||||
|     REQUIRE(closest_point.y() == Approx(0.5)); | ||||
|     REQUIRE(closest_point.z() == Approx(1.)); | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Vojtech Bubnik
						Vojtech Bubnik