summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2016-06-16 12:00:05 +0300
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2016-06-16 09:14:38 +0000
commit28098fadf5e2fe83af7efeb3eb7f83812c1d4237 (patch)
treeba05934f0d7af07de1592d2e927fbd44dbeb72bc
parent90f435d441af6e7258c70051c2a7e484fafe1790 (diff)
Changed camera model to a custom mesh and enabled triangle picking
Change-Id: Ic12506a8ca2419a521dd2e88ce47d9db78c9cf2a Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io> Reviewed-by: Titta Heikkala <titta.heikkala@qt.io>
-rw-r--r--editorlib/meshes/camera.obj116
-rw-r--r--editorlib/meshes/cameracone.obj19
-rw-r--r--editorlib/qml.qrc2
-rw-r--r--editorlib/src/editorscene.cpp17
-rw-r--r--editorlib/src/editorsceneitem.cpp2
-rw-r--r--editorlib/src/editorutils.cpp53
6 files changed, 130 insertions, 79 deletions
diff --git a/editorlib/meshes/camera.obj b/editorlib/meshes/camera.obj
new file mode 100644
index 0000000..89b7618
--- /dev/null
+++ b/editorlib/meshes/camera.obj
@@ -0,0 +1,116 @@
+# Blender v2.71 (sub 0) OBJ File: 'camera_joined.blend'
+# www.blender.org
+o Cube.001
+v 0.018619 0.122460 0.243359
+v 0.018619 0.204685 0.170690
+v 0.018619 0.122460 0.292694
+v 0.018619 0.204685 0.219176
+v -0.014271 0.122460 0.243359
+v -0.014271 0.204685 0.170690
+v -0.014271 0.122460 0.292694
+v -0.014271 0.204685 0.219176
+v 0.009151 0.189946 0.755811
+v 0.003806 0.198675 0.075814
+v -0.073173 0.199105 0.755964
+v -0.055379 0.206847 0.075814
+v -0.083522 0.224771 0.755964
+v -0.063333 0.226575 0.075814
+v -0.055379 0.246303 0.633813
+v -0.055379 0.246303 0.075814
+v 0.002081 0.253027 0.634042
+v 0.003806 0.254475 0.075814
+v 0.062991 0.246303 0.633813
+v 0.062991 0.246303 0.075814
+v 0.092432 0.224771 0.755964
+v 0.071910 0.226575 0.075814
+v 0.080827 0.199105 0.755964
+v 0.062991 0.206847 0.075814
+v 0.014931 0.147584 0.850291
+v -0.108366 0.174525 0.869420
+v -0.131223 0.231214 0.869420
+v -0.108366 0.287902 0.869420
+v -0.001785 0.300510 0.851286
+v 0.114028 0.281188 0.850628
+v 0.139659 0.224500 0.850628
+v 0.114028 0.167811 0.850628
+v -0.110669 0.130072 0.014057
+v -0.110669 0.130072 0.568041
+v 0.114269 0.128764 0.014057
+v 0.114269 0.128764 0.568041
+v 0.182719 0.079738 0.014057
+v 0.182719 0.079737 0.568041
+v 0.181412 -0.070100 0.014057
+v 0.181412 -0.070101 0.568041
+v 0.108238 -0.115402 0.014056
+v 0.108238 -0.115403 0.568041
+v -0.115103 -0.114095 0.014056
+v -0.115103 -0.114095 0.568041
+v -0.180329 -0.066943 0.014057
+v -0.180329 -0.066944 0.568041
+v -0.179021 0.082894 0.014057
+v -0.179021 0.082894 0.568041
+v -0.218552 0.240803 -0.126874
+v 0.225286 0.238222 -0.126874
+v 0.360350 0.141485 -0.126874
+v 0.357770 -0.154169 -0.126875
+v 0.213386 -0.243557 -0.126875
+v -0.227301 -0.240977 -0.126875
+v -0.356002 -0.147940 -0.126875
+v -0.353422 0.147714 -0.126874
+v -0.016247 0.210603 0.496762
+v -0.016247 0.128379 0.424093
+v -0.016247 0.210603 0.546097
+v -0.016247 0.128379 0.546097
+v 0.016643 0.210603 0.496762
+v 0.016643 0.128379 0.424093
+v 0.016643 0.210603 0.546097
+v 0.016643 0.128379 0.546097
+s off
+f 2 4 3 1
+f 4 8 7 3
+f 8 6 5 7
+f 6 2 1 5
+f 1 3 7 5
+f 6 8 4 2
+f 9 10 12 11
+f 11 12 14 13
+f 13 14 16 15
+f 15 16 18 17
+f 17 18 20 19
+f 19 20 22 21
+f 12 10 24 22 20 18 16 14
+f 23 24 10 9
+f 21 22 24 23
+f 23 9 25 32
+f 25 26 27 28 29 30 31 32
+f 13 15 28 27
+f 19 21 31 30
+f 15 17 29 28
+f 9 11 26 25
+f 21 23 32 31
+f 11 13 27 26
+f 17 19 30 29
+f 33 34 36 35
+f 35 36 38 37
+f 37 38 40 39
+f 39 40 42 41
+f 41 42 44 43
+f 43 44 46 45
+f 36 34 48 46 44 42 40 38
+f 47 48 34 33
+f 45 46 48 47
+f 39 41 53 52
+f 52 53 54 55 56 49 50 51
+f 33 35 50 49
+f 45 47 56 55
+f 35 37 51 50
+f 41 43 54 53
+f 47 33 49 56
+f 37 39 52 51
+f 43 45 55 54
+f 58 60 59 57
+f 60 64 63 59
+f 64 62 61 63
+f 62 58 57 61
+f 57 59 63 61
+f 62 64 60 58
diff --git a/editorlib/meshes/cameracone.obj b/editorlib/meshes/cameracone.obj
deleted file mode 100644
index 9335720..0000000
--- a/editorlib/meshes/cameracone.obj
+++ /dev/null
@@ -1,19 +0,0 @@
-# Blender v2.70 (sub 0) OBJ File: ''
-# www.blender.org
-v 0.707108 0.707107 0.999999
-v -0.707105 0.707108 1.000000
-v -0.707106 -0.707106 1.000001
-v -0.000001 -0.000001 -1.000000
-v 0.707108 -0.707106 1.000000
-vn -0.000001 -0.942809 -0.333333
-vn -0.000000 0.942809 -0.333334
-vn 0.942809 -0.000001 -0.333335
-vn -0.942809 0.000000 -0.333332
-vn 0.000001 0.000001 1.000000
-s off
-f 3//1 4//1 5//1
-f 1//2 4//2 2//2
-f 5//3 4//3 1//3
-f 2//4 4//4 3//4
-f 1//5 2//5 3//5
-f 5//5 1//5 3//5
diff --git a/editorlib/qml.qrc b/editorlib/qml.qrc
index e55efd6..befd775 100644
--- a/editorlib/qml.qrc
+++ b/editorlib/qml.qrc
@@ -1,6 +1,6 @@
<RCC>
<qresource prefix="/qt3deditorlib">
- <file>meshes/cameracone.obj</file>
+ <file>meshes/camera.obj</file>
<file>meshes/defaultmesh.obj</file>
<file>meshes/spotlight.obj</file>
<file>meshes/directionallight.obj</file>
diff --git a/editorlib/src/editorscene.cpp b/editorlib/src/editorscene.cpp
index da4bf81..f7c1a1f 100644
--- a/editorlib/src/editorscene.cpp
+++ b/editorlib/src/editorscene.cpp
@@ -86,7 +86,7 @@ static const float freeViewCameraFarPlane = 10000.0f;
static const float freeViewCameraFov = 45.0f;
static const int dragCornerHandleCount = 8; // One handle for each selection box corner
static const QColor selectionBoxColor("#43adee");
-static const QColor cameraColor("#c22555");
+static const QColor cameraFrustumColor("#c22555");
static const QColor helperPlaneColor("#585a5c");
EditorScene::EditorScene(QObject *parent)
@@ -1638,9 +1638,7 @@ void EditorScene::createRootEntity()
m_sceneItems.insert(m_rootEntity->id(), m_rootItem);
m_renderSettings = new Qt3DRender::QRenderSettings();
- // TODO: TrianglePicking doesn't work for current camera model as it is just GL_LINES.
- // TODO: We need a proper camera mesh to enable it.
- //m_renderSettings->pickingSettings()->setPickMethod(Qt3DRender::QPickingSettings::TrianglePicking);
+ m_renderSettings->pickingSettings()->setPickMethod(Qt3DRender::QPickingSettings::TrianglePicking);
m_renderSettings->pickingSettings()->setPickResultMode(Qt3DRender::QPickingSettings::AllPicks);
m_renderSettings->setObjectName(QStringLiteral("__internal Scene frame graph"));
m_renderer = new Qt3DExtras::QForwardRenderer();
@@ -1700,7 +1698,7 @@ void EditorScene::createRootEntity()
Qt3DRender::QGeometryRenderer *viewCenterMesh = EditorUtils::createCameraViewCenterMesh(1.0f);
Qt3DExtras::QPhongMaterial *frustumMaterial = new Qt3DExtras::QPhongMaterial();
- frustumMaterial->setAmbient(cameraColor);
+ frustumMaterial->setAmbient(cameraFrustumColor);
frustumMaterial->setDiffuse(QColor(Qt::black));
frustumMaterial->setSpecular(QColor(Qt::black));
frustumMaterial->setShininess(0);
@@ -2109,9 +2107,10 @@ void EditorScene::handleSelectionTransformChange()
QVector3D cornerHandlePositions[dragCornerHandleCount];
bool showCenterHandle = false;
+ resizeCameraViewCenterEntity();
+
if (item) {
Qt3DRender::QCamera *camera = frameGraphCamera();
- resizeCameraViewCenterEntity();
m_dragHandlesTransform->setTranslation(item->selectionBoxCenter());
m_dragHandlesTransform->setRotation(item->selectionTransform()->rotation());
@@ -2368,7 +2367,7 @@ QVector3D EditorScene::projectVectorOnCameraPlane(const QVector3D &vector) const
void EditorScene::resizeCameraViewCenterEntity()
{
// Rescale the camera viewcenter entity according to distance, as it is draggable
- const float vcEntityAngle = 0.006f;
+ const float vcEntityAngle = 0.0045f;
QVector3D vcPos = m_activeSceneCameraFrustumData.viewCenterTransform->translation();
float distanceToVc = (vcPos - frameGraphCamera()->position()).length();
float vcScale = vcEntityAngle * distanceToVc;
@@ -2434,7 +2433,7 @@ void EditorScene::handleCameraAdded(Qt3DRender::QCamera *camera)
Qt3DRender::QGeometryRenderer *visibleMesh = EditorUtils::createVisibleCameraMesh();
Qt3DExtras::QPhongMaterial *cameraMaterial = new Qt3DExtras::QPhongMaterial();
- cameraMaterial->setAmbient(cameraColor);
+ cameraMaterial->setAmbient(QColor(Qt::black));
cameraMaterial->setDiffuse(QColor(Qt::black));
cameraMaterial->setSpecular(QColor(Qt::black));
cameraMaterial->setShininess(0);
@@ -2564,6 +2563,8 @@ void EditorScene::handleViewportSizeChange()
qreal aspectRatio = m_viewport->width() / qMax(m_viewport->height(), 1.0);
m_freeViewCameraEntity->lens()->setPerspectiveProjection(
freeViewCameraFov, aspectRatio, freeViewCameraNearPlane, freeViewCameraFarPlane);
+ // Need to update drag handle positions
+ handleSelectionTransformChange();
}
void EditorScene::handleEntityNameChange()
diff --git a/editorlib/src/editorsceneitem.cpp b/editorlib/src/editorsceneitem.cpp
index 46216a0..fc018d3 100644
--- a/editorlib/src/editorsceneitem.cpp
+++ b/editorlib/src/editorsceneitem.cpp
@@ -96,7 +96,7 @@ EditorSceneItem::EditorSceneItem(EditorScene *scene, Qt3DCore::QEntity *entity,
}
bool isCamera = qobject_cast<Qt3DRender::QCamera *>(entity);
if (isCamera)
- m_entityMeshExtents = QVector3D(1.4f, 1.4f, 1.4f);
+ m_entityMeshExtents = QVector3D(1.0f, 1.0f, 1.75f);
// Selection transform is needed for child items, even if we don't have a box
m_selectionTransform = new Qt3DCore::QTransform;
diff --git a/editorlib/src/editorutils.cpp b/editorlib/src/editorutils.cpp
index 2fac868..7f4039e 100644
--- a/editorlib/src/editorutils.cpp
+++ b/editorlib/src/editorutils.cpp
@@ -661,56 +661,9 @@ Qt3DRender::QGeometryRenderer *EditorUtils::createDefaultCustomMesh()
Qt3DRender::QGeometryRenderer *EditorUtils::createVisibleCameraMesh()
{
- // Creates a camera 'mesh' that is is made up of GL_LINES
- // TODO: Perhaps create a nice custom mesh for camera instead?
- Qt3DRender::QGeometryRenderer *mesh = new Qt3DRender::QGeometryRenderer();
- Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry(mesh);
- Qt3DRender::QBuffer *dataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer,
- geometry);
- Qt3DRender::QBuffer *indexDataBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::IndexBuffer,
- geometry);
- QByteArray vertexBufferData;
- QByteArray indexBufferData;
-
- vertexBufferData.resize(8 * 3 * sizeof(float));
- indexBufferData.resize(10 * 2 * sizeof(ushort));
-
- float *vPtr = reinterpret_cast<float *>(vertexBufferData.data());
- vPtr[0] = -0.5f; vPtr[1] = 0.5f; vPtr[2] = -0.5f;
- vPtr[3] = -0.5f; vPtr[4] = -0.5f; vPtr[5] = -0.5f;
- vPtr[6] = 0.5f; vPtr[7] = -0.5f; vPtr[8] = -0.5f;
- vPtr[9] = 0.5f; vPtr[10] = 0.5f; vPtr[11] = -0.5f;
- vPtr[12] = 0.0f; vPtr[13] = 0.0f; vPtr[14] = 0.5f;
- vPtr[15] = -0.1f; vPtr[16] = 0.5f; vPtr[17] = -0.5f;
- vPtr[18] = 0.1f; vPtr[19] = 0.5f; vPtr[20] = -0.5f;
- vPtr[21] = 0.0f; vPtr[22] = 0.7f; vPtr[23] = -0.5f;
-
- ushort *iPtr = reinterpret_cast<ushort *>(indexBufferData.data());
- iPtr[0] = 0; iPtr[1] = 1;
- iPtr[2] = 1; iPtr[3] = 2;
- iPtr[4] = 2; iPtr[5] = 3;
- iPtr[6] = 3; iPtr[7] = 0;
- iPtr[8] = 0; iPtr[9] = 4;
- iPtr[10] = 1; iPtr[11] = 4;
- iPtr[12] = 2; iPtr[13] = 4;
- iPtr[14] = 3; iPtr[15] = 4;
- iPtr[16] = 5; iPtr[17] = 7;
- iPtr[18] = 6; iPtr[19] = 7;
-
- dataBuffer->setData(vertexBufferData);
- indexDataBuffer->setData(indexBufferData);
-
- addPositionAttributeToGeometry(geometry, dataBuffer, 8);
- addIndexAttributeToGeometry(geometry, indexDataBuffer, 20);
-
- mesh->setInstanceCount(1);
- mesh->setIndexOffset(0);
- mesh->setFirstInstance(0);
- mesh->setVertexCount(20);
- mesh->setPrimitiveType(Qt3DRender::QGeometryRenderer::Lines);
- mesh->setGeometry(geometry);
-
- return mesh;
+ Qt3DRender::QMesh *customMesh = new Qt3DRender::QMesh();
+ customMesh->setSource(QUrl(QStringLiteral("qrc:/qt3deditorlib/meshes/camera.obj")));
+ return customMesh;
}
Qt3DRender::QGeometryRenderer *EditorUtils::createCameraViewVectorMesh()