diff --git a/scripts/system/create/edit.js b/scripts/system/create/edit.js index 60a364d9cf..03372f1fab 100644 --- a/scripts/system/create/edit.js +++ b/scripts/system/create/edit.js @@ -4,6 +4,7 @@ // Persist toolbar by HRS 6/11/15. // Copyright 2014 High Fidelity, Inc. // Copyright 2020 Vircadia contributors. +// Copyright 2022 Overte e.V. // // This script allows you to edit entities with a new UI/UX for mouse and trackpad based editing // @@ -971,6 +972,8 @@ var toolBar = (function () { addButton("newMaterialButton", createNewEntityDialogButtonCallback("Material")); + addButton("newPolyVoxButton", createNewEntityDialogButtonCallback("PolyVox")); + var deactivateCreateIfDesktopWindowsHidden = function() { if (!shouldUseEditTabletApp() && !entityListTool.isVisible() && !createToolsWindow.isVisible()) { that.setActive(false); diff --git a/scripts/system/create/entityProperties/html/js/entityProperties.js b/scripts/system/create/entityProperties/html/js/entityProperties.js index 85c7b378da..feb35783ac 100644 --- a/scripts/system/create/entityProperties/html/js/entityProperties.js +++ b/scripts/system/create/entityProperties/html/js/entityProperties.js @@ -1326,6 +1326,48 @@ const GROUPS = [ } ] }, + { + id: "polyvox", + label: "POLYVOX", + properties: [ + { + label: "Volume Size", + type: "vec3", + vec3Type: "xyz", + step: 1.0, + decimals: 0, + subLabels: [ "x", "y", "z" ], + unit: "", + propertyID: "voxelVolumeSize", + }, + { + label: "Surface Style", + type: "dropdown", + options: { 0: "Marching cubes", 1: "Cubic", + 2: "Edged cubic", 3: "Edged marching cubes" }, + propertyID: "voxelSurfaceStyle", + propertyName: "voxelSurfaceStyle", + }, + { + label: "X Texture URL", + type: "string", + propertyID: "xTextureURL", + propertyName: "xTextureURL", + }, + { + label: "Y Texture URL", + type: "string", + propertyID: "yTextureURL", + propertyName: "yTextureURL", + }, + { + label: "Z Texture URL", + type: "string", + propertyID: "zTextureURL", + propertyName: "zTextureURL", + }, + ] + }, { id: "spatial", label: "SPATIAL", @@ -1705,7 +1747,7 @@ const GROUPS_PER_TYPE = { ParticleEffect: [ 'base', 'particles', 'particles_emit', 'particles_size', 'particles_color', 'particles_behavior', 'particles_constraints', 'spatial', 'behavior', 'scripts', 'physics' ], PolyLine: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], - PolyVox: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], + PolyVox: [ 'base', 'polyvox', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], Grid: [ 'base', 'grid', 'spatial', 'behavior', 'scripts', 'physics' ], Multiple: [ 'base', 'spatial', 'behavior', 'scripts', 'collision', 'physics' ], }; diff --git a/scripts/system/create/qml/EditTabView.qml b/scripts/system/create/qml/EditTabView.qml index 617cdd9e5a..b122370192 100644 --- a/scripts/system/create/qml/EditTabView.qml +++ b/scripts/system/create/qml/EditTabView.qml @@ -178,6 +178,18 @@ TabBar { editTabView.currentIndex = 2 } } + + NewEntityButton { + icon: "icons/voxels.svg" + text: "VOXELS" + onClicked: { + editRoot.sendToScript({ + method: "newEntityButtonClicked", + params: { buttonName: "newPolyVoxButton" } + }); + editTabView.currentIndex = 2 + } + } } HifiControls.Button { diff --git a/scripts/system/create/qml/EditToolsTabView.qml b/scripts/system/create/qml/EditToolsTabView.qml index 39074946bd..bd4d47ddea 100644 --- a/scripts/system/create/qml/EditToolsTabView.qml +++ b/scripts/system/create/qml/EditToolsTabView.qml @@ -184,6 +184,18 @@ TabBar { editTabView.currentIndex = tabIndex.properties } } + + NewEntityButton { + icon: "icons/voxels.svg" + text: "VOXELS" + onClicked: { + editRoot.sendToScript({ + method: "newEntityButtonClicked", + params: { buttonName: "newPolyVoxButton" } + }); + editTabView.currentIndex = tabIndex.properties + } + } } HifiControls.Button { diff --git a/scripts/system/create/qml/NewPolyVoxDialog.qml b/scripts/system/create/qml/NewPolyVoxDialog.qml new file mode 100644 index 0000000000..d22571438d --- /dev/null +++ b/scripts/system/create/qml/NewPolyVoxDialog.qml @@ -0,0 +1,487 @@ +// +// NewPolyVoxDialog.qml +// based on NewModelDialog.qml +// qml/hifi +// +// Copyright 2017 High Fidelity, Inc. +// Copyright 2020 Vircadia contributors +// Copyright 2022 Overte e.V. +// +// 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.5 +import QtQuick.Dialogs 1.2 as OriginalDialogs + +import stylesUit 1.0 +import controlsUit 1.0 +import hifi.dialogs 1.0 + +Rectangle { + id: newPolyVoxDialog + // width: parent.width + // height: parent.height + HifiConstants { id: hifi } + color: hifi.colors.baseGray; + signal sendToScript(var message); + property bool keyboardEnabled: false + property bool keyboardRaised: false + property bool punctuationMode: false + property bool keyboardRasied: false + + function errorMessageBox(message) { + try { + return desktop.messageBox({ + icon: hifi.icons.warning, + defaultButton: OriginalDialogs.StandardButton.Ok, + title: "Error", + text: message + }); + } catch(e) { + Window.alert(message); + } + } + + Item { + id: column1 + anchors.rightMargin: 10 + anchors.leftMargin: 10 + anchors.bottomMargin: 10 + anchors.topMargin: 0 + anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: keyboard.top + + Text { + id: text1 + text: qsTr("X Texture URL") + color: "#ffffff" + font.pixelSize: 12 + } + + TextInput { + id: xTextureURL + height: 20 + text: qsTr("") + color: "white" + anchors.top: text1.bottom + anchors.topMargin: 5 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.right: parent.right + anchors.rightMargin: 0 + font.pixelSize: 12 + + onAccepted: { + newPolyVoxDialog.keyboardEnabled = false; + } + + onTextChanged : { + if (xTextureURL.text.length === 0){ + button1.enabled = false; + } else { + button1.enabled = true; + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + newPolyVoxDialog.keyboardEnabled = HMD.active + parent.focus = true; + parent.forceActiveFocus(); + xTextureURL.cursorPosition = xTextureURL.positionAt(mouseX, mouseY, TextInput.CursorBetweenCharaters); + } + } + } + + Rectangle { + id: textInputBox1 + color: "white" + anchors.fill: xTextureURL + opacity: 0.1 + } + + Text { + id: text2 + text: qsTr("Y Texture URL") + color: "#ffffff" + font.pixelSize: 12 + anchors.top: textInputBox1.bottom + anchors.topMargin: 5 + } + + TextInput { + id: yTextureURL + height: 20 + text: qsTr("") + color: "white" + anchors.top: text2.bottom + anchors.topMargin: 5 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.right: parent.right + anchors.rightMargin: 0 + font.pixelSize: 12 + + onAccepted: { + newPolyVoxDialog.keyboardEnabled = false; + } + + onTextChanged : { + if (yTextureURL.text.length === 0){ + button1.enabled = false; + } else { + button1.enabled = true; + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + newPolyVoxDialog.keyboardEnabled = HMD.active + parent.focus = true; + parent.forceActiveFocus(); + yTextureURL.cursorPosition = yTextureURL.positionAt(mouseX, mouseY, TextInput.CursorBetweenCharaters); + } + } + } + + Rectangle { + id: textInputBox2 + color: "white" + anchors.fill: yTextureURL + opacity: 0.1 + } + + Text { + id: text3 + text: qsTr("Z Texture URL") + color: "#ffffff" + font.pixelSize: 12 + anchors.top: textInputBox2.bottom + anchors.topMargin: 5 + } + + TextInput { + id: zTextureURL + height: 20 + text: qsTr("") + color: "white" + anchors.top: text3.bottom + anchors.topMargin: 5 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.right: parent.right + anchors.rightMargin: 0 + font.pixelSize: 12 + + onAccepted: { + newPolyVoxDialog.keyboardEnabled = false; + } + + onTextChanged : { + if (zTextureURL.text.length === 0){ + button1.enabled = false; + } else { + button1.enabled = true; + } + } + + MouseArea { + anchors.fill: parent + onClicked: { + newPolyVoxDialog.keyboardEnabled = HMD.active + parent.focus = true; + parent.forceActiveFocus(); + zTextureURL.cursorPosition = zTextureURL.positionAt(mouseX, mouseY, TextInput.CursorBetweenCharaters); + } + } + } + + Rectangle { + id: textInputBox3 + color: "white" + anchors.fill: zTextureURL + opacity: 0.1 + } + + Text { + id: textVolumeSize + text: qsTr("Volume Size (number of voxels along the edge)") + color: "#ffffff" + font.pixelSize: 12 + anchors.top: zTextureURL.bottom + anchors.topMargin: 5 + } + + Row { + id: rowVolumeSize + height: 50 + spacing: 30 + anchors.top: textVolumeSize.bottom + anchors.topMargin: 5 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.right: parent.right + anchors.rightMargin: 0 + + Text { + id: textVolumeSizeX + text: qsTr("X") + color: "#ffffff" + font.pixelSize: 12 + } + + TextInput { + id: volumeSizeX + height: 20 + width: 50 + anchors.left: textVolumeSizeX.right + anchors.leftMargin: 3 + text: qsTr("") + color: "white" + font.pixelSize: 12 + + onAccepted: { + newPolyVoxDialog.keyboardEnabled = false; + } + + MouseArea { + anchors.fill: parent + onClicked: { + newPolyVoxDialog.keyboardEnabled = HMD.active + parent.focus = true; + parent.forceActiveFocus(); + volumeSizeX.cursorPosition = volumeSizeX.positionAt(mouseX, mouseY, TextInput.CursorBetweenCharaters); + } + } + } + + Rectangle { + id: textInputBoxVolumeSizeX + color: "white" + anchors.fill: volumeSizeX + opacity: 0.1 + } + + Text { + id: textVolumeSizeY + text: qsTr("Y") + color: "#ffffff" + font.pixelSize: 12 + anchors.left: volumeSizeX.right + anchors.leftMargin: 5 + } + + TextInput { + id: volumeSizeY + height: 20 + width: 50 + anchors.left: textVolumeSizeY.right + anchors.leftMargin: 3 + text: qsTr("") + color: "white" + font.pixelSize: 12 + + onAccepted: { + newPolyVoxDialog.keyboardEnabled = false; + } + + MouseArea { + anchors.fill: parent + onClicked: { + newPolyVoxDialog.keyboardEnabled = HMD.active + parent.focus = true; + parent.forceActiveFocus(); + volumeSizeY.cursorPosition = volumeSizeY.positionAt(mouseX, mouseY, TextInput.CursorBetweenCharaters); + } + } + } + + Rectangle { + id: textInputBoxVolumeSizeY + color: "white" + anchors.fill: volumeSizeY + opacity: 0.1 + } + Text { + id: textVolumeSizeZ + text: qsTr("X") + color: "#ffffff" + font.pixelSize: 12 + anchors.left: volumeSizeY.right + anchors.leftMargin: 5 + } + + TextInput { + id: volumeSizeZ + height: 20 + width: 50 + anchors.left: textVolumeSizeZ.right + anchors.leftMargin: 3 + text: qsTr("") + color: "white" + font.pixelSize: 12 + + onAccepted: { + newPolyVoxDialog.keyboardEnabled = false; + } + + MouseArea { + anchors.fill: parent + onClicked: { + newPolyVoxDialog.keyboardEnabled = HMD.active + parent.focus = true; + parent.forceActiveFocus(); + volumeSizeZ.cursorPosition = volumeSizeZ.positionAt(mouseX, mouseY, TextInput.CursorBetweenCharaters); + } + } + } + + Rectangle { + id: textInputBoxVolumeSizeZ + color: "white" + anchors.fill: volumeSizeZ + opacity: 0.1 + } + } + + Row { + id: row1 + height: 400 + spacing: 30 + anchors.top: rowVolumeSize.bottom + anchors.topMargin: 5 + anchors.left: parent.left + anchors.leftMargin: 0 + anchors.right: parent.right + anchors.rightMargin: 0 + + Column { + id: column2 + width: 200 + height: 600 + spacing: 10 + + + CheckBox { + id: grabbable + text: qsTr("Grabbable") + } + + CheckBox { + id: collisions + text: qsTr("Collisions") + } + + Row { + id: row2 + width: 200 + height: 400 + spacing: 20 + + } + } + + Column { + id: column3 + height: 400 + spacing: 10 + + Text { + id: text4 + text: qsTr("Voxel type") + color: "#ffffff" + font.pixelSize: 12 + } + + ComboBox { + id: surfaceStyle + + property var surfaceStyleArray: ["Marching Cubes", + "Cubic", + "Edged Cubic", + "Edged Marching Cubes"] + + width: 200 + z: 100 + transformOrigin: Item.Center + model: surfaceStyleArray + } + + Text { + id: textInitialShape + text: qsTr("Initial shape") + color: "#ffffff" + font.pixelSize: 12 + } + + ComboBox { + id: initialShape + + property var initialShapeArray: ["Sphere", + "Box", + "Plane"] + + width: 200 + z: 100 + transformOrigin: Item.Center + model: initialShapeArray + } + + Row { + id: row3 + width: 200 + height: 400 + spacing: 5 + + anchors.horizontalCenter: column3.horizontalCenter + anchors.horizontalCenterOffset: -surfaceStyleArray20 + + Button { + id: button1 + text: qsTr("Create") + z: -1 + enabled: false + onClicked: { + newPolyVoxDialog.sendToScript({ + method: "newPolyVoxDialogAdd", + params: { + url: xTextureURL.text, + dynamic: dynamic.checked, + collisionShapeIndex: surfaceStyle.currentIndex, + grabbable: grabbable.checked, + useOriginalPivot: useOriginalPivot.checked + } + }); + } + } + + Button { + id: button2 + z: -1 + text: qsTr("Cancel") + onClicked: { + newPolyVoxDialog.sendToScript({method: "newPolyVoxDialogCancel"}) + } + } + } + } + } + } + + Keyboard { + id: keyboard + raised: parent.keyboardEnabled && parent.keyboardRaised + numeric: parent.punctuationMode + anchors { + bottom: parent.bottom + bottomMargin: 40 + left: parent.left + right: parent.right + } + } +} diff --git a/scripts/system/create/qml/NewPolyVoxWindow.qml b/scripts/system/create/qml/NewPolyVoxWindow.qml new file mode 100644 index 0000000000..bd05922714 --- /dev/null +++ b/scripts/system/create/qml/NewPolyVoxWindow.qml @@ -0,0 +1,20 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.2 + +StackView { + id: stackView + anchors.fill: parent + anchors.leftMargin: 10 + anchors.rightMargin: 10 + anchors.topMargin: 40 + + signal sendToScript(var message); + + NewPolyVoxDialog { + id: dialog + anchors.fill: parent + Component.onCompleted:{ + dialog.sendToScript.connect(stackView.sendToScript); + } + } +} diff --git a/scripts/system/create/qml/icons/voxels.svg b/scripts/system/create/qml/icons/voxels.svg new file mode 100644 index 0000000000..a7520bd4f2 --- /dev/null +++ b/scripts/system/create/qml/icons/voxels.svg @@ -0,0 +1,50 @@ + + + + + + + + +