|
|
@ -311,6 +311,7 @@ void buildOcTreeV1(const Scene& scene, const OcTreeNode& node, std::vector<OcTre |
|
|
|
|
|
|
|
void buildOcTreeV0(const Scene& scene, const OcTreeNode& node, std::vector<OcTreeNode>& leaves) |
|
|
|
{ |
|
|
|
int a = 0; |
|
|
|
const std::vector<int>& polyIntersectIndices = node.polyIntersectIndices; |
|
|
|
if (polyIntersectIndices.size() <= 4) { |
|
|
|
leaves.emplace_back(node); |
|
|
@ -340,9 +341,9 @@ void buildOcTreeV0(const Scene& scene, const OcTreeNode& node, std::vector<OcTre |
|
|
|
bernstein::deCasteljau(poly.compositedBernstein, subNodes[subIdx].min, subNodes[subIdx].max, subcellPoly); |
|
|
|
int sign = bernstein::uniformSign(subcellPoly); |
|
|
|
if (sign == 1) { |
|
|
|
// organizer::traverse(subNodes[subIdx].blobTree, polyIntersectIndex, organizer::NODE_OUT);
|
|
|
|
organizer::traverse(subNodes[subIdx].blobTree, polyIntersectIndex, organizer::NODE_OUT); |
|
|
|
} else if (sign == -1) { |
|
|
|
// organizer::traverse(subNodes[subIdx].blobTree, polyIntersectIndex, organizer::NODE_IN);
|
|
|
|
organizer::traverse(subNodes[subIdx].blobTree, polyIntersectIndex, organizer::NODE_IN); |
|
|
|
} else { |
|
|
|
subNodes[subIdx].polyIntersectIndices.emplace_back(polyIntersectIndex); |
|
|
|
} |
|
|
@ -364,7 +365,8 @@ void basicTask(const std::shared_ptr<PrimitiveDesc>& p, int q = 20, real xmin = |
|
|
|
if (auto pt = std::dynamic_pointer_cast<SphereDesc>(p)) { |
|
|
|
tensor3 tensor(nullptr, 3); |
|
|
|
algoim_spark_alloc(real, tensor); |
|
|
|
makeSphere(*pt, tensor); |
|
|
|
AABB aabb; |
|
|
|
makeSphere(*pt, tensor, aabb); |
|
|
|
detail::powerTransformation(range, xmin, tensor); |
|
|
|
|
|
|
|
tensor3 phi(nullptr, 3); |
|
|
@ -387,8 +389,8 @@ void basicTask(const std::shared_ptr<PrimitiveDesc>& p, int q = 20, real xmin = |
|
|
|
|
|
|
|
tensor3 compositeTensor(nullptr, 1 + faceCount); |
|
|
|
algoim_spark_alloc(real, compositeTensor); |
|
|
|
|
|
|
|
makeMesh(*pt, compositeTensor, planeTensors); |
|
|
|
AABB aabb; |
|
|
|
makeMesh(*pt, compositeTensor, planeTensors, aabb); |
|
|
|
detail::powerTransformation(range, xmin, compositeTensor); |
|
|
|
|
|
|
|
auto planeStdVector1 = xarray2StdVector(planeTensors[0]); |
|
|
@ -439,7 +441,8 @@ void basicTask(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives, in |
|
|
|
algoim_spark_alloc_heap(real, phi)); // 必须先于algoim_spark_alloc,使transformedTensor的内存以栈形式释放
|
|
|
|
|
|
|
|
algoim_spark_alloc(real, transformedTensor); |
|
|
|
makeSphere(*pt, originTensor); |
|
|
|
AABB aabb; |
|
|
|
makeSphere(*pt, originTensor, aabb); |
|
|
|
originTensors.emplace_back(originTensor); |
|
|
|
detail::powerTransformation(range, xmin, originTensor, transformedTensor); |
|
|
|
|
|
|
@ -458,8 +461,8 @@ void basicTask(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitives, in |
|
|
|
|
|
|
|
tensor3 compositeTensor(nullptr, 1 + faceCount); |
|
|
|
algoim_spark_alloc(real, compositeTensor); |
|
|
|
|
|
|
|
makeMesh(*pt, compositeTensor, planeTensors); |
|
|
|
AABB aabb; |
|
|
|
makeMesh(*pt, compositeTensor, planeTensors, aabb); |
|
|
|
detail::powerTransformation(range, xmin, compositeTensor); |
|
|
|
|
|
|
|
real testEvalPower = evalPower(compositeTensor, testX); |
|
|
@ -528,13 +531,14 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv |
|
|
|
algoim_spark_alloc_heap(real, phi)); // 必须先于algoim_spark_alloc,使transformedTensor的内存以栈形式释放
|
|
|
|
|
|
|
|
algoim_spark_alloc(real, transformedTensor); |
|
|
|
makeSphere(*pt, originTensor); |
|
|
|
AABB aabb; |
|
|
|
makeSphere(*pt, originTensor, aabb); |
|
|
|
detail::powerTransformation(range, xmin, originTensor, transformedTensor); |
|
|
|
|
|
|
|
real testEvaOri = evalPower(originTensor, testX); |
|
|
|
|
|
|
|
detail::power2BernsteinTensor(transformedTensor, phi); |
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, {originTensor}}); |
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, {originTensor}, aabb}); |
|
|
|
} else if (auto pt = std::dynamic_pointer_cast<MeshDesc>(primitives[i])) { |
|
|
|
const int faceCount = pt->indexInclusiveScan.size(); |
|
|
|
assert(faceCount > 1); |
|
|
@ -547,8 +551,8 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv |
|
|
|
|
|
|
|
tensor3 compositeTensor(nullptr, 1 + faceCount); |
|
|
|
algoim_spark_alloc(real, compositeTensor); |
|
|
|
|
|
|
|
makeMesh(*pt, compositeTensor, planeTensors); |
|
|
|
AABB aabb; |
|
|
|
makeMesh(*pt, compositeTensor, planeTensors, aabb); |
|
|
|
detail::powerTransformation(range, xmin, compositeTensor); |
|
|
|
|
|
|
|
real testEvalPower = evalPower(compositeTensor, testX); |
|
|
@ -556,7 +560,7 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv |
|
|
|
detail::power2BernsteinTensor(compositeTensor, phi); |
|
|
|
real testEvalBernstein = bernstein::evalBernsteinPoly(phi, testX); |
|
|
|
|
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, planeTensors}); |
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, planeTensors, aabb}); |
|
|
|
} else if (auto pt = std::dynamic_pointer_cast<CylinderDesc>(primitives[i])) { |
|
|
|
std::vector<tensor3> rawTensors(3, tensor3(nullptr, 2)); |
|
|
|
rawTensors[0].ext_ = 3; |
|
|
@ -569,14 +573,14 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv |
|
|
|
|
|
|
|
tensor3 compositeTensor(nullptr, resExt); |
|
|
|
algoim_spark_alloc(real, compositeTensor); |
|
|
|
|
|
|
|
makeCylinder(*pt, compositeTensor, rawTensors); |
|
|
|
AABB aabb; |
|
|
|
makeCylinder(*pt, compositeTensor, rawTensors, aabb); |
|
|
|
detail::powerTransformation(range, xmin, compositeTensor); |
|
|
|
real testEvalPower = evalPower(compositeTensor, testX); |
|
|
|
|
|
|
|
detail::power2BernsteinTensor(compositeTensor, phi); |
|
|
|
|
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors}); |
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors, aabb}); |
|
|
|
} else if (auto pt = std::dynamic_pointer_cast<ConeDesc>(primitives[i])) { |
|
|
|
std::vector<tensor3> rawTensors(3, tensor3(nullptr, 2)); |
|
|
|
rawTensors[0].ext_ = 3; |
|
|
@ -588,14 +592,14 @@ void quadratureScene(const std::vector<std::shared_ptr<PrimitiveDesc>>& primitiv |
|
|
|
|
|
|
|
tensor3 compositeTensor(nullptr, resExt); |
|
|
|
algoim_spark_alloc(real, compositeTensor); |
|
|
|
|
|
|
|
makeCone(*pt, compositeTensor, rawTensors); |
|
|
|
AABB aabb; |
|
|
|
makeCone(*pt, compositeTensor, rawTensors, aabb); |
|
|
|
detail::powerTransformation(range, xmin, compositeTensor); |
|
|
|
real testEvalPower = evalPower(compositeTensor, testX); |
|
|
|
|
|
|
|
detail::power2BernsteinTensor(compositeTensor, phi); |
|
|
|
|
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors}); |
|
|
|
completeTensorReps.emplace_back(CompleteTensorRep{phi, rawTensors, aabb}); |
|
|
|
} else { |
|
|
|
std::cerr << "unrecognized primitive type." << std::endl; |
|
|
|
} |
|
|
|