Save nodes cut faces

master
Jeremy Hu 2019-07-03 08:37:46 +09:30
parent 713935adb5
commit ad244c4659
2 changed files with 17 additions and 3 deletions

View File

@ -28,6 +28,7 @@ MeshGenerator::~MeshGenerator()
delete m_snapshot; delete m_snapshot;
delete m_outcome; delete m_outcome;
delete m_cutFaceTransforms; delete m_cutFaceTransforms;
delete m_nodesCutFaces;
} }
bool MeshGenerator::isSucceed() bool MeshGenerator::isSucceed()
@ -68,6 +69,13 @@ std::map<QUuid, nodemesh::Builder::CutFaceTransform> *MeshGenerator::takeCutFace
return cutFaceTransforms; return cutFaceTransforms;
} }
std::map<QUuid, std::map<QString, std::tuple<float, float, float>>> *MeshGenerator::takeNodesCutFaces()
{
auto nodesCutFaces = m_nodesCutFaces;
m_nodesCutFaces = nullptr;
return nodesCutFaces;
}
void MeshGenerator::collectParts() void MeshGenerator::collectParts()
{ {
for (const auto &node: m_snapshot->nodes) { for (const auto &node: m_snapshot->nodes) {
@ -182,6 +190,7 @@ nodemesh::Combiner::Mesh *MeshGenerator::combinePartMesh(const QString &partIdSt
auto target = PartTargetFromString(valueOfKeyInMapOrEmpty(part, "target").toUtf8().constData()); auto target = PartTargetFromString(valueOfKeyInMapOrEmpty(part, "target").toUtf8().constData());
auto base = PartBaseFromString(valueOfKeyInMapOrEmpty(part, "base").toUtf8().constData()); auto base = PartBaseFromString(valueOfKeyInMapOrEmpty(part, "base").toUtf8().constData());
std::map<QString, std::tuple<float, float, float>> cutFaceNodeMap;
std::vector<QVector2D> cutTemplate; std::vector<QVector2D> cutTemplate;
QString cutFaceString = valueOfKeyInMapOrEmpty(part, "cutFace"); QString cutFaceString = valueOfKeyInMapOrEmpty(part, "cutFace");
QUuid cutFaceLinkedPartId = QUuid(cutFaceString); QUuid cutFaceLinkedPartId = QUuid(cutFaceString);
@ -191,7 +200,6 @@ nodemesh::Combiner::Mesh *MeshGenerator::combinePartMesh(const QString &partIdSt
qDebug() << "Find cut face linked part failed:" << cutFaceString; qDebug() << "Find cut face linked part failed:" << cutFaceString;
} else { } else {
// Build node info map // Build node info map
std::map<QString, std::tuple<float, float, float>> cutFaceNodeMap;
for (const auto &nodeIdString: m_partNodeIds[cutFaceString]) { for (const auto &nodeIdString: m_partNodeIds[cutFaceString]) {
auto findNode = m_snapshot->nodes.find(nodeIdString); auto findNode = m_snapshot->nodes.find(nodeIdString);
if (findNode == m_snapshot->nodes.end()) { if (findNode == m_snapshot->nodes.end()) {
@ -486,8 +494,11 @@ nodemesh::Combiner::Mesh *MeshGenerator::combinePartMesh(const QString &partIdSt
continue; continue;
const QString &nodeIdString = nodeIndexToIdStringMap[node.originNodeIndex]; const QString &nodeIdString = nodeIndexToIdStringMap[node.originNodeIndex];
const nodemesh::Builder::CutFaceTransform *cutFaceTransform = builder->nodeAdjustableCutFaceTransform(builderNodeIndices[i]); const nodemesh::Builder::CutFaceTransform *cutFaceTransform = builder->nodeAdjustableCutFaceTransform(builderNodeIndices[i]);
if (nullptr != cutFaceTransform) if (nullptr != cutFaceTransform) {
m_cutFaceTransforms->insert({QUuid(nodeIdString), *cutFaceTransform}); QUuid nodeId = QUuid(nodeIdString);
m_cutFaceTransforms->insert({nodeId, *cutFaceTransform});
m_nodesCutFaces->insert({nodeId, cutFaceNodeMap});
}
} }
partCache.vertices = builder->generatedVertices(); partCache.vertices = builder->generatedVertices();
@ -982,6 +993,7 @@ void MeshGenerator::generate()
m_outcome = new Outcome; m_outcome = new Outcome;
m_cutFaceTransforms = new std::map<QUuid, nodemesh::Builder::CutFaceTransform>; m_cutFaceTransforms = new std::map<QUuid, nodemesh::Builder::CutFaceTransform>;
m_nodesCutFaces = new std::map<QUuid, std::map<QString, std::tuple<float, float, float>>>;
bool needDeleteCacheContext = false; bool needDeleteCacheContext = false;
if (nullptr == m_cacheContext) { if (nullptr == m_cacheContext) {

View File

@ -61,6 +61,7 @@ public:
const std::set<QUuid> &generatedPreviewPartIds(); const std::set<QUuid> &generatedPreviewPartIds();
Outcome *takeOutcome(); Outcome *takeOutcome();
std::map<QUuid, nodemesh::Builder::CutFaceTransform> *takeCutFaceTransforms(); std::map<QUuid, nodemesh::Builder::CutFaceTransform> *takeCutFaceTransforms();
std::map<QUuid, std::map<QString, std::tuple<float, float, float>>> *takeNodesCutFaces();
void generate(); void generate();
void setGeneratedCacheContext(GeneratedCacheContext *cacheContext); void setGeneratedCacheContext(GeneratedCacheContext *cacheContext);
void setSmoothShadingThresholdAngleDegrees(float degrees); void setSmoothShadingThresholdAngleDegrees(float degrees);
@ -89,6 +90,7 @@ private:
bool m_cacheEnabled = false; bool m_cacheEnabled = false;
float m_smoothShadingThresholdAngleDegrees = 60; float m_smoothShadingThresholdAngleDegrees = 60;
std::map<QUuid, nodemesh::Builder::CutFaceTransform> *m_cutFaceTransforms = nullptr; std::map<QUuid, nodemesh::Builder::CutFaceTransform> *m_cutFaceTransforms = nullptr;
std::map<QUuid, std::map<QString, std::tuple<float, float, float>>> *m_nodesCutFaces = nullptr;
void collectParts(); void collectParts();
bool checkIsComponentDirty(const QString &componentIdString); bool checkIsComponentDirty(const QString &componentIdString);