364 lines
13 KiB
QML
364 lines
13 KiB
QML
// 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 {}
|
||
}
|
||
}
|
||
}
|
||
}
|