/**************************************************************************** ** ** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ import QtQuick 2.0 import QtQuick3D 1.15 import MouseArea3D 1.0 import LightGeometry 1.0 Node { id: lightGizmo property View3D view3D property Node targetNode: null property MouseArea3D dragHelper: null property color color: Qt.rgba(1, 1, 0, 1) property real brightnessScale: targetNode ? Math.max(1.0, 1.0 + targetNode.brightness) : 100 property real fadeScale: { // Value indicates area where intensity is above certain percent of total brightness. if (lightGizmo.targetNode instanceof SpotLight || lightGizmo.targetNode instanceof PointLight) { var l = targetNode.linearFade; var q = targetNode.quadraticFade; var c = targetNode.constantFade; var d = 20; // divisor to target intensity value. E.g. 20 = 1/20 = 5% if (l === 0 && q === 0) l = 1; // Solved from equation in shader: // 1 / d = 1 / (c + (l + q * dist) * dist); if (q === 0) return 100 * Math.max(((d - c) / l), 1); else return 100 * ((Math.sqrt(4 * q * (d - c) + (l * l)) - l) / (2 * q)); } else { return 100; } } readonly property bool dragging: primaryArrow.dragging property point currentMousePos property string currentLabel signal brightnessCommit() signal brightnessChange() position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0) visible: lightGizmo.targetNode instanceof SpotLight || lightGizmo.targetNode instanceof AreaLight || lightGizmo.targetNode instanceof DirectionalLight || lightGizmo.targetNode instanceof PointLight AutoScaleHelper { id: autoScale view3D: lightGizmo.view3D } // Camera plane circle for point light mesh LightModel { id: pointRing geometryName: "Edit 3D Circle" geometryType: LightGeometry.Circle material: lightMaterial visible: lightGizmo.targetNode instanceof PointLight scale: Qt.vector3d(lightGizmo.fadeScale, lightGizmo.fadeScale, lightGizmo.fadeScale) rotation: lightGizmo.view3D.camera.rotation } Node { rotation: !lightGizmo.targetNode ? Qt.quaternion(1, 0, 0, 0) : lightGizmo.targetNode.sceneRotation LightModel { id: spotModel property real coneScale: visible ? lightGizmo.fadeScale * Math.tan(Math.PI * targetNode.coneAngle / 180) : 1 geometryName: "Edit 3D SpotLight" geometryType: LightGeometry.Spot material: lightMaterial visible: lightGizmo.targetNode instanceof SpotLight scale: Qt.vector3d(coneScale, coneScale, lightGizmo.fadeScale) } Node { visible: lightGizmo.targetNode instanceof SpotLight SpotLightHandle { id: sphereHandle1 view3D: lightGizmo.view3D material: lightMaterial position: Qt.vector3d(0, spotModel.scale.y, -spotModel.scale.z) } SpotLightHandle { id: sphereHandle2 view3D: lightGizmo.view3D material: lightMaterial position: Qt.vector3d(spotModel.scale.x, 0, -spotModel.scale.z) } SpotLightHandle { id: sphereHandle3 view3D: lightGizmo.view3D material: lightMaterial position: Qt.vector3d(0, -spotModel.scale.y, -spotModel.scale.z) } SpotLightHandle { id: sphereHandle4 view3D: lightGizmo.view3D material: lightMaterial position: Qt.vector3d(-spotModel.scale.x, 0, -spotModel.scale.z) } } LightModel { id: areaModel geometryName: "Edit 3D AreaLight" geometryType: LightGeometry.Area material: lightMaterial visible: lightGizmo.targetNode instanceof AreaLight scale: visible ? Qt.vector3d(lightGizmo.targetNode.width / 2, lightGizmo.targetNode.height / 2, 1) .times(lightGizmo.targetNode.scale) : Qt.vector3d(1, 1, 1) } LightModel { id: directionalModel geometryName: "Edit 3D DirLight" geometryType: LightGeometry.Directional material: lightMaterial visible: lightGizmo.targetNode instanceof DirectionalLight scale: autoScale.getScale(Qt.vector3d(50, 50, 50)) } LightModel { id: pointModel geometryName: "Edit 3D PointLight" geometryType: LightGeometry.Point material: lightMaterial visible: lightGizmo.targetNode instanceof PointLight scale: Qt.vector3d(lightGizmo.fadeScale, lightGizmo.fadeScale, lightGizmo.fadeScale) } AdjustableArrow { id: primaryArrow eulerRotation: Qt.vector3d(-90, 0, 0) targetNode: lightGizmo.targetNode color: (hovering || dragging) ? Qt.rgba(1, 1, 1, 1) : lightGizmo.color view3D: lightGizmo.view3D active: lightGizmo.visible dragHelper: lightGizmo.dragHelper scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) length: (lightGizmo.brightnessScale / 10) + 3 property real _startBrightness function updateBrightness(relativeDistance, screenPos) { var currentValue = Math.round(Math.max(0, _startBrightness + relativeDistance * 10)); var l = Qt.locale(); lightGizmo.currentLabel = qsTr("brightness: ") + Number(currentValue).toLocaleString(l, 'f', 0); lightGizmo.currentMousePos = screenPos; targetNode.brightness = currentValue; } onPressed: { _startBrightness = targetNode.brightness; updateBrightness(0, screenPos); } onDragged: { updateBrightness(relativeDistance, screenPos); lightGizmo.brightnessChange(); } onReleased: { updateBrightness(relativeDistance, screenPos); lightGizmo.brightnessCommit(); } } DefaultMaterial { id: lightMaterial emissiveColor: lightGizmo.color lighting: DefaultMaterial.NoLighting cullMode: Material.NoCulling } } }