diff options
Diffstat (limited to 'util/qt3d')
61 files changed, 0 insertions, 4402 deletions
diff --git a/util/qt3d/assetviewer/assetviewer.desktop b/util/qt3d/assetviewer/assetviewer.desktop deleted file mode 100644 index 1d682515..00000000 --- a/util/qt3d/assetviewer/assetviewer.desktop +++ /dev/null @@ -1,7 +0,0 @@ -[Desktop Entry] -Type=Application -Name=3D Asset Viewer -Icon=/usr/share/icons/hicolor/80x80/apps/qtquick3d.png -Exec=/usr/bin/invoker --type=e -s /usr/bin/modeltweak -fullscreen -OnlyShowIn=X-MeeGo; -X-MeeGo-Logical-Id=qtn_comm_appname_assetviewer diff --git a/util/qt3d/assetviewer/assetviewer.pro b/util/qt3d/assetviewer/assetviewer.pro deleted file mode 100644 index ee4737d3..00000000 --- a/util/qt3d/assetviewer/assetviewer.pro +++ /dev/null @@ -1,25 +0,0 @@ -TEMPLATE = app -TARGET = assetviewer -CONFIG += qt warn_on - -INSTALL_DIRS = qml -CONFIG += qt3d_deploy_qml qt3dquick_deploy_pkg -include(../../../pkg.pri) -qtcAddDeployment() - -SOURCES += main.cpp \ - quickfile.cpp - -symbian { - qmlDeployment2.sources = qml\meshes\* - qmlDeployment2.path = qml\meshes - DEPLOYMENT += qmlDeployment2 -} - -OTHER_FILES += \ - assetviewer.rc - -RC_FILE = assetviewer.rc - -HEADERS += \ - quickfile.h diff --git a/util/qt3d/assetviewer/assetviewer.rc b/util/qt3d/assetviewer/assetviewer.rc deleted file mode 100644 index 1b6228c9..00000000 --- a/util/qt3d/assetviewer/assetviewer.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "qtquick3d.ico" diff --git a/util/qt3d/assetviewer/main.cpp b/util/qt3d/assetviewer/main.cpp deleted file mode 100644 index 954ed4c6..00000000 --- a/util/qt3d/assetviewer/main.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtGui/QApplication> -#include "qdeclarativeview3d.h" -#include <QGraphicsObject> -#include <QDebug> -#include <QtDeclarative> - -#include "../../../demos/quick3d/qmlres.h" -#include "quickfile.h" - -QString filename; - -int main(int argc, char *argv[]) -{ - qmlRegisterType<QuickFile>("AssetViewer", 1, 0, "QuickFile"); - - QApplication app(argc, argv); - QDeclarativeView3D view; - - QString qml = q_get_qmldir(QLatin1String("qml/AssetViewer.qml")); - view.setSource(QUrl::fromLocalFile(qml)); - view.setWindowTitle(QString("3D Asset Viewer")); - - //disable close button - // view.setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowMaximizeButtonHint | Qt::WindowMinimizeButtonHint); - - QString fn; - QStringList args = QApplication::arguments(); - for (int i = 0; i < args.size(); ++i) - { - //FIXME: QML likes files relative to QML directory above, or full paths. - // We need to sort out how this is implemented once we've worked how how it's going to - // be called via Qt Creator. - if (args.at(i).startsWith(QLatin1String("-model")) && (i+1 < args.size())) - { - fn = args.at(i+1); - qDebug() << fn; - QGraphicsObject *object = view.rootObject(); - object->setProperty("targetMesh", args.at(i+1)); - break; - } - } - - view.setResizeMode(QDeclarativeView::SizeRootObjectToView); - -#ifdef Q_OS_SYMBIAN - view.setAttribute(Qt::WA_LockLandscapeOrientation, true); - view.setResizeMode(QDeclarativeView::SizeRootObjectToView); - view.showFullScreen(); -#else - if (QApplication::arguments().contains(QLatin1String("-maximize"))) - view.showMaximized(); - else if (QApplication::arguments().contains(QLatin1String("-fullscreen"))) - view.showFullScreen(); - else - view.show(); -#endif - - return app.exec(); -} diff --git a/util/qt3d/assetviewer/qml/AssetViewer.qml b/util/qt3d/assetviewer/qml/AssetViewer.qml deleted file mode 100644 index af5b4b96..00000000 --- a/util/qt3d/assetviewer/qml/AssetViewer.qml +++ /dev/null @@ -1,292 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D examples of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: -** -** "Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions are -** met: -** * Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** * Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in -** the documentation and/or other materials provided with the -** distribution. -** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor -** the names of its contributors may be used to endorse or promote -** products derived from this software without specific prior written -** permission. -** -** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." -** $QT_END_LICENSE$ -** -****************************************************************************/ - -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 -import "fileHandling.js" as FileHandler -import "Widgets" -import "ColorUtils.js" as ColorUtils - -Rectangle { - id: outerWindow; - width: 1024 - height: 768 - property alias modelEffect: customEffect - property alias modelMaterial: customMaterial - property bool useCustomEffect: false - property bool useCustomMaterial: false - - property bool changed: false - Component.onCompleted: { - outerWindow.changed = false; - } - - Component.onDestruction: { - if (outerWindow.changed) - { - FileHandler.save_qml(true); - } - } - - Rectangle { - id: menu - x: parent.x - y: parent.y - height: 24 - anchors.left: parent.left - anchors.right: parent.right - anchors.top: parent.top - - color: "#B4B4B4" - border.color: "black" - - ButtonBarPane { - id: buttonBarPane - anchors.fill: parent - } - } - - Rectangle { - id: mainwindow - anchors.left: parent.left - anchors.right: parent.right - anchors.top: menu.bottom - anchors.bottom: outerWindow.bottom - - color: "#444444" - border.color: "black" - - property alias targetMesh: quickFile.filename - - QuickFile { - id: quickFile - filename: "meshes/penguin.3ds" - title: "Open 3D Asset File" - filter: "Asset files (*.*)" - } - - QuickFile { - id: textureFile - filename: "" - title: "Open Texture File" - filter: "Images (*.gif *.png *.jpg *.tif *.bmp)" - } - - Mesh { - id: source_mesh - source: quickFile.filename - } - - Translation3D { id: transformTranslate; translate: Qt.vector3d(0, 0, 0); } - Rotation3D { id: transformRotateX; axis: Qt.vector3d(1, 0, 0); angle: 0; } - Rotation3D { id: transformRotateY; axis: Qt.vector3d(0, 1, 0); angle: 0; } - Rotation3D { id: transformRotateZ; axis: Qt.vector3d(0, 0, 1); angle: 0; } - Scale3D { id: transformScale; scale: Qt.vector3d(1, 1, 1); } - - Effect { - id: customEffect; - property alias hsv: hsvColor - material: useCustomMaterial ? customMaterial : null; - color: hsv.color - blending: (hsv.alpha < 1.0) - || (useCustomMaterial && (hsvAmbColor.alpha*hsvDifColor.alpha*hsvSpecColor.alpha < 1.0)) - texture: textureFile.filename - } - Material { - id: customMaterial - property alias amb_hsv: hsvAmbColor - property alias dif_hsv: hsvDifColor - property alias spec_hsv: hsvSpecColor - ambientColor: hsvAmbColor.color - diffuseColor: hsvDifColor.color - specularColor: hsvSpecColor.color - textureUrl: textureFile.filename - } - HSVColor { id: hsvColor } - HSVColor { id: hsvAmbColor } - HSVColor { id: hsvDifColor } - HSVColor { id: hsvSpecColor } - - ModelViewport { - id: mvpZY - x: 0; - y: 0; - camera.eye: Qt.vector3d(20, 0, 0); - stateName: "ZYMaximised" - viewportName: "Z,Y axis (right)" - - rightVector: Qt.vector3d(0, 0, -1) - upVector: Qt.vector3d(0, 1, 0) - - property alias position: transformTranslate.translate; - - onMouseTranslateX: if (!modelPropertiesPane.translateLocked) position = Qt.vector3d(position.x, position.y, translate.z + (down.x - mouse.x)/translateSensitivity) - onMouseTranslateY: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(position.x, translate.y + (down.y - mouse.y)/translateSensitivity, position.z) - onMouseRotateX: if (!modelPropertiesPane.rotateLocked)transformRotateY.angle = rotate.y - (down.x - mouse.x)/rotateSensitivity - onMouseRotateY: if (!modelPropertiesPane.rotateLocked)transformRotateZ.angle = rotate.z - (down.y - mouse.y)/rotateSensitivity - onMouseScaleX: if (!modelPropertiesPane.scaleLocked) { - var s = scale3d.z - (down.x - mouse.x)/scaleSensitivity; - transformScale.scale = Qt.vector3d(transformScale.scale.x, transformScale.scale.y, s<0 ? 0 : s) - } - onMouseScaleY: if (!modelPropertiesPane.scaleLocked) { - var s = scale3d.y + (down.y - mouse.y)/scaleSensitivity; - transformScale.scale = Qt.vector3d(transformScale.scale.x, s<0 ? 0 : s, transformScale.scale.z) - } - } - - ModelViewport { - id: mvpXY - x: parent.width/2 - y: 0; - camera.eye: Qt.vector3d(0, 0, 20); - stateName: "XYMaximised" - viewportName: "X,Y axis (front)" - - rightVector: Qt.vector3d(1, 0, 0) - upVector: Qt.vector3d(0, 1, 0) - - property alias position: transformTranslate.translate; - - onMouseTranslateX: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(translate.x - (down.x - mouse.x)/translateSensitivity, position.y, position.z) - onMouseTranslateY: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(position.x, translate.y + (down.y - mouse.y)/translateSensitivity, position.z) - onMouseRotateX: if (!modelPropertiesPane.rotateLocked) transformRotateY.angle = rotate.y - (down.x - mouse.x)/rotateSensitivity - onMouseRotateY: if (!modelPropertiesPane.rotateLocked) transformRotateX.angle = rotate.x - (down.y - mouse.y)/rotateSensitivity - onMouseScaleX: if (!modelPropertiesPane.scaleLocked) { - var s = scale3d.x - (down.x - mouse.x)/scaleSensitivity - transformScale.scale = Qt.vector3d(s<0 ? 0 : s, transformScale.scale.y, transformScale.scale.z) - } - onMouseScaleY: if (!modelPropertiesPane.scaleLocked) { - var s = scale3d.y + (down.y - mouse.y)/scaleSensitivity - transformScale.scale = Qt.vector3d(transformScale.scale.x, s<0 ? 0 : s, transformScale.scale.z) - } - } - - ModelViewport { - id: mvpXZ - x: parent.width/2; - y: parent.height/2; - camera.eye: Qt.vector3d(0, 20, 0); - camera.upVector: Qt.vector3d(0, 0, -1); - stateName: "XZMaximised" - viewportName: "X,Z axis (top)" - - rightVector: Qt.vector3d(1, 0, 0) - upVector: Qt.vector3d(0, 0, -1) - - property alias position: transformTranslate.translate; - - onMouseTranslateX: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(translate.x - (down.x - mouse.x)/translateSensitivity, position.y, position.z) - onMouseTranslateY: if (!modelPropertiesPane.translateLocked)position = Qt.vector3d(position.x, position.y, translate.z - (down.y - mouse.y)/translateSensitivity) - onMouseRotateX: if (!modelPropertiesPane.rotateLocked)transformRotateZ.angle = rotate.z + (down.x - mouse.x)/rotateSensitivity - onMouseRotateY: if (!modelPropertiesPane.rotateLocked)transformRotateX.angle = rotate.x - (down.y - mouse.y)/rotateSensitivity - onMouseScaleX: if (!modelPropertiesPane.scaleLocked) { - var s = scale3d.x - (down.x - mouse.x)/scaleSensitivity; - transformScale.scale = Qt.vector3d(s<0 ? 0 : s, transformScale.scale.y, transformScale.scale.z) - } - onMouseScaleY: if (!modelPropertiesPane.scaleLocked) { - var s = scale3d.z + (down.y - mouse.y)/scaleSensitivity; - transformScale.scale = Qt.vector3d(transformScale.scale.x, transformScale.scale.y, s<0 ? 0 : s) - } - } - - Rectangle { - id: meshName - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottomMargin: 10 - anchors.bottom: parent.bottom - radius: 10 - border.width: 1 - border.color: "black" - color: "white" - width: parent.width - 20 - height: 20 - - Text { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - text: "Hold left mouse button to move, middle button to scale, and right button to rotate the asset." - } - } - - ModelPropertiesPane { - id: modelPropertiesPane - x: 16; - y: parent.height / 2 + 16 - onChanged: {outerWindow.changed=true} - } - - ColorPicker { - id: colorPicker - visible: false - } - - HelpOverlay { - id: helpOverlay - visible: false - } - - states: [ - State { - name: "3Views" - }, - State { - name: "ZYMaximised" - PropertyChanges { target: mvpZY; x: 0; y: 0; width: mainwindow.width; height: mainwindow.height; } - PropertyChanges { target: mvpXY; x: mainwindow.width; y: 0; width: 0; height: mainwindow.height/2; } - PropertyChanges { target: mvpXZ; x: mainwindow.width; y: mainwindow.height; width: 0; height: 0; } - }, - State { - name: "XYMaximised" - PropertyChanges { target: mvpZY; x: 0; y: 0; width: 0; height: mainwindow.height/2; } - PropertyChanges { target: mvpXY; x: 0; y: 0; width: mainwindow.width; height: mainwindow.height; } - PropertyChanges { target: mvpXZ; x: mainwindow.width/2; y: mainwindow.height; width: mainwindow.width/2; height: 0; } - }, - State { - name: "XZMaximised" - PropertyChanges { target: mvpZY; x: 0; y: 0; width: 0; height: 0; } - PropertyChanges { target: mvpXY; x: mainwindow.width/2; y: 0; width: mainwindow.width/2; height: 0; } - PropertyChanges { target: mvpXZ; x: 0; y: 0; width: mainwindow.width; height: mainwindow.height; } - } - ] - - state: "3Views" - } -} diff --git a/util/qt3d/assetviewer/qml/BlenderValueSlider.qml b/util/qt3d/assetviewer/qml/BlenderValueSlider.qml deleted file mode 100644 index 2f223380..00000000 --- a/util/qt3d/assetviewer/qml/BlenderValueSlider.qml +++ /dev/null @@ -1,175 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 - -Item { - id: valueSlider - - property string label: ""; - property alias value: textInput.text; - property double delta: 0.1; - property double max: 1; - property double min: -1; - property bool limitMax: false; - property bool limitMin: false; - property bool locked: false - - width: rect.width - height: 20 - - property int textWidth: 80 - - signal next - signal prev - signal gotFocus - signal fail - signal changed - - Rectangle { - id: rect - radius: 8 - border.width: 1 - border.color: "#191919" - color: "#B4B4B4" - width: radius/2 + valueSlider.textWidth + plus.width + minus.width - height: parent.height - - - Text { - id: textLabel - color: "black" - width: textInput.width - height: textInput.height - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - text: valueSlider.label + " " + textInput.text - visible: true - onTextChanged: changed(); - } - - - TextInput { - id: textInput - readOnly: valueSlider.locked - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - horizontalAlignment: TextInput.AlignHCenter - width: valueSlider.textWidth - validator: DoubleValidator{} - onAccepted: { - parent.parent.update(text) - focus = false - } - visible: false - onFocusChanged: { - if (focus == false) { - parent.parent.update(text) - visible = false - textLabel.visible = true - } - else { - visible = true - textLabel.visible = false - } - } - - Keys.onTabPressed: valueSlider.next() - Keys.onBacktabPressed: valueSlider.prev() - } - Image { - id: plus - source: "images/plus.png" - anchors.left: textInput.right - anchors.verticalCenter: parent.verticalCenter - } - Image { - id: minus - source: "images/minus.png" - anchors.right: textInput.left - anchors.verticalCenter: parent.verticalCenter - } - MouseArea { - id: mouseArea - anchors.fill: parent - onEntered: parent.color = "#999999" - onExited: parent.color = "#B4B4B4" - hoverEnabled: true - onClicked: { - if (!valueSlider.locked) - { - if (mouse.x<width/3) - decDelta(); - else if (mouse.x>width/3*2) - incDelta(); - else { - valueSlider.gotFocus() - } - } else { - valueSlider.fail(); - } - - } - onPressed: parent.color = "#808080" - onReleased: parent.color = "#999999" - } - } - - Timer { - interval: 100; - running: mouseArea.pressedButtons & Qt.LeftButton && (mouseArea.mouseX > valueSlider.width/3*2) - repeat: true - onTriggered: if (!valueSlider.locked) incDelta() - } - - Timer { - interval: 100; - running: mouseArea.pressedButtons & Qt.LeftButton && (mouseArea.mouseX < valueSlider.width/3) - repeat: true - onTriggered: if (!valueSlider.locked) decDelta() - } - - function updateMe() { - update(textInput.text) - } - - function incDelta() { - var t = value*1 + delta; - if (limitMax) - update(t>max ? max : t); - else - update(t); - - } - - function decDelta() { - var t = value*1 - delta; - if (limitMin) - update(t<min ? min : t); - else - update(t); - } - - onGotFocus: { - textLabel.visible = false; - textInput.visible = true; - textInput.focus = true; - textInput.selectAll(); - } - - onFocusChanged: if (focus) valueSlider.gotFocus() - - Keys.onUpPressed: { - if (!valueSlider.locked) incDelta(); - else valueSlider.fail(); - } - Keys.onDownPressed: { - if (!valueSlider.locked) decDelta(); - else valueSlider.fail(); - } - Keys.onReturnPressed: { - if (!valueSlider.locked) updateMe(); - else valueSlider.fail(); - } -} diff --git a/util/qt3d/assetviewer/qml/ButtonBarPane.qml b/util/qt3d/assetviewer/qml/ButtonBarPane.qml deleted file mode 100644 index bd85d5c8..00000000 --- a/util/qt3d/assetviewer/qml/ButtonBarPane.qml +++ /dev/null @@ -1,51 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 -import "fileHandling.js" as FileHandler -import "Widgets" - -Flow { - id: menu - anchors.left: parent.left - anchors.leftMargin: 2 - anchors.top: parent.top - anchors.topMargin: 2 - width: buttonWidth * 4 + spacing * 3 - height: parent.height - spacing: 5 - - property double buttonWidth: 105 - - SaveButton { - id: save - width: buttonWidth - buttonText: "Save QML" - imageSrc: "images/save.png" - } - - BlenderToggle { - id: load - width: buttonWidth - onClicked: - { - if (outerWindow.changed) - { - FileHandler.save_qml(true); - } - var useEffect = useCustomEffect; - useCustomEffect = false; - quickFile.load(); - useCustomEffect = useEffect; - } - buttonText: "Load Asset" - imageSrc: "images/model.png" - } - - BlenderToggle { - id: help - width: buttonWidth - onClicked: helpOverlay.visible = true - buttonText: "Help!" - imageSrc: "images/help.png" - } -} diff --git a/util/qt3d/assetviewer/qml/CheckBox.qml b/util/qt3d/assetviewer/qml/CheckBox.qml deleted file mode 100644 index efadd539..00000000 --- a/util/qt3d/assetviewer/qml/CheckBox.qml +++ /dev/null @@ -1,45 +0,0 @@ -import QtQuick 1.0 - -Item { - id: checkBox - height: Math.max (textBox.height, check.height) - width: textBox.width + check.width - property alias text: textBox.text - property bool checked: false - signal clicked(bool checked) - property variant color: Qt.rgba(1,1,1,1) - - Text { - id: textBox - anchors.left: parent.left - color: checkBox.color - } - - Rectangle { - id: check - width: 16 - height: 16 - anchors.right: parent.right - - border.color: checkBox.color - border.width: 1 - color: Qt.rgba(0,0,0,0) - - Rectangle { - anchors.centerIn: parent - - border.color: checkBox.color - border.width: 1 - - width: parent.width - 6 - height: parent.height - 6 - color: checkBox.color - opacity: checked - } - } - - MouseArea { - anchors.fill: parent - onClicked: { checked = !checked; checkBox.clicked(checked) } - } -} diff --git a/util/qt3d/assetviewer/qml/ColorPicker.qml b/util/qt3d/assetviewer/qml/ColorPicker.qml deleted file mode 100644 index 641a6acc..00000000 --- a/util/qt3d/assetviewer/qml/ColorPicker.qml +++ /dev/null @@ -1,286 +0,0 @@ -import QtQuick 1.0 -import "Widgets" -import "ColorUtils.js" as ColorUtils - -Rectangle { - id: picker - property alias alpha: alphaSlider.value - property alias hue: hueSlider.value - property alias sat: colorSelector.sat - property alias val: colorSelector.val - property variant colorSelect: Qt.hsla(hsl_hue, hsl_sat, hsl_lum, alpha) - property HSVColor targetColor - - HSVColor { id: oldColor } - - property real hsl_hue: hue - property real hsl_sat: sat*val*((hsl_lum <= 2) ? hsl_lum*2 : 2*(1 - hsl_lum)) - property real hsl_lum: ((2.0 - sat)*val)/2 - - property int red: rgb[0] - property int green: rgb[1] - property int blue: rgb[2] - - property variant rgb: ColorUtils.hsvToRgb(hue, sat, val) - - onRgbChanged: updateTarget() - onAlphaChanged: updateTarget() - - anchors.fill: parent - property real bgAlpha: 0.5 - color: Qt.rgba(1,1,1,bgAlpha) - - function apply() { - updateTarget(); - picker.visible = false; - } - - function cancel() { - resetTarget(); - picker.visible = false; - } - - function setTarget(target) { - targetColor = target; - hue = target.hue; - sat = target.sat; - val = target.val; - alpha = target.alpha; - oldColor.hue = target.hue; - oldColor.sat = target.sat; - oldColor.val = target.val; - oldColor.alpha = target.alpha - } - - function updateTarget() { - if (targetColor === null || !picker.visible) return; - targetColor.hue = hue; - targetColor.sat = sat; - targetColor.val = val; - targetColor.alpha = alpha; - } - - function resetTarget() { - if (targetColor === null) return; - targetColor.hue = oldColor.hue; - targetColor.sat = oldColor.sat; - targetColor.val = oldColor.val; - targetColor.alpha = oldColor.alpha; - } - - MouseArea { - anchors.fill: parent - onClicked: {} - } - - Rectangle { - width: pickerLayout.implicitWidth+20 - height: 250 - anchors.centerIn: parent - - border.width: 2 - border.color: "white" - color: mainwindow.color - - Row { - id: pickerLayout - anchors { - top: parent.top - horizontalCenter: parent.horizontalCenter - margins: 10 - } - height: 200 - spacing: 10 - - Item { - id: colorViewer - width: height - height: parent.height - Rectangle { - anchors.fill: parent - rotation: -90 - gradient: Gradient { - GradientStop { position: 0.0; color: Qt.hsla(hueSlider.value, 1.0, 1.0) } - GradientStop { position: 1.0; color: Qt.hsla(hueSlider.value, 1.0, 0.5) } - } - } - Rectangle { - anchors.fill: parent - border.color: "lightgray" - gradient: Gradient { - GradientStop { position: 0.0; color: Qt.rgba(0,0,0,0) } - GradientStop { position: 1.0; color: Qt.rgba(0,0,0,1) } - } - } - - ColorSelector { - id: colorSelector - anchors.fill: parent - } - } - - Item { - width: 20 - height: parent.height - Rectangle { - anchors.fill: parent - border.color: "lightgray" - gradient: Gradient { - GradientStop { position: 1.0; color: Qt.hsla(1.0, 1.0, 0.5) } - GradientStop { position: 0.85; color: Qt.hsla(0.85, 1.0, 0.5) } - GradientStop { position: 0.76; color: Qt.hsla(0.76, 1.0, 0.5) } - GradientStop { position: 0.5; color: Qt.hsla(0.5, 1.0, 0.5) } - GradientStop { position: 0.33; color: Qt.hsla(0.33, 1.0, 0.5) } - GradientStop { position: 0.16; color: Qt.hsla(0.16, 1.0, 0.5) } - GradientStop { position: 0.0; color: Qt.hsla(0.0, 1.0, 0.5) } - } - } - - SliderHandle { - id: hueSlider - anchors.fill: parent - } - } - - Item { - width: 20 - height: parent.height - - Checkered { - anchors.fill: parent - } - - Rectangle { - anchors.fill: parent - border.color: "lightgray" - gradient: Gradient { - GradientStop { - position: 0.0; - color: Qt.hsla(picker.hsl_hue, picker.hsl_sat, picker.hsl_lum) - } - GradientStop { - position: 1.0; - color: Qt.hsla(picker.hsl_hue, picker.hsl_sat, picker.hsl_lum, 0) - } - } - } - - SliderHandle { - id: alphaSlider - anchors.fill: parent - inverted: true - } - } - - Item { - width: 60 - height: parent.height - - Item { - id: preview - width: parent.width; height: 40 - Checkered { - anchors.fill: parent - } - Rectangle { - anchors.fill: parent - border.color: "lightgray" - color: picker.colorSelect - } - } - - Column { - anchors.top: preview.bottom - anchors.topMargin: 5 - spacing: 3 - width: parent.width - - InputBox { - id: redIn - width: parent.width; height: 20 - label: "R:" - } - - InputBox { - id: greenIn - width: parent.width; height: 20 - label: "G:" - } - - InputBox { - id: blueIn - width: parent.width; height: 20 - label: "B:" - } - - Binding { - target: redIn.input; property: "text" - value: Math.round(rgb[0]) - } - Binding { - target: greenIn.input; property: "text" - value: Math.round(rgb[1]) - } - Binding { - target: blueIn.input; property: "text" - value: Math.round(rgb[2]) - } - - Item { - width: 5; height: 5 - } - - InputBox { - id: hueIn - width: parent.width; height: 20 - label: "H:" - } - - InputBox { - id: satIn - width: parent.width; height: 20 - label: "S:" - } - - InputBox { - id: valIn - width: parent.width; height: 20 - label: "V:" - } - - Binding { - target: hueIn.input; property: "text" - value: Math.round(picker.hue*100)/100 - } - Binding { - target: satIn.input; property: "text" - value: Math.round(picker.sat*100)/100 - } - Binding { - target: valIn.input; property: "text" - value: Math.round(picker.val*100)/100 - } - } - } - } - - Row { - anchors { - margins: 5 - top: pickerLayout.bottom - horizontalCenter: parent.horizontalCenter - } - spacing: 10 - BlenderToggle { - width: 80 - buttonText: "Apply" - onClicked: picker.apply() - } - BlenderToggle { - width: 80 - buttonText: "Cancel" - onClicked: picker.cancel() - } - } - } -} diff --git a/util/qt3d/assetviewer/qml/ColorUtils.js b/util/qt3d/assetviewer/qml/ColorUtils.js deleted file mode 100644 index 5addf394..00000000 --- a/util/qt3d/assetviewer/qml/ColorUtils.js +++ /dev/null @@ -1,61 +0,0 @@ -.pragma library - -function rgbToHsv(r, g, b) { - r = r/255; g = g/255; b = b/255; - var max = Math.max(r, g, b), min = Math.min(r, g, b); - var h, s, v = max; - - var d = max - min; - s = max == 0 ? 0 : d / max; - - if (max == min){ - h = 0; // achromatic - } else { - switch (max) { - case r: h = (g - b) / d + (g < b ? 6 : 0); break; - case g: h = (b - r) / d + 2; break; - case b: h = (r - g) / d + 4; break; - } - h /= 6; - } - - return new Array(h, s, v); -} - -function hsvToRgb(h, s, v) { - var r, g, b; - - var i = Math.floor(h * 6); - var f = h * 6 - i; - var p = v * (1 - s); - var q = v * (1 - f * s); - var t = v * (1 - (1 - f) * s); - - switch (i % 6){ - case 0: r = v; g = t; b = p; break; - case 1: r = q; g = v; b = p; break; - case 2: r = p; g = v; b = t; break; - case 3: r = p; g = q; b = v; break; - case 4: r = t; g = p; b = v; break; - case 5: r = v; g = p; b = q; break; - } - - return new Array(r * 255, g * 255, b * 255); -} - -function hsvToHsl(h, s, v) { - var ss, l; - - l = ((2.0 - s)*v); - - ss = s*v*((l <= 1) ? l : 2 - l); - - l /= 2; - - return new Array(h, ss, l); -} - -function hsvToColor(h, s, v, a) { - var hsl = hsvToHsl(h,s,v); - return Qt.hsla(hsl[0], hsl[1], hsl[2], a); -} diff --git a/util/qt3d/assetviewer/qml/HelpOverlay.qml b/util/qt3d/assetviewer/qml/HelpOverlay.qml deleted file mode 100644 index 7b233e6f..00000000 --- a/util/qt3d/assetviewer/qml/HelpOverlay.qml +++ /dev/null @@ -1,56 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 - -Rectangle { - anchors.fill: parent - color: "#00000000" - - Rectangle { - id: helpScreen - width: parent.width/2 - height: parent.height/2 - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - - border.width: 4 - radius: 4 - color: "lightyellow" - - Text { - id: header - font { pixelSize: 32; italic: true } - text: "3D Asset Viewer Help" - anchors.top: parent.top - anchors.topMargin: 16 - anchors.horizontalCenter: parent.horizontalCenter - } - Text { - anchors.top: header.bottom - anchors.topMargin: 16 - anchors.left: parent.left - anchors.leftMargin: 16 - anchors.right: parent.right - anchors.rightMargin: 16 - textFormat: Text.RichText - wrapMode: Text.WordWrap - text: "Altering model parameters with the mouse:" + - "<ul><li>Clicking on one of the panes with the <b>Left Mouse Button</b> and dragging will translate the position.</li>" + - "<li>Clicking on one of the panes with the <b>Right Mouse Button</b> and dragging will rotate the position.</li>" + - "<li>Clicking on one of the panes with the <b>Middle Mouse Button</b> and dragging will resize the model." - } - - Text { - anchors.bottom: parent.bottom - anchors.bottomMargin: 16 - anchors.horizontalCenter: parent.horizontalCenter - text: "[ Click to Close ]" - } - } - MouseArea { - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton - onClicked: parent.visible = false - } -} - diff --git a/util/qt3d/assetviewer/qml/ModelPropertiesPane.qml b/util/qt3d/assetviewer/qml/ModelPropertiesPane.qml deleted file mode 100644 index 384a8b6e..00000000 --- a/util/qt3d/assetviewer/qml/ModelPropertiesPane.qml +++ /dev/null @@ -1,543 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 -import "Widgets" -import "ColorUtils.js" as ColorUtils - -Row { - id: properties - spacing: 30 - property alias rotateLocked: imageR.isLocked - property alias scaleLocked: imageS.isLocked - property alias translateLocked: imageP.isLocked; - - signal changed; - Column { - width: posX.width - height: parent.height - spacing: 4 - - // POSITION - Item { - id: positionPanel - width: parent.width - height: imageP.height - - Text { - anchors.left: parent.left - anchors.leftMargin: 8 - text: "Position"; - color: "#FFFFFF"; - font.bold: true; - } - Image { - id: imageP - anchors.right: parent.right - anchors.rightMargin: 8 - - //Animation to pulse the lock icon if attempting to modify while locked. - property bool bounce: false - - SequentialAnimation on scale{ - running: imageP.bounce - NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } - onCompleted: imageP.bounce = false - } - - //Manage locked/unlocked state - state: "UNLOCKED" - property bool isLocked: false - - states: [ - State { - name: "UNLOCKED" - PropertyChanges { target: imageP; source: "images/unlock.png"} - PropertyChanges { target: imageP; isLocked: false;} - }, - State { - name: "LOCKED" - PropertyChanges { target: imageP; source: "images/lock.png"} - PropertyChanges { target: imageP; isLocked: true;} - } - ] - - MouseArea { - anchors.fill: parent - onDoubleClicked: { - if (parent.state=="LOCKED") - parent.state="UNLOCKED" - else - parent.state="LOCKED" - } - } - } - } - BlenderValueSlider { - focus: true - id: posX - label: "X:" - locked: imageP.isLocked - value: transformTranslate.translate.x.toFixed(3) - function update (f) { - transformTranslate.translate = Qt.vector3d(f, transformTranslate.translate.y, transformTranslate.translate.z); - } - onNext: { updateMe(); focus = false; posY.focus = true; } - onPrev: { updateMe(); focus = false; scaleZ.focus = true; } - onFail: { imageP.bounce=true; } - onChanged: { properties.changed(); } - } - BlenderValueSlider { - id: posY - label: "Y:" - locked: imageP.isLocked - value: transformTranslate.translate.y.toFixed(3) - function update (f) { - transformTranslate.translate = Qt.vector3d(transformTranslate.translate.x, f, transformTranslate.translate.z); - } - onNext: { updateMe(); focus = false; posZ.focus = true; } - onPrev: { updateMe(); focus = false; posX.focus = true; } - onFail: { imageP.bounce=true; } - onChanged: { properties.changed(); } - } - BlenderValueSlider { - id: posZ - label: "Z:" - locked: imageP.isLocked - value: transformTranslate.translate.z.toFixed(3) - function update (f) { - transformTranslate.translate = Qt.vector3d(transformTranslate.translate.x, transformTranslate.translate.y, f); - } - onNext: { updateMe(); focus = false; rotX.focus = true; } - onPrev: { updateMe(); focus = false; posY.focus = true; } - onFail: { imageP.bounce=true; } - onChanged: { properties.changed(); } - } - - // ROTATE - Item { - id: rotationPanel - width: parent.width - height: imageR.height - property bool dirty: false - Text { - anchors.left: parent.left - anchors.leftMargin: 8 - text: "Rotation"; - color: "#FFFFFF" - font.bold: true - } - - Image { - id: imageR - anchors.right: parent.right - anchors.rightMargin: 8 - - //Animation to pulse the lock icon if attempting to modify while locked. - property bool bounce: false - - SequentialAnimation on scale{ - running: imageR.bounce - NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } - onCompleted: imageR.bounce = false - } - - //Manage locked/unlocked state - state: "UNLOCKED" - property bool isLocked: false - - states: [ - State { - name: "UNLOCKED" - PropertyChanges { target: imageR; source: "images/unlock.png"} - PropertyChanges { target: imageR; isLocked: false;} - }, - State { - name: "LOCKED" - PropertyChanges { target: imageR; source: "images/lock.png"} - PropertyChanges { target: imageR; isLocked: true;} - } - ] - - MouseArea { - anchors.fill: parent - onDoubleClicked: { - if (parent.state=="LOCKED") - parent.state="UNLOCKED" - else - parent.state="LOCKED" - } - } - } - } - BlenderValueSlider { - id: rotX - label: "X:" - delta: 1 - locked: imageR.isLocked - min: 0; limitMin: true - max: 360; limitMax: true - value: transformRotateX.angle.toFixed(3) - function update (f) { transformRotateX.angle = f } - onNext: { updateMe(); focus = false; rotY.focus = true; } - onPrev: { updateMe(); focus = false; posZ.focus = true; } - onFail: { imageR.bounce=true; } - onChanged: { properties.changed(); } - } - BlenderValueSlider { - id: rotY - label: "Y:" - delta: 1 - locked: imageR.isLocked - min: 0; limitMin: true - max: 360; limitMax: true - value: transformRotateY.angle.toFixed(3) - function update (f) { transformRotateY.angle = f } - onNext: { updateMe(); focus = false; rotZ.focus = true; } - onPrev: { updateMe(); focus = false; rotX.focus = true; } - onFail: { imageR.bounce=true; } - onChanged: { properties.changed(); } - } - BlenderValueSlider { - id: rotZ - label: "Z:" - delta: 1 - locked: imageR.isLocked - min: 0; limitMin: true - max: 360; limitMax: true - value: transformRotateZ.angle.toFixed(3) - function update (f) { transformRotateZ.angle = f } - onNext: { updateMe(); focus = false; scaleX.focus = true; } - onPrev: { updateMe(); focus = false; rotY.focus = true; } - onFail: { imageR.bounce=true; } - onChanged: { properties.changed(); } - } - - // SCALE - Item { - id: scalePanel - width: parent.width - height: imageS.height - property bool dirty: false - - Item { - width: parent.width - height: scaleText.height - Text { - id: scaleText - anchors.left: parent.left - anchors.leftMargin: 8 - text: "Scale"; - color: "#FFFFFF" - font.bold: true - } - } - - Image { - id: imageS - anchors.right: parent.right - anchors.rightMargin: 8 - - //Animation to pulse the lock icon if attempting to modify while locked. - property bool bounce: false - - SequentialAnimation on scale{ - running: imageS.bounce - NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 2.0; duration: 150; easing.type: "OutQuad" } - NumberAnimation { to : 1.0; duration: 150; easing.type: "OutQuad" } - onCompleted: imageS.bounce = false - } - - //Manage locked/unlocked state - state: "UNLOCKED" - property bool isLocked: false - - states: [ - State { - name: "UNLOCKED" - PropertyChanges { target: imageS; source: "images/unlock.png"} - PropertyChanges { target: imageS; isLocked: false;} - }, - State { - name: "LOCKED" - PropertyChanges { target: imageS; source: "images/lock.png"} - PropertyChanges { target: imageS; isLocked: true;} - } - ] - - MouseArea { - anchors.fill: parent - onDoubleClicked: { - if (parent.state=="LOCKED") - parent.state="UNLOCKED" - else - parent.state="LOCKED" - } - } - } - } - BlenderValueSlider { - id: scaleX - label: "X:" - locked: imageS.isLocked - min: 0; limitMin: true - value: transformScale.scale.x.toFixed(3) - function update (f) { transformScale.scale = Qt.vector3d(f, transformScale.scale.y, transformScale.scale.z); } - onNext: { updateMe(); focus = false; scaleY.focus = true; } - onPrev: { updateMe(); focus = false; rotZ.focus = true; } - onFail: { imageS.bounce=true; } - onChanged: { properties.changed(); } - } - BlenderValueSlider { - id: scaleY - label: "Y:" - locked: imageS.isLocked - min: 0; limitMin: true - value: transformScale.scale.y.toFixed(3) - function update (f) { transformScale.scale = Qt.vector3d(transformScale.scale.x, f, transformScale.scale.z); } - onNext: { updateMe(); focus = false; scaleZ.focus = true; } - onPrev: { updateMe(); focus = false; scaleX.focus = true; } - onFail: { imageS.bounce=true; } - onChanged: { properties.changed(); } - } - BlenderValueSlider { - id: scaleZ - label: "Z:" - locked: imageS.isLocked - min: 0; limitMin: true - value: transformScale.scale.z.toFixed(3) - function update (f) { transformScale.scale = Qt.vector3d(transformScale.scale.x, transformScale.scale.y, f); } - onNext: { updateMe(); focus = false; posX.focus = true; } - onPrev: { updateMe(); focus = false; scaleY.focus = true; } - onFail: { imageS.bounce=true; } - onChanged: { properties.changed(); } - } - } - - // Material, Effect - Column { - width: 150 - spacing: 5 - Item { - id: effectPanel - width: parent.width - height: imageS.height - property bool dirty: false - - Item { - width: parent.width - height: effectText.height - Text { - id: effectText - anchors.left: parent.left - anchors.leftMargin: 8 - text: "Effect"; - color: "#FFFFFF" - font.bold: true - } - } - } - - - CheckBox { - id: fromMesh - width: parent.width - text: "From Mesh" - checked: true - onClicked: { - useCustomEffect = !checked; - if (checked) { - // A horrible hack to reload the default mesh material - // TODO: Find a better way of doing this (i.e. no runtime errors) - source_mesh.source = ""; - source_mesh.source = targetMesh; - } - } - } - - Column { - enabled: !fromMesh.checked - opacity: enabled ? 1.0: 0.5 - width: parent.width; spacing: 5 - - move: Transition { - NumberAnimation { - properties: "y" - easing.type: Easing.InOutQuad; - duration: 150 - } - } - - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 100 } - } - - CheckBox { - width: parent.width - text: "Decal" - checked: false - onClicked: { - modelEffect.decal = checked - } - } - - Item { - width: parent.width - height: colorText.height - Text { - id: colorText - anchors.left: parent.left - anchors.leftMargin: 8 - text: "- Color"; - color: "#FFFFFF" - font.bold: true - } - } - - CheckBox { - id: simpleColor - width: parent.width - text: "Simple" - checked: true - onClicked: { - useCustomMaterial = !checked; - } - } - - ColorWidget { - id: flat - visible: opacity != 0 - opacity: simpleColor.checked - width: parent.width; height: 16 - targetColor: modelEffect.hsv - text: "Flat Color" - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 100 } - } - } - - ColorWidget { - id: ambient - visible: opacity != 0 - opacity: !flat.visible - width: parent.width; height: 16 - targetColor: modelMaterial.amb_hsv - text: "Ambient Color" - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 100 } - } - } - - ColorWidget { - id: diffuse - visible: opacity != 0 - opacity: !flat.visible - width: parent.width; height: 16 - targetColor: modelMaterial.dif_hsv - text: "Diffuse Color" - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 100 } - } - } - - ColorWidget { - id: specular - visible: opacity != 0 - opacity: !flat.visible - width: parent.width; height: 16 - targetColor: modelMaterial.spec_hsv - text: "Specular Color" - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 100 } - } - } - - Item { width: parent.width; height: 5 } - - Item { - visible: opacity != 0 - opacity: !flat.visible - height: shineText.height + shinyValue.height + 5 - width: parent.width - - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 100 } - } - - Text { - id: shineText - text: "Shininess:" - color: "white" - } - InputBox { - anchors.right: parent.right - width: parent.width - shineText.width - 5 - height: shineText.height - input.text: modelMaterial.shininess - } - Rectangle { - width: parent.width - 8; height: 1 - anchors.centerIn: shinyValue - color: "gray" - } - - SliderHandle { - id: shinyValue - width: parent.width; height: 10 - anchors { top: shineText.bottom; topMargin: 5 } - horizontal: true - onValueChanged: { - modelMaterial.shininess = Math.round(value * 128) - } - } - } - - Item { width: parent.width; height: 5 } - - Item { - width: parent.width - height: textureText.height - Text { - id: textureText - anchors.left: parent.left - anchors.leftMargin: 8 - text: "- Texture"; - color: "#FFFFFF" - font.bold: true - } - } - - Item { - width: parent.width - height: texturePreview.height - Image { - id: texturePreview - width: 60; height: width - source: textureFile.filename - } - Rectangle { - anchors.fill: texturePreview - border.color: "white" - border.width: 1 - color: "transparent" - } - - BlenderToggle { - width: 60; height: 20 - anchors.right: parent.right - buttonText: "Open..." - onClicked: { - textureFile.load(); - } - } - } - } - } -} diff --git a/util/qt3d/assetviewer/qml/ModelViewport.qml b/util/qt3d/assetviewer/qml/ModelViewport.qml deleted file mode 100644 index 541c147a..00000000 --- a/util/qt3d/assetviewer/qml/ModelViewport.qml +++ /dev/null @@ -1,452 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import Qt3D.Shapes 1.0 -import AssetViewer 1.0 -import "Widgets" - -Rectangle { - id: view - width: parent.width/2; - height: parent.height/2 - - color: parent.color - border.color: parent.border.color - - property alias itemPosition: mainItem.position; - property alias itemScale: mainItem.scale; - property alias camera: viewport.camera - property alias viewportName: viewportText.text; - - // the current x/y positions of the mouse when the onPressed event was triggered; - // values are invalid if onRelease has occured - property variant down; - - // current xyz values of the Translation3D/Rotation3Ds/Scale3D when onPressed was triggered; - // values are invalid if onRelease has occured - property variant translate; - property variant rotate; - property variant scale3d; - - // the pixel sensitivity values of the mousemovements - // TODO: expose via api - // TODO: maybe save in settings api? - property double translateSensitivity: 32; - property double rotateSensitivity: 8; - property double scaleSensitivity: 32; - - // the name of this viewport's state - property string stateName; - - property variant upVector: Qt.vector3d(0, 1, 0) - property variant rightVector: Qt.vector3d(0, 1, 0) - - // the smoothness values for the state change transformations - // TODO: this should be alterable via the gui and saved in a settings file - Behavior on x { NumberAnimation { duration: 300 } } - Behavior on y { NumberAnimation { duration: 300 } } - Behavior on width { NumberAnimation { duration: 300 } } - Behavior on height { NumberAnimation { duration: 300 } } - - signal mouseTranslateX(variant mouse) - signal mouseTranslateY(variant mouse) - signal mouseRotateX(variant mouse) - signal mouseRotateY(variant mouse) - signal mouseScaleX(variant mouse) - signal mouseScaleY(variant mouse) - - property real cameraZoom: 1.0 - - Viewport { - id: viewport - anchors.fill: parent - picking: false - blending: true - - // TODO: camera's position/rotation-around-origin/farplane should be alterable via gui - camera: Camera { - farPlane: 2000 // debugging - projectionType: Camera.Orthographic - viewSize: Qt.size(2*cameraZoom, 2*cameraZoom) - } - navigation: false - - Item3D { - id: mainItem - mesh: source_mesh - transform: [ - transformScale, - transformRotateX, - transformRotateY, - transformRotateZ, - transformTranslate, - ] - effect: useCustomEffect ? modelEffect : null; - } - - Effect { - id: coordLinesThickEffect - color: "white" - } - Effect { - id: coordLinesThinEffect - color: "black" - } - - // horizontal lines - Line { - id: lineAxisRight - width: 3.0 - vertices: [ - cameraZoom*(-10*rightVector.x), cameraZoom*(-10*rightVector.y), cameraZoom*(-10*rightVector.z), - cameraZoom*(10*rightVector.x), cameraZoom*(10*rightVector.y), cameraZoom*(10*rightVector.z), - cameraZoom*(10*rightVector.x + 0.001*upVector.x), cameraZoom*(10*rightVector.y + 0.001*upVector.y), cameraZoom*(10*rightVector.z + 0.001*upVector.z) - ] - effect: coordLinesThickEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*rightVector.x + 0.25*upVector.x), cameraZoom*(-10*rightVector.y + 0.25*upVector.y), cameraZoom*(-10*rightVector.z + 0.25*upVector.z), - cameraZoom*(10*rightVector.x + 0.25*upVector.x), cameraZoom*(10*rightVector.y + 0.25*upVector.y), cameraZoom*(10*rightVector.z + 0.25*upVector.z), - cameraZoom*(10*rightVector.x + 0.251*upVector.x), cameraZoom*(10*rightVector.y + 0.251*upVector.y), cameraZoom*(10*rightVector.z + 0.251*upVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*rightVector.x + 0.5*upVector.x), cameraZoom*(-10*rightVector.y + 0.5*upVector.y), cameraZoom*(-10*rightVector.z + 0.5*upVector.z), - cameraZoom*(10*rightVector.x + 0.5*upVector.x), cameraZoom*(10*rightVector.y + 0.5*upVector.y), cameraZoom*(10*rightVector.z + 0.5*upVector.z), - cameraZoom*(10*rightVector.x + 0.501*upVector.x), cameraZoom*(10*rightVector.y + 0.501*upVector.y), cameraZoom*(10*rightVector.z + 0.501*upVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*rightVector.x + 0.75*upVector.x), cameraZoom*(-10*rightVector.y + 0.75*upVector.y), cameraZoom*(-10*rightVector.z + 0.75*upVector.z), - cameraZoom*(10*rightVector.x + 0.75*upVector.x), cameraZoom*(10*rightVector.y + 0.75*upVector.y), cameraZoom*(10*rightVector.z + 0.75*upVector.z), - cameraZoom*(10*rightVector.x + 0.751*upVector.x), cameraZoom*(10*rightVector.y + 0.751*upVector.y), cameraZoom*(10*rightVector.z + 0.751*upVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*rightVector.x - 0.25*upVector.x), cameraZoom*(-10*rightVector.y - 0.25*upVector.y), cameraZoom*(-10*rightVector.z - 0.25*upVector.z), - cameraZoom*(10*rightVector.x - 0.25*upVector.x), cameraZoom*(10*rightVector.y - 0.25*upVector.y), cameraZoom*(10*rightVector.z - 0.25*upVector.z), - cameraZoom*(10*rightVector.x - 0.251*upVector.x), cameraZoom*(10*rightVector.y - 0.251*upVector.y), cameraZoom*(10*rightVector.z - 0.251*upVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*rightVector.x - 0.5*upVector.x), cameraZoom*(-10*rightVector.y - 0.5*upVector.y), cameraZoom*(-10*rightVector.z - 0.5*upVector.z), - cameraZoom*(10*rightVector.x - 0.5*upVector.x), cameraZoom*(10*rightVector.y - 0.5*upVector.y), cameraZoom*(10*rightVector.z - 0.5*upVector.z), - cameraZoom*(10*rightVector.x - 0.501*upVector.x), cameraZoom*(10*rightVector.y - 0.501*upVector.y), cameraZoom*(10*rightVector.z - 0.501*upVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*rightVector.x - 0.75*upVector.x), cameraZoom*(-10*rightVector.y - 0.75*upVector.y), cameraZoom*(-10*rightVector.z - 0.75*upVector.z), - cameraZoom*(10*rightVector.x - 0.75*upVector.x), cameraZoom*(10*rightVector.y - 0.75*upVector.y), cameraZoom*(10*rightVector.z - 0.75*upVector.z), - cameraZoom*(10*rightVector.x - 0.751*upVector.x), cameraZoom*(10*rightVector.y - 0.751*upVector.y), cameraZoom*(10*rightVector.z - 0.751*upVector.z) - ] - effect: coordLinesThinEffect - } - - // vertical lines - Line { - id: lineAxisUp - width: 3.0 - vertices: [ - cameraZoom*(-10*upVector.x), cameraZoom*(-10*upVector.y), cameraZoom*(-10*upVector.z), - cameraZoom*(10*upVector.x), cameraZoom*(10*upVector.y), cameraZoom*(10*upVector.z), - cameraZoom*(10*upVector.x + 0.01*rightVector.x), cameraZoom*(10*upVector.y + 0.01*rightVector.y), cameraZoom*(10*upVector.z + 0.01*rightVector.z) - ] - effect: coordLinesThickEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x + 0.25*rightVector.x), cameraZoom*(-10*upVector.y + 0.25*rightVector.y), cameraZoom*(-10*upVector.z + 0.25*rightVector.z), - cameraZoom*(10*upVector.x + 0.25*rightVector.x), cameraZoom*(10*upVector.y + 0.25*rightVector.y), cameraZoom*(10*upVector.z + 0.25*rightVector.z), - cameraZoom*(10*upVector.x + 0.251*rightVector.x), cameraZoom*(10*upVector.y + 0.251*rightVector.y), cameraZoom*(10*upVector.z + 0.251*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x + 0.5*rightVector.x), cameraZoom*(-10*upVector.y + 0.5*rightVector.y), cameraZoom*(-10*upVector.z + 0.5*rightVector.z), - cameraZoom*(10*upVector.x + 0.5*rightVector.x), cameraZoom*(10*upVector.y + 0.5*rightVector.y), cameraZoom*(10*upVector.z + 0.5*rightVector.z), - cameraZoom*(10*upVector.x + 0.501*rightVector.x), cameraZoom*(10*upVector.y + 0.501*rightVector.y), cameraZoom*(10*upVector.z + 0.501*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x + 0.75*rightVector.x), cameraZoom*(-10*upVector.y + 0.75*rightVector.y), cameraZoom*(-10*upVector.z + 0.75*rightVector.z), - cameraZoom*(10*upVector.x + 0.75*rightVector.x), cameraZoom*(10*upVector.y + 0.75*rightVector.y), cameraZoom*(10*upVector.z + 0.75*rightVector.z), - cameraZoom*(10*upVector.x + 0.751*rightVector.x), cameraZoom*(10*upVector.y + 0.751*rightVector.y), cameraZoom*(10*upVector.z + 0.751*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x + 1.00*rightVector.x), cameraZoom*(-10*upVector.y + 1.00*rightVector.y), cameraZoom*(-10*upVector.z + 1.00*rightVector.z), - cameraZoom*(10*upVector.x + 1.00*rightVector.x), cameraZoom*(10*upVector.y + 1.00*rightVector.y), cameraZoom*(10*upVector.z + 1.00*rightVector.z), - cameraZoom*(10*upVector.x + 1.001*rightVector.x), cameraZoom*(10*upVector.y + 1.001*rightVector.y), cameraZoom*(10*upVector.z + 1.001*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x - 0.25*rightVector.x), cameraZoom*(-10*upVector.y - 0.25*rightVector.y), cameraZoom*(-10*upVector.z - 0.25*rightVector.z), - cameraZoom*(10*upVector.x - 0.25*rightVector.x), cameraZoom*(10*upVector.y - 0.25*rightVector.y), cameraZoom*(10*upVector.z - 0.25*rightVector.z), - cameraZoom*(10*upVector.x - 0.251*rightVector.x), cameraZoom*(10*upVector.y - 0.251*rightVector.y), cameraZoom*(10*upVector.z - 0.251*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x - 0.5*rightVector.x), cameraZoom*(-10*upVector.y - 0.5*rightVector.y), cameraZoom*(-10*upVector.z - 0.5*rightVector.z), - cameraZoom*(10*upVector.x - 0.5*rightVector.x), cameraZoom*(10*upVector.y - 0.5*rightVector.y), cameraZoom*(10*upVector.z - 0.5*rightVector.z), - cameraZoom*(10*upVector.x - 0.501*rightVector.x), cameraZoom*(10*upVector.y - 0.501*rightVector.y), cameraZoom*(10*upVector.z - 0.501*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x - 0.75*rightVector.x), cameraZoom*(-10*upVector.y - 0.75*rightVector.y), cameraZoom*(-10*upVector.z - 0.75*rightVector.z), - cameraZoom*(10*upVector.x - 0.75*rightVector.x), cameraZoom*(10*upVector.y - 0.75*rightVector.y), cameraZoom*(10*upVector.z - 0.75*rightVector.z), - cameraZoom*(10*upVector.x - 0.751*rightVector.x), cameraZoom*(10*upVector.y - 0.751*rightVector.y), cameraZoom*(10*upVector.z - 0.751*rightVector.z) - ] - effect: coordLinesThinEffect - } - Line { - width: 1.0 - vertices: [ - cameraZoom*(-10*upVector.x - 1.00*rightVector.x), cameraZoom*(-10*upVector.y - 1.00*rightVector.y), cameraZoom*(-10*upVector.z - 1.00*rightVector.z), - cameraZoom*(10*upVector.x - 1.00*rightVector.x), cameraZoom*(10*upVector.y - 1.00*rightVector.y), cameraZoom*(10*upVector.z - 1.00*rightVector.z), - cameraZoom*(10*upVector.x - 1.001*rightVector.x), cameraZoom*(10*upVector.y - 1.001*rightVector.y), cameraZoom*(10*upVector.z - 1.001*rightVector.z) - ] - effect: coordLinesThinEffect - } - - } - - MouseArea { - property int mouseDown: Qt.NoButton - - anchors.fill: parent - acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton - - onMouseXChanged: { - if (mouseDown & Qt.LeftButton) - mouseTranslateX(mouse) - else if (mouseDown === Qt.RightButton) - mouseRotateX(mouse); - else if (mouseDown === Qt.MiddleButton) - mouseScaleX(mouse) - } - - onMouseYChanged: { - if (mouseDown & Qt.LeftButton) - mouseTranslateY(mouse) - else if (mouseDown === Qt.RightButton) - mouseRotateY(mouse); - else if (mouseDown === Qt.MiddleButton) - mouseScaleY(mouse) - } - - onPressed: { - // if we already have a mouse button down we don't want to do anything else until it's up again - if (mouseDown !== Qt.NoButton) - return; - - mouseDown = mouse.button; - down = Qt.point(mouse.x, mouse.y) - translate = transformTranslate.translate - rotate = Qt.vector3d(transformRotateX.angle, transformRotateY.angle, transformRotateZ.angle) - scale3d = transformScale.scale - } - - // clear the current mouse button upon release - onReleased: { mouseDown = Qt.NoButton } - } - - ModelViewportResize { - anchors { - top: view.top; topMargin: 2; - right: view.right; rightMargin: 2; - } - } - - ZoomControls { - anchors { - top: view.top; topMargin: 24; - right: view.right; rightMargin: 2; - } - onZoomIn: { - cameraZoom = 0.5 * cameraZoom; - } - onZoomOut: { - cameraZoom = 2.0 * cameraZoom; - } - } - - Text { - id: viewportText - anchors { - top: view.top; topMargin: 4; - left: view.left; leftMargin: 4; - } - color: "white" - font.pixelSize: 16 - } - - // --------- grid text begin --------- - - property bool bTall: view.width<view.height; - property int minimalDimension: (bTall) ? view.width : view.height; - property int textStep: minimalDimension/8; - - // horizontal - - Text { - id: h_minus100 - text: -1.0*cameraZoom - x: view.width/2 - 4*textStep - 10 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - visible: bTall==false - } - Text { - id: h_minus075 - text: -0.75*cameraZoom - x: view.width/2 - 3*textStep - 10 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_minus050 - text: -0.5*cameraZoom - x: view.width/2 - 2*textStep - 10 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_minus025 - text: -0.25*cameraZoom - x: view.width/2 - textStep - 10 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_zero - text: "0.0" - x: (view.width/2) - 10 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_plus025 - text: 0.25*cameraZoom - x: view.width/2 + textStep - 5 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_plus050 - text: 0.5*cameraZoom - x: view.width/2 + 2*textStep - 5 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_plus075 - text: 0.75*cameraZoom - x: view.width/2 + 3*textStep - 5 - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - } - Text { - id: h_plus100 - text: 1.0*cameraZoom - x: view.width/2 + 4*textStep - y: (view.height/2) - 14 - color: "white" - font.pixelSize: 12 - visible: bTall==false - } - - // vertical - - Text { - id: v_minus075 - text: -0.75*cameraZoom - x: (view.width/2) - y: view.height/2 - 3*textStep - 5 - color: "white" - font.pixelSize: 12 - } - Text { - id: v_minus050 - text: -0.5*cameraZoom - x: (view.width/2) - y: view.height/2 - 2*textStep - 6 - color: "white" - font.pixelSize: 12 - } - Text { - id: v_minus025 - text: -0.25*cameraZoom - x: (view.width/2) - y: view.height/2 - textStep - 7 - color: "white" - font.pixelSize: 12 - } - Text { - id: v_plus025 - text: 0.25*cameraZoom - x: (view.width/2) - y: view.height/2 + textStep - 8 - color: "white" - font.pixelSize: 12 - } - Text { - id: v_plus050 - text: 0.5*cameraZoom - x: (view.width/2) - y: view.height/2 + 2*textStep - 9 - color: "white" - font.pixelSize: 12 - } - Text { - id: v_plus075 - text: 0.75*cameraZoom - x: (view.width/2) - y: view.height/2 + 3*textStep - 10 - color: "white" - font.pixelSize: 12 - } - - // --------- grid text end --------- -} diff --git a/util/qt3d/assetviewer/qml/SaveButton.qml b/util/qt3d/assetviewer/qml/SaveButton.qml deleted file mode 100644 index 7cf788b1..00000000 --- a/util/qt3d/assetviewer/qml/SaveButton.qml +++ /dev/null @@ -1,12 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 -import "Widgets" -import "fileHandling.js" as FileHandler - - -BlenderToggle { - onClicked: { - FileHandler.save_qml(false); - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/BlenderToggle.qml b/util/qt3d/assetviewer/qml/Widgets/BlenderToggle.qml deleted file mode 100644 index a9258fc8..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/BlenderToggle.qml +++ /dev/null @@ -1,48 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 - -Rectangle { - anchors.topMargin: 15 - anchors.leftMargin: 15 - border.width: 1 - border.color: "#191919" - radius: 8 - height: 20 - color: "#999999" - - property alias buttonText: text.text - property alias imageSrc: img.source - property alias textColor: text.color - - signal clicked - - - Image { - id: img - anchors.left: parent.left - anchors.leftMargin: 5 - anchors.verticalCenter: parent.verticalCenter - } - - Text { - id: text - anchors.fill: parent - font.pixelSize: 12 - anchors.left: img.left - anchors.leftMargin: 5 - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - } - - MouseArea { - anchors.fill: parent - onClicked: parent.clicked() - onPressed: parent.color = "#646464" - onReleased: parent.color = "#999999" - hoverEnabled: true - onEntered: parent.color = "#BEBEBE" - onExited: parent.color = "#999999" - } -} - diff --git a/util/qt3d/assetviewer/qml/Widgets/Checkered.qml b/util/qt3d/assetviewer/qml/Widgets/Checkered.qml deleted file mode 100644 index 49bf1d82..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/Checkered.qml +++ /dev/null @@ -1,27 +0,0 @@ -import QtQuick 1.0 - -Grid { - property variant color1: "#FFFFFF" - property variant color2: "#BBBBBB" - property variant cellSize: 10 - width: 20 - height: parent.height - clip: true - - rows: height/cellSize - columns: width/cellSize - Repeater { - model: parent.rows * parent.columns - Rectangle { - width: cellSize; height: cellSize; - color: { - var check; - if (columns%2) check = index; - else check = Math.floor(index/columns)%2 + index; - - if (check%2) return color1; - else return color2; - } - } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/ColorSelector.qml b/util/qt3d/assetviewer/qml/Widgets/ColorSelector.qml deleted file mode 100644 index a55a743f..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/ColorSelector.qml +++ /dev/null @@ -1,72 +0,0 @@ -import QtQuick 1.0 - -Item { - id: select - property real sat: 1.0 - property real val: 1.0 - width: parent.width - height: parent.height - - Binding { - target: handle; property: "x" - value: select.sat * select.width - } - Binding { - target: select; property: "sat" - value: handle.x/width - } - - Binding { - target: handle; property: "y" - value: (1.0 - select.val) * select.height - } - Binding { - target: select; property: "val" - value: 1.0 - handle.y/height - } - - Item { - id: handle - width: 20 - height: width - x: 0.0; y: 0.0 - - Rectangle { - x: -width/2 - y: x - width: parent.width-2 - height: width - radius: width/2 - - border.color: "white" - color: "transparent" - } - Rectangle { - x: -width/2 - y: x - width: parent.width - height: width - radius: width/2 - - border.width: 2 - border.color: "black" - color: "transparent" - } - } - - MouseArea { - anchors.fill: parent - function mouseEvent(mouse) { - if (mouse.buttons & Qt.LeftButton) { - handle.x = Math.max(0, Math.min(height, mouse.x)) - handle.y = Math.max(0, Math.min(height, mouse.y)) - } - } - onPressed: mouseEvent(mouse); - onPositionChanged: mouseEvent(mouse); - hoverEnabled: true - onEntered: handle.opacity = 0.5; - onExited: { if (!pressed) handle.opacity = 1.0 } - onReleased: { if (!containsMouse) handle.opacity = 1.0 } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/ColorWidget.qml b/util/qt3d/assetviewer/qml/Widgets/ColorWidget.qml deleted file mode 100644 index f60ff1b0..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/ColorWidget.qml +++ /dev/null @@ -1,37 +0,0 @@ -import QtQuick 1.0 - -Item { - id: colorWidget - width: parent.width; height: 16 - - property variant targetColor - property alias text: flatText.text - - Rectangle { - height: 2 - anchors { - left: parent.left; right: flatSet.right - bottom: parent.bottom - rightMargin: flatSet.width/2 - } - color: colorWidget.targetColor.color - } - Text { - id: flatText - anchors { top: parent.top; left: parent.left } - text:"Color" - color: "white" - } - BlenderToggle { - id: flatSet - width: 32 - anchors { right: parent.right } - height: parent.height - buttonText: "Set" - radius: 6 - onClicked: { - colorPicker.setTarget(colorWidget.targetColor); - colorPicker.visible = true - } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/HSVColor.qml b/util/qt3d/assetviewer/qml/Widgets/HSVColor.qml deleted file mode 100644 index 9e137428..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/HSVColor.qml +++ /dev/null @@ -1,15 +0,0 @@ -import QtQuick 1.0 -import "../ColorUtils.js" as ColorUtils - -Item { - property real hue: 0.0 - property real sat: 0.0 - property real val: 1.0 - property real alpha: 1.0 - property color color: ColorUtils.hsvToColor(hue, sat, val, alpha) - property int red: rgb[0] - property int green: rgb[1] - property int blue: rgb[2] - - property variant rgb: ColorUtils.hsvToRgb(hue, sat, val) -} diff --git a/util/qt3d/assetviewer/qml/Widgets/InputBox.qml b/util/qt3d/assetviewer/qml/Widgets/InputBox.qml deleted file mode 100644 index d3d31837..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/InputBox.qml +++ /dev/null @@ -1,39 +0,0 @@ -import QtQuick 1.0 - -Item { - id: textInput - width: 60 - height: 20 - property alias label: lbl.text - property alias input: inputBox - -// Binding { -// target: textInput; property: "value" -// value: inputBox.text -// } -// Binding { -// target: inputBox; property: "text" -// value: { var result = textInput.value*100; return Math.round(result)/100 } -// } - - Text { - id: lbl - color: "lightgray" - anchors.left: parent.left - } - - Rectangle { - border.color: "gray" - color: "transparent" - width: 40 - height: inputBox.height - anchors.right: parent.right - TextInput { - id: inputBox - anchors { fill: parent; leftMargin: 5 } - color: "white" - text: { var result = textInput.value*100; return Math.round(result)/100 } - selectByMouse: true; readOnly: true - } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/ModelViewportResize.qml b/util/qt3d/assetviewer/qml/Widgets/ModelViewportResize.qml deleted file mode 100644 index 96e8a2d6..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/ModelViewportResize.qml +++ /dev/null @@ -1,30 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 - -Rectangle { - radius: 4 - border.width: 1 - border.color: "#191919" - width: 16 + 2 - height: 16 + 2 - color: "#999999" - - Image { - id: img - source: mainwindow.state !== "3Views" ? "images/shrink.png" : "images/grow.png" - x: 2 - y: 2 - MouseArea { - anchors.fill: parent - onClicked: { - if (view.stateName) { - if (mainwindow.state !== "3Views") - mainwindow.state = "3Views" - else - mainwindow.state = view.stateName - } - } - } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/SliderHandle.qml b/util/qt3d/assetviewer/qml/Widgets/SliderHandle.qml deleted file mode 100644 index 9f72cabc..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/SliderHandle.qml +++ /dev/null @@ -1,76 +0,0 @@ -import QtQuick 1.0 - -Item { - id: slider - width: parent.width - height: parent.height - property real value: 0.0 - property bool inverted: false - property bool horizontal: false - - signal changed; - - Binding { - target: slider; property: "value" - value: { - var res; - var pos = horizontal ? handle.x : handle.y; - var delta = horizontal ? width-handle.width : height-handle.height; - res = pos/delta; - return inverted ? 1-res : res - } - } - Binding { - target: handle; property: "y" - value: { - var res = inverted ? 1 - slider.value : slider.value - if (!horizontal) return res*(height-handle.height); - } - } - Binding { - target: handle; property: "x" - value: { - var res = inverted ? 1 - slider.value : slider.value - if (horizontal) return res*(width-handle.width); - } - } - - Rectangle { - id: handle - width: 8 + (horizontal ? 0 : parent.width) - height: 8 + (!horizontal ? 0 : parent.height) - anchors.horizontalCenter: horizontal ? undefined : parent.horizontalCenter - anchors.verticalCenter: !horizontal ? undefined : parent.verticalCenter - radius: 2 - Behavior on opacity { - NumberAnimation { easing.type: Easing.InOutQuad; duration: 80 } - } - gradient: Gradient { - GradientStop { position: 0.0; color: "#FFFFFF" } - GradientStop { position: 1.0; color: "#FFFFFF" } - } - border.width: 1 - border.color: "darkgray" - onXChanged: slider.changed() - onYChanged: slider.changed() - } - - MouseArea { - id: mouseArea - anchors.fill: parent - function mouseEvent(mouse) { - if (mouse.buttons & Qt.LeftButton) { - if (horizontal) - handle.x = Math.max(0, Math.min(width-handle.width, mouse.x-handle.width/2)) - else - handle.y = Math.max(0, Math.min(height-handle.height, mouse.y-handle.height/2)); - } - } - onPressed: mouseEvent(mouse); - onPositionChanged: mouseEvent(mouse); - hoverEnabled: true - onEntered: handle.opacity = 0.5; - onExited: { if (!pressed) handle.opacity = 1.0 } - onReleased: { if (!containsMouse) handle.opacity = 1.0 } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/ZoomControls.qml b/util/qt3d/assetviewer/qml/Widgets/ZoomControls.qml deleted file mode 100644 index 7ad01ce0..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/ZoomControls.qml +++ /dev/null @@ -1,41 +0,0 @@ -import QtQuick 1.0 -import Qt3D 1.0 -import AssetViewer 1.0 - -Rectangle { - radius: 4 - border.width: 1 - border.color: "#191919" - width: 16 + 2 - height: 16 + 2 + 16 + 2 - color: "#999999" - - signal zoomIn() - signal zoomOut() - - Image { - id: imgIn - source: "images/zoomin.png" - x: 2 - y: 2 - MouseArea { - anchors.fill: parent - onClicked: { - zoomIn() - } - } - } - - Image { - id: imgOut - source: "images/zoomout.png" - x: 2 - y: 20 - MouseArea { - anchors.fill: parent - onClicked: { - zoomOut() - } - } - } -} diff --git a/util/qt3d/assetviewer/qml/Widgets/images/grow.png b/util/qt3d/assetviewer/qml/Widgets/images/grow.png Binary files differdeleted file mode 100644 index df154010..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/images/grow.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/Widgets/images/shrink.png b/util/qt3d/assetviewer/qml/Widgets/images/shrink.png Binary files differdeleted file mode 100644 index 285d3a9d..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/images/shrink.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/Widgets/images/zoomin.png b/util/qt3d/assetviewer/qml/Widgets/images/zoomin.png Binary files differdeleted file mode 100644 index e4434a07..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/images/zoomin.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/Widgets/images/zoomout.png b/util/qt3d/assetviewer/qml/Widgets/images/zoomout.png Binary files differdeleted file mode 100644 index 4c853bc6..00000000 --- a/util/qt3d/assetviewer/qml/Widgets/images/zoomout.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/fileHandling.js b/util/qt3d/assetviewer/qml/fileHandling.js deleted file mode 100644 index 6ccfb1a1..00000000 --- a/util/qt3d/assetviewer/qml/fileHandling.js +++ /dev/null @@ -1,106 +0,0 @@ -function save_qml(closePrompt) { - - var effectData = ""; - if (useCustomEffect) { - effectData += - " effect: Effect {\n" + - " decal: " + customEffect.decal + "\n" + - " blending: " + customEffect.blending + "\n"; - - if (useCustomMaterial) { - effectData += - " material: Material {\n" + - " ambientColor: \"" + modelMaterial.ambientColor + "\"\n" + - " diffuseColor: \"" + modelMaterial.diffuseColor + "\"\n" + - " specularColor: \"" + modelMaterial.specularColor + "\"\n" + - " shininess: " + modelMaterial.shininess + "\n" + - " textureUrl: \"" + modelMaterial.textureUrl + "\"\n" + - " }\n" - } else { - effectData += - " color: \"" + modelEffect.color + "\"\n" + - " texture: \"" + modelEffect.texture + "\"\n" - } - - effectData += " }\n" - } - - var saveData = - "// --------| WARNING |--------!!\n" + - "// This is a generated file. Modifying the text or layout of \n" + - "// this file will mean that the 3D Asset Viewer application will no \n" + - "// longer be able to read it. \n\n" + - "// Changing numeric values is allowable, though care should be taken\n" + - "// not to inadvertantly change the file structure.\n\n" + - "import QtQuick 1.0\n" + - "import Qt3D 1.0\n" + - "\n" + - "Item3D {\n" + - " property double translateX: 0; \n"+ - " property double translateY: 0; \n"+ - " property double translateZ: 0; \n"+ - " property double rotationX: 0; \n"+ - " property double rotationY: 0; \n"+ - " property double rotationZ: 0; \n"+ - " property double assetScale: 1.0; \n"+ - - " Translation3D {\n" + - " id: transformTranslate\n" + - " translate: Qt.vector3d(" + - transformTranslate.translate.x + "+translateX, " + - transformTranslate.translate.y + "+translateY, " + - transformTranslate.translate.z + "+translateZ)\n" + - " }\n" + - "\n" + - " Rotation3D {\n" + - " id: transformRotateX\n" + - " angle: " + transformRotateX.angle + "+rotationX\n" + - " axis: Qt.vector3d(1, 0, 0)\n" + - " }\n" + - "\n" + - " Rotation3D {\n" + - " id: transformRotateY\n" + - " angle: " + transformRotateY.angle + "+rotationY\n" + - " axis: Qt.vector3d(0, 1, 0)\n" + - " }\n" + - "\n" + - " Rotation3D {\n" + - " id: transformRotateZ\n" + - " angle: " + transformRotateZ.angle + "+rotationZ\n" + - " axis: Qt.vector3d(0, 0, 1)\n" + - " }\n" + - "\n" + - " Scale3D {\n" + - " id: transformScale\n" + - " scale: Qt.vector3d(" + - transformScale.scale.x + "*assetScale, " + - transformScale.scale.y + "*assetScale, " + - transformScale.scale.z + "*assetScale)\n" + - " }\n" + - "\n" + - " Mesh {\n" + - " id: source_mesh\n" + - " source: \"%1\"\n" + - " }\n" + - "\n" + - " mesh: source_mesh\n" + - " transform: [\n" + - " transformScale,\n" + - " transformRotateX,\n" + - " transformRotateY,\n" + - " transformRotateZ,\n" + - " transformTranslate,\n" + - " ]\n" + - effectData + - "}\n"; - - quickFile.filename = source_mesh.source - quickFile.data = saveData - if (closePrompt) - var result = quickFile.promptSave() - else - result = quickFile.save() - - if (result !== "") - console.log("If there was an error it will be after here:" + result) -} diff --git a/util/qt3d/assetviewer/qml/images/help.png b/util/qt3d/assetviewer/qml/images/help.png Binary files differdeleted file mode 100644 index 452ac525..00000000 --- a/util/qt3d/assetviewer/qml/images/help.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/lock.png b/util/qt3d/assetviewer/qml/images/lock.png Binary files differdeleted file mode 100644 index cafd8fc5..00000000 --- a/util/qt3d/assetviewer/qml/images/lock.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/minus.png b/util/qt3d/assetviewer/qml/images/minus.png Binary files differdeleted file mode 100644 index a93156ea..00000000 --- a/util/qt3d/assetviewer/qml/images/minus.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/model.png b/util/qt3d/assetviewer/qml/images/model.png Binary files differdeleted file mode 100644 index 62054e3c..00000000 --- a/util/qt3d/assetviewer/qml/images/model.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/open.png b/util/qt3d/assetviewer/qml/images/open.png Binary files differdeleted file mode 100644 index 5db00d52..00000000 --- a/util/qt3d/assetviewer/qml/images/open.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/plus.png b/util/qt3d/assetviewer/qml/images/plus.png Binary files differdeleted file mode 100644 index b1ba3774..00000000 --- a/util/qt3d/assetviewer/qml/images/plus.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/save.png b/util/qt3d/assetviewer/qml/images/save.png Binary files differdeleted file mode 100644 index e1db4498..00000000 --- a/util/qt3d/assetviewer/qml/images/save.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/images/unlock.png b/util/qt3d/assetviewer/qml/images/unlock.png Binary files differdeleted file mode 100644 index 80c3f945..00000000 --- a/util/qt3d/assetviewer/qml/images/unlock.png +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/meshes/monkey.3ds b/util/qt3d/assetviewer/qml/meshes/monkey.3ds Binary files differdeleted file mode 100644 index e9a007b2..00000000 --- a/util/qt3d/assetviewer/qml/meshes/monkey.3ds +++ /dev/null diff --git a/util/qt3d/assetviewer/qml/meshes/penguin.3ds b/util/qt3d/assetviewer/qml/meshes/penguin.3ds Binary files differdeleted file mode 100644 index 26c09ac0..00000000 --- a/util/qt3d/assetviewer/qml/meshes/penguin.3ds +++ /dev/null diff --git a/util/qt3d/assetviewer/qtquick3d.ico b/util/qt3d/assetviewer/qtquick3d.ico Binary files differdeleted file mode 100644 index c695ac72..00000000 --- a/util/qt3d/assetviewer/qtquick3d.ico +++ /dev/null diff --git a/util/qt3d/assetviewer/qtquick3d.png b/util/qt3d/assetviewer/qtquick3d.png Binary files differdeleted file mode 100644 index 8351083e..00000000 --- a/util/qt3d/assetviewer/qtquick3d.png +++ /dev/null diff --git a/util/qt3d/assetviewer/quickfile.cpp b/util/qt3d/assetviewer/quickfile.cpp deleted file mode 100644 index 3fead170..00000000 --- a/util/qt3d/assetviewer/quickfile.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include "quickfile.h" -#include <QFileDialog> -#include <QUrl> - #include <QMessageBox> - -/*! - \qmlclass QuickFile QuickFile - \brief QuickFile is a quick-and-dirty file handling object that supports file-io that QML/Javascript doesn't. - \inherits QObject - - The QuickFile element is part of the \c{ModelTweak} namespace, - so the following must appear at the top of any QML file that - references it: - - \code - import ModelTweak 1.0 - \endcode - - \sa QObject -*/ - -/*! - \internal -*/ -QuickFile::QuickFile(QObject *parent) : - QObject(parent) -{ -} - -/*! - Prompts for a location and filename to save the qml \c{QuickFile::data} generated by ModelTweaker. - Returns an error message if the file was unsuccessfully saved, - or an empty string if the save was successful/cancelled. -*/ -QString QuickFile::save() const -{ - QString filename = QFileDialog::getSaveFileName(0, tr("Save QML File"), "",tr("Files (*.qml)")); - - //If cancel button pressed (ie. filename empty), we can just drop out immediately - if (filename.isEmpty()) { - return QString(); - } - - // FIXME: ensure fileName is appropriate as a qml Component - if (!filename.endsWith(".qml")) - filename.append(".qml"); - - QDir outputDir = QFileInfo(filename).absoluteDir(); - - QString modelFilename = QUrl(_filename).toLocalFile(); - QString modelFN = QFileInfo(modelFilename).fileName(); - - QString dstModelLocation = outputDir.path() + QDir::separator() + modelFN; - if (dstModelLocation.compare(modelFilename,Qt::CaseInsensitive) != 0) { - // src and dst model paths are different. - // Copy model file over. - qDebug("Attempting to copy:"); - qDebug(" from: %s",modelFilename.toAscii().constData()); - qDebug(" to : %s",dstModelLocation.toAscii().constData()); - QFile dstModelFile(dstModelLocation); - if (dstModelFile.exists()) { - if (!dstModelFile.remove()) { - qDebug(" failed to remove dst file!"); - } - } - QFile srcModelFile(modelFilename); - if (srcModelFile.copy(dstModelLocation)) { - qDebug(" Model was copied successfully."); - } else { - qDebug(" failed to copy model file !"); - } - } - - QFile file(filename); - - qDebug("Attempting to write: %s", file.fileName().toAscii().constData()); - - if (!file.open(QFile::WriteOnly)) - return file.errorString(); - - QString dataToWrite = _data.arg(modelFN); - - file.write(dataToWrite.toUtf8()); - - file.close(); - - return QString(); -} - -/*! - Save/Close dialog for unsaved changes to QML files. This is shown if the user - closes the app without saving the modifications they have made. - - Returns an error message if the file was unsuccessfully saved, - or an empty string if the save was successful/cancelled. -*/ -QString QuickFile::promptSave() const -{ - QMessageBox msgBox; - msgBox.setText("The document has been modified."); - msgBox.setInformativeText("Do you want to save your changes?"); - msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard); - msgBox.setDefaultButton(QMessageBox::Save); - int ret = msgBox.exec(); - - if (ret==QMessageBox::Save) { - return save(); - } else { - return QString(); - } -} - -/*! - Prompts for a location to load a model file from and stores it into the the \c{QuickFile::filename} - variable. -*/ -void QuickFile::load() -{ - QString qmlFilename = QFileDialog::getOpenFileName(0, _title, "", _filter); - setFilename(qmlFilename); -} - - -QString QuickFile::filename() const { - return _filename; -} - -void QuickFile::setFilename(const QString filename) { - if (_filename != filename) - _filename = filename; - emit filenameChanged(filename); -} - -QString QuickFile::title() const { - return _title; -} - -void QuickFile::setTitle(const QString title) { - if (_title != title) - _title = title; - emit titleChanged(title); -} - -QString QuickFile::filter() const { - return _filter; -} - -void QuickFile::setFilter(const QString filter) { - if (_filter != filter) - _filter = filter; - emit filterChanged(filter); -} - -QString QuickFile::data() const { - return _data; -} - -void QuickFile::setData(const QString data) { - if (_data != data) - _data = data; - emit dataChanged(data); -} - diff --git a/util/qt3d/assetviewer/quickfile.h b/util/qt3d/assetviewer/quickfile.h deleted file mode 100644 index 1c66c60b..00000000 --- a/util/qt3d/assetviewer/quickfile.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef QUICKFILE_H -#define QUICKFILE_H - -#include <QObject> - -class QuickFile : public QObject -{ - Q_OBJECT - - QString _filename; - QString _title; - QString _filter; - QString _data; - - Q_PROPERTY(QString filename READ filename WRITE setFilename NOTIFY filenameChanged) - Q_PROPERTY(QString title READ title WRITE setTitle NOTIFY titleChanged) - Q_PROPERTY(QString filter READ filter WRITE setFilter NOTIFY filterChanged) - Q_PROPERTY(QString data READ data WRITE setData NOTIFY dataChanged) - -public: - explicit QuickFile(QObject *parent = 0); - - QString filename() const; - void setFilename(const QString filename); - - QString title() const; - void setTitle(const QString title); - - QString filter() const; - void setFilter(const QString filter); - - QString data() const; - void setData(const QString data); - - Q_INVOKABLE QString save() const; - Q_INVOKABLE void load(); - Q_INVOKABLE QString promptSave() const; - -signals: - void filenameChanged(const QString newFilename); - void titleChanged(const QString newTitle); - void filterChanged(const QString newFilter); - void dataChanged(const QString newData); -}; - -#endif // QUICKFILE_H diff --git a/util/qt3d/qglinfo/aboutdialog.cpp b/util/qt3d/qglinfo/aboutdialog.cpp deleted file mode 100644 index 8598cd55..00000000 --- a/util/qt3d/qglinfo/aboutdialog.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "aboutdialog.h" -#include "ui_aboutdialog.h" - -AboutDialog::AboutDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::AboutDialog) -{ - ui->setupUi(this); -} - -AboutDialog::~AboutDialog() -{ - delete ui; -} - -void AboutDialog::changeEvent(QEvent *e) -{ - QDialog::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} - -void AboutDialog::on_pushButton_clicked() -{ - close(); -} diff --git a/util/qt3d/qglinfo/aboutdialog.h b/util/qt3d/qglinfo/aboutdialog.h deleted file mode 100644 index fee94a28..00000000 --- a/util/qt3d/qglinfo/aboutdialog.h +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef ABOUTDIALOG_H -#define ABOUTDIALOG_H - -#include <QDialog> - -namespace Ui { - class AboutDialog; -} - -class AboutDialog : public QDialog { - Q_OBJECT -public: - AboutDialog(QWidget *parent = 0); - ~AboutDialog(); - -protected: - void changeEvent(QEvent *e); - -private: - Ui::AboutDialog *ui; - -private slots: - void on_pushButton_clicked(); -}; - -#endif // ABOUTDIALOG_H diff --git a/util/qt3d/qglinfo/aboutdialog.ui b/util/qt3d/qglinfo/aboutdialog.ui deleted file mode 100644 index 7408bc1e..00000000 --- a/util/qt3d/qglinfo/aboutdialog.ui +++ /dev/null @@ -1,54 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>AboutDialog</class> - <widget class="QDialog" name="AboutDialog"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>157</width> - <height>170</height> - </rect> - </property> - <property name="windowTitle"> - <string>About</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Lucida Grande'; font-size:13pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt;">QGL Info Tool</span></p></body></html></string> - </property> - </widget> - </item> - <item> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string/> - </property> - <property name="pixmap"> - <pixmap resource="qglinfo.qrc">:/images/teapot</pixmap> - </property> - <property name="alignment"> - <set>Qt::AlignCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="pushButton"> - <property name="text"> - <string>Ok</string> - </property> - </widget> - </item> - </layout> - </widget> - <resources> - <include location="qglinfo.qrc"/> - </resources> - <connections/> -</ui> diff --git a/util/qt3d/qglinfo/fpswidget.cpp b/util/qt3d/qglinfo/fpswidget.cpp deleted file mode 100644 index 3c9ee1e8..00000000 --- a/util/qt3d/qglinfo/fpswidget.cpp +++ /dev/null @@ -1,279 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "fpswidget.h" - -#include <QtCore/qtimer.h> -#include <QtCore/qdatetime.h> - -static GLfloat materialColor[] = { 0.1f, 0.85f, 0.25f, 1.0f }; - -// dont drive the updates any faster than every this many millisecondss -#define MAX_ANIM_FREQUENCY 5 - -#define QGL_CUBE_SIZE (6 * 6 * (3 + 3)) -static float const cubeVertices[QGL_CUBE_SIZE] = { - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, - -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, - - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, - - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, - - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, -}; - -FPSWidget::FPSWidget(QWidget *parent) - : QGLWidget(parent) - , time(new QTime()) - , frameTime(new QTime()) - , timer(new QTimer(this)) - , goAwayTimer(new QTimer(this)) - , xrot(0) - , yrot(0) - , zrot(0) - , frameElapsed(0) - , frameCount(0) - , totalFrameTime(0) -{ - setAttribute(Qt::WA_DeleteOnClose); - setWindowTitle(tr("Generating Frames/Second")); - time->start(); - frameTime->start(); - connect(timer, SIGNAL(timeout()), - this, SLOT(animate())); - timer->start(0); // call the animation as soon as we return to the event loop - goAwayTimer = new QTimer(this); - connect(goAwayTimer, SIGNAL(timeout()), - this, SLOT(close())); - goAwayTimer->start(30000); -} - -FPSWidget::~FPSWidget() -{ - delete time; -} - -#if defined(QT_OPENGL_ES_2) - -void FPSWidget::setupShaders() -{ - QGLShader *vshader = new QGLShader(QGLShader::Vertex, this); - const char *vsrc = { - "attribute highp vec4 vertex;\n" - "attribute mediump vec3 normal;\n" - "uniform mediump mat4 matrix;\n" - "varying mediump float angle;\n" - "void main(void)\n" - "{\n" - " vec3 toLight = normalize(vec3(0.5, 5.0, 7.0));\n" - " angle = max(dot(normal, toLight), 0.0);\n" - " gl_Position = matrix * vertex;\n" - "}\n" - }; - vshader->compileSourceCode(vsrc); - - QGLShader *fshader = new QGLShader(QGLShader::Fragment, this); - const char *fsrc = { - "uniform mediump vec4 material;\n" - "varying mediump float angle;\n" - "void main(void)\n" - "{\n" - " gl_FragColor = material * 0.2 + material * 0.8 * angle;\n" - "}\n" - }; - fshader->compileSourceCode(fsrc); - - program.addShader(vshader); - program.addShader(fshader); - program.link(); - - vertexAttr = program.attributeLocation("vertex"); - normalAttr = program.attributeLocation("normal"); - matrixUniform = program.uniformLocation("matrix"); - materialUniform = program.uniformLocation("material"); - - program.bind(); -} - -#endif - -#ifndef GL_MULTISAMPLE -#define GL_MULTISAMPLE 0x809D -#endif - -void FPSWidget::initializeGL() -{ - glClearColor(0.9f, 0.95f, 0.8f, 1.0f); - glEnable(GL_DEPTH_TEST); - glEnable(GL_CULL_FACE); -#if defined(QT_OPENGL_ES_2) - setupShaders(); -#else - glShadeModel(GL_SMOOTH); - glEnable(GL_LIGHTING); - glEnable(GL_LIGHT0); - glEnable(GL_MULTISAMPLE); - static GLfloat lightPosition[4] = { 0.5, 5.0, 7.0, 1.0 }; - glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); -#endif -} - -void FPSWidget::resizeGL(int w, int h) -{ - glViewport(0, 0, w, h); -#if !defined(QT_OPENGL_ES_2) - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); -#endif - int side = qMin(w, h); - qreal ws = (qreal)w / (qreal)side; - qreal hs = (qreal)h / (qreal)side; -#if defined(QT_OPENGL_ES_2) - projection.setToIdentity(); - projection.ortho(-ws, ws, -hs, hs, -10.0f, 10.0f); -#else - glOrtho(-ws, ws, -hs, hs, -10.0f, 10.0f); -#endif -} - -void FPSWidget::paintGL() -{ - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - -#if !defined(QT_OPENGL_ES_2) - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glRotatef(xrot, 1.0, 0.0, 0.0); - glRotatef(yrot, 0.0, 1.0, 0.0); - glRotatef(zrot, 0.0, 0.0, 1.0); - - glVertexPointer(3, GL_FLOAT, 6 * sizeof(GLfloat), cubeVertices); - glEnableClientState(GL_VERTEX_ARRAY); - glNormalPointer(GL_FLOAT, 6 * sizeof(GLfloat), cubeVertices); - glEnableClientState(GL_NORMAL_ARRAY); - - glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, materialColor); - glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, materialColor); -#else - modelView.setToIdentity(); - modelView.rotate(xrot, 1.0f, 0.0f, 0.0f); - modelView.rotate(yrot, 0.0f, 1.0f, 0.0f); - modelView.rotate(zrot, 0.0f, 0.0f, 1.0f); - program.setUniformValue(matrixUniform, projection * modelView); - - QVector4D mat(materialColor[0], materialColor[1], - materialColor[2], materialColor[3]); - program.setUniformValue(materialUniform, mat); - - program.setAttributeArray(vertexAttr, cubeVertices, 3, 6 * sizeof(GLfloat)); - program.setAttributeArray(normalAttr, cubeVertices+3, 3, 6 * sizeof(GLfloat)); - program.enableAttributeArray(vertexAttr); - program.enableAttributeArray(normalAttr); -#endif - - glDrawArrays(GL_TRIANGLES, 0, 36); - -#if !defined(QT_OPENGL_ES_2) - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); -#else - program.disableAttributeArray(vertexAttr); - program.disableAttributeArray(normalAttr); -#endif - QString framesPerSecond = QString::fromLatin1("%1 fps").arg(1000.0f / ((qreal)totalFrameTime / (qreal)frameCount)); -} - -void FPSWidget::animate() -{ - int elapsed = time->restart(); - frameElapsed += elapsed; - if (frameElapsed > MAX_ANIM_FREQUENCY) - { - frameElapsed += elapsed; - int adv = frameElapsed / 10; - if (adv > 0) - { - frameCount += 1; - totalFrameTime += frameElapsed; - emit fps(1000.0f / ((qreal)frameTime->elapsed() / (qreal)frameCount)); - xrot = (xrot + adv) % 360; - yrot = (xrot + adv) % 360; - zrot = (xrot + adv) % 360; - update(); - frameElapsed = 0; - } - } -} diff --git a/util/qt3d/qglinfo/fpswidget.h b/util/qt3d/qglinfo/fpswidget.h deleted file mode 100644 index 495de4b9..00000000 --- a/util/qt3d/qglinfo/fpswidget.h +++ /dev/null @@ -1,93 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef FPSWIDGET_H -#define FPSWIDGET_H - -#include <QGLWidget> -#if defined(QT_OPENGL_ES_2) -#include <QtGui/qvector3d.h> -#include <QtGui/qmatrix4x4.h> -#include <QtOpenGL/qglshaderprogram.h> -#endif - -class QTime; -class QTimer; - -class FPSWidget : public QGLWidget -{ - Q_OBJECT -public: - FPSWidget(QWidget *parent = 0); - ~FPSWidget(); - void initializeGL(); - void resizeGL(int, int); - void paintGL(); -protected: - void keyPressEvent(QKeyEvent *) { close(); } - void mousePressEvent(QMouseEvent *) { close(); } -signals: - void fps(int); -private slots: - void animate(); -private: - QTime *time; - QTime *frameTime; - QTimer *timer; - QTimer *goAwayTimer; - int xrot, yrot, zrot; - int frameElapsed; - int frameCount; - int totalFrameTime; -#if defined(QT_OPENGL_ES_2) - void setupShaders(); - - QGLShaderProgram program; - QMatrix4x4 projection; - QMatrix4x4 modelView; - int vertexAttr; - int normalAttr; - int matrixUniform; - int materialUniform; -#endif -}; - -#endif // FPSWIDGET_H diff --git a/util/qt3d/qglinfo/images/teapot-logo.png b/util/qt3d/qglinfo/images/teapot-logo.png Binary files differdeleted file mode 100644 index a82c33c1..00000000 --- a/util/qt3d/qglinfo/images/teapot-logo.png +++ /dev/null diff --git a/util/qt3d/qglinfo/main.cpp b/util/qt3d/qglinfo/main.cpp deleted file mode 100644 index 317676c4..00000000 --- a/util/qt3d/qglinfo/main.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QApplication> - -#include "qglinfowindow.h" - -int main(int argc, char *argv[]) -{ - QApplication app(argc, argv); - - // for QSettings - QCoreApplication::setOrganizationName("Nokia"); - QCoreApplication::setOrganizationDomain("nokia.com"); - QCoreApplication::setApplicationName("qglinfo"); - - QGLInfoWindow w; - if (QApplication::arguments().contains(QLatin1String("-maximize"))) - w.showMaximized(); - else if (QApplication::arguments().contains(QLatin1String("-fullscreen"))) - w.showFullScreen(); - else - w.show(); - - return app.exec(); -} diff --git a/util/qt3d/qglinfo/qglinfo.cpp b/util/qt3d/qglinfo/qglinfo.cpp deleted file mode 100644 index e58d1005..00000000 --- a/util/qt3d/qglinfo/qglinfo.cpp +++ /dev/null @@ -1,344 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qglinfo.h" - -#include <QtOpenGL/qgl.h> -#include <QtOpenGL/qglpixelbuffer.h> -#include <QtOpenGL/qglframebufferobject.h> -#include <QtOpenGL/qglshaderprogram.h> - -#include <QtCore/qtimer.h> -#include <QtCore/qdatetime.h> - -#include <QtCore/qsettings.h> - -#if !defined(QT_NO_EGL) && defined(QT_BUILD_INTERNAL) -#include <QtGui/private/qegl_p.h> -#include <QtGui/private/qeglproperties_p.h> -#endif - -QGLInfo::QGLInfo(QObject *parent) - : QObject(parent) -{ - QTimer::singleShot(0, this, SLOT(initialize())); -} - -static QString nice(const QString &s) -{ - QString r(s); - r.replace(QLatin1String("\n"), QLatin1String("<br>\n")); - r.replace(QLatin1String("true"), QLatin1String("<span style=\"color: green\">true</span>")); - r.replace(QLatin1String("false"), QLatin1String("<span style=\"color: red\">false</span>")); - return r; -} - -void QGLInfo::initialize() -{ - QWidget *win = qobject_cast<QGLWidget *>(parent()); - // We need some kind of GL context to do the querying. - QGLWidget *glWidget = new QGLWidget(win); - glWidget->makeCurrent(); - m_qtGLVersionInfo = reportQtGLVersionInfo(); - m_qtGLFeatures = reportQtGLFeatures(); - m_glVersionInfo = reportGLVersionInfo(); - m_glExtensionInfo = reportGLExtensionInfo(); - m_eglVersionInfo = reportEGLVersionInfo(); - m_eglExtensionInfo = reportEGLExtensionInfo(); - m_eglConfigInfo = reportEGLConfigInfo(); - glWidget->doneCurrent(); - delete glWidget; - - QString welcome; - { - QSettings freshStart; - if (!freshStart.contains(QLatin1String("new_install"))) - { - welcome = QLatin1String("<h1>Welcome to QtQuick 3D!</h1>" - "<p>Try running the FPS test from the " - "View menu above to confirm that Qt3Quick 3D " - "is installed correctly.</p><hr>"); - } - freshStart.setValue(QLatin1String("new_install"), true); - } - - QString html = tr("<h1>Qt GL Info Report</h1>" - "<p>Generated at: %1</p>" - "<h2>Qt GL Version Info</h2>" - "<p>%2</p>" - "<h2>Qt GL Features</h2>" - "<p>%3</p>" - "<h2>GL Version Info</h2>" - "<p>%4</p>" - "<h2>GL Extension Info</h2>" - "<p>%5</p>") - .arg(QDateTime::currentDateTime().toString()) - .arg(nice(m_qtGLVersionInfo)) - .arg(nice(m_qtGLFeatures)) - .arg(nice(m_glVersionInfo)) - .arg(nice(m_glExtensionInfo)); - if (!welcome.isEmpty()) - html.prepend(welcome); - -#if !defined(QT_NO_EGL) - html += tr("<h2>EGL Version Info</h2>" - "<p>%1</p>" - "<h2>EGL Extension Info</h2>" - "<p>%2</p>" - "<h2>EGL Configurations</h2>" - "<p>%3</p>") - .arg(nice(m_eglVersionInfo)) - .arg(nice(m_eglExtensionInfo)) - .arg(nice(m_eglConfigInfo)); -#endif - emit reportHtml(html); -} - -QString QGLInfo::report() const -{ - QString report; - report += m_qtGLVersionInfo; - report += QLatin1Char('\n'); - report += m_qtGLFeatures; - report += m_glVersionInfo; - report += tr("OpenGL extensions:\n"); - report += m_glExtensionInfo; -#if !defined(QT_NO_EGL) - report += m_eglVersionInfo; - report += tr("EGL extensions:\n"); - report += m_eglExtensionInfo; - report += tr("EGL configurations:\n"); - report += m_eglConfigInfo; -#endif - return report; -} - -QString QGLInfo::reportQtGLVersionInfo() const -{ - // Dump what Qt thinks the version is. - QGLFormat::OpenGLVersionFlags flags = QGLFormat::openGLVersionFlags(); - QByteArray version; - if ((flags & QGLFormat::OpenGL_Version_1_1) != 0) - version += "1.1 "; - if ((flags & QGLFormat::OpenGL_Version_1_2) != 0) - version += "1.2 "; - if ((flags & QGLFormat::OpenGL_Version_1_3) != 0) - version += "1.3 "; - if ((flags & QGLFormat::OpenGL_Version_1_4) != 0) - version += "1.4 "; - if ((flags & QGLFormat::OpenGL_Version_1_5) != 0) - version += "1.5 "; - if ((flags & QGLFormat::OpenGL_Version_2_0) != 0) - version += "2.0 "; - if ((flags & QGLFormat::OpenGL_Version_2_1) != 0) - version += "2.1 "; - if ((flags & QGLFormat::OpenGL_Version_3_0) != 0) - version += "3.0 "; - if ((flags & QGLFormat::OpenGL_Version_3_1) != 0) - version += "3.1 "; - if ((flags & QGLFormat::OpenGL_Version_3_2) != 0) - version += "3.2 "; - if ((flags & QGLFormat::OpenGL_Version_3_3) != 0) - version += "3.3 "; - if ((flags & QGLFormat::OpenGL_Version_4_0) != 0) - version += "4.0 "; - if ((flags & QGLFormat::OpenGL_ES_Common_Version_1_0) != 0) - version += "ES/1.0 "; - if ((flags & QGLFormat::OpenGL_ES_CommonLite_Version_1_0) != 0) - version += "ES/1.0CL "; - if ((flags & QGLFormat::OpenGL_ES_Common_Version_1_1) != 0) - version += "ES/1.1 "; - if ((flags & QGLFormat::OpenGL_ES_CommonLite_Version_1_1) != 0) - version += "ES/1.1CL "; - if ((flags & QGLFormat::OpenGL_ES_Version_2_0) != 0) - version += "ES/2.0 "; - flags &= ~(QGLFormat::OpenGL_Version_1_1 | - QGLFormat::OpenGL_Version_1_2 | - QGLFormat::OpenGL_Version_1_3 | - QGLFormat::OpenGL_Version_1_4 | - QGLFormat::OpenGL_Version_1_5 | - QGLFormat::OpenGL_Version_2_0 | - QGLFormat::OpenGL_Version_2_1 | - QGLFormat::OpenGL_Version_3_0 | - QGLFormat::OpenGL_Version_3_1 | - QGLFormat::OpenGL_Version_3_2 | - QGLFormat::OpenGL_Version_3_3 | - QGLFormat::OpenGL_Version_4_0 | - QGLFormat::OpenGL_ES_Common_Version_1_0 | - QGLFormat::OpenGL_ES_CommonLite_Version_1_0 | - QGLFormat::OpenGL_ES_Common_Version_1_1 | - QGLFormat::OpenGL_ES_CommonLite_Version_1_1 | - QGLFormat::OpenGL_ES_Version_2_0); - if (flags != 0) - version += "Other=0x" + QByteArray::number(int(flags), 16); - return QLatin1String("QGLFormat::openGLVersionFlags: ") + - QString::fromLatin1(version.constData()); -} - -static QString printBool(const char *text, bool value) -{ - return QLatin1String(text) + (value ? QLatin1String("true\n") : QLatin1String("false\n")); -} - -QString QGLInfo::reportQtGLFeatures() const -{ - QString d; - d += printBool("QGLFormat::hasOpenGL: ", QGLFormat::hasOpenGL()); - d += printBool("QGLFormat::hasOpenGLOverlays: ", QGLFormat::hasOpenGLOverlays()); - d += printBool("QGLPixelBuffer::hasOpenGLPbuffers: ", QGLPixelBuffer::hasOpenGLPbuffers()); - d += printBool("QGLFramebufferObject::hasOpenGLFramebufferObjects: ", - QGLFramebufferObject::hasOpenGLFramebufferObjects()); - d += printBool("QGLFramebufferObject::hasOpenGLFramebufferBlit: ", - QGLFramebufferObject::hasOpenGLFramebufferBlit()); - d += printBool("QGLShaderProgram::hasOpenGLShaderPrograms: ", - QGLShaderProgram::hasOpenGLShaderPrograms()); - return d; -} - -QString QGLInfo::reportGLVersionInfo() const -{ - QString d; - d += QLatin1String("OpenGL vendor string: "); - d += QLatin1String(reinterpret_cast<const char *>(glGetString(GL_VENDOR))); - d += QLatin1String("\n"); - d += QLatin1String("OpenGL renderer string: "); - d += QLatin1String(reinterpret_cast<const char *>(glGetString(GL_RENDERER))); - d += QLatin1String("\n"); - d += QLatin1String("OpenGL version string: "); - d += QLatin1String(reinterpret_cast<const char *>(glGetString(GL_VERSION))); - d += QLatin1String("\n"); - return d; -} - -QString QGLInfo::reportGLExtensionInfo() const -{ - QByteArray extString - (reinterpret_cast<const char *>(glGetString(GL_EXTENSIONS))); - return formatExtensions(extString); -} - -QString QGLInfo::formatExtensions(const QByteArray& extString) const -{ - QString d; - QList<QByteArray> extns = extString.split(' '); - qSort(extns); - QByteArray line; - foreach (QByteArray extn, extns) { - if (extn.isEmpty()) - continue; - if (!line.isEmpty() && (line.size() + extn.size() + 1) > 70) { - d += QLatin1String(" ") + - QString::fromLatin1(line.constData()) + - QLatin1String("\n"); - line = QByteArray(); - } - line += extn; - line += char(' '); - } - if (!line.isEmpty()) { - d += QLatin1String(" ") + - QString::fromLatin1(line.constData()) + - QLatin1String("\n"); - } - return d; -} - -QString QGLInfo::reportEGLVersionInfo() const -{ -#if !defined(QT_NO_EGL) && defined(QT_BUILD_INTERNAL) - QString d; - EGLDisplay dpy = eglGetCurrentDisplay(); - d += "EGL vendor string: "; - d += reinterpret_cast<const char *>(eglQueryString(dpy, EGL_VENDOR)); - d += "\n"; - d += "EGL version string: "; - d += reinterpret_cast<const char *>(eglQueryString(dpy, EGL_VERSION)); - d += "\n"; -#ifdef EGL_CLIENT_APIS - d += "EGL client API's: "; - d += reinterpret_cast<const char *>(eglQueryString(dpy, EGL_CLIENT_APIS)); - d += "\n"; -#endif - return d; -#else - return QString(); -#endif -} - -QString QGLInfo::reportEGLExtensionInfo() const -{ -#if !defined(QT_NO_EGL) && defined(QT_BUILD_INTERNAL) - EGLDisplay dpy = eglGetCurrentDisplay(); - QByteArray extString - (reinterpret_cast<const char *>(eglQueryString(dpy, EGL_EXTENSIONS))); - return formatExtensions(extString); -#else - return QString(); -#endif -} - -QString QGLInfo::reportEGLConfigInfo() const -{ -#if !defined(QT_NO_EGL) && defined(QT_BUILD_INTERNAL) - QString d; - QEglProperties props; - EGLint count = 0; - EGLDisplay dpy = eglGetCurrentDisplay(); - EGLContext ctx = eglGetCurrentContext(); - EGLint cfgnum = 0; - if (eglQueryContext(dpy, ctx, EGL_CONFIG_ID, &cfgnum)) { - d += QLatin1String("Window configuration in use: ") + QString::number(cfgnum) + - QLatin1String("\n\n"); - } - if (!eglGetConfigs(dpy, 0, 0, &count) || count < 1) - return d; - EGLConfig *configs = new EGLConfig [count]; - eglGetConfigs(dpy, configs, count, &count); - for (EGLint index = 0; index < count; ++index) { - props = QEglProperties(configs[index]); - d += props.toString() + QLatin1String("\n\n"); - } - delete [] configs; - return d; -#else - return QString(); -#endif -} diff --git a/util/qt3d/qglinfo/qglinfo.h b/util/qt3d/qglinfo/qglinfo.h deleted file mode 100644 index 53aa47dc..00000000 --- a/util/qt3d/qglinfo/qglinfo.h +++ /dev/null @@ -1,78 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGLINFO_H -#define QGLINFO_H - -#include <QtCore/qstring.h> -#include <QtCore/qobject.h> -#include <QtCore/qbytearray.h> - -class QGLInfo : public QObject -{ - Q_OBJECT -public: - QGLInfo(QObject *parent = 0); - QString report() const; -signals: - void reportHtml(const QString &); -private slots: - void initialize(); -private: - QString reportQtGLVersionInfo() const; - QString reportQtGLFeatures() const; - QString reportGLVersionInfo() const; - QString reportGLExtensionInfo() const; - QString reportEGLVersionInfo() const; - QString reportEGLExtensionInfo() const; - QString reportEGLConfigInfo() const; - QString formatExtensions(const QByteArray& extString) const; - - QString m_qtGLVersionInfo; - QString m_qtGLFeatures; - QString m_glVersionInfo; - QString m_glExtensionInfo; - QString m_eglVersionInfo; - QString m_eglExtensionInfo; - QString m_eglConfigInfo; -}; - -#endif // QGLINFO_H diff --git a/util/qt3d/qglinfo/qglinfo.pro b/util/qt3d/qglinfo/qglinfo.pro deleted file mode 100644 index a2b6a140..00000000 --- a/util/qt3d/qglinfo/qglinfo.pro +++ /dev/null @@ -1,25 +0,0 @@ -TARGET = qglinfo - -CONFIG += qt3d_deploy_pkg -include(../../../pkg.pri) - -SOURCES += main.cpp \ - qglinfowindow.cpp \ - qglinfo.cpp \ - aboutdialog.cpp \ - fpswidget.cpp - -FORMS += qglinfowindow.ui \ - aboutdialog.ui -HEADERS += qglinfowindow.h \ - qglinfo.h \ - aboutdialog.h \ - fpswidget.h -RESOURCES += qglinfo.qrc - -!contains(QT_CONFIG, egl):DEFINES += QT_NO_EGL - -OTHER_FILES += \ - qglinfo.rc - -RC_FILE = qglinfo.rc diff --git a/util/qt3d/qglinfo/qglinfo.qrc b/util/qt3d/qglinfo/qglinfo.qrc deleted file mode 100644 index 1406cc27..00000000 --- a/util/qt3d/qglinfo/qglinfo.qrc +++ /dev/null @@ -1,5 +0,0 @@ -<RCC> - <qresource prefix="/images"> - <file alias="teapot">images/teapot-logo.png</file> - </qresource> -</RCC> diff --git a/util/qt3d/qglinfo/qglinfo.rc b/util/qt3d/qglinfo/qglinfo.rc deleted file mode 100644 index 1b6228c9..00000000 --- a/util/qt3d/qglinfo/qglinfo.rc +++ /dev/null @@ -1 +0,0 @@ -IDI_ICON1 ICON DISCARDABLE "qtquick3d.ico" diff --git a/util/qt3d/qglinfo/qglinfowindow.cpp b/util/qt3d/qglinfo/qglinfowindow.cpp deleted file mode 100644 index ba189ba6..00000000 --- a/util/qt3d/qglinfo/qglinfowindow.cpp +++ /dev/null @@ -1,162 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qglinfowindow.h" -#include "qglinfo.h" -#include "ui_qglinfowindow.h" -#include "aboutdialog.h" -#include "fpswidget.h" - -#include <QtOpenGL/qgl.h> -#include <QtGui/qfiledialog.h> -#include <QtGui/qfont.h> -#include <QtCore/qdir.h> -#include <QtCore/qfile.h> -#include <QtCore/QTextStream> - -QGLInfoWindow::QGLInfoWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::QGLInfoWindow) -{ - ui->setupUi(this); - setStatusBar(0); - if (QApplication::arguments().contains(QLatin1String("-maximize")) || - QApplication::arguments().contains(QLatin1String("-fullscreen"))) - { - ui->verticalLayout->setMargin(1); - ui->verticalLayout->setContentsMargins(1, 1, 1, 1); - ui->verticalLayout_2->setMargin(1); - ui->verticalLayout_2->setContentsMargins(1, 1, 1, 1); - ui->menubar->setVisible(false); - connect(ui->quitPushButton, SIGNAL(clicked()), - this, SLOT(on_actionQuit_triggered())); - connect(ui->runFPSTestPushButton, SIGNAL(clicked()), - this, SLOT(on_actionRun_FPS_Test_triggered())); - connect(ui->saveAsPushButton, SIGNAL(clicked()), - this, SLOT(on_action_Save_As_triggered())); - QFont f = font(); - f.setPointSize(f.pointSize() * 1.4); - setFont(f); - } - else - { - ui->buttonsWidget->setVisible(false); - } - info = new QGLInfo(); - connect(info, SIGNAL(reportHtml(QString)), - ui->textBrowser, SLOT(setHtml(QString))); - ui->fpsWidget->setVisible(false); -} - -QGLInfoWindow::~QGLInfoWindow() -{ - delete ui; - delete info; -} - -void QGLInfoWindow::changeEvent(QEvent *e) -{ - QMainWindow::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} - -void QGLInfoWindow::on_actionQuit_triggered() -{ - qApp->quit(); -} - -void QGLInfoWindow::on_action_Save_As_triggered() -{ - QString defName = QDir::home().absoluteFilePath(QLatin1String("qglinfo.txt")); - - QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), - defName, - tr("Text (*.txt)")); - if (!fileName.isEmpty()) - { - QFile saveFile(fileName); - saveFile.open(QFile::WriteOnly); - { - QTextStream s(&saveFile); - s << info->report(); - } - saveFile.close(); - } -} - -void QGLInfoWindow::on_actionAbout_triggered() -{ - AboutDialog *about = new AboutDialog(this); - about->exec(); -} - -void QGLInfoWindow::on_actionRun_FPS_Test_triggered() -{ - fps = new FPSWidget(0); - fps->setGeometry(rect()); - fps->move(this->pos()); - connect(fps, SIGNAL(fps(int)), - ui->fpsLcdNumber, SLOT(display(int))); - ui->fpsWidget->setVisible(true); - fps->show(); -} - -void QGLInfoWindow::on_actionCopy_triggered() -{ - if (ui->textBrowser->textCursor().hasSelection()) { - ui->textBrowser->copy(); - } - else { - ui->textBrowser->selectAll(); - ui->textBrowser->copy(); - - QTextCursor tc(ui->textBrowser->textCursor()); - tc.clearSelection(); - tc.setPosition(0); - ui->textBrowser->setTextCursor(tc); - } -} diff --git a/util/qt3d/qglinfo/qglinfowindow.h b/util/qt3d/qglinfo/qglinfowindow.h deleted file mode 100644 index 84f7d41a..00000000 --- a/util/qt3d/qglinfo/qglinfowindow.h +++ /dev/null @@ -1,77 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). -** All rights reserved. -** Contact: Nokia Corporation (qt-info@nokia.com) -** -** This file is part of the QtQuick3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** GNU Lesser General Public License Usage -** This file may be used under the terms of the GNU Lesser General Public -** License version 2.1 as published by the Free Software Foundation and -** appearing in the file LICENSE.LGPL included in the packaging of this -** file. Please review the following information to ensure the GNU Lesser -** General Public License version 2.1 requirements will be met: -** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. -** -** In addition, as a special exception, Nokia gives you certain additional -** rights. These rights are described in the Nokia Qt LGPL Exception -** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU General -** Public License version 3.0 as published by the Free Software Foundation -** and appearing in the file LICENSE.GPL included in the packaging of this -** file. Please review the following information to ensure the GNU General -** Public License version 3.0 requirements will be met: -** http://www.gnu.org/copyleft/gpl.html. -** -** Other Usage -** Alternatively, this file may be used in accordance with the terms and -** conditions contained in a signed written agreement between you and Nokia. -** -** -** -** -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QGLINFOWINDOW_H -#define QGLINFOWINDOW_H - -#include <QMainWindow> - -namespace Ui { - class QGLInfoWindow; -} - -class QGLInfo; -class FPSWidget; - -class QGLInfoWindow : public QMainWindow { - Q_OBJECT -public: - QGLInfoWindow(QWidget *parent = 0); - ~QGLInfoWindow(); -public slots: - void on_actionQuit_triggered(); - void on_action_Save_As_triggered(); - -protected: - void changeEvent(QEvent *e); - -private: - Ui::QGLInfoWindow *ui; - QGLInfo *info; - FPSWidget *fps; - -private slots: - void on_actionRun_FPS_Test_triggered(); - void on_actionAbout_triggered(); - void on_actionCopy_triggered(); -}; - -#endif // QGLINFOWINDOW_H diff --git a/util/qt3d/qglinfo/qglinfowindow.ui b/util/qt3d/qglinfo/qglinfowindow.ui deleted file mode 100644 index 67723d35..00000000 --- a/util/qt3d/qglinfo/qglinfowindow.ui +++ /dev/null @@ -1,218 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>QGLInfoWindow</class> - <widget class="QMainWindow" name="QGLInfoWindow"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>555</width> - <height>584</height> - </rect> - </property> - <property name="sizePolicy"> - <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="windowTitle"> - <string>QGLInfo Window</string> - </property> - <widget class="QWidget" name="centralwidget"> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <widget class="QScrollArea" name="scrollArea"> - <property name="widgetResizable"> - <bool>true</bool> - </property> - <widget class="QWidget" name="scrollAreaWidgetContents"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>527</width> - <height>420</height> - </rect> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QTextBrowser" name="textBrowser"/> - </item> - </layout> - </widget> - </widget> - </item> - <item> - <widget class="QWidget" name="fpsWidget" native="true"> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QLabel" name="fpsLabel"> - <property name="text"> - <string>Frames Per Second:</string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QLCDNumber" name="fpsLcdNumber"> - <property name="layoutDirection"> - <enum>Qt::RightToLeft</enum> - </property> - <property name="frameShape"> - <enum>QFrame::Panel</enum> - </property> - <property name="frameShadow"> - <enum>QFrame::Sunken</enum> - </property> - <property name="lineWidth"> - <number>1</number> - </property> - <property name="midLineWidth"> - <number>3</number> - </property> - <property name="segmentStyle"> - <enum>QLCDNumber::Flat</enum> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>301</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QWidget" name="buttonsWidget" native="true"> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QPushButton" name="saveAsPushButton"> - <property name="text"> - <string>Save As</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="runFPSTestPushButton"> - <property name="text"> - <string> FPS Test</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>241</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="quitPushButton"> - <property name="text"> - <string>Quit</string> - </property> - </widget> - </item> - </layout> - </widget> - </item> - </layout> - </widget> - <widget class="QMenuBar" name="menubar"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>555</width> - <height>22</height> - </rect> - </property> - <widget class="QMenu" name="menuFile"> - <property name="title"> - <string>File</string> - </property> - <addaction name="action_Save_As"/> - <addaction name="actionQuit"/> - </widget> - <widget class="QMenu" name="menuEdit"> - <property name="title"> - <string>Edit</string> - </property> - <addaction name="actionCopy"/> - </widget> - <widget class="QMenu" name="menuAbout"> - <property name="title"> - <string>Help</string> - </property> - <addaction name="actionAbout"/> - </widget> - <widget class="QMenu" name="menuView"> - <property name="title"> - <string>View</string> - </property> - <addaction name="actionRun_FPS_Test"/> - </widget> - <addaction name="menuFile"/> - <addaction name="menuEdit"/> - <addaction name="menuView"/> - <addaction name="menuAbout"/> - </widget> - <action name="action_Save_As"> - <property name="text"> - <string>&Save As</string> - </property> - <property name="shortcut"> - <string>Ctrl+S</string> - </property> - </action> - <action name="actionQuit"> - <property name="text"> - <string>&Quit</string> - </property> - <property name="shortcut"> - <string>Ctrl+Q</string> - </property> - </action> - <action name="actionCopy"> - <property name="text"> - <string>&Copy</string> - </property> - <property name="shortcut"> - <string>Ctrl+C</string> - </property> - </action> - <action name="actionAbout"> - <property name="text"> - <string>About</string> - </property> - </action> - <action name="actionRun_FPS_Test"> - <property name="text"> - <string>&Run FPS Test</string> - </property> - <property name="shortcut"> - <string>Ctrl+R</string> - </property> - </action> - </widget> - <resources/> - <connections/> -</ui> diff --git a/util/qt3d/qglinfo/qtquick3d.ico b/util/qt3d/qglinfo/qtquick3d.ico Binary files differdeleted file mode 100644 index b3b85e37..00000000 --- a/util/qt3d/qglinfo/qtquick3d.ico +++ /dev/null diff --git a/util/qt3d/qt3d.pro b/util/qt3d/qt3d.pro deleted file mode 100644 index 4539ef6f..00000000 --- a/util/qt3d/qt3d.pro +++ /dev/null @@ -1,2 +0,0 @@ -TEMPLATE = subdirs -SUBDIRS = qglinfo assetviewer diff --git a/util/qt3d/qt3d.svg b/util/qt3d/qt3d.svg deleted file mode 100644 index 4b25ec50..00000000 --- a/util/qt3d/qt3d.svg +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0"?> -<!-- Converted with SVG Converter - Version 0.9.5 (Compiled Mon May 30 09:08:51 2011) - Copyright (C) 2011 Nokia --> -<svg xmlns="http://www.w3.org/2000/svg" width="287" version="1.1" height="286" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="tiny" id="svg2"> - <defs id="defs4"> - <linearGradient id="linearGradient4309"> - <stop offset="0" style="stop-color:#d4f301;stop-opacity:1;" id="stop4311"/> - <stop offset="1" style="stop-color:#d4f301;stop-opacity:0;" id="stop4313"/> - </linearGradient> - <linearGradient gradientTransform="matrix(1.0104795,0,0,1.004441,23.387309,76.758859)" id="linearGradient3730-2" y1="131.35715" y2="156.39526" x1="23.626827" gradientUnits="userSpaceOnUse" x2="303.57144"> - <stop offset="0" style="stop-color:#038d30;stop-opacity:1;" id="stop3726-7"/> - <stop offset="1" style="stop-color:#038d30;stop-opacity:0;" id="stop3728-1"/> - </linearGradient> - <linearGradient id="linearGradient3724-7"> - <stop offset="0" style="stop-color:#038d30;stop-opacity:1;" id="stop3726-7"/> - <stop offset="1" style="stop-color:#038d30;stop-opacity:0;" id="stop3728-1"/> - </linearGradient> - <linearGradient id="linearGradient4315" y1="62.920685" y2="62.920685" x1="72.492188" gradientUnits="userSpaceOnUse" x2="165.83203"> - <stop offset="0" style="stop-color:#d4f301;stop-opacity:1;" id="stop4311"/> - <stop offset="1" style="stop-color:#d4f301;stop-opacity:0;" id="stop4313"/> - </linearGradient> - </defs> - <metadata id="metadata7"/> - <g id="layer1" transform="translate(-25.071424,-77.933617)"> - <path style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#d4f301;stroke-width:8.85648727;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3722" d="M 149.39285,339.37194 C 118.29002,338.06386 93.410274,329.21846 78.267585,314.08502 66.239667,302.06444 58.159936,285.11057 54.818135,264.88047 c -1.962614,-11.881 -2.442596,-20.11519 -2.455216,-42.1199 -0.01051,-18.36712 0.160997,-23.0644 1.239861,-33.95521 2.529982,-25.53941 11.482605,-46.43472 25.677112,-59.93007 16.042727,-15.25252 39.462148,-23.21337 72.203768,-24.54383 6.77105,-0.27512 31.97542,0.38686 41.46813,1.08915 17.85829,1.32123 29.86273,4.01251 41.92069,9.39824 16.71724,7.46685 28.60768,18.52238 36.44553,33.88638 5.7477,11.26691 9.34961,23.29707 11.69339,39.05536 2.22754,14.97664 2.81073,44.00559 1.22086,60.77114 -2.76934,29.20404 -10.704,50.36949 -24.19378,64.53629 -8.65346,9.08774 -21.29946,16.39504 -35.37578,20.44137 -13.11053,3.76868 -25.14568,5.0858 -52.44498,5.73944 -13.81368,0.33078 -17.4242,0.35023 -22.82487,0.12311 l 0,0 z"/> - <rect width="236.93414" x="49.282932" y="102.78797" rx="95.84404" ry="92.255867" height="239.43414" style="opacity:0;fill:none;stroke:#008000;stroke-width:3.29858350999999980;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="rect2852"/> - <rect width="175" x="28.571428" y="19.214285" rx="95.84404" ry="92.255867" height="206.07143" style="opacity:0;fill:#b94b4b;fill-opacity:1;stroke:#05d105;stroke-width:4.147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="rect3704" transform="translate(25.071424,77.933617)"/> - <image width="172.71428" x="86.571419" y="214.50505" height="93.14286" xlink:href="data:image/png;base64,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 " id="image3149"/> - <image width="156.57143" x="89.857132" y="140.67836" height="65.897751" id="image3075" xlink:href="data:image/png;base64,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 "/> - <rect width="285.97864" x="26.028843" y="78.512794" rx="0" height="284.96848" ry="0" style="fill:#000000;fill-opacity:1;stroke:none;opacity:0" id="rect2995"/> - </g> - <g id="layer2"/> -</svg> diff --git a/util/qt3d/qtquick3d.svg b/util/qt3d/qtquick3d.svg deleted file mode 100644 index 3b8a5c7a..00000000 --- a/util/qt3d/qtquick3d.svg +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<!-- Converted with SVG Converter - Version 0.9.5 (Compiled Mon May 30 09:08:51 2011) - Copyright (C) 2011 Nokia --> -<svg xmlns="http://www.w3.org/2000/svg" width="287" version="1.1" height="286" xmlns:xlink="http://www.w3.org/1999/xlink" baseProfile="tiny" id="svg2"> - <defs id="defs4"> - <linearGradient gradientTransform="matrix(1.0104795,0,0,1.004441,23.387309,76.758859)" id="linearGradient3730-2" y1="131.35715" y2="156.39526" x1="23.626827" gradientUnits="userSpaceOnUse" x2="303.57144"> - <stop offset="0" style="stop-color:#038d30;stop-opacity:1;" id="stop3726-7"/> - <stop offset="1" style="stop-color:#038d30;stop-opacity:0;" id="stop3728-1"/> - </linearGradient> - <linearGradient id="linearGradient3724-7"> - <stop offset="0" style="stop-color:#038d30;stop-opacity:1;" id="stop3726-7"/> - <stop offset="1" style="stop-color:#038d30;stop-opacity:0;" id="stop3728-1"/> - </linearGradient> - </defs> - <metadata id="metadata7"/> - <g id="layer1" transform="translate(-25.071424,-77.933617)"> - <path style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#00ffff;stroke-width:8.85648727000000060;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="path3722" d="M 149.39285,339.37194 C 118.29002,338.06386 93.410274,329.21846 78.267585,314.08502 66.239667,302.06444 58.159936,285.11057 54.818135,264.88047 c -1.962614,-11.881 -2.442596,-20.11519 -2.455216,-42.1199 -0.01051,-18.36712 0.160997,-23.0644 1.239861,-33.95521 2.529982,-25.53941 11.482605,-46.43472 25.677112,-59.93007 16.042727,-15.25252 39.462148,-23.21337 72.203768,-24.54383 6.77105,-0.27512 31.97542,0.38686 41.46813,1.08915 17.85829,1.32123 29.86273,4.01251 41.92069,9.39824 16.71724,7.46685 28.60768,18.52238 36.44553,33.88638 5.7477,11.26691 9.34961,23.29707 11.69339,39.05536 2.22754,14.97664 2.81073,44.00559 1.22086,60.77114 -2.76934,29.20404 -10.704,50.36949 -24.19378,64.53629 -8.65346,9.08774 -21.29946,16.39504 -35.37578,20.44137 -13.11053,3.76868 -25.14568,5.0858 -52.44498,5.73944 -13.81368,0.33078 -17.4242,0.35023 -22.82487,0.12311 l 0,0 z"/> - <rect width="236.93414" x="49.282932" y="102.78797" rx="95.84404" ry="92.255867" height="239.43414" style="opacity:0;fill:none;stroke:#008000;stroke-width:3.29858350999999980;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="rect2852"/> - <rect width="175" x="28.571428" y="19.214285" rx="95.84404" ry="92.255867" height="206.07143" style="opacity:0;fill:#b94b4b;fill-opacity:1;stroke:#05d105;stroke-width:4.147;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="rect3704" transform="translate(25.071424,77.933617)"/> - <image width="191.18274" x="73.931854" y="148.93103" height="144.13199" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK0AAACDCAYAAAD/CZsFAAAABHNCSVQICAgIfAhkiAAAIABJREFU
eJzsvXmUXdV5L/jb+0x3qltzqVSTZglJIECI0QYMjTEE45jwVszCcUgcp1fil3ZC2unl9PJb7tXL
dl4Sk7x46DhJ20mcvNjQL7Ed2wkewIARYIVJDJoQmkpIVarxzveeYe/+Yw9nn3NvSaUBnO7w2YXu
PfecPX77+37fsPchADjeprfp/0NEf9YNeJveprMl+2fdgNMRIUR/5vxthfA2Cfp3LWkVoxJCEgz8
Nv3Hpn93kra7uxvr1q3DwMAABgYGYFkWbNtGFEWYnZ1FqVRCqVTC3r17EUXRz7q5b9PPgP5dMO3Y
2BjGxsZwzTXXYGhoCFu3btVMSymFZVngnGNmZgblchmlUgkvvPAC9uzZg/3792Pfvn1vw4f/QETw
M/QeZLNZbNu2DR/4wAewefNmXH311chkMshkMvoexYyUUjDG9PVWq4V9+/Zhz5492LNnD772ta+h
XC6jXC6/5f14m9564j+rv76+Pv6xj32MT05OcsYYZ4zxKIp4FEVt3znnPAxD/ad+bzabvFwu86uv
vpqPjY39zPry9t9b+vfWVkgI4ZlMhheLRT43N8er1SoPw1Azp/mnGFR9Nhk6fQ/nnH/1q1/lq1at
+lkP6Nt/b/LfW+49cBwH999/P15//XX09vYil8t19AwQQkApBSEEnHNQGjfV9CpQSkEpBecc9957
L+677z7kcrm3rD9v01tPbzmmffrpp7XhZRpPijnTZDJo+n71u2Jqzjmmp6dx6tQpXH755Ynnz0SE
EHz4wx/Gr/7qr2J6ehpzc3M4dOgQFhcXceLECUxOTuLYsWOYm5s7574DgOu6GBkZwcjICIaGhlCv
1zE1NYWpqSmcOnXqvMr+j0Jvqffg6quvxujoKLq6ujQzcc4TDLkUk6WvL3VfPp/H0NAQNmzYgLm5
uWUzmWVZ6O3txfj4OPr6+lCv17FmzRo0m01UKhU89dRTIIScNdOqxTU6OorR0VHccccd6OrqQldX
F/L5PIIgQLVaRbVaxbPPPov9+/fj1VdfRRiGZ1XPfyR6S5jWcRzYto1PfvKTGB0dBRAz61K01O+m
5FWkgg+cc+TzeeRyOdx///34l3/5F3zve9/T0vhMbRwYGMD4+HjHunzfx969e5ffaYOuuOIK3Hvv
vdi0aRNuv/32JbXHvn378Oqrr+Kv/uqv8NRTT6FWq51Tff9/p7eEabds2YJLL70Ut912WxvTLcW4
CsMGQYAwDEEpheu6p2V0xQSEEHzwgx9EvV7HM888g9nZ2TO20XVdOI6jv6eZvNFonBM0+MhHPoJ3
vetdeO9734tCodD2u7k4N2/ejA0bNqCvrw87d+7EZz7zGURR9JYHUbZv3w7f91EqlVCv17GwsLCs
hf9W0VtiiG3atAl33nknLMtaVkhW3UMIQRRFaDabaLVaietLlaMMs66uLqxcuRJ9fX3LGmwVxEiX
abaj1WqdXcchmPbGG29EV1dXW5nqs/mvbdu47rrr8Fu/9VtwHAeWZZ11nedLl19+OS6++GKMjY2h
r6/v310Y/U2TtKqTfX192LZtG+644w5EUaQl6OlU/+HDh3H48GH89m//NmZnZzEzMwPOOa699lrc
dtttuO2227Bjx46Oq9/Extu3b8cVV1yB/fv3n7G9StIuZQy2Wi1UKpVl9/+6667DddddhyuvvLKt
nemcCvW7GhMVYPnsZz+Lhx9+GP/6r/+67HovBD3wwAPwPE8HeS6//HJtLP57oTfVp/bVr36VP//8
823BAtPPqnyvnHO+a9cufscdd5yx3EcffbQt+GCWF4Yh932ff/rTn+bd3d1nLG/16tX8r//6rzsG
OGZnZ/l/+S//hReLxWX1ua+vj//Zn/2ZLssMipj97eSPNr8zxviXvvQlPjQ09Jb6QZvNJg+CgCta
v3497+vrO+fy8vk8Hx8f5+vXr+ee53Hbts+rfW8aPMjlcujv78d9992Hbdu2gTHWUYqZEvfHP/4x
vvSlL+F73/veGcu/55579GclqdIuMcuysGbNGlx//fVnLK+vrw99fX2Ja6q8crmMSqWCarV6xnIA
4IYbbsD111+fCDub7TLL7kSmOr7mmmtwzTXXLKve8yXHcZDNZuG6bgKWNBqN8/JmbNu2DX/+53+O
V155BaVSCZ/73OcwODh4zuW9aUzb29uLdevWnRUe+uY3v4l9+/Yt6/5arYannnoKk5OTpzXqBgYG
sHnz5jOWl81mkc1mE9dUeY1GA0EQLIvRuru7sWrVKqxYsaKjp8O8f3p6GtVqFUEQtPmd1eeenh70
9vaesf0XghzHQT6f199VW4IgOC9j0LIsjc8tywJj7LwWwZuGabdt24bbbrsNQLt7Kj35J0+exIkT
J/C3f/u3yzZ2arUaPv/5z+Puu+9OuKlMnAgAa9euxS233II//uM/TjyvjC5KKXzfR09PD7q7uzvW
deLECVQqlTY3XCcmvu222/COd7wDw8PDievqOd/38dxzz+G5557D3r17kc/ncfHFF+Piiy/G9u3b
2xh85cqV2LRpEyYmJnDs2LFljc25UldXF1asWNF2/XwlbSaTQS6X09K71Wqh0Wicc3lvCtO6rotL
L70Ud99995I+SXUtiiI8+uijeOihh846Q+uxxx7D9u3bEUURbLtzV3p7e7F27dq261dddRXWr1+P
9evXo1KpaGs5HewAgFKpBMdxsHLlSgRBgHq9jiAIEASBvkfdf99992H9+vVtMIBzDsYY/uiP/gg/
/elP8cwzz2B+fh6A8K5s3LgRX/jCF9Dd3Y1isajLzWQy2LJlC9797nfjK1/5ylmNz9lSp7EihKDV
ap2XpM3lcjq0roxa3/fPubw3jWn7+/sxMjJyxkgWYwz79+/Hd7/73bOup1arwff906pt27YTqY6K
duzYgXe/+9249dZbsbi4CNd1kc/nO7q8lAtteHgY9Xpd43OTaRVt3LgRPT09mvlVecrf+vnPfx6N
RgP1el0/s3//fuzfvx+/93u/h4mJCc206tmBgQFs2rTprMfnbCmbzSZwvdn28/HROo6jfeCMMf13
rvSmMK2SYMvJF1DQ4FyoXq9jbm4Ok5OTWLt2bcJ9pCjNjOq3DRs2YGhoCJ7nYWhoqK1ss6y77roL
d911FwBoKRGGIcIwxNe+9jV8/OMf10nrnaQ6ALz66qvYvXt3xwCFatsf/MEf4IMf/CDuvffexO8b
N25EX18fPvGJT7ypTv5XXnkF+/fvx5NPPgnP81AsFpHJZM47uKEkLSEECwsL5wUNgDeJadesWYM1
a9YAgE5kAdCRgV988UW8+OKL51QP5xyTk5N4+umnsW7duoR0U5Nr27YeMLN+FXlK50Ck/abmd1We
GSRRSS47duzAe97zno4LBwB+9KMf4U/+5E+W7AshBDt37sRVV12FZrMJ13W1T7tQKMC2bb3tyGQi
Fbau1WpoNpvnxdRhGCKKIhw8ePCCLg7VRs45pqamlu2FWYreFO/B+Pg4xsbGtBroNACKaV999VW8
+uqr51zX3NwcXnvtNQAxboyiSNerLNdCoQDXdfVzmzZtwsDAgH5OPWuqLXUtHQwwIcSxY8dAKcW2
bdvaJKS67/XXX8fu3btx8uTJjn1Q9ZTLZRw5cgRvvPGGVslKIzmO0+aKIoTg/vvvx9GjR1GtVtFo
NPDiiy/iwQcfbKujt7cXl19+OW655RZcffXVuOiii7BixYpE6NociwtFlFLk83ntlZienj7vnIoL
LmkzmQyy2WzbYABJaQaICZ+fnz8v9eP7/mkjVapOx3G0BUwIged5eu/Z+VC9Xkcmk4HnefA8r81l
BYiJmp6eXnZ5jUajY0KQbdsJKz6Nv5Vk7oQXx8fHce211+Kqq66C7/toNpt44okn8MQTT2htsX79
emzYsAGDg4NoNps4evQopqencfjw4SXbOzo6ik2bNmm49G//9m8JrG9ZFlzX1YZytVo9LyMMeBOY
dv369RgdHW3zeSoyB/rpp5/G0aNHz4tpFa5N+0TT37PZrB7MbDaLrq4unYCzHFfWUn2Ym5tDb28v
urq62pLPlZQ8dOgQXn/99WX1Z25uDvPz8xqCqLbZtg3P8xJMm8/n4XkebNvWWqXZbHbEzZs3b8a7
3vUu3H333fpaFEV47rnndJ+uuOIKfOADH8C2bdvQbDbx4x//GE899VRHplUQ8J577kkw7eOPP46/
+Zu/QaVSQaVS0QELz/MAAKdOnUpIWpWTQQhJuNZOa1wvayTPgq6++mpMTEzolZXGsSaD7Nq1C2+8
8cZ51ReGIZrNZqJ8sz51Te2CAET0K5PJJPIgTjdIp+vD7OwsNm3ahMHBwbbkFkIIyuUyjh07tmxJ
22lzpmqn67q6r4CQct3d3Yl6FxYWOjLZ2NgYisViYsGZWooQgr6+Pqxdu1bbIwcOHEhAKkVbt27F
HXfcgTvuuCMRbeSc47rrrgMA/OQnP8GTTz6pF5bqgwqoqMSmj3/84zrvo1qt4tOf/vSS0VNFF5xp
R0ZGEhlNS0WFCCE4fvz4ee+e5ZwjiqIzMp45ENlsVkuntJRVbTPVvFK3naR4tVrFxMSEDkyk21Aq
lTA/P79sHNdqtdBqtdoMQRWWNtva29uLbDab6Huz2cTCwkJbucViUcMXdX8YhlpVq/JNWLdUWVu3
bsWOHTtw/fXXa4GgxjeXy+HWW2/FyZMntRfC9KEreKCy6n7zN39Texd838dnPvOZM0ZELzjTXnLJ
JRgaGupofQNJ5t23b9+ycl1PR8pIAZKuNNPiJ0QkcSsYUqlU8Id/+If6IJBbbrkFQ0NDba4v9fzU
1BRc14XnecjlctqKZ4xhZmYG119/PVatWtVx4ezZswczMzPL7o/v+/B9f8m0S/O6WizmwiuVSpic
nGx71lxYilSgBBDz4rouCoWCLq/RaOgACAAdhv3Sl76EbDar+6rGVbXh4MGDGrL19vYm/OSzs7Oo
1+sYGxvD6tWrdeojAHz961/v6PtO0wVhWtOqTlvlpuGVntC5uTk0m822Mw3OhhzH0VjSrMdkXMYY
arWaHpCpqSn8/u//vi7jy1/+Mq644ooE0yqf4tzcHC699FK9+0I5ylW/fN/H1q1bl/T1ni0E6mTI
LTV+a9asQW9vb4KRl0pWHx0dTcCDxcXFBIaklMLzPG3lM8ZQr9dRKpV0GZs3b8bWrVvR39/f0X2p
/p2ZmdGLoa+vL8Hg5XIZrVYLN954I+67775E2z/72c8ua4wumKRVGGXVqlUJHJSWtEotqUE5UyLK
mSiXy+lFkq5T1ccYQ6PRWLKe9evXJyJB6r5SqYSjR4/C9/3TSoCVK1cmJJRZ9+7du88qD1VJM3My
lepNY71Vq1YlpKdKmO/kTenp6UlIvDQ0S8ODKIpQr9exuLio77n66qvx4Q9/WMMxhVNPnTql57+v
r09LU0Awreknn5mZQTabxY4dO3DTTTeBMYaDBw/i4MGD2nV5JrpgTGt2wiRTWqjPKmHifLOHAOjI
zVL+xeVkFJkY12SWer1+RviSzWaRyWQ6Gp6A0CZnEwFSkEWRuQAUJFFkMqL6PQiChEtJ9cdsIyAW
pGnUKc2h5pBzrl1jykU4NDSE8fHxhPacnp7GAw88oK/9zu/8DprNph7zfD6fwMmlUglDQ0M6xE8I
wdGjR/HEE08se4wuCNOahoJacaZKM9UH5xz1eh0zMzM6gnM+1NPTg1WrVrVdV3Uq78Lp6unp6dEu
GdPwmZ+fTwQulnq2WCy2uajUInrjjTfOythUPl+TVFlBECSYdmRkRKt8pcE6SVpCiHbxqe/Hjh1L
qP5MJpPwpyrtpNo+ODiIdevWYXx8PGEv/Omf/ik+97nPJeqamZnRhufg4GACvpXLZdx8883Yvn07
OOcol8t49tln8Q//8A/LHqMLJmlVYkp68gC0STC1dUVJ2XNlXEII+vv7sXHjxrbfVJlhGC4p6cz9
ZIpRzLbOz8+f0b+qnk1DIBOWnE1an5kRpfqoonymMUkp1UaOqjcIgra0PyUB09ogzbRDQ0MoFAra
FlBSW8G3sbExjI6O6roWFhYwPz+PL3/5y4n2/8Vf/AUGBwe1Adff369DuICAGFdddRVGR0dBCMGD
Dz6Ip59+GsePH1/2GF0wplWRjzRESDvtTVfL+UpZQggKhQKGhoaWdHlFUYQwDDv+RinVTvtOGwjT
1nMnMgMU6YXaCYeeiVzX7egbVTDHdL+l2326DKq0MCmVSoncZeUSU+1Ph9+LxWICPy8sLODQoUNt
WmRxcTGBg3O5XMK7c+WVVyb8+N///vd1rsNy6YJL2rRbxmQmdf1cd7amyXVd9PT0JCRA2lvh+/6S
CRr5fB7FYjGh3s32Li4u4ujRo6dtQ9pzkXZVpXHomUi1hzGmw8xK0pplZTKZNuNK3ZO2E5Q7y7Zt
3b7JycmEpFWBCjMUbJaTdgnu3bt3Wemkynug6v3gBz+IXC6Her2Oer2O73znO2ftObqgTGuGbtOW
tLoGQKu68yUlHYB4cTDGtAtNSZSlGE95HpSKTRuNCnufjpRUXMoQPFttojCyuXOZMaZVtcm0XV1d
ifyJ020LUlEpNS/pbKvx8XF0d3frvjebTW0LUEqxYsUKzbTKd/3SSy+dsT9pCKP2hj3++ON4/PHH
z2lHxAWFB47jaEmbxrVAUhp18jScLQ0ODiKfzyfSH9MS7/jx43jmmWc6Pp/P59u2l5gMUC6XzxjJ
Uup5qSjOUsxsknrWtm309vYmmIcQgmazicXFxUQyttpmbvZbGX1mfdlsVm91MTXQwsJCwnug3Haq
rFqtppk6l8uht7c34darVCrLwqHd3d0Jw1Lh/IcffhgPPPDAGZ/vRG/pqYnmAF+IQyjGxsb0BC9F
5XK5Y4QIEBOa3jRoeh1ardYZIzRnCjmacOVM9ylokMlkEs9Vq1WcPHkywYyd3GLKcW+S53l6jNRC
SBt1ALR3QUlyczuRiUsVBUGwLFdeOp0SQBvUOVu6YEyrMFBazSoyB9zzPBQKhWVP6FJ0++23Y8OG
DW0BDLPu48ePY9euXR2f7+vrw/r169ueAUTcXW3nOR2lPQbp/qQx/ulo9erVGB4eRjabTUz05OQk
nnrqqUQfFWObbVA41RwHte9LtUNBjTSDDw8PI5/P62er1arezKk0mjlGrVZrWa68QqGQMPA453Ac
B319fRgZGVnWuKTpgjGtimObid+K0uoxl8thcHBQbys+F8Z1XRd33HEHNmzY0LEuzjmq1SomJydx
6NChjmX09fUlnjf/VXmtZ6I0hkwbhAoynY4UFr/yyisTE6nKOnbsGHbu3Jl4RuUcmHV3YtrBwUFs
3rxZt0d5U9LBhYGBAe2aUmOnoJHKilOkBNRy8gSUBFf8wTmH53nYvHkzbrnlljM+34kuGKZVKud0
/ln1WSVmqKTmc4mKua6LiYmJ0x6zVKlUsLi4mJgck0x4kF5YKj/0THS6pGyF3Ze7KNesWYOenp62
65VKpS1/wTyfQFEneKCOPlWkFkh6h62KCioy4UFaxZ+tC8+yLA0nFL4dGBjARRddtOxyTLpgkrbV
aqFUKiX8iOnJUkzc1dWlUxhN1XE2dNNNN51WUlNKceLEiSWTVSilGBgYwMaNG3VbVTmUUrRarSWZ
3aRyuZx4Nm1sqqSW5ZDKFlPEOUetVsORI0fwyiuvJO5VznmzbpWoYo7HyMgIduzYob8reGBqQ9d1
EzkChBDtkgLQdhDe2WhHBQ9effVVPPjgg3phbdq0Ce973/t0FPVseOCCMK2JlUzJaQ6qOZnq88qV
K5HP588JkP/Kr/wKgFhydOr0gQMHcODAgY7PU0r10U1pycE5b3OSL0Xz8/M68SfdR0II3vWud2H1
6tWnLUO1Q8EDE2IsLCxgZmamTYKuXLmyrZzFxUW0Wi2tfRzHwcjICLZu3ZoIdqgghRIimUxG+1MV
mUxr7rlTbTOz605HKhJXrVYxPT2Nl19+GdPT0ygWixgfH0/kfSyXLqghFoZhYjvFmdw9t956K9at
W7fsOszzB9773vcmIkRmO1SG0pEjR3DixImOmFLtbjUd7qYxtVymPXXqlI61mzF51e+77rrrjGrw
hhtuwCc/+UnYtp1oKyEEr732Wsfsp+UcYVosFjEyMqIZXAVbzIw3FVlT4VY1FqbLS6V1muPU3d19
2sWotKmSyiq6+MQTT+Do0aN6a/873/lOTExMnLYfabogTKvcKGEYYteuXThx4kSbhAXazz34+Z//
+bPCNYwx3H777fjiF7+oIzxKvajyVT7Bd77zHbz44ouo1WpLhjXVn3rWdAuZhsiZaM+ePZidnW3r
M2MMl156KS6++OLTHri2fft2fOQjH0kwu1o8S+0vMzGtqm9kZASFQkFrussuuwyXX355AvbUajWc
OHGizZdrUhAEqFQqWtKqLTLmol69ejVuvPFG/UyhUMDw8DA++tGPJr4r1a/g40MPPYQ9e/bocXrf
+9531geRXHA/7eTkpHaFpCVPWjKMj4/r5OTl0ODgICYmJrBp06aO5Zrfd+7cuaR/FkBbECRdlloQ
y6HXXntNZ+p3atPExMSS0uSee+7Btm3bOu5enpubw/T0dEfXkhlQUXT55ZfrM8SGh4exZcsWnZWl
qNVqaQmq2pk+Ukrlhigj00ygV+O1Zs0a3HzzzVixYgWGh4dx44034td//dd1hFAZ22aZrVYLMzMz
WFxc1Eb7JZdcguHh4bPy21/w7TaPPPIIVqxYgWuvvbZNyqpVqgZrbGwMt9xyC3bu3IlHHnmkze8I
9TznKBaL+NSnPoUrrriiTTqbTKK2q3zzm988rR9RSdml3FFjY2MYHx/Hyy+/3GYopL0d3/nud9Hd
3Y0rr7yyzSDjXCSJfOhDH8L4xAR+9KMf6d0P7//5n8f999+P/v7+tgOdCSH41re+hV27di3LH8o5
x5133onBwUFcdNFFWLt2LXbs2KEXi2pPpVJNnOjDOU9IWhWBq1Qq0uVHdEZXo9HQbrENGzZgzZo1
+NSnPgVCCC655BJcfPHF+MQnPgEA+iR2RQoenDp1CocPH8apU6cwOjqKK6+8Ejt37sTg4OCyk+Uv
ONPu2rULV111Fer1ets7BswJVYy2fft2/NpHPoJVq1bh7/7+78FSCR9Dg4MYHBzEhz70IXz0ox9t
C16YbjVCCA4cOICXXnqpLYIkWyD/5SCGpE2XwznHRRddhF/7tV/TZ+uq++bn5/GXf/mX8YIC8Pzz
z+Omm25CFEUdJeaKFSvwi7/4i7jxxhtx7TXX6Eyu97///Vi5cmXH/hBC8JWvfEWEStNGJueoSS+B
2cfR0VHceeedeM973rPk+9mq1QpOnEiOTa/ctaHKqzcaMo9BSNpWq4Xjx4/j5MkprF0rduoqe+A3
fuM3EvOrdh0rTAsImFStVvU2oEOHDuHQoUMYGxuD67oYHR3FZZddhocffritvZ3ogjNtqVTSvlEV
9eoULVKfc7kc3nHddRgfH8fXv/ENhBIfAwBkNGbLli342Mc+lqgnPWGKDh8+jEcfffS8dkSokOrt
t9+Om2++OfG+h9dff10wrbgR4ByNeh2+9HummVa1U6nRrVu3atwtutienaZo3/79aJoBDlkfgMSB
HuY4qA2YpkfF/N33fdRqyay3vBQu6r4gCBCl7IBSuYxSuZS4ll7sql2qHQWjXN/3NUZOG7nd3d1n
ZYydG9PGAku1Pv6Nc+zduw979+5NnIbdicnUtfHxcUxMTOD48eM4ceIEjh8/Ds441q1fh76+PvRL
S1ntTVIutjSVSiV9WIRul9FWMbgEnDNETPylXTnmRJvvHVCkomuEUIBSECos4xd378Y3HnoIv/LL
vyzK4lyPi4lv0056NQYqOw0Anty5E0/ufBIL8/MglILatmg3IUAUgUchDh87lsDPnbSOeiuNmXJY
q9VwamYG1LLBOQNnDEMrku4z5UslhACy3D179mLPnj3Yfvnlif4ASCwQxYxmUCOKIlSrVZ2bfOTI
ERw5ckS3fePGjbjzzjtjYXAGOnumNTEbEd/lFdmBCLtf2o3dL72EG264IfFoelWaTMw5R3exiO5i
EVtk2FExpqkyTYmUllKPPfY4HnvscXHNUjiU6narNvOII/R9RGGIMLX9eakFoeiExF2CmRwQm4LY
Dh576mk8u/tl/PIv/VJbeWZbO2WkmZ+r1Sq+/e1v44EH/gTUcUCoBWI7cTkAGOd4/oUXE1rMlNxq
vJ7+6S6Ac9x+23v0tXqzidn5eVDHAQtDcMYwPJrMASiVymg1W4BFAcuG7bg4cvwNPP/Ci7juundg
9aqJhPAw50Wlcvb09OhDPwCRy6GYtlQq4dChQzhw4ICOjC512mQnWh7TJgaX6hUIQGNDyEGzCMFi
qYyf/ORJDK8cwX/6hbsSE3Y6SlvE6Qk2t4Wnmf/7P/gB/vEf/wdeevklWI4LYlkglIBod5gRxaEU
rUoJ9XoD1UoVxQ5vkFyKXj90CAABdRxYmSyo42pmKC2ewP/zzW9h6+bNuHjLZl2eSWZ/1ISbVvw/
fevb+OZ3vgvL80C9DKhlgdoOQCk4AZSIOPbGSVSqVbjyYLp4fsTvP3z0x/jRI49g7erVIITADwLY
loV6vYGZuXlQLwNOAoARjIynjLVaFa3AF4vFywK2DTCGL//N3+Irf/d3OLxvr0h5zGb1nD744IN4
8KGHtHvuhz/8IV584UX87u/+btvRVVEU4Qtf+AK++MUvto3LcujMTKslm5BShFDBCFLCCokm/kBi
Jj72xgk89pMn8Z9+4a62yUpbyer3paSw+p6WzOa/3/72t7H/tddAbQeUWqC2nWRaasmFJq5F2Tym
5ufx/EsvYeXK4UQblhpAQgjK1SqI64K6nmAsxxN9th3YmSy+96NHAEqxcf260x7Cl24/IQTff+QR
PPv8cyiVyqCOC9vLiMXnuMY8CGnrt3zs/LdnsW71KqxfvTouV9bz7X8ukJBoAAAgAElEQVT+Z5yc
msK69euxWC6jXKmAcY6p2VlUanUQKcXhuJhZWMSTu8TBcWEQ4ImnnsHRN06CuB6o54HYDsAYOIsQ
co7/9vkviBer9PYC4Dg1NYUXXngB+/bt08KsXq9jZnYmESlNj8Ppvp+OCGJkmp4hPZiCEQWjUouC
UMEQIEQwB6GgaruKZQEccD0XruvhW9/471i5YgVGhoe1GjOlZSemXaoDnaTgCy/uxgu7d+P+++8H
AwexbFDLhu26gF5gkP/KxUYogijC6olxrJqYwDf+8s/F1m1jH1XnISH48G/+Z3z9f/wj7GwOdjYL
28uCUwq5rBE0G7jx2mvwv/7Gr+PKyy5FRm567FSW6lO5WkWlWsUH7rkHJ6emcWqxDDuThdPVBWLZ
QtLJxcYh4HLgt7DjkovxczffiDtuehdGVgyhWqtj7/4D2HvgAP733/99dA8MYPuVV2P9urWoLCwg
9H3s3b8f+w8fRotQcNsBLAcXb9mMomsjbDYRtJqYnDyOaq2GehhJpnUBzsGDADwMQIMWCtkMCtkM
EAQ4NT0lzobwW+AgAGOCrRS2v8DUkWlN9U+pBSJDnQrHWbYtsBaloI4DalmwbEf+bgGEauPixuuu
xZ23vht3vufd6E4dgJZmwE5Yr5N0Vfd89/s/wL8+/H3868MP49SpU3AyGWQKXbAdB5aUTjDhi+wX
tRyBF+UIfOZ/+zi2rl+HLevX6rJFVUmpSAjBe+/9EP7tpVfhdBXhFLrgFnvEQpWTFPg+PMvCVZds
wWWbL8K9P3crcq6LnOt07DMhBAvlMhbLFVyy4ypYuTy8gSHY2Tycrm6AErHY5EQJIw/gLEKjVsWG
8VFsHB/DaF8PFqensf/113Hg4OuYm5+Hk8vBzhXACRBWq+BhKObRdeF2FWFnMrC8LPwwRFirgkcR
eBjCssV8WtmsxtVREMBvNBCFAZjfAms1wVpNRPUaEAXgjAGMgQUheBQCnAmG1V6cC8e8neGBwbRK
Wqk/atuaUQm1YDkOqGXDcl0QSmHZdizRAPzwJzuxdvUqvPPqK9Fj7OY8HW5cDhFC8L0f/BAvvPAC
jk9OotjfD8fLIFMowHJcUFuqVColGrX0YrRdD04mAw4h8X/w1DPIeF6CaQEOzmN1rFrb4gTZnl54
vX1we/qQ7RuE5TpCEnGOiHEEzQaeP/IGXjx0DLe841oMdhWQdVOuMPkv5xz5XB5eJovs4DDgZWD1
DcIqFGEVuoXhKG4EiyIQLhk3CpHN5vDa9Cx2HzgIWq+iMXUSrufCcV14PX2wMxm4+TwotRBmsmBR
BM6EB8bOZGFnMrC9DDzLQpTNaUFj2bYQRJ4nNCmAoNkEIwSs5YvfHQdMzjlr1gXDRxEIg2BgAMC5
v1fhtHMPYwnEHoEYp1LXge24ovGWBdvLwMlkBXa0bUCq1WwuB8fz4BaKcL0MMsVuWJ6HiAOMcUSM
4b//n5/ARH/syFaT1um7ojQW5lIR3/e//Db+6aGvI5vPI5vLo9DTB9vLwM7mAcsCtSwhXS2JZYn4
lwPoXbsRpWI/SBQBjKF0ago2C7FhsA9rVwxhtOCh0WxiYXYW9WoVJ+bmUW80UW80cOz4ceRXjsHp
G4DT2w+72CvqkaqQRSHAIviVCoJaFQtHD8ElQAYMlDOsHh/FL935c/jQnXe0aY5f+K3fxZGpaRyv
+3CKPbCyeenqC8GiCIiEtc8ZAw8DOGAgTPz5zQZ4GALUAqcUVqEbVi4P2t0H7njg2SzguCC5LsDN
APkucMsGt22AWqatHbvzLEvwARgoY7ArJdBaGc2XdyFcnEOwMIcg8BFVyuCBLyRwvQrWbEomDoEw
lAs6umBQIWZaw+AictIJpbBdD7aXERLVcUBdD9l8AV42CzebRd/EGiEVegcAx4WTzYEBYISCEwIS
RQgbNQTNOtBq4U//5w9htK8Xo/29HY0R3bEOTB0xhnqrhXrLxzt/8UPIORa6VqxEYWglBtdtgOt5
yGRzoBZF6PvgUYTIDxCxCFEgXFxRFKFluTjeCITPkzGEzQb8ehWlE5NoLM6jcmISPBKDTCiB43h6
PLLFHmQHV8ApdMHJF+DmxEtIkq5rIRV5FCGqVRE16mgtzCFsNhA0G/jNX/wF/MYH7sZQT7yBEQC+
9eMn8NC/fB8/eP5ldA+PwO7pBfUysHJ5EMsGzxUA2wFsB9zLoWW74ISIseYcnEAsIGqBuVlwaoFb
tpxlrqSA/MwlPBJt50xc5/HQt7MJoWJBWBZIaQ6kPI/gse+hMfUGuN8C81sIy4uI6gKKcAklwJke
zwvBuES3XhoohBBYjgNiCcnqZLJwc3ktWcc3bUFh4xbAcQHHQ4vaIJzDIirDSp4JJSeZEgHMOedo
Lc5ifmYWG0ZXYv3oCD76vvcg53nozufgWGK1K8e8eCwVLTIY+rf+6L/hmd2voG9iNfom1qBv1WpY
tgs7Iyxu27IlXHFALXlUk5okzkGUxOIcURgg8n3USwtoNWqoLpYQhQEC30fEOZpBJIMRHD5j8AFE
HAhBEAQ+OAMIGAg4CIu0lOFSlXPGEPkBeBRhYWEO779mB95/7ZW48+rLAchDNjjHXKWK/+sfHsJf
/8uPkOnuhbV5G5orJtAYHJOq15h4xkAV4+nlQvT4mMGNsyWeEhzpUggATkSwwyJA9E9fRViaR7A4
j2BhHmFlURhtgQ/WbIhxjkJhoGmmPXfmteOGKQexgV+lj5DaDnI9vch394AOjyGwhMeAcKmeCBLS
RruWVBcpBeUcTjaPXFcL1ZaPw2+cwNcf+QmynoPuXA6ubYESgjAMcPHqCVy2MZlna0aZCIBLNm3E
ky++Ap5oNwEBEeEEY3IBFbWR/l4AQcTgRxFaEcNC00crCFANCHzmoGUXwGiEyArBOEfgCnTGOBdh
ZqlFOAgYZ0IISUOMMKHG0ayDBAGsmogQUdsCtygKXUXM1Zt4/tBR3Hl1HF0iAAqZDFb096GYy6LW
rAt1GwSgUSgMGq6CLdDeCj3eiegkSVxS/GxqA8IBrngcyXuVgWo8qj/rC0pLAqBbrgA9+hos30dY
rYLajsTHkfDaGPe2RVPPgQxDTLq2qCXcRpJZbc9DttCF4sg4ihNrEHT3I5RWNeEABQPVAQdIS1cy
EhQjURACuIVu9DgOgmYTU80GvvXMcyBRCIuFoBAM1mw0cOcN74CXz2PzaJxMkiDOccc7rsHf/+DH
sGwLQaOuB4YQgBIxaQQcFBwWOJphhGbE0GIMi60Q5SBEM2JohgzlkCFgDK2QgHEPzHXlqIoZYqY8
00xBtMFKCECkVQ9wgEUgvg8SBrCriyBBC1Z5HqRZQ86ycGR+EScXFvHb77sVxawIE1NKUchmcOlF
G7F25RCefP5FFFbXwZpNkDAAkapbzRUlADczS1UTicFt6d86cEzMlCaoTV3VZSbnQhmFZMsVsDxx
ulBYXgT3s2KcOAP35flhUSQfSDfu7MkihPwfIASUEFAJCSzHFREf24GTyWFo3Xq4QyuBvkHhazUk
MiXxEZHay6C+E6qvQ0IGYbln4eW74GY82J4nJBaliEAQEgruOJhv+Lh+y8Z48CT2U4PYU8jj4PQs
OGM4NTuL7hXDGoNTaRyCEFRDhnk/xGuVBo7VWjhabeFwpYE36i3MNAPMt0I0GIPPOCKl5AkBJ9Kv
K117OlRp+GSFrDUmQqlk6QPlroeo0I2o0A3m5cAyOZBqGdV6A3PlEt6xaT1WrxjURighBBnPw57X
DuLZ3S/BHhoBL3QD3WKPmRpHaOdOiglNd6JmOEgpqzwhqp3ix9i9yeMHU4BAeWASBUtIqbWfZYEW
uxEdeEkYhNIzw4NAYGUWJ0GdL8WSVjdeSY+YCfMDQwizeYQMsKgehSRpyWNeMwZASSUJOwDAcmy4
YR4sVwCLQrAoRBSGqMPCvuMnDQjbEblh2/o1aDSbOHDkKCLfh+W4wo0FIW0ZB0p+gJPNAK8s1hEx
od49JR2JCDsnsV9nqZKURObvHaQdV1Ia4IqBewaB7n5YJ48h5IAfhDg8PYObtm1JaJOuXA49hTxc
20bYaoGGASjj4DQ5tAlZmdDvS5C6p9N9p3neHO+lCuaMgXhZkN5BEOlRArUSvvGYNy4A0yZgsS5f
RL6obcN2bdD+QVBqg0i1EfOmsCg1gIo1avxFPYNYdUO6VCwqHPykUNBYlQAIfR8LfgunqlXkXQd5
eTKhmbvAGMP/dOlWnJyawk+aTVTnZ5HnHLmuImyb4I16C69XmjhYaYEBsKlQqbZ0exFCtbUcD4Bo
c2KiePI75wDVCxFK1opumiQFAE2Fnxvbb4B97DX0Th7EN37yDO67+Z1oBQFaQYjp+UUsVKuYK5fR
VyxgtlGF1WqAsgiEOtpfG9ehRxY8wcYGppX3M86EpLYdEcFTmJ9zIAzihWsavAaw5cY1sWaFeBDw
D4DjgbkZ2LkuhLU6YIXg1AZTkUjIBhGFcc/HEIOS9EYWFbW0J4FQC1YmL/IrIy4iNAkdIfslv1It
sIVRJLI8iDZcoFWtjLYR6DCxStuzXQ8ey+P/fmIXrt+wBjdsXNNxa/pAsQvrx8dwxcVbcejEcVgE
mMoXMU8aeLYSwiJE/KmRJ9JRwgl4wvFNoF1AqavGz+IjBzhVrArt6YgHQn1XC0BhQyV5LbD+YQRe
Dq899xjG7v5lNBbmUV+YR1haAAhBJp9HJp+HO7oBsF1ZFIstJ9U2ZeCkVoz4jWlIAADEccBPnQCO
vQZarwkfe74A5LoQrd2ijbyktRULp3gIuDFWgsEJ59LVRkFzBRB7FrAtQ+LKtw+dozcjTeaBUNDw
DPF2Y89xUJehZC1hDWmvmIhCMqlKUNFgisfS22y0BvcEFGYSjsxvsICfTk5juLcHW0dWoDefSa14
QTs2b8L4yAj+8399ANNuBqfcPkxaWeQymQTTCRin9YOBBolmyNgAJx2ksGozB5iJ/zgERDCvQa/i
OIWFiPXLIrBcATzfBavYB5sDBTeDfE8vWBRqQQFCgJ5e8EIBcOw2NW3KQmHfKAmZEijqIcsG6jXg
1EmgWQPxsrAWZ0EJELgZBGNrhSsQ6LB81VSSuArjB0OXgngeYMVhfkKVJGsv8lypcxiXJ5OLQQnA
4kHQRkCaCROiCbH6WmKFKcggeTt1EbAtG9VWgMmFMvoKqTdASsOs4Lkg3V3oyudRZQz1RgNO3kNy
WtFhxtvbZEqPuE9UuLCUSrNsg/WNAg1pnMS2RP9OIL0PUrPwbA60XhGyi1JQHkGNKyEE3PXAbAec
SHWeaitPVMpT9ab7zOOxVViTis/UbxlCJNUvo7ZEn0Vn0LZYzdRVNbmKoU3NjHMnO9kv4XRnUQTQ
ECDi7CduJPpSS/I5EZJDOrjkWAs3mAkPCIkbq9d/G7OT+H7E0juby2GyXMOj+w/jsvHhNj4LwhCu
ZcHJ5zCxajVemV1EaWEejpsFMh4UpwgD13w4NdlmWyA1JQF4aR68NA+UF6VjPALyXbDWX2yo0VQZ
6iuRyMi8RbmSJOPwnn7QxTkRenUzAFEVC6zJvIxIS6QUYB22D3E1ftxoglpAoi4lBfXPCl5JDwmn
FojflHUo538H80tVobVLB7lPIBeEdHVqKBnP+/mbYVLSKsDOGQMDQKJQT2C9UsbiK8/Dcj1YXgZe
oRtuV1Fk/6g/5dZS4sRcZGqstMQjHZg3fk4NKiEUbiaDuYaP2XIVj+47hEaljMBvyR23AWqNJqJI
nLn1+smTmKv5YF0OeOCL+T9dznmC6cyLRKQCVhbAX38V/MQxoNmIJ9O2wYdXAa4L4nqxoWYwZyyA
2icegGYOXugGWCikuWWJUeKI8baS9B00VaL49JpJ8m3c15hzTzMwHcrSt6vVaOLbxC/Q/nrNCEBs
0/Al23w2ZJtWoYo66aQMxtCq11HauxtOrgA7mwcfHIY1vhrI5mDJUKnOtwU0UwKIrbKEuoC+T9Ub
d9qQtHKVBhzwI47HDhzG7BvHUa+UUatWUK01UGk0Ech4/qFKDaS7H3b3UDxbXNUr+7fkMKQUvmWD
V8vA3DRQXQScTJwt1qyD1ysgtAieyQKRMugMSGFOZkLtSlyrfnNcwcCWfIbH/CWkrTlGqbGT3MQT
nEk6rMN2iWhK3cS/qfFIYHkVPCEG5jWwPzGfe5PJ1uoIHOAMnHHwiIIBAhZIpmQhQ1CvI6hVUDsx
Cdt1YbkuMv2DcHJ5ZAeHYecLcLp6xG4GaoEQS0o7xTw05ZwXTEr1d574RgiBm/HgeC72Tp3CzGsH
4deqaFUrIOAiSJHxUCh2werPgOYLsLr7xRYRCmOhcM0sAoqpSUlLwljNkUYNCAKQbBe0ZQ2AOC5o
swZkMlraEcU4xGAeObkipKzaor7I6mwXLFJWPonhJBe5qToQAIBQkoCbhBKhFYmR8CLLJxwAJTEO
Jmp0DS0H1Ra+tGAx6jcZXHWT6++xR0cP4JtItsJAaoAIgCgKQTkDoRGilmhgZPmgloUoDMEyIQJf
5NEGvg/LcdCYmYZl2/C6umFnssgPDMLNdyHTLxzORO5z0r5WPUhKIKqdBXKwoHY2CCYu9PXD2Xop
eBiChSGoReB4GYSEIqAW7HIkws+ZjMiEAgyjIg54xlLBAGlSl2oJqBmFis19LBaPnIvztrS643JB
cIPB5H+195Sn7XHZPybyCTgn4My4w0jm0bKRM+mqU+0goCQlObULDIbhxjVGVonZqk2iGZIDmfwz
3QOKGXV+hRobpQXks0riy1yUtGK40GQnes04OBErlTEOECZzTpjYd0UpoiBA5DdBLZEoHLaysBxH
RKRcFza14LkuWo06SpUKGkePyvQ5gloQoqd/AMXubnT19KCruweW7cCVmwNDxlK4i+iBczM5eJk8
1IRTy4JrO6hEQMgATuoiw0xuSTFDo0SrzdiHyoWIhIn1zMkX7jsLsBgEQBZEqQWu86vMJCHE6lIW
K6CSqa8lA8gFyhu1+F6D6QWTtI9FoiQDGwrtwUHMDBizzgQsU2hJqR5DS2hFYTK0qkyNGQHAkOx4
LMPPA6oum1IuL7VyuRZ4Gt9CZDmBhALfSexL5NtVqN0ScoWFCABQJwNic3gOk2zGQWUic61cQrNe
Q2VhAZbtIJPLw3Vd5Lq6YNk2LDvTdmSRmXhDILKmqNzmEinntvZCdOoTSU102pRIkWFlQ+N1yL1x
qpjU0zxeAHFOgnxQSTztcqJAs27gxZhpdUZbLFdh6ghVFzcXjbnwNBZVkwhD63Tua+J3bnwwoU0C
1xp91nWJZ95sZGswrWRVDikN5IRF4lJEhaoWh1tE2nnMORNbnMFBAxdRsRscROwkJQSOMSAZwhFF
EjezCM1qBSAEjWpFBBROWbAsG9lCAa7nIV8ows148DwPrueJvWlEBCkItWBZFJxHCAmLNzAKMaJV
oBmRjA0IcwjMCZHSTfplCSUg3DIkLQEokwk1atRU4dwsEfGvadws/6UUmD8lEnPARb6soWYVpl2K
AUx2VnBEQ3TDf8rj0Ug+2KnE0yazqDLNsuLPuh0adpyxwnOmpKTtWBEH5wxgFJwwUAAsUonUFJHc
XUupBc4YquUyXGcGmWwBVi4HksuBQIaFKeB5NmxbMpy0vFkkkqxbrabI+C9HaNkW/FpN5PRaFAwU
mVxOMnAGPf0DcJ2MEIIWleFlgCvXmx5AFn+WeanEbwF+Q+SoRpFw8bEIJAyENc8YUJ4XCo8SgCt3
HgFYBGY7wrfKjeTAtLQypHrbxPktgNWB2SljcakFZuDLFMsSoyStySU+iCO5JHFjJyxt3qaUe/pb
vA554rq2ORNtSWutFCS6wLTkuQft1XJD08TqS2Tmi4RfRASNWgURAaxCUaQl5gvSyLIACEMgiiIw
zuO0RteDRSmKff1y6IQR4tcbqJcXUa/XUK41kS8UUOgqIl8sIl/sFgvCEhY6V0YctcCpBQnGpZDk
wjkfBkDgg1QWgfKCZN6WcK6zCCTwBWMHgYybp4xGyEiV48rFYfxmOjS1GiVa6MUQkIh2NOtAvSr2
aylXoxprPb7JEGnandYZ5EIbRmmFstREt+UEpO/tIGR1nemFyttAU7Kxnco5S0oyrcbdNJ4ky9Ju
LxAit5Rb2jcr3FsG2A8jhJUKKgf3omYfhNfdAyebh53NIzMyClLsFc9atmg9IdKAIgjCAATiHWPE
spHpzSLX1w9KCRzbRqPeAGdiR+m+53eh1WoitD0ETgaWVxBBgHoFVhTCCX2xB8yXjBj6MTMQIlSo
2W6NXy0gs/QZJsT1RFBAZUqR9IyaMx5LLQ1xbRs4eRR47RWxsZBJ/MU4QOU9jIlFxnl79liiMUmN
aIL2ZCvQkVk4JJLoELwAELsr1YNLBWu0Ow8GE4sKCT/zy//OlhL5tOaxQXo3ri0YjKoECFtuwdFM
K36jjjzRxZJuIipUdthogAU+gnoZQWUB2d4+2Lk8rGwebt+g3IumyjcNizhCxxkBYxx2JiOS1SlF
sX9InA4YBmBhiFa9ipbnYZE3UG/4WKyK1/8EYYgoYiIQIhmTpiVjPAjtGFCNv2SkaHgM3MvG7ioG
uRtX3qhj/MazhMTZcT/+Z/BaBbxWBrEcAb2UoaTjFML4pZrTZJawofJN1tBXtbsqXiWxUyCNR41m
cg5ROYf+CrmwAXCF6bmweTjlcX8RIzC5lSE5bm8CpSRtnF9AJNNRWwQRqLTmqeOJjY8qEia3GVN1
dpYlGJqq7cdSmikhFzRbYBEDbTZhcYYqLLQcF45to7enF47jws2od2/FFjylVIcdwDkYZ2gFLRAQ
ENuB192LLKUYWLUalm3DoRYC30e9VkXg+5ieOolKpYJKuSJeusGl+4vIrDJIZjWteKmSWSYL1t0H
1t2PaHStwMByvKD8mMrLYPp7AcCxgMAH9r8CfuSAiLRRAli2yHHVdSHOHosigEUJ74CKOCrWo4To
akEgzhrQ6jp1Eo/2gJAk33IJ9fTpO0zfLoZCGIOUWMIdCi6CFkQBRgP7qIacznK8QExsq4rifFrF
jMbhHLaUhBaF7bpwMhn5XRzWoU50YQDCIIgNGEL1AtAH1bV1hiMKIrAowmKpBNuyxTYcy0Yun4dt
WeJwCNpBN8UgUEMaLhN+Iinh3EwWjuthxQhFrx8gCHx9nqzIYWihWq2JgyhsR2y59jJi+7XjCozs
ZcG9LJiXicVKyhhRfUk0jBBgZgooL4BPHQcaNclY8h7DRZZ43nAttZdtVNHps0YrCkiTeCGabrT0
VJh1G2UR1VbtuzVhkCFZFVR5k6SrSbbuGDGSv+UJI8SykO0qIjcwJM48cFw4uTzsbE4wo+0IKSwj
XhwErFUHwgjcbwFRiCiM3+pHaHyeAiFUbIhkHGHog3Gg1fRBCJEnnIhXJjm2OOo9l88hm83Bsm3Y
6t1TiFWcStjhnINHDBEggxIZUEKR7+4GpQSUUITyQLQw8BEGAfaeWkCZcZRhg9i2yLiyLJ3lD2rH
E6S2tRuDKELEMQMK7cpjrMoBFIpi2/3CKcD3xd6pRGjWjFRxYUQCCQiT5G8D3hiROJGeHvvZY2Zq
F3UmijHLSa6P04nOZP3iM0vdZUjgNGw6RxI7F5SkNY8+kge55Xv70b1th5bAcBxxBKSUvNSyxaRR
sQXcBcSAh75IJglaQtVFIRCEwqqVC8JxbBAWgrFIQkzBdKHvgxOg1WzqU7Ndz0M2k9FHv+e7iigU
umDLIAMl8VGYCYnORZRP4GMCTjhsx4WbycC2LDiWhTdyfai3IkR+GNsa5kQYaYEcMPIJEGPjlCRU
Eor3D4H0DQDD4wImzE+Dz04Dc1Pg87P6dJoEE7IInLN4t6tZuUk8dVF/bNMB7c+nJfnpaCkGS/im
JfZu89MaBZDz4lVN7d4Dg3kJpeLwi6ERHfPn3DhEl3FQMJFZRwCAghFxYB08D4RayFAKhD54FIDU
6ggaVY2hhNQVE6TBv6F3CSHgjCNiEephHZVSCY7rihcC+yEyGXE+qq3ajNTWlzRJyMDBwRgHIwwR
EbkWPIqAiMXaeylSNpxRZNpjkKxTcAfJZMGzOZCBYSDzGsAjsJkpgMTngJllCDzZqdSkek6yjQFL
lmGxa95aaszMEGJ6baQhSXtDkeBevqwmLYts3TgDz1Lz3APHBYkiYclaVGxwlIMswroK9CuGEz2g
XCSUB+Ag1AaxHCBbRMa2oU5jKboOajOz4JWaiJRJg8uypKonpiFCYFs2OOPwWz6mpk7ixBvHYTsO
bMfGwMAgunt6MDQ8DC/jwrLt+CA0jdfjP7ELREAixriePFMA6QldCj9qSqrEpMqNPxAArFkHWTkB
OrYW0ew0sLgQ36juVcGFtP4mQFtmWltFS1s8ul9nlLByFMz1gfahiG8TDSXKvki0aLnifPlkE82w
hiFmWfp0REvuhFW7VwUujc87EBpSMLBOm1DWquHvhWSUiMvDPSjFIqfID67Axv5BhGGEWrWKZqOO
SrmMMAwQRUxHxKiRr6uGkBIId1cY4vjRozh+7CgO7NsH13UxODQkmHjliDh3zHX1G9KhIIo8t4Ep
x77RH7MqTpUxg9gtJ3mDmPahwg5GcEH/zs1j5gUMousvQbjzYbn5TwZfAH1sps6kImmG06oo6X2Q
DSbxFZgcxyE3IaYOMxTbeQz20r7rzlJdew8kPNKnC2mhyo27mfHDhWHgpJ/WsPLjY5HEyUmq/UZw
SHy3bFgkTkYR52/Fq57KJBdIvEmJsSKlNLEsG47jolDsEplkYYQwCFAuLaIpXw9Ur1QRsvhFIcSy
4o2SHLrdke+j3mrhcLkMzjm8TAaZbBaj4xPo7u1BsbcXxa5u2I4NSxqDURCI1EBuqFhozR67oiA/
SyOLg8SZVZCzzkRn1cRRg0EIEccoERYBIQddMQIehMaeaFmPsgFUFpoSuVovcw2d9NzpBsO4N54n
fV4soMc/FpU8cbv6WUM27TmQN2k/rXxG1au263TEARwX6ujPJc6LPfYAAB7gSURBVEI/RmKvznGV
v0imSxs8CiLYxq6zGPsY96ny1fNGNEXsABYTYts2Cl1FZHN5FKMIrd4mGvUagkBstWk2m/EQEAKq
GQ56gRAi37rt+5idOYVyuQR3ago9PT3o7e9HV1dRvG8BEP1UErWTHaMnn+s+KTtM1aekaUJQcSmj
tFQ0ClanfEvHqKjaxLfcqNO4Zn4kMZOZ495JpiXxfpwQbv6Z1ZpASUtyA+4obZKgtNsO5IJJWEVL
xys5JByQkS/E+FV8J/EKh4mHjXfN6mK4Lk/rOhIzrSpLcTmlBMSypT9YSEPOGfxWC0HgIwgCNGp1
eWS6jyAQvlYexa+DV4cB8yiCzyLMzTRFdhnnyOayKHb3oFAooNDVhWpIEILCZgDhEcCkGuXG66Qs
G9yyEPWvlJOlWCM+fNkcuuQVoq/G7kwi9pi5rnzNEtMCkrdJKyGl0mckJuuMZWXcMlUTEO8IMRun
vidXabucJB0/pu8ngAxLy/Zr6a4kPEkogyWg9xkpce4B5xxEZbdzeQym7wufqGxEvLVCMiohUC/k
iK/HZ3sJDCfVqYm/RC/i5xVsIIDahkx0uyIQy0IunwehXboNYRghCHyEvo9qtYLA98V7XH0fdfki
5ygMBH60LSF9KUWr2cJMcwqz02L0SC4HDsCRg024mnrVTCJ2z1ILQcQQrBiD6ZfV6tbkVoMxNBuZ
E84h9qIZL+EgRDqOmEpNTAeUU0xHCAiJmUJjWp68LZ5ijrQ/mXPI9MjOJJcaCOHJdUTalyUAfeav
EhD6BS9aaJ0/2YJRjUL1n/getpqSGaUuUrLVNODMjij4oFU/kYaXzMeVndLGjxwULX2l2orBs/oc
70rlEBg2k/OQo3kQSjFERtFqNjE/N4t6rYqTk5MIfB9+JKJtttIQhMXqXJVXq2iNAcmguk5VH+eg
nMGaeQP+yomEBDEEqf6iBQoxb4CEIPJHWU+8dUde53JzaVp5JxilAwOY7ViKP3j7bzpjrVN5utwO
hXZwramsPyiDz+CpC5U4o7fbqPcPMJlmSGU2VX1xAX3VCrjrgjuejD3HpwjCZF5CxDzA/E7jvhMC
1/PizZIy5MoieUhFYpSME2m0FCbGrwQ8isAYASgHt8QbdUbHJ0AtG5fsuBJ+o4H5UzOoVis4+vpB
tJpNNJtNobZkMERJUb1wxMhLKS+DChoOWaCLcyBBEDM3AM5SijvJsUky5o0Q8VIVcBhMCr1HLMlg
JtOQZDVm2YYwkGhL4m3jceWIUf207KSwUnvPjH4kEw5J8lZpCxDOwYJAbItnkRy/lHblqX/PgeS5
BzKFTB1AHASIpGSLwgClPS8iM74G3thqEBbBkIcJBk74a3UjuZZa6jwnwgEwLk7rth1QmcAdSgZW
m+dUlMzEzgkJnDgMQrjcGGcAC9GsR6CEYGB4GIN0BBdtuwyRDN/OzZzC4f37UFpcQGlhQTxJKWzb
0a+W4gYTE6jdCgQ0DEEadbGIPQ+UpWeBxEjAUKkJgauYRb2qgTGRJEOteMw64Np4Y6M09lQ5Rrm6
LnMWtEWooF/cYg4u3snATZ82kkwlo3NilAkAFmsQZacELSBoIWqJdz9wI2CjX9EkuAvnS7boOBFZ
PIppI5HFTwCErRYq01NghAJhgPz6LfqUveSbvKnxB51wk2Zq7d+lNMay0mea8cT5W5wL+BD5gRxs
bsAOxM8jLgsqF0EuEJr4Lo6ZJ4TA9lyMrl6D8bVr9bHx5YUFVEuLOP76QSzMzaJaKoncA0vFXgwo
EclkclsqKSmFSEcLWS5kA0pwBZ2goI78n0xzJGIChEGjPCskfXibOu/AOEMMXEu8hANELSCuFo7U
LCwCvAyY6yEaXCnYUTGz8VYf8YjYiycYWzCp6JGYE27ZsGp12HOngICgGtZBwhYQhjL/mQn3JldZ
EecHE2zVYeFzVNhDqCfGIrBQnBvrV0oAAdz+IXg9fSDSRRQfg4QkUwGaafTYm9egnjMlqRgQSi1x
LKfc0pIMaRoYWk0CTKnSCWPHi4USIt6LAKoNBOq4sAtF5EYnEHX3ozo9LXYV1KpQ+FQlfOs9XIY1
ozF/mtKXuG5uwm4wRZ/elp7Cf+Zx853Kjf+NxzIBG4iqS6RD8mwevKcfvLtfNIoxcxT1mPIlrphw
iBAC1qwhWJiCHVH0RQU0ogh1pk5oN4MN508CHnAuVCATjWLylZCcM4StBizbBgsD+JUSCKHoWrUO
TqEAu9AFkslL7U8T2DYtYdU97dKZJKJrIstL5uhSw3qWAF+5g/RBFWqhSKlm6WuxlIvCCDXOEIIj
4kCTcTQYR8jF9vOAUkQ0C39gFGEfB+saBI4fAqlVBIMy6GPradTpTC0TawqRprfZqAWn0QaX/xdC
goeBxOYcegOlwrQxX6T+5ZoJzRNr0g8oXtX6vlAExtaBOw6inn6gUATPF7WKj9mRpzg2iWcT/xIK
2mogmjuJ8Mg+hEEdng94QRY9oYXjbDHpBrsAzKtdXgK0MxHRkXu4OBMhV59asEIHLHRRPX4Efr2M
fLEfuWI/wkGxE8Ht6RPvieVKfXdi3KTxljbizJdFK8xEZTmWZcl5km4UQDAvZ2CMoxZxhATwIyaP
wRfoyWeCURsMCDlHyDiaHGhFTLz0g3FwxwUhgKWmLFsQWFsPtp59aTSaZMbQ2okv8RmAwH2+LzAg
Vwo37mPCNEiUQDpe7dQe/ZlzoH8I6B0Etx0Q1439wQqXop2pTIna3i8CUIJo908RTB5CMDuFVmsO
VquKfECRiwhWRD2oszoqPAB7syJi6uRE1TAWiXdwKWwZ2TYatRKsFoO90ABvleENDsHu7hZva9Rn
WxmMmRgCI5igjbfk/TH2MrEfZKCBaImtDKuIhagwjibjWGQELRA0OEcgGZSp51T9nIt3KUCc/dvx
jAvFOOowZzmp2mAx+2RKJSL9slxp65ROV985hESVr69X0jpWpoqRjFYRIrlQScNOsES1Ry0AQ1u5
Xly3XHzc0EgJUuohTcZt6qi04LWXEVQWEQRNhEETraiGJmthnrWwjW3EHCOoo4IIJsY5d0oGF+RH
xuQ7sThD6Ivf2P/b3pn9SJLcdfwTGZl1dlX13T19zvTOzuzttb0+AbOy1jIgJLAQsgQS4g3xxL/A
v4F48ht+AIMxwhbwYmMjWbZsr3d2dnemZ3Z6jr6768ysPCKCh8jMyurp7un1k0fqn9RHZWVkZkR8
8xe/O+KYWEqUSvhUsoLnlXG9MoPIR2w/wjzukTQn8F6+jqhUENXaiIPmCtO4MpWbnDL52BkVZ87a
OIW2BUEYIRxq9TrtgU83jPnhwEE6AlemYY/GatgyDZs8OSfZfJ/khDnP0RqT2DywQli1NZ5n10h/
2Zdw1DpjkgLzdKarESNAxSEqGOQ4zl6q3MOWKwMmvf64S92kXxWeJr9ONpsiN1+JbDll9Ls4IOZp
oKYdHCtyJ0BLF0clOEmM971/pbETIEMXGU7hBBITtawSFicEesCamWdVz7BvjviIByfv/InpRN2D
HLYYnZmnEmI0ZVWm7EiumQV+rn9p63NJSTmqIb0S5aSOe+ghn9xicnKRmZuvIRfmcCdaI2nJSQvT
kfNbBFmhaDEqnJZZFjLum1khHGcE+lTedaSkVC5TDuIsl3JsSjKj/Vg1lhwlJ4XF9JxUESWvtZUq
WwLLoWQheo3UY5c9azqxmTfrqXoEhfuboY8JfFs21CuhM49V9jYVufKYpSC9d1FYzoBlDAZNvqdE
dp2cKZ/se0bFFyK9v7EcP18NpWv3yjjYRt+9RXL3Fv2DHV7vL7ITbfMw3KY/3IUoSm21CZgEDLRo
0GKCT3OTHQ7Z4fA3Vs5OjT3INVdjMELxQrKOFgYlDL80tyjrCkIm4Dgkica4HjoOMa7DV6pf5Hg4
4HH3f9GeYGp9g/rCMvXFZeRE0xbHyJb+LHkx46ap3AoFUOcihEm5cPatfb5SuUy9XMXpt/MKW3ag
ySSadF6L61ph7igyoHGFyi7belxz1wYhZP5MmY03C4YZmXTG07hHQsKo78n2VpqOX+CNJ8WJ4kNn
EkbWvyJlL6vAAjZNdLSnWcfFU6uLScdFjJrbs9OXVKY7yjvg+APYfB/9ZIvhvduYOEan++L+eHCf
q/Esb8XXuB0G7MbbqS3ewWhbg6JjenTosc0eV1lig2Xu8xj9GwD3zICZbJmeYxLfBMQoYhKEMmiR
7RubsjZtmBQNWqrFY/GYQMWEDgjl4h/so+OEqNelPrdIdX4B6ZWQad2D3OyVjXuuhI0Am4E3m50c
5KNWJ4B42sQLRqb5p74al0sz019mFM+VMTu7QqY7rRet9CcpB9iJYxmoHBd1uJdWkxRPNyQbl7SX
J0SZjGuOy8+j78bvW3hD0/7Z7mbHC4WbjcHRGhFHmE4fEQ1xul2EPyB58jFxZ99u2BxH6DjChENk
pOgmxzyIfVqqTmyaDHVAYILxlxWDxnBElwY1lphjQMCQiIDwlEE8nU4FbY0KFVOmShmDoWP6KKFI
SJBGYnSMSlPDK4mgKWvUYkEk+zwKHyNciTus4nolVDBksLuLLJWYmJ1nde01VKMKzRrVmVmrpct0
c5GiFeGEeWwUv1D4cRyEESOQFpfUM4B78pgpLrGF5dHaqhWZQjZaIiWUy4wrRQX5cgwtYgwo2V8T
RaCHRHdu5Q6MPBds7HFPVAHPu2lXgvwZRk9Q6J4Y56oj22Buj7fbxBqM30cMfZvDFkW2CvowQHeO
IPBRx4fUQ4HXH6CSHuGwC3GEiSNUECDDIT3Vo5PELCQtltUMXdOjaxw6pp+xmfzROvTRaCaoscAM
ASFDQvY4uhDfHQNthTIVSlxjKb/RoWkzx+ToJGUHuKRLeHi0dAPpuAySiI7TYyou29TyyMWRAjcU
CNfgeAkLPsRHd9CNMqpRwlxZxG02qCxfwZuoj8IanUJmRIHTjv+MLAJnVWEx+dL3dAnK0+I/8lF1
S5BWgzRKWVtrOtHOlTWbVTu2OTEjMbRwmfEj6TEpoX2AONhF+gOS84JIChVwzBn9GFshCjJP5oYW
mBEwkwQnGFhwDvo2hiKOaPgGf3CAE8XIKIFO2ypSYQiJRkdDasqjEXrIZIqdKEAlBqUMRAIiz0YH
ao1SERXtUWOGZTNL3wwYEhESF7WKbHaoUaHFBC6SSRp8xFbh29PpBGhLtJhglQX6BPTxWWKOMV+J
ESijaJg6DWo0aXBgOihjqItpBBK0QOCm4CuD60DisGHm+Uju4KgYOXAJ2j3c+Rnc5gReYwKR1uDK
xISCnDD+OTuWDYPI1ZdR2zGOVZzZjAMVUrQLlzVg99xy7DZIJlXGsmJ1NKfT4nOAUadzu0z+EE+h
CqSHEwQ4h7t4pQpx6I9Gt8jR8+fOrnFCiC0qVylIRXG80r/CaIRQ4Pft/mFH+xAMEAd7EIaY4ZBJ
NUukDihpiaccZCwQSuJEJVAaJwStElqRy2zSQMYDYhUSqRAnsWOTxx8bTWJiJpigaeqss8ghHdr0
kch8LLLeJCgqlKhSZopmDtrzKAftEnOUcDmgzXf54dMLaWHcb5qr9PHZw+HX+i5CC7IMB6FtHIGM
7V5SUax51b3OK/I6/xT+G05sC3tI16NSb+D6D6kcbOKWysy9/BoTV5aZXNvA9WzJozFuCyOxIFWA
UMYqR5mEVjCWi/zjSNwX6Rrs5CpbUctKr5HEyLUXQMXo7YdQquJMzSCmZnFWrmGicCSLazOWgJlX
ys6mJpOP01gG7/5tkif3CHfu8WLzBTaDuxhlMEozTNTI4J/VS8j6pDW6IBYhbcZDpjTLOEIc7oDf
w/g9KkcdomGXqH0AYYROwtSMl8YDRDFGK7ROcOI2a8kMj/QOd9U2MraikU7i9NwobWtrWfxJ8jab
ZptN/TED5Y+n2RRWDgNssEyLCY7p8jHbT+Gq+LmExzt8gSfs8YQ9jumfCloxz7RZZJp92uxy9Eyv
xRd4jR4++xyzzzGZ3JarRQXjPwK+Id9hUz5m03lM7BlKpaotxuG6eNWqNZfVJ3BLZZrlBpOVKerr
qyQLDVY+9Xm7uXQa3Z9FYGX38KSLrzS+0nz38TEOVoEcH7aM4xVMRibTpEdZuONLbCovpiae7GUw
GFtR8QRI88i14nRk3C8LgwwGiH6H5L/+hSQJieMhb/jL3I03UUahTIJwJUZKEg0qSah846+Rc1eQ
U7OYJLb7fQUDzNBHHO9jOocQ+JhggG4foaPQgkwpmnGZhqnha58dfYATJ6kzI7YZHtqWNTVKEyYB
v6te59Acc6iP2Yv3rGk4jdAyysr2NgJPI3TMDXOVG2adH+gfEpnU7Z8L0eNLe4sJNlhmhhb/zU/P
xRfAMvMsMUfAkD2O2eNo7HtxgzXzLJbsINhgmQ2WucU9HrN/ztkWxC+Ja7wkrvF95//QwtYYkK7d
3dxWr3Hw0rpgTqUMruRP619jq7TPk3oH6XqUGw1aS6s0l1a48ubn8EoVMhAKR+JKh0hpQq35562j
cStDwcOUrdiZQJHncWXnFK0XjMZdFNoWWUO2MUiRw45Rxl2FAK+E6BxhfvUT9L0PiP0BOhqioiE3
gjm6cYcefXqmb9PzpS3wJ4Sg+vm30YD2ezDoMdVWhCIhJCEkGm3tpFNAqThNilT4SY8behWZwKba
sjbn1GFiTAbEVNlUmlj7vGFu8Ia5wbfVf6aRdun1VRoXm8V+oHCNxDUO3zBf5dviB2Tx2GdRhRJl
SnyZN7jLI+7y8Fy5FWCDJZpM0KHPFjuolKFK4O/PMzc4OLzKC0gc2vQ4pENIfOb5IJgXUzRFnTY9
dsVRtgiTa9OGVHa18vE0LVbNPD3hc6TbBIT5zjpGa5JwSDQY5NYDr1q1ZZnsFXGF4L22PxIhC1Aa
eZty41F6/KRpadRqTII8cb3cIJC3OQW2mUPEkYjH9zE7W6iHm+h+B+X76DCEaEg9lFRih6EKGKi+
Dd/Lltp0oxDda6N7XbTfpxwavERQTzza8THEMTqKc9OTiUK7lMcxJg7xYkM9cplMquwne5gktgqW
SizAUzndJDYUUhrBUA9pqRrGJPh6ALmsyuhvrmYaPCQLYgaAAcE5uMiEMZPKtuAzPPd8gIiEOhUW
mOGYXj43p8JdIpE4rLNIlTL7tDmgTUxy7k1usk5JeBzTY48jIpGQeYusA8Fq/giB4zrU5QTr3ioz
copflDcRrkzFBo9KbQJZsjXEyvUJptY3mJiapzE9z9TSKvXlRTzXxXNdvnN3m77S+MqkpTzTwc31
pPElXRTclic5bXoS2cHcxASpcjO6rkjNXqaoLIYB5nAH0++gbv8S3WsTH+5iooik37XgiSNmoiqv
JOt8zCPum0c4wu4AZMtOOXaXnqyWrxCUHZdVFlkxi/yP+TGOknl8hEmrnGecF53ganhRr3DNrPB9
/SOMsTIsJlUws36mpfIdY93mX9ZvckSbB+YJPfyCsyn/lbct4fEmNwkYEhByl4fn4sPBYZZJpmmi
0dxJzz+L6zo4zDHFDC36DOgwwN1geewkg6FKmRoValQo4XGfJ9SosMrCmQ+TtVlhgX1zTEDICvOj
dXlsnbZyZ0V7zIlZSkmZtnPEXFzFcSRuWLYyr+/geA6OB+5Ao/uPoDTAKbc5XNqht7FEZXqK6vQk
rzerbAUx9/2YxJDWds2wds4ydIqmOQbiUyZqRJlFw5YuJQyRh7s4nQ7y4ZY1yh91LOfzXUykMUEV
Eg+SEpXEYV1NoxgQ0UOSOhocmZcDzdKBQKBEzAyCeePygmkR6WQkimg12lIpC3oymrLRhKbHF82L
tOnS1X2rhBaVpsx5ktLADFhgmhY1djhAZZaWM4bymC4LTPMia7SY4ID2aIPvM2iCGtM0maZJQEhA
RESMc0abIWFqyTLjoLVea8M0TZrUaVLn12yyzpWxRxi3Ptp207SYZZJ9jmlQw8PFSZORxvzvWqS1
eQ2TNJgUTQIiYhExayatmQwXEonUHk7sWlenLqONx1w0wVzY4oNgm87ePtWVRaoriyy/9Qa+Mjwa
KiKlT+36adA1Y/+P9+wsqBe7Y4SD0BoR+DidNu4H7+F2B9SOA0pKUgnqiDhBBC4kMSKsIbK9HhLN
nG4QME1MhIebixYIRuBNEywTFDPUqQIvmVV6up8v36MwQ8gcBzZ00xCagE9zg20O2DOHSFNIZMzb
jA6FRMzQopTeLSYeF63GRkIQkTBJgwmqfJaX+ICP85X6rLHTaCJiPscrtOlzTI8+Pm4qOoyuPpqb
mASJHBcP6lSpU+Ul1nnADg/YPmPaxmmDZWpU2OGQA9rnn1xA/jfF17klNnnPuWuPyVQWdNPADNdD
pvuVqZLDK5WXqHhVym6VW9UnVKqTVmlxPYxXYWppBfnKZ+hMLTIo121KidZP31+n4kEqIY0BV4g8
NDNb7sesA9LFMQrRbUOvjX64Sbz5HhOxRz1y6UbH+MmAvm+1eTUcYJIYPQwgSewmISYNxlEJf6f/
ip/yLj/lXatoZHEZhfuPXKySFjWa1HjTvMq/mx/kfaBY2ecECDHwZ+ZrPGKX99mkZwbPnFOJw2d4
mTe5wT/ynWeen9F1VlhghofsssXOhdrcYI0XWeMnvMsx3Ween4N2nSssMktEzC/44MIP+ee8w2P2
eZ97tOld4IaCz/EKb/EK3+J7JEIRiySVGkYuXCvzyrxmrvQkf+v9BT+XH/Iz+SHlygROpYzwSlYG
rNTA9RCVqnUNr17HzMxhrt5ENKZRRQfDqXGKIzKAoxXO0IcoxBzugN+3m9Ud7KGPrFKj4xgdRURR
n+V4mqV4igfhx/SSLr3wCKMS9DC0yk4cWXNUHNvl3GiMiflL/pgPuM9t7uMT2BEaq0MgTvyvMCj+
hm/yD+bbkBr6xr1zJxBrjW+8wQ0whl/x0TPnCazIV6XMF3mdOzzkzgUM/wCv8QIuEhfJz7h9oTYA
b/NZtjngkM65zE8A5g/5Mm163OHhszllSjdZ5wbrvM89julydIE3BODrfIn91Pb2iL3RU6T/jLIb
QAi7DZQWij+Qb3PbfUDfCek7QzyvjCiV0xBJF1Gu2P8rNYTroaRgVs5Qq7YYeAp/pgnlCpTKiHI1
VW7S26q0dtYwgDii5UMc+fhBm0RFqGiY2yutaclySaNidBgSRQOuqUWuqkVuRx/SV316cQeTgdWk
ipLO4hlIgaX5ffMWB6LNAcfscghPCTYnP1sQ/h6f4R7b9OjTzZjFmUlkljZYZpZJOvT58BPEtf4R
v0OXAXfYYveEzfQseoEVNlhmjyN2OWKHwwu1+wqfJiRiSMSvuHPqOe6rbPCYfXr4FzJBAFxliRIe
h3Q4pnvhCJ1FZhAIQmK6nLFEZQZ/AzjGvrGmRIMqHdEm1gbjGFQqZwmlEDKxOfzSRWiDcD0iF0py
EqFDuu4xmCCvnSW8UmrBABA2G0FrdBKiVcL1aJWjJKIb91A6GYE21dKLKdI22ikAFSGVsoEkOkIn
UcEwr8e9RmQdhDa9NHikyu7pA3Lq0QOOucYSW2yPQHsOCQQd+rnClAVjn28ptXSHh0zRoEmdfdoX
Sps5pss9YJUFImI69C+EkwfsMEGVCWosM0+PwVNYcQVwl4fEJM80ZwFcZ5UZWhzRZZuDC3FYDxcX
l9e5zl0eckR3/EEKGvyYsm4UV8Q861zhgX5MR3dwhN3d3CSJ3fcr33UnsKKEVwYpmfamqckhA7dP
x9mmIitjlWOKadykjobEJCijWNUrDEwbXz/OC1CYzNCexJgkGYE4iVEqwNFTlHWMTgZo46P10AJU
aWxQfQbYAmgNPGGPOTPFCvNs8oiLwQgesM1X+TwJEU/YJWFUGOMsOqZHhwELzDDHFAOGz7StAtxh
ixUWWGOBeab5Ce8WZ+tUOkpX3xIeVSosMssT9q1T5Bn9mkwDxmeZZJIGuyd0JfcW9y40TFM0maLJ
IjPcYYsBAf0LdBjgCrOsssA+x8+041myTzRvZpgzk8zQ4j/Ej+w8C40Rxm5Wp0Y1cJ00YBl3CELw
WfdT7DsdtuQTED6xHKS2YgeTZ0Vk90vrxRqDZwTKHBKZXYZ6F1c7VhbNtHSl821ITfrZ6CGuiagY
jVFDDCEY64AxmYKUx+QWbZ7QY8AaC6yxeKGxzMhnSJsuAsEMrWcu25lh/yG7tOnxJd7gI7a4w1YK
+PNphwMa1LjGEuss0qZ/IR3mNveZZ4pl5pljkne5Q4I6955terTpMSBgmibLzDNDKw+mcS/2XlvQ
brDMfiqjfBKaZZKXuMq3+N4najfPNAC7HBKZmBxleSypAWE1bluV3AGTYIRmWU1x6BwycDoIYVAy
HnHXonYOKdMzuMalQomBbhPRx+gApR1GlVksxxR5nK3NBEbHCDQyNdobrKs0f9b0Hhl3LZJC4+HR
pP6JxgYsVxoS0mTiwnMyICBgyHVWOaLLPR5dCLQJih0OCYlYYxHDzoVAC7DPMUvM8TJX+YgHDIku
dM8D2iQobrLGGgvcSV2/Z3rELumSflvp7BqPl3RJv6V0CdpLeu7oErSX9NzRJWgv6bmjS9Be0nNH
l6C9pOeOLkF7Sc8dXYL2kp47ugTtJT139P84WGaZUimIJgAAAABJRU5ErkJggg==
" id="image3163"/> - <rect width="282.94818" x="28.049149" y="81.03817" rx="0" height="279.91772" ry="0" style="fill:none;fill-opacity:1;stroke:none;stroke-width:5.44153594999999960;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" id="rect2995"/> - </g> - <g id="layer2"/> -</svg> |