From 6508f54333497ef665dfc4262017f9cd4248552e Mon Sep 17 00:00:00 2001 From: wuyize Date: Fri, 10 Mar 2023 19:41:06 +0800 Subject: [PATCH 1/4] =?UTF-8?q?MaterialStyle=E5=8A=A0=E5=85=A5=E6=B7=B1?= =?UTF-8?q?=E6=8B=B7=E8=B4=9D=E6=96=B9=E6=B3=95clone?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LayerStyleDialog.cpp | 2 +- .../src/Editor/LayerStyle.cpp | 8 +++---- .../src/Editor/LayerStyle.h | 6 +++--- .../src/Renderer/Painting/BaseStyle.h | 1 + .../Renderer/Painting/MaterialStyleFill.cpp | 10 +++++++++ .../src/Renderer/Painting/MaterialStyleFill.h | 17 ++++++++------- .../Renderer/Painting/MaterialStyleStroke.cpp | 21 +++++++++++++------ .../Renderer/Painting/MaterialStyleStroke.h | 6 +++++- 8 files changed, 49 insertions(+), 22 deletions(-) diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp index ffc3899..7a7db8d 100644 --- a/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp +++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetComponent/LayerStyleDialog.cpp @@ -18,7 +18,7 @@ LayerStyleDialog::LayerStyleDialog( if (existedStyle) { - this->modifyingStyle = std::make_unique(existedStyle->clonePtr()); + this->modifyingStyle = existedStyle->clonePtr(); this->styleContainer = nullptr; this->styleWidget = modifyingStyle->getInputWidget(); diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp index d4ba2ad..c76432f 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.cpp @@ -54,9 +54,9 @@ StrokeElementLayerStyle::StrokeElementLayerStyle(const StrokeElementLayerStyle& } } -std::shared_ptr StrokeElementLayerStyle::clonePtr() const +std::unique_ptr StrokeElementLayerStyle::clonePtr() const { - return std::make_shared(StrokeElementLayerStyle(*this)); + return std::make_unique(StrokeElementLayerStyle(*this)); } std::vector FillElementLayerStyle::toBaseStyles() const @@ -97,7 +97,7 @@ FillElementLayerStyle::FillElementLayerStyle(const FillElementLayerStyle& other) } } -std::shared_ptr FillElementLayerStyle::clonePtr() const +std::unique_ptr FillElementLayerStyle::clonePtr() const { - return std::make_shared(FillElementLayerStyle(*this)); + return std::make_unique(FillElementLayerStyle(*this)); } diff --git a/ArchitectureColoredPainting/src/Editor/LayerStyle.h b/ArchitectureColoredPainting/src/Editor/LayerStyle.h index 4f10384..79a49ec 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerStyle.h +++ b/ArchitectureColoredPainting/src/Editor/LayerStyle.h @@ -24,7 +24,7 @@ public: virtual QWidget* getInputWidget() const = 0; virtual QWidget* getListDisplayWidget() const = 0; virtual ~LayerStyle() {}; - virtual std::shared_ptr clonePtr() const = 0; + virtual std::unique_ptr clonePtr() const = 0; }; class StrokeElementLayerStyle : public Renderer::ElementStyle, public LayerStyle @@ -38,7 +38,7 @@ public: StrokeElementLayerStyle(const StrokeElementLayerStyle& other); ~StrokeElementLayerStyle() = default; std::vector> materialStyles; - std::shared_ptr clonePtr() const override; + std::unique_ptr clonePtr() const override; }; class FillElementLayerStyle : public Renderer::ElementStyle, public LayerStyle @@ -52,5 +52,5 @@ public: FillElementLayerStyle(const FillElementLayerStyle& other); ~FillElementLayerStyle() = default; std::vector> materialStyles; - std::shared_ptr clonePtr() const override; + std::unique_ptr clonePtr() const override; }; \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/BaseStyle.h b/ArchitectureColoredPainting/src/Renderer/Painting/BaseStyle.h index 0a23c1a..6a1e7a8 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/BaseStyle.h +++ b/ArchitectureColoredPainting/src/Renderer/Painting/BaseStyle.h @@ -23,6 +23,7 @@ namespace Renderer public: virtual MaterialStyleType type() const = 0; virtual std::vector encoded() const = 0; + virtual std::unique_ptr clone() const = 0; virtual bool operator==(const MaterialStyle&) const = 0; }; diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.cpp b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.cpp index 889b72e..318895c 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.cpp @@ -18,6 +18,11 @@ std::vector Renderer::FillPlain::encoded() const glm::uintBitsToFloat(glm::packUnorm4x8(glm::vec4(color.redF(), color.greenF(), color.blueF(), color.alphaF())))}; } +std::unique_ptr Renderer::FillPlain::clone() const +{ + return std::make_unique(*this); +} + bool Renderer::FillPlain::operator==(const MaterialFill& m) const { return type() == m.type() @@ -42,6 +47,11 @@ std::vector Renderer::MaterialStyleFill::encoded() const return materialFill->encoded(); } +std::unique_ptr Renderer::MaterialStyleFill::clone() const +{ + return std::make_unique(materialFill->clone()); +} + bool Renderer::MaterialStyleFill::operator==(const MaterialStyle& m) const { return type() == m.type() && *materialFill == *static_cast(m).materialFill; diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.h b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.h index 6280936..e3c1001 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.h +++ b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleFill.h @@ -10,6 +10,7 @@ namespace Renderer public: virtual MaterialFillType type() const = 0; virtual std::vector encoded() const = 0; + virtual std::unique_ptr clone() const = 0; virtual bool operator==(const MaterialFill&) const = 0; }; @@ -19,6 +20,7 @@ namespace Renderer FillPlain(QColor color, float metallic, float roughness); virtual MaterialFillType type() const override; virtual std::vector encoded() const override; + virtual std::unique_ptr clone() const override; virtual bool operator==(const MaterialFill&) const override; QColor color; @@ -26,16 +28,17 @@ namespace Renderer float roughness; }; - class MaterialStyleFill : public MaterialStyle - { - public: + class MaterialStyleFill : public MaterialStyle + { + public: MaterialStyleFill(std::shared_ptr materialFill); - virtual MaterialStyleType type() const override; - virtual std::vector encoded() const override; + virtual MaterialStyleType type() const override; + virtual std::vector encoded() const override; + virtual std::unique_ptr clone() const override; virtual bool operator==(const MaterialStyle&) const override; - //protected: + //protected: std::shared_ptr materialFill; - }; + }; } diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.cpp b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.cpp index 7834d21..340b767 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.cpp @@ -18,6 +18,11 @@ MaterialStrokeType Renderer::StrokePlain::type() const return MaterialStrokeType::kPlain; } +std::unique_ptr Renderer::StrokePlain::clone() const +{ + return std::make_unique(*this); +} + std::vector Renderer::StrokePlain::encoded() const { return { glm::uintBitsToFloat(glm::packUnorm4x8(glm::vec4(material.toVec().second, 0.f, 0.f))), @@ -58,6 +63,11 @@ std::vector Renderer::StrokeRadialGradient::encoded() const return result; } +std::unique_ptr Renderer::StrokeRadialGradient::clone() const +{ + return std::make_unique(*this); +} + bool Renderer::StrokeRadialGradient::operator==(const MaterialStroke& m) const { return type() == m.type() @@ -70,12 +80,6 @@ Renderer::MaterialStyleStroke::MaterialStyleStroke(float width, StrokeType strok { } -Renderer::MaterialStyleStroke::MaterialStyleStroke(const MaterialStyleStroke& s) - :halfWidth(s.halfWidth), strokeType(s.strokeType), endType(s.endType), materialStroke(std::make_shared(*s.materialStroke)) -{ - -} - MaterialStyleType Renderer::MaterialStyleStroke::type() const { return MaterialStyleType::kStroke; @@ -93,6 +97,11 @@ std::vector Renderer::MaterialStyleStroke::encoded() const return v; } +std::unique_ptr Renderer::MaterialStyleStroke::clone() const +{ + return std::make_unique(halfWidth*2, strokeType, endType, materialStroke->clone()); +} + bool Renderer::MaterialStyleStroke::operator==(const MaterialStyle& m) const { return type() == m.type() && *materialStroke == *static_cast(m).materialStroke; diff --git a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.h b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.h index 6da06ff..db5ddbf 100644 --- a/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.h +++ b/ArchitectureColoredPainting/src/Renderer/Painting/MaterialStyleStroke.h @@ -11,6 +11,7 @@ namespace Renderer public: virtual MaterialStrokeType type() const = 0; virtual std::vector encoded() const = 0; + virtual std::unique_ptr clone() const = 0; virtual bool operator==(const MaterialStroke&) const = 0; }; @@ -20,7 +21,9 @@ namespace Renderer StrokePlain(QColor color, float metallic, float roughness); StrokePlain(const Material& material); virtual MaterialStrokeType type() const override; + virtual std::unique_ptr clone() const override; virtual std::vector encoded() const override; + virtual bool operator==(const MaterialStroke&) const override; Material material; @@ -32,6 +35,7 @@ namespace Renderer StrokeRadialGradient(const std::map& materialMap, bool gradual); virtual MaterialStrokeType type() const override; virtual std::vector encoded() const override; + virtual std::unique_ptr clone() const override; virtual bool operator==(const MaterialStroke&) const override; std::map materialMap; @@ -45,9 +49,9 @@ namespace Renderer { public: MaterialStyleStroke(float width, StrokeType strokeType, StrokeEndType endType, std::shared_ptr materialStroke); - MaterialStyleStroke(const MaterialStyleStroke&); virtual MaterialStyleType type() const override; virtual std::vector encoded() const override; + virtual std::unique_ptr clone() const override; virtual bool operator==(const MaterialStyle&) const override; float getHalfWidth() const; //protected: From 3dd7fd7c0f2136754792fea48e82dbc63c55c3f5 Mon Sep 17 00:00:00 2001 From: karlis <2995621482@qq.com> Date: Fri, 10 Mar 2023 19:44:18 +0800 Subject: [PATCH 2/4] bug fix --- .../src/Editor/LayerWrapper.cpp | 25 ++++++++++--------- .../src/Editor/LayerWrapper.h | 2 +- .../src/Editor/RightBar/LayerTreeWidget.cpp | 2 +- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp index 9135744..628965b 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp @@ -33,6 +33,7 @@ PixelPath LayerWrapper::getCache() LayerWrapper::LayerWrapper(QJsonObject json, FolderLayerWrapper*parent) { this->parent = parent; + this->qTreeWidgetItem = new QTreeWidgetItem(); auto transformJson = json.value("transform").toObject(); property.name = json.value("name").toString(); property.offset = {transformJson.value("offset").toObject().value("x").toDouble(), @@ -119,22 +120,22 @@ void LayerWrapper::setParent(FolderLayerWrapper* newParent) void FolderLayerWrapper::removeAllChild() { children.clear(); - qTreeWidgetItem.takeChildren(); + qTreeWidgetItem->takeChildren(); } void LayerWrapper::del() { qDebug() << "LayerWrapper::del()"; if (parent != nullptr){ - qTreeWidgetItem.takeChildren(); - parent->qTreeWidgetItem.removeChild(&qTreeWidgetItem); + qTreeWidgetItem->takeChildren(); + parent->qTreeWidgetItem->removeChild(qTreeWidgetItem); } } void LayerWrapper::delSelf() { qDebug() << "LayerWrapper::delSelf()"; if (parent != nullptr) { - qTreeWidgetItem.takeChildren(); - parent->qTreeWidgetItem.removeChild(&qTreeWidgetItem); + qTreeWidgetItem->takeChildren(); + parent->qTreeWidgetItem->removeChild(qTreeWidgetItem); } } @@ -154,7 +155,7 @@ void FolderLayerWrapper::delSelf() { qDebug() << this; for (auto& child : this->children) { this->parent->addChild(child); - this->parent->qTreeWidgetItem.addChild(&child.get()->qTreeWidgetItem); + this->parent->qTreeWidgetItem->addChild(child.get()->qTreeWidgetItem); child->setParent(this->parent); } while (!this->children.empty()) { @@ -166,18 +167,18 @@ void FolderLayerWrapper::delSelf() { QTreeWidgetItem* LayerWrapper::getQTreeItem() { - this->qTreeWidgetItem.setText(0, this->property.name); - this->qTreeWidgetItem.setData(0, Qt::UserRole, QVariant::fromValue(this)); - return &this->qTreeWidgetItem; + this->qTreeWidgetItem->setText(0, this->property.name); + this->qTreeWidgetItem->setData(0, Qt::UserRole, QVariant::fromValue(this)); + return this->qTreeWidgetItem; } QTreeWidgetItem* FolderLayerWrapper::getQTreeItem() { - while (this->qTreeWidgetItem.childCount() > 0) { - this->qTreeWidgetItem.removeChild(this->qTreeWidgetItem.child(0)); + while (this->qTreeWidgetItem->childCount() > 0) { + this->qTreeWidgetItem->removeChild(this->qTreeWidgetItem->child(0)); } for (auto& child : this->children) { - this->qTreeWidgetItem.addChild(child->getQTreeItem()); + this->qTreeWidgetItem->addChild(child->getQTreeItem()); } return LayerWrapper::getQTreeItem(); } diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.h b/ArchitectureColoredPainting/src/Editor/LayerWrapper.h index 08f0c9b..57492a8 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.h +++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.h @@ -33,7 +33,7 @@ class LayerWrapper PixelPath cache; public: - QTreeWidgetItem qTreeWidgetItem; + QTreeWidgetItem* qTreeWidgetItem; struct SimpleProperty { QString name = ""; diff --git a/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp b/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp index 1d7cee7..fd04735 100644 --- a/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp +++ b/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp @@ -51,7 +51,7 @@ void LayerTreeWidget::popMenu(const QPoint &pos) else newLayer = new LeafLayerWrapper(jsonObj, this->elementManager, folderLayer); folderLayer->addChild(std::shared_ptr(newLayer)); - folderLayer->qTreeWidgetItem.addChild(newLayer->getQTreeItem()); + folderLayer->qTreeWidgetItem->addChild(newLayer->getQTreeItem()); qDebug() << jsonObj<<"----------------------"; this->refresh(); emit requireRefreshPreview(); From 4bfdb0d9f65c20b7c2c46afcce55654dbbb50547 Mon Sep 17 00:00:00 2001 From: wuyize Date: Fri, 10 Mar 2023 23:24:19 +0800 Subject: [PATCH 3/4] =?UTF-8?q?Fix:=20=E6=A8=A1=E5=9E=8B=E5=8C=85=E5=9B=B4?= =?UTF-8?q?=E7=9B=92=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Renderer/Mesh.h | 6 +- .../src/Renderer/Model.cpp | 76 +++++++------------ .../src/Renderer/PaintingMesh.h | 6 +- .../src/Renderer/RendererGLWidget.cpp | 11 +-- .../src/Renderer/RendererGLWidget.h | 2 +- .../src/Renderer/RendererWidget.cpp | 14 +++- 6 files changed, 53 insertions(+), 62 deletions(-) diff --git a/ArchitectureColoredPainting/src/Renderer/Mesh.h b/ArchitectureColoredPainting/src/Renderer/Mesh.h index d7bc6b7..dd1d705 100644 --- a/ArchitectureColoredPainting/src/Renderer/Mesh.h +++ b/ArchitectureColoredPainting/src/Renderer/Mesh.h @@ -1,7 +1,7 @@ #pragma once #include #include -#include +#include #include #include #include @@ -38,8 +38,8 @@ namespace Renderer class Mesh : public Drawable { public: - QVector vertices; - QVector indices; + std::vector vertices; + std::vector indices; //QVector textures; GLuint textureBasecolor = 0; GLuint textureMetallicRoughness = 0; diff --git a/ArchitectureColoredPainting/src/Renderer/Model.cpp b/ArchitectureColoredPainting/src/Renderer/Model.cpp index 0cd402c..a22be70 100644 --- a/ArchitectureColoredPainting/src/Renderer/Model.cpp +++ b/ArchitectureColoredPainting/src/Renderer/Model.cpp @@ -86,7 +86,9 @@ void Renderer::Model::loadModel(QString path) maxY = std::numeric_limits::min(); minZ = std::numeric_limits::max(); maxZ = std::numeric_limits::min(); - processNode(scene->mRootNode, scene); + aiMatrix4x4 transform; + aiMatrix4x4::Scaling(aiVector3D(1 / 0.008), transform); + processNode(scene->mRootNode, scene, transform * scene->mRootNode->mTransformation); AABB.push_back(QVector3D(minX, minY, minZ)); AABB.push_back(QVector3D(minX, minY, maxZ)); AABB.push_back(QVector3D(minX, maxY, minZ)); @@ -121,36 +123,35 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiString str; material->GetTexture(aiTextureType_BASE_COLOR, 0, &str); + std::vector vertices; + for (unsigned int i = 0; i < mesh->mNumVertices; i++) + { + if (mesh->mNormals && mesh->mTextureCoords[0]) + { + auto pos = mesh->mVertices[i]; + vertices.push_back(Vertex(pos, mesh->mNormals[i], mesh->mTextureCoords[0][i])); + auto worldPos = model * pos; + minX = std::min(minX, worldPos.x); + maxX = std::max(maxX, worldPos.x); + minY = std::min(minY, worldPos.y); + maxY = std::max(maxY, worldPos.y); + minZ = std::min(minZ, worldPos.z); + maxZ = std::max(maxZ, worldPos.z); + } + } + std::vector indices; + for (auto face = mesh->mFaces; face < mesh->mFaces + mesh->mNumFaces; face++) + indices.insert(indices.end(), face->mIndices, face->mIndices + face->mNumIndices); + + if (auto iter = paintingMap.find(std::string(str.C_Str())); paintingProgram != nullptr && iter != paintingMap.end()) { auto& [paintingPath, leftBottom, rightTop] = iter->second; qDebug() << str.C_Str() << "Replaced"; - // 初始化网格 - auto m_mesh = std::make_unique(glFunc, paintingProgram, shadowProgram, modelQ); - // 遍历网格的每个顶点 - for (unsigned int i = 0; i < mesh->mNumVertices; i++) - { - if (mesh->mNormals && mesh->mTextureCoords[0]) - { - Vertex vertex(mesh->mVertices[i], mesh->mNormals[i], mesh->mTextureCoords[0][i]); - minX = std::min(minX, vertex.Position.x()); - maxX = std::max(maxX, vertex.Position.x()); - minY = std::min(minY, vertex.Position.y()); - maxY = std::max(maxY, vertex.Position.y()); - minZ = std::min(minZ, vertex.Position.z()); - maxZ = std::max(maxZ, vertex.Position.z()); - m_mesh->vertices.push_back(vertex); - } - } - for (unsigned int i = 0; i < mesh->mNumFaces; i++) - { - aiFace face = mesh->mFaces[i]; - // 将所有面的索引数据添加到索引数组中 - for (unsigned int j = 0; j < face.mNumIndices; j++) { - m_mesh->indices.push_back(face.mIndices[j]); - } - } + auto m_mesh = std::make_unique(glFunc, paintingProgram, shadowProgram, modelQ); + m_mesh->vertices = vertices; + m_mesh->indices = indices; m_mesh->paintingId = loadPainting(paintingPath); auto& handle = vtManager->getPaintingHandle(m_mesh->paintingId); @@ -161,28 +162,9 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, } else { - // 初始化网格 auto m_mesh = std::make_unique(glFunc, shaderProgram, shadowProgram, modelQ); - // 遍历网格的每个顶点 - for (unsigned int i = 0; i < mesh->mNumVertices; i++) - { - if (mesh->mNormals && mesh->mTextureCoords[0]) - { - Vertex vertex(mesh->mVertices[i], mesh->mNormals[i], mesh->mTextureCoords[0][i]); - minX = std::min(minX, vertex.Position.x()); - maxX = std::max(maxX, vertex.Position.x()); - minY = std::min(minY, vertex.Position.y()); - maxY = std::max(maxY, vertex.Position.y()); - minZ = std::min(minZ, vertex.Position.z()); - maxZ = std::max(maxZ, vertex.Position.z()); - m_mesh->vertices.push_back(vertex); - } - } - - // 将所有面的索引数据添加到索引数组中 - for (auto face = mesh->mFaces; face < mesh->mFaces + mesh->mNumFaces; face++) - for (auto indice = face->mIndices; indice < face->mIndices + face->mNumIndices; indice++) - m_mesh->indices.push_back(*indice); + m_mesh->vertices = vertices; + m_mesh->indices = indices; // 处理材质 if (!(m_mesh->textureBasecolor = loadMaterialTextures(material, aiTextureType_BASE_COLOR))) diff --git a/ArchitectureColoredPainting/src/Renderer/PaintingMesh.h b/ArchitectureColoredPainting/src/Renderer/PaintingMesh.h index 595c9ea..773a992 100644 --- a/ArchitectureColoredPainting/src/Renderer/PaintingMesh.h +++ b/ArchitectureColoredPainting/src/Renderer/PaintingMesh.h @@ -1,7 +1,7 @@ #pragma once #include #include -#include +#include #include #include #include @@ -18,8 +18,8 @@ namespace Renderer class PaintingMesh : public Drawable { public: - QVector vertices; - QVector indices; + std::vector vertices; + std::vector indices; GLuint textureBasecolor; GLuint textureMetallicRoughness; QMatrix4x4 model; diff --git a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp index 5caa9e6..679bfcb 100644 --- a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp +++ b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.cpp @@ -73,17 +73,14 @@ void RendererGLWidget::stopTimer() timerId = -1; } -void RendererGLWidget::setModel() +void RendererGLWidget::setModel(QString path) { makeCurrent(); - model->loadModel("Models/Sponza/Sponza.gltf"); - //model = new Model("E:\\3D Objects\\gallery_gltf\\gallery_gltf.gltf", context(), modelProgramPtr, paintingProgramPtr, shadowProgramPtr, paintingHelper); + //model->loadModel("Models/Sponza/Sponza.gltf"); + //model->loadModel("E:\\3D Objects\\Gate\\gltf\\Gate.gltf"); + model->loadModel(path); light.model = model; qDebug() << model->AABB; - //paintingHelper->allocateBuffers(); - //paintingCompProgramPtr->bind(); - //paintingHelper->bindPaintingBuffers(); - //paintingCompProgramPtr->release(); doneCurrent(); } diff --git a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.h b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.h index e590cf7..5565f46 100644 --- a/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.h +++ b/ArchitectureColoredPainting/src/Renderer/RendererGLWidget.h @@ -26,7 +26,7 @@ namespace Renderer void startTimer(); void stopTimer(); public slots: - void setModel(); + void setModel(QString path); void setMainLightPitch(float pitch); void setMainLightYaw(float yaw); void setExposure(float exposure); diff --git a/ArchitectureColoredPainting/src/Renderer/RendererWidget.cpp b/ArchitectureColoredPainting/src/Renderer/RendererWidget.cpp index 27bc6c8..5e777a4 100644 --- a/ArchitectureColoredPainting/src/Renderer/RendererWidget.cpp +++ b/ArchitectureColoredPainting/src/Renderer/RendererWidget.cpp @@ -1,6 +1,7 @@ #include "RendererWidget.h" #include "RendererGLWidget.h" #include "../FluentMenu.h" +#include Renderer::RendererWidget::RendererWidget(QWidget* parent) : QWidget(parent) @@ -10,8 +11,10 @@ Renderer::RendererWidget::RendererWidget(QWidget* parent) FluentMenu* menu = new FluentMenu(this); auto openAction = new QAction(QStringLiteral("打开"), menu); auto saveAction = new QAction(QStringLiteral("保存"), menu); + auto testAction = new QAction(QStringLiteral("测试"), menu); menu->addAction(openAction); menu->addAction(saveAction); + menu->addAction(testAction); ui.openButton->setHaloVisible(false); ui.openButton->setOverlayStyle(::Material::TintedOverlay); @@ -34,7 +37,16 @@ Renderer::RendererWidget::RendererWidget(QWidget* parent) QObject::connect(ui.exposureSlider, &QSlider::valueChanged, [&](int value) { ui.openGLWidget->setExposure(value / 100.f); }); - QObject::connect(openAction, &QAction::triggered, ui.openGLWidget, &Renderer::RendererGLWidget::setModel); + + QObject::connect(openAction, &QAction::triggered, [&] { + QString fileName = QFileDialog::getOpenFileName(this, QStringLiteral("打开模型"), QString(), QStringLiteral("glTF 2.0 (*.gltf)")); + qDebug() << fileName; + if (fileName != QString()) + ui.openGLWidget->setModel(fileName); + }); + QObject::connect(testAction, &QAction::triggered, [&] { + ui.openGLWidget->setModel("Models/Sponza/Sponza.gltf"); + }); ui.horizontalSlider->setValue(105); ui.horizontalSlider_2->setValue(80); From c92a3553ce74933bbf183c385944db6f6d93d462 Mon Sep 17 00:00:00 2001 From: karlis <2995621482@qq.com> Date: Sat, 11 Mar 2023 18:33:56 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9getReferencedBy=E4=B8=BA?= =?UTF-8?q?=E5=8A=A8=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Editor/ElementManager.cpp | 22 +++++++++++++++++++ .../src/Editor/ElementManager.h | 3 +++ .../src/Editor/LayerWrapper.cpp | 17 ++++++++++---- .../src/Editor/LayerWrapper.h | 4 +++- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/ArchitectureColoredPainting/src/Editor/ElementManager.cpp b/ArchitectureColoredPainting/src/Editor/ElementManager.cpp index 0177c31..95984c8 100644 --- a/ArchitectureColoredPainting/src/Editor/ElementManager.cpp +++ b/ArchitectureColoredPainting/src/Editor/ElementManager.cpp @@ -45,4 +45,26 @@ QJsonObject ElementManager::toJson() const QJsonObject result; result.insert("elements", elementsJson); return result; +} + +int ElementManager::getElementIndex(GraphicElement* pelement) +{ + for (int i = 0; i < elements.size(); i++) + if (elements[i] == pelement) + return i; + return -1; +} + +int ElementManager::getLayerReferencedBy(const FolderLayerWrapper* layer) +{ + for (int i = 0; i < elements.size(); i++) + if (typeid(*elements[i]) == typeid(GroupElement)) { + qDebug() << ((GroupElement*)elements[i])->sourceLayer; + qDebug() << layer; + qDebug() << "------------"; + if (((GroupElement*)elements[i])->sourceLayer == layer) + return i; + } + + return -1; } \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/ElementManager.h b/ArchitectureColoredPainting/src/Editor/ElementManager.h index 1c76067..d077d6e 100644 --- a/ArchitectureColoredPainting/src/Editor/ElementManager.h +++ b/ArchitectureColoredPainting/src/Editor/ElementManager.h @@ -8,6 +8,7 @@ using std::vector; class LayerManager; class GraphicElement; class Renderer::ElementRenderer; +class FolderLayerWrapper; class ElementManager { @@ -24,4 +25,6 @@ class ElementManager * only used in initialization */ GraphicElement *getElementById(int index); + int getElementIndex(GraphicElement* pElement); + int getLayerReferencedBy(const FolderLayerWrapper* layer); }; diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp index 628965b..731353f 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp +++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp @@ -30,9 +30,10 @@ PixelPath LayerWrapper::getCache() } // TODO: undone -LayerWrapper::LayerWrapper(QJsonObject json, FolderLayerWrapper*parent) +LayerWrapper::LayerWrapper(QJsonObject json, FolderLayerWrapper*parent, ElementManager* elementManager) { this->parent = parent; + this->elementManager = elementManager; this->qTreeWidgetItem = new QTreeWidgetItem(); auto transformJson = json.value("transform").toObject(); property.name = json.value("name").toString(); @@ -44,7 +45,7 @@ LayerWrapper::LayerWrapper(QJsonObject json, FolderLayerWrapper*parent) } FolderLayerWrapper::FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent) - : LayerWrapper(json, parent) + : LayerWrapper(json, parent, elementManager) { qDebug() << json.value("name").toString() << " " << this; QJsonArray childrenJson = json.value("children").toArray(); @@ -205,8 +206,8 @@ QJsonObject FolderLayerWrapper::toJson() const childrenJson.push_back(child->toJson()); json.insert("children", childrenJson); json.insert("is-folder", true); - if(this->referencedBy != -1) - json.insert("referenced-by", this->referencedBy); + if(this->getReferencedBy() != -1) + json.insert("referenced-by", this->getReferencedBy()); else json.insert("referenced-by", QJsonValue()); return json; @@ -218,4 +219,12 @@ QJsonObject LeafLayerWrapper::toJson() const json.insert("element", wrappedElement->index); json.insert("is-folder", false); return json; +} + +int FolderLayerWrapper::getReferencedBy()const +{ + if (this->elementManager != nullptr) + return this->elementManager->getLayerReferencedBy(this); + else + return -1; } \ No newline at end of file diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.h b/ArchitectureColoredPainting/src/Editor/LayerWrapper.h index 57492a8..84e7cab 100644 --- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.h +++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.h @@ -28,6 +28,7 @@ class LayerWrapper protected: FolderLayerWrapper* parent; QPointF referencePoint; + ElementManager* elementManager; // vector styles; // TODO: 将cache移到子类,对Leaf用ComposedPainterPath,对Folder用FolderBitmapPath PixelPath cache; @@ -51,7 +52,7 @@ class LayerWrapper // TODO: 将QPainterPath改为BitmapPath/QImage,或者直接将其删除,绘制时直接使用BitmapPath的paint方法 virtual PixelPath getCache(); FolderLayerWrapper*getParent() const; // invoke by manager, then invoke parent's applyStyles - LayerWrapper(QJsonObject json, FolderLayerWrapper*parent); + LayerWrapper(QJsonObject json, FolderLayerWrapper*parent, ElementManager* elementManager=nullptr); LayerWrapper() = default; // TODO : export Function // virtual LayerWrapper *addChild() = 0; // Leaf Child Only @@ -84,6 +85,7 @@ class FolderLayerWrapper : public LayerWrapper void delSelf() override; QTreeWidgetItem* getQTreeItem() override; QJsonObject toJson() const override; + int getReferencedBy()const; }; class LeafLayerWrapper : public LayerWrapper