Added basic functionality
@@ -1,18 +1,10 @@
|
|||||||
QT += core
|
QT += core gui widgets 3dcore 3drender 3dinput 3dextras
|
||||||
QT -= gui
|
|
||||||
|
|
||||||
CONFIG += c++11
|
|
||||||
|
|
||||||
TARGET = QtGameEngine
|
TARGET = QtGameEngine
|
||||||
CONFIG += console
|
|
||||||
CONFIG -= app_bundle
|
|
||||||
|
|
||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
|
|
||||||
SOURCES += main.cpp
|
|
||||||
|
|
||||||
# The following define makes your compiler emit warnings if you use
|
# The following define makes your compiler emit warnings if you use
|
||||||
# any feature of Qt which as been marked deprecated (the exact warnings
|
# any feature of Qt which as been marked as deprecated (the exact warnings
|
||||||
# depend on your compiler). Please consult the documentation of the
|
# depend on your compiler). Please consult the documentation of the
|
||||||
# deprecated API in order to know how to port your code away from it.
|
# deprecated API in order to know how to port your code away from it.
|
||||||
DEFINES += QT_DEPRECATED_WARNINGS
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
@@ -21,3 +13,26 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||||||
# In order to do so, uncomment the following line.
|
# In order to do so, uncomment the following line.
|
||||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
|
|
||||||
|
SOURCES += main.cpp \
|
||||||
|
mainwindow.cpp \
|
||||||
|
houseplant.cpp \
|
||||||
|
renderableentity.cpp \
|
||||||
|
treemodel.cpp
|
||||||
|
|
||||||
|
HEADERS += mainwindow.h \
|
||||||
|
houseplant.h \
|
||||||
|
renderableentity.h \
|
||||||
|
treemodel.h \
|
||||||
|
widgets.h
|
||||||
|
|
||||||
|
FORMS += mainwindow.ui
|
||||||
|
|
||||||
|
RESOURCES += \
|
||||||
|
resources.qrc \
|
||||||
|
chest.qrc \
|
||||||
|
houseplants.qrc \
|
||||||
|
metalbarrel.qrc \
|
||||||
|
obj.qrc \
|
||||||
|
textures.qrc
|
||||||
|
BIN
assets/chest/diffuse.webp
Normal file
After Width: | Height: | Size: 69 KiB |
BIN
assets/houseplants/bamboo.webp
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
assets/houseplants/bamboo_normal.webp
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
assets/houseplants/cover.webp
Normal file
After Width: | Height: | Size: 87 KiB |
BIN
assets/houseplants/cover_normal.webp
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
assets/houseplants/palm.webp
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
assets/houseplants/palm_normal.webp
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
assets/houseplants/pine.webp
Normal file
After Width: | Height: | Size: 118 KiB |
BIN
assets/houseplants/pine_normal.webp
Normal file
After Width: | Height: | Size: 46 KiB |
BIN
assets/houseplants/pot.webp
Normal file
After Width: | Height: | Size: 358 KiB |
BIN
assets/houseplants/pot_normal.webp
Normal file
After Width: | Height: | Size: 50 KiB |
BIN
assets/houseplants/shrub.webp
Normal file
After Width: | Height: | Size: 32 KiB |
BIN
assets/houseplants/shrub_normal.webp
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
assets/houseplants/spikes.webp
Normal file
After Width: | Height: | Size: 30 KiB |
BIN
assets/houseplants/spikes_normal.webp
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
assets/metalbarrel/diffus_black.webp
Normal file
After Width: | Height: | Size: 158 KiB |
BIN
assets/metalbarrel/diffus_blue.webp
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
assets/metalbarrel/diffus_green.webp
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
assets/metalbarrel/diffus_red.webp
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
assets/metalbarrel/diffus_rust.webp
Normal file
After Width: | Height: | Size: 249 KiB |
BIN
assets/metalbarrel/diffus_stainless_steel.webp
Normal file
After Width: | Height: | Size: 5.9 KiB |
BIN
assets/metalbarrel/diffus_yellow.webp
Normal file
After Width: | Height: | Size: 99 KiB |
BIN
assets/metalbarrel/normal_hard_bumps.webp
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
assets/metalbarrel/normal_middle_bumps.webp
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
assets/metalbarrel/normal_no_bumps.webp
Normal file
After Width: | Height: | Size: 21 KiB |
BIN
assets/metalbarrel/normal_soft_bumps.webp
Normal file
After Width: | Height: | Size: 23 KiB |
BIN
assets/metalbarrel/specular.webp
Normal file
After Width: | Height: | Size: 411 KiB |
BIN
assets/metalbarrel/specular_rust.webp
Normal file
After Width: | Height: | Size: 323 KiB |
BIN
assets/metalbarrel/specular_stainless_steel.webp
Normal file
After Width: | Height: | Size: 215 KiB |
BIN
assets/textures/pattern_09/diffuse.webp
Normal file
After Width: | Height: | Size: 661 KiB |
BIN
assets/textures/pattern_09/normal.webp
Normal file
After Width: | Height: | Size: 803 KiB |
5
assets/textures/pattern_09/readme.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
These textures along with many others are available from:
|
||||||
|
|
||||||
|
http://nobiax.deviantart.com/
|
||||||
|
|
||||||
|
Many thanks to Nobiax for making these freely available!
|
BIN
assets/textures/pattern_09/specular.webp
Normal file
After Width: | Height: | Size: 982 KiB |
6
chest.qrc
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>assets/chest/Chest.obj</file>
|
||||||
|
<file>assets/chest/diffuse.webp</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
144
houseplant.cpp
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
#include "houseplant.h"
|
||||||
|
|
||||||
|
#include <Qt3DRender/qtexture.h>
|
||||||
|
|
||||||
|
const char *potNames[] = {
|
||||||
|
"cross",
|
||||||
|
"square",
|
||||||
|
"triangle",
|
||||||
|
"sphere"
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *plantNames[] = {
|
||||||
|
"bamboo",
|
||||||
|
"palm",
|
||||||
|
"pine",
|
||||||
|
"spikes",
|
||||||
|
"shrub"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
HousePlant::HousePlant(Qt3DCore::QNode *parent)
|
||||||
|
: Qt3DCore::QEntity(parent)
|
||||||
|
, m_pot(new RenderableEntity(this))
|
||||||
|
, m_plant(new RenderableEntity(m_pot))
|
||||||
|
, m_cover(new RenderableEntity(m_pot))
|
||||||
|
, m_potMaterial(new Qt3DExtras::QNormalDiffuseMapMaterial())
|
||||||
|
, m_plantMaterial(new Qt3DExtras::QNormalDiffuseMapAlphaMaterial())
|
||||||
|
, m_coverMaterial(new Qt3DExtras::QNormalDiffuseMapMaterial())
|
||||||
|
, m_potImage(new Qt3DRender::QTextureImage())
|
||||||
|
, m_potNormalImage(new Qt3DRender::QTextureImage())
|
||||||
|
, m_plantImage(new Qt3DRender::QTextureImage())
|
||||||
|
, m_plantNormalImage(new Qt3DRender::QTextureImage())
|
||||||
|
, m_coverImage(new Qt3DRender::QTextureImage())
|
||||||
|
, m_coverNormalImage(new Qt3DRender::QTextureImage())
|
||||||
|
, m_plantType(Bamboo)
|
||||||
|
, m_potShape(Cross)
|
||||||
|
{
|
||||||
|
m_potMaterial->setObjectName("potMaterial");
|
||||||
|
m_plantMaterial->setObjectName("plantMaterial");
|
||||||
|
m_coverMaterial->setObjectName("coverMaterial");
|
||||||
|
m_potImage->setObjectName("potImage");
|
||||||
|
m_potNormalImage->setObjectName("potNormalImage");
|
||||||
|
m_plantImage->setObjectName("plantImage");
|
||||||
|
m_plantNormalImage->setObjectName("plantNormalImage");
|
||||||
|
m_coverImage->setObjectName("coverImage");
|
||||||
|
m_coverNormalImage->setObjectName("coverNormalImage");
|
||||||
|
|
||||||
|
m_pot->setObjectName("pot");
|
||||||
|
m_pot->transform()->setScale(0.03f);
|
||||||
|
m_pot->addComponent(m_potMaterial);
|
||||||
|
|
||||||
|
m_plant->setObjectName("plant");
|
||||||
|
m_plant->addComponent(m_plantMaterial);
|
||||||
|
|
||||||
|
m_cover->setObjectName("cover");
|
||||||
|
m_cover->addComponent(m_coverMaterial);
|
||||||
|
|
||||||
|
m_potMaterial->diffuse()->addTextureImage(m_potImage);
|
||||||
|
m_potMaterial->normal()->addTextureImage(m_potNormalImage);
|
||||||
|
m_plantMaterial->diffuse()->addTextureImage(m_plantImage);
|
||||||
|
m_plantMaterial->normal()->addTextureImage(m_plantNormalImage);
|
||||||
|
m_coverMaterial->diffuse()->addTextureImage(m_coverImage);
|
||||||
|
m_coverMaterial->normal()->addTextureImage(m_coverNormalImage);
|
||||||
|
|
||||||
|
updatePlantType();
|
||||||
|
updatePotShape();
|
||||||
|
|
||||||
|
m_coverImage->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/cover.webp")));
|
||||||
|
m_coverNormalImage->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/cover_normal.webp")));
|
||||||
|
m_potImage->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/pot.webp")));
|
||||||
|
m_potNormalImage->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/pot_normal.webp")));
|
||||||
|
|
||||||
|
m_potMaterial->setShininess(10.0f);
|
||||||
|
m_potMaterial->setSpecular(QColor::fromRgbF(0.75f, 0.75f, 0.75f, 1.0f));
|
||||||
|
|
||||||
|
m_plantMaterial->setShininess(10.0f);
|
||||||
|
|
||||||
|
m_coverMaterial->setSpecular(QColor::fromRgbF(0.05f, 0.05f, 0.05f, 1.0f));
|
||||||
|
m_coverMaterial->setShininess(5.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
HousePlant::~HousePlant()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void HousePlant::setPotShape(HousePlant::PotShape shape)
|
||||||
|
{
|
||||||
|
if (shape != m_potShape) {
|
||||||
|
m_potShape = shape;
|
||||||
|
updatePotShape();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void HousePlant::setPlantType(HousePlant::Plant plant)
|
||||||
|
{
|
||||||
|
if (plant != m_plantType) {
|
||||||
|
m_plantType = plant;
|
||||||
|
updatePlantType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HousePlant::PotShape HousePlant::potShape() const
|
||||||
|
{
|
||||||
|
return m_potShape;
|
||||||
|
}
|
||||||
|
|
||||||
|
HousePlant::Plant HousePlant::plantType() const
|
||||||
|
{
|
||||||
|
return m_plantType;
|
||||||
|
}
|
||||||
|
|
||||||
|
void HousePlant::setPosition(const QVector3D &pos)
|
||||||
|
{
|
||||||
|
m_pot->transform()->setTranslation(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HousePlant::setScale(float scale)
|
||||||
|
{
|
||||||
|
m_pot->transform()->setScale(scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
QVector3D HousePlant::position() const
|
||||||
|
{
|
||||||
|
return m_pot->transform()->translation();
|
||||||
|
}
|
||||||
|
|
||||||
|
float HousePlant::scale() const
|
||||||
|
{
|
||||||
|
return m_pot->transform()->scale();
|
||||||
|
}
|
||||||
|
|
||||||
|
void HousePlant::updatePotShape()
|
||||||
|
{
|
||||||
|
m_pot->mesh()->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/") + potNames[m_potShape] + QStringLiteral("-pot.obj")));
|
||||||
|
m_plant->mesh()->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/") + potNames[m_potShape] + QStringLiteral("-") + plantNames[m_plantType] + QStringLiteral(".obj")));
|
||||||
|
}
|
||||||
|
|
||||||
|
void HousePlant::updatePlantType()
|
||||||
|
{
|
||||||
|
m_plant->mesh()->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/") + potNames[m_potShape] + QStringLiteral("-") + plantNames[m_plantType] + QStringLiteral(".obj")));
|
||||||
|
|
||||||
|
m_plantImage->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/") + plantNames[m_plantType] + QStringLiteral(".webp")));
|
||||||
|
m_plantNormalImage->setSource(QUrl(QStringLiteral("qrc:/assets/houseplants/") + plantNames[m_plantType] + QStringLiteral("_normal.webp")));
|
||||||
|
}
|
67
houseplant.h
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
#ifndef HOUSEPLANT_H
|
||||||
|
#define HOUSEPLANT_H
|
||||||
|
|
||||||
|
#include "renderableentity.h"
|
||||||
|
#include <QEntity>
|
||||||
|
#include <Qt3DExtras/QNormalDiffuseMapAlphaMaterial>
|
||||||
|
#include <Qt3DExtras/QNormalDiffuseMapMaterial>
|
||||||
|
#include <QTextureImage>
|
||||||
|
|
||||||
|
class HousePlant : public Qt3DCore::QEntity
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit HousePlant(Qt3DCore::QNode *parent = 0);
|
||||||
|
~HousePlant();
|
||||||
|
|
||||||
|
enum PotShape {
|
||||||
|
Cross = 0,
|
||||||
|
Square,
|
||||||
|
Triangle,
|
||||||
|
Sphere
|
||||||
|
};
|
||||||
|
|
||||||
|
enum Plant {
|
||||||
|
Bamboo = 0,
|
||||||
|
Palm,
|
||||||
|
Pine,
|
||||||
|
Spikes,
|
||||||
|
Shrub
|
||||||
|
};
|
||||||
|
|
||||||
|
void setPotShape(PotShape shape);
|
||||||
|
void setPlantType(Plant plant);
|
||||||
|
|
||||||
|
PotShape potShape() const;
|
||||||
|
Plant plantType() const;
|
||||||
|
|
||||||
|
void setPosition(const QVector3D &pos);
|
||||||
|
void setScale(float scale);
|
||||||
|
|
||||||
|
QVector3D position() const;
|
||||||
|
float scale() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
RenderableEntity *m_pot;
|
||||||
|
RenderableEntity *m_plant;
|
||||||
|
RenderableEntity *m_cover;
|
||||||
|
|
||||||
|
Qt3DExtras::QNormalDiffuseMapMaterial *m_potMaterial;
|
||||||
|
Qt3DExtras::QNormalDiffuseMapAlphaMaterial *m_plantMaterial;
|
||||||
|
Qt3DExtras::QNormalDiffuseMapMaterial *m_coverMaterial;
|
||||||
|
|
||||||
|
Qt3DRender::QTextureImage *m_potImage;
|
||||||
|
Qt3DRender::QTextureImage *m_potNormalImage;
|
||||||
|
Qt3DRender::QTextureImage *m_plantImage;
|
||||||
|
Qt3DRender::QTextureImage *m_plantNormalImage;
|
||||||
|
Qt3DRender::QTextureImage *m_coverImage;
|
||||||
|
Qt3DRender::QTextureImage *m_coverNormalImage;
|
||||||
|
|
||||||
|
Plant m_plantType;
|
||||||
|
PotShape m_potShape;
|
||||||
|
|
||||||
|
void updatePotShape();
|
||||||
|
void updatePlantType();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // HOUSEPLANT_H
|
53
houseplants.qrc
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>assets/houseplants/bamboo_normal.webp</file>
|
||||||
|
<file>assets/houseplants/bamboo.webp</file>
|
||||||
|
<file>assets/houseplants/cover_normal.webp</file>
|
||||||
|
<file>assets/houseplants/cover.webp</file>
|
||||||
|
<file>assets/houseplants/cross-bamboo.obj</file>
|
||||||
|
<file>assets/houseplants/cross-palm.obj</file>
|
||||||
|
<file>assets/houseplants/cross-pine.obj</file>
|
||||||
|
<file>assets/houseplants/cross-pot-cover.obj</file>
|
||||||
|
<file>assets/houseplants/cross-pot.obj</file>
|
||||||
|
<file>assets/houseplants/cross-shrub.obj</file>
|
||||||
|
<file>assets/houseplants/cross-spikes.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-bamboo.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-palm.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-pine.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-pot-cover.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-pot.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-shrub.obj</file>
|
||||||
|
<file>assets/houseplants/cylinder-spikes.obj</file>
|
||||||
|
<file>assets/houseplants/palm_normal.webp</file>
|
||||||
|
<file>assets/houseplants/palm.webp</file>
|
||||||
|
<file>assets/houseplants/pine_normal.webp</file>
|
||||||
|
<file>assets/houseplants/pine.webp</file>
|
||||||
|
<file>assets/houseplants/pot_normal.webp</file>
|
||||||
|
<file>assets/houseplants/pot.webp</file>
|
||||||
|
<file>assets/houseplants/shrub_normal.webp</file>
|
||||||
|
<file>assets/houseplants/shrub.webp</file>
|
||||||
|
<file>assets/houseplants/sphere-bamboo.obj</file>
|
||||||
|
<file>assets/houseplants/sphere-palm.obj</file>
|
||||||
|
<file>assets/houseplants/sphere-pine.obj</file>
|
||||||
|
<file>assets/houseplants/sphere-pot-cover.obj</file>
|
||||||
|
<file>assets/houseplants/sphere-pot.obj</file>
|
||||||
|
<file>assets/houseplants/sphere-shrub.obj</file>
|
||||||
|
<file>assets/houseplants/sphere-spikes.obj</file>
|
||||||
|
<file>assets/houseplants/spikes_normal.webp</file>
|
||||||
|
<file>assets/houseplants/spikes.webp</file>
|
||||||
|
<file>assets/houseplants/square-bamboo.obj</file>
|
||||||
|
<file>assets/houseplants/square-palm.obj</file>
|
||||||
|
<file>assets/houseplants/square-pine.obj</file>
|
||||||
|
<file>assets/houseplants/square-pot-cover.obj</file>
|
||||||
|
<file>assets/houseplants/square-pot.obj</file>
|
||||||
|
<file>assets/houseplants/square-shrub.obj</file>
|
||||||
|
<file>assets/houseplants/square-spikes.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-bamboo.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-palm.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-pine.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-pot-cover.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-pot.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-shrub.obj</file>
|
||||||
|
<file>assets/houseplants/triangle-spikes.obj</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
BIN
images/actionCopy.png
Normal file
After Width: | Height: | Size: 3.7 KiB |
BIN
images/actionCut.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
images/actionNew.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
images/actionOpen.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
images/actionPaste.png
Normal file
After Width: | Height: | Size: 6.4 KiB |
BIN
images/actionPause.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
images/actionQuit.png
Normal file
After Width: | Height: | Size: 8.5 KiB |
BIN
images/actionRedo.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
BIN
images/actionRun.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
images/actionSave.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
images/actionSaveAs.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
images/actionStop.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
images/actionUndo.png
Normal file
After Width: | Height: | Size: 8.8 KiB |
87
main.cpp
@@ -1,8 +1,91 @@
|
|||||||
#include <QCoreApplication>
|
#include <QApplication>
|
||||||
|
#include <QItemEditorFactory>
|
||||||
|
#include <QStandardItemEditorCreator>
|
||||||
|
#include <QCheckBox>
|
||||||
|
#include <QSpinBox>
|
||||||
|
#include <QDoubleSpinBox>
|
||||||
|
#include <QDateEdit>
|
||||||
|
#include <QTimeEdit>
|
||||||
|
#include <QDateTimeEdit>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QKeySequenceEdit>
|
||||||
|
|
||||||
|
#include "widgets.h"
|
||||||
|
#include "mainwindow.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
QCoreApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto factory = new QItemEditorFactory;
|
||||||
|
|
||||||
|
factory->registerEditor(QVariant::Bool, new QStandardItemEditorCreator<QCheckBox>());
|
||||||
|
factory->registerEditor(QVariant::Int, new QStandardItemEditorCreator<LimitedQSpinBox<std::numeric_limits<qint32>::min(), std::numeric_limits<qint32>::max()> >());
|
||||||
|
factory->registerEditor(QVariant::UInt, new QStandardItemEditorCreator<LimitedQSpinBox<std::numeric_limits<quint32>::min(), std::numeric_limits<quint32>::max()> >());
|
||||||
|
factory->registerEditor(QVariant::LongLong, new QStandardItemEditorCreator<LimitedQSpinBox<std::numeric_limits<qint64>::min(), std::numeric_limits<qint64>::max()> >());
|
||||||
|
factory->registerEditor(QVariant::ULongLong, new QStandardItemEditorCreator<LimitedQSpinBox<std::numeric_limits<quint64>::min(), std::numeric_limits<quint64>::max()> >());
|
||||||
|
factory->registerEditor(QVariant::Double, new QStandardItemEditorCreator<QDoubleSpinBox>());
|
||||||
|
factory->registerEditor(QMetaType::Float, new QStandardItemEditorCreator<QDoubleSpinBox>());
|
||||||
|
factory->registerEditor(QVariant::ULongLong, new QStandardItemEditorCreator<LimitedQSpinBox<std::numeric_limits<char>::min(), std::numeric_limits<char>::max()> >());
|
||||||
|
//factory->registerEditor(QVariant::Map, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::List, Q_NULLPTR); //TODO
|
||||||
|
factory->registerEditor(QVariant::String, new QStandardItemEditorCreator<QLineEdit>());
|
||||||
|
//factory->registerEditor(QVariant::StringList, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::ByteArray, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::BitArray, Q_NULLPTR); //TODO
|
||||||
|
factory->registerEditor(QVariant::Date, new QStandardItemEditorCreator<QDateEdit>());
|
||||||
|
factory->registerEditor(QVariant::Time, new QStandardItemEditorCreator<QTimeEdit>());
|
||||||
|
factory->registerEditor(QVariant::DateTime, new QStandardItemEditorCreator<QDateTimeEdit>());
|
||||||
|
factory->registerEditor(QVariant::Url, new UrlCreator); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Locale, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Rect, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::RectF, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Size, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::SizeF, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Line, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::LineF, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Point, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::PointF, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::RegExp, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::RegularExpression, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Hash, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::EasingCurve, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Uuid, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::ModelIndex, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::PersistentModelIndex, Q_NULLPTR); //TODO
|
||||||
|
|
||||||
|
//factory->registerEditor(QVariant::Font, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Pixmap, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Brush, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Color, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Palette, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Image, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Polygon, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Region, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Bitmap, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Cursor, Q_NULLPTR); //TODO
|
||||||
|
factory->registerEditor(QVariant::KeySequence, new QStandardItemEditorCreator<QKeySequenceEdit>()); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Pen, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::TextLength, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::TextFormat, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Matrix, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Transform, Q_NULLPTR); //TODO
|
||||||
|
factory->registerEditor(QVariant::Matrix4x4, new Matrix4x4Creator);
|
||||||
|
factory->registerEditor(QVariant::Vector2D, new Vector2DCreator);
|
||||||
|
factory->registerEditor(QVariant::Vector3D, new Vector3DCreator);
|
||||||
|
factory->registerEditor(QVariant::Vector4D, new Vector4DCreator);
|
||||||
|
factory->registerEditor(QVariant::Quaternion, new QuaternionCreator);
|
||||||
|
//factory->registerEditor(QVariant::PolygonF, Q_NULLPTR); //TODO
|
||||||
|
//factory->registerEditor(QVariant::Icon, Q_NULLPTR); //TODO
|
||||||
|
|
||||||
|
//factory->registerEditor(QVariant::SizePolicy, Q_NULLPTR); //TODO
|
||||||
|
|
||||||
|
QItemEditorFactory::setDefaultFactory(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow w;
|
||||||
|
w.show();
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
}
|
}
|
||||||
|
478
mainwindow.cpp
Normal file
@@ -0,0 +1,478 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QAction>
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <QTime>
|
||||||
|
#include <QModelIndex>
|
||||||
|
#include <QMetaProperty>
|
||||||
|
#include <QItemEditorFactory>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QPropertyAnimation>
|
||||||
|
|
||||||
|
#include <Qt3DExtras/Qt3DWindow>
|
||||||
|
#include <Qt3DExtras/QForwardRenderer>
|
||||||
|
#include <Qt3DCore/QEntity>
|
||||||
|
#include <Qt3DExtras/QPlaneMesh>
|
||||||
|
#include <Qt3DCore/QTransform>
|
||||||
|
#include <Qt3DRender/QCamera>
|
||||||
|
#include <Qt3DInput/QInputAspect>
|
||||||
|
#include <Qt3DRender/QRenderAspect>
|
||||||
|
#include <Qt3DExtras/QPhongMaterial>
|
||||||
|
#include <Qt3DExtras/QDiffuseMapMaterial>
|
||||||
|
#include <Qt3DRender/QTextureImage>
|
||||||
|
#include <Qt3DExtras/QFirstPersonCameraController>
|
||||||
|
#include <Qt3DExtras/QNormalDiffuseSpecularMapMaterial>
|
||||||
|
|
||||||
|
#include "houseplant.h"
|
||||||
|
#include "treemodel.h"
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget *parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
ui(new Ui::MainWindow),
|
||||||
|
m_view()
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
ui->actionNew->setShortcut(QKeySequence::New);
|
||||||
|
ui->actionOpen->setShortcut(QKeySequence::Open);
|
||||||
|
ui->actionSave->setShortcut(QKeySequence::Save);
|
||||||
|
ui->actionSaveAs->setShortcut(QKeySequence::SaveAs);
|
||||||
|
ui->actionQuit->setShortcut(QKeySequence::Quit);
|
||||||
|
|
||||||
|
ui->actionUndo->setShortcut(QKeySequence::Undo);
|
||||||
|
ui->actionRedo->setShortcut(QKeySequence::Redo);
|
||||||
|
ui->actionCut->setShortcut(QKeySequence::Cut);
|
||||||
|
ui->actionCopy->setShortcut(QKeySequence::Copy);
|
||||||
|
ui->actionPaste->setShortcut(QKeySequence::Paste);
|
||||||
|
|
||||||
|
connect(ui->actionStart, &QAction::triggered, this, &MainWindow::start);
|
||||||
|
connect(ui->actionPause, &QAction::triggered, this, &MainWindow::pause);
|
||||||
|
connect(ui->actionStop, &QAction::triggered, this, &MainWindow::stop);
|
||||||
|
|
||||||
|
ui->treeView->setContextMenuPolicy(Qt::CustomContextMenu);
|
||||||
|
connect(ui->treeView, &QWidget::customContextMenuRequested, this, &MainWindow::customContextMenuRequested);
|
||||||
|
|
||||||
|
connect(ui->lineEdit, &QLineEdit::returnPressed, this, &MainWindow::returnPressed);
|
||||||
|
|
||||||
|
m_view.defaultFrameGraph()->setClearColor(QColor(QRgb(0x4d4d4f)));
|
||||||
|
|
||||||
|
ui->centralWidget->layout()->addWidget(QWidget::createWindowContainer(&m_view, ui->centralWidget));
|
||||||
|
|
||||||
|
auto sceneRoot = new Qt3DCore::QEntity();
|
||||||
|
sceneRoot->setObjectName("sceneRoot");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto basicCamera = m_view.camera();
|
||||||
|
basicCamera->setObjectName("basicCamera");
|
||||||
|
basicCamera->setProjectionType(Qt3DRender::QCameraLens::PerspectiveProjection);
|
||||||
|
basicCamera->setUpVector(QVector3D(0.0f, 1.0f, 0.0f));
|
||||||
|
basicCamera->setViewCenter(QVector3D(0.0f, 3.5f, 0.0f));
|
||||||
|
basicCamera->setPosition(QVector3D(0.0f, 3.5f, 25.0f));
|
||||||
|
|
||||||
|
{
|
||||||
|
auto camController = new Qt3DExtras::QFirstPersonCameraController(sceneRoot);
|
||||||
|
camController->setObjectName("camController");
|
||||||
|
camController->setCamera(basicCamera);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto planeEntity = new Qt3DCore::QEntity(sceneRoot);
|
||||||
|
planeEntity->setObjectName("planeEntity");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto mesh = new Qt3DExtras::QPlaneMesh;
|
||||||
|
mesh->setObjectName("mesh");
|
||||||
|
mesh->setHeight(100.0f);
|
||||||
|
mesh->setWidth(100.0f);
|
||||||
|
mesh->setMeshResolution(QSize(20, 20));
|
||||||
|
planeEntity->addComponent(mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transform = new Qt3DCore::QTransform();
|
||||||
|
transform->setObjectName("transform");
|
||||||
|
planeEntity->addComponent(transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto normalDiffuseSpecularMapMaterial = new Qt3DExtras::QNormalDiffuseSpecularMapMaterial();
|
||||||
|
normalDiffuseSpecularMapMaterial->setObjectName("normalDiffuseSpecularMapMaterial");
|
||||||
|
normalDiffuseSpecularMapMaterial->setTextureScale(10.0f);
|
||||||
|
normalDiffuseSpecularMapMaterial->setShininess(80.0f);
|
||||||
|
normalDiffuseSpecularMapMaterial->setAmbient(QColor::fromRgbF(0.2f, 0.2f, 0.2f, 1.0f));
|
||||||
|
|
||||||
|
{
|
||||||
|
auto diffuseImage = new Qt3DRender::QTextureImage();
|
||||||
|
diffuseImage->setObjectName("diffuseImage");
|
||||||
|
diffuseImage->setSource(QUrl(QStringLiteral("qrc:/assets/textures/pattern_09/diffuse.webp")));
|
||||||
|
normalDiffuseSpecularMapMaterial->diffuse()->addTextureImage(diffuseImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto specularImage = new Qt3DRender::QTextureImage();
|
||||||
|
specularImage->setObjectName("specularImage");
|
||||||
|
specularImage->setSource(QUrl(QStringLiteral("qrc:/assets/textures/pattern_09/specular.webp")));
|
||||||
|
normalDiffuseSpecularMapMaterial->specular()->addTextureImage(specularImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto normalImage = new Qt3DRender::QTextureImage();
|
||||||
|
normalImage->setObjectName("normalImage");
|
||||||
|
normalImage->setSource(QUrl((QStringLiteral("qrc:/assets/textures/pattern_09/normal.webp"))));
|
||||||
|
normalDiffuseSpecularMapMaterial->normal()->addTextureImage(normalImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
planeEntity->addComponent(normalDiffuseSpecularMapMaterial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto chest = new Qt3DCore::QEntity(sceneRoot);
|
||||||
|
chest->setObjectName("chest");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto mesh = new Qt3DRender::QMesh();
|
||||||
|
mesh->setObjectName("mesh");
|
||||||
|
mesh->setSource(QUrl(QStringLiteral("qrc:/assets/chest/Chest.obj")));
|
||||||
|
chest->addComponent(mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transform = new Qt3DCore::QTransform();
|
||||||
|
transform->setObjectName("transform");
|
||||||
|
transform->setScale(0.03f);
|
||||||
|
chest->addComponent(transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto diffuseMapMaterial = new Qt3DExtras::QDiffuseMapMaterial();
|
||||||
|
diffuseMapMaterial->setObjectName("diffuseMapMaterial");
|
||||||
|
diffuseMapMaterial->setSpecular(QColor::fromRgbF(0.2f, 0.2f, 0.2f, 1.0f));
|
||||||
|
diffuseMapMaterial->setShininess(2.0f);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto chestDiffuseImage = new Qt3DRender::QTextureImage();
|
||||||
|
chestDiffuseImage->setObjectName("chestDiffuseImage");
|
||||||
|
chestDiffuseImage->setSource(QUrl(QStringLiteral("qrc:/assets/chest/diffuse.webp")));
|
||||||
|
diffuseMapMaterial->diffuse()->addTextureImage(chestDiffuseImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
chest->addComponent(diffuseMapMaterial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto trefoil = new Qt3DCore::QEntity(sceneRoot);
|
||||||
|
trefoil->setObjectName("trefoil");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto mesh = new Qt3DRender::QMesh();
|
||||||
|
mesh->setSource(QUrl("qrc:/assets/obj/trefoil.obj"));
|
||||||
|
trefoil->addComponent(mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transform = new Qt3DCore::QTransform();
|
||||||
|
transform->setTranslation(QVector3D(0.0f, 3.5f, 0.0f));
|
||||||
|
transform->setScale(0.5f);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto animation = new QPropertyAnimation(transform);
|
||||||
|
animation->setObjectName("animation");
|
||||||
|
animation->setDuration(2000);
|
||||||
|
animation->setStartValue(0.0f);
|
||||||
|
animation->setEndValue(360.0f);
|
||||||
|
animation->setLoopCount(-1);
|
||||||
|
animation->setTargetObject(transform);
|
||||||
|
animation->setPropertyName("rotationY");
|
||||||
|
m_animations << animation;
|
||||||
|
}
|
||||||
|
|
||||||
|
trefoil->addComponent(transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto phongMaterial = new Qt3DExtras::QPhongMaterial();
|
||||||
|
phongMaterial->setObjectName("phongMaterial");
|
||||||
|
phongMaterial->setDiffuse(QColor(204, 205, 75)); // Safari Yellow #cccd4b
|
||||||
|
phongMaterial->setSpecular(Qt::white);
|
||||||
|
trefoil->addComponent(phongMaterial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto createBarrel = [=](const QString &name, const QVector3D &translation, float shininess, const QString &meshPath, const QString &diffuseTexturePath, const QString &normaleTexturePath, const QString &specularTexturePath){
|
||||||
|
auto barrel = new Qt3DCore::QEntity(sceneRoot);
|
||||||
|
barrel->setObjectName(name);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto mesh = new Qt3DRender::QMesh();
|
||||||
|
mesh->setObjectName("mesh");
|
||||||
|
mesh->setSource(QUrl(meshPath));
|
||||||
|
barrel->addComponent(mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transform = new Qt3DCore::QTransform();
|
||||||
|
transform->setObjectName("transform");
|
||||||
|
transform->setScale(0.03f);
|
||||||
|
transform->setTranslation(translation);
|
||||||
|
barrel->addComponent(transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto material = new Qt3DExtras::QNormalDiffuseSpecularMapMaterial();
|
||||||
|
material->setObjectName("material");
|
||||||
|
material->setShininess(shininess);
|
||||||
|
|
||||||
|
material->diffuse()->setObjectName("diffuseTexture");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto diffuseTextureImage = new Qt3DRender::QTextureImage();
|
||||||
|
diffuseTextureImage->setObjectName("diffuseTextureImage");
|
||||||
|
diffuseTextureImage->setSource(QUrl(diffuseTexturePath));
|
||||||
|
|
||||||
|
material->diffuse()->addTextureImage(diffuseTextureImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
material->normal()->setObjectName("normalTexture");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto normalTextureImage = new Qt3DRender::QTextureImage();
|
||||||
|
normalTextureImage->setObjectName("normalTextureImage");
|
||||||
|
normalTextureImage->setSource(QUrl(normaleTexturePath));
|
||||||
|
|
||||||
|
material->normal()->addTextureImage(normalTextureImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
material->specular()->setObjectName("specularTexture");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto specularTextureImage = new Qt3DRender::QTextureImage();
|
||||||
|
specularTextureImage->setObjectName("specularTextureImage");
|
||||||
|
specularTextureImage->setSource(QUrl(specularTexturePath));
|
||||||
|
|
||||||
|
material->specular()->addTextureImage(specularTextureImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
barrel->addComponent(material);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
createBarrel("basicBarrel", QVector3D(8.0f, 0.0f, 0.0f), 10.0f,
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/metal_barrel.obj"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/diffus_red.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/normal_no_bumps.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/specular.webp"));
|
||||||
|
|
||||||
|
createBarrel("rustyBarrel", QVector3D(10.0f, 0.0f, 0.0f), 10.0f,
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/metal_barrel.obj"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/diffus_rust.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/normal_hard_bumps.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/specular_rust.webp"));
|
||||||
|
|
||||||
|
createBarrel("blueBarrel", QVector3D(12.0f, 0.0f, 0.0f), 10.0f,
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/metal_barrel.obj"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/diffus_blue.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/normal_middle_bumps.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/specular_rust.webp"));
|
||||||
|
|
||||||
|
createBarrel("greenBarrel", QVector3D(14.0f, 0.0f, 0.0f), 10.0f,
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/metal_barrel.obj"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/diffus_green.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/normal_soft_bumps.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/specular_rust.webp"));
|
||||||
|
|
||||||
|
createBarrel("stainlessBarrel", QVector3D(16.0f, 0.0f, 0.0f), 150.0f,
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/metal_barrel.obj"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/diffus_stainless_steel.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/normal_no_bumps.webp"),
|
||||||
|
QStringLiteral("qrc:/assets/metalbarrel/specular_stainless_steel.webp"));
|
||||||
|
|
||||||
|
{
|
||||||
|
auto squareBamboo = new HousePlant(sceneRoot);
|
||||||
|
squareBamboo->setObjectName("squareBamboo");
|
||||||
|
squareBamboo->setPotShape(HousePlant::Square);
|
||||||
|
squareBamboo->setPosition(QVector3D(4.0f, 0.0f, 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto trianglePalm = new HousePlant(sceneRoot);
|
||||||
|
trianglePalm->setObjectName("trianglePalm");
|
||||||
|
trianglePalm->setPlantType(HousePlant::Palm);
|
||||||
|
trianglePalm->setPotShape(HousePlant::Triangle);
|
||||||
|
trianglePalm->setPosition(QVector3D(0.0f, 0.0f, 4.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto spherePine = new HousePlant(sceneRoot);
|
||||||
|
spherePine->setObjectName("spherePine");
|
||||||
|
spherePine->setPlantType(HousePlant::Pine);
|
||||||
|
spherePine->setPotShape(HousePlant::Sphere);
|
||||||
|
spherePine->setPosition(QVector3D(-4.0f, 0.0f, 0.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto crossSpikes = new HousePlant(sceneRoot);
|
||||||
|
crossSpikes->setObjectName("crossSpikes");
|
||||||
|
crossSpikes->setPlantType(HousePlant::Spikes);
|
||||||
|
crossSpikes->setPosition(QVector3D(0.0f, 0.0f, -4.0f));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto crossPalm = new HousePlant(sceneRoot);
|
||||||
|
crossPalm->setObjectName("crossPalm");
|
||||||
|
crossPalm->setPlantType(HousePlant::Palm);
|
||||||
|
crossPalm->setPosition(QVector3D(0.0f, 0.0f, -8.0f));
|
||||||
|
crossPalm->setScale(0.05f);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto crossShrub = new HousePlant(sceneRoot);
|
||||||
|
crossShrub->setObjectName("crossShrub");
|
||||||
|
crossShrub->setPlantType(HousePlant::Shrub);
|
||||||
|
crossShrub->setPosition(QVector3D(0.0f, 0.0f, 8.0f));
|
||||||
|
crossShrub->setScale(0.05f);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto airplane = new Qt3DCore::QEntity(sceneRoot);
|
||||||
|
airplane->setObjectName("airplane");
|
||||||
|
|
||||||
|
{
|
||||||
|
auto mesh = new Qt3DRender::QMesh();
|
||||||
|
mesh->setObjectName("mesh");
|
||||||
|
mesh->setSource(QUrl(QStringLiteral("qrc:/assets/obj/toyplane.obj")));
|
||||||
|
airplane->addComponent(mesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto transform = new Qt3DCore::QTransform();
|
||||||
|
transform->setObjectName("transform");
|
||||||
|
transform->setTranslation(QVector3D(0.0f, 5.0f, -20.0f));
|
||||||
|
transform->setScale(0.1f);
|
||||||
|
airplane->addComponent(transform);
|
||||||
|
|
||||||
|
{
|
||||||
|
auto animation = new QPropertyAnimation(transform);
|
||||||
|
animation->setObjectName("animation");
|
||||||
|
animation->setDuration(3000);
|
||||||
|
animation->setStartValue(0.0f);
|
||||||
|
animation->setEndValue(360.0f);
|
||||||
|
animation->setLoopCount(-1);
|
||||||
|
animation->setTargetObject(transform);
|
||||||
|
animation->setPropertyName("rotationX");
|
||||||
|
m_animations << animation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
auto phongMaterial = new Qt3DExtras::QPhongMaterial();
|
||||||
|
phongMaterial->setObjectName("phongMaterial");
|
||||||
|
phongMaterial->setDiffuse(QColor(150, 150, 150));
|
||||||
|
phongMaterial->setSpecular(Qt::white);
|
||||||
|
airplane->addComponent(phongMaterial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_view.setRootEntity(sceneRoot);
|
||||||
|
|
||||||
|
ui->treeView->setModel(new TreeModel(sceneRoot));
|
||||||
|
ui->treeView->expandAll();
|
||||||
|
connect(ui->treeView->selectionModel(), &QItemSelectionModel::currentRowChanged, this, &MainWindow::currentRowChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::customContextMenuRequested(const QPoint &pos)
|
||||||
|
{
|
||||||
|
auto index = ui->treeView->indexAt(pos);
|
||||||
|
if(!index.isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto entity = static_cast<Qt3DCore::QEntity *>(index.internalPointer());
|
||||||
|
|
||||||
|
QMenu menu;
|
||||||
|
auto switchEnabled = menu.addAction(entity->isEnabled() ? tr("Disable") : tr("Enable"));
|
||||||
|
auto selectedAction = menu.exec(ui->treeView->mapToGlobal(pos));
|
||||||
|
|
||||||
|
if(selectedAction == switchEnabled)
|
||||||
|
entity->setEnabled(!entity->isEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous)
|
||||||
|
{
|
||||||
|
qDebug() << "currentRowChanged";
|
||||||
|
|
||||||
|
if(!current.isValid())
|
||||||
|
return;
|
||||||
|
|
||||||
|
while(ui->formLayout->rowCount() > 0)
|
||||||
|
ui->formLayout->removeRow(0);
|
||||||
|
|
||||||
|
auto entity = static_cast<Qt3DCore::QEntity *>(current.internalPointer());
|
||||||
|
|
||||||
|
for(int i = 0; i < entity->metaObject()->propertyCount(); i++)
|
||||||
|
{
|
||||||
|
auto property = entity->metaObject()->property(i);
|
||||||
|
|
||||||
|
auto type = property.type();
|
||||||
|
|
||||||
|
auto widget = QItemEditorFactory::defaultFactory()->createEditor(type, ui->scrollAreaWidgetContents);
|
||||||
|
if(widget)
|
||||||
|
widget->setProperty(QItemEditorFactory::defaultFactory()->valuePropertyName(type), entity->property(property.name()));
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qWarning() << "no widget for" << property.name() << "(" << property.type() << ")";
|
||||||
|
widget = new QLabel(QString("<span style=\"color:#F00;\">%0</span>").arg(tr("No widget for %0").arg(QString(QVariant::typeToName(type)).toHtmlEscaped())), ui->scrollAreaWidgetContents);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->formLayout->addRow(property.name(), widget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::returnPressed()
|
||||||
|
{
|
||||||
|
ui->textBrowser->append(QString("<b>%0 [DEBUG]:</b> Tried to execute \"%1\"").arg(QTime::currentTime().toString()).arg(ui->lineEdit->text()));
|
||||||
|
ui->textBrowser->verticalScrollBar()->setValue(ui->textBrowser->verticalScrollBar()->maximum());
|
||||||
|
|
||||||
|
ui->lineEdit->setText(QString());
|
||||||
|
ui->lineEdit->focusWidget();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::start()
|
||||||
|
{
|
||||||
|
for(auto animation : m_animations)
|
||||||
|
animation->start();
|
||||||
|
|
||||||
|
ui->actionStart->setEnabled(false);
|
||||||
|
ui->actionPause->setEnabled(true);
|
||||||
|
ui->actionStop->setEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::pause()
|
||||||
|
{
|
||||||
|
for(auto animation : m_animations)
|
||||||
|
animation->pause();
|
||||||
|
|
||||||
|
ui->actionStart->setEnabled(true);
|
||||||
|
ui->actionPause->setEnabled(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::stop()
|
||||||
|
{
|
||||||
|
for(auto animation : m_animations)
|
||||||
|
{
|
||||||
|
animation->setCurrentTime(0);
|
||||||
|
animation->stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->actionStart->setEnabled(true);
|
||||||
|
ui->actionPause->setEnabled(false);
|
||||||
|
ui->actionStop->setEnabled(false);
|
||||||
|
}
|
36
mainwindow.h
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
|
||||||
|
#include <Qt3DExtras/qt3dwindow.h>
|
||||||
|
|
||||||
|
class QModelIndex;
|
||||||
|
class QPropertyAnimation;
|
||||||
|
|
||||||
|
namespace Ui { class MainWindow; }
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainWindow(QWidget *parent = 0);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
void customContextMenuRequested(const QPoint &pos);
|
||||||
|
void currentRowChanged(const QModelIndex ¤t, const QModelIndex &previous);
|
||||||
|
void returnPressed();
|
||||||
|
void start();
|
||||||
|
void pause();
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
|
Qt3DExtras::Qt3DWindow m_view;
|
||||||
|
QList<QPropertyAnimation *> m_animations;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAINWINDOW_H
|
330
mainwindow.ui
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1024</width>
|
||||||
|
<height>768</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>MainWindow</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralWidget">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenuBar" name="menuBar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1024</width>
|
||||||
|
<height>17</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<widget class="QMenu" name="menu_File">
|
||||||
|
<property name="title">
|
||||||
|
<string>&File</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionNew"/>
|
||||||
|
<addaction name="actionOpen"/>
|
||||||
|
<addaction name="actionSave"/>
|
||||||
|
<addaction name="actionSaveAs"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionQuit"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenu" name="menu_Edit">
|
||||||
|
<property name="title">
|
||||||
|
<string>&Edit</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionUndo"/>
|
||||||
|
<addaction name="actionRedo"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionCut"/>
|
||||||
|
<addaction name="actionCopy"/>
|
||||||
|
<addaction name="actionPaste"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenu" name="menu_Game">
|
||||||
|
<property name="title">
|
||||||
|
<string>&Game</string>
|
||||||
|
</property>
|
||||||
|
<addaction name="actionStart"/>
|
||||||
|
<addaction name="actionPause"/>
|
||||||
|
<addaction name="actionStop"/>
|
||||||
|
</widget>
|
||||||
|
<addaction name="menu_File"/>
|
||||||
|
<addaction name="menu_Edit"/>
|
||||||
|
<addaction name="menu_Game"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QToolBar" name="mainToolBar">
|
||||||
|
<attribute name="toolBarArea">
|
||||||
|
<enum>TopToolBarArea</enum>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolBarBreak">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<addaction name="actionOpen"/>
|
||||||
|
<addaction name="actionSave"/>
|
||||||
|
<addaction name="separator"/>
|
||||||
|
<addaction name="actionStart"/>
|
||||||
|
<addaction name="actionPause"/>
|
||||||
|
<addaction name="actionStop"/>
|
||||||
|
</widget>
|
||||||
|
<widget class="QStatusBar" name="statusBar"/>
|
||||||
|
<widget class="QDockWidget" name="dockWidgetConsole">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Console</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="dockWidgetArea">
|
||||||
|
<number>8</number>
|
||||||
|
</attribute>
|
||||||
|
<widget class="QWidget" name="dockWidgetContents">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout" stretch="0,0">
|
||||||
|
<item>
|
||||||
|
<widget class="QTextBrowser" name="textBrowser"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="lineEdit"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<widget class="QDockWidget" name="dockWidgetNodes">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Nodes</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="dockWidgetArea">
|
||||||
|
<number>2</number>
|
||||||
|
</attribute>
|
||||||
|
<widget class="QTreeView" name="treeView">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>350</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<widget class="QDockWidget" name="dockWidgetProperties">
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Properties</string>
|
||||||
|
</property>
|
||||||
|
<attribute name="dockWidgetArea">
|
||||||
|
<number>2</number>
|
||||||
|
</attribute>
|
||||||
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
|
<property name="widgetResizable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>348</width>
|
||||||
|
<height>92</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<layout class="QFormLayout" name="formLayout"/>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<action name="actionNew">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionNew.png</normaloff>:/EngineTest/images/actionNew.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&New</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionOpen">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionOpen.png</normaloff>:/EngineTest/images/actionOpen.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Open</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionSave">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionSave.png</normaloff>:/EngineTest/images/actionSave.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Save</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionSaveAs">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionSaveAs.png</normaloff>:/EngineTest/images/actionSaveAs.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Save &As</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionQuit">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionQuit.png</normaloff>:/EngineTest/images/actionQuit.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Quit</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionUndo">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionUndo.png</normaloff>:/EngineTest/images/actionUndo.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Undo</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionRedo">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionRedo.png</normaloff>:/EngineTest/images/actionRedo.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Redo</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionCut">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionCut.png</normaloff>:/EngineTest/images/actionCut.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Cut</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionCopy">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionCopy.png</normaloff>:/EngineTest/images/actionCopy.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>C&opy</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionPaste">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionPaste.png</normaloff>:/EngineTest/images/actionPaste.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Paste</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionStart">
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionRun.png</normaloff>:/EngineTest/images/actionRun.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Sta&rt</string>
|
||||||
|
</property>
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Start</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionPause">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionPause.png</normaloff>:/EngineTest/images/actionPause.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Pause</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="actionStop">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset resource="resources.qrc">
|
||||||
|
<normaloff>:/EngineTest/images/actionStop.png</normaloff>:/EngineTest/images/actionStop.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>&Stop</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<resources>
|
||||||
|
<include location="resources.qrc"/>
|
||||||
|
</resources>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>actionQuit</sender>
|
||||||
|
<signal>triggered()</signal>
|
||||||
|
<receiver>MainWindow</receiver>
|
||||||
|
<slot>close()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>-1</x>
|
||||||
|
<y>-1</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>511</x>
|
||||||
|
<y>383</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
19
metalbarrel.qrc
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>assets/metalbarrel/diffus_black.webp</file>
|
||||||
|
<file>assets/metalbarrel/diffus_blue.webp</file>
|
||||||
|
<file>assets/metalbarrel/diffus_green.webp</file>
|
||||||
|
<file>assets/metalbarrel/diffus_red.webp</file>
|
||||||
|
<file>assets/metalbarrel/diffus_rust.webp</file>
|
||||||
|
<file>assets/metalbarrel/diffus_stainless_steel.webp</file>
|
||||||
|
<file>assets/metalbarrel/diffus_yellow.webp</file>
|
||||||
|
<file>assets/metalbarrel/metal_barrel.obj</file>
|
||||||
|
<file>assets/metalbarrel/normal_hard_bumps.webp</file>
|
||||||
|
<file>assets/metalbarrel/normal_middle_bumps.webp</file>
|
||||||
|
<file>assets/metalbarrel/normal_no_bumps.webp</file>
|
||||||
|
<file>assets/metalbarrel/normal_soft_bumps.webp</file>
|
||||||
|
<file>assets/metalbarrel/specular_rust.webp</file>
|
||||||
|
<file>assets/metalbarrel/specular_stainless_steel.webp</file>
|
||||||
|
<file>assets/metalbarrel/specular.webp</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
10
obj.qrc
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>assets/textures/pattern_09/specular.webp</file>
|
||||||
|
<file>assets/textures/pattern_09/normal.webp</file>
|
||||||
|
<file>assets/textures/pattern_09/diffuse.webp</file>
|
||||||
|
<file>assets/obj/trefoil.obj</file>
|
||||||
|
<file>assets/obj/toyplane.obj</file>
|
||||||
|
<file>assets/obj/ball.obj</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
24
renderableentity.cpp
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#include "renderableentity.h"
|
||||||
|
|
||||||
|
RenderableEntity::RenderableEntity(Qt3DCore::QNode *parent)
|
||||||
|
: Qt3DCore::QEntity(parent)
|
||||||
|
, m_mesh(new Qt3DRender::QMesh())
|
||||||
|
, m_transform(new Qt3DCore::QTransform())
|
||||||
|
{
|
||||||
|
m_mesh->setObjectName("mesh");
|
||||||
|
|
||||||
|
m_transform->setObjectName("transform");
|
||||||
|
|
||||||
|
addComponent(m_mesh);
|
||||||
|
addComponent(m_transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt3DRender::QMesh *RenderableEntity::mesh() const
|
||||||
|
{
|
||||||
|
return m_mesh;
|
||||||
|
}
|
||||||
|
|
||||||
|
Qt3DCore::QTransform *RenderableEntity::transform() const
|
||||||
|
{
|
||||||
|
return m_transform;
|
||||||
|
}
|
21
renderableentity.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef RENDERABLEENTITY_H
|
||||||
|
#define RENDERABLEENTITY_H
|
||||||
|
|
||||||
|
#include <Qt3DCore/QEntity>
|
||||||
|
#include <Qt3DCore/QTransform>
|
||||||
|
#include <Qt3DRender/QMesh>
|
||||||
|
|
||||||
|
class RenderableEntity : public Qt3DCore::QEntity
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RenderableEntity(Qt3DCore::QNode *parent = 0);
|
||||||
|
|
||||||
|
Qt3DRender::QMesh *mesh() const;
|
||||||
|
Qt3DCore::QTransform *transform() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Qt3DRender::QMesh *m_mesh;
|
||||||
|
Qt3DCore::QTransform *m_transform;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // RENDERABLEENTITY_H
|
17
resources.qrc
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/EngineTest">
|
||||||
|
<file>images/actionCopy.png</file>
|
||||||
|
<file>images/actionCut.png</file>
|
||||||
|
<file>images/actionNew.png</file>
|
||||||
|
<file>images/actionOpen.png</file>
|
||||||
|
<file>images/actionPaste.png</file>
|
||||||
|
<file>images/actionPause.png</file>
|
||||||
|
<file>images/actionQuit.png</file>
|
||||||
|
<file>images/actionRedo.png</file>
|
||||||
|
<file>images/actionRun.png</file>
|
||||||
|
<file>images/actionSave.png</file>
|
||||||
|
<file>images/actionSaveAs.png</file>
|
||||||
|
<file>images/actionStop.png</file>
|
||||||
|
<file>images/actionUndo.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
7
textures.qrc
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>assets/textures/pattern_09/specular.webp</file>
|
||||||
|
<file>assets/textures/pattern_09/normal.webp</file>
|
||||||
|
<file>assets/textures/pattern_09/diffuse.webp</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
169
treemodel.cpp
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
#include "treemodel.h"
|
||||||
|
|
||||||
|
#include <QEntity>
|
||||||
|
#include <QFont>
|
||||||
|
|
||||||
|
TreeModel::TreeModel(Qt3DCore::QEntity *root, QObject *parent) :
|
||||||
|
QAbstractItemModel(parent),
|
||||||
|
m_root(root)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
if (!hasIndex(row, column, parent))
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
return createIndex(row, column, (parent.isValid() ? static_cast<Qt3DCore::QEntity *>(parent.internalPointer()) : root())->childNodes().at(row));
|
||||||
|
}
|
||||||
|
|
||||||
|
QModelIndex TreeModel::parent(const QModelIndex &index) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
auto parent = static_cast<Qt3DCore::QEntity *>(index.internalPointer())->parentNode();
|
||||||
|
|
||||||
|
if (parent == root())
|
||||||
|
return QModelIndex();
|
||||||
|
|
||||||
|
int parentRow = 0;
|
||||||
|
|
||||||
|
if(parent->parentNode())
|
||||||
|
parentRow = parent->parentNode()->childNodes().indexOf(parent);
|
||||||
|
|
||||||
|
return createIndex(parentRow, 0, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
int TreeModel::rowCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
if (parent.column() > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return (parent.isValid() ? static_cast<Qt3DCore::QEntity *>(parent.internalPointer()) : root())->childNodes().count();
|
||||||
|
}
|
||||||
|
|
||||||
|
int TreeModel::columnCount(const QModelIndex &parent) const
|
||||||
|
{
|
||||||
|
if (parent.column() > 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 3; //(parent.isValid() ? static_cast<Qt3DCore::QEntity *>(parent.internalPointer()) : root())->columnCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant TreeModel::data(const QModelIndex &index, int role) const
|
||||||
|
{
|
||||||
|
if (!index.isValid())
|
||||||
|
return QVariant();
|
||||||
|
|
||||||
|
switch(index.column())
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
auto name = static_cast<Qt3DCore::QEntity *>(index.internalPointer())->objectName();
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
if(name.isNull())
|
||||||
|
return tr("NULL");
|
||||||
|
else
|
||||||
|
return name;
|
||||||
|
case Qt::EditRole:
|
||||||
|
return name;
|
||||||
|
case Qt::FontRole:
|
||||||
|
if(name.isNull())
|
||||||
|
{
|
||||||
|
QFont font;
|
||||||
|
font.setItalic(true);
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
return static_cast<Qt3DCore::QEntity *>(index.internalPointer())->metaObject()->className();
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
auto enabled = static_cast<Qt3DCore::QEntity *>(index.internalPointer())->isEnabled();
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
return enabled ? tr("true") : tr("false");
|
||||||
|
case Qt::EditRole:
|
||||||
|
return enabled;
|
||||||
|
default:
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant TreeModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||||
|
{
|
||||||
|
switch(orientation)
|
||||||
|
{
|
||||||
|
case Qt::Horizontal:
|
||||||
|
switch(section) {
|
||||||
|
case 0:
|
||||||
|
{
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
return tr("Name");
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
return tr("Typ");
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
switch(role)
|
||||||
|
{
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
case Qt::EditRole:
|
||||||
|
return tr("Enabled");
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
default: return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
//Qt::ItemFlags TreeModel::flags(const QModelIndex &index) const
|
||||||
|
//{
|
||||||
|
// if (!index.isValid())
|
||||||
|
// return Qt::ItemFlags();
|
||||||
|
|
||||||
|
// return static_cast<Qt3DCore::QEntity *>(index.internalPointer())->flags();
|
||||||
|
//}
|
||||||
|
|
||||||
|
Qt3DCore::QEntity *TreeModel::root() const
|
||||||
|
{
|
||||||
|
return m_root;
|
||||||
|
}
|
34
treemodel.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
#ifndef TREEMODEL_H
|
||||||
|
#define TREEMODEL_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QAbstractItemModel>
|
||||||
|
|
||||||
|
namespace Qt3DCore { class QEntity; }
|
||||||
|
|
||||||
|
class TreeModel : public QAbstractItemModel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit TreeModel(Qt3DCore::QEntity *root, QObject *parent = 0);
|
||||||
|
|
||||||
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||||
|
QModelIndex parent(const QModelIndex &index) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||||
|
int columnCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
//Qt::ItemFlags flags(const QModelIndex &index) const Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
|
Qt3DCore::QEntity *root() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Qt3DCore::QEntity *m_root;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // TREEMODEL_H
|
388
widgets.h
Normal file
@@ -0,0 +1,388 @@
|
|||||||
|
#ifndef WIDGETS_H
|
||||||
|
#define WIDGETS_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QUrl>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QToolButton>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QMatrix4x4>
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QDoubleSpinBox>
|
||||||
|
#include <QVector2D>
|
||||||
|
#include <QVector3D>
|
||||||
|
#include <QVector4D>
|
||||||
|
#include <QQuaternion>
|
||||||
|
#include <QItemEditorCreatorBase>
|
||||||
|
|
||||||
|
class UrlWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QUrl value READ value WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline UrlWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QHBoxLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->addWidget(m_lineEdit = new QLineEdit(this));
|
||||||
|
{
|
||||||
|
auto toolButton = new QToolButton(this);
|
||||||
|
connect(toolButton, &QAbstractButton::pressed, this, &UrlWidget::pressed);
|
||||||
|
layout->addWidget(toolButton);
|
||||||
|
}
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QUrl value() const
|
||||||
|
{
|
||||||
|
return QUrl(m_lineEdit->text());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setValue(const QUrl &value)
|
||||||
|
{
|
||||||
|
m_lineEdit->setText(value.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(const QUrl &value);
|
||||||
|
|
||||||
|
private Q_SLOTS:
|
||||||
|
inline void pressed()
|
||||||
|
{
|
||||||
|
auto path = QFileDialog::getOpenFileName(this);
|
||||||
|
if(!path.isEmpty())
|
||||||
|
m_lineEdit->setText(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QLineEdit *m_lineEdit;
|
||||||
|
};
|
||||||
|
|
||||||
|
class UrlCreator : public QItemEditorCreatorBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QWidget *createWidget(QWidget *parent) const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return new UrlWidget(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray valuePropertyName() const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return "value";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Matrix4x4Widget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QMatrix4x4 value READ value WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline Matrix4x4Widget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QGridLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->addWidget(m_doubleSpinBox11 = new QDoubleSpinBox(this), 0, 0);
|
||||||
|
layout->addWidget(m_doubleSpinBox12 = new QDoubleSpinBox(this), 0, 1);
|
||||||
|
layout->addWidget(m_doubleSpinBox13 = new QDoubleSpinBox(this), 0, 2);
|
||||||
|
layout->addWidget(m_doubleSpinBox14 = new QDoubleSpinBox(this), 0, 3);
|
||||||
|
layout->addWidget(m_doubleSpinBox21 = new QDoubleSpinBox(this), 1, 0);
|
||||||
|
layout->addWidget(m_doubleSpinBox22 = new QDoubleSpinBox(this), 1, 1);
|
||||||
|
layout->addWidget(m_doubleSpinBox23 = new QDoubleSpinBox(this), 1, 2);
|
||||||
|
layout->addWidget(m_doubleSpinBox24 = new QDoubleSpinBox(this), 1, 3);
|
||||||
|
layout->addWidget(m_doubleSpinBox31 = new QDoubleSpinBox(this), 2, 0);
|
||||||
|
layout->addWidget(m_doubleSpinBox32 = new QDoubleSpinBox(this), 2, 1);
|
||||||
|
layout->addWidget(m_doubleSpinBox33 = new QDoubleSpinBox(this), 2, 2);
|
||||||
|
layout->addWidget(m_doubleSpinBox34 = new QDoubleSpinBox(this), 2, 3);
|
||||||
|
layout->addWidget(m_doubleSpinBox41 = new QDoubleSpinBox(this), 3, 0);
|
||||||
|
layout->addWidget(m_doubleSpinBox42 = new QDoubleSpinBox(this), 3, 1);
|
||||||
|
layout->addWidget(m_doubleSpinBox43 = new QDoubleSpinBox(this), 3, 2);
|
||||||
|
layout->addWidget(m_doubleSpinBox44 = new QDoubleSpinBox(this), 3, 3);
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QMatrix4x4 value() const
|
||||||
|
{
|
||||||
|
return QMatrix4x4(m_doubleSpinBox11->value(), m_doubleSpinBox12->value(), m_doubleSpinBox13->value(), m_doubleSpinBox14->value(),
|
||||||
|
m_doubleSpinBox21->value(), m_doubleSpinBox22->value(), m_doubleSpinBox23->value(), m_doubleSpinBox24->value(),
|
||||||
|
m_doubleSpinBox31->value(), m_doubleSpinBox32->value(), m_doubleSpinBox33->value(), m_doubleSpinBox34->value(),
|
||||||
|
m_doubleSpinBox41->value(), m_doubleSpinBox42->value(), m_doubleSpinBox43->value(), m_doubleSpinBox44->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setValue(const QMatrix4x4 &value)
|
||||||
|
{
|
||||||
|
{
|
||||||
|
auto row = value.row(0);
|
||||||
|
m_doubleSpinBox11->setValue(row.x());
|
||||||
|
m_doubleSpinBox12->setValue(row.y());
|
||||||
|
m_doubleSpinBox13->setValue(row.z());
|
||||||
|
m_doubleSpinBox14->setValue(row.w());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto row = value.row(1);
|
||||||
|
m_doubleSpinBox21->setValue(row.x());
|
||||||
|
m_doubleSpinBox22->setValue(row.y());
|
||||||
|
m_doubleSpinBox23->setValue(row.z());
|
||||||
|
m_doubleSpinBox24->setValue(row.w());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto row = value.row(2);
|
||||||
|
m_doubleSpinBox31->setValue(row.x());
|
||||||
|
m_doubleSpinBox32->setValue(row.y());
|
||||||
|
m_doubleSpinBox33->setValue(row.z());
|
||||||
|
m_doubleSpinBox34->setValue(row.w());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
auto row = value.row(3);
|
||||||
|
m_doubleSpinBox41->setValue(row.x());
|
||||||
|
m_doubleSpinBox42->setValue(row.y());
|
||||||
|
m_doubleSpinBox43->setValue(row.z());
|
||||||
|
m_doubleSpinBox44->setValue(row.w());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(const QMatrix4x4 &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDoubleSpinBox *m_doubleSpinBox11, *m_doubleSpinBox12, *m_doubleSpinBox13, *m_doubleSpinBox14;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBox21, *m_doubleSpinBox22, *m_doubleSpinBox23, *m_doubleSpinBox24;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBox31, *m_doubleSpinBox32, *m_doubleSpinBox33, *m_doubleSpinBox34;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBox41, *m_doubleSpinBox42, *m_doubleSpinBox43, *m_doubleSpinBox44;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Matrix4x4Creator : public QItemEditorCreatorBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QWidget *createWidget(QWidget *parent) const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return new Matrix4x4Widget(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray valuePropertyName() const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return "value";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector2DWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QVector2D value READ value WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline Vector2DWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QHBoxLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->addWidget(m_doubleSpinBoxX = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxY = new QDoubleSpinBox(this));
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QVector2D value() const
|
||||||
|
{
|
||||||
|
return QVector2D(m_doubleSpinBoxX->value(), m_doubleSpinBoxY->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setValue(const QVector2D &value)
|
||||||
|
{
|
||||||
|
m_doubleSpinBoxX->setValue(value.x());
|
||||||
|
m_doubleSpinBoxY->setValue(value.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(const QVector2D &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxX;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxY;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector2DCreator : public QItemEditorCreatorBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QWidget *createWidget(QWidget *parent) const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return new Vector2DWidget(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray valuePropertyName() const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return "value";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector3DWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QVector3D value READ value WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline Vector3DWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QHBoxLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->addWidget(m_doubleSpinBoxX = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxY = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxZ = new QDoubleSpinBox(this));
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QVector3D value() const
|
||||||
|
{
|
||||||
|
return QVector3D(m_doubleSpinBoxX->value(), m_doubleSpinBoxY->value(), m_doubleSpinBoxZ->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setValue(const QVector3D &value)
|
||||||
|
{
|
||||||
|
m_doubleSpinBoxX->setValue(value.x());
|
||||||
|
m_doubleSpinBoxY->setValue(value.y());
|
||||||
|
m_doubleSpinBoxZ->setValue(value.z());
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(const QVector3D &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxX;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxY;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxZ;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector3DCreator : public QItemEditorCreatorBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QWidget *createWidget(QWidget *parent) const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return new Vector3DWidget(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray valuePropertyName() const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return "value";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector4DWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QVector4D value READ value WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline Vector4DWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QHBoxLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->addWidget(m_doubleSpinBoxX = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxY = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxZ = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxW = new QDoubleSpinBox(this));
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QVector4D value() const
|
||||||
|
{
|
||||||
|
return QVector4D(m_doubleSpinBoxX->value(), m_doubleSpinBoxY->value(), m_doubleSpinBoxZ->value(), m_doubleSpinBoxW->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setValue(const QVector4D &value)
|
||||||
|
{
|
||||||
|
m_doubleSpinBoxX->setValue(value.x());
|
||||||
|
m_doubleSpinBoxY->setValue(value.y());
|
||||||
|
m_doubleSpinBoxZ->setValue(value.z());
|
||||||
|
m_doubleSpinBoxW->setValue(value.w());
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(const QVector4D &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxX;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxY;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxZ;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxW;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Vector4DCreator : public QItemEditorCreatorBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QWidget *createWidget(QWidget *parent) const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return new Vector4DWidget(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray valuePropertyName() const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return "value";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class QuaternionWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(QQuaternion value READ value WRITE setValue NOTIFY valueChanged)
|
||||||
|
|
||||||
|
public:
|
||||||
|
inline QuaternionWidget(QWidget *parent = Q_NULLPTR) : QWidget(parent)
|
||||||
|
{
|
||||||
|
auto layout = new QHBoxLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->addWidget(m_doubleSpinBoxX = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxY = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxZ = new QDoubleSpinBox(this));
|
||||||
|
layout->addWidget(m_doubleSpinBoxScalar = new QDoubleSpinBox(this));
|
||||||
|
setLayout(layout);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline QQuaternion value() const
|
||||||
|
{
|
||||||
|
return QQuaternion(m_doubleSpinBoxX->value(), m_doubleSpinBoxY->value(), m_doubleSpinBoxZ->value(), m_doubleSpinBoxScalar->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void setValue(const QQuaternion &value)
|
||||||
|
{
|
||||||
|
m_doubleSpinBoxX->setValue(value.x());
|
||||||
|
m_doubleSpinBoxY->setValue(value.y());
|
||||||
|
m_doubleSpinBoxZ->setValue(value.z());
|
||||||
|
m_doubleSpinBoxScalar->setValue(value.scalar());
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
void valueChanged(const QQuaternion &value);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxX;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxY;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxZ;
|
||||||
|
QDoubleSpinBox *m_doubleSpinBoxScalar;
|
||||||
|
};
|
||||||
|
|
||||||
|
class QuaternionCreator : public QItemEditorCreatorBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
QWidget *createWidget(QWidget *parent) const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return new QuaternionWidget(parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
QByteArray valuePropertyName() const Q_DECL_OVERRIDE
|
||||||
|
{
|
||||||
|
return "value";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<int Tmin, int Tmax>
|
||||||
|
class LimitedQSpinBox : public QSpinBox
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
inline LimitedQSpinBox(QWidget *parent = Q_NULLPTR) : QSpinBox(parent)
|
||||||
|
{
|
||||||
|
setRange(Tmin, Tmax);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // WIDGETS_H
|