diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-06-16 12:00:05 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2016-06-16 09:14:38 +0000 |
commit | 28098fadf5e2fe83af7efeb3eb7f83812c1d4237 (patch) | |
tree | ba05934f0d7af07de1592d2e927fbd44dbeb72bc | |
parent | 90f435d441af6e7258c70051c2a7e484fafe1790 (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.obj | 116 | ||||
-rw-r--r-- | editorlib/meshes/cameracone.obj | 19 | ||||
-rw-r--r-- | editorlib/qml.qrc | 2 | ||||
-rw-r--r-- | editorlib/src/editorscene.cpp | 17 | ||||
-rw-r--r-- | editorlib/src/editorsceneitem.cpp | 2 | ||||
-rw-r--r-- | editorlib/src/editorutils.cpp | 53 |
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() |