diff --git a/ArchitectureColoredPainting/EditorWidgetItem.ui b/ArchitectureColoredPainting/EditorWidgetItem.ui
index 93811f0..aea28b0 100644
--- a/ArchitectureColoredPainting/EditorWidgetItem.ui
+++ b/ArchitectureColoredPainting/EditorWidgetItem.ui
@@ -6,8 +6,8 @@
0
0
- 1124
- 1010
+ 1473
+ 1103
@@ -56,7 +56,20 @@
-
-
+
+
+
+ 1080
+ 1080
+
+
+
+
+ 1080
+ 1080
+
+
+
-
diff --git a/ArchitectureColoredPainting/res/Shaders/painting.comp b/ArchitectureColoredPainting/res/Shaders/painting.comp
index ffd0e38..e7280a0 100644
--- a/ArchitectureColoredPainting/res/Shaders/painting.comp
+++ b/ArchitectureColoredPainting/res/Shaders/painting.comp
@@ -1190,7 +1190,7 @@ void main()
//imageStore(gBaseColor, pixelLocation, vec4(uv,1,1));
//imageStore(gMetallicRoughness, pixelLocation, vec4(uv,1,1));
//return;
- uv = vec2(1)-uv*2;
+ uv = uv*2-vec2(1);
//vec2 uv = imageLoad(gPaintingTexCoord, pixelLocation).rg;
vec3 debugBVH = vec3(0);
diff --git a/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp b/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp
index 01ca5b3..0a3f01b 100644
--- a/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp
+++ b/ArchitectureColoredPainting/src/Editor/EditorWidgetItem.cpp
@@ -14,6 +14,8 @@ EditorWidgetItem::EditorWidgetItem(QString filePath,QWidget *parent) : QWidget(p
elementInfoDisplayWidget = dynamic_cast(tabWidget->widget(1));
qDebug() << layerInfoDisplayWidget;
qDebug() << elementInfoDisplayWidget;
+ connect(previewWindow, &PreviewWindow::layerInfoChanged, layerInfoDisplayWidget, &InfoDisplayWidget::triggerSelfRefresh);
+ connect(treeWidget, &LayerTreeWidget::displayLayerChange, previewWindow, &PreviewWindow::currentLayerChanged);
connect(treeWidget, &LayerTreeWidget::requireRefreshElementWidget, elementInfoDisplayWidget, &ElementPoolWidget::refresh);
connect(layerInfoDisplayWidget, &InfoDisplayWidget::requireRefreshElementWidget, elementInfoDisplayWidget, &ElementPoolWidget::refresh);
connect(treeWidget, &LayerTreeWidget::displayLayerChange, this, &EditorWidgetItem::onLayerChange);
@@ -57,7 +59,11 @@ EditorWidgetItem::~EditorWidgetItem()
void EditorWidgetItem::paintEvent(QPaintEvent *event)
{
+ QPainter painter(this);
+ // ÉèÖûˢµÄÑÕɫΪ»ÒÉ«£¬²¢Ìî³äÕû¸ö´°¿ÚÇøÓò
+ painter.setBrush(Qt::gray);
+ painter.drawRect(this->rect());
}
void EditorWidgetItem::onLayerChange(LayerWrapper *layer)
diff --git a/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp b/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp
index 9314fb3..3260266 100644
--- a/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp
+++ b/ArchitectureColoredPainting/src/Editor/GraphicElement.cpp
@@ -11,7 +11,7 @@ PixelPath SimpleElement::getPaintObject() const
void SimpleElement::loadSvgFile(const QString& filePath)
{
- // TODO ÑùʽÎÊÌâ
+ // TODO ��ʽ����
SvgFileLoader loader;
loader.loadSvgFile(filePath, painterPath);
qDebug() << "load svg file success " << painterPath.elementCount();
@@ -21,7 +21,7 @@ SimpleElement::SimpleElement(QJsonObject jsonSource) : jsonSource(jsonSource)
{
painterPath.clear();
//loadSvgFile("D:\\Projects\\BigC\\svg\\3.svg");
- loadSvgFile("../"/*TODO: ¸Ä³ÉjsonÎļþËùÔÚÎļþ¼Ð·¾¶*/ + jsonSource.value("data").toObject().value("include").toString());
+ loadSvgFile("../"/*TODO: �ij�json�ļ������ļ���·��*/ + jsonSource.value("data").toObject().value("include").toString());
}
GroupElement::GroupElement(FolderLayerWrapper* sourceLayer)
@@ -91,10 +91,34 @@ PixelPath GroupElement::getPaintObject(std::vector>*
// rawPath.addPath(path);
// }
//}
-//TODO : Ìí¼Óϸ½Ú
+//TODO : ���ϸ��
QJsonObject GraphicElement::toJson() const
{
QJsonObject result;
result.insert("name", name);
return result;
+}
+
+void SimpleElement::paint(QPainter* painter, QTransform transform, vector> styles)
+{
+ painter->save();
+ painter->setTransform(transform);
+ if (styles.empty())
+ {
+ painter->drawPath(painterPath);
+ }
+ else
+ {
+ // TODO:Ӧ��style
+ Renderer::ElementStyleStrokeDemo demo(2);
+ auto [img, mov] = renderer->drawElement(painterPath, demo, 1.0);
+ painter->drawImage(mov, img);
+ }
+
+ painter->restore();
+}
+
+void GroupElement::paint(QPainter* painter, QTransform transform, vector> styles)
+{
+ sourceLayer->paint(painter, transform);
}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/GraphicElement.h b/ArchitectureColoredPainting/src/Editor/GraphicElement.h
index c0b3c09..577f7db 100644
--- a/ArchitectureColoredPainting/src/Editor/GraphicElement.h
+++ b/ArchitectureColoredPainting/src/Editor/GraphicElement.h
@@ -28,6 +28,7 @@ public:
virtual QJsonObject toJson() const;
virtual PixelPath getPaintObject() const = 0;
virtual PixelPath getPaintObject(std::vector>*) const = 0;
+ virtual void paint(QPainter* painter, QTransform transform, std::vector> styles) = 0;
};
class SimpleElement : public GraphicElement
@@ -44,6 +45,7 @@ public:
~SimpleElement() = default;
PixelPath getPaintObject() const override;
PixelPath getPaintObject(std::vector>*) const override;
+ void paint(QPainter* painter, QTransform transform, std::vector> styles) override;
};
class GroupElement : public GraphicElement
@@ -58,6 +60,7 @@ public:
PixelPath getPaintObject() const override;
PixelPath getPaintObject(std::vector>*) const override;
void setSourceLayer(FolderLayerWrapper* sourceLayer);
+ void paint(QPainter* painter, QTransform transform, std::vector> styles) override;
};
//******************************** BitmapPath ********************************//
diff --git a/ArchitectureColoredPainting/src/Editor/LayerManager.cpp b/ArchitectureColoredPainting/src/Editor/LayerManager.cpp
index a9b73b8..06f0170 100644
--- a/ArchitectureColoredPainting/src/Editor/LayerManager.cpp
+++ b/ArchitectureColoredPainting/src/Editor/LayerManager.cpp
@@ -11,10 +11,10 @@ LayerWrapper *LayerManager::getRoot() const
{
return root;
}
-void LayerManager::paint(QPainter *painter, QSize size) const
+void LayerManager::paint(QPainter *painter, QSize size,LayerWrapper* selecetedLayer) const
{
- auto p = root->getCache().resizedPixel(size);
- painter->drawPixmap(0, 0, p);
+ root->getCache();
+ root->paint(painter);
}
bool LayerManager::singleSelectedCheck() const
{
diff --git a/ArchitectureColoredPainting/src/Editor/LayerManager.h b/ArchitectureColoredPainting/src/Editor/LayerManager.h
index 390cfed..6f065fc 100644
--- a/ArchitectureColoredPainting/src/Editor/LayerManager.h
+++ b/ArchitectureColoredPainting/src/Editor/LayerManager.h
@@ -32,7 +32,7 @@ class LayerManager
LayerManager() = default;
LayerManager(QJsonObject source, ElementManager* elementManager);
QJsonObject toJson() const;
- void paint(QPainter *painter, QSize size) const;
+ void paint(QPainter *painter, QSize size, LayerWrapper* selecetedLayer=nullptr) const;
bool rename(QString newName) const;
bool combine() const;
// bool seperate() const;
diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp
index c149185..d5f28e7 100644
--- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp
+++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.cpp
@@ -23,9 +23,13 @@ FolderLayerWrapper*LayerWrapper::getParent() const
return this == nullptr ? nullptr : this->parent;
}
-PixelPath LayerWrapper::getCache()
+PixelPath LayerWrapper::getCache(LayerWrapper* selectedLayer)
{
- this->refresh();
+ this->refresh(selectedLayer);
+ if (selectedLayer == this)
+ {
+ this->cache.highLight();
+ }
return cache;
}
@@ -42,6 +46,7 @@ LayerWrapper::LayerWrapper(QJsonObject json, FolderLayerWrapper*parent, ElementM
property.scale = {transformJson.value("scale").toObject().value("x").toDouble(),
transformJson.value("scale").toObject().value("y").toDouble()};
property.rotation = {transformJson.value("rotation").toDouble()};
+ selected = false;
}
FolderLayerWrapper::FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent)
@@ -75,35 +80,52 @@ LeafLayerWrapper::LeafLayerWrapper(QJsonObject json, ElementManager *elementMana
int elementIndex = json.value("element").toInt();
wrappedElement = elementManager->getElementById(elementIndex);
}
-void LayerWrapper::SimpleProperty::apply(PixelPath&cache) const
+
+void LayerWrapper::SimpleProperty::apply(PixelPath&cache)
+{
+ transform.reset();
+ double centerX = cache.getBoundingRect().center().x();
+ double centerY = cache.getBoundingRect().center().y();
+ //qDebug() << name << " " << cache.boundingRect().center();
+ //qDebug() << name << " " << cache.boundingRect();
+ transform.translate(centerX, centerY);
+ transform.translate(offset.x(), offset.y());
+ transform.rotate(rotation);
+ transform.scale(scale.x(), scale.y());
+ transform.translate(-centerX, -centerY);
+ cache = cache.trans(transform);
+}
+
+QTransform LayerWrapper::getTransform()
{
QTransform trans;
double centerX = cache.getBoundingRect().center().x();
double centerY = cache.getBoundingRect().center().y();
//qDebug() << name << " " << cache.boundingRect().center();
//qDebug() << name << " " << cache.boundingRect();
- trans.translate(offset.x(), offset.y());
- trans.translate(-centerX, -centerY);
- trans.rotate(rotation);
- trans.scale(scale.x(), scale.y());
trans.translate(centerX, centerY);
- cache = cache.trans(trans);
+ trans.translate(property.offset.x(), property.offset.y());
+ trans.rotate(property.rotation);
+ trans.scale(property.scale.x(), property.scale.y());
+ trans.translate(-centerX, -centerY);
+ return trans;
}
-void LayerWrapper::refresh()
+
+void LayerWrapper::refresh(LayerWrapper* layer)
{
property.apply(cache);
}
-void FolderLayerWrapper::refresh()
+void FolderLayerWrapper::refresh(LayerWrapper* layer)
{
cache.clear();
for (auto& child : children) {
- cache.addPath(child.get()->getCache());
+ cache.addPath(child.get()->getCache(layer));
}
LayerWrapper::refresh();
}
-void LeafLayerWrapper::refresh()
+void LeafLayerWrapper::refresh(LayerWrapper* layer)
{
cache.clear();
if (wrappedElement != nullptr)
@@ -227,4 +249,37 @@ int FolderLayerWrapper::getReferencedBy()const
return this->elementManager->getLayerReferencedBy(this);
else
return -1;
+}
+
+void LayerWrapper::paint(QPainter* painter, QTransform transform)
+{
+ if (this->selected)
+ {
+ painter->save();
+ painter->setTransform(transform);
+ painter->setPen(QPen(Qt::gray, 2));
+ painter->setPen(Qt::DashLine);
+ painter->drawRect(cache.getBoundingRect());
+ painter->restore();
+ }
+}
+
+void FolderLayerWrapper::paint(QPainter* painter, QTransform transform)
+{
+ LayerWrapper::paint(painter, transform);
+ transform = property.transform * transform;
+ qDebug() << transform;
+ for (auto& child : children)
+ child->paint(painter, transform);
+}
+
+void LeafLayerWrapper::paint(QPainter* painter, QTransform transform)
+{
+ LayerWrapper::paint(painter, transform);
+ transform = property.transform * transform;
+ qDebug() << transform;
+ if (wrappedElement != nullptr)
+ {
+ wrappedElement->paint(painter, transform, styles);
+ }
}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/LayerWrapper.h b/ArchitectureColoredPainting/src/Editor/LayerWrapper.h
index 84e7cab..7df5d13 100644
--- a/ArchitectureColoredPainting/src/Editor/LayerWrapper.h
+++ b/ArchitectureColoredPainting/src/Editor/LayerWrapper.h
@@ -35,6 +35,7 @@ class LayerWrapper
public:
QTreeWidgetItem* qTreeWidgetItem;
+ bool selected;
struct SimpleProperty
{
QString name = "";
@@ -43,17 +44,20 @@ class LayerWrapper
double rotation = 0;
bool flipHorizontally = 0;
bool flipVertically = 0;
+ QTransform transform;
// TODO: ½«QPainterPath¸ÄΪBitmapPath
- void apply(PixelPath&cache) const;
+ void apply(PixelPath&cache);
} property;
virtual void setParent(FolderLayerWrapper*newParent);
- virtual void refresh();
+ virtual void refresh(LayerWrapper* layer = nullptr);
virtual QTreeWidgetItem* getQTreeItem();
// TODO: ½«QPainterPath¸ÄΪBitmapPath/QImage£¬»òÕßÖ±½Ó½«Æäɾ³ý£¬»æÖÆʱֱ½ÓʹÓÃBitmapPathµÄpaint·½·¨
- virtual PixelPath getCache();
+ virtual PixelPath getCache(LayerWrapper* selectedLayer=nullptr);
+ QTransform getTransform();
FolderLayerWrapper*getParent() const; // invoke by manager, then invoke parent's applyStyles
LayerWrapper(QJsonObject json, FolderLayerWrapper*parent, ElementManager* elementManager=nullptr);
LayerWrapper() = default;
+ virtual void paint(QPainter* painter, QTransform transform=QTransform());
// TODO : export Function
// virtual LayerWrapper *addChild() = 0; // Leaf Child Only
// virtual LayerWrapper *addParent() = 0; // Folder Parent Only
@@ -75,7 +79,7 @@ class FolderLayerWrapper : public LayerWrapper
public:
~FolderLayerWrapper() = default;
- void refresh() override;
+ void refresh(LayerWrapper* layer=nullptr) override;
FolderLayerWrapper() = default;
FolderLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent);
void addChild(shared_ptr child);
@@ -86,6 +90,7 @@ class FolderLayerWrapper : public LayerWrapper
QTreeWidgetItem* getQTreeItem() override;
QJsonObject toJson() const override;
int getReferencedBy()const;
+ void paint(QPainter* painter, QTransform transform = QTransform()) override;
};
class LeafLayerWrapper : public LayerWrapper
@@ -97,10 +102,11 @@ class LeafLayerWrapper : public LayerWrapper
public:
~LeafLayerWrapper() = default;
- void refresh() override;
+ void refresh(LayerWrapper* layer = nullptr) override;
LeafLayerWrapper() = default;
LeafLayerWrapper(QJsonObject json, ElementManager *elementManager, FolderLayerWrapper*parent);
QJsonObject toJson() const override;
+ void paint(QPainter* painter, QTransform transform = QTransform()) override;
};
Q_DECLARE_METATYPE(LayerWrapper *)
diff --git a/ArchitectureColoredPainting/src/Editor/PixelPath.cpp b/ArchitectureColoredPainting/src/Editor/PixelPath.cpp
index 447f8aa..89f4bbc 100644
--- a/ArchitectureColoredPainting/src/Editor/PixelPath.cpp
+++ b/ArchitectureColoredPainting/src/Editor/PixelPath.cpp
@@ -102,4 +102,19 @@ QPixmap PixelPath::getDetail()const
qDebug() << rect;
result = pixmap.copy(rect);
return result;
+}
+
+void PixelPath::highLight()
+{
+ // ´´½¨Ò»¸öQPainter¶ÔÏ󣬹ØÁªµ½QPixmap¶ÔÏó
+ QPainter painter(&pixmap);
+
+ // ÉèÖû±ÊµÄÑÕÉ«¡¢¿í¶ÈºÍÑùʽ
+ painter.setPen(QPen(Qt::black, 1, Qt::DashLine));
+
+ // »æÖÆÒ»¸ö¾ØÐΣ¬Ö¸¶¨×óÉϽǺÍÓÒϽǵÄ×ø±ê
+ painter.drawRect(boundingRect);
+
+ // ½áÊø»æÖÆ
+ painter.end();
}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/PixelPath.h b/ArchitectureColoredPainting/src/Editor/PixelPath.h
index 33268db..a764ce8 100644
--- a/ArchitectureColoredPainting/src/Editor/PixelPath.h
+++ b/ArchitectureColoredPainting/src/Editor/PixelPath.h
@@ -26,4 +26,5 @@ public:
PixelPath trans(QTransform& mat)const;
QPixmap resizedPixel(QSize size)const;
QPixmap getDetail()const;
+ void highLight();
};
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp b/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp
index 0db3c48..485977d 100644
--- a/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp
+++ b/ArchitectureColoredPainting/src/Editor/PreviewWindow.cpp
@@ -2,6 +2,7 @@
PreviewWindow::PreviewWindow(QWidget *parent) : QOpenGLWidget(parent)
{
+ this->setFixedSize(QSize(1080, 1080));
this->renderer = Renderer::ElementRenderer::instance();
QSurfaceFormat surfaceFormat;
surfaceFormat.setSamples(16);
@@ -10,6 +11,7 @@ PreviewWindow::PreviewWindow(QWidget *parent) : QOpenGLWidget(parent)
painter->setRenderHint(QPainter::SmoothPixmapTransform);
painter->setRenderHint(QPainter::HighQualityAntialiasing);
layerManager = nullptr;
+ currentLayer = nullptr;
}
void PreviewWindow::initialize(LayerManager *layerManager,QSize windowSize)
@@ -46,7 +48,7 @@ void PreviewWindow::paintGL()
painter->begin(this);
painter->setRenderHint(QPainter::Antialiasing);
painter->setRenderHint(QPainter::HighQualityAntialiasing);
- layerManager->paint(painter,this->size());
+ layerManager->paint(painter,this->size(),currentLayer);
painter->end();
}
@@ -56,4 +58,48 @@ void PreviewWindow::resizeGL(int w, int h)
Renderer::ElementRenderer* const PreviewWindow::getRenderer()const {
return this->renderer;
+}
+
+void PreviewWindow::currentLayerChanged(LayerWrapper* layer)
+{
+ this->currentLayer = layer;
+}
+
+void PreviewWindow::refresh()
+{
+ this->repaint();
+}
+
+void PreviewWindow::mousePressEvent(QMouseEvent* event)
+{
+ // µ±Êó±ê°´ÏÂʱ£¬¼Ç¼µ±Ç°µÄλÖÃ
+ m_lastPos = event->pos();
+}
+
+void PreviewWindow::mouseMoveEvent(QMouseEvent* event)
+{
+ // µ±Êó±êÒƶ¯Ê±£¬¼ÆËãÒƶ¯µÄ¾àÀ룬²¢¸ù¾ÝÐèÒª¸üÐÂͼÐεÄ״̬
+ int dx = event->x() - m_lastPos.x();
+ int dy = event->y() - m_lastPos.y();
+ if (currentLayer != nullptr) {
+ if (event->buttons() & Qt::LeftButton) {
+ // Èç¹û°´ÏµÄÊÇ×ó¼ü£¬ÄÇôƽÒÆͼÐÎ
+ currentLayer->property.offset.setX(currentLayer->property.offset.x() + dx);
+ currentLayer->property.offset.setY(currentLayer->property.offset.y() + dy);
+ qDebug() << dx << "----" << dy;
+ }
+ else if (event->buttons() & Qt::RightButton) {
+ // Èç¹û°´ÏµÄÊÇÓÒ¼ü£¬ÄÇôÐýתͼÐÎ
+ qreal angle = dx;
+ currentLayer->property.rotation += angle;
+ }
+ }
+ // ¸üÐÂÉÏÒ»´ÎµÄλÖÃ
+ m_lastPos = event->pos();
+ this->repaint();
+}
+
+void PreviewWindow::mouseReleaseEvent(QMouseEvent* event)
+{
+ emit layerInfoChanged();
}
\ No newline at end of file
diff --git a/ArchitectureColoredPainting/src/Editor/PreviewWindow.h b/ArchitectureColoredPainting/src/Editor/PreviewWindow.h
index 9a0a4bc..66f4a52 100644
--- a/ArchitectureColoredPainting/src/Editor/PreviewWindow.h
+++ b/ArchitectureColoredPainting/src/Editor/PreviewWindow.h
@@ -7,6 +7,7 @@
#include
#include
#include
+#include
#include
#include "../Renderer/Preview/ElementRenderer.h"
@@ -19,7 +20,13 @@ class PreviewWindow : public QOpenGLWidget, protected QOpenGLFunctions
LayerManager *layerManager;
Renderer::ElementRenderer* renderer;
QSize logicalSize;
-
+ QRectF viewportRect;
+ LayerWrapper* currentLayer;
+ QPointF m_lastPos;
+ void mousePressEvent(QMouseEvent* event) override;
+ void mouseMoveEvent(QMouseEvent* event) override;
+ void mouseReleaseEvent(QMouseEvent* event) override;
+
public:
PreviewWindow(QWidget *parent = nullptr);
void initialize(LayerManager *layerManager, QSize windowSize = QSize(1920, 1080));
@@ -28,4 +35,11 @@ class PreviewWindow : public QOpenGLWidget, protected QOpenGLFunctions
void paintGL() override;
void resizeGL(int w, int h) override;
Renderer::ElementRenderer* const getRenderer()const;
+
+ public slots:
+ void currentLayerChanged(LayerWrapper*);
+ void refresh();
+
+ signals:
+ void layerInfoChanged();
};
diff --git a/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp b/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp
index 1889d70..1e84c88 100644
--- a/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp
+++ b/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.cpp
@@ -12,11 +12,19 @@ LayerTreeWidget::LayerTreeWidget(QWidget *parent)
this->setHeaderLabel("Layer Content");
connect(this, &QTreeWidget::customContextMenuRequested, this, &LayerTreeWidget::popMenu);
connect(this, &QTreeWidget::currentItemChanged, [=](QTreeWidgetItem *currentItem) {
+ if (this->selectedItem != nullptr) {
+ this->selectedItem->data(0, Qt::UserRole).value()->selected = false;
+ }
this->selectedItem = currentItem;
- if(this->selectedItem !=nullptr)
- emit displayLayerChange(this->selectedItem->data(0, Qt::UserRole).value());
- else
- emit displayLayerChange(nullptr);
+ if (this->selectedItem != nullptr) {
+ auto layer = this->selectedItem->data(0, Qt::UserRole).value();
+ layer->selected = true;
+ emit displayLayerChange(layer);
+ }
+ else {
+ emit displayLayerChange(nullptr);
+ }
+ emit requireRefreshPreview();
});
// connect(this, &QTreeWidget::itemDoubleClicked, this, &LayerTreeWidget::onItemDoubleClicked);
}
diff --git a/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.h b/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.h
index ca784fd..e7472dd 100644
--- a/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.h
+++ b/ArchitectureColoredPainting/src/Editor/RightBar/LayerTreeWidget.h
@@ -20,7 +20,7 @@ class LayerTreeWidget : public QTreeWidget
// void mouseDoubleClickEvent(QMouseEvent *event) override;
// void onItemDoubleClicked(QTreeWidgetItem *item, int column = 0);
- signals:
+signals:
void displayLayerChange(LayerWrapper *);
void requireRefreshPreview();
void requireRefreshElementWidget();
diff --git a/ArchitectureColoredPainting/src/Renderer/Mesh.h b/ArchitectureColoredPainting/src/Renderer/Mesh.h
index dd1d705..ec452fd 100644
--- a/ArchitectureColoredPainting/src/Renderer/Mesh.h
+++ b/ArchitectureColoredPainting/src/Renderer/Mesh.h
@@ -2,23 +2,22 @@
#include
#include
#include
-#include
-#include
#include
#include
#include
#include
#include
#include
+#include
#include "Drawable.h"
namespace Renderer
{
struct Vertex
{
- QVector3D Position;
- QVector3D Normal;
- QVector2D TexCoords;
+ glm::vec3 Position;
+ glm::vec3 Normal;
+ glm::vec2 TexCoords;
Vertex(const aiVector3D& position, const aiVector3D& Normal, const aiVector3D& TexCoords);
};
diff --git a/ArchitectureColoredPainting/src/Renderer/Model.cpp b/ArchitectureColoredPainting/src/Renderer/Model.cpp
index a22be70..644863d 100644
--- a/ArchitectureColoredPainting/src/Renderer/Model.cpp
+++ b/ArchitectureColoredPainting/src/Renderer/Model.cpp
@@ -50,7 +50,7 @@ void Renderer::Model::loadModel(QString path)
directory = modelFile.dir();
Assimp::Importer importer;
- const aiScene* scene = importer.ReadFile(modelFile.absoluteFilePath().toUtf8(), aiProcess_Triangulate | aiProcess_FlipUVs);
+ const aiScene* scene = importer.ReadFile(modelFile.absoluteFilePath().toUtf8(), aiProcess_Triangulate /*| aiProcess_FlipUVs*/);
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
{
qCritical() << "ERROR::ASSIMP::" << importer.GetErrorString() << endl;
@@ -117,12 +117,8 @@ void Model::processNode(aiNode* node, const aiScene* scene, aiMatrix4x4 mat4)
std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene, aiMatrix4x4 model)
{
- aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
QMatrix4x4 modelQ((float*)&model);
- aiString str;
- material->GetTexture(aiTextureType_BASE_COLOR, 0, &str);
-
std::vector vertices;
for (unsigned int i = 0; i < mesh->mNumVertices; i++)
{
@@ -139,45 +135,59 @@ std::unique_ptr Model::processMesh(aiMesh* mesh, const aiScene* scene,
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())
+ aiMaterial* material = scene->mMaterials[mesh->mMaterialIndex];
+
+ if (auto iter = paintingMap.find([&] {
+ aiString str;
+ material->GetTexture(aiTextureType_BASE_COLOR, 0, &str);
+ return std::string(str.C_Str());
+ }()); paintingProgram != nullptr && iter != paintingMap.end())
{
+ qDebug() << iter->first.c_str() << "Replaced";
+
+ auto mesh = std::make_unique(glFunc, paintingProgram, shadowProgram, modelQ);
+
auto& [paintingPath, leftBottom, rightTop] = iter->second;
- qDebug() << str.C_Str() << "Replaced";
- 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);
- m_mesh->textureBasecolor = handle.baseColor;
- m_mesh->textureMetallicRoughness = handle.metallicRoughness;
- m_mesh->setupMesh();
- return m_mesh;
+ for (auto& v : vertices)
+ {
+ //qDebug() << v.TexCoords.x << v.TexCoords.y;
+ v.TexCoords = (v.TexCoords - leftBottom) / (rightTop - leftBottom);
+ qDebug() << v.TexCoords.x << v.TexCoords.y;
+ }
+
+ mesh->vertices = vertices;
+ mesh->indices = indices;
+
+ mesh->paintingId = loadPainting(paintingPath);
+ auto& handle = vtManager->getPaintingHandle(mesh->paintingId);
+ mesh->textureBasecolor = handle.baseColor;
+ mesh->textureMetallicRoughness = handle.metallicRoughness;
+ mesh->setupMesh();
+ return mesh;
}
else
{
- auto m_mesh = std::make_unique(glFunc, shaderProgram, shadowProgram, modelQ);
- m_mesh->vertices = vertices;
- m_mesh->indices = indices;
+ auto mesh = std::make_unique(glFunc, shaderProgram, shadowProgram, modelQ);
+ mesh->vertices = vertices;
+ mesh->indices = indices;
- // ´¦Àí²ÄÖÊ
- if (!(m_mesh->textureBasecolor = loadMaterialTextures(material, aiTextureType_BASE_COLOR)))
+ if (!(mesh->textureBasecolor = loadMaterialTextures(material, aiTextureType_BASE_COLOR)))
qWarning() << "Basecolor Texture Loading Failed!";
- if (!(m_mesh->textureMetallicRoughness = loadMaterialTextures(material, aiTextureType_METALNESS)))
+ if (!(mesh->textureMetallicRoughness = loadMaterialTextures(material, aiTextureType_METALNESS)))
qWarning() << "MetallicRoughness Texture Loading Failed!";
- if (!(m_mesh->textureNormal = loadMaterialTextures(material, aiTextureType_NORMALS)))
+ if (!(mesh->textureNormal = loadMaterialTextures(material, aiTextureType_NORMALS)))
qWarning() << "Normal Texture Loading Failed!";
- if (m_mesh->textureBasecolor && m_mesh->textureMetallicRoughness && m_mesh->textureNormal)
+ if (mesh->textureBasecolor && mesh->textureMetallicRoughness && mesh->textureNormal)
{
- m_mesh->setupMesh();
- return m_mesh;
+ mesh->setupMesh();
+ return mesh;
}
else
return nullptr;
@@ -208,7 +218,7 @@ GLuint Model::loadMaterialTextures(aiMaterial* mat, aiTextureType type)
texture.setWrapMode(QOpenGLTexture::DirectionS, QOpenGLTexture::Repeat);
texture.setWrapMode(QOpenGLTexture::DirectionT, QOpenGLTexture::Repeat);
texture.setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
- texture.setData(data);
+ texture.setData(data.mirrored());
return texture.textureId();
}
diff --git a/ArchitectureColoredPainting/src/Renderer/Model.h b/ArchitectureColoredPainting/src/Renderer/Model.h
index c19fdf3..d9a6bea 100644
--- a/ArchitectureColoredPainting/src/Renderer/Model.h
+++ b/ArchitectureColoredPainting/src/Renderer/Model.h
@@ -24,7 +24,11 @@ namespace Renderer
QOpenGLShaderProgram* shadowProgram = nullptr;
VirtualTextureManager* vtManager = nullptr;
- std::unordered_map> paintingMap;
+ /**
+ * @param key BaseColor·¾¶
+ * @param value json·¾¶, ÎÆÀí×ø±ê
+ */
+ std::unordered_map> paintingMap;
std::unordered_map paintingLoaded;
std::unordered_map texturesLoaded;
std::vector> meshes;