Remove mesh result post processor

master
Jeremy HU 2022-12-11 06:16:44 +11:00
parent 69ad5323e9
commit f8b2004889
8 changed files with 32 additions and 156 deletions

View File

@ -161,8 +161,6 @@ HEADERS += sources/mesh_generator.h
SOURCES += sources/mesh_generator.cc SOURCES += sources/mesh_generator.cc
HEADERS += sources/mesh_preview_images_generator.h HEADERS += sources/mesh_preview_images_generator.h
SOURCES += sources/mesh_preview_images_generator.cc SOURCES += sources/mesh_preview_images_generator.cc
HEADERS += sources/mesh_result_post_processor.h
SOURCES += sources/mesh_result_post_processor.cc
HEADERS += sources/model_mesh.h HEADERS += sources/model_mesh.h
SOURCES += sources/model_mesh.cc SOURCES += sources/model_mesh.cc
HEADERS += sources/model_offscreen_render.h HEADERS += sources/model_offscreen_render.h

View File

@ -2,7 +2,6 @@
#include "bone_generator.h" #include "bone_generator.h"
#include "image_forever.h" #include "image_forever.h"
#include "mesh_generator.h" #include "mesh_generator.h"
#include "mesh_result_post_processor.h"
#include "uv_map_generator.h" #include "uv_map_generator.h"
#include <QApplication> #include <QApplication>
#include <QClipboard> #include <QClipboard>
@ -2167,7 +2166,6 @@ void Document::meshReady()
qDebug() << "Mesh generation done"; qDebug() << "Mesh generation done";
m_isPostProcessResultObsolete = true;
emit resultMeshChanged(); emit resultMeshChanged();
if (m_isResultMeshObsolete) { if (m_isResultMeshObsolete) {
@ -2175,11 +2173,6 @@ void Document::meshReady()
} }
} }
bool Document::isPostProcessResultObsolete() const
{
return m_isPostProcessResultObsolete;
}
void Document::batchChangeBegin() void Document::batchChangeBegin()
{ {
m_batchChangeRefCount++; m_batchChangeRefCount++;
@ -2257,12 +2250,15 @@ void Document::generateTexture()
return; return;
} }
qDebug() << "Texture guide generating..";
emit textureGenerating();
m_isTextureObsolete = false; m_isTextureObsolete = false;
auto object = std::make_unique<dust3d::Object>(*m_uvMappedObject); if (nullptr == m_currentObject)
return;
qDebug() << "UV mapping generating..";
emit textureGenerating();
auto object = std::make_unique<dust3d::Object>(*m_currentObject);
auto snapshot = std::make_unique<dust3d::Snapshot>(); auto snapshot = std::make_unique<dust3d::Snapshot>();
toSnapshot(snapshot.get()); toSnapshot(snapshot.get());
@ -2298,7 +2294,7 @@ void Document::textureReady()
delete m_textureGenerator; delete m_textureGenerator;
m_textureGenerator = nullptr; m_textureGenerator = nullptr;
qDebug() << "Texture guide generation done"; qDebug() << "UV mapping generation done(meshId:" << (nullptr != m_resultTextureMesh ? m_resultTextureMesh->meshId() : 0) << ")";
emit resultTextureChanged(); emit resultTextureChanged();
@ -2309,47 +2305,9 @@ void Document::textureReady()
} }
} }
void Document::postProcess() quint64 Document::resultTextureImageUpdateVersion()
{ {
if (nullptr != m_postProcessor) { return m_textureImageUpdateVersion;
m_isPostProcessResultObsolete = true;
return;
}
m_isPostProcessResultObsolete = false;
if (!m_currentObject) {
qDebug() << "Model is null";
return;
}
qDebug() << "Post processing..";
emit postProcessing();
QThread* thread = new QThread;
m_postProcessor = new MeshResultPostProcessor(*m_currentObject);
m_postProcessor->moveToThread(thread);
connect(thread, &QThread::started, m_postProcessor, &MeshResultPostProcessor::process);
connect(m_postProcessor, &MeshResultPostProcessor::finished, this, &Document::postProcessedMeshResultReady);
connect(m_postProcessor, &MeshResultPostProcessor::finished, thread, &QThread::quit);
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
thread->start();
}
void Document::postProcessedMeshResultReady()
{
m_uvMappedObject.reset(m_postProcessor->takePostProcessedObject());
delete m_postProcessor;
m_postProcessor = nullptr;
qDebug() << "Post process done";
emit postProcessedResultChanged();
if (m_isPostProcessResultObsolete) {
postProcess();
}
} }
const dust3d::Object& Document::currentUvMappedObject() const const dust3d::Object& Document::currentUvMappedObject() const
@ -2797,10 +2755,10 @@ bool Document::isEdgeEditable(dust3d::Uuid edgeId) const
bool Document::isExportReady() const bool Document::isExportReady() const
{ {
if (m_meshGenerator || m_textureGenerator || m_postProcessor) if (m_meshGenerator || m_textureGenerator || m_boneGenerator)
return false; return false;
if (m_isResultMeshObsolete || m_isTextureObsolete || m_isPostProcessResultObsolete) if (m_isResultMeshObsolete || m_isTextureObsolete || m_isResultBoneObsolete)
return false; return false;
return true; return true;
@ -2817,11 +2775,6 @@ bool Document::isMeshGenerating() const
return nullptr != m_meshGenerator; return nullptr != m_meshGenerator;
} }
bool Document::isPostProcessing() const
{
return nullptr != m_postProcessor;
}
bool Document::isTextureGenerating() const bool Document::isTextureGenerating() const
{ {
return nullptr != m_textureGenerator; return nullptr != m_textureGenerator;
@ -3065,9 +3018,12 @@ void Document::generateBone()
m_isResultBoneObsolete = false; m_isResultBoneObsolete = false;
if (nullptr == m_currentObject)
return;
emit boneGenerating(); emit boneGenerating();
auto object = std::make_unique<dust3d::Object>(*m_uvMappedObject); auto object = std::make_unique<dust3d::Object>(*m_currentObject);
auto snapshot = std::make_unique<dust3d::Snapshot>(); auto snapshot = std::make_unique<dust3d::Snapshot>();
toSnapshot(snapshot.get()); toSnapshot(snapshot.get());

View File

@ -23,7 +23,6 @@
class UvMapGenerator; class UvMapGenerator;
class MeshGenerator; class MeshGenerator;
class MeshResultPostProcessor;
class BoneGenerator; class BoneGenerator;
class Document : public QObject { class Document : public QObject {
@ -230,7 +229,6 @@ signals:
void turnaroundChanged(); void turnaroundChanged();
void editModeChanged(); void editModeChanged();
void resultTextureChanged(); void resultTextureChanged();
void postProcessedResultChanged();
void partSubdivStateChanged(dust3d::Uuid partId); void partSubdivStateChanged(dust3d::Uuid partId);
void partXmirrorStateChanged(dust3d::Uuid partId); void partXmirrorStateChanged(dust3d::Uuid partId);
void partDeformThicknessChanged(dust3d::Uuid partId); void partDeformThicknessChanged(dust3d::Uuid partId);
@ -260,7 +258,6 @@ signals:
void checkNode(dust3d::Uuid nodeId); void checkNode(dust3d::Uuid nodeId);
void checkEdge(dust3d::Uuid edgeId); void checkEdge(dust3d::Uuid edgeId);
void meshGenerating(); void meshGenerating();
void postProcessing();
void textureGenerating(); void textureGenerating();
void textureChanged(); void textureChanged();
void partAdded(dust3d::Uuid partId); void partAdded(dust3d::Uuid partId);
@ -361,6 +358,7 @@ public:
quint64 resultTextureMeshId(); quint64 resultTextureMeshId();
ModelMesh* takeResultBodyBonePreviewMesh(); ModelMesh* takeResultBodyBonePreviewMesh();
quint64 resultBodyBonePreviewMeshId(); quint64 resultBodyBonePreviewMeshId();
quint64 resultTextureImageUpdateVersion();
void updateTurnaround(const QImage& image); void updateTurnaround(const QImage& image);
void clearTurnaround(); void clearTurnaround();
void updateTextureImage(QImage* image); void updateTextureImage(QImage* image);
@ -370,9 +368,7 @@ public:
void updateTextureAmbientOcclusionImage(QImage* image); void updateTextureAmbientOcclusionImage(QImage* image);
const dust3d::Object& currentUvMappedObject() const; const dust3d::Object& currentUvMappedObject() const;
bool isExportReady() const; bool isExportReady() const;
bool isPostProcessResultObsolete() const;
bool isMeshGenerating() const; bool isMeshGenerating() const;
bool isPostProcessing() const;
bool isTextureGenerating() const; bool isTextureGenerating() const;
bool isBoneGenerating() const; bool isBoneGenerating() const;
void collectCutFaceList(std::vector<QString>& cutFaces) const; void collectCutFaceList(std::vector<QString>& cutFaces) const;
@ -451,8 +447,6 @@ public slots:
void meshReady(); void meshReady();
void generateTexture(); void generateTexture();
void textureReady(); void textureReady();
void postProcess();
void postProcessedMeshResultReady();
void generateBone(); void generateBone();
void boneReady(); void boneReady();
void setPartSubdivState(dust3d::Uuid partId, bool subdived); void setPartSubdivState(dust3d::Uuid partId, bool subdived);
@ -571,11 +565,9 @@ private:
dust3d::Object* m_currentObject = nullptr; dust3d::Object* m_currentObject = nullptr;
bool m_isTextureObsolete = false; bool m_isTextureObsolete = false;
UvMapGenerator* m_textureGenerator = nullptr; UvMapGenerator* m_textureGenerator = nullptr;
bool m_isPostProcessResultObsolete = false;
MeshResultPostProcessor* m_postProcessor = nullptr;
std::unique_ptr<dust3d::Object> m_uvMappedObject = std::make_unique<dust3d::Object>(); std::unique_ptr<dust3d::Object> m_uvMappedObject = std::make_unique<dust3d::Object>();
ModelMesh* m_resultTextureMesh = nullptr; ModelMesh* m_resultTextureMesh = nullptr;
unsigned long long m_textureImageUpdateVersion = 0; quint64 m_textureImageUpdateVersion = 0;
bool m_smoothNormal = false; bool m_smoothNormal = false;
quint64 m_meshGenerationId = 0; quint64 m_meshGenerationId = 0;
quint64 m_nextMeshGenerationId = 0; quint64 m_nextMeshGenerationId = 0;

View File

@ -205,10 +205,8 @@ DocumentWindow::DocumentWindow()
connect(m_document, &Document::resultBodyBonePreviewMeshChanged, this, &DocumentWindow::updateInprogressIndicator); connect(m_document, &Document::resultBodyBonePreviewMeshChanged, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::resultComponentPreviewMeshesChanged, this, &DocumentWindow::generateComponentPreviewImages); connect(m_document, &Document::resultComponentPreviewMeshesChanged, this, &DocumentWindow::generateComponentPreviewImages);
connect(m_document, &Document::textureChanged, this, &DocumentWindow::generateComponentPreviewImages); connect(m_document, &Document::textureChanged, this, &DocumentWindow::generateComponentPreviewImages);
connect(m_document, &Document::postProcessing, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::textureGenerating, this, &DocumentWindow::updateInprogressIndicator); connect(m_document, &Document::textureGenerating, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::resultTextureChanged, this, &DocumentWindow::updateInprogressIndicator); connect(m_document, &Document::resultTextureChanged, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::postProcessedResultChanged, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::boneGenerating, this, &DocumentWindow::updateInprogressIndicator); connect(m_document, &Document::boneGenerating, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::resultBoneChanged, this, &DocumentWindow::updateInprogressIndicator); connect(m_document, &Document::resultBoneChanged, this, &DocumentWindow::updateInprogressIndicator);
connect(m_document, &Document::resultBonePreviewMeshesChanged, this, &DocumentWindow::generateBonePreviewImages); connect(m_document, &Document::resultBonePreviewMeshesChanged, this, &DocumentWindow::generateBonePreviewImages);
@ -634,10 +632,9 @@ DocumentWindow::DocumentWindow()
connect(m_document, &Document::skeletonChanged, m_document, &Document::generateMesh); connect(m_document, &Document::skeletonChanged, m_document, &Document::generateMesh);
connect(m_document, &Document::textureChanged, m_document, &Document::generateTexture); connect(m_document, &Document::textureChanged, m_document, &Document::generateTexture);
connect(m_document, &Document::resultMeshChanged, m_document, &Document::postProcess); connect(m_document, &Document::resultMeshChanged, m_document, &Document::generateTexture);
connect(m_document, &Document::postProcessedResultChanged, m_document, &Document::generateTexture);
connect(m_document, &Document::rigChanged, m_document, &Document::generateBone); connect(m_document, &Document::rigChanged, m_document, &Document::generateBone);
connect(m_document, &Document::postProcessedResultChanged, m_document, &Document::generateBone); connect(m_document, &Document::resultMeshChanged, m_document, &Document::generateBone);
connect(m_document, &Document::resultTextureChanged, this, &DocumentWindow::updateRenderModel); connect(m_document, &Document::resultTextureChanged, this, &DocumentWindow::updateRenderModel);
connect(m_document, &Document::resultBodyBonePreviewMeshChanged, this, &DocumentWindow::updateRenderModel); connect(m_document, &Document::resultBodyBonePreviewMeshChanged, this, &DocumentWindow::updateRenderModel);
@ -680,7 +677,7 @@ DocumentWindow::DocumentWindow()
void DocumentWindow::updateInprogressIndicator() void DocumentWindow::updateInprogressIndicator()
{ {
bool inprogress = m_document->isMeshGenerating() || m_document->isPostProcessing() || m_document->isTextureGenerating() || m_document->isBoneGenerating() || nullptr != m_componentPreviewImagesGenerator || nullptr != m_componentPreviewImagesDecorator; bool inprogress = m_document->isMeshGenerating() || m_document->isTextureGenerating() || m_document->isBoneGenerating() || nullptr != m_componentPreviewImagesGenerator || nullptr != m_componentPreviewImagesDecorator;
if (inprogress == m_inprogressIndicator->isSpinning()) if (inprogress == m_inprogressIndicator->isSpinning())
return; return;
m_inprogressIndicator->showSpinner(inprogress); m_inprogressIndicator->showSpinner(inprogress);
@ -1460,12 +1457,13 @@ void DocumentWindow::forceUpdateRenderModel()
mesh = m_document->takeResultBodyBonePreviewMesh(); mesh = m_document->takeResultBodyBonePreviewMesh();
m_currentUpdatedMeshId = m_document->resultBodyBonePreviewMeshId(); m_currentUpdatedMeshId = m_document->resultBodyBonePreviewMeshId();
} else { } else {
if (m_document->isMeshGenerating() || m_document->isPostProcessing() || m_document->isTextureGenerating()) { if (m_document->isMeshGenerating() || m_document->isTextureGenerating()) {
mesh = m_document->takeResultMesh(); mesh = m_document->takeResultMesh();
m_currentUpdatedMeshId = m_document->resultMeshId(); m_currentUpdatedMeshId = m_document->resultMeshId();
} else { } else {
mesh = m_document->takeResultTextureMesh(); mesh = m_document->takeResultTextureMesh();
m_currentUpdatedMeshId = m_document->resultTextureMeshId(); m_currentUpdatedMeshId = m_document->resultTextureMeshId();
m_currentTextureImageUpdateVersion = m_document->resultTextureImageUpdateVersion();
} }
if (m_modelRemoveColor && mesh) if (m_modelRemoveColor && mesh)
mesh->removeColor(); mesh->removeColor();
@ -1476,15 +1474,19 @@ void DocumentWindow::forceUpdateRenderModel()
void DocumentWindow::updateRenderModel() void DocumentWindow::updateRenderModel()
{ {
qint64 shouldShowId = 0; qint64 shouldShowId = 0;
if (m_document->isMeshGenerating() || m_document->isPostProcessing() || m_document->isTextureGenerating()) { quint64 shouldShowTextureVersion = m_currentTextureImageUpdateVersion;
if (m_document->isMeshGenerating() || m_document->isTextureGenerating()) {
shouldShowId = m_document->resultMeshId(); shouldShowId = m_document->resultMeshId();
} else { } else {
shouldShowId = -(qint64)m_document->resultTextureMeshId(); shouldShowId = -(qint64)m_document->resultTextureMeshId();
shouldShowTextureVersion = m_document->resultTextureImageUpdateVersion();
} }
if (shouldShowId == m_currentUpdatedMeshId) if (shouldShowId == m_currentUpdatedMeshId && shouldShowTextureVersion == m_currentTextureImageUpdateVersion) {
return; return;
if (std::abs(shouldShowId) < std::abs(m_currentUpdatedMeshId)) }
if (std::abs(shouldShowId) < std::abs(m_currentUpdatedMeshId)) {
return; return;
}
forceUpdateRenderModel(); forceUpdateRenderModel();
} }

View File

@ -119,6 +119,7 @@ private:
bool m_isLastMeshGenerationSucceed = true; bool m_isLastMeshGenerationSucceed = true;
qint64 m_currentUpdatedMeshId = 0; qint64 m_currentUpdatedMeshId = 0;
quint64 m_currentUpdatedWireframeId = 0; quint64 m_currentUpdatedWireframeId = 0;
quint64 m_currentTextureImageUpdateVersion = 0;
QStringList m_waitingForExportToFilenames; QStringList m_waitingForExportToFilenames;
QString m_currentFilename; QString m_currentFilename;

View File

@ -1,50 +0,0 @@
#include "mesh_result_post_processor.h"
#include <QGuiApplication>
#include <dust3d/mesh/resolve_triangle_tangent.h>
MeshResultPostProcessor::MeshResultPostProcessor(const dust3d::Object& object)
{
m_object = new dust3d::Object;
*m_object = object;
}
MeshResultPostProcessor::~MeshResultPostProcessor()
{
delete m_object;
}
dust3d::Object* MeshResultPostProcessor::takePostProcessedObject()
{
dust3d::Object* object = m_object;
m_object = nullptr;
return object;
}
void MeshResultPostProcessor::poseProcess()
{
//if (!m_object->nodes.empty()) {
/*
{
std::vector<std::vector<dust3d::Vector2>> triangleVertexUvs;
std::set<int> seamVertices;
std::map<dust3d::Uuid, std::vector<dust3d::Rectangle>> partUvRects;
dust3d::unwrapUv(*m_object, triangleVertexUvs, seamVertices, partUvRects);
m_object->setTriangleVertexUvs(triangleVertexUvs);
m_object->setPartUvRects(partUvRects);
}
{
std::vector<dust3d::Vector3> triangleTangents;
dust3d::resolveTriangleTangent(*m_object, triangleTangents);
m_object->setTriangleTangents(triangleTangents);
}
*/
//}
}
void MeshResultPostProcessor::process()
{
poseProcess();
emit finished();
}

View File

@ -1,23 +0,0 @@
#ifndef DUST3D_APPLICATION_MESH_RESULT_POST_PROCESSOR_H_
#define DUST3D_APPLICATION_MESH_RESULT_POST_PROCESSOR_H_
#include <QObject>
#include <dust3d/base/object.h>
class MeshResultPostProcessor : public QObject {
Q_OBJECT
public:
MeshResultPostProcessor(const dust3d::Object& object);
~MeshResultPostProcessor();
dust3d::Object* takePostProcessedObject();
void poseProcess();
signals:
void finished();
public slots:
void process();
private:
dust3d::Object* m_object = nullptr;
};
#endif

View File

@ -275,7 +275,7 @@ void BoneGenerator::generateBonePreviews()
} }
} }
} }
std::vector<Color> bodyVertexColors(m_vertices.size()); std::vector<Color> bodyVertexColors(m_vertices.size(), Color(0.0, 0.0, 0.0, 0.0));
for (const auto& it : vertexSkinColors) { for (const auto& it : vertexSkinColors) {
Color color; Color color;
for (const auto& colorIt : it.second) for (const auto& colorIt : it.second)