2022-10-02 19:45:46 +00:00
|
|
|
|
|
|
|
#include <dust3d/mesh/smooth_normal.h>
|
|
|
|
#include <dust3d/mesh/trim_vertices.h>
|
2021-11-18 14:58:01 +00:00
|
|
|
#include <QElapsedTimer>
|
|
|
|
#include <QDebug>
|
|
|
|
#include "mesh_generator.h"
|
|
|
|
#include "cut_face_preview.h"
|
|
|
|
|
|
|
|
MeshGenerator::MeshGenerator(dust3d::Snapshot *snapshot) :
|
|
|
|
dust3d::MeshGenerator(snapshot)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
MeshGenerator::~MeshGenerator()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2022-10-02 19:45:46 +00:00
|
|
|
std::map<dust3d::Uuid, std::unique_ptr<ModelMesh>> *MeshGenerator::takeComponentPreviewMeshes()
|
2021-11-18 14:58:01 +00:00
|
|
|
{
|
2022-10-02 19:45:46 +00:00
|
|
|
return m_componentPreviewMeshes.release();
|
2021-11-18 14:58:01 +00:00
|
|
|
}
|
|
|
|
|
2022-09-23 15:54:49 +00:00
|
|
|
MonochromeMesh *MeshGenerator::takeWireframeMesh()
|
|
|
|
{
|
|
|
|
return m_wireframeMesh.release();
|
|
|
|
}
|
|
|
|
|
2021-11-18 14:58:01 +00:00
|
|
|
void MeshGenerator::process()
|
|
|
|
{
|
|
|
|
QElapsedTimer countTimeConsumed;
|
|
|
|
countTimeConsumed.start();
|
|
|
|
|
|
|
|
generate();
|
|
|
|
|
|
|
|
if (nullptr != m_object)
|
2022-10-02 19:45:46 +00:00
|
|
|
m_resultMesh = std::make_unique<ModelMesh>(*m_object);
|
2021-11-18 14:58:01 +00:00
|
|
|
|
2022-10-02 19:45:46 +00:00
|
|
|
m_componentPreviewMeshes = std::make_unique<std::map<dust3d::Uuid, std::unique_ptr<ModelMesh>>>();
|
|
|
|
for (const auto &componentId: m_generatedPreviewComponentIds) {
|
|
|
|
auto it = m_generatedComponentPreviews.find(componentId);
|
|
|
|
if (it == m_generatedComponentPreviews.end())
|
2021-11-18 14:58:01 +00:00
|
|
|
continue;
|
2022-10-02 19:45:46 +00:00
|
|
|
dust3d::trimVertices(&it->second.vertices, true);
|
|
|
|
for (auto &it: it->second.vertices) {
|
|
|
|
it *= 2.0;
|
|
|
|
}
|
|
|
|
std::vector<dust3d::Vector3> previewTriangleNormals;
|
|
|
|
previewTriangleNormals.reserve(it->second.triangles.size());
|
|
|
|
for (const auto &face: it->second.triangles) {
|
|
|
|
previewTriangleNormals.emplace_back(dust3d::Vector3::normal(
|
|
|
|
it->second.vertices[face[0]],
|
|
|
|
it->second.vertices[face[1]],
|
|
|
|
it->second.vertices[face[2]]
|
|
|
|
));
|
|
|
|
}
|
|
|
|
std::vector<std::vector<dust3d::Vector3>> previewTriangleVertexNormals;
|
|
|
|
dust3d::smoothNormal(it->second.vertices,
|
|
|
|
it->second.triangles,
|
|
|
|
previewTriangleNormals,
|
|
|
|
0,
|
|
|
|
&previewTriangleVertexNormals);
|
|
|
|
(*m_componentPreviewMeshes)[componentId] = std::make_unique<ModelMesh>(it->second.vertices,
|
2021-11-18 14:58:01 +00:00
|
|
|
it->second.triangles,
|
2022-10-02 19:45:46 +00:00
|
|
|
previewTriangleVertexNormals,
|
2021-11-18 14:58:01 +00:00
|
|
|
it->second.color,
|
|
|
|
it->second.metalness,
|
2022-10-07 20:26:30 +00:00
|
|
|
it->second.roughness,
|
|
|
|
it->second.vertexProperties.empty() ? nullptr : &it->second.vertexProperties);
|
2021-11-18 14:58:01 +00:00
|
|
|
}
|
2022-09-23 15:54:49 +00:00
|
|
|
|
|
|
|
if (nullptr != m_object)
|
|
|
|
m_wireframeMesh = std::make_unique<MonochromeMesh>(*m_object);
|
2021-11-18 14:58:01 +00:00
|
|
|
|
|
|
|
qDebug() << "The mesh generation took" << countTimeConsumed.elapsed() << "milliseconds";
|
|
|
|
|
|
|
|
emit finished();
|
|
|
|
}
|
|
|
|
|
2022-09-23 15:54:49 +00:00
|
|
|
ModelMesh *MeshGenerator::takeResultMesh()
|
2021-11-18 14:58:01 +00:00
|
|
|
{
|
2022-10-02 19:45:46 +00:00
|
|
|
return m_resultMesh.release();
|
2021-11-18 14:58:01 +00:00
|
|
|
}
|
|
|
|
|