diff --git a/cppinstancing.cpp b/cppinstancing.cpp index 09008b59a1c23fb1642a57228f416931cc3194af..71e1cdcfdfec2e26f63980956af7f6f35fc3daab 100644 --- a/cppinstancing.cpp +++ b/cppinstancing.cpp @@ -19,7 +19,7 @@ QByteArray CppInstancing::getInstanceBuffer(int *instanceCount) int instanceNumber = 0; for (const auto &pos : qAsConst(m_positions)) { - auto entry = calculateTableEntry(pos, {0.01f, 0.01f, 0.01f}, {}, QColor(Qt::white)); + auto entry = calculateTableEntry(pos, {1,1,1}, {}, QColor(Qt::white)); m_instanceData.append(reinterpret_cast<char *>(&entry), sizeof(entry)); instanceNumber++; } @@ -43,4 +43,5 @@ void CppInstancing::setPositions(const QList<QVector3D> &newPositions) { m_positions = newPositions; m_dirty = true; + markDirty(); } diff --git a/foo.cpp b/foo.cpp index 0e3d75feb6abf8612bf2cb6fcd48dc3ffd40bb2f..0bfa76a3c4bc1bac2744d2c204fde89e4819df28 100644 --- a/foo.cpp +++ b/foo.cpp @@ -12,9 +12,11 @@ Foo::Foo(QQuickItem *parent) auto env = environment(); env->setClearColor(QColor(Qt::green)); env->setBackgroundMode(QQuick3DSceneEnvironment::Color); -// auto light = new QQuick3DDirectionalLight(); -// light->setParent(scene()); -// light->setParentItem(scene()); + + m_light = new QQuick3DDirectionalLight(); + m_light->setParent(scene()); + m_light->setParentItem(scene()); + } Foo::~Foo() @@ -90,6 +92,33 @@ void Foo::useInstancing() } } +void Foo::selectOneInstance() +{ + auto selectedPosition = m_positions.takeAt(3); + qDebug()<<"Took position"<<selectedPosition; + m_highlightedIndex = 3; + m_highlighted->setPosition(selectedPosition); + m_highlighted->setVisible(true); + m_instancing->setPositions(m_positions); +} + +void Foo::unselectOneInstance() +{ + auto pos = m_highlighted->position(); + m_positions.insert(m_highlightedIndex, pos); + m_highlighted->setVisible(false); + m_instancing->setPositions(m_positions); + +} + +void Foo::setLabelPosition(const QVector3D &position) +{ + if (m_labelNode) + m_labelNode->setPosition(position); + else + qWarning()<<__func__<<"label node not created"; +} + int Foo::positionCount() const { return m_positionCount; @@ -113,12 +142,36 @@ QVector3D Foo::randomPosition() void Foo::generatePositions() { - QList<QVector3D> positions; - positions.resize(m_positionCount); + m_positions.resize(m_positionCount); for (int i = 0; i < m_positionCount; ++i) { - positions[i] = randomPosition(); + m_positions[i] = randomPosition(); } - m_instancing->setPositions(positions); + m_instancing->setPositions(m_positions); +} + +void Foo::createLabel() +{ + auto labelNode = new QQuick3DNode(); + labelNode->setParent(scene()); + labelNode->setParentItem(scene()); + + +} + + +void Foo::componentComplete() +{ + QQuick3DViewport::componentComplete(); + m_highlighted = new QQuick3DModel(); + m_highlighted->setParent(scene()); + m_highlighted->setParentItem(scene()); + + m_highlighted->setSource(QUrl(QStringLiteral("#Sphere"))); + auto material = new QQuick3DPrincipledMaterial(); + material->setBaseColor(QColor(Qt::red)); + QQmlListReference materialsRef(m_highlighted, "materials"); + materialsRef.append(material); + m_highlighted->setVisible(false); } diff --git a/foo.h b/foo.h index 29474ed9225b2e8064a1dcc0d7bd48281820d52b..0d0b924882d5066b07af0526a1dfa53fa34c8ebb 100644 --- a/foo.h +++ b/foo.h @@ -2,6 +2,7 @@ #define FOO_H #include <QtQml/qqml.h> #include <QtQuick3D/private/qquick3dviewport_p.h> +#include <QtQuick3D/private/qquick3ddirectionallight_p.h> class CppInstancing; @@ -22,6 +23,9 @@ public: Q_INVOKABLE void removeSphere(); Q_INVOKABLE void squeezeSpheresList(); Q_INVOKABLE void useInstancing(); + Q_INVOKABLE void selectOneInstance(); + Q_INVOKABLE void unselectOneInstance(); + Q_INVOKABLE void setLabelPosition(const QVector3D &position); int positionCount() const; void setPositionCount(int newPositionCount); @@ -33,15 +37,27 @@ signals: private: QVector3D randomPosition(); void generatePositions(); + void createLabel(); private: int m_bar = 0; int m_positionCount = 0; + QList<QVector3D> m_positions; CppInstancing *m_instancing = nullptr; + int m_highlightedIndex = -1; QQuick3DModel *m_instanceRoot = nullptr; + QQuick3DModel *m_highlighted = nullptr; QList<QQuick3DModel *> m_spheres; + QQuick3DDirectionalLight *m_light = nullptr; + + QQuick3DNode *m_labelNode; + + + // QQmlParserStatus interface +public: + void componentComplete() override; }; #endif // FOO_H diff --git a/main.qml b/main.qml index 8ee8745ac5712a5546992563391e2dda62b8b21f..3f213b31003218f05465d39db3883a133fd925be 100644 --- a/main.qml +++ b/main.qml @@ -20,12 +20,16 @@ Window { foo.squeezeSpheresList() else if (event.key === Qt.Key_I) foo.useInstancing() + else if (event.key === Qt.Key_O) + foo.selectOneInstance(); + else if (event.key === Qt.Key_P) + foo.unselectOneInstance() } Foobar { id: foo anchors.fill: parent camera: camera - positionCount: 500 + positionCount: 10 } @@ -36,7 +40,7 @@ Window { PerspectiveCamera { id: camera - position: Qt.vector3d(0,0,0) + position: Qt.vector3d(0,0,600) } } }