Revision control

++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++
++ import QtQuick 2.15
++ import QtQuick.Layouts 1.15
++ import HelperWidgets 2.0
++ import StudioTheme 1.0 as StudioTheme
++
++ Column {
++ width: parent.width
++
++ Section {
++ caption: qsTr("Model")
++ width: parent.width
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Source")
++ tooltip: qsTr("Sets the location of the mesh file containing the geometry of this model.")
++ }
++
++ SecondColumnLayout {
++ UrlChooser {
++ id: sourceUrlChooser
++ backendValue: backendValues.source
++ filter: "*.mesh"
++ defaultItems: ["#Rectangle" ,"#Sphere" ,"#Cube" ,"#Cone" ,"#Cylinder"]
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Geometry")
++ tooltip: qsTr("Sets a custom geometry for the model")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ id: geometryComboBox
++ typeFilter: "QtQuick3D.Geometry"
++ backendValue: backendValues.geometry
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++
++ Connections {
++ target: geometryComboBox.backendValue
++ function onExpressionChanged() {
++ if (geometryComboBox.backendValue.expression !== "" &&
++ sourceUrlChooser.backendValue.expression !== "")
++ sourceUrlChooser.backendValue.resetValue()
++ }
++ }
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Materials")
++ Layout.alignment: Qt.AlignTop
++ Layout.topMargin: 5
++ }
++
++ SecondColumnLayout {
++ EditableListView {
++ backendValue: backendValues.materials
++ model: backendValues.materials.expressionAsList
++ Layout.fillWidth: true
++ typeFilter: "QtQuick3D.Material"
++ textRole: "idAndName"
++
++ onAdd: function(value) { backendValues.materials.idListAdd(value) }
++ onRemove: function(idx) { backendValues.materials.idListRemove(idx) }
++ onReplace: function (idx, value) { backendValues.materials.idListReplace(idx, value) }
++
++ extraButtonIcon: StudioTheme.Constants.material_medium
++ extraButtonToolTip: qsTr("Edit material")
++ onExtraButtonClicked: (idx) => { backendValues.materials.openMaterialEditor(idx) }
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Casts Shadows")
++ tooltip: qsTr("Enables the geometry of this model to be rendered to the shadow maps.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.castsShadows.valueToString
++ backendValue: backendValues.castsShadows
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Receives Shadows")
++ tooltip: qsTr("Enables the geometry of this model to receive shadows.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.receivesShadows.valueToString
++ backendValue: backendValues.receivesShadows
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Casts Reflections")
++ tooltip: qsTr("Enables reflection probes to reflect this model.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.castsReflections.valueToString
++ backendValue: backendValues.castsReflections
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Receives Reflections")
++ tooltip: qsTr("Enables the geometry of this model to receive reflections from the nearest reflection probe. The model must be inside at least one reflection probe to start receiving reflections.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.receivesReflections.valueToString
++ backendValue: backendValues.receivesReflections
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Is Pickable")
++ tooltip: qsTr("Enables ray cast based picking for this model.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.pickable.valueToString
++ backendValue: backendValues.pickable
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Used in Baked Lighting")
++ tooltip: qsTr("This model is static and suitable to contribute to baked lighting.")
++ }
++
++ SecondColumnLayout {
++ CheckBox {
++ text: backendValues.usedInBakedLighting.valueToString
++ backendValue: backendValues.usedInBakedLighting
++ implicitWidth: StudioTheme.Values.twoControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++
++ PropertyLabel {
++ text: qsTr("Depth Bias")
++ tooltip: qsTr("Sets the depth bias of the model.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: -9999999
++ maximumValue: 9999999
++ decimals: 0
++ backendValue: backendValues.depthBias
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("LOD Bias")
++ tooltip: qsTr("Sets the size a model needs to be when rendered before the automatic level of detail meshes are used")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 0.0
++ maximumValue: 9999999
++ decimals: 2
++ backendValue: backendValues.levelOfDetailBias
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ caption: qsTr("Instancing")
++ width: parent.width
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Data Source")
++ tooltip: qsTr("If this property is set, the model will not be rendered normally. Instead, a number of instances of the model will be rendered, as defined by the instance table.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Instancing"
++ backendValue: backendValues.instancing
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Origin Node")
++ tooltip: qsTr("Sets the origin of the instance’s coordinate system.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Node"
++ backendValue: backendValues.instanceRoot
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ caption: qsTr("Animation")
++ width: parent.width
++
++ SectionLayout {
++ PropertyLabel {
++ text: qsTr("Skeleton")
++ tooltip: qsTr("Sets the skeleton for the model.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Skeleton"
++ backendValue: backendValues.skeleton
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Morph Targets")
++ tooltip: qsTr("Sets a list of MorphTargets used to render the provided geometry.")
++ Layout.alignment: Qt.AlignTop
++ Layout.topMargin: 5
++ }
++
++ SecondColumnLayout {
++ EditableListView {
++ backendValue: backendValues.morphTargets
++ model: backendValues.morphTargets.expressionAsList
++ Layout.fillWidth: true
++ typeFilter: "QtQuick3D.MorphTarget"
++
++ onAdd: function(value) { backendValues.morphTargets.idListAdd(value) }
++ onRemove: function(idx) { backendValues.morphTargets.idListRemove(idx) }
++ onReplace: function (idx, value) { backendValues.morphTargets.idListReplace(idx, value) }
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Skin")
++ tooltip: qsTr("Sets the skin for the model.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.Skin"
++ backendValue: backendValues.skin
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++
++ Section {
++ caption: qsTr("Lightmapping")
++ width: parent.width
++
++ SectionLayout {
++
++ PropertyLabel {
++ text: qsTr("Resolution")
++ tooltip: qsTr("Sets the target resolution of the baked lightmap texture for the model.")
++ }
++
++ SecondColumnLayout {
++ SpinBox {
++ minimumValue: 128
++ maximumValue: 4096
++ decimals: 0
++ stepSize: 128
++ sliderIndicatorVisible: true
++ backendValue: backendValues.lightmapBaseResolution
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++
++ PropertyLabel {
++ text: qsTr("Lightmap")
++ tooltip: qsTr("Sets the baked lightmap data for the model.")
++ }
++
++ SecondColumnLayout {
++ ItemFilterComboBox {
++ typeFilter: "QtQuick3D.BakedLightmap"
++ backendValue: backendValues.bakedLightmap
++ implicitWidth: StudioTheme.Values.singleControlColumnWidth
++ + StudioTheme.Values.actionIndicatorWidth
++ }
++
++ ExpandingSpacer {}
++ }
++ }
++ }
++ }