Browse Source

AABB

master
gjj 6 months ago
parent
commit
b0ec3bd561
  1. 42
      algoim/organizer/organizer.hpp
  2. 25
      algoim/organizer/primitive.hpp

42
algoim/organizer/organizer.hpp

@ -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;
}

25
algoim/organizer/primitive.hpp

@ -687,7 +687,7 @@ void makeSphere(const SphereDesc& sphereDesc, xarray<real, 3>& tensor, AABB& aab
aabb.max = sphereDesc.center + sphereDesc.radius;
};
void makeCylinder(const CylinderDesc& cylinderDesc, xarray<real, 3>& tensor, std::vector<tensor3>& rawTensors)
void makeCylinder(const CylinderDesc& cylinderDesc, xarray<real, 3>& tensor, std::vector<tensor3>& rawTensors, AABB& aabb)
{
auto & cylinderSrf = rawTensors[0], plane1 = rawTensors[1], plane2 = rawTensors[2];
int alignAxis = cylinderDesc.alignAxis;
@ -719,9 +719,19 @@ void makeCylinder(const CylinderDesc& cylinderDesc, xarray<real, 3>& tensor, std
cylinderSrf.m(idx) = 1;
detail::compositePower(rawTensors, 0, 0, 1, tensor);
// AABB
aabb.extend(cylinderDesc.node1);
auto node2 = cylinderDesc.node1;
node2(alignAxis) += cylinderDesc.height;
aabb.extend(node2);
aabb.min(dimA) -= r;
aabb.max(dimA) += r;
aabb.min(dimB) -= r;
aabb.max(dimB) += r;
}
void makeCone(const ConeDesc& coneDesc, tensor3& tensor, std::vector<tensor3>& rawTensors)
void makeCone(const ConeDesc& coneDesc, tensor3& tensor, std::vector<tensor3>& rawTensors, AABB& aabb)
{
assert(rawTensors.size() == 3 && all(rawTensors[0].ext() == 3) && all(rawTensors[1].ext() == 2)
&& all(rawTensors[2].ext() == 2));
@ -755,11 +765,22 @@ void makeCone(const ConeDesc& coneDesc, tensor3& tensor, std::vector<tensor3>& r
coneSrf.m(idx) = scaleSquare;
detail::compositePower(rawTensors, 0, 0, 1, tensor);
// AABB
aabb.extend(coneDesc.node1);
auto node2 = coneDesc.node1;
node2(alignAxis) += coneDesc.height;
aabb.extend(node2);
aabb.min(dimA) -= coneDesc.radius;
aabb.max(dimA) += coneDesc.radius;
aabb.min(dimB) -= coneDesc.radius;
aabb.max(dimB) += coneDesc.radius;
}
struct CompleteTensorRep {
tensor3 compositedBernstein; // 合法输入在[0,1]^3
std::vector<tensor3> rawPower; // 合法输入在场景<min, max>
AABB aabb;
};
struct Scene {

Loading…
Cancel
Save