| 
						
						
							
								
							
						
						
					 | 
					@ -105,12 +105,93 @@ typedef struct _node_t { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} node_t; | 
					 | 
					 | 
					} node_t; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					const raw_vector3d_t operator+(const raw_vector3d_t& point1, const raw_vector3d_t& point2) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.x = point1.x + point2.x; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.y = point1.y + point2.y; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.z = point1.z + point2.z; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					const raw_vector3d_t operator-(const raw_vector3d_t& point1, const raw_vector3d_t& point2) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.x = point1.x - point2.x; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.y = point1.y - point2.y; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.z = point1.z - point2.z; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					const raw_vector3d_t operator+(const raw_vector3d_t& point, const double value) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.x = point.x + value; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.y = point.y + value; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.z = point.z + value; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					const raw_vector3d_t operator-(const raw_vector3d_t& point, const double value) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.x = point.x - value; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.y = point.y - value; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    result.z = point.z - value; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					typedef struct _aabb_t { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t min; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t max; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    _aabb_t() | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.x = std::numeric_limits<double>::max(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.y = std::numeric_limits<double>::max(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.z = std::numeric_limits<double>::max(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.x = std::numeric_limits<double>::min(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.y = std::numeric_limits<double>::min(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.z = std::numeric_limits<double>::min(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    _aabb_t(const raw_vector3d_t& min, const raw_vector3d_t& max) : min(min), max(max) {} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    void extend(const raw_vector3d_t& point) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.x = std::min(min.x, point.x); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.y = std::min(min.y, point.y); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.z = std::min(min.z, point.z); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.x = std::max(max.x, point.x); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.y = std::max(max.y, point.y); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.z = std::max(max.z, point.z); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    void extend(const _aabb_t& aabb) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.x = std::min(min.x, aabb.min.x); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.y = std::min(min.y, aabb.min.y); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min.z = std::min(min.z, aabb.min.z); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.x = std::max(max.x, aabb.max.x); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.y = std::max(max.y, aabb.max.y); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max.z = std::max(max.z, aabb.max.z); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    void offset(const raw_vector3d_t& offset) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        min = min + offset; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        max = max + offset; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} aabb_t; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					typedef struct blobtree_t { | 
					 | 
					 | 
					typedef struct blobtree_t { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::vector<node_t, tbb::tbb_allocator<node_t>>     nodes{}; | 
					 | 
					 | 
					    std::vector<node_t, tbb::tbb_allocator<node_t>>     nodes{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    std::vector<uint32_t, tbb::tbb_allocator<uint32_t>> leaf_index{}; | 
					 | 
					 | 
					    std::vector<uint32_t, tbb::tbb_allocator<uint32_t>> leaf_index{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					std::vector<blobtree_t, tbb::tbb_allocator<blobtree_t>>                  structures{}; | 
					 | 
					 | 
					std::vector<blobtree_t, tbb::tbb_allocator<blobtree_t>>                  structures{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					std::vector<aabb_t, tbb::tbb_allocator<aabb_t>>                          aabbs{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					std::vector<primitive_node_t, tbb::tbb_allocator<primitive_node_t>>      primitives{}; | 
					 | 
					 | 
					std::vector<primitive_node_t, tbb::tbb_allocator<primitive_node_t>>      primitives{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					std::stack<uint32_t, std::deque<uint32_t, tbb::tbb_allocator<uint32_t>>> free_structure_list{}; | 
					 | 
					 | 
					std::stack<uint32_t, std::deque<uint32_t, tbb::tbb_allocator<uint32_t>>> free_structure_list{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -282,7 +363,7 @@ virtual_node_t copy(virtual_node_t old_node, virtual_node_t new_node) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return virtual_node_t{new_node.main_index, old_node.inner_index + size}; | 
					 | 
					 | 
					    return virtual_node_t{new_node.main_index, old_node.inner_index + size}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					void offset_primitive(primitive_node_t node, const raw_vector3d_t& offset) | 
					 | 
					 | 
					void offset_primitive(primitive_node_t& node, const raw_vector3d_t& offset) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    auto offset_point = [](raw_vector3d_t* point, const raw_vector3d_t& offset) { | 
					 | 
					 | 
					    auto offset_point = [](raw_vector3d_t* point, const raw_vector3d_t& offset) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        point->x += offset.x; | 
					 | 
					 | 
					        point->x += offset.x; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -421,12 +502,24 @@ int evaluate(const virtual_node_t& node, const raw_vector3d_t& point) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return node_fetch_in_out(temp.nodes[node.inner_index]); | 
					 | 
					 | 
					    return node_fetch_in_out(temp.nodes[node.inner_index]); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					aabb_t get_aabb(const virtual_node_t& node) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    auto&  leaf_index = structures[node.main_index].leaf_index; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t result{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    for (auto& index : leaf_index) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        auto& type = primitives[index].type; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        if (type != PRIMITIVE_TYPE_CONSTANT && type != PRIMITIVE_TYPE_PLANE) { result.extend(aabbs[index]); } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return result; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					/* Geometry Generation */ | 
					 | 
					 | 
					/* Geometry Generation */ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					static constexpr node_t standard_new_node = {(uint64_t)0xFFFFFFFFFFFFFFFFu, (uint64_t)0xFFFFFFFFFFFFFFFFu}; | 
					 | 
					 | 
					static constexpr node_t standard_new_node = {(uint64_t)0xFFFFFFFFFFFFFFFFu, (uint64_t)0xFFFFFFFFFFFFFFFFu}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					virtual_node_t push_primitive_node(primitive_node_t&& primitive_node) | 
					 | 
					 | 
					virtual_node_t push_primitive_node(primitive_node_t&& primitive_node, const aabb_t&& aabb) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs.emplace_back(aabb); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives.emplace_back(primitive_node); | 
					 | 
					 | 
					    primitives.emplace_back(primitive_node); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    node_t node = standard_new_node; | 
					 | 
					 | 
					    node_t node = standard_new_node; | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -445,56 +538,93 @@ BPE_API virtual_node_t blobtree_new_virtual_node(const constant_descriptor_t& de | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_CONSTANT, malloc(sizeof(constant_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_CONSTANT, malloc(sizeof(constant_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((constant_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((constant_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const plane_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const plane_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_PLANE, malloc(sizeof(plane_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_PLANE, malloc(sizeof(plane_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((plane_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((plane_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const sphere_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const sphere_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_SPHERE, malloc(sizeof(sphere_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_SPHERE, malloc(sizeof(sphere_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((sphere_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((sphere_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t min = desc.center - desc.radius; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t max = desc.center + desc.radius; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t         aabb{min, max}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const cylinder_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const cylinder_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_CYLINDER, malloc(sizeof(cylinder_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_CYLINDER, malloc(sizeof(cylinder_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((cylinder_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((cylinder_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // NOTE: A rough AABB bounding box
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion + desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion - desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion + desc.offset + desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion + desc.offset - desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const cone_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const cone_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_CONE, malloc(sizeof(cone_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_CONE, malloc(sizeof(cone_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((cone_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((cone_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // NOTE: A rough AABB bounding box
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.top_point + desc.radius1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.top_point - desc.radius1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_point + desc.radius2); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_point - desc.radius2); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const box_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const box_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_BOX, malloc(sizeof(box_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_BOX, malloc(sizeof(box_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((box_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((box_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t min = desc.center - desc.half_size; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t max = desc.center + desc.half_size; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t         aabb{min, max}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const mesh_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const mesh_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_MESH, malloc(sizeof(mesh_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_MESH, malloc(sizeof(mesh_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((mesh_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((mesh_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    for (int i = 0; i < desc.point_number; i++) { aabb.extend(desc.points[i]); } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const extrude_descriptor_t& desc) | 
					 | 
					 | 
					BPE_API virtual_node_t blobtree_new_virtual_node(const extrude_descriptor_t& desc) | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					{ | 
					 | 
					 | 
					{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_EXTRUDE, malloc(sizeof(extrude_descriptor_t))}; | 
					 | 
					 | 
					    primitive_node_t node{PRIMITIVE_TYPE_EXTRUDE, malloc(sizeof(extrude_descriptor_t))}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((extrude_descriptor_t*)node.desc) = std::move(desc); | 
					 | 
					 | 
					    *((extrude_descriptor_t*)node.desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    return push_primitive_node(std::move(node)); | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // NOTE: Currently only straight edges are considered
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    for (int i = 0; i < desc.edges_number; i++) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        aabb.extend(desc.points[i]); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        aabb.extend(desc.points[i] + desc.extusion); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    return push_primitive_node(std::move(node), std::move(aabb)); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					BPE_API void blobtree_free_virtual_node(virtual_node_t* node) { free_sub_blobtree(node->main_index); } | 
					 | 
					 | 
					BPE_API void blobtree_free_virtual_node(virtual_node_t* node) { free_sub_blobtree(node->main_index); } | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -569,6 +699,8 @@ BPE_API void virtual_node_offset(virtual_node_t* node, const raw_vector3d_t& off | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    auto& all_leaf = structures[node->main_index].leaf_index; | 
					 | 
					 | 
					    auto& all_leaf = structures[node->main_index].leaf_index; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    for (int i = 0; i < all_leaf.size(); i++) { | 
					 | 
					 | 
					    for (int i = 0; i < all_leaf.size(); i++) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        offset_primitive(primitives[node_fetch_primitive_index(structures[node->main_index].nodes[all_leaf[i]])], offset); | 
					 | 
					 | 
					        offset_primitive(primitives[node_fetch_primitive_index(structures[node->main_index].nodes[all_leaf[i]])], offset); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[all_leaf[i]])].offset(offset); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -692,6 +824,7 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const constant | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          .desc) = std::move(desc); | 
					 | 
					 | 
					          .desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        PRIMITIVE_TYPE_CONSTANT; | 
					 | 
					 | 
					        PRIMITIVE_TYPE_CONSTANT; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb_t{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -701,6 +834,7 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const plane_de | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((plane_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
					 | 
					 | 
					    *((plane_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        std::move(desc); | 
					 | 
					 | 
					        std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_PLANE; | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_PLANE; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])]           = aabb_t{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -710,6 +844,12 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const sphere_d | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((sphere_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] | 
					 | 
					 | 
					    *((sphere_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          .desc)                                                                                       = std::move(desc); | 
					 | 
					 | 
					          .desc)                                                                                       = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_SPHERE; | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_SPHERE; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t min = desc.center - desc.radius; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t max = desc.center + desc.radius; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t         aabb{min, max}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -720,6 +860,15 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const cylinder | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          .desc) = std::move(desc); | 
					 | 
					 | 
					          .desc) = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        PRIMITIVE_TYPE_CYLINDER; | 
					 | 
					 | 
					        PRIMITIVE_TYPE_CYLINDER; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // NOTE: A rough AABB bounding box
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion + desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion - desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion + desc.offset + desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_origion + desc.offset - desc.radius); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -729,6 +878,14 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const cone_des | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((cone_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
					 | 
					 | 
					    *((cone_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        std::move(desc); | 
					 | 
					 | 
					        std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_CONE; | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_CONE; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // NOTE: A rough AABB bounding box
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.top_point + desc.radius1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.top_point - desc.radius1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_point + desc.radius2); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb.extend(desc.bottom_point - desc.radius2); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -738,6 +895,11 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const box_desc | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((box_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
					 | 
					 | 
					    *((box_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        std::move(desc); | 
					 | 
					 | 
					        std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_BOX; | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_BOX; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t min = desc.center - desc.half_size; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    raw_vector3d_t max = desc.center + desc.half_size; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t         aabb{min, max}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -747,6 +909,11 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const mesh_des | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((mesh_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
					 | 
					 | 
					    *((mesh_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].desc) = | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        std::move(desc); | 
					 | 
					 | 
					        std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_MESH; | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_MESH; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    for (int i = 0; i < desc.point_number; i++) { aabb.extend(desc.points[i]); } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -756,6 +923,14 @@ BPE_API bool virtual_node_replace_primitive(virtual_node_t* node, const extrude_ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    *((extrude_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] | 
					 | 
					 | 
					    *((extrude_descriptor_t*)primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					          .desc)                                                                                       = std::move(desc); | 
					 | 
					 | 
					          .desc)                                                                                       = std::move(desc); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_EXTRUDE; | 
					 | 
					 | 
					    primitives[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])].type = PRIMITIVE_TYPE_EXTRUDE; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabb_t aabb{}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    // NOTE: Currently only straight edges are considered
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    for (int i = 0; i < desc.edges_number; i++) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        aabb.extend(desc.points[i]); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        aabb.extend(desc.points[i] + desc.extusion); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    aabbs[node_fetch_primitive_index(structures[node->main_index].nodes[node->inner_index])] = aabb; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    return true; | 
					 | 
					 | 
					    return true; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |