| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -112,7 +112,7 @@ std::pair<uvector<int, 3>, uvector<int, 3>> getOneEightCellAABB(const uvector3& | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} // namespace detail
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// TODO: delete it
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					bool keepQuadraturePoint(std::vector<tensor3>& originTensors, const uvector3& originPt) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					bool isPointInside(const std::vector<tensor3>& originTensors, const uvector3& originPt) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for (auto& t : originTensors) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (evalPower(t, originPt) >= 0) { return false; } | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -120,13 +120,33 @@ bool keepQuadraturePoint(std::vector<tensor3>& originTensors, const uvector3& or | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					bool keepQuadraturePoint(const Scene& scene, const OcTreeNode& ocTreeNode, const uvector3& originPt) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// bool isPointInside(const std::vector<CompleteTensorRep>& completeTensorReps, const uvector3& originPt)
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//     for (auto& completeTensorRep : completeTensorReps) {
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//         if (isPointInside(completeTensorRep.originalPower, originPt)) { return false; }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//     }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					//     return true;
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// }
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// 这里blobTree是拷贝传参
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					bool keepQuadraturePoint(const Scene&        scene, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                         organizer::BlobTree blobTree, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                         const OcTreeNode&   ocTreeNode, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					                         const uvector3&     originPt) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    // 只需要考虑intersect polys,不用考虑fully contained polys
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for (auto& polyIntersectIdx : ocTreeNode.polyIntersectIndices) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        // TODO:
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    const auto&       polyIntersectIndices = ocTreeNode.polyIntersectIndices; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    std::vector<bool> primitiveInOuts(polyIntersectIndices.size()); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for (int i = 0; i < ocTreeNode.polyIntersectIndices.size(); ++i) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        primitiveInOuts[i] = isPointInside(scene.polys[polyIntersectIndices[i]].originalPower, originPt); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    int res = organizer::traverse(blobTree, ocTreeNode.polyIntersectIndices, primitiveInOuts); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    assert(res == organizer::NODE_IN || res == organizer::NODE_OUT); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    if (res == organizer::NODE_OUT) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return false; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } else { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        return true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    return true; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					// std::vector<std::shared_ptr<PrimitiveDesc>> primitives;
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -415,7 +435,7 @@ void basicTask(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives, in | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    ipquad.integrate(AutoMixed, q, [&](const uvector<real, 3>& x, real w) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        auto realX = x * range + xmin; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (keepQuadraturePoint(originTensors, realX)) volume += w * integrand(realX); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (isPointInside(originTensors, realX)) volume += w * integrand(realX); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    volume *= pow(xmax - xmin, 3); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    std::cout << "Volume xxx: " << volume << std::endl; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -425,7 +445,7 @@ void basicTask(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives, in | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for (auto& p : originTensorStacks) delete p; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					}; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					BasicTaskRes basicTask(const Scene& scene, const OcTreeNode& node, int q = 20) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					BasicTaskRes basicTask(const Scene& scene, const organizer::BlobTree& blobTree, const OcTreeNode& node, int q = 20) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					{ | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    auto                      integrand = [](const uvector<real, 3>& x) { return 1.0; }; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    real                      volume = 0., surf = 0.; | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				
					@ -433,7 +453,7 @@ BasicTaskRes basicTask(const Scene& scene, const OcTreeNode& node, int q = 20) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    ImplicitPolyQuadrature<3> ipquad(scene.polys); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    ipquad.integrate(AutoMixed, q, [&](const uvector<real, 3>& x, real w) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        auto realX = x * range + node.min; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (keepQuadraturePoint(scene, node, realX)) volume += w * integrand(realX); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        if (keepQuadraturePoint(scene, blobTree, node, realX)) volume += w * integrand(realX); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    }); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					} | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				
					@ -498,7 +518,7 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    buildOcTree(scene, rootNode, leaves); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    for (const auto& leaf : leaves) { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        auto basicRes  = basicTask(scene, leaf, xmin, xmax, 10); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        auto basicRes  = basicTask(blobTree, scene, leaf, xmin, xmax, 10); | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					        volume        += basicRes.volume; | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					    } | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				
					
  |