mirror of
https://github.com/overte-org/overte.git
synced 2025-04-11 10:14:15 +02:00
Merge pull request #15435 from samcake/blackProp
Case 22327: Add a qml library to represent and interact with the engine configs, enhance Luci
This commit is contained in:
commit
42fb23ed5d
34 changed files with 1686 additions and 509 deletions
|
@ -10,7 +10,12 @@
|
|||
//
|
||||
"use strict";
|
||||
|
||||
// traverse task tree
|
||||
// traverse task tree recursively
|
||||
//
|
||||
// @param root: the root job config from where to traverse
|
||||
// @param functor: the functor function() which is applied on every subjobs of root traversed
|
||||
// if return true, then 'task_tree' is called recursively on that subjob
|
||||
// @param depth: the depth of the recurse loop since the initial call.
|
||||
function task_traverse(root, functor, depth) {
|
||||
if (root.isTask()) {
|
||||
depth++;
|
||||
|
@ -22,6 +27,9 @@ function task_traverse(root, functor, depth) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// same function as 'task_traverse' with the depth being 0
|
||||
// and visisting the root job first.
|
||||
function task_traverseTree(root, functor) {
|
||||
if (functor(root, 0, 0)) {
|
||||
task_traverse(root, functor, 0)
|
||||
|
|
123
scripts/developer/utilities/lib/jet/qml/TaskPropView.qml
Normal file
123
scripts/developer/utilities/lib/jet/qml/TaskPropView.qml
Normal file
|
@ -0,0 +1,123 @@
|
|||
//
|
||||
// jet/TaskPropView.qml
|
||||
//
|
||||
// Created by Sam Gateau, 2018/05/09
|
||||
// Copyright 2018 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 1.4 as Original
|
||||
import QtQuick.Controls.Styles 1.4
|
||||
|
||||
import stylesUit 1.0
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
import "../../prop" as Prop
|
||||
|
||||
import "../jet.js" as Jet
|
||||
|
||||
Prop.PropGroup {
|
||||
|
||||
id: root;
|
||||
|
||||
property var rootConfig : Render
|
||||
property var jobPath: ""
|
||||
property alias label: root.label
|
||||
property alias indentDepth: root.indentDepth
|
||||
|
||||
property var showProps: true
|
||||
property var showSubs: true
|
||||
property var jobEnabled: rootConfig.getConfig(jobPath).enabled
|
||||
property var jobCpuTime: pullCpuTime()
|
||||
|
||||
function pullCpuTime() {
|
||||
if (jobEnabled) {
|
||||
return rootConfig.getConfig(jobPath).cpuRunTime.toPrecision(3);
|
||||
} else {
|
||||
return '.'
|
||||
}
|
||||
}
|
||||
|
||||
property var toggleJobActivation: function() {
|
||||
console.log("the button has been pressed and jobEnabled is " + jobEnabled )
|
||||
jobEnabled = !jobEnabled;
|
||||
rootConfig.getConfig(jobPath).enabled = jobEnabled;
|
||||
}
|
||||
|
||||
// Panel Header Data Component
|
||||
panelHeaderData: Component {
|
||||
Item {
|
||||
id: header
|
||||
Prop.PropLabel {
|
||||
text: root.label
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
anchors.left: parent.left
|
||||
anchors.right: cpuTime.left
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
Prop.PropLabel {
|
||||
id: cpuTime
|
||||
visible: false // root.jobEnabled
|
||||
width: 50
|
||||
text: jobCpuTime
|
||||
horizontalAlignment: Text.AlignLeft
|
||||
anchors.rightMargin: 5
|
||||
anchors.right:enabledIcon.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
Prop.PropCanvasIcon {
|
||||
id: enabledIcon
|
||||
anchors.right:parent.right
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
filled: root.jobEnabled
|
||||
fillColor: (root.jobEnabled ? global.colorGreenHighlight : global.colorOrangeAccent)
|
||||
icon: 5
|
||||
iconMouseArea.onClicked: { toggleJobActivation() }
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
function populatePropItems() {
|
||||
var propsModel = []
|
||||
var props = Jet.job_propKeys(rootConfig.getConfig(jobPath));
|
||||
// console.log(JSON.stringify(props));
|
||||
if (showProps) {
|
||||
for (var p in props) {
|
||||
propsModel.push({"object": rootConfig.getConfig(jobPath), "property":props[p] })
|
||||
}
|
||||
root.updatePropItems(root.propItemsPanel, propsModel);
|
||||
}
|
||||
|
||||
if (showSubs) {
|
||||
Jet.task_traverse(rootConfig.getConfig(jobPath),
|
||||
function(job, depth, index) {
|
||||
var component = Qt.createComponent("./TaskPropView.qml");
|
||||
component.createObject(root.propItemsPanel, {
|
||||
"label": job.objectName,
|
||||
"rootConfig": root.rootConfig,
|
||||
"jobPath": root.jobPath + '.' + job.objectName,
|
||||
"showProps": root.showProps,
|
||||
"showSubs": root.showSubs,
|
||||
"indentDepth": root.indentDepth + 1,
|
||||
})
|
||||
/* var component = Qt.createComponent("../../prop/PropItem.qml");
|
||||
component.createObject(root.propItemsPanel, {
|
||||
"label": root.jobPath + '.' + job.objectName + ' num=' + index,
|
||||
})*/
|
||||
// propsModel.push({"type": "printLabel", "label": root.jobPath + '.' + job.objectName + ' num=' + index })
|
||||
|
||||
return (depth < 1);
|
||||
}, 0)
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
populatePropItems()
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -1,3 +1,4 @@
|
|||
TaskList 1.0 TaskList.qml
|
||||
TaskViewList 1.0 TaskViewList.qml
|
||||
TaskTimeFrameView 1.0 TaskTimeFrameView.qml
|
||||
TaskPropView 1.0 TaskPropView.qml
|
32
scripts/developer/utilities/lib/prop/PropBool.qml
Normal file
32
scripts/developer/utilities/lib/prop/PropBool.qml
Normal file
|
@ -0,0 +1,32 @@
|
|||
//
|
||||
// PropBool.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
PropItem {
|
||||
Global { id: global }
|
||||
id: root
|
||||
|
||||
property alias valueVar : checkboxControl.checked
|
||||
|
||||
Component.onCompleted: {
|
||||
valueVar = root.valueVarGetter();
|
||||
}
|
||||
|
||||
PropCheckBox {
|
||||
id: checkboxControl
|
||||
|
||||
anchors.left: root.splitter.right
|
||||
anchors.verticalCenter: root.verticalCenter
|
||||
width: root.width * global.valueAreaWidthScale
|
||||
|
||||
onCheckedChanged: { root.valueVarSetter(checked); }
|
||||
}
|
||||
}
|
0
scripts/developer/utilities/lib/prop/PropColor.qml
Normal file
0
scripts/developer/utilities/lib/prop/PropColor.qml
Normal file
38
scripts/developer/utilities/lib/prop/PropEnum.qml
Normal file
38
scripts/developer/utilities/lib/prop/PropEnum.qml
Normal file
|
@ -0,0 +1,38 @@
|
|||
//
|
||||
// PropEnum.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
PropItem {
|
||||
Global { id: global }
|
||||
id: root
|
||||
|
||||
property alias valueVar : valueCombo.currentIndex
|
||||
property alias enums : valueCombo.model
|
||||
|
||||
Component.onCompleted: {
|
||||
// valueVar = root.valueVarGetter();
|
||||
}
|
||||
|
||||
PropComboBox {
|
||||
id: valueCombo
|
||||
|
||||
flat: true
|
||||
|
||||
anchors.left: root.splitter.right
|
||||
anchors.right: root.right
|
||||
anchors.verticalCenter: root.verticalCenter
|
||||
height: global.slimHeight
|
||||
|
||||
currentIndex: root.valueVarGetter()
|
||||
onCurrentIndexChanged: { root.valueVarSetter(currentIndex); }
|
||||
}
|
||||
}
|
102
scripts/developer/utilities/lib/prop/PropGroup.qml
Normal file
102
scripts/developer/utilities/lib/prop/PropGroup.qml
Normal file
|
@ -0,0 +1,102 @@
|
|||
//
|
||||
// PropGroup.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
// PropGroup is mostly reusing the look and feel of the PropFolderPanel
|
||||
// It is populated by calling "updatePropItems"
|
||||
// or adding manually new Items to the "propItemsPanel"
|
||||
PropFolderPanel {
|
||||
Global { id: global }
|
||||
id: root
|
||||
|
||||
property alias propItemsPanel: root.panelFrameContent
|
||||
|
||||
// Prop Group is designed to author an array of ProItems, they are defined with an array of the tuplets describing each individual item:
|
||||
// [ ..., PropItemInfo, ...]
|
||||
// PropItemInfo {
|
||||
// type: "PropXXXX", object: JSobject, property: "propName"
|
||||
// }
|
||||
//
|
||||
function updatePropItems(propItemsContainer, propItemsModel) {
|
||||
root.hasContent = false
|
||||
for (var i = 0; i < propItemsModel.length; i++) {
|
||||
var proItem = propItemsModel[i];
|
||||
// valid object
|
||||
if (proItem['object'] !== undefined && proItem['object'] !== null ) {
|
||||
// valid property
|
||||
if (proItem['property'] !== undefined && proItem.object[proItem.property] !== undefined) {
|
||||
// check type
|
||||
if (proItem['type'] === undefined) {
|
||||
proItem['type'] = typeof(proItem.object[proItem.property])
|
||||
}
|
||||
switch(proItem.type) {
|
||||
case 'boolean':
|
||||
case 'PropBool': {
|
||||
var component = Qt.createComponent("PropBool.qml");
|
||||
component.createObject(propItemsContainer, {
|
||||
"label": proItem.property,
|
||||
"object": proItem.object,
|
||||
"property": proItem.property
|
||||
})
|
||||
} break;
|
||||
case 'number':
|
||||
case 'PropScalar': {
|
||||
var component = Qt.createComponent("PropScalar.qml");
|
||||
component.createObject(propItemsContainer, {
|
||||
"label": proItem.property,
|
||||
"object": proItem.object,
|
||||
"property": proItem.property,
|
||||
"min": (proItem["min"] !== undefined ? proItem.min : 0.0),
|
||||
"max": (proItem["max"] !== undefined ? proItem.max : 1.0),
|
||||
"integer": (proItem["integral"] !== undefined ? proItem.integral : false),
|
||||
})
|
||||
} break;
|
||||
case 'PropEnum': {
|
||||
var component = Qt.createComponent("PropEnum.qml");
|
||||
component.createObject(propItemsContainer, {
|
||||
"label": proItem.property,
|
||||
"object": proItem.object,
|
||||
"property": proItem.property,
|
||||
"enums": (proItem["enums"] !== undefined ? proItem.enums : ["Undefined Enums !!!"]),
|
||||
})
|
||||
} break;
|
||||
case 'object': {
|
||||
var component = Qt.createComponent("PropItem.qml");
|
||||
component.createObject(propItemsContainer, {
|
||||
"label": proItem.property,
|
||||
"object": proItem.object,
|
||||
"property": proItem.property,
|
||||
})
|
||||
} break;
|
||||
case 'printLabel': {
|
||||
var component = Qt.createComponent("PropItem.qml");
|
||||
component.createObject(propItemsContainer, {
|
||||
"label": proItem.property
|
||||
})
|
||||
} break;
|
||||
}
|
||||
root.hasContent = true
|
||||
} else {
|
||||
console.log('Invalid property: ' + JSON.stringify(proItem));
|
||||
}
|
||||
} else if (proItem['type'] === 'printLabel') {
|
||||
var component = Qt.createComponent("PropItem.qml");
|
||||
component.createObject(propItemsContainer, {
|
||||
"label": proItem.label
|
||||
})
|
||||
} else {
|
||||
console.log('Invalid object: ' + JSON.stringify(proItem));
|
||||
}
|
||||
}
|
||||
}
|
||||
Component.onCompleted: {
|
||||
}
|
||||
}
|
63
scripts/developer/utilities/lib/prop/PropItem.qml
Normal file
63
scripts/developer/utilities/lib/prop/PropItem.qml
Normal file
|
@ -0,0 +1,63 @@
|
|||
//
|
||||
// PropItem.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
Item {
|
||||
Global { id: global }
|
||||
|
||||
id: root
|
||||
|
||||
// Prop item is designed to author an object[property]:
|
||||
property var object: {}
|
||||
property string property: ""
|
||||
|
||||
// value is accessed through the "valueVarSetter" and "valueVarGetter"
|
||||
// By default, these just go get or set the value from the object[property]
|
||||
//
|
||||
function defaultGet() { return root.object[root.property]; }
|
||||
function defaultSet(value) { root.object[root.property] = value; }
|
||||
property var valueVarSetter: defaultSet
|
||||
property var valueVarGetter: defaultGet
|
||||
|
||||
// PropItem is stretching horizontally accross its parent
|
||||
// Fixed height
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
height: global.lineHeight
|
||||
anchors.leftMargin: global.horizontalMargin
|
||||
anchors.rightMargin: global.horizontalMargin
|
||||
|
||||
// LabelControl And SplitterControl are on the left side of the PropItem
|
||||
property bool showLabel: true
|
||||
property alias labelControl: labelControl
|
||||
property alias label: labelControl.text
|
||||
|
||||
property var labelAreaWidth: root.width * global.splitterRightWidthScale - global.splitterWidth
|
||||
|
||||
PropText {
|
||||
id: labelControl
|
||||
text: root.label
|
||||
enabled: root.showLabel
|
||||
|
||||
anchors.left: root.left
|
||||
anchors.verticalCenter: root.verticalCenter
|
||||
width: labelAreaWidth
|
||||
}
|
||||
|
||||
property alias splitter: splitterControl
|
||||
PropSplitter {
|
||||
id: splitterControl
|
||||
|
||||
anchors.left: labelControl.right
|
||||
size: global.splitterWidth
|
||||
}
|
||||
|
||||
}
|
70
scripts/developer/utilities/lib/prop/PropScalar.qml
Normal file
70
scripts/developer/utilities/lib/prop/PropScalar.qml
Normal file
|
@ -0,0 +1,70 @@
|
|||
//
|
||||
// PropItem.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
PropItem {
|
||||
Global { id: global }
|
||||
id: root
|
||||
|
||||
// Scalar Prop
|
||||
property bool integral: false
|
||||
property var numDigits: 2
|
||||
|
||||
|
||||
property alias valueVar : sliderControl.value
|
||||
property alias min: sliderControl.minimumValue
|
||||
property alias max: sliderControl.maximumValue
|
||||
|
||||
|
||||
|
||||
property bool showValue: true
|
||||
|
||||
|
||||
signal valueChanged(real value)
|
||||
|
||||
Component.onCompleted: {
|
||||
valueVar = root.valueVarGetter();
|
||||
}
|
||||
|
||||
PropLabel {
|
||||
id: valueLabel
|
||||
enabled: root.showValue
|
||||
|
||||
anchors.left: root.splitter.right
|
||||
anchors.verticalCenter: root.verticalCenter
|
||||
width: root.width * global.valueAreaWidthScale
|
||||
horizontalAlignment: global.valueTextAlign
|
||||
height: global.slimHeight
|
||||
|
||||
text: sliderControl.value.toFixed(root.integral ? 0 : root.numDigits)
|
||||
|
||||
background: Rectangle {
|
||||
color: global.color
|
||||
border.color: global.colorBorderLight
|
||||
border.width: global.valueBorderWidth
|
||||
radius: global.valueBorderRadius
|
||||
}
|
||||
}
|
||||
|
||||
HifiControls.Slider {
|
||||
id: sliderControl
|
||||
stepSize: root.integral ? 1.0 : 0.0
|
||||
anchors.left: valueLabel.right
|
||||
anchors.right: root.right
|
||||
anchors.verticalCenter: root.verticalCenter
|
||||
|
||||
onValueChanged: { root.valueVarSetter(value) }
|
||||
}
|
||||
|
||||
|
||||
}
|
14
scripts/developer/utilities/lib/prop/qmldir
Normal file
14
scripts/developer/utilities/lib/prop/qmldir
Normal file
|
@ -0,0 +1,14 @@
|
|||
Module Prop
|
||||
Global 1.0 style/Global.qml
|
||||
PropText 1.0 style/PiText.qml
|
||||
PropLabel 1.0 style/PiLabel.qml
|
||||
PropSplitter 1.0 style/PiSplitter.qml
|
||||
PropComboBox 1.0 style/PiComboBox.qml
|
||||
PropCanvasIcon 1.0 style/PiCanvasIcon.qml
|
||||
PropCheckBox 1.0 style/PiCheckBox.qml
|
||||
PropFolderPanel 1.0 style/PiFolderPanel.qml
|
||||
|
||||
PropItem 1.0 PropItem.qml
|
||||
PropScalar 1.0 PropScalar.qml
|
||||
PropEnum 1.0 PropEnum.qml
|
||||
PropColor 1.0 PropColor.qml
|
54
scripts/developer/utilities/lib/prop/style/Global.qml
Normal file
54
scripts/developer/utilities/lib/prop/style/Global.qml
Normal file
|
@ -0,0 +1,54 @@
|
|||
//
|
||||
// Prop/style/Global.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
import stylesUit 1.0
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
|
||||
Item {
|
||||
HifiConstants { id: hifi }
|
||||
id: root
|
||||
|
||||
readonly property real lineHeight: 32
|
||||
readonly property real slimHeight: 24
|
||||
|
||||
readonly property real horizontalMargin: 4
|
||||
|
||||
readonly property color color: hifi.colors.baseGray
|
||||
readonly property color colorBackShadow: hifi.colors.baseGrayShadow
|
||||
readonly property color colorBackHighlight: hifi.colors.baseGrayHighlight
|
||||
readonly property color colorBorderLight: hifi.colors.lightGray
|
||||
readonly property color colorBorderHighight: hifi.colors.blueHighlight
|
||||
|
||||
readonly property color colorOrangeAccent: "#FF6309"
|
||||
readonly property color colorRedAccent: "#C62147"
|
||||
readonly property color colorGreenHighlight: "#1ac567"
|
||||
|
||||
readonly property real fontSize: 12
|
||||
readonly property var fontFamily: "Raleway"
|
||||
readonly property var fontWeight: Font.DemiBold
|
||||
readonly property color fontColor: hifi.colors.faintGray
|
||||
|
||||
readonly property var splitterRightWidthScale: 0.45
|
||||
readonly property real splitterWidth: 8
|
||||
|
||||
readonly property real iconWidth: fontSize
|
||||
readonly property real iconHeight: fontSize
|
||||
|
||||
readonly property var labelTextAlign: Text.AlignRight
|
||||
readonly property var labelTextElide: Text.ElideMiddle
|
||||
|
||||
readonly property var valueAreaWidthScale: 0.3 * (1.0 - splitterRightWidthScale)
|
||||
readonly property var valueTextAlign: Text.AlignHCenter
|
||||
readonly property real valueBorderWidth: 1
|
||||
readonly property real valueBorderRadius: 2
|
||||
}
|
99
scripts/developer/utilities/lib/prop/style/PiCanvasIcon.qml
Normal file
99
scripts/developer/utilities/lib/prop/style/PiCanvasIcon.qml
Normal file
|
@ -0,0 +1,99 @@
|
|||
//
|
||||
// Prop/style/PiFoldCanvas.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/9/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
Canvas {
|
||||
Global { id: global }
|
||||
|
||||
width: global.iconWidth
|
||||
height: global.iconHeight
|
||||
|
||||
property var icon: 0
|
||||
|
||||
onIconChanged: function () { //console.log("Icon changed to: " + icon );
|
||||
requestPaint()
|
||||
}
|
||||
|
||||
property var filled: true
|
||||
onFilledChanged: function () { //console.log("Filled changed to: " + filled );
|
||||
requestPaint()
|
||||
}
|
||||
|
||||
property var fillColor: global.colorBorderHighight
|
||||
onFillColorChanged: function () { //console.log("fillColor changed to: " + filled );
|
||||
requestPaint()
|
||||
}
|
||||
|
||||
property alias iconMouseArea: mousearea
|
||||
|
||||
contextType: "2d"
|
||||
onPaint: {
|
||||
context.reset();
|
||||
switch (icon) {
|
||||
case false:
|
||||
case 0:{ // Right Arrow
|
||||
context.moveTo(width * 0.25, 0);
|
||||
context.lineTo(width * 0.25, height);
|
||||
context.lineTo(width, height / 2);
|
||||
context.closePath();
|
||||
} break;
|
||||
case true:
|
||||
case 1:{ // Up Arrow
|
||||
context.moveTo(0, height * 0.25);
|
||||
context.lineTo(width, height * 0.25);
|
||||
context.lineTo(width / 2, height);
|
||||
context.closePath();
|
||||
} break;
|
||||
case 2:{ // Down Arrow
|
||||
context.moveTo(0, height * 0.75);
|
||||
context.lineTo(width, height* 0.75);
|
||||
context.lineTo(width / 2, 0);
|
||||
context.closePath();
|
||||
} break;
|
||||
case 3:{ // Left Arrow
|
||||
context.moveTo(width * 0.75, 0);
|
||||
context.lineTo(width * 0.75, height);
|
||||
context.lineTo(0, height / 2);
|
||||
context.closePath();
|
||||
} break;
|
||||
case 4:{ // Square
|
||||
context.moveTo(0,0);
|
||||
context.lineTo(0, height);
|
||||
context.lineTo(width, height);
|
||||
context.lineTo(width, 0);
|
||||
context.closePath();
|
||||
} break;
|
||||
case 5:{ // Small Square
|
||||
context.moveTo(width * 0.25, height * 0.25);
|
||||
context.lineTo(width * 0.25, height * 0.75);
|
||||
context.lineTo(width * 0.75, height * 0.75);
|
||||
context.lineTo(width * 0.75, height * 0.25);
|
||||
context.closePath();
|
||||
} break;
|
||||
default: {
|
||||
|
||||
}
|
||||
}
|
||||
if (filled) {
|
||||
context.fillStyle = fillColor;
|
||||
context.fill();
|
||||
} else {
|
||||
context.strokeStyle = fillColor;
|
||||
context.stroke();
|
||||
}
|
||||
}
|
||||
|
||||
MouseArea{
|
||||
id: mousearea
|
||||
anchors.fill: parent
|
||||
}
|
||||
}
|
23
scripts/developer/utilities/lib/prop/style/PiCheckBox.qml
Normal file
23
scripts/developer/utilities/lib/prop/style/PiCheckBox.qml
Normal file
|
@ -0,0 +1,23 @@
|
|||
//
|
||||
// Prop/style/PiCheckBox.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
HifiControls.CheckBox {
|
||||
Global { id: global }
|
||||
|
||||
color: global.fontColor
|
||||
|
||||
//anchors.left: root.splitter.right
|
||||
//anchors.verticalCenter: root.verticalCenter
|
||||
//width: root.width * global.valueAreaWidthScale
|
||||
height: global.slimHeight
|
||||
}
|
86
scripts/developer/utilities/lib/prop/style/PiComboBox.qml
Normal file
86
scripts/developer/utilities/lib/prop/style/PiComboBox.qml
Normal file
|
@ -0,0 +1,86 @@
|
|||
//
|
||||
// Prop/style/PiComboBox.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
|
||||
ComboBox {
|
||||
id: valueCombo
|
||||
|
||||
height: global.slimHeight
|
||||
|
||||
|
||||
// look
|
||||
flat: true
|
||||
delegate: ItemDelegate {
|
||||
width: valueCombo.width
|
||||
height: valueCombo.height
|
||||
contentItem: PiText {
|
||||
text: modelData
|
||||
horizontalAlignment: global.valueTextAlign
|
||||
}
|
||||
background: Rectangle {
|
||||
color:highlighted?global.colorBackHighlight:global.color;
|
||||
}
|
||||
highlighted: valueCombo.highlightedIndex === index
|
||||
}
|
||||
|
||||
indicator: PiCanvasIcon {
|
||||
id: canvas
|
||||
x: valueCombo.width - width - valueCombo.rightPadding
|
||||
y: valueCombo.topPadding + (valueCombo.availableHeight - height) / 2
|
||||
|
||||
icon: 1
|
||||
/*Connections {
|
||||
target: valueCombo
|
||||
onPressedChanged: { canvas.icon = control.down + 1 }
|
||||
}*/
|
||||
}
|
||||
|
||||
contentItem: PiText {
|
||||
leftPadding: 0
|
||||
rightPadding: valueCombo.indicator.width + valueCombo.spacing
|
||||
|
||||
text: valueCombo.displayText
|
||||
horizontalAlignment: global.valueTextAlign
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
implicitWidth: 120
|
||||
implicitHeight: 40
|
||||
color: global.color
|
||||
border.color: valueCombo.popup.visible ? global.colorBorderHighight : global.colorBorderLight
|
||||
border.width: global.valueBorderWidth
|
||||
radius: global.valueBorderRadius
|
||||
}
|
||||
|
||||
popup: Popup {
|
||||
y: valueCombo.height - 1
|
||||
width: valueCombo.width
|
||||
implicitHeight: contentItem.implicitHeight + 2
|
||||
padding: 1
|
||||
|
||||
contentItem: ListView {
|
||||
clip: true
|
||||
implicitHeight: contentHeight
|
||||
model: valueCombo.popup.visible ? valueCombo.delegateModel : null
|
||||
currentIndex: valueCombo.highlightedIndex
|
||||
|
||||
ScrollIndicator.vertical: ScrollIndicator { }
|
||||
}
|
||||
|
||||
background: Rectangle {
|
||||
color: global.color
|
||||
border.color: global.colorBorderHighight
|
||||
radius: global.valueBorderRadius
|
||||
}
|
||||
}
|
||||
}
|
123
scripts/developer/utilities/lib/prop/style/PiFolderPanel.qml
Normal file
123
scripts/developer/utilities/lib/prop/style/PiFolderPanel.qml
Normal file
|
@ -0,0 +1,123 @@
|
|||
//
|
||||
// Prop/style/PiFoldedPanel.qml
|
||||
//
|
||||
// Created by Sam Gateau on 4/17/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
Item {
|
||||
Global { id: global }
|
||||
id: root
|
||||
|
||||
property var label: "panel"
|
||||
|
||||
property alias isUnfold: headerFolderIcon.icon
|
||||
property alias hasContent: headerFolderIcon.filled
|
||||
property var indentDepth: 0
|
||||
|
||||
// Panel Header Data Component
|
||||
property Component panelHeaderData: defaultPanelHeaderData
|
||||
Component { // default is a Label
|
||||
id: defaultPanelHeaderData
|
||||
PiLabel {
|
||||
text: root.label
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
}
|
||||
}
|
||||
|
||||
// Panel Frame Data Component
|
||||
property Component panelFrameData: defaultPanelFrameData
|
||||
Component { // default is a column
|
||||
id: defaultPanelFrameData
|
||||
Column {
|
||||
}
|
||||
}
|
||||
|
||||
property alias panelFrameContent: _panelFrameData.item
|
||||
|
||||
// Header Item
|
||||
Rectangle {
|
||||
id: header
|
||||
height: global.slimHeight
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.margins: 0
|
||||
|
||||
color: global.colorBackShadow // header of group is darker
|
||||
|
||||
// First in the header, some indentation spacer
|
||||
Item {
|
||||
id: indentSpacer
|
||||
width: (headerFolderIcon.width * root.indentDepth) + global.horizontalMargin // Must be non-zero
|
||||
height: parent.height
|
||||
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
||||
|
||||
// Second, the folder button / indicator
|
||||
Item {
|
||||
id: headerFolder
|
||||
anchors.left: indentSpacer.right
|
||||
width: headerFolderIcon.width * 2
|
||||
anchors.verticalCenter: header.verticalCenter
|
||||
height: parent.height
|
||||
|
||||
PiCanvasIcon {
|
||||
id: headerFolderIcon
|
||||
anchors.horizontalCenter: parent.horizontalCenter
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
fillColor: global.colorOrangeAccent
|
||||
iconMouseArea.onClicked: { root.isUnfold = !root.isUnfold }
|
||||
}
|
||||
}
|
||||
|
||||
// Next the header container
|
||||
// by default containing a Label showing the root.label
|
||||
Loader {
|
||||
sourceComponent: panelHeaderData
|
||||
anchors.left: headerFolder.right
|
||||
anchors.right: header.right
|
||||
anchors.rightMargin: global.horizontalMargin * 2
|
||||
anchors.verticalCenter: header.verticalCenter
|
||||
height: parent.height
|
||||
}
|
||||
}
|
||||
|
||||
// The Panel container
|
||||
Rectangle {
|
||||
id: frame
|
||||
visible: root.isUnfold
|
||||
|
||||
color: "transparent"
|
||||
border.color: global.colorBorderLight
|
||||
border.width: global.valueBorderWidth
|
||||
radius: global.valueBorderRadius
|
||||
|
||||
anchors.margins: 0
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.top: header.bottom
|
||||
anchors.bottom: root.bottom
|
||||
|
||||
// Next the panel frame data
|
||||
Loader {
|
||||
id: _panelFrameData
|
||||
sourceComponent: panelFrameData
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.leftMargin: 0
|
||||
anchors.rightMargin: 0
|
||||
clip: true
|
||||
}
|
||||
}
|
||||
|
||||
height: header.height + isUnfold * _panelFrameData.item.height
|
||||
anchors.margins: 0
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
}
|
25
scripts/developer/utilities/lib/prop/style/PiLabel.qml
Normal file
25
scripts/developer/utilities/lib/prop/style/PiLabel.qml
Normal file
|
@ -0,0 +1,25 @@
|
|||
//
|
||||
// Prop/style/PsLabel.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.2
|
||||
|
||||
Label {
|
||||
Global { id: global }
|
||||
|
||||
color: global.fontColor
|
||||
font.pixelSize: global.fontSize
|
||||
font.family: global.fontFamily
|
||||
font.weight: global.fontWeight
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: global.labelTextAlign
|
||||
elide: global.labelTextElide
|
||||
}
|
||||
|
21
scripts/developer/utilities/lib/prop/style/PiSplitter.qml
Normal file
21
scripts/developer/utilities/lib/prop/style/PiSplitter.qml
Normal file
|
@ -0,0 +1,21 @@
|
|||
//
|
||||
// Prop/style/Splitter.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
Item {
|
||||
id: root
|
||||
property real size
|
||||
|
||||
width: size // Must be non-zero
|
||||
height: size
|
||||
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
}
|
24
scripts/developer/utilities/lib/prop/style/PiText.qml
Normal file
24
scripts/developer/utilities/lib/prop/style/PiText.qml
Normal file
|
@ -0,0 +1,24 @@
|
|||
//
|
||||
// Prop/style/PsText.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
Text {
|
||||
Global { id: global }
|
||||
|
||||
color: global.fontColor
|
||||
font.pixelSize: global.fontSize
|
||||
font.family: global.fontFamily
|
||||
font.weight: global.fontWeight
|
||||
verticalAlignment: Text.AlignVCenter
|
||||
horizontalAlignment: global.labelTextAlign
|
||||
elide: global.labelTextElide
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
(function() {
|
||||
var TABLET_BUTTON_NAME = "TAA";
|
||||
var QMLAPP_URL = Script.resolvePath("./antialiasing.qml");
|
||||
var QMLAPP_URL = Script.resolvePath("./luci/Antialiasing.qml");
|
||||
|
||||
|
||||
var onLuciScreen = false;
|
||||
|
|
|
@ -1,182 +0,0 @@
|
|||
//
|
||||
// Antialiasing.qml
|
||||
//
|
||||
// Created by Sam Gateau on 8/14/2017
|
||||
// Copyright 2016 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.3
|
||||
|
||||
import stylesUit 1.0
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
import "configSlider"
|
||||
import "../lib/plotperf"
|
||||
|
||||
Item {
|
||||
Rectangle {
|
||||
id: root;
|
||||
|
||||
HifiConstants { id: hifi; }
|
||||
color: hifi.colors.baseGray;
|
||||
|
||||
Column {
|
||||
id: antialiasing
|
||||
spacing: 20
|
||||
padding: 10
|
||||
|
||||
Column{
|
||||
spacing: 10
|
||||
|
||||
Row {
|
||||
spacing: 10
|
||||
id: fxaaOnOff
|
||||
property bool debugFXAA: false
|
||||
HifiControls.Button {
|
||||
function getTheText() {
|
||||
if (Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff) {
|
||||
return "FXAA"
|
||||
} else {
|
||||
return "TAA"
|
||||
}
|
||||
}
|
||||
text: getTheText()
|
||||
onClicked: {
|
||||
var onOff = !Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff;
|
||||
if (onOff) {
|
||||
Render.getConfig("RenderMainView.JitterCam").none();
|
||||
Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff = true;
|
||||
} else {
|
||||
Render.getConfig("RenderMainView.JitterCam").play();
|
||||
Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
Row {
|
||||
spacing: 10
|
||||
|
||||
HifiControls.Button {
|
||||
text: {
|
||||
var state = 2 - (Render.getConfig("RenderMainView.JitterCam").freeze * 1 - Render.getConfig("RenderMainView.JitterCam").stop * 2);
|
||||
if (state === 2) {
|
||||
return "Jitter"
|
||||
} else if (state === 1) {
|
||||
return "Paused at " + Render.getConfig("RenderMainView.JitterCam").index + ""
|
||||
} else {
|
||||
return "No Jitter"
|
||||
}
|
||||
}
|
||||
onClicked: { Render.getConfig("RenderMainView.JitterCam").cycleStopPauseRun(); }
|
||||
}
|
||||
HifiControls.Button {
|
||||
text: "<"
|
||||
onClicked: { Render.getConfig("RenderMainView.JitterCam").prev(); }
|
||||
}
|
||||
HifiControls.Button {
|
||||
text: ">"
|
||||
onClicked: { Render.getConfig("RenderMainView.JitterCam").next(); }
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Constrain color"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked }
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Covariance gamma")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "covarianceGamma"
|
||||
max: 1.5
|
||||
min: 0.5
|
||||
height: 38
|
||||
}
|
||||
Separator {}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Feedback history color"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked }
|
||||
}
|
||||
|
||||
ConfigSlider {
|
||||
label: qsTr("Source blend")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "blend"
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
height: 38
|
||||
}
|
||||
|
||||
ConfigSlider {
|
||||
label: qsTr("Post sharpen")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "sharpen"
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
}
|
||||
Separator {}
|
||||
Row {
|
||||
|
||||
spacing: 10
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Debug"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["debug"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["debug"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Show Debug Cursor"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] = checked }
|
||||
}
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Debug Region <")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "debugX"
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Closest Fragment"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked }
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Debug Velocity Threshold [pix]")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "debugShowVelocityThreshold"
|
||||
max: 50
|
||||
min: 0.0
|
||||
height: 38
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Debug Orb Zoom")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "debugOrbZoom"
|
||||
max: 32.0
|
||||
min: 1.0
|
||||
height: 38
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,7 +10,7 @@
|
|||
//
|
||||
|
||||
// Set up the qml ui
|
||||
var qml = Script.resolvePath('culling.qml');
|
||||
var qml = Script.resolvePath('luci/Culling.qml');
|
||||
var window = new OverlayWindow({
|
||||
title: 'Render Draws',
|
||||
source: qml,
|
||||
|
|
|
@ -14,6 +14,7 @@ import QtQuick.Layouts 1.3
|
|||
import stylesUit 1.0
|
||||
import controlsUit 1.0 as HifiControls
|
||||
import "configSlider"
|
||||
import "luci"
|
||||
|
||||
Rectangle {
|
||||
HifiConstants { id: hifi;}
|
||||
|
@ -28,125 +29,16 @@ Rectangle {
|
|||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.margins: hifi.dimensions.contentMargin.x
|
||||
//padding: hifi.dimensions.contentMargin.x
|
||||
|
||||
|
||||
HifiControls.Label {
|
||||
text: "Shading"
|
||||
}
|
||||
Row {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
spacing: 5
|
||||
Column {
|
||||
spacing: 5
|
||||
// padding: 10
|
||||
Repeater {
|
||||
model: [
|
||||
"Unlit:LightingModel:enableUnlit",
|
||||
"Emissive:LightingModel:enableEmissive",
|
||||
"Lightmap:LightingModel:enableLightmap",
|
||||
"Background:LightingModel:enableBackground",
|
||||
"Haze:LightingModel:enableHaze",
|
||||
"AO:LightingModel:enableAmbientOcclusion",
|
||||
"Textures:LightingModel:enableMaterialTexturing"
|
||||
]
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: modelData.split(":")[0]
|
||||
checked: render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
ShadingModel {}
|
||||
|
||||
Separator {}
|
||||
ToneMapping {}
|
||||
|
||||
Column {
|
||||
spacing: 5
|
||||
Repeater {
|
||||
model: [
|
||||
"Obscurance:LightingModel:enableObscurance",
|
||||
"Scattering:LightingModel:enableScattering",
|
||||
"Diffuse:LightingModel:enableDiffuse",
|
||||
"Specular:LightingModel:enableSpecular",
|
||||
"Albedo:LightingModel:enableAlbedo",
|
||||
"Wireframe:LightingModel:enableWireframe",
|
||||
"Skinning:LightingModel:enableSkinning",
|
||||
"Blendshape:LightingModel:enableBlendshape"
|
||||
]
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: modelData.split(":")[0]
|
||||
checked: render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
spacing: 5
|
||||
Repeater {
|
||||
model: [
|
||||
"Ambient:LightingModel:enableAmbientLight",
|
||||
"Directional:LightingModel:enableDirectionalLight",
|
||||
"Point:LightingModel:enablePointLight",
|
||||
"Spot:LightingModel:enableSpotLight",
|
||||
"Light Contour:LightingModel:showLightContour",
|
||||
"Zone Stack:DrawZoneStack:enabled",
|
||||
"Shadow:LightingModel:enableShadow"
|
||||
]
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: modelData.split(":")[0]
|
||||
checked: render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
spacing: 5
|
||||
Repeater {
|
||||
model: [ "Tone Mapping Exposure:ToneMapping:exposure:5.0:-5.0"
|
||||
]
|
||||
ConfigSlider {
|
||||
label: qsTr(modelData.split(":")[0])
|
||||
integral: false
|
||||
config: render.mainViewTask.getConfig(modelData.split(":")[1])
|
||||
property: modelData.split(":")[2]
|
||||
max: modelData.split(":")[3]
|
||||
min: modelData.split(":")[4]
|
||||
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
Item {
|
||||
height: childrenRect.height
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
HifiControls.Label {
|
||||
text: "Tone Mapping Curve"
|
||||
anchors.left: parent.left
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
anchors.right: parent.right
|
||||
currentIndex: 1
|
||||
model: [
|
||||
"RGB",
|
||||
"SRGB",
|
||||
"Reinhard",
|
||||
"Filmic",
|
||||
]
|
||||
width: 200
|
||||
onCurrentIndexChanged: { render.mainViewTask.getConfig("ToneMapping")["curve"] = currentIndex; }
|
||||
}
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
|
@ -169,133 +61,11 @@ Rectangle {
|
|||
}
|
||||
}
|
||||
Separator {}
|
||||
Framebuffer {}
|
||||
|
||||
Item {
|
||||
height: childrenRect.height
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
id: framebuffer
|
||||
|
||||
HifiControls.Label {
|
||||
text: "Debug Framebuffer"
|
||||
anchors.left: parent.left
|
||||
}
|
||||
|
||||
property var config: render.mainViewTask.getConfig("DebugDeferredBuffer")
|
||||
|
||||
function setDebugMode(mode) {
|
||||
framebuffer.config.enabled = (mode != 0);
|
||||
framebuffer.config.mode = mode;
|
||||
}
|
||||
|
||||
ComboBox {
|
||||
anchors.right: parent.right
|
||||
currentIndex: 0
|
||||
model: ListModel {
|
||||
id: cbItemsFramebuffer
|
||||
ListElement { text: "Off"; color: "Yellow" }
|
||||
ListElement { text: "Depth"; color: "Green" }
|
||||
ListElement { text: "Albedo"; color: "Yellow" }
|
||||
ListElement { text: "Normal"; color: "White" }
|
||||
ListElement { text: "Roughness"; color: "White" }
|
||||
ListElement { text: "Metallic"; color: "White" }
|
||||
ListElement { text: "Emissive"; color: "White" }
|
||||
ListElement { text: "Unlit"; color: "White" }
|
||||
ListElement { text: "Occlusion"; color: "White" }
|
||||
ListElement { text: "Lightmap"; color: "White" }
|
||||
ListElement { text: "Scattering"; color: "White" }
|
||||
ListElement { text: "Lighting"; color: "White" }
|
||||
ListElement { text: "Shadow Cascade 0"; color: "White" }
|
||||
ListElement { text: "Shadow Cascade 1"; color: "White" }
|
||||
ListElement { text: "Shadow Cascade 2"; color: "White" }
|
||||
ListElement { text: "Shadow Cascade 3"; color: "White" }
|
||||
ListElement { text: "Shadow Cascade Indices"; color: "White" }
|
||||
ListElement { text: "Linear Depth"; color: "White" }
|
||||
ListElement { text: "Half Linear Depth"; color: "White" }
|
||||
ListElement { text: "Half Normal"; color: "White" }
|
||||
ListElement { text: "Mid Curvature"; color: "White" }
|
||||
ListElement { text: "Mid Normal"; color: "White" }
|
||||
ListElement { text: "Low Curvature"; color: "White" }
|
||||
ListElement { text: "Low Normal"; color: "White" }
|
||||
ListElement { text: "Curvature Occlusion"; color: "White" }
|
||||
ListElement { text: "Debug Scattering"; color: "White" }
|
||||
ListElement { text: "Ambient Occlusion"; color: "White" }
|
||||
ListElement { text: "Ambient Occlusion Blurred"; color: "White" }
|
||||
ListElement { text: "Ambient Occlusion Normal"; color: "White" }
|
||||
ListElement { text: "Velocity"; color: "White" }
|
||||
ListElement { text: "Custom"; color: "White" }
|
||||
}
|
||||
width: 200
|
||||
onCurrentIndexChanged: { framebuffer.setDebugMode(currentIndex) }
|
||||
}
|
||||
}
|
||||
|
||||
Separator {}
|
||||
Row {
|
||||
spacing: 5
|
||||
Column {
|
||||
spacing: 5
|
||||
BoundingBoxes {
|
||||
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Opaques"
|
||||
checked: render.mainViewTask.getConfig("DrawOpaqueBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawOpaqueBounds")["enabled"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Transparents"
|
||||
checked: render.mainViewTask.getConfig("DrawTransparentBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawTransparentBounds")["enabled"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Opaques in Front"
|
||||
checked: render.mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Transparents in Front"
|
||||
checked: render.mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Opaques in HUD"
|
||||
checked: render.mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"] = checked }
|
||||
}
|
||||
|
||||
}
|
||||
Column {
|
||||
spacing: 5
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Metas"
|
||||
checked: render.mainViewTask.getConfig("DrawMetaBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawMetaBounds")["enabled"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Lights"
|
||||
checked: render.mainViewTask.getConfig("DrawLightBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawLightBounds")["enabled"] = checked; }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Zones"
|
||||
checked: render.mainViewTask.getConfig("DrawZones")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("ZoneRenderer")["enabled"] = checked; render.mainViewTask.getConfig("DrawZones")["enabled"] = checked; }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Transparents in HUD"
|
||||
checked: render.mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"]
|
||||
onCheckedChanged: { render.mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
Row {
|
||||
|
|
|
@ -10,10 +10,13 @@
|
|||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
|
||||
|
||||
(function() {
|
||||
var AppUi = Script.require('appUi');
|
||||
|
||||
var MaterialInspector = Script.require('./materialInspector.js');
|
||||
var Page = Script.require('./luci/Page.js');
|
||||
|
||||
var moveDebugCursor = false;
|
||||
var onMousePressEvent = function (e) {
|
||||
|
@ -43,83 +46,12 @@
|
|||
Render.getConfig("RenderMainView").getConfig("DebugDeferredBuffer").size = { x: nx, y: ny, z: 1.0, w: 1.0 };
|
||||
}
|
||||
|
||||
function Page(title, qmlurl, width, height, handleWindowFunc) {
|
||||
this.title = title;
|
||||
this.qml = qmlurl;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.handleWindowFunc = handleWindowFunc;
|
||||
|
||||
this.window;
|
||||
|
||||
print("Page: New Page:" + JSON.stringify(this));
|
||||
}
|
||||
|
||||
Page.prototype.killView = function () {
|
||||
print("Page: Kill window for page:" + JSON.stringify(this));
|
||||
if (this.window) {
|
||||
print("Page: Kill window for page:" + this.title);
|
||||
//this.window.closed.disconnect(function () {
|
||||
// this.killView();
|
||||
//});
|
||||
this.window.close();
|
||||
this.window = false;
|
||||
}
|
||||
};
|
||||
|
||||
Page.prototype.createView = function () {
|
||||
var that = this;
|
||||
if (!this.window) {
|
||||
print("Page: New window for page:" + this.title);
|
||||
this.window = Desktop.createWindow(Script.resolvePath(this.qml), {
|
||||
title: this.title,
|
||||
presentationMode: Desktop.PresentationMode.NATIVE,
|
||||
size: {x: this.width, y: this.height}
|
||||
});
|
||||
this.handleWindowFunc(this.window);
|
||||
this.window.closed.connect(function () {
|
||||
that.killView();
|
||||
this.handleWindowFunc(undefined);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
var Pages = function () {
|
||||
this._pages = {};
|
||||
};
|
||||
|
||||
Pages.prototype.addPage = function (command, title, qmlurl, width, height, handleWindowFunc) {
|
||||
if (handleWindowFunc === undefined) {
|
||||
// Workaround for bad linter
|
||||
handleWindowFunc = function(window){};
|
||||
}
|
||||
this._pages[command] = new Page(title, qmlurl, width, height, handleWindowFunc);
|
||||
};
|
||||
|
||||
Pages.prototype.open = function (command) {
|
||||
print("Pages: command = " + command);
|
||||
if (!this._pages[command]) {
|
||||
print("Pages: unknown command = " + command);
|
||||
return;
|
||||
}
|
||||
this._pages[command].createView();
|
||||
};
|
||||
|
||||
Pages.prototype.clear = function () {
|
||||
for (var p in this._pages) {
|
||||
print("Pages: kill page: " + p);
|
||||
this._pages[p].killView();
|
||||
delete this._pages[p];
|
||||
}
|
||||
this._pages = {};
|
||||
};
|
||||
var pages = new Pages();
|
||||
|
||||
pages.addPage('openEngineView', 'Render Engine', 'engineInspector.qml', 300, 400);
|
||||
pages.addPage('openEngineLODView', 'Render LOD', 'lod.qml', 300, 400);
|
||||
pages.addPage('openCullInspectorView', 'Cull Inspector', 'culling.qml', 300, 400);
|
||||
pages.addPage('openMaterialInspectorView', 'Material Inspector', 'materialInspector.qml', 300, 400, MaterialInspector.setWindow);
|
||||
pages.addPage('openEngineLODView', 'Render LOD', '../lod.qml', 300, 400);
|
||||
pages.addPage('openCullInspectorView', 'Cull Inspector', '../luci/Culling.qml', 300, 400);
|
||||
pages.addPage('openMaterialInspectorView', 'Material Inspector', '../materialInspector.qml', 300, 400, MaterialInspector.setWindow);
|
||||
|
||||
function fromQml(message) {
|
||||
if (pages.open(message.method)) {
|
||||
|
@ -132,7 +64,7 @@
|
|||
ui = new AppUi({
|
||||
buttonName: "LUCI",
|
||||
home: Script.resolvePath("deferredLighting.qml"),
|
||||
additionalAppScreens: Script.resolvePath("engineInspector.qml"),
|
||||
additionalAppScreens : Script.resolvePath("engineInspector.qml"),
|
||||
onMessage: fromQml,
|
||||
normalButton: Script.resolvePath("../../../system/assets/images/luci-i.svg"),
|
||||
activeButton: Script.resolvePath("../../../system/assets/images/luci-a.svg")
|
||||
|
@ -144,8 +76,5 @@
|
|||
Controller.mouseReleaseEvent.disconnect(onMouseReleaseEvent);
|
||||
Controller.mouseMoveEvent.disconnect(onMouseMoveEvent);
|
||||
pages.clear();
|
||||
// killEngineInspectorView();
|
||||
// killCullInspectorView();
|
||||
// killEngineLODWindow();
|
||||
});
|
||||
}());
|
||||
|
|
100
scripts/developer/utilities/render/luci.qml
Normal file
100
scripts/developer/utilities/render/luci.qml
Normal file
|
@ -0,0 +1,100 @@
|
|||
//
|
||||
// luci.qml
|
||||
//
|
||||
// Created by Sam Gateau on 3/2/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 2.2
|
||||
import QtQuick.Layouts 1.3
|
||||
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
import "../lib/prop" as Prop
|
||||
import "../lib/jet/qml" as Jet
|
||||
import "luci"
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
id: render;
|
||||
property var mainViewTask: Render.getConfig("RenderMainView")
|
||||
|
||||
Prop.Global { id: global;}
|
||||
color: global.color
|
||||
|
||||
ScrollView {
|
||||
id: control
|
||||
anchors.fill: parent
|
||||
clip: true
|
||||
|
||||
Column {
|
||||
width: render.width
|
||||
Prop.PropFolderPanel {
|
||||
label: "Shading Model"
|
||||
panelFrameData: Component {
|
||||
ShadingModel {}
|
||||
}
|
||||
}
|
||||
Prop.PropFolderPanel {
|
||||
label: "Bounding Boxes"
|
||||
panelFrameData: Component {
|
||||
BoundingBoxes {}
|
||||
}
|
||||
}
|
||||
Prop.PropFolderPanel {
|
||||
label: "Framebuffer"
|
||||
panelFrameData: Component {
|
||||
Framebuffer {}
|
||||
}
|
||||
}
|
||||
Prop.PropFolderPanel {
|
||||
label: "Tone Mapping"
|
||||
panelFrameData: Component {
|
||||
ToneMapping {}
|
||||
}
|
||||
}
|
||||
Prop.PropFolderPanel {
|
||||
label: "Antialiasing"
|
||||
panelFrameData: Component {
|
||||
Antialiasing {}
|
||||
}
|
||||
}
|
||||
Prop.PropFolderPanel {
|
||||
label: "Culling"
|
||||
panelFrameData: Component {
|
||||
Culling {}
|
||||
}
|
||||
}
|
||||
Prop.PropFolderPanel {
|
||||
label: "Tools"
|
||||
panelFrameData: Component {
|
||||
Row {
|
||||
HifiControls.Button {
|
||||
text: "LOD"
|
||||
onClicked: {
|
||||
sendToScript({method: "openEngineLODView"});
|
||||
}
|
||||
}
|
||||
HifiControls.Button {
|
||||
text: "Material"
|
||||
onClicked: {
|
||||
sendToScript({method: "openMaterialInspectorView"});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Jet.TaskPropView {
|
||||
id: "le"
|
||||
jobPath: ""
|
||||
label: "Le Render Engine"
|
||||
|
||||
// anchors.left: parent.left
|
||||
// anchors.right: parent.right
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
176
scripts/developer/utilities/render/luci/Antialiasing.qml
Normal file
176
scripts/developer/utilities/render/luci/Antialiasing.qml
Normal file
|
@ -0,0 +1,176 @@
|
|||
//
|
||||
// Antialiasing.qml
|
||||
//
|
||||
// Created by Sam Gateau on 8/14/2017
|
||||
// Copyright 2016 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
import QtQuick.Controls 1.4
|
||||
import QtQuick.Layouts 1.3
|
||||
|
||||
import stylesUit 1.0
|
||||
import controlsUit 1.0 as HifiControls
|
||||
|
||||
import "../configSlider"
|
||||
import "../../lib/plotperf"
|
||||
|
||||
|
||||
Column{
|
||||
HifiConstants { id: hifi; }
|
||||
|
||||
id: antialiasing
|
||||
padding: 10
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
spacing: 10
|
||||
|
||||
Row {
|
||||
spacing: 10
|
||||
id: fxaaOnOff
|
||||
property bool debugFXAA: false
|
||||
HifiControls.Button {
|
||||
function getTheText() {
|
||||
if (Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff) {
|
||||
return "FXAA"
|
||||
} else {
|
||||
return "TAA"
|
||||
}
|
||||
}
|
||||
text: getTheText()
|
||||
onClicked: {
|
||||
var onOff = !Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff;
|
||||
if (onOff) {
|
||||
Render.getConfig("RenderMainView.JitterCam").none();
|
||||
Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff = true;
|
||||
} else {
|
||||
Render.getConfig("RenderMainView.JitterCam").play();
|
||||
Render.getConfig("RenderMainView.Antialiasing").fxaaOnOff = false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
Row {
|
||||
spacing: 10
|
||||
|
||||
HifiControls.Button {
|
||||
text: {
|
||||
var state = 2 - (Render.getConfig("RenderMainView.JitterCam").freeze * 1 - Render.getConfig("RenderMainView.JitterCam").stop * 2);
|
||||
if (state === 2) {
|
||||
return "Jitter"
|
||||
} else if (state === 1) {
|
||||
return "Paused at " + Render.getConfig("RenderMainView.JitterCam").index + ""
|
||||
} else {
|
||||
return "No Jitter"
|
||||
}
|
||||
}
|
||||
onClicked: { Render.getConfig("RenderMainView.JitterCam").cycleStopPauseRun(); }
|
||||
}
|
||||
HifiControls.Button {
|
||||
text: "<"
|
||||
onClicked: { Render.getConfig("RenderMainView.JitterCam").prev(); }
|
||||
}
|
||||
HifiControls.Button {
|
||||
text: ">"
|
||||
onClicked: { Render.getConfig("RenderMainView.JitterCam").next(); }
|
||||
}
|
||||
}
|
||||
Separator {}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Constrain color"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["constrainColor"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["constrainColor"] = checked }
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Covariance gamma")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "covarianceGamma"
|
||||
max: 1.5
|
||||
min: 0.5
|
||||
height: 38
|
||||
}
|
||||
Separator {}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Feedback history color"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["feedbackColor"] = checked }
|
||||
}
|
||||
|
||||
ConfigSlider {
|
||||
label: qsTr("Source blend")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "blend"
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
height: 38
|
||||
}
|
||||
|
||||
ConfigSlider {
|
||||
label: qsTr("Post sharpen")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "sharpen"
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
}
|
||||
Separator {}
|
||||
Row {
|
||||
|
||||
spacing: 10
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Debug"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["debug"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["debug"] = checked }
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Show Debug Cursor"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showCursorPixel"] = checked }
|
||||
}
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Debug Region <")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "debugX"
|
||||
max: 1.0
|
||||
min: 0.0
|
||||
}
|
||||
HifiControls.CheckBox {
|
||||
boxSize: 20
|
||||
text: "Closest Fragment"
|
||||
checked: Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"]
|
||||
onCheckedChanged: { Render.getConfig("RenderMainView.Antialiasing")["showClosestFragment"] = checked }
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Debug Velocity Threshold [pix]")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "debugShowVelocityThreshold"
|
||||
max: 50
|
||||
min: 0.0
|
||||
height: 38
|
||||
}
|
||||
ConfigSlider {
|
||||
label: qsTr("Debug Orb Zoom")
|
||||
integral: false
|
||||
config: Render.getConfig("RenderMainView.Antialiasing")
|
||||
property: "debugOrbZoom"
|
||||
max: 32.0
|
||||
min: 1.0
|
||||
height: 38
|
||||
}
|
||||
}
|
||||
|
84
scripts/developer/utilities/render/luci/BoundingBoxes.qml
Normal file
84
scripts/developer/utilities/render/luci/BoundingBoxes.qml
Normal file
|
@ -0,0 +1,84 @@
|
|||
//
|
||||
// BoundingBoxes.qml
|
||||
//
|
||||
// Created by Sam Gateau on 4/18/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
import "../../lib/prop" as Prop
|
||||
|
||||
Column {
|
||||
|
||||
id: root;
|
||||
|
||||
property var mainViewTask: Render.getConfig("RenderMainView")
|
||||
|
||||
spacing: 5
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.margins: hifi.dimensions.contentMargin.x
|
||||
|
||||
Row {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
spacing: 5
|
||||
Column {
|
||||
spacing: 5
|
||||
|
||||
Prop.PropCheckBox {
|
||||
text: "Opaques"
|
||||
checked: root.mainViewTask.getConfig("DrawOpaqueBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawOpaqueBounds")["enabled"] = checked }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Transparents"
|
||||
checked: root.mainViewTask.getConfig("DrawTransparentBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawTransparentBounds")["enabled"] = checked }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Metas"
|
||||
checked: root.mainViewTask.getConfig("DrawMetaBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawMetaBounds")["enabled"] = checked }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Lights"
|
||||
checked: root.mainViewTask.getConfig("DrawLightBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawLightBounds")["enabled"] = checked; }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Zones"
|
||||
checked: root.mainViewTask.getConfig("DrawZones")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("ZoneRenderer")["enabled"] = checked; root.mainViewTask.getConfig("DrawZones")["enabled"] = checked; }
|
||||
}
|
||||
}
|
||||
Column {
|
||||
spacing: 5
|
||||
Prop.PropCheckBox {
|
||||
text: "Opaques in Front"
|
||||
checked: root.mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawOverlayInFrontOpaqueBounds")["enabled"] = checked }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Transparents in Front"
|
||||
checked: root.mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawOverlayInFrontTransparentBounds")["enabled"] = checked }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Opaques in HUD"
|
||||
checked: root.mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawOverlayHUDOpaqueBounds")["enabled"] = checked }
|
||||
}
|
||||
Prop.PropCheckBox {
|
||||
text: "Transparents in HUD"
|
||||
checked: root.mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"]
|
||||
onCheckedChanged: { root.mainViewTask.getConfig("DrawOverlayHUDTransparentBounds")["enabled"] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,11 +9,16 @@
|
|||
//
|
||||
import QtQuick 2.5
|
||||
import QtQuick.Controls 1.4
|
||||
import "configSlider"
|
||||
|
||||
import "../../lib/prop" as Prop
|
||||
|
||||
Column {
|
||||
id: root
|
||||
spacing: 8
|
||||
|
||||
anchors.left: parent.left;
|
||||
anchors.right: parent.right;
|
||||
|
||||
property var sceneOctree: Render.getConfig("RenderMainView.DrawSceneOctree");
|
||||
property var itemSelection: Render.getConfig("RenderMainView.DrawItemSelection");
|
||||
|
||||
|
@ -36,6 +41,10 @@ Column {
|
|||
|
||||
GroupBox {
|
||||
title: "Culling"
|
||||
|
||||
anchors.left: parent.left;
|
||||
anchors.right: parent.right;
|
||||
|
||||
Row {
|
||||
spacing: 8
|
||||
Column {
|
||||
|
@ -91,6 +100,7 @@ Column {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
GroupBox {
|
||||
|
@ -103,13 +113,14 @@ Column {
|
|||
anchors.right: parent.right;
|
||||
Repeater {
|
||||
model: [ "Opaque:RenderMainView.DrawOpaqueDeferred", "Transparent:RenderMainView.DrawTransparentDeferred", "Light:RenderMainView.DrawLight",
|
||||
"Opaque Overlays:RenderMainView.DrawOverlay3DOpaque", "Transparent Overlays:RenderMainView.DrawOverlay3DTransparent" ]
|
||||
ConfigSlider {
|
||||
"Opaque InFront:RenderMainView.DrawInFrontOpaque", "Transparent InFront:RenderMainView.DrawInFrontTransparent",
|
||||
"Opaque HUD:RenderMainView.DrawHUDOpaque", "Transparent HUD:RenderMainView.DrawHUDTransparent" ]
|
||||
Prop.PropScalar {
|
||||
label: qsTr(modelData.split(":")[0])
|
||||
integral: true
|
||||
config: Render.getConfig(modelData.split(":")[1])
|
||||
object: Render.getConfig(modelData.split(":")[1])
|
||||
property: "maxDrawn"
|
||||
max: config.numDrawn
|
||||
max: object.numDrawn
|
||||
min: -1
|
||||
}
|
||||
}
|
69
scripts/developer/utilities/render/luci/Framebuffer.qml
Normal file
69
scripts/developer/utilities/render/luci/Framebuffer.qml
Normal file
|
@ -0,0 +1,69 @@
|
|||
//
|
||||
// Framebuffer.qml
|
||||
//
|
||||
// Created by Sam Gateau on 4/18/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
import "../../lib/prop" as Prop
|
||||
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
id: framebuffer
|
||||
|
||||
property var config: Render.getConfig("RenderMainView.DebugDeferredBuffer")
|
||||
|
||||
function setDebugMode(mode) {
|
||||
framebuffer.config.enabled = (mode != 0);
|
||||
framebuffer.config.mode = mode;
|
||||
}
|
||||
|
||||
Prop.PropEnum {
|
||||
label: "Debug Buffer"
|
||||
object: config
|
||||
property: "mode"
|
||||
valueVar: 0
|
||||
enums: [
|
||||
"Off",
|
||||
"Depth",
|
||||
"Albedo",
|
||||
"Normal",
|
||||
"Roughness",
|
||||
"Metallic",
|
||||
"Emissive",
|
||||
"Unlit",
|
||||
"Occlusion",
|
||||
"Lightmap",
|
||||
"Scattering",
|
||||
"Lighting",
|
||||
"Shadow Cascade 0",
|
||||
"Shadow Cascade 1",
|
||||
"Shadow Cascade 2",
|
||||
"Shadow Cascade 3",
|
||||
"Shadow Cascade Indices",
|
||||
"Linear Depth",
|
||||
"Half Linear Depth",
|
||||
"Half Normal",
|
||||
"Mid Curvature",
|
||||
"Mid Normal",
|
||||
"Low Curvature",
|
||||
"Low Normal",
|
||||
"Curvature Occlusion",
|
||||
"Debug Scattering",
|
||||
"Ambient Occlusion",
|
||||
"Ambient Occlusion Blurred",
|
||||
"Ambient Occlusion Normal",
|
||||
"Velocity",
|
||||
"Custom",
|
||||
]
|
||||
|
||||
valueVarSetter: function (mode) { framebuffer.setDebugMode(mode) }
|
||||
}
|
||||
}
|
90
scripts/developer/utilities/render/luci/Page.js
Normal file
90
scripts/developer/utilities/render/luci/Page.js
Normal file
|
@ -0,0 +1,90 @@
|
|||
//
|
||||
// Page.js
|
||||
//
|
||||
// Sam Gateau, created on 4/19/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
"use strict";
|
||||
|
||||
(function() {
|
||||
function Page(title, qmlurl, width, height, onViewCreated, onViewClosed) {
|
||||
this.title = title;
|
||||
this.qml = qmlurl;
|
||||
this.width = width;
|
||||
this.height = height;
|
||||
this.onViewCreated = onViewCreated;
|
||||
this.onViewClosed = onViewClosed;
|
||||
|
||||
this.window;
|
||||
|
||||
print("Page: New Page:" + JSON.stringify(this));
|
||||
}
|
||||
|
||||
Page.prototype.killView = function () {
|
||||
print("Page: Kill window for page:" + JSON.stringify(this));
|
||||
if (this.window) {
|
||||
print("Page: Kill window for page:" + this.title);
|
||||
//this.window.closed.disconnect(function () {
|
||||
// this.killView();
|
||||
//});
|
||||
this.window.close();
|
||||
this.window = false;
|
||||
}
|
||||
};
|
||||
|
||||
Page.prototype.createView = function () {
|
||||
var that = this;
|
||||
if (!this.window) {
|
||||
print("Page: New window for page:" + this.title);
|
||||
this.window = Desktop.createWindow(Script.resolvePath(this.qml), {
|
||||
title: this.title,
|
||||
presentationMode: Desktop.PresentationMode.NATIVE,
|
||||
size: {x: this.width, y: this.height}
|
||||
});
|
||||
this.onViewCreated(this.window);
|
||||
this.window.closed.connect(function () {
|
||||
that.killView();
|
||||
that.onViewClosed();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Pages = function () {
|
||||
this._pages = {};
|
||||
};
|
||||
|
||||
Pages.prototype.addPage = function (command, title, qmlurl, width, height, onViewCreated, onViewClosed) {
|
||||
if (onViewCreated === undefined) {
|
||||
// Workaround for bad linter
|
||||
onViewCreated = function(window) {};
|
||||
}
|
||||
if (onViewClosed === undefined) {
|
||||
// Workaround for bad linter
|
||||
onViewClosed = function() {};
|
||||
}
|
||||
this._pages[command] = new Page(title, qmlurl, width, height, onViewCreated, onViewClosed);
|
||||
};
|
||||
|
||||
Pages.prototype.open = function (command) {
|
||||
print("Pages: command = " + command);
|
||||
if (!this._pages[command]) {
|
||||
print("Pages: unknown command = " + command);
|
||||
return;
|
||||
}
|
||||
this._pages[command].createView();
|
||||
};
|
||||
|
||||
Pages.prototype.clear = function () {
|
||||
for (var p in this._pages) {
|
||||
print("Pages: kill page: " + p);
|
||||
this._pages[p].killView();
|
||||
delete this._pages[p];
|
||||
}
|
||||
this._pages = {};
|
||||
};
|
||||
|
||||
}());
|
92
scripts/developer/utilities/render/luci/ShadingModel.qml
Normal file
92
scripts/developer/utilities/render/luci/ShadingModel.qml
Normal file
|
@ -0,0 +1,92 @@
|
|||
//
|
||||
// ShadingModel.qml
|
||||
//
|
||||
// Created by Sam Gateau on 4/17/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
import "../../lib/prop" as Prop
|
||||
|
||||
Column {
|
||||
|
||||
id: shadingModel;
|
||||
|
||||
property var mainViewTask: Render.getConfig("RenderMainView")
|
||||
|
||||
spacing: 5
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
anchors.margins: hifi.dimensions.contentMargin.x
|
||||
Row {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
|
||||
spacing: 5
|
||||
Column {
|
||||
spacing: 5
|
||||
Repeater {
|
||||
model: [
|
||||
"Unlit:LightingModel:enableUnlit",
|
||||
"Emissive:LightingModel:enableEmissive",
|
||||
"Lightmap:LightingModel:enableLightmap",
|
||||
"Background:LightingModel:enableBackground",
|
||||
"Haze:LightingModel:enableHaze",
|
||||
"AO:LightingModel:enableAmbientOcclusion",
|
||||
"Textures:LightingModel:enableMaterialTexturing"
|
||||
]
|
||||
Prop.PropCheckBox {
|
||||
text: modelData.split(":")[0]
|
||||
checked: shadingModel.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
|
||||
onCheckedChanged: { shadingModel.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Column {
|
||||
spacing: 5
|
||||
Repeater {
|
||||
model: [
|
||||
"Obscurance:LightingModel:enableObscurance",
|
||||
"Scattering:LightingModel:enableScattering",
|
||||
"Diffuse:LightingModel:enableDiffuse",
|
||||
"Specular:LightingModel:enableSpecular",
|
||||
"Albedo:LightingModel:enableAlbedo",
|
||||
"Wireframe:LightingModel:enableWireframe",
|
||||
"Skinning:LightingModel:enableSkinning",
|
||||
"Blendshape:LightingModel:enableBlendshape"
|
||||
]
|
||||
Prop.PropCheckBox {
|
||||
text: modelData.split(":")[0]
|
||||
checked: shadingModel.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
|
||||
onCheckedChanged: { shadingModel.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Column {
|
||||
spacing: 5
|
||||
Repeater {
|
||||
model: [
|
||||
"Ambient:LightingModel:enableAmbientLight",
|
||||
"Directional:LightingModel:enableDirectionalLight",
|
||||
"Point:LightingModel:enablePointLight",
|
||||
"Spot:LightingModel:enableSpotLight",
|
||||
"Light Contour:LightingModel:showLightContour",
|
||||
"Zone Stack:DrawZoneStack:enabled",
|
||||
"Shadow:LightingModel:enableShadow"
|
||||
]
|
||||
Prop.PropCheckBox {
|
||||
text: modelData.split(":")[0]
|
||||
checked: shadingModel.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]]
|
||||
onCheckedChanged: { shadingModel.mainViewTask.getConfig(modelData.split(":")[1])[modelData.split(":")[2]] = checked }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
40
scripts/developer/utilities/render/luci/ToneMapping.qml
Normal file
40
scripts/developer/utilities/render/luci/ToneMapping.qml
Normal file
|
@ -0,0 +1,40 @@
|
|||
//
|
||||
// ToneMapping.qml
|
||||
//
|
||||
// Created by Sam Gateau on 4/17/2019
|
||||
// Copyright 2019 High Fidelity, Inc.
|
||||
//
|
||||
// Distributed under the Apache License, Version 2.0.
|
||||
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
//
|
||||
|
||||
import QtQuick 2.7
|
||||
|
||||
import "../../lib/prop" as Prop
|
||||
|
||||
Column {
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
Prop.PropScalar {
|
||||
label: "Exposure"
|
||||
object: Render.getConfig("RenderMainView.ToneMapping")
|
||||
property: "exposure"
|
||||
min: -4
|
||||
max: 4
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
}
|
||||
Prop.PropEnum {
|
||||
label: "Tone Curve"
|
||||
object: Render.getConfig("RenderMainView.ToneMapping")
|
||||
property: "curve"
|
||||
enums: [
|
||||
"RGB",
|
||||
"SRGB",
|
||||
"Reinhard",
|
||||
"Filmic",
|
||||
]
|
||||
anchors.left: parent.left
|
||||
anchors.right: parent.right
|
||||
}
|
||||
}
|
7
scripts/developer/utilities/render/luci/qmldir
Normal file
7
scripts/developer/utilities/render/luci/qmldir
Normal file
|
@ -0,0 +1,7 @@
|
|||
|
||||
ShadingModel 1.0 ShadingModel.qml
|
||||
ToneMapping 1.0 ToneMapping.qml
|
||||
BoundingBoxes 1.0 BoundingBoxes.qml
|
||||
Framebuffer 1.0 Framebuffer.qml
|
||||
Antialiasing 1.0 Antialiasing.qml
|
||||
Culling 1.0 Culling.qml
|
83
scripts/developer/utilities/render/luci2.js
Normal file
83
scripts/developer/utilities/render/luci2.js
Normal file
|
@ -0,0 +1,83 @@
|
|||
|
||||
|
||||
var MaterialInspector = Script.require('./materialInspector.js');
|
||||
var Page = Script.require('./luci/Page.js');
|
||||
|
||||
|
||||
function openView() {
|
||||
//window.closed.connect(function() { Script.stop(); });
|
||||
|
||||
|
||||
var pages = new Pages();
|
||||
function fromQml(message) {
|
||||
if (pages.open(message.method)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var luciWindow
|
||||
function openLuciWindow(window) {
|
||||
if (luciWindow !== undefined) {
|
||||
activeWindow.fromQml.disconnect(fromQml);
|
||||
}
|
||||
if (window !== undefined) {
|
||||
window.fromQml.connect(fromQml);
|
||||
}
|
||||
luciWindow = window;
|
||||
|
||||
|
||||
var moveDebugCursor = false;
|
||||
var onMousePressEvent = function (e) {
|
||||
if (e.isMiddleButton) {
|
||||
moveDebugCursor = true;
|
||||
setDebugCursor(e.x, e.y);
|
||||
}
|
||||
};
|
||||
Controller.mousePressEvent.connect(onMousePressEvent);
|
||||
|
||||
var onMouseReleaseEvent = function () {
|
||||
moveDebugCursor = false;
|
||||
};
|
||||
Controller.mouseReleaseEvent.connect(onMouseReleaseEvent);
|
||||
|
||||
var onMouseMoveEvent = function (e) {
|
||||
if (moveDebugCursor) {
|
||||
setDebugCursor(e.x, e.y);
|
||||
}
|
||||
};
|
||||
Controller.mouseMoveEvent.connect(onMouseMoveEvent);
|
||||
|
||||
function setDebugCursor(x, y) {
|
||||
var nx = 2.0 * (x / Window.innerWidth) - 1.0;
|
||||
var ny = 1.0 - 2.0 * ((y) / (Window.innerHeight));
|
||||
|
||||
Render.getConfig("RenderMainView").getConfig("DebugDeferredBuffer").size = { x: nx, y: ny, z: 1.0, w: 1.0 };
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function closeLuciWindow() {
|
||||
if (luciWindow !== undefined) {
|
||||
activeWindow.fromQml.disconnect(fromQml);
|
||||
}
|
||||
luciWindow = {};
|
||||
|
||||
Controller.mousePressEvent.disconnect(onMousePressEvent);
|
||||
Controller.mouseReleaseEvent.disconnect(onMouseReleaseEvent);
|
||||
Controller.mouseMoveEvent.disconnect(onMouseMoveEvent);
|
||||
pages.clear();
|
||||
}
|
||||
|
||||
pages.addPage('Luci', 'Luci', '../luci.qml', 300, 420, openLuciWindow, closeLuciWindow);
|
||||
pages.addPage('openEngineLODView', 'Render LOD', '../lod.qml', 300, 400);
|
||||
pages.addPage('openMaterialInspectorView', 'Material Inspector', '../materialInspector.qml', 300, 400, MaterialInspector.setWindow, MaterialInspector.setWindow);
|
||||
|
||||
pages.open('Luci');
|
||||
|
||||
|
||||
return pages;
|
||||
}
|
||||
|
||||
|
||||
openView();
|
||||
|
|
@ -109,7 +109,9 @@ function mouseReleaseEvent(event) {
|
|||
}
|
||||
|
||||
function killWindow() {
|
||||
setWindow(undefined);
|
||||
activeWindow = undefined;
|
||||
|
||||
// setWindow(undefined);
|
||||
}
|
||||
|
||||
function toQml(message) {
|
||||
|
@ -138,14 +140,14 @@ function setSelectedObject(id, type) {
|
|||
function setWindow(window) {
|
||||
if (activeWindow !== undefined) {
|
||||
setSelectedObject(Uuid.NULL, "");
|
||||
activeWindow.closed.disconnect(killWindow);
|
||||
// activeWindow.closed.disconnect(killWindow);
|
||||
activeWindow.fromQml.disconnect(fromQml);
|
||||
Controller.mousePressEvent.disconnect(mousePressEvent);
|
||||
Controller.mouseReleaseEvent.disconnect(mouseReleaseEvent);
|
||||
activeWindow.close();
|
||||
}
|
||||
if (window !== undefined) {
|
||||
window.closed.connect(killWindow);
|
||||
// window.closed.connect(killWindow);
|
||||
window.fromQml.connect(fromQml);
|
||||
Controller.mousePressEvent.connect(mousePressEvent);
|
||||
Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
|
||||
|
|
Loading…
Reference in a new issue