summaryrefslogtreecommitdiffstats
path: root/tests/manual/planets-qml
diff options
context:
space:
mode:
Diffstat (limited to 'tests/manual/planets-qml')
-rw-r--r--tests/manual/planets-qml/AppleTVInput.qml155
-rw-r--r--tests/manual/planets-qml/CMakeLists.txt137
-rw-r--r--tests/manual/planets-qml/FpsDisplay.qml69
-rw-r--r--tests/manual/planets-qml/InfoSheet.qml75
-rw-r--r--tests/manual/planets-qml/Planet.qml19
-rw-r--r--tests/manual/planets-qml/PlanetButton.qml57
-rw-r--r--tests/manual/planets-qml/PlanetEffect.qml109
-rw-r--r--tests/manual/planets-qml/PlanetFrameGraph.qml76
-rw-r--r--tests/manual/planets-qml/PlanetMaterial.qml104
-rw-r--r--tests/manual/planets-qml/PlanetsLight.qml32
-rw-r--r--tests/manual/planets-qml/PlanetsMain.qml522
-rw-r--r--tests/manual/planets-qml/Ring.qml112
-rw-r--r--tests/manual/planets-qml/ShadowEffect.qml140
-rw-r--r--tests/manual/planets-qml/SolarSystem.qml924
-rw-r--r--tests/manual/planets-qml/StyledSlider.qml10
-rw-r--r--tests/manual/planets-qml/SunEffect.qml97
-rw-r--r--tests/manual/planets-qml/android/AndroidManifest.xml48
-rw-r--r--tests/manual/planets-qml/android/res/drawable-hdpi/icon.pngbin0 -> 52258 bytes
-rw-r--r--tests/manual/planets-qml/android/res/drawable-ldpi/icon.pngbin0 -> 52258 bytes
-rw-r--r--tests/manual/planets-qml/android/res/drawable-mdpi/icon.pngbin0 -> 52258 bytes
-rw-r--r--tests/manual/planets-qml/doc/images/planets-qml-example.jpgbin0 -> 68712 bytes
-rw-r--r--tests/manual/planets-qml/doc/src/planets-qml.qdoc82
-rw-r--r--tests/manual/planets-qml/images/earth.pngbin0 -> 45904 bytes
-rw-r--r--tests/manual/planets-qml/images/jupiter.pngbin0 -> 30298 bytes
-rw-r--r--tests/manual/planets-qml/images/mars.pngbin0 -> 35278 bytes
-rw-r--r--tests/manual/planets-qml/images/mercury.pngbin0 -> 62354 bytes
-rw-r--r--tests/manual/planets-qml/images/nasa/license.txt3
-rw-r--r--tests/manual/planets-qml/images/nasa/qt_attribution.json15
-rw-r--r--tests/manual/planets-qml/images/nasa/uranusringcolortrans.pngbin0 -> 341169 bytes
-rw-r--r--tests/manual/planets-qml/images/neptune.pngbin0 -> 23206 bytes
-rw-r--r--tests/manual/planets-qml/images/saturn.pngbin0 -> 39191 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/earthcloudmapcolortrans.pngbin0 -> 1830686 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/earthcloudmapspec.jpgbin0 -> 603331 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/earthmap2k.jpgbin0 -> 307630 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/earthnormal2k.jpgbin0 -> 584692 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/earthspec2k.jpgbin0 -> 185837 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/galaxy_starfield.jpgbin0 -> 521243 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/jupitermap.jpgbin0 -> 345203 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/license.txt6
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/marsmap2k.jpgbin0 -> 489786 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/marsnormal2k.jpgbin0 -> 1073295 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/mercurymap.jpgbin0 -> 534775 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/mercurynormal.jpgbin0 -> 1397792 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/moonmap2k.jpgbin0 -> 641394 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/moonnormal2k.jpgbin0 -> 1473741 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/neptunemap.jpgbin0 -> 87217 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/qt_attribution.json14
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/saturnmap.jpgbin0 -> 143493 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/saturnringcolortrans.pngbin0 -> 355950 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/sunmap.jpgbin0 -> 563238 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/uranusmap.jpgbin0 -> 40631 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/venusmap.jpgbin0 -> 555402 bytes
-rw-r--r--tests/manual/planets-qml/images/solarsystemscope/venusnormal.jpgbin0 -> 1263138 bytes
-rw-r--r--tests/manual/planets-qml/images/sun.pngbin0 -> 55203 bytes
-rw-r--r--tests/manual/planets-qml/images/uranus.pngbin0 -> 32131 bytes
-rw-r--r--tests/manual/planets-qml/images/venus.pngbin0 -> 45622 bytes
-rw-r--r--tests/manual/planets-qml/main.cpp39
-rw-r--r--tests/manual/planets-qml/meshes/ring.obj841
-rw-r--r--tests/manual/planets-qml/meshes/starfield.obj4055
-rw-r--r--tests/manual/planets-qml/networkcontroller.cpp64
-rw-r--r--tests/manual/planets-qml/networkcontroller.h30
-rw-r--r--tests/manual/planets-qml/planets-qml-images.qrc35
-rw-r--r--tests/manual/planets-qml/planets-qml.qrc54
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json56
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/home_icon.pngbin0 -> 1495 bytes
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/Contents.json6
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Base.lproj/Interface.storyboard53
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Info.plist33
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json18
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json28
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json18
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json18
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json18
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.h8
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.m48
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Info.plist36
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.h21
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.m146
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.pbxproj608
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.h12
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.m46
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/Contents.json95
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon120.pngbin0 -> 2629 bytes
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon180.pngbin0 -> 5401 bytes
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/LaunchScreen.storyboard27
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/Main.storyboard73
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/Info.plist45
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.h13
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.m48
-rw-r--r--tests/manual/planets-qml/planets-watchos/PlanetsClient/main.m16
-rw-r--r--tests/manual/planets-qml/planets.js187
-rw-r--r--tests/manual/planets-qml/shaders/es2/planetD.frag60
-rw-r--r--tests/manual/planets-qml/shaders/es2/planetD.vert36
-rw-r--r--tests/manual/planets-qml/shaders/es2/planetDB.frag56
-rw-r--r--tests/manual/planets-qml/shaders/es2/planetDB.vert61
-rw-r--r--tests/manual/planets-qml/shaders/es2/planetDS.frag61
-rw-r--r--tests/manual/planets-qml/shaders/es2/planetDSB.frag61
-rw-r--r--tests/manual/planets-qml/shaders/es2/sun.frag26
-rw-r--r--tests/manual/planets-qml/shaders/es2/sun.vert21
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetD.frag63
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetD.vert29
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetDB.frag66
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetDB.vert54
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetDS.frag62
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetDSB.frag67
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetDShadow.frag70
-rw-r--r--tests/manual/planets-qml/shaders/gl3/planetDShadow.vert38
-rw-r--r--tests/manual/planets-qml/shaders/gl3/shadowmap.frag8
-rw-r--r--tests/manual/planets-qml/shaders/gl3/shadowmap.vert13
-rw-r--r--tests/manual/planets-qml/shaders/gl3/sun.frag30
-rw-r--r--tests/manual/planets-qml/shaders/gl3/sun.vert23
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetD.frag82
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetD.vert43
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetDB.frag85
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetDB.vert84
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetDS.frag82
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetDSB.frag87
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetDShadow.frag87
-rw-r--r--tests/manual/planets-qml/shaders/rhi/planetDShadow.vert52
-rw-r--r--tests/manual/planets-qml/shaders/rhi/shadowmap.frag8
-rw-r--r--tests/manual/planets-qml/shaders/rhi/shadowmap.vert21
-rw-r--r--tests/manual/planets-qml/shaders/rhi/sun.frag30
-rw-r--r--tests/manual/planets-qml/shaders/rhi/sun.vert39
124 files changed, 11213 insertions, 0 deletions
diff --git a/tests/manual/planets-qml/AppleTVInput.qml b/tests/manual/planets-qml/AppleTVInput.qml
new file mode 100644
index 000000000..6bd1d5a60
--- /dev/null
+++ b/tests/manual/planets-qml/AppleTVInput.qml
@@ -0,0 +1,155 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.7
+import QtQuick.Window 2.2
+
+Item {
+ id: appleTVInput
+
+ property real xThreshold: 500
+ property real yThreshold: 300
+
+ signal swipeLeft()
+ signal swipeRight()
+ signal swipeUp()
+ signal swipeDown()
+
+ onSwipeLeft: {
+ var focusedItem = Window.window.activeFocusItem
+ if (typeof(focusedItem.swipeLeft) === "function") {
+ focusedItem.swipeLeft()
+ }
+ }
+
+ onSwipeRight: {
+ var focusedItem = Window.window.activeFocusItem
+ if (typeof(focusedItem.swipeRight) === "function") {
+ focusedItem.swipeRight()
+ }
+ }
+
+ onSwipeUp: {
+ var focusedItem = Window.window.activeFocusItem
+ if (typeof(focusedItem.swipeUp) === "function") {
+ focusedItem.swipeUp()
+ }
+ }
+
+ onSwipeDown: {
+ var focusedItem = Window.window.activeFocusItem
+ if (typeof(focusedItem.swipeDown) === "function") {
+ focusedItem.swipeDown()
+ }
+ }
+
+ MultiPointTouchArea {
+ id: multiPointTouchArea
+
+ anchors.fill: parent
+
+ property int startX: 0
+ property int startY: 0
+
+ property int pointX: 0
+ property int pointY: 0
+
+ property int xIsIncreasing: -1 // 1 - true, 0 - false, -1 - undefined
+ property int yIsIncreasing: -1 // 1 - true, 0 - false, -1 - undefined
+
+ property bool pressed: false
+
+ touchPoints: [
+ TouchPoint {
+
+ onPressedChanged: {
+ if (pressed) {
+ multiPointTouchArea.startX = x
+ multiPointTouchArea.startY = y
+ multiPointTouchArea.pressed = true
+ } else {
+ multiPointTouchArea.pressed = false
+ multiPointTouchArea.xIsIncreasing = -1
+ multiPointTouchArea.yIsIncreasing = -1
+ multiPointTouchArea.startX = 0
+ multiPointTouchArea.startY = 0
+ }
+ }
+
+ onXChanged: {
+ if (multiPointTouchArea.pressed) {
+ var newValue = x - multiPointTouchArea.startX
+
+ var focusedItem = appleTVInput.Window.window.activeFocusItem
+
+ if (focusedItem.panningEnabled) {
+ if (multiPointTouchArea.xIsIncreasing === -1) {
+ multiPointTouchArea.xIsIncreasing = (newValue > multiPointTouchArea.startX) ? 1 : 0
+ } else {
+ if (multiPointTouchArea.xIsIncreasing === 1 && newValue < multiPointTouchArea.pointX) {
+ multiPointTouchArea.startX = x
+ multiPointTouchArea.xIsIncreasing = 0
+ multiPointTouchArea.pointX = newValue
+ } else if (multiPointTouchArea.xIsIncreasing === 0 && newValue > multiPointTouchArea.pointX) {
+ multiPointTouchArea.startX = x
+ multiPointTouchArea.xIsIncreasing = 1
+ multiPointTouchArea.pointX = newValue
+ } else {
+ multiPointTouchArea.pointX = newValue
+ focusedItem.pannedHorizontally(multiPointTouchArea.pointX / (multiPointTouchArea.width / 2))
+ }
+ }
+ } else {
+ multiPointTouchArea.pointX = newValue
+
+ if (multiPointTouchArea.pointX > xThreshold) {
+ multiPointTouchArea.startX = x
+ swipeRight()
+ } else if (multiPointTouchArea.pointX < -xThreshold) {
+ multiPointTouchArea.startX = x
+ swipeLeft()
+ }
+ }
+ }
+ }
+
+ onYChanged: {
+ if (multiPointTouchArea.pressed) {
+ var newValue = multiPointTouchArea.startY - y
+
+ var focusedItem = appleTVInput.Window.window.activeFocusItem
+
+ if (focusedItem.panningEnabled) {
+ if (multiPointTouchArea.yIsIncreasing === -1) {
+ multiPointTouchArea.yIsIncreasing = (newValue > multiPointTouchArea.startY) ? 1 : 0
+ } else {
+ if (multiPointTouchArea.yIsIncreasing === 1 && newValue < multiPointTouchArea.pointY) {
+ multiPointTouchArea.startY = y
+ multiPointTouchArea.yIsIncreasing = 0
+ multiPointTouchArea.pointY = newValue
+ } else if (multiPointTouchArea.yIsIncreasing === 0 && newValue > multiPointTouchArea.pointY) {
+ multiPointTouchArea.startY = y
+ multiPointTouchArea.yIsIncreasing = 1
+ multiPointTouchArea.pointY = newValue
+ } else {
+ multiPointTouchArea.pointY = newValue
+ focusedItem.pannedVertically(multiPointTouchArea.pointY / (multiPointTouchArea.height / 2))
+ }
+ }
+ } else {
+ multiPointTouchArea.pointY = newValue
+
+ if (multiPointTouchArea.pointY > yThreshold) {
+ multiPointTouchArea.startY = y
+ swipeUp()
+ } else if (multiPointTouchArea.pointY < -yThreshold) {
+ multiPointTouchArea.startY = y
+ swipeDown()
+ }
+ }
+ }
+ }
+ }
+ ]
+ }
+}
diff --git a/tests/manual/planets-qml/CMakeLists.txt b/tests/manual/planets-qml/CMakeLists.txt
new file mode 100644
index 000000000..0ebf217ff
--- /dev/null
+++ b/tests/manual/planets-qml/CMakeLists.txt
@@ -0,0 +1,137 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+cmake_minimum_required(VERSION 3.16)
+project(planets-qml LANGUAGES CXX)
+
+set(CMAKE_AUTOMOC ON)
+
+find_package(Qt6 REQUIRED COMPONENTS 3DCore 3DInput 3DQuick 3DQuickExtras 3DQuickInput 3DQuickRender 3DRender Concurrent Core Gui Network Qml Quick)
+
+qt_add_executable(planets-qml
+ main.cpp
+ networkcontroller.cpp networkcontroller.h
+)
+
+set_target_properties(planets-qml PROPERTIES
+ WIN32_EXECUTABLE TRUE
+ MACOSX_BUNDLE TRUE
+)
+
+target_link_libraries(planets-qml PUBLIC
+ Qt::3DCore
+ Qt::3DInput
+ Qt::3DQuick
+ Qt::3DQuickExtras
+ Qt::3DQuickInput
+ Qt::3DQuickRender
+ Qt::3DRender
+ Qt::Concurrent
+ Qt::Core
+ Qt::Gui
+ Qt::Network
+ Qt::Qml
+ Qt::Quick
+)
+
+# Resources:
+set(planets-qml_resource_files
+ "AppleTVInput.qml"
+ "FpsDisplay.qml"
+ "InfoSheet.qml"
+ "Planet.qml"
+ "PlanetButton.qml"
+ "PlanetEffect.qml"
+ "PlanetFrameGraph.qml"
+ "PlanetMaterial.qml"
+ "PlanetsLight.qml"
+ "PlanetsMain.qml"
+ "Ring.qml"
+ "ShadowEffect.qml"
+ "SolarSystem.qml"
+ "StyledSlider.qml"
+ "SunEffect.qml"
+ "meshes/ring.obj"
+ "meshes/starfield.obj"
+ "planets.js"
+ "shaders/es2/planetD.frag"
+ "shaders/es2/planetD.vert"
+ "shaders/es2/planetDB.frag"
+ "shaders/es2/planetDB.vert"
+ "shaders/es2/planetDS.frag"
+ "shaders/es2/planetDSB.frag"
+ "shaders/es2/sun.frag"
+ "shaders/es2/sun.vert"
+ "shaders/gl3/planetD.frag"
+ "shaders/gl3/planetD.vert"
+ "shaders/gl3/planetDB.frag"
+ "shaders/gl3/planetDB.vert"
+ "shaders/gl3/planetDS.frag"
+ "shaders/gl3/planetDSB.frag"
+ "shaders/gl3/planetDShadow.frag"
+ "shaders/gl3/planetDShadow.vert"
+ "shaders/gl3/shadowmap.frag"
+ "shaders/gl3/shadowmap.vert"
+ "shaders/gl3/sun.frag"
+ "shaders/gl3/sun.vert"
+ "shaders/rhi/planetD.frag"
+ "shaders/rhi/planetD.vert"
+ "shaders/rhi/planetDB.frag"
+ "shaders/rhi/planetDB.vert"
+ "shaders/rhi/planetDS.frag"
+ "shaders/rhi/planetDSB.frag"
+ "shaders/rhi/planetDShadow.frag"
+ "shaders/rhi/planetDShadow.vert"
+ "shaders/rhi/shadowmap.frag"
+ "shaders/rhi/shadowmap.vert"
+ "shaders/rhi/sun.frag"
+ "shaders/rhi/sun.vert"
+)
+
+qt6_add_resources(planets-qml "planets-qml"
+ PREFIX
+ "/"
+ FILES
+ ${planets-qml_resource_files}
+)
+
+set(planets-qml-images_resource_files
+ "images/earth.png"
+ "images/jupiter.png"
+ "images/mars.png"
+ "images/mercury.png"
+ "images/nasa/uranusringcolortrans.png"
+ "images/neptune.png"
+ "images/saturn.png"
+ "images/solarsystemscope/earthcloudmapcolortrans.png"
+ "images/solarsystemscope/earthcloudmapspec.jpg"
+ "images/solarsystemscope/earthmap2k.jpg"
+ "images/solarsystemscope/earthnormal2k.jpg"
+ "images/solarsystemscope/earthspec2k.jpg"
+ "images/solarsystemscope/galaxy_starfield.jpg"
+ "images/solarsystemscope/jupitermap.jpg"
+ "images/solarsystemscope/license.txt"
+ "images/solarsystemscope/marsmap2k.jpg"
+ "images/solarsystemscope/marsnormal2k.jpg"
+ "images/solarsystemscope/mercurymap.jpg"
+ "images/solarsystemscope/mercurynormal.jpg"
+ "images/solarsystemscope/moonmap2k.jpg"
+ "images/solarsystemscope/moonnormal2k.jpg"
+ "images/solarsystemscope/neptunemap.jpg"
+ "images/solarsystemscope/saturnmap.jpg"
+ "images/solarsystemscope/saturnringcolortrans.png"
+ "images/solarsystemscope/sunmap.jpg"
+ "images/solarsystemscope/uranusmap.jpg"
+ "images/solarsystemscope/venusmap.jpg"
+ "images/solarsystemscope/venusnormal.jpg"
+ "images/sun.png"
+ "images/uranus.png"
+ "images/venus.png"
+)
+
+qt6_add_resources(planets-qml "planets-qml-images"
+ PREFIX
+ "/"
+ FILES
+ ${planets-qml-images_resource_files}
+)
diff --git a/tests/manual/planets-qml/FpsDisplay.qml b/tests/manual/planets-qml/FpsDisplay.qml
new file mode 100644
index 000000000..5579ca5bd
--- /dev/null
+++ b/tests/manual/planets-qml/FpsDisplay.qml
@@ -0,0 +1,69 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0
+
+Item {
+ id: fpsDisplayControl
+ property bool hidden: true
+ property real fps: 0.0
+
+ onHiddenChanged: {
+ if (fpsDisplayControl.hidden)
+ fpsDisplay.color = "transparent"
+ else
+ fpsDisplay.color = "#000000FF"
+ }
+
+ onFpsChanged: {
+ fpsDisplay.updateFps()
+ }
+
+ Rectangle {
+ anchors.fill: parent
+ id: fpsDisplay
+ color: "transparent"
+
+ property real maxFps: 60.0
+ property color maxFpsColor: "#5500FF00"
+ property color minFpsColor: "#55FF0000"
+
+ function updateFps() {
+ var scale = (fps > maxFps)?1.0:(fps/maxFps)
+ var r = (1 - scale) * minFpsColor.r + scale * maxFpsColor.r
+ var g = (1 - scale) * minFpsColor.g + scale * maxFpsColor.g
+ var b = (1 - scale) * minFpsColor.b + scale * maxFpsColor.b
+ var a = (1 - scale) * minFpsColor.a + scale * maxFpsColor.a
+ fpsCauge.height = scale * fpsDisplay.height
+ fpsCauge.color = Qt.rgba(r, g, b, a)
+ }
+
+ Rectangle {
+ id: fpsCauge
+ width: parent.width
+ anchors.bottom: parent.bottom
+ visible: !fpsDisplayControl.hidden
+ }
+
+ Text {
+ id: fpsText
+ text: ""+(fps | 0)
+ font.family: "Helvetica"
+ font.pixelSize: 16
+ font.weight: Font.Light
+ color: "white"
+ anchors.fill: parent
+ verticalAlignment: Text.AlignVCenter
+ horizontalAlignment: Text.AlignHCenter
+ visible: !fpsDisplayControl.hidden
+ }
+ }
+
+ MouseArea {
+ anchors.fill: parent
+ onClicked: {
+ fpsDisplayControl.hidden = !fpsDisplayControl.hidden
+ }
+ }
+}
+
diff --git a/tests/manual/planets-qml/InfoSheet.qml b/tests/manual/planets-qml/InfoSheet.qml
new file mode 100644
index 000000000..8f7e4ab5b
--- /dev/null
+++ b/tests/manual/planets-qml/InfoSheet.qml
@@ -0,0 +1,75 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0
+
+Rectangle {
+ id: infoSheet
+
+ width: 200
+ height: 450
+ anchors.verticalCenter: parent.verticalCenter
+
+ property alias planet: planetText.planet
+ property alias radius: infoText.radius
+ property alias temperature: infoText.temperature
+ property alias orbitalPeriod: infoText.orbitalPeriod
+ property alias distance: infoText.distance
+ property alias exampleDetails: infoText.exampleDetails
+
+ Behavior on opacity { PropertyAnimation {} }
+
+ color: "black"
+
+ Text {
+ id: planetText
+ anchors.top: parent.top
+ anchors.topMargin: 20
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ property string planet: ""
+
+ font.family: "Helvetica"
+ font.pixelSize: 32
+ font.weight: Font.Light
+ color: "white"
+
+ text: "<p>" + planet + "</p>"
+ }
+
+ Text {
+ id: infoText
+ anchors.top: planetText.bottom
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ property string radius: ""
+ property string temperature: ""
+ property string orbitalPeriod: ""
+ property string distance: ""
+ property string exampleDetails: ""
+
+ font.family: "Helvetica"
+ font.pixelSize: 18
+ font.weight: Font.Light
+ lineHeight: 1.625 * 18
+ lineHeightMode: Text.FixedHeight
+ color: "white"
+
+ text: {
+ if (planet == "Solar System") {
+ "<p>" + exampleDetails + "</p>"
+ } else if (planet == "Sun") {
+ "<p>Equatorial Diameter:</p><p>" + radius + "</p></br>"
+ + "<p>Surface Temperature:</p><p>" + temperature + "</p>"
+ } else {
+ "<p>Equatorial Diameter:</p><p>" + radius + "</p></br>"
+ + "<p>Surface Temperature:</p><p>" + temperature + "</p></br>"
+ + "<p>Solar Orbit Period:</p><p>" + orbitalPeriod + "</p></br>"
+ + "<p>Distance from Sun:</p><p>" + distance + "</p>"
+ }
+ }
+
+ onLinkActivated: Qt.openUrlExternally(link)
+ }
+}
+
diff --git a/tests/manual/planets-qml/Planet.qml b/tests/manual/planets-qml/Planet.qml
new file mode 100644
index 000000000..acd5ccdeb
--- /dev/null
+++ b/tests/manual/planets-qml/Planet.qml
@@ -0,0 +1,19 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Render 2.0
+import Qt3D.Extras 2.0
+
+SphereMesh {
+ property real r: 0
+ property real x: 0
+ property real y: 0
+ property real z: 0
+ property real roll: 0
+ property real tilt: 0
+
+ radius: 1.0
+ generateTangents: true
+ rings: 64
+ slices: 64
+}
diff --git a/tests/manual/planets-qml/PlanetButton.qml b/tests/manual/planets-qml/PlanetButton.qml
new file mode 100644
index 000000000..282303f47
--- /dev/null
+++ b/tests/manual/planets-qml/PlanetButton.qml
@@ -0,0 +1,57 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0
+
+Rectangle {
+ id: planetButton
+
+ property alias text: planetText.text
+ property alias source: planetImage.source
+ property alias focusPlanet: planetImage.focusPlanet
+ property Item planetSelector: parent.parent
+ property int buttonSize: 70
+ property int fontSize: 16
+
+ width: buttonSize
+ height: buttonSize
+ color: "transparent"
+
+ Image {
+ id: planetImage
+ anchors.fill: parent
+ property int focusPlanet
+
+ MouseArea {
+ anchors.fill: parent
+ hoverEnabled: true
+ onClicked: { planetSelector.focusedPlanet = focusPlanet }
+ onEntered: PropertyAnimation { target: planetText; property: "opacity"; to: 1 }
+ onExited: PropertyAnimation {
+ target: planetText
+ property: "opacity"
+ to: {
+ if (planetText.text != "Solar System")
+ 0
+ else
+ 1
+ }
+ }
+ }
+ }
+
+ Text {
+ id: planetText
+ anchors.centerIn: parent
+ font.family: "Helvetica"
+ font.pixelSize: fontSize
+ font.weight: Font.Light
+ color: "white"
+ opacity: {
+ if (text == "Solar System" || (Qt.platform.os === "tvos" && planetButton.activeFocus))
+ opacity = 1
+ else
+ opacity = 0
+ }
+ }
+}
diff --git a/tests/manual/planets-qml/PlanetEffect.qml b/tests/manual/planets-qml/PlanetEffect.qml
new file mode 100644
index 000000000..6d3557941
--- /dev/null
+++ b/tests/manual/planets-qml/PlanetEffect.qml
@@ -0,0 +1,109 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+
+Effect {
+ id: root
+
+ property Texture2D shadowTexture
+ property PlanetsLight light
+ property string vertexES: "qrc:/shaders/es2/planetD.vert"
+ property string fragmentES: "qrc:/shaders/es2/planetD.frag"
+ property string vertexGL: "qrc:/shaders/gl3/planetD.vert"
+ property string fragmentGL: "qrc:/shaders/gl3/planetD.frag"
+ property string vertexRHI: "qrc:/shaders/rhi/planetD.vert"
+ property string fragmentRHI: "qrc:/shaders/rhi/planetD.frag"
+
+ parameters: [
+ Parameter { name: "lightViewProjection"; value: root.light.lightViewProjection },
+ Parameter { name: "lightPosition"; value: root.light.lightPosition },
+ Parameter { name: "lightIntensity"; value: root.light.lightIntensity }
+ ]
+
+ FilterKey { id: eskey; name: "name"; value: "ES2" }
+ FilterKey { id: glkey; name: "name"; value: "Desktop" }
+ FilterKey { id: forwardkey; name : "pass"; value : "forward" }
+
+ RenderPass {
+ id: glpass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource(vertexGL)
+ fragmentShaderCode: loadSource(fragmentGL)
+ }
+ // no special render state set => use the default set of states
+ }
+
+ RenderPass {
+ id: rhipass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource(vertexRHI)
+ fragmentShaderCode: loadSource(fragmentRHI)
+ }
+ // no special render state set => use the default set of states
+ }
+
+ RenderPass {
+ id: espass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource(vertexES)
+ fragmentShaderCode: loadSource(fragmentES)
+ }
+ // no special render state set => use the default set of states
+ }
+
+ techniques: [
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ profile: GraphicsApiFilter.CoreProfile
+ majorVersion: 3
+ minorVersion: 2
+ }
+
+ filterKeys: [ glkey ]
+
+ renderPasses: [ glpass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ majorVersion: 2
+ }
+
+ filterKeys: [ eskey ]
+
+ renderPasses: [ espass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGLES
+ majorVersion: 2
+ minorVersion: 0
+ }
+
+ filterKeys: [ eskey ]
+
+ renderPasses: [ espass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.RHI
+ majorVersion: 1
+ minorVersion: 0
+ }
+
+ filterKeys: [ glkey ]
+
+ renderPasses: [ rhipass ]
+ }
+ ]
+}
diff --git a/tests/manual/planets-qml/PlanetFrameGraph.qml b/tests/manual/planets-qml/PlanetFrameGraph.qml
new file mode 100644
index 000000000..450c64b2c
--- /dev/null
+++ b/tests/manual/planets-qml/PlanetFrameGraph.qml
@@ -0,0 +1,76 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+
+RenderSettings {
+ id: root
+
+ property alias viewCamera: viewCameraSelector.camera
+ property alias lightCamera: lightCameraSelector.camera
+ readonly property Texture2D shadowTexture: depthTexture
+
+ activeFrameGraph: Viewport {
+ normalizedRect: Qt.rect(0.0, 0.0, 1.0, 1.0)
+
+ RenderSurfaceSelector {
+
+ TechniqueFilter {
+ matchAll: [ FilterKey { name: "name"; value: "Desktop" } ]
+
+ RenderPassFilter {
+ matchAny: [ FilterKey { name: "pass"; value: "shadowmap" } ]
+
+ RenderTargetSelector {
+ target: RenderTarget {
+ attachments: [
+ RenderTargetOutput {
+ objectName: "depth"
+ attachmentPoint: RenderTargetOutput.Depth
+ texture: Texture2D {
+ id: depthTexture
+ width: mainview.width
+ height: mainview.height
+ format: Texture.D24
+ generateMipMaps: false
+ magnificationFilter: Texture.Linear
+ minificationFilter: Texture.Linear
+ wrapMode {
+ x: WrapMode.ClampToEdge
+ y: WrapMode.ClampToEdge
+ }
+ comparisonFunction: Texture.CompareLessEqual
+ comparisonMode: Texture.CompareRefToTexture
+ }
+ }
+ ]
+ }
+
+ ClearBuffers {
+ buffers: ClearBuffers.DepthBuffer
+ clearColor: Qt.rgba(0., 0., 0., 1.)
+
+ CameraSelector {
+ id: lightCameraSelector
+ }
+ }
+ }
+ }
+ }
+
+ RenderPassFilter {
+ matchAny: [ FilterKey { name: "pass"; value: "forward" } ]
+
+ ClearBuffers {
+ buffers: ClearBuffers.ColorDepthBuffer
+
+ CameraSelector {
+ id: viewCameraSelector
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/manual/planets-qml/PlanetMaterial.qml b/tests/manual/planets-qml/PlanetMaterial.qml
new file mode 100644
index 000000000..6aed93084
--- /dev/null
+++ b/tests/manual/planets-qml/PlanetMaterial.qml
@@ -0,0 +1,104 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+import QtQuick 2.1
+
+Material {
+ id: root
+ property color ambientLight: Qt.rgba(0.1, 0.1, 0.1, 1.0)
+ property color diffuseColor: Qt.rgba(0.7, 0.7, 0.7, 1.0)
+ property color specularColor: Qt.rgba(0.5, 0.5, 0.5, 1.0)
+ property real shininess: 150.0
+ property string diffuseMap
+ property string specularMap
+ property string normalMap
+ property real textureScale: 1.0
+ property real opacity: 1.0
+
+ parameters: [
+ Parameter {
+ name: "ambient"
+ value: Qt.vector3d(root.ambientLight.r, root.ambientLight.g, root.ambientLight.b)
+ },
+ Parameter {
+ name: "diffuse"
+ value: Qt.vector3d(root.diffuseColor.r, root.diffuseColor.g, root.diffuseColor.b)
+ },
+ Parameter {
+ name: "specular"
+ value: Qt.vector3d(root.specularColor.r, root.specularColor.g, root.specularColor.b)
+ },
+ Parameter {
+ name: "shininess"
+ value: root.shininess
+ },
+ Parameter {
+ name: "diffuseTexture"
+ value: Texture2D {
+ id: diffuseTexture
+ minificationFilter: Texture.LinearMipMapLinear
+ magnificationFilter: Texture.Linear
+ wrapMode {
+ x: WrapMode.Repeat
+ y: WrapMode.Repeat
+ }
+ generateMipMaps: true
+ maximumAnisotropy: 16.0
+ TextureImage {
+ id: diffuseTextureImage
+ source: diffuseMap
+ }
+ }
+ },
+ Parameter {
+ name: "specularTexture"
+ value: Texture2D {
+ id: specularTexture
+ minificationFilter: Texture.LinearMipMapLinear
+ magnificationFilter: Texture.Linear
+ wrapMode {
+ x: WrapMode.Repeat
+ y: WrapMode.Repeat
+ }
+ generateMipMaps: true
+ maximumAnisotropy: 16.0
+ TextureImage {
+ id: specularTextureImage
+ // Get rid of runtime warnings. It's safe, as the texture just isn't used
+ source: specularMap !== "" ? specularMap
+ : "qrc:/images/solarsystemscope/uranusmap.jpg"
+ }
+ }
+ },
+ Parameter {
+ name: "normalTexture"
+ value: Texture2D {
+ id: normalTexture
+ minificationFilter: Texture.Linear
+ magnificationFilter: Texture.Linear
+ wrapMode {
+ x: WrapMode.Repeat
+ y: WrapMode.Repeat
+ }
+ maximumAnisotropy: 16.0
+ TextureImage {
+ id: normalTextureImage
+ // Get rid of runtime warnings. It's safe, as the texture just isn't used
+ source: normalMap !== "" ? normalMap
+ : "qrc:/images/solarsystemscope/uranusmap.jpg"
+ }
+ }
+ },
+ Parameter {
+ name: "texCoordScale"
+ value: textureScale
+ },
+ Parameter {
+ name: "opacity"
+ value: opacity
+ }
+ ]
+}
diff --git a/tests/manual/planets-qml/PlanetsLight.qml b/tests/manual/planets-qml/PlanetsLight.qml
new file mode 100644
index 000000000..506d58037
--- /dev/null
+++ b/tests/manual/planets-qml/PlanetsLight.qml
@@ -0,0 +1,32 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+
+Entity {
+ id: root
+
+ property alias near: lightCamera.nearPlane
+ property alias ratio: lightCamera.aspectRatio
+
+ property vector3d lightPosition: Qt.vector3d(0.0, 0.0, 0.0)
+ property vector3d lightIntensity: Qt.vector3d(1.0, 1.0, 1.0)
+
+ readonly property Camera lightCamera: lightCamera
+ readonly property matrix4x4 lightViewProjection:
+ lightCamera.projectionMatrix.times(lightCamera.viewMatrix)
+
+ Camera {
+ id: lightCamera
+ objectName: "lightCameraLens"
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 30
+ nearPlane: 2500000.0
+ farPlane: 10000000.0
+ position: root.lightPosition
+ viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
+ upVector: Qt.vector3d(0.0, 1.0, 0.0)
+ }
+}
diff --git a/tests/manual/planets-qml/PlanetsMain.qml b/tests/manual/planets-qml/PlanetsMain.qml
new file mode 100644
index 000000000..a98fbc618
--- /dev/null
+++ b/tests/manual/planets-qml/PlanetsMain.qml
@@ -0,0 +1,522 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0
+import QtQuick.Window 2.2
+import QtQuick.Scene3D 2.0
+import "planets.js" as Planets
+
+Item {
+ id: mainview
+ width: 1280
+ height: 768
+ visible: true
+ property int focusedPlanet: 100
+ property int oldPlanet: 0
+ property int frames: 0
+ property int sliderLength: (width < height) ? width / 2 : height / 2
+ property real textSize: sliderLength / 20
+ property real planetButtonSize: (height < 2200) ? (height / 13) : 200
+
+ Connections {
+ target: networkController
+
+ function onCommandAccepted() {
+ var focusedItem = mainview.Window.window.activeFocusItem
+ if (focusedItem && focusedItem.panningEnabled) {
+ focusedItem.panningEnabled = false
+ }
+
+ switch (command) {
+ case "selectPlanet":
+ mainview.focusedPlanet = Planets.planetId(decodeURIComponent(value))
+ planetButtonView.forceActiveFocus()
+ planetButtonView.currentIndex = Planets.planetIndex(value)
+ break
+ case "setRotationSpeed":
+ rotationSpeedSlider.forceActiveFocus()
+ rotationSpeedSlider.value = rotationSpeedSlider.from +
+ ((rotationSpeedSlider.to - rotationSpeedSlider.from) * value)
+ break
+ case "setViewingDistance":
+ viewingDistanceSlider.forceActiveFocus()
+ viewingDistanceSlider.value = viewingDistanceSlider.from +
+ ((viewingDistanceSlider.to - viewingDistanceSlider.from) * value)
+ break
+ case "setPlanetSize":
+ planetSizeSlider.forceActiveFocus()
+ planetSizeSlider.value = planetSizeSlider.from +
+ ((planetSizeSlider.to - planetSizeSlider.from) * value)
+ break
+ }
+ }
+ }
+
+ //! [0]
+ Scene3D {
+ anchors.fill: parent
+ aspects: ["render", "logic", "input"]
+
+ SolarSystem { id: solarsystem }
+ }
+ //! [0]
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.LeftButton
+ onClicked:
+ focusedPlanet = 100
+ }
+
+ //! [1]
+ onFocusedPlanetChanged: {
+ if (focusedPlanet == 100) {
+ info.opacity = 0
+ updatePlanetInfo()
+ } else {
+ updatePlanetInfo()
+ info.opacity = 1
+ }
+
+ solarsystem.changePlanetFocus(oldPlanet, focusedPlanet)
+ oldPlanet = focusedPlanet
+ }
+ //! [1]
+
+ ListModel {
+ id: planetModel
+
+ ListElement {
+ name: "Sun"
+ radius: "109 x Earth"
+ temperature: "5 778 K"
+ orbitalPeriod: ""
+ distance: ""
+ planetImageSource: "qrc:/images/sun.png"
+ planetNumber: 0
+ }
+ ListElement {
+ name: "Mercury"
+ radius: "0.3829 x Earth"
+ temperature: "80-700 K"
+ orbitalPeriod: "87.969 d"
+ distance: "0.387 098 AU"
+ planetImageSource: "qrc:/images/mercury.png"
+ planetNumber: 1
+ }
+ ListElement {
+ name: "Venus"
+ radius: "0.9499 x Earth"
+ temperature: "737 K"
+ orbitalPeriod: "224.701 d"
+ distance: "0.723 327 AU"
+ planetImageSource: "qrc:/images/venus.png"
+ planetNumber: 2
+ }
+ ListElement {
+ name: "Earth"
+ radius: "6 378.1 km"
+ temperature: "184-330 K"
+ orbitalPeriod: "365.256 d"
+ distance: "149598261 km (1 AU)"
+ planetImageSource: "qrc:/images/earth.png"
+ planetNumber: 3
+ }
+ ListElement {
+ name: "Mars"
+ radius: "0.533 x Earth"
+ temperature: "130-308 K"
+ orbitalPeriod: "686.971 d"
+ distance: "1.523679 AU"
+ planetImageSource: "qrc:/images/mars.png"
+ planetNumber: 4
+ }
+ ListElement {
+ name: "Jupiter"
+ radius: "11.209 x Earth"
+ temperature: "112-165 K"
+ orbitalPeriod: "4332.59 d"
+ distance: "5.204267 AU"
+ planetImageSource: "qrc:/images/jupiter.png"
+ planetNumber: 5
+ }
+ ListElement {
+ name: "Saturn"
+ radius: "9.4492 x Earth"
+ temperature: "84-134 K"
+ orbitalPeriod: "10759.22 d"
+ distance: "9.5820172 AU"
+ planetImageSource: "qrc:/images/saturn.png"
+ planetNumber: 6
+ }
+ ListElement {
+ name: "Uranus"
+ radius: "4.007 x Earth"
+ temperature: "49-76 K"
+ orbitalPeriod: "30687.15 d"
+ distance: "19.189253 AU"
+ planetImageSource: "qrc:/images/uranus.png"
+ planetNumber: 7
+ }
+ ListElement {
+ name: "Neptune"
+ radius: "3.883 x Earth"
+ temperature: "55-72 K"
+ orbitalPeriod: "60190.03 d"
+ distance: "30.070900 AU"
+ planetImageSource: "qrc:/images/neptune.png"
+ planetNumber: 8
+ }
+ ListElement {
+ name: "Solar System"
+ planetImageSource: ""
+ planetNumber: 100 // Defaults to solar system
+ }
+ }
+
+ Component {
+ id: planetButtonDelegate
+ PlanetButton {
+ source: model.planetImageSource
+ text: model.name
+ focusPlanet: model.planetNumber
+ planetSelector: mainview
+ buttonSize: planetButtonSize
+ fontSize: textSize
+
+ scale: activeFocus ? 1.4 : 1.0
+
+ Behavior on scale {
+ PropertyAnimation {
+ duration: 200
+ }
+ }
+
+ signal swipeUp()
+ signal swipeDown()
+ signal swipeLeft()
+
+ onSwipeUp: {
+ if (planetButtonView.currentIndex > 0) {
+ planetButtonView.currentIndex--
+ } else {
+ rotationSpeedSlider.forceActiveFocus()
+ }
+ }
+
+ onSwipeDown: {
+ if (planetButtonView.currentIndex < planetButtonView.count - 1) {
+ planetButtonView.currentIndex++
+ } else {
+ planetSizeSlider.forceActiveFocus()
+ }
+ }
+
+ onSwipeLeft: {
+ if (index <= planetButtonView.count / 2) {
+ rotationSpeedSlider.forceActiveFocus()
+ } else {
+ planetSizeSlider.forceActiveFocus()
+ }
+ }
+
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Select) {
+ planetSelector.focusedPlanet = focusPlanet
+ }
+ }
+ }
+ }
+
+ ListView {
+ id: planetButtonView
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.right: parent.right
+ anchors.rightMargin: planetButtonSize / 2
+ height: childrenRect.height
+ spacing: planetButtonSize / 6
+ width: planetButtonSize * 1.4
+ interactive: false
+ model: planetModel
+ delegate: planetButtonDelegate
+ }
+
+ InfoSheet {
+ id: info
+ width: 400
+ anchors.right: planetButtonView.left
+ anchors.rightMargin: 40
+ opacity: 1
+
+ // Set initial information for Solar System
+ planet: "Solar System"
+ exampleDetails: "This example shows a 3D model of the Solar</p>" +
+ "<p>System comprised of the Sun and the eight</p>" +
+ "<p>planets orbiting the Sun.</p></br>" +
+ "<p>The example is implemented using Qt3D.</p>" +
+ "<p>The textures and images used in the example</p>" +
+ "<p>are Copyright (c) by James Hastings-Trew,</p>" +
+ "<a href=\"http://planetpixelemporium.com/planets.html\">" +
+ "http://planetpixelemporium.com/planets.html</a>"
+ }
+
+ function updatePlanetInfo() {
+ info.width = 200
+
+ if (focusedPlanet !== 100) {
+ info.planet = planetModel.get(focusedPlanet).name
+ info.radius = planetModel.get(focusedPlanet).radius
+ info.temperature = planetModel.get(focusedPlanet).temperature
+ info.orbitalPeriod = planetModel.get(focusedPlanet).orbitalPeriod
+ info.distance = planetModel.get(focusedPlanet).distance
+ }
+ }
+
+ Row {
+ anchors.top: parent.top
+ anchors.topMargin: 10
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ spacing: 10
+ scale: rotationSpeedSlider.activeFocus ? 1.4 : 1.0
+ opacity: rotationSpeedSlider.activeFocus ? 1.0 : 0.5
+
+ Behavior on scale {
+ PropertyAnimation {
+ duration: 200
+ }
+ }
+
+ Text {
+ anchors.verticalCenter: parent.verticalCenter
+
+ font.family: "Helvetica"
+ font.pixelSize: textSize
+ font.weight: Font.Light
+ color: rotationSpeedSlider.panningEnabled ? "#80c342" : "#ffffff"
+ text: "Rotation Speed"
+ }
+
+ StyledSlider {
+ id: rotationSpeedSlider
+ anchors.verticalCenter: parent.verticalCenter
+ width: sliderLength
+ value: 0.2
+ from: 0
+ to: 1
+ onValueChanged: solarsystem.changeSpeed(value)
+
+ focus: Qt.platform.os === "tvos" ? true : false
+
+ property bool panningEnabled: false
+ signal swipeDown()
+ signal swipeLeft()
+ signal swipeRight()
+ signal pannedHorizontally(real p)
+ signal pannedVertically(real p)
+
+ onSwipeDown: {
+ planetSizeSlider.forceActiveFocus()
+ }
+
+ onSwipeLeft: {
+ viewingDistanceSlider.forceActiveFocus()
+ }
+
+ onSwipeRight: {
+ planetButtonView.currentIndex = 0
+ planetButtonView.forceActiveFocus()
+ }
+
+ onPannedHorizontally: {
+ var step = (to - from) / 30
+
+ if (p > 0) {
+ value += step
+ } else {
+ value -= step
+ }
+ }
+
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Select) {
+ panningEnabled = !panningEnabled
+ }
+ }
+ }
+ }
+
+ Column {
+ anchors.left: parent.left
+ anchors.leftMargin: 30
+ anchors.verticalCenter: parent.verticalCenter
+
+ spacing: 10
+ scale: viewingDistanceSlider.activeFocus ? 1.4 : 1.0
+ opacity: viewingDistanceSlider.activeFocus ? 1.0 : 0.5
+
+ Behavior on scale {
+ PropertyAnimation {
+ duration: 200
+ }
+ }
+
+ StyledSlider {
+ id: viewingDistanceSlider
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ orientation: Qt.Vertical
+ height: sliderLength
+ value: 1
+ from: 1
+ to: 2
+ //! [2]
+ onValueChanged: solarsystem.changeCameraDistance(value)
+ //! [2]
+
+ property bool panningEnabled: false
+ signal swipeUp()
+ signal swipeDown()
+ signal swipeRight()
+ signal pannedHorizontally(real p)
+ signal pannedVertically(real p)
+
+ onSwipeUp: {
+ rotationSpeedSlider.forceActiveFocus()
+ }
+
+ onSwipeDown: {
+ planetSizeSlider.forceActiveFocus()
+ }
+
+ onSwipeRight: {
+ planetButtonView.currentIndex = 0
+ planetButtonView.forceActiveFocus()
+ }
+
+ onPannedVertically: {
+ var step = (to - from) / 30
+
+ if (p > 0) {
+ value += step
+ } else {
+ value -= step
+ }
+ }
+
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Select) {
+ panningEnabled = !panningEnabled
+ }
+ }
+ }
+
+ Text {
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ font.family: "Helvetica"
+ font.pixelSize: textSize
+ font.weight: Font.Light
+ color: viewingDistanceSlider.panningEnabled ? "#80c342" : "#ffffff"
+ text: "Viewing\nDistance"
+ }
+ }
+
+ Row {
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 10
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ spacing: 10
+ scale: planetSizeSlider.activeFocus ? 1.4 : 1.0
+ opacity: planetSizeSlider.activeFocus ? 1.0 : 0.5
+
+ Behavior on scale {
+ PropertyAnimation {
+ duration: 200
+ }
+ }
+
+ Text {
+ anchors.verticalCenter: parent.verticalCenter
+ font.family: "Helvetica"
+ font.pixelSize: textSize
+ font.weight: Font.Light
+ color: planetSizeSlider.panningEnabled ? "#80c342" : "#ffffff"
+ text: "Planet Size"
+ }
+
+ StyledSlider {
+ id: planetSizeSlider
+ anchors.verticalCenter: parent.verticalCenter
+ width: sliderLength
+ value: 1200
+ from: 1
+ to: 2000
+ onValueChanged: solarsystem.changeScale(value, false)
+
+ property bool panningEnabled: false
+ signal swipeUp()
+ signal swipeLeft()
+ signal swipeRight()
+ signal pannedHorizontally(real p)
+ signal pannedVertically(real p)
+
+ onSwipeUp: {
+ rotationSpeedSlider.forceActiveFocus()
+ }
+
+ onSwipeLeft: {
+ viewingDistanceSlider.forceActiveFocus()
+ }
+
+ onSwipeRight: {
+ planetButtonView.currentIndex = planetButtonView.count - 1
+ planetButtonView.forceActiveFocus()
+ }
+
+ onPannedHorizontally: {
+ var step = (to - from) / 30
+
+ if (p > 0) {
+ value += step
+ } else {
+ value -= step
+ }
+ }
+
+ Keys.onPressed: {
+ if (event.key === Qt.Key_Select) {
+ panningEnabled = !panningEnabled
+ }
+ }
+ }
+ }
+
+ // FPS display, initially hidden, clicking will show it
+ FpsDisplay {
+ id: fpsDisplay
+ anchors.left: parent.left
+ anchors.bottom: parent.bottom
+ width: 32
+ height: 64
+ hidden: true
+ }
+
+ Timer {
+ interval: 1000
+ repeat: true
+ running: !fpsDisplay.hidden
+ onTriggered: {
+ fpsDisplay.fps = frames
+ frames = 0
+ }
+ onRunningChanged: frames = 0
+ }
+
+ Loader {
+ anchors.fill: parent
+
+ source: Qt.platform.os === "tvos" ? "AppleTVInput.qml" : ""
+ }
+}
diff --git a/tests/manual/planets-qml/Ring.qml b/tests/manual/planets-qml/Ring.qml
new file mode 100644
index 000000000..b2c8f3b60
--- /dev/null
+++ b/tests/manual/planets-qml/Ring.qml
@@ -0,0 +1,112 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Render 2.0
+
+// TODO: Once support for meshes from arrays is implemented, replace ring.obj with that
+Mesh {
+ property real innerRadius
+ property real outerRadius
+ /*
+ property real ringSegments
+
+ property var vertices: []
+ property var faces: []
+ property var faceVertexUvs: []
+ */
+
+ source: "qrc:/meshes/ring.obj"
+
+ // Converted from the _RingGeometry() method in the threex.planets.js extension.
+ /*
+ function makeRing() {
+ innerRadius = innerRadius || 0
+ outerRadius = outerRadius || 50
+ var thetaSegments = ringSegments || 8
+ console.log(innerRadius + "," + outerRadius + "," + thetaSegments)
+
+ var normal = Qt.vector3d(0, 0, 1)
+
+ for (var i = 0; i < thetaSegments; i++) {
+ var angleLo = (i / thetaSegments) * Math.PI * 2
+ var angleHi = ((i + 1) / thetaSegments) * Math.PI * 2
+
+ var vertex1 = Qt.vector3d(innerRadius * Math.cos(angleLo),
+ innerRadius * Math.sin(angleLo),
+ 0)
+ var vertex2 = Qt.vector3d(outerRadius * Math.cos(angleLo),
+ outerRadius * Math.sin(angleLo),
+ 0)
+ var vertex3 = Qt.vector3d(innerRadius * Math.cos(angleHi),
+ innerRadius * Math.sin(angleHi),
+ 0)
+ var vertex4 = Qt.vector3d(outerRadius * Math.cos(angleHi),
+ outerRadius * Math.sin(angleHi),
+ 0)
+
+ vertices.push(vertex1)
+ vertices.push(vertex2)
+ vertices.push(vertex3)
+ vertices.push(vertex4)
+
+ var vertexIdx = i * 4
+
+ // Create the first triangle
+ var face = Qt.vector4d(vertexIdx + 0, vertexIdx + 1, vertexIdx + 2, normal)
+ var uvs = []
+
+ var uv = Qt.vector2d(0, 0)
+ uvs.push(uv)
+ uv = Qt.vector2d(1, 0)
+ uvs.push(uv)
+ uv = Qt.vector2d(0, 1)
+ uvs.push(uv)
+
+ faces.push(face)
+ //faceVertexUvs[0].push(uvs)
+ faceVertexUvs.push(uvs)
+
+ // Create the second triangle
+ face = Qt.vector4d(vertexIdx + 2, vertexIdx + 1, vertexIdx + 3, normal)
+ uvs = []
+
+ uv = Qt.vector2d(0, 1)
+ uvs.push(uv)
+ uv = Qt.vector2d(1, 0)
+ uvs.push(uv)
+ uv = Qt.vector2d(1, 1)
+ uvs.push(uv)
+
+ faces.push(face)
+ //faceVertexUvs[0].push(uvs)
+ faceVertexUvs.push(uvs)
+ }
+
+ computeFaceNormals()
+ }
+
+ // Converted from the computeFaceNormals() method in the three.js extension.
+ function computeFaceNormals() {
+ var cb = Qt.vector3d(0, 0, 0)
+ var ab = Qt.vector3d(0, 0, 0)
+
+ for (var f = 0, fl = faces.length; f < fl; f ++) {
+ var face = faces[f]
+
+ var vA = vertices[face.x]
+ var vB = vertices[face.y]
+ var vC = vertices[face.z]
+
+ cb = vC.minus(vB)
+ ab = vA.minus(vB)
+ cb = cb.crossProduct(ab)
+
+ cb = cb.normalized()
+
+ face.w = cb
+ }
+ }
+ */
+}
+
+
diff --git a/tests/manual/planets-qml/ShadowEffect.qml b/tests/manual/planets-qml/ShadowEffect.qml
new file mode 100644
index 000000000..d1fe78a3f
--- /dev/null
+++ b/tests/manual/planets-qml/ShadowEffect.qml
@@ -0,0 +1,140 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+
+Effect {
+ id: root
+
+ property Texture2D shadowTexture
+ property PlanetsLight light
+
+ parameters: [
+ Parameter { name: "lightViewProjection"; value: root.light.lightViewProjection },
+ Parameter { name: "lightPosition"; value: root.light.lightPosition },
+ Parameter { name: "lightIntensity"; value: root.light.lightIntensity },
+ Parameter { name: "shadowMapTexture"; value: root.shadowTexture }
+ ]
+
+ FilterKey { id: desktopkey; name: "name"; value: "Desktop" }
+ FilterKey { id: shadowkey; name: "pass"; value: "shadowmap" }
+ FilterKey { id: forwardkey; name : "pass"; value : "forward" }
+ FilterKey { id: eskey; name: "name"; value: "ES2" }
+
+ RenderPass {
+ id: shadowpass
+ filterKeys: [ shadowkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/gl3/shadowmap.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/gl3/shadowmap.frag")
+ }
+
+ renderStates: [
+ PolygonOffset { scaleFactor: 4; depthSteps: 4 },
+ DepthTest { depthFunction: DepthTest.Less }
+ ]
+ }
+
+ RenderPass {
+ id: glpass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/gl3/planetDShadow.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/gl3/planetDShadow.frag")
+ }
+
+ // no special render state set => use the default set of states
+ }
+
+ RenderPass {
+ id: rhishadowpass
+ filterKeys: [ shadowkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/rhi/shadowmap.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/rhi/shadowmap.frag")
+ }
+
+ renderStates: [
+ PolygonOffset { scaleFactor: 4; depthSteps: 4 },
+ DepthTest { depthFunction: DepthTest.Less }
+ ]
+ }
+
+
+ RenderPass {
+ id: rhipass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/rhi/planetDShadow.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/rhi/planetDShadow.frag")
+ }
+
+ // no special render state set => use the default set of states
+ }
+
+ RenderPass {
+ id: espass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/es2/planetD.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/es2/planetD.frag")
+ }
+
+ // no special render state set => use the default set of states
+ }
+
+
+ techniques: [
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ profile: GraphicsApiFilter.CoreProfile
+ majorVersion: 3
+ minorVersion: 2
+ }
+
+ filterKeys: [ desktopkey ]
+
+ renderPasses: [ shadowpass, glpass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ majorVersion: 2
+ }
+
+ filterKeys: [ eskey ]
+
+ renderPasses: [ espass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGLES
+ majorVersion: 2
+ minorVersion: 0
+ }
+
+ filterKeys: [ eskey ]
+
+ renderPasses: [ espass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.RHi
+ majorVersion: 1
+ minorVersion: 0
+ }
+
+ filterKeys: [ desktopkey ]
+
+ renderPasses: [ rhishadowpass, rhipass ]
+ }
+ ]
+}
diff --git a/tests/manual/planets-qml/SolarSystem.qml b/tests/manual/planets-qml/SolarSystem.qml
new file mode 100644
index 000000000..551bdd90e
--- /dev/null
+++ b/tests/manual/planets-qml/SolarSystem.qml
@@ -0,0 +1,924 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0 as QQ2
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+import Qt3D.Input 2.0
+import Qt3D.Logic 2.0
+import Qt3D.Extras 2.0
+
+import "planets.js" as Planets
+
+Entity {
+ id: sceneRoot
+
+ property bool ready: false
+
+ property real cameraNear: 0
+ property real xLookAtOffset: 0
+ property real yLookAtOffset: 0
+ property real zLookAtOffset: 0
+ property real xCameraOffset: 0
+ property real yCameraOffset: 0
+ property real zCameraOffset: 0
+
+ property var planetData
+ property var planets: []
+
+ property vector3d defaultUp: Qt.vector3d(0, 1, 0)
+ property vector3d defaultCameraPosition: Qt.vector3d(Planets.solarDistance,
+ Planets.solarDistance,
+ Planets.solarDistance)
+ property vector3d tiltAxis: Qt.vector3d(0, 0, 1)
+ property vector3d rollAxis: Qt.vector3d(0, 1, 0)
+ property real cameraDistance: 1
+ property vector3d oldCameraPosition
+ property vector3d oldFocusedPlanetPosition
+
+ property color ambientStrengthStarfield: "#000000"
+ property color ambientStrengthSun: "#ffffff"
+ property color ambientStrengthClouds: "#000000"
+ property color ambientStrengthRing: "#111111"
+ property color ambientStrengthPlanet: "#222222"
+ property real shininessSpecularMap: 50.0
+ property real shininessClouds: 10.0
+ property real shininessBasic: 1.0
+
+ property real saturnRingInnerRadius
+ property real saturnRingOuterRadius
+ property real uranusRingInnerRadius
+ property real uranusRingOuterRadius
+
+ // Time variables
+ property int year: 2000
+ property int month: 1
+ property int day: 1
+ // Time scale formula based on http://www.stjarnhimlen.se/comp/ppcomp.html
+ property real startD: 367 * year - 7 * (year + (month + 9) / 12) / 4 + 275 * month / 9 + day - 730530
+ property real oldTimeD: startD
+ property real currTimeD: startD
+ property real deltaTimeD: 0
+ property real daysPerFrame
+ property real daysPerFrameScale
+
+ property real planetScale
+
+ property bool focusedScaling: false
+ property int focusedMinimumScale: 20
+ property real actualScale
+
+ // Animate solar system with LogicComponent
+ FrameAction {
+ onTriggered: {
+ frames++
+ animate(focusedPlanet)
+ }
+ }
+
+ PlanetsLight {
+ id: light
+ ratio: width / height
+ }
+
+ Camera {
+ id: camera
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: width / height
+ nearPlane: 2500.0
+ farPlane: 20000.0
+ position: defaultCameraPosition
+ upVector: defaultUp
+ viewCenter: Qt.vector3d( xLookAtOffset, yLookAtOffset, zLookAtOffset )
+ }
+
+ FirstPersonCameraController { camera: camera }
+
+ components: [
+ PlanetFrameGraph {
+ id: framegraph
+ viewCamera: camera
+ lightCamera: light.lightCamera
+ },
+ InputSettings {}
+ ]
+
+ PlanetEffect {
+ id: effectD
+ light: light
+ }
+
+ PlanetEffect {
+ id: effectDB
+ light: light
+ vertexES: "qrc:/shaders/es2/planetDB.vert"
+ fragmentES: "qrc:/shaders/es2/planetDB.frag"
+ vertexGL: "qrc:/shaders/gl3/planetDB.vert"
+ fragmentGL: "qrc:/shaders/gl3/planetDB.frag"
+ vertexRHI: "qrc:/shaders/rhi/planetDB.vert"
+ fragmentRHI: "qrc:/shaders/rhi/planetDB.frag"
+ }
+
+ PlanetEffect {
+ id: effectDSB
+ light: light
+ vertexES: "qrc:/shaders/es2/planetDB.vert"
+ fragmentES: "qrc:/shaders/es2/planetDSB.frag"
+ vertexGL: "qrc:/shaders/gl3/planetDB.vert"
+ fragmentGL: "qrc:/shaders/gl3/planetDSB.frag"
+ vertexRHI: "qrc:/shaders/rhi/planetDB.vert"
+ fragmentRHI: "qrc:/shaders/rhi/planetDSB.frag"
+ }
+
+ PlanetEffect {
+ id: cloudEffect
+ light: light
+ vertexES: "qrc:/shaders/es2/planetD.vert"
+ fragmentES: "qrc:/shaders/es2/planetDS.frag"
+ vertexGL: "qrc:/shaders/gl3/planetD.vert"
+ fragmentGL: "qrc:/shaders/gl3/planetDS.frag"
+ vertexRHI: "qrc:/shaders/rhi/planetD.vert"
+ fragmentRHI: "qrc:/shaders/rhi/planetDS.frag"
+ }
+
+ SunEffect {
+ id: sunEffect
+ }
+
+ ShadowEffect {
+ id: shadowMapEffect
+ shadowTexture: framegraph.shadowTexture
+ light: light
+ }
+
+ //! [2]
+ QQ2.Component.onCompleted: {
+ planetData = Planets.loadPlanetData()
+ // Push in the correct order
+ planets.push(sun)
+ planets.push(mercury)
+ planets.push(venus)
+ planets.push(earth)
+ planets.push(mars)
+ planets.push(jupiter)
+ planets.push(saturn)
+ planets.push(uranus)
+ planets.push(neptune)
+ planets.push(moon)
+ // TODO: Once support for creating meshes from arrays is implemented take these into use
+ //saturnRing.makeRing()
+ //uranusRing.makeRing()
+ saturnRingOuterRadius = planetData[Planets.SATURN].radius + Planets.saturnOuterRadius
+ saturnRingInnerRadius = planetData[Planets.SATURN].radius + 0.006630
+ uranusRingOuterRadius = planetData[Planets.URANUS].radius + Planets.uranusOuterRadius
+ uranusRingInnerRadius = planetData[Planets.URANUS].radius + 0.002
+ ready = true
+ changeScale(1200)
+ changeSpeed(0.2)
+ setLookAtOffset(Planets.SUN)
+ }
+ //! [2]
+
+ //! [0]
+ QQ2.NumberAnimation {
+ id: lookAtOffsetAnimation
+ target: sceneRoot
+ properties: "xLookAtOffset, yLookAtOffset, zLookAtOffset"
+ to: 0
+// easing.type: Easing.InOutQuint
+ duration: 1250
+ }
+
+ QQ2.NumberAnimation {
+ id: cameraOffsetAnimation
+ target: sceneRoot
+ properties: "xCameraOffset, yCameraOffset, zCameraOffset"
+ to: 0
+// easing.type: Easing.InOutQuint
+ duration: 2500
+ }
+ //! [0]
+
+ QQ2.Behavior on cameraNear {
+ QQ2.PropertyAnimation {
+// easing.type: Easing.InOutQuint
+ duration: 2500
+ }
+ }
+
+ function changePlanetFocus(oldPlanet, focusedPlanet) {
+ setOldPlanet(oldPlanet, focusedPlanet)
+ setLookAtOffset(focusedPlanet)
+ setCameraOffset(oldPlanet, focusedPlanet)
+ lookAtOffsetAnimation.restart()
+ cameraOffsetAnimation.restart()
+ }
+
+ function setOldPlanet(oldPlanet, focusedPlanet) {
+ oldCameraPosition = camera.position
+
+ var planet = 0
+ if (oldPlanet !== Planets.SOLAR_SYSTEM)
+ planet = oldPlanet
+ oldFocusedPlanetPosition = Qt.vector3d(planets[planet].x,
+ planets[planet].y,
+ planets[planet].z)
+ checkScaling(focusedPlanet)
+ }
+
+ function setScale(value, focused) {
+ // Save actual scale
+ if (!focused)
+ actualScale = value
+
+ // Limit minimum scaling in focus mode to avoid jitter caused by rounding errors
+ if (value <= focusedMinimumScale && (focusedScaling || focused))
+ planetScale = focusedMinimumScale
+ else
+ planetScale = actualScale
+ return planetScale
+ }
+
+ function checkScaling(focusedPlanet) {
+ if (focusedPlanet !== Planets.SOLAR_SYSTEM) {
+ // Limit minimum scaling in focus mode to avoid jitter caused by rounding errors
+ if (actualScale <= focusedMinimumScale) {
+ planetScale = focusedMinimumScale
+ changeScale(focusedMinimumSfocusedPlanetcale, true)
+ }
+ focusedScaling = true
+ } else if (focusedScaling === true) {
+ // Restore normal scaling
+ focusedScaling = false
+ changeScale(actualScale, false)
+ }
+ }
+
+ function setLookAtOffset(focusedPlanet) {
+ var offset = oldFocusedPlanetPosition
+
+ var planet = 0
+ if (focusedPlanet !== Planets.SOLAR_SYSTEM)
+ planet = focusedPlanet
+
+ var focusedPlanetPosition = Qt.vector3d(planets[planet].x,
+ planets[planet].y,
+ planets[planet].z)
+ offset = offset.minus(focusedPlanetPosition)
+
+ xLookAtOffset = offset.x
+ yLookAtOffset = offset.y
+ zLookAtOffset = offset.z
+ }
+
+ function setCameraOffset(oldPlanet, focusedPlanet) {
+ var offset = oldCameraPosition
+
+ var planet = 0
+ if (focusedPlanet !== Planets.SOLAR_SYSTEM)
+ planet = focusedPlanet
+
+ var newCameraPosition = getNewCameraPosition(focusedPlanet, Planets.getOuterRadius(planet))
+
+ if (focusedPlanet !== Planets.SUN)
+ offset = offset.minus(newCameraPosition)
+
+ if (oldPlanet === Planets.SOLAR_SYSTEM && focusedPlanet === Planets.SUN) {
+ xCameraOffset = Math.abs(offset.x)
+ yCameraOffset = Math.abs(offset.y)
+ zCameraOffset = Math.abs(offset.z)
+ } else { // from a planet to another
+ xCameraOffset = offset.x
+ yCameraOffset = offset.y
+ zCameraOffset = offset.z
+ }
+ }
+
+ function getNewCameraPosition(focusedPlanet, radius) {
+ var position
+ if (focusedPlanet === Planets.SOLAR_SYSTEM) {
+ position = defaultCameraPosition
+ position = position.times(cameraDistance)
+ } else if (focusedPlanet === Planets.SUN) {
+ position = Qt.vector3d(radius * planetScale * 2,
+ radius * planetScale * 2,
+ radius * planetScale * 2)
+ position = position.times(cameraDistance)
+ } else {
+ var vec1 = Qt.vector3d(planets[focusedPlanet].x,
+ planets[focusedPlanet].y,
+ planets[focusedPlanet].z)
+ var vec2 = defaultUp
+ vec1 = vec1.normalized()
+ vec2 = vec2.crossProduct(vec1)
+ vec2 = vec2.times(radius * planetScale * cameraDistance * 4)
+ vec2 = vec2.plus(Qt.vector3d(planets[focusedPlanet].x,
+ planets[focusedPlanet].y,
+ planets[focusedPlanet].z))
+ vec1 = Qt.vector3d(0, radius * planetScale, 0)
+ vec2 = vec2.plus(vec1)
+ position = vec2
+ }
+ return position
+ }
+
+ function advanceTime(focusedPlanet) {
+ if (focusedPlanet === Planets.SOLAR_SYSTEM)
+ daysPerFrame = daysPerFrameScale * 10
+ else
+ daysPerFrame = daysPerFrameScale * planetData[focusedPlanet].period / 100.0
+
+ // Advance the time in days
+ oldTimeD = currTimeD
+ currTimeD = currTimeD + daysPerFrame
+ deltaTimeD = currTimeD - oldTimeD
+ }
+
+ function positionPlanet(i) {
+ var planet = planetData[i]
+ var target = planets[i]
+
+ if (i !== Planets.SUN) {
+ // Calculate the planet orbital elements from the current time in days
+ var N = (planet.N1 + planet.N2 * currTimeD) * Math.PI / 180
+ var iPlanet = (planet.i1 + planet.i2 * currTimeD) * Math.PI / 180
+ var w = (planet.w1 + planet.w2 * currTimeD) * Math.PI / 180
+ var a = planet.a1 + planet.a2 * currTimeD
+ var e = planet.e1 + planet.e2 * currTimeD
+ var M = (planet.M1 + planet.M2 * currTimeD) * Math.PI / 180
+ var E = M + e * Math.sin(M) * (1.0 + e * Math.cos(M))
+
+ var xv = a * (Math.cos(E) - e)
+ var yv = a * (Math.sqrt(1.0 - e * e) * Math.sin(E))
+ var v = Math.atan2(yv, xv)
+
+ // Calculate the distance (radius)
+ // TODO: Math.hypot() is ES6 and QML JS is only ES5 currently. A patch to QtQml is
+ // required to get Math.hypot() to work.
+ //var r = Math.hypot(xv, yv)
+ var r = Math.sqrt(Math.pow(xv, 2) + Math.pow(yv, 2))
+
+ // From http://www.davidcolarusso.com/astro/
+ // Modified to compensate for the right handed coordinate system of OpenGL
+ var xh = r * (Math.cos(N) * Math.cos(v + w)
+ - Math.sin(N) * Math.sin(v + w) * Math.cos(iPlanet))
+ var zh = -r * (Math.sin(N) * Math.cos(v + w)
+ + Math.cos(N) * Math.sin(v + w) * Math.cos(iPlanet))
+ var yh = r * (Math.sin(w + v) * Math.sin(iPlanet))
+
+ // Apply the position offset from the center of orbit to the bodies
+ var centerOfOrbit = planet.centerOfOrbit
+ target.x = planets[centerOfOrbit].x + xh * Planets.auScale
+ target.y = planets[centerOfOrbit].y + yh * Planets.auScale
+ target.z = planets[centerOfOrbit].z + zh * Planets.auScale
+ }
+ // Calculate the rotation (roll) of the bodies. Tilt does not change.
+ target.roll += (deltaTimeD / planet.period) * 360 // In degrees
+ }
+
+ function changeScale(scale, focused) {
+ if (!ready)
+ return
+
+ var scaling = setScale(scale, focused)
+ sun.r = planetData[Planets.SUN].radius * scaling / 10
+ mercury.r = planetData[Planets.MERCURY].radius * scaling
+ venus.r = planetData[Planets.VENUS].radius * scaling
+ earth.r = planetData[Planets.EARTH].radius * scaling
+ earthClouds.r = planetData[Planets.EARTH].radius * scaling * 1.02
+ moon.r = planetData[Planets.MOON].radius * scaling
+ mars.r = planetData[Planets.MARS].radius * scaling
+ jupiter.r = planetData[Planets.JUPITER].radius * scaling
+ saturn.r = planetData[Planets.SATURN].radius * scaling
+ saturnRing.outerRadius = saturnRingOuterRadius * scaling
+ saturnRing.innerRadius = saturnRingInnerRadius * scaling
+ uranus.r = planetData[Planets.URANUS].radius * scaling
+ uranusRing.outerRadius = uranusRingOuterRadius * scaling
+ uranusRing.innerRadius = uranusRingInnerRadius * scaling
+ neptune.r = planetData[Planets.NEPTUNE].radius * scaling
+ }
+
+ function changeSpeed(speed) {
+ daysPerFrameScale = speed
+ }
+
+ function changeCameraDistance(distance) {
+ cameraDistance = distance
+ }
+
+ //! [3]
+ function animate(focusedPlanet) {
+ if (!ready)
+ return
+
+ advanceTime(focusedPlanet)
+ for (var i = 0; i <= Planets.NUM_SELECTABLE_PLANETS; i++)
+ positionPlanet(i)
+
+ updateCamera(focusedPlanet)
+ }
+ //! [3]
+
+ function updateCamera(focusedPlanet) {
+ // Get the appropriate near plane position for the camera and animate it with QML animations
+ var outerRadius = Planets.getOuterRadius(focusedPlanet)
+ cameraNear = outerRadius
+ camera.nearPlane = cameraNear
+ light.near = cameraNear
+
+ // Calculate position
+ var cameraPosition = getNewCameraPosition(focusedPlanet, outerRadius)
+ var cameraOffset = Qt.vector3d(xCameraOffset, yCameraOffset, zCameraOffset)
+ cameraPosition = cameraPosition.plus(cameraOffset)
+
+ // Calculate look-at point
+ var lookAtPlanet = Planets.SUN
+ if (focusedPlanet !== Planets.SOLAR_SYSTEM)
+ lookAtPlanet = focusedPlanet
+ var cameraLookAt = Qt.vector3d(planets[lookAtPlanet].x,
+ planets[lookAtPlanet].y,
+ planets[lookAtPlanet].z)
+ var lookAtOffset = Qt.vector3d(xLookAtOffset, yLookAtOffset, zLookAtOffset)
+ cameraLookAt = cameraLookAt.plus(lookAtOffset)
+
+ // Set position and look-at
+ camera.viewCenter = cameraLookAt
+ camera.position = Qt.vector3d(cameraPosition.x, cameraPosition.y, cameraPosition.z)
+ camera.upVector = defaultUp
+ }
+
+ //
+ // STARFIELD
+ //
+
+ Entity {
+ id: starfieldEntity
+
+ Mesh {
+ id: starfield
+ source: "qrc:/meshes/starfield.obj"
+ }
+
+ PlanetMaterial {
+ id: materialStarfield
+ effect: effectD
+ ambientLight: ambientStrengthStarfield
+ specularColor: Qt.rgba(0.0, 0.0, 0.0, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/galaxy_starfield.jpg"
+ shininess: 1000000.0
+ }
+
+ property Transform transformStarfield: Transform {
+ scale: 8500
+ translation: Qt.vector3d(0, 0, 0)
+ }
+
+ components: [ starfield, materialStarfield, transformStarfield ]
+ }
+
+ //
+ // SUN
+ //
+
+ Entity {
+ id: sunEntity
+
+ Planet {
+ id: sun
+ tilt: planetData[Planets.SUN].tilt
+ }
+
+ PlanetMaterial {
+ id: materialSun
+ effect: sunEffect
+ ambientLight: ambientStrengthSun
+ diffuseMap: "qrc:/images/solarsystemscope/sunmap.jpg"
+ }
+
+ property Transform transformSun: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(sun.x, sun.y, sun.z))
+ m.rotate(sun.tilt, tiltAxis)
+ m.rotate(sun.roll, rollAxis)
+ m.scale(sun.r)
+ return m
+ }
+ }
+
+ components: [ sun, materialSun, transformSun ]
+ }
+
+ //
+ // PLANETS
+ //
+
+ // MERCURY
+
+ Entity {
+ id: mercuryEntity
+
+ Planet {
+ id: mercury
+ tilt: planetData[Planets.MERCURY].tilt
+ }
+
+ PlanetMaterial {
+ id: materialMercury
+ effect: effectDB
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/mercurymap.jpg"
+ normalMap: "qrc:/images/solarsystemscope/mercurynormal.jpg"
+ shininess: shininessSpecularMap
+ }
+
+ property Transform transformMercury: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(mercury.x, mercury.y, mercury.z))
+ m.rotate(mercury.tilt, tiltAxis)
+ m.rotate(mercury.roll, rollAxis)
+ m.scale(mercury.r)
+ return m
+ }
+ }
+
+ components: [ mercury, materialMercury, transformMercury ]
+ }
+
+ // VENUS
+
+ Entity {
+ id: venusEntity
+
+ Planet {
+ id: venus
+ tilt: planetData[Planets.VENUS].tilt
+ }
+
+ PlanetMaterial {
+ id: materialVenus
+ effect: effectDB
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/venusmap.jpg"
+ normalMap: "qrc:/images/solarsystemscope/venusnormal.jpg"
+ shininess: shininessSpecularMap
+ }
+
+ property Transform transformVenus: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(venus.x, venus.y, venus.z))
+ m.rotate(venus.tilt, tiltAxis)
+ m.rotate(venus.roll, rollAxis)
+ m.scale(venus.r)
+ return m
+ }
+ }
+
+ components: [ venus, materialVenus, transformVenus ]
+ }
+
+ // EARTH
+
+ //! [1]
+ Entity {
+ id: earthEntity
+
+ Planet {
+ id: earth
+ tilt: planetData[Planets.EARTH].tilt
+ }
+
+ PlanetMaterial {
+ id: materialEarth
+ effect: effectDSB
+ ambientLight: ambientStrengthPlanet
+ diffuseMap: "qrc:/images/solarsystemscope/earthmap2k.jpg"
+ specularMap: "qrc:/images/solarsystemscope/earthspec2k.jpg"
+ normalMap: "qrc:/images/solarsystemscope/earthnormal2k.jpg"
+ shininess: shininessSpecularMap
+ }
+
+ property Transform transformEarth: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(earth.x, earth.y, earth.z))
+ m.rotate(earth.tilt, tiltAxis)
+ m.rotate(earth.roll, rollAxis)
+ m.scale(earth.r)
+ return m
+ }
+ }
+
+ components: [ earth, materialEarth, transformEarth ]
+ }
+ //! [1]
+
+ // EARTH CLOUDS
+
+ Entity {
+ id: earthCloudsEntity
+
+ Planet {
+ id: earthClouds
+ tilt: planetData[Planets.EARTH].tilt
+ }
+
+ PlanetMaterial {
+ id: materialEarthClouds
+ effect: cloudEffect
+ ambientLight: ambientStrengthClouds
+ diffuseMap: "qrc:/images/solarsystemscope/earthcloudmapcolortrans.png"
+ specularMap: "qrc:/images/solarsystemscope/earthcloudmapspec.jpg"
+ shininess: shininessClouds
+ opacity: 0.2
+ }
+
+ property Transform transformEarthClouds: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(earth.x, earth.y, earth.z))
+ m.rotate(earth.tilt, tiltAxis)
+ m.rotate(earth.roll / 1.2, rollAxis)
+ m.scale(earthClouds.r)
+ return m
+ }
+ }
+
+ components: [ earthClouds, materialEarthClouds, transformEarthClouds ]
+ }
+
+ // MOON
+
+ Entity {
+ id: moonEntity
+
+ Planet {
+ id: moon
+ tilt: planetData[Planets.MOON].tilt
+ }
+
+ PlanetMaterial {
+ id: materialMoon
+ effect: effectDB
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/moonmap2k.jpg"
+ normalMap: "qrc:/images/solarsystemscope/moonnormal2k.jpg"
+ shininess: shininessSpecularMap
+ }
+
+ property Transform transformMoon: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(moon.x, moon.y, moon.z))
+ m.rotate(moon.tilt, tiltAxis)
+ m.rotate(moon.roll, rollAxis)
+ m.scale(moon.r)
+ return m
+ }
+ }
+
+ components: [ moon, materialMoon, transformMoon ]
+ }
+
+ // MARS
+
+ Entity {
+ id: marsEntity
+
+ Planet {
+ id: mars
+ tilt: planetData[Planets.MARS].tilt
+ }
+
+ PlanetMaterial {
+ id: materialMars
+ effect: effectDB
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/marsmap2k.jpg"
+ normalMap: "qrc:/images/solarsystemscope/marsnormal2k.jpg"
+ shininess: shininessSpecularMap
+ }
+
+ property Transform transformMars: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(mars.x, mars.y, mars.z))
+ m.rotate(mars.tilt, tiltAxis)
+ m.rotate(mars.roll, rollAxis)
+ m.scale(mars.r)
+ return m
+ }
+ }
+
+ components: [ mars, materialMars, transformMars ]
+ }
+
+ // JUPITER
+
+ Entity {
+ id: jupiterEntity
+
+ Planet {
+ id: jupiter
+ tilt: planetData[Planets.JUPITER].tilt
+ }
+
+ PlanetMaterial {
+ id: materialJupiter
+ effect: effectD
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/jupitermap.jpg"
+ shininess: shininessBasic
+ }
+
+ property Transform transformJupiter: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(jupiter.x, jupiter.y, jupiter.z))
+ m.rotate(jupiter.tilt, tiltAxis)
+ m.rotate(jupiter.roll, rollAxis)
+ m.scale(jupiter.r)
+ return m
+ }
+ }
+
+ components: [ jupiter, materialJupiter, transformJupiter ]
+ }
+
+ // SATURN
+
+ Entity {
+ id: saturnEntity
+
+ Planet {
+ id: saturn
+ tilt: planetData[Planets.SATURN].tilt
+ }
+
+ PlanetMaterial {
+ id: materialSaturn
+ effect: shadowMapEffect
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/saturnmap.jpg"
+ shininess: shininessBasic
+ }
+
+ property Transform transformSaturn: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(saturn.x, saturn.y, saturn.z))
+ m.rotate(saturn.tilt, tiltAxis)
+ m.rotate(saturn.roll, rollAxis)
+ m.scale(saturn.r)
+ return m
+ }
+ }
+
+ components: [ saturn, materialSaturn, transformSaturn ]
+ }
+
+ // SATURN RING
+
+ Entity {
+ id: saturnRingEntity
+
+ Ring {
+ id: saturnRing
+ innerRadius: saturnRingInnerRadius
+ outerRadius: saturnRingOuterRadius
+ }
+
+ PlanetMaterial {
+ id: materialSaturnRing
+ effect: shadowMapEffect
+ ambientLight: ambientStrengthRing
+ specularColor: Qt.rgba(0.01, 0.01, 0.01, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/saturnringcolortrans.png"
+ shininess: shininessBasic
+ opacity: 0.4
+ }
+
+ property Transform transformSaturnRing: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(saturn.x, saturn.y, saturn.z))
+ m.rotate(saturn.tilt, tiltAxis)
+ m.rotate(saturn.roll / 10, rollAxis)
+ m.scale((saturnRing.innerRadius + saturnRing.outerRadius) / 1.75)
+ return m
+ }
+ }
+
+ components: [ saturnRing, materialSaturnRing, transformSaturnRing ]
+ }
+
+ // URANUS
+
+ Entity {
+ id: uranusEntity
+
+ Planet {
+ id: uranus
+ tilt: planetData[Planets.URANUS].tilt
+ }
+
+ PlanetMaterial {
+ id: materialUranus
+ effect: shadowMapEffect
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/uranusmap.jpg"
+ shininess: shininessBasic
+ }
+
+ property Transform transformUranus: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(uranus.x, uranus.y, uranus.z))
+ m.rotate(uranus.tilt, tiltAxis)
+ m.rotate(uranus.roll, rollAxis)
+ m.scale(uranus.r)
+ return m
+ }
+ }
+
+ components: [ uranus, materialUranus, transformUranus ]
+ }
+
+ // URANUS RING
+
+ Entity {
+ id: uranusRingEntity
+
+ Ring {
+ id: uranusRing
+ innerRadius: uranusRingInnerRadius
+ outerRadius: uranusRingOuterRadius
+ }
+
+ PlanetMaterial {
+ id: materialUranusRing
+ effect: shadowMapEffect
+ ambientLight: ambientStrengthRing
+ specularColor: Qt.rgba(0.01, 0.01, 0.01, 1.0)
+ diffuseMap: "qrc:/images/nasa/uranusringcolortrans.png"
+ shininess: shininessBasic
+ opacity: 0.4
+ }
+
+ property Transform transformUranusRing: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(uranus.x, uranus.y, uranus.z))
+ m.rotate(uranus.tilt, tiltAxis)
+ m.rotate(uranus.roll / 10, rollAxis)
+ m.scale((uranusRing.innerRadius + uranusRing.outerRadius) / 1.75)
+ return m
+ }
+ }
+
+ components: [ uranusRing, materialUranusRing, transformUranusRing ]
+ }
+
+ // NEPTUNE
+
+ Entity {
+ id: neptuneEntity
+
+ Planet {
+ id: neptune
+ tilt: planetData[Planets.NEPTUNE].tilt
+ }
+
+ PlanetMaterial {
+ id: materialNeptune
+ effect: effectD
+ ambientLight: ambientStrengthPlanet
+ specularColor: Qt.rgba(0.2, 0.2, 0.2, 1.0)
+ diffuseMap: "qrc:/images/solarsystemscope/neptunemap.jpg"
+ shininess: shininessBasic
+ }
+
+ property Transform transformNeptune: Transform {
+ matrix: {
+ var m = Qt.matrix4x4()
+ m.translate(Qt.vector3d(neptune.x, neptune.y, neptune.z))
+ m.rotate(neptune.tilt, tiltAxis)
+ m.rotate(neptune.roll, rollAxis)
+ m.scale(neptune.r)
+ return m
+ }
+ }
+
+ components: [ neptune, materialNeptune, transformNeptune ]
+ }
+}
diff --git a/tests/manual/planets-qml/StyledSlider.qml b/tests/manual/planets-qml/StyledSlider.qml
new file mode 100644
index 000000000..6b56e83af
--- /dev/null
+++ b/tests/manual/planets-qml/StyledSlider.qml
@@ -0,0 +1,10 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import QtQuick 2.0
+import QtQuick.Controls 2.0
+
+Slider {
+ id: styledSlider
+}
+
diff --git a/tests/manual/planets-qml/SunEffect.qml b/tests/manual/planets-qml/SunEffect.qml
new file mode 100644
index 000000000..9b2f4b574
--- /dev/null
+++ b/tests/manual/planets-qml/SunEffect.qml
@@ -0,0 +1,97 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+import Qt3D.Core 2.0
+import Qt3D.Render 2.0
+
+Effect {
+ id: root
+
+ FilterKey { id: desktopkey; name: "name"; value: "Desktop" }
+ FilterKey { id: forwardkey; name : "pass"; value : "forward" }
+ FilterKey { id: eskey; name: "name"; value: "ES2" }
+
+ RenderPass {
+ id: glpass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/gl3/sun.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/gl3/sun.frag")
+ }
+
+ // no special render state set => use the default set of states
+ }
+
+ RenderPass {
+ id: rhipass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/rhi/sun.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/rhi/sun.frag")
+ }
+
+ // no special render state set => use the default set of states
+ }
+
+ RenderPass {
+ id: espass
+ filterKeys: [ forwardkey ]
+
+ shaderProgram: ShaderProgram {
+ vertexShaderCode: loadSource("qrc:/shaders/es2/sun.vert")
+ fragmentShaderCode: loadSource("qrc:/shaders/es2/sun.frag")
+ }
+
+ // no special render state set => use the default set of states
+ }
+
+ techniques: [
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ profile: GraphicsApiFilter.CoreProfile
+ majorVersion: 3
+ minorVersion: 2
+ }
+
+ filterKeys: [ desktopkey ]
+
+ renderPasses: [ glpass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ majorVersion: 2
+ }
+
+ filterKeys: [ eskey ]
+
+ renderPasses: [ espass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGLES
+ majorVersion: 2
+ minorVersion: 0
+ }
+
+ filterKeys: [ eskey ]
+
+ renderPasses: [ espass ]
+ },
+ Technique {
+ graphicsApiFilter {
+ api: GraphicsApiFilter.RHI
+ majorVersion: 1
+ minorVersion: 0
+ }
+
+ filterKeys: [ desktopkey ]
+
+ renderPasses: [ rhipass ]
+ }
+ ]
+}
diff --git a/tests/manual/planets-qml/android/AndroidManifest.xml b/tests/manual/planets-qml/android/AndroidManifest.xml
new file mode 100644
index 000000000..2029425d1
--- /dev/null
+++ b/tests/manual/planets-qml/android/AndroidManifest.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="org.qtproject.planets.qml"
+ android:installLocation="auto"
+ android:versionCode="1"
+ android:versionName="1.0">
+ <!-- The comment below will be replaced with dependencies permissions upon deployment.
+ Remove the comment if you do not require these default permissions. -->
+ <!-- %%INSERT_PERMISSIONS -->
+
+ <!-- The comment below will be replaced with dependencies permissions upon deployment.
+ Remove the comment if you do not require these default features. -->
+ <!-- %%INSERT_FEATURES -->
+
+ <supports-screens
+ android:anyDensity="true"
+ android:largeScreens="true"
+ android:normalScreens="true"
+ android:smallScreens="true" />
+ <application
+ android:name="org.qtproject.qt.android.bindings.QtApplication"
+ android:extractNativeLibs="true"
+ android:hardwareAccelerated="true"
+ android:label="-- %%INSERT_APP_NAME%% --"
+ android:requestLegacyExternalStorage="true"
+ android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
+ android:icon="@drawable/icon">
+ <activity
+ android:name="org.qtproject.qt.android.bindings.QtActivity"
+ android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density"
+ android:label="-- %%INSERT_APP_NAME%% --"
+ android:launchMode="singleTop"
+ android:screenOrientation="unspecified">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
+ </intent-filter>
+
+ <meta-data
+ android:name="android.app.lib_name"
+ android:value="-- %%INSERT_APP_LIB_NAME%% --"/>
+
+ <meta-data
+ android:name="android.app.background_running"
+ android:value="false"/>
+ </activity>
+ </application>
+</manifest>
diff --git a/tests/manual/planets-qml/android/res/drawable-hdpi/icon.png b/tests/manual/planets-qml/android/res/drawable-hdpi/icon.png
new file mode 100644
index 000000000..bd5939f42
--- /dev/null
+++ b/tests/manual/planets-qml/android/res/drawable-hdpi/icon.png
Binary files differ
diff --git a/tests/manual/planets-qml/android/res/drawable-ldpi/icon.png b/tests/manual/planets-qml/android/res/drawable-ldpi/icon.png
new file mode 100644
index 000000000..bd5939f42
--- /dev/null
+++ b/tests/manual/planets-qml/android/res/drawable-ldpi/icon.png
Binary files differ
diff --git a/tests/manual/planets-qml/android/res/drawable-mdpi/icon.png b/tests/manual/planets-qml/android/res/drawable-mdpi/icon.png
new file mode 100644
index 000000000..bd5939f42
--- /dev/null
+++ b/tests/manual/planets-qml/android/res/drawable-mdpi/icon.png
Binary files differ
diff --git a/tests/manual/planets-qml/doc/images/planets-qml-example.jpg b/tests/manual/planets-qml/doc/images/planets-qml-example.jpg
new file mode 100644
index 000000000..d388d5ee4
--- /dev/null
+++ b/tests/manual/planets-qml/doc/images/planets-qml-example.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/doc/src/planets-qml.qdoc b/tests/manual/planets-qml/doc/src/planets-qml.qdoc
new file mode 100644
index 000000000..a515a9721
--- /dev/null
+++ b/tests/manual/planets-qml/doc/src/planets-qml.qdoc
@@ -0,0 +1,82 @@
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
+
+/*!
+ \example planets-qml
+ \title Qt 3D: Planets QML Example
+ \ingroup qt3d-examples-qml
+ \brief Demonstrates combining Qt 3D rendering and Qt Quick 2 elements.
+
+ \image planets-qml-example.jpg
+
+ \e Planets demonstrates how to implement an application that combines the use of
+ Qt 3D rendering with Qt Quick 2D elements. The example shows the eight planets of our Solar
+ System with the Sun.
+
+ Planet texture maps are Copyright (c) by James Hastings-Trew
+ \l{http://planetpixelemporium.com/planets.html}{http://planetpixelemporium.com/planets.html}
+ used with permission.
+
+ The planets are rotating around the Sun based on their orbit at a given time. The rotation
+ starts at 2000 Jan 0.0 UT. The planet positions are calculated based on the formulas found here:
+ \l {http://www.stjarnhimlen.se/comp/ppcomp.html}{http://www.stjarnhimlen.se/comp/ppcomp.html}
+ and \l {http://www.davidcolarusso.com/astro/}{http://www.davidcolarusso.com/astro/}.
+
+ \include examples-run.qdocinc
+
+ \section1 Qt Quick 2D Implementation
+
+ The Qt Quick Implementation in \c {planets-qml/PlanetsMain.qml} of the
+ example renders the 3D content using the \c Scene3D type.
+
+ \snippet planets-qml/PlanetsMain.qml 0
+
+ The planet related information is stored into a \c{ListModel}. The selection buttons for the
+ planets and the information sheet are created based on the model. The 2D elements, selection
+ buttons and sliders, are implemented in \c {planets-qml/PlanetsMain.qml}.
+
+ The selection buttons change the \c{focusedPlanet} property of the \c{mainview}. As the property
+ changes, the planet information is updated, and the camera is animated to the new position.
+
+ \snippet planets-qml/PlanetsMain.qml 1
+
+ The camera position and the camera look at point are updated based on values that are animated
+ in \c {planets-qml/SolarSystem.qml}, triggered from the
+ \c{changePlanetFocus()} function.
+
+ \snippet planets-qml/SolarSystem.qml 0
+
+ The sliders are used to adjust the rotation speed, the planet size, and the viewing distance.
+ When a slider value changes, a JavaScript function in \c {planets-qml/SolarSystem.qml}
+ is called to adjust the given property. For example, changing the value of
+ the \e{Viewing Distance} slider calls the \c{changeCameraDistance()} method.
+
+ \snippet planets-qml/PlanetsMain.qml 2
+
+ \section1 Qt 3D Implementation
+
+ The main part of the implementation, including the movement and rotation maths for the planets,
+ is done in \c {planets-qml/SolarSystem.qml}.
+
+ First, a \c Camera, a \c{Light}, and a \c Configuration are added, followed by \c{Effect}s for
+ the planet \c{Material}s, and finally the planets themselves. For example, Earth is constructed
+ as follows:
+
+ \snippet planets-qml/SolarSystem.qml 1
+
+ Planet data, which is needed for the movement and rotation calculations, among other things, is
+ constructed with JavaScript in \c {planets-qml/planets.js} by calling
+ \c{loadPlanetData()} as the component completes. Other initializations, such as inserting the
+ planets into an array for easier handling, calculating the ring radii for Saturn and Uranus
+ rings, and setting the default scale, speed, and camera offset, are done as well:
+
+ \snippet planets-qml/SolarSystem.qml 2
+
+ The scene is animated by calling the \c{animate()} function. That is also the place where the
+ time is advanced, and the new positions for all of the planets are calculated. The planets are
+ rotated in the \c{positionPlanet()} function based on their axial tilt and their sidereal
+ rotation period. Finally, the new camera position is calculated in the \c{updateCamera()}
+ function.
+
+ \snippet planets-qml/SolarSystem.qml 3
+*/
diff --git a/tests/manual/planets-qml/images/earth.png b/tests/manual/planets-qml/images/earth.png
new file mode 100644
index 000000000..7bfef7cc7
--- /dev/null
+++ b/tests/manual/planets-qml/images/earth.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/jupiter.png b/tests/manual/planets-qml/images/jupiter.png
new file mode 100644
index 000000000..b0cc4cfc2
--- /dev/null
+++ b/tests/manual/planets-qml/images/jupiter.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/mars.png b/tests/manual/planets-qml/images/mars.png
new file mode 100644
index 000000000..187560b70
--- /dev/null
+++ b/tests/manual/planets-qml/images/mars.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/mercury.png b/tests/manual/planets-qml/images/mercury.png
new file mode 100644
index 000000000..418d49f64
--- /dev/null
+++ b/tests/manual/planets-qml/images/mercury.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/nasa/license.txt b/tests/manual/planets-qml/images/nasa/license.txt
new file mode 100644
index 000000000..62a6d9ffd
--- /dev/null
+++ b/tests/manual/planets-qml/images/nasa/license.txt
@@ -0,0 +1,3 @@
+Uranus Ring:
+http://photojournal.jpl.nasa.gov/catalog/PIA00033 - Courtesy NASA/JPL-Caltech.
+Used under the terms of the license at http://www.jpl.nasa.gov/imagepolicy/
diff --git a/tests/manual/planets-qml/images/nasa/qt_attribution.json b/tests/manual/planets-qml/images/nasa/qt_attribution.json
new file mode 100644
index 000000000..237580070
--- /dev/null
+++ b/tests/manual/planets-qml/images/nasa/qt_attribution.json
@@ -0,0 +1,15 @@
+{
+ "Id": "nasa-jpl",
+ "Name": "Jet Propulsion Laboratory Photojournal",
+ "QDocModule": "qt3d",
+ "QtParts": ["tests"],
+ "Description": "The NASA/JPL Photojournal provides high quality images related to space research and exploration",
+ "QtUsage": "Used in Qt 3D planets-qml example.",
+
+ "DownloadLocation": "https://photojournal.jpl.nasa.gov/catalog/PIA00033",
+ "Homepage": "https://photojournal.jpl.nasa.gov/",
+ "License": "JPL Image Use Policy",
+ "LicenseId": "LicenseRef-Image-Use-Policy",
+ "LicenseFile": "license.txt",
+ "Copyright": "Copyright (c) 1996, Jet Propulsion Laboratory"
+}
diff --git a/tests/manual/planets-qml/images/nasa/uranusringcolortrans.png b/tests/manual/planets-qml/images/nasa/uranusringcolortrans.png
new file mode 100644
index 000000000..b0953dec5
--- /dev/null
+++ b/tests/manual/planets-qml/images/nasa/uranusringcolortrans.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/neptune.png b/tests/manual/planets-qml/images/neptune.png
new file mode 100644
index 000000000..07794c6f9
--- /dev/null
+++ b/tests/manual/planets-qml/images/neptune.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/saturn.png b/tests/manual/planets-qml/images/saturn.png
new file mode 100644
index 000000000..003363cd7
--- /dev/null
+++ b/tests/manual/planets-qml/images/saturn.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/earthcloudmapcolortrans.png b/tests/manual/planets-qml/images/solarsystemscope/earthcloudmapcolortrans.png
new file mode 100644
index 000000000..1aabde94e
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/earthcloudmapcolortrans.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/earthcloudmapspec.jpg b/tests/manual/planets-qml/images/solarsystemscope/earthcloudmapspec.jpg
new file mode 100644
index 000000000..254b6fb6c
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/earthcloudmapspec.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/earthmap2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/earthmap2k.jpg
new file mode 100644
index 000000000..e90540c83
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/earthmap2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/earthnormal2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/earthnormal2k.jpg
new file mode 100644
index 000000000..8215226fb
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/earthnormal2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/earthspec2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/earthspec2k.jpg
new file mode 100644
index 000000000..8e2b3f6c1
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/earthspec2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/galaxy_starfield.jpg b/tests/manual/planets-qml/images/solarsystemscope/galaxy_starfield.jpg
new file mode 100644
index 000000000..2be906a73
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/galaxy_starfield.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/jupitermap.jpg b/tests/manual/planets-qml/images/solarsystemscope/jupitermap.jpg
new file mode 100644
index 000000000..f5af80197
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/jupitermap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/license.txt b/tests/manual/planets-qml/images/solarsystemscope/license.txt
new file mode 100644
index 000000000..40ff1c577
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/license.txt
@@ -0,0 +1,6 @@
+www.solarsystemscope.com/textures distributed under the terms of
+https://creativecommons.org/licenses/by/4.0/
+
+Changes:
+- Rings created from the reference rectangle file.
+- earthcloudmapcolortrans.png was made from the earthcloudmapspec.jpg file
diff --git a/tests/manual/planets-qml/images/solarsystemscope/marsmap2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/marsmap2k.jpg
new file mode 100644
index 000000000..ea77177fb
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/marsmap2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/marsnormal2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/marsnormal2k.jpg
new file mode 100644
index 000000000..44a2e2f9b
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/marsnormal2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/mercurymap.jpg b/tests/manual/planets-qml/images/solarsystemscope/mercurymap.jpg
new file mode 100644
index 000000000..f69e947c0
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/mercurymap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/mercurynormal.jpg b/tests/manual/planets-qml/images/solarsystemscope/mercurynormal.jpg
new file mode 100644
index 000000000..5e77923bf
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/mercurynormal.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/moonmap2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/moonmap2k.jpg
new file mode 100644
index 000000000..0e0c20d0a
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/moonmap2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/moonnormal2k.jpg b/tests/manual/planets-qml/images/solarsystemscope/moonnormal2k.jpg
new file mode 100644
index 000000000..10797cf0a
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/moonnormal2k.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/neptunemap.jpg b/tests/manual/planets-qml/images/solarsystemscope/neptunemap.jpg
new file mode 100644
index 000000000..250fce966
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/neptunemap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/qt_attribution.json b/tests/manual/planets-qml/images/solarsystemscope/qt_attribution.json
new file mode 100644
index 000000000..c603bbea1
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/qt_attribution.json
@@ -0,0 +1,14 @@
+{
+ "Id": "solar_system_scope",
+ "Name": "Solar System Scope Texture Library",
+ "QDocModule": "qt3d",
+ "QtParts": ["tests"],
+ "Description": "Solar System Scope provides high quality, free to use textures for objects in the solar system.",
+ "QtUsage": "Used in Qt 3D planets-qml example.",
+
+ "Homepage": "https://www.solarsystemscope.com/textures",
+ "License": "Creative Commons Attribution 4.0",
+ "LicenseId": "CC-BY-4.0",
+ "LicenseFile": "license.txt",
+ "Copyright": "Copyright (c) 2010-2017, Solar System Scope"
+}
diff --git a/tests/manual/planets-qml/images/solarsystemscope/saturnmap.jpg b/tests/manual/planets-qml/images/solarsystemscope/saturnmap.jpg
new file mode 100644
index 000000000..981bb36c9
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/saturnmap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/saturnringcolortrans.png b/tests/manual/planets-qml/images/solarsystemscope/saturnringcolortrans.png
new file mode 100644
index 000000000..aefd9f6c4
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/saturnringcolortrans.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/sunmap.jpg b/tests/manual/planets-qml/images/solarsystemscope/sunmap.jpg
new file mode 100644
index 000000000..46f2ce8c1
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/sunmap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/uranusmap.jpg b/tests/manual/planets-qml/images/solarsystemscope/uranusmap.jpg
new file mode 100644
index 000000000..96cea14be
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/uranusmap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/venusmap.jpg b/tests/manual/planets-qml/images/solarsystemscope/venusmap.jpg
new file mode 100644
index 000000000..93bed3e47
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/venusmap.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/solarsystemscope/venusnormal.jpg b/tests/manual/planets-qml/images/solarsystemscope/venusnormal.jpg
new file mode 100644
index 000000000..0fc5ff703
--- /dev/null
+++ b/tests/manual/planets-qml/images/solarsystemscope/venusnormal.jpg
Binary files differ
diff --git a/tests/manual/planets-qml/images/sun.png b/tests/manual/planets-qml/images/sun.png
new file mode 100644
index 000000000..9a62c5f1d
--- /dev/null
+++ b/tests/manual/planets-qml/images/sun.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/uranus.png b/tests/manual/planets-qml/images/uranus.png
new file mode 100644
index 000000000..8678b9aa5
--- /dev/null
+++ b/tests/manual/planets-qml/images/uranus.png
Binary files differ
diff --git a/tests/manual/planets-qml/images/venus.png b/tests/manual/planets-qml/images/venus.png
new file mode 100644
index 000000000..fdbb45d32
--- /dev/null
+++ b/tests/manual/planets-qml/images/venus.png
Binary files differ
diff --git a/tests/manual/planets-qml/main.cpp b/tests/manual/planets-qml/main.cpp
new file mode 100644
index 000000000..834cc3c06
--- /dev/null
+++ b/tests/manual/planets-qml/main.cpp
@@ -0,0 +1,39 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QGuiApplication>
+#include <QQuickView>
+#include <QQmlContext>
+#include <QOpenGLContext>
+#include <Qt3DRender/qt3drender-config.h>
+
+#include "networkcontroller.h"
+
+int main(int argc, char **argv)
+{
+ QGuiApplication app(argc, argv);
+
+ QSurfaceFormat format;
+ if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
+ format.setVersion(4, 5);
+ format.setProfile(QSurfaceFormat::CoreProfile);
+ }
+ format.setDepthBufferSize(24);
+ format.setStencilBufferSize(8);
+ format.setSamples(4);
+#if !QT_CONFIG(qt3d_rhi_renderer)
+ qputenv("QSG_RHI_BACKEND", "opengl");
+#endif
+
+ NetworkController networkController;
+
+ QQuickView view;
+ view.setFormat(format);
+ view.rootContext()->setContextProperty("networkController", &networkController);
+ view.setResizeMode(QQuickView::SizeRootObjectToView);
+ view.setSource(QUrl("qrc:/PlanetsMain.qml"));
+ view.setColor("#000000");
+ view.show();
+
+ return app.exec();
+}
diff --git a/tests/manual/planets-qml/meshes/ring.obj b/tests/manual/planets-qml/meshes/ring.obj
new file mode 100644
index 000000000..8069d95d4
--- /dev/null
+++ b/tests/manual/planets-qml/meshes/ring.obj
@@ -0,0 +1,841 @@
+# Blender v2.70 (sub 0) OBJ File: 'ring_wider.blend'
+# www.blender.org
+v 1.250000 0.000000 0.000000
+v 0.687583 0.001701 0.000000
+v 0.687583 -0.001701 0.000000
+v 1.244968 0.000000 -0.112049
+v 0.684815 0.001701 -0.061635
+v 0.684815 -0.001701 -0.061635
+v 1.229912 0.000000 -0.223196
+v 0.676533 0.001701 -0.122773
+v 0.676533 -0.001701 -0.122773
+v 1.204954 0.000000 -0.332546
+v 0.662805 0.001701 -0.182922
+v 0.662805 -0.001701 -0.182922
+v 1.170293 0.000000 -0.439218
+v 0.643739 0.001701 -0.241599
+v 0.643739 -0.001701 -0.241599
+v 1.126211 0.000000 -0.542355
+v 0.619491 0.001701 -0.298331
+v 0.619491 -0.001701 -0.298331
+v 1.073061 0.000000 -0.641124
+v 0.590255 0.001701 -0.352661
+v 0.590255 -0.001701 -0.352661
+v 1.011271 0.000000 -0.734732
+v 0.556267 0.001701 -0.404151
+v 0.556267 -0.001701 -0.404151
+v 0.941339 0.000000 -0.822423
+v 0.517799 0.001701 -0.452388
+v 0.517799 -0.001701 -0.452388
+v 0.863828 0.000000 -0.903494
+v 0.475163 0.001701 -0.496982
+v 0.475163 -0.001701 -0.496982
+v 0.779362 0.000000 -0.977289
+v 0.428701 0.001701 -0.537574
+v 0.428701 -0.001701 -0.537574
+v 0.688621 0.000000 -1.043217
+v 0.378787 0.001701 -0.573839
+v 0.378787 -0.001701 -0.573839
+v 0.592336 0.000000 -1.100744
+v 0.325824 0.001701 -0.605483
+v 0.325824 -0.001701 -0.605483
+v 0.491282 0.000000 -1.149410
+v 0.270238 0.001701 -0.632252
+v 0.270238 -0.001701 -0.632252
+v 0.386272 0.000000 -1.188821
+v 0.212475 0.001701 -0.653930
+v 0.212475 -0.001701 -0.653930
+v 0.278151 0.000000 -1.218660
+v 0.153002 0.001701 -0.670344
+v 0.153002 -0.001701 -0.670344
+v 0.167792 0.000000 -1.238687
+v 0.092297 0.001701 -0.681360
+v 0.092297 -0.001701 -0.681360
+v 0.056081 0.000000 -1.248741
+v 0.030848 0.001701 -0.686891
+v 0.030848 -0.001701 -0.686891
+v -0.056081 0.000000 -1.248741
+v -0.030848 0.001701 -0.686891
+v -0.030848 -0.001701 -0.686891
+v -0.167792 0.000000 -1.238687
+v -0.092297 0.001701 -0.681360
+v -0.092297 -0.001701 -0.681360
+v -0.278151 0.000000 -1.218660
+v -0.153002 0.001701 -0.670344
+v -0.153002 -0.001701 -0.670344
+v -0.386271 0.000000 -1.188821
+v -0.212475 0.001701 -0.653930
+v -0.212475 -0.001701 -0.653930
+v -0.491281 0.000000 -1.149410
+v -0.270237 0.001701 -0.632252
+v -0.270237 -0.001701 -0.632252
+v -0.592336 0.000000 -1.100744
+v -0.325824 0.001701 -0.605483
+v -0.325824 -0.001701 -0.605483
+v -0.688621 0.000000 -1.043216
+v -0.378788 0.001701 -0.573838
+v -0.378788 -0.001701 -0.573838
+v -0.779362 0.000000 -0.977289
+v -0.428701 0.001701 -0.537574
+v -0.428701 -0.001701 -0.537574
+v -0.863829 0.000000 -0.903493
+v -0.475163 0.001701 -0.496982
+v -0.475163 -0.001701 -0.496982
+v -0.941339 0.000000 -0.822423
+v -0.517799 0.001701 -0.452387
+v -0.517799 -0.001701 -0.452387
+v -1.011271 0.000000 -0.734731
+v -0.556267 0.001701 -0.404151
+v -0.556267 -0.001701 -0.404151
+v -1.073061 0.000000 -0.641124
+v -0.590255 0.001701 -0.352661
+v -0.590255 -0.001701 -0.352661
+v -1.126211 0.000000 -0.542355
+v -0.619491 0.001701 -0.298331
+v -0.619491 -0.001701 -0.298331
+v -1.170293 0.000000 -0.439219
+v -0.643739 0.001701 -0.241599
+v -0.643739 -0.001701 -0.241599
+v -1.204954 0.000000 -0.332546
+v -0.662805 0.001701 -0.182922
+v -0.662805 -0.001701 -0.182922
+v -1.229912 0.000000 -0.223196
+v -0.676533 0.001701 -0.122773
+v -0.676533 -0.001701 -0.122773
+v -1.244968 0.000000 -0.112049
+v -0.684815 0.001701 -0.061634
+v -0.684815 -0.001701 -0.061634
+v -1.250000 0.000000 -0.000000
+v -0.687583 0.001701 -0.000000
+v -0.687583 -0.001701 -0.000000
+v -1.244968 0.000000 0.112048
+v -0.684815 0.001701 0.061634
+v -0.684815 -0.001701 0.061634
+v -1.229912 0.000000 0.223196
+v -0.676533 0.001701 0.122772
+v -0.676533 -0.001701 0.122772
+v -1.204954 0.000000 0.332546
+v -0.662805 0.001701 0.182922
+v -0.662805 -0.001701 0.182922
+v -1.170294 0.000000 0.439218
+v -0.643740 0.001701 0.241599
+v -0.643740 -0.001701 0.241599
+v -1.126211 0.000000 0.542354
+v -0.619491 0.001701 0.298331
+v -0.619491 -0.001701 0.298331
+v -1.073061 0.000000 0.641124
+v -0.590255 0.001701 0.352661
+v -0.590255 -0.001701 0.352661
+v -1.011271 0.000000 0.734731
+v -0.556267 0.001701 0.404151
+v -0.556267 -0.001701 0.404151
+v -0.941339 0.000000 0.822423
+v -0.517799 0.001701 0.452387
+v -0.517799 -0.001701 0.452387
+v -0.863829 0.000000 0.903493
+v -0.475163 0.001701 0.496982
+v -0.475163 -0.001701 0.496982
+v -0.779362 0.000000 0.977289
+v -0.428701 0.001701 0.537574
+v -0.428701 -0.001701 0.537574
+v -0.688621 0.000000 1.043216
+v -0.378788 0.001701 0.573838
+v -0.378788 -0.001701 0.573838
+v -0.592336 0.000000 1.100744
+v -0.325824 0.001701 0.605483
+v -0.325824 -0.001701 0.605483
+v -0.491281 0.000000 1.149410
+v -0.270237 0.001701 0.632252
+v -0.270237 -0.001701 0.632252
+v -0.386271 0.000000 1.188821
+v -0.212475 0.001701 0.653930
+v -0.212475 -0.001701 0.653930
+v -0.278151 0.000000 1.218660
+v -0.153002 0.001701 0.670344
+v -0.153002 -0.001701 0.670344
+v -0.167792 0.000000 1.238687
+v -0.092297 0.001701 0.681360
+v -0.092297 -0.001701 0.681360
+v -0.056081 0.000000 1.248741
+v -0.030848 0.001701 0.686891
+v -0.030848 -0.001701 0.686891
+v 0.056081 0.000000 1.248741
+v 0.030848 0.001701 0.686891
+v 0.030848 -0.001701 0.686891
+v 0.167792 0.000000 1.238687
+v 0.092297 0.001701 0.681360
+v 0.092297 -0.001701 0.681360
+v 0.278151 0.000000 1.218660
+v 0.153002 0.001701 0.670344
+v 0.153002 -0.001701 0.670344
+v 0.386272 0.000000 1.188821
+v 0.212475 0.001701 0.653930
+v 0.212475 -0.001701 0.653930
+v 0.491282 0.000000 1.149410
+v 0.270238 0.001701 0.632252
+v 0.270238 -0.001701 0.632252
+v 0.592336 0.000000 1.100744
+v 0.325824 0.001701 0.605483
+v 0.325824 -0.001701 0.605483
+v 0.688621 0.000000 1.043217
+v 0.378787 0.001701 0.573839
+v 0.378787 -0.001701 0.573839
+v 0.779362 0.000000 0.977290
+v 0.428701 0.001701 0.537574
+v 0.428701 -0.001701 0.537574
+v 0.863828 0.000000 0.903494
+v 0.475163 0.001701 0.496982
+v 0.475163 -0.001701 0.496982
+v 0.941339 0.000000 0.822424
+v 0.517799 0.001701 0.452388
+v 0.517799 -0.001701 0.452388
+v 1.011271 0.000000 0.734732
+v 0.556266 0.001701 0.404152
+v 0.556266 -0.001701 0.404152
+v 1.073061 0.000000 0.641125
+v 0.590255 0.001701 0.352661
+v 0.590255 -0.001701 0.352661
+v 1.126211 0.000000 0.542355
+v 0.619491 0.001701 0.298331
+v 0.619491 -0.001701 0.298331
+v 1.170293 0.000000 0.439219
+v 0.643739 0.001701 0.241600
+v 0.643739 -0.001701 0.241600
+v 1.204953 0.000000 0.332547
+v 0.662805 0.001701 0.182923
+v 0.662805 -0.001701 0.182923
+v 1.229912 0.000000 0.223197
+v 0.676533 0.001701 0.122773
+v 0.676533 -0.001701 0.122773
+v 1.244968 0.000000 0.112049
+v 0.684815 0.001701 0.061635
+v 0.684815 -0.001701 0.061635
+vt 0.480114 0.696513
+vt 0.470371 0.736934
+vt 0.371219 0.630330
+vt 0.376578 0.608095
+vt 0.662068 0.031882
+vt 0.701631 0.242504
+vt 0.690274 0.252204
+vt 0.641420 0.049515
+vt 0.458854 0.775449
+vt 0.364883 0.651515
+vt 0.679397 0.263898
+vt 0.621646 0.070776
+vt 0.445655 0.811745
+vt 0.357623 0.671480
+vt 0.669088 0.277493
+vt 0.602906 0.095491
+vt 0.430881 0.845531
+vt 0.349496 0.690065
+vt 0.659431 0.292880
+vt 0.585350 0.123464
+vt 0.414650 0.876536
+vt 0.340569 0.707120
+vt 0.650503 0.309935
+vt 0.569119 0.154469
+vt 0.397094 0.904509
+vt 0.330912 0.722507
+vt 0.642377 0.328519
+vt 0.554345 0.188255
+vt 0.378354 0.929224
+vt 0.320603 0.736102
+vt 0.635117 0.348485
+vt 0.541146 0.224551
+vt 0.358580 0.950484
+vt 0.309726 0.747796
+vt 0.628781 0.369670
+vt 0.529629 0.263066
+vt 0.337932 0.968117
+vt 0.298369 0.757496
+vt 0.623422 0.391905
+vt 0.519886 0.303487
+vt 0.316576 0.981981
+vt 0.286621 0.765122
+vt 0.619082 0.415010
+vt 0.511996 0.345491
+vt 0.294684 0.991965
+vt 0.274579 0.770613
+vt 0.615796 0.438799
+vt 0.506022 0.388740
+vt 0.272432 0.997987
+vt 0.262339 0.773926
+vt 0.613591 0.463081
+vt 0.502013 0.432883
+vt 0.250000 1.000000
+vt 0.250000 0.775033
+vt 0.612483 0.487661
+vt 0.500000 0.477567
+vt 0.227568 0.997987
+vt 0.237661 0.773926
+vt 0.612483 0.512339
+vt 0.500000 0.522432
+vt 0.205316 0.991965
+vt 0.225421 0.770613
+vt 0.613590 0.536918
+vt 0.502013 0.567116
+vt 0.183424 0.981981
+vt 0.213379 0.765122
+vt 0.615796 0.561201
+vt 0.506022 0.611260
+vt 0.162068 0.968117
+vt 0.201631 0.757496
+vt 0.619082 0.584990
+vt 0.511996 0.654508
+vt 0.141420 0.950484
+vt 0.190274 0.747796
+vt 0.623422 0.608095
+vt 0.519886 0.696512
+vt 0.121646 0.929224
+vt 0.179397 0.736102
+vt 0.628781 0.630330
+vt 0.529629 0.736934
+vt 0.102906 0.904508
+vt 0.169088 0.722507
+vt 0.635117 0.651515
+vt 0.541146 0.775448
+vt 0.085349 0.876536
+vt 0.159431 0.707120
+vt 0.642377 0.671480
+vt 0.554345 0.811745
+vt 0.069119 0.845531
+vt 0.150503 0.690065
+vt 0.650503 0.690065
+vt 0.569119 0.845531
+vt 0.054345 0.811745
+vt 0.142377 0.671480
+vt 0.659431 0.707120
+vt 0.585350 0.876536
+vt 0.041146 0.775448
+vt 0.135117 0.651515
+vt 0.669088 0.722507
+vt 0.602906 0.904508
+vt 0.029629 0.736934
+vt 0.128781 0.630330
+vt 0.679397 0.736102
+vt 0.621646 0.929224
+vt 0.019886 0.696512
+vt 0.123422 0.608095
+vt 0.690274 0.747796
+vt 0.641420 0.950484
+vt 0.011996 0.654508
+vt 0.119082 0.584990
+vt 0.701631 0.757496
+vt 0.662068 0.968117
+vt 0.006022 0.611260
+vt 0.115796 0.561200
+vt 0.713379 0.765122
+vt 0.683424 0.981981
+vt 0.002013 0.567116
+vt 0.113591 0.536918
+vt 0.725421 0.770613
+vt 0.705316 0.991965
+vt 0.000000 0.522432
+vt 0.112483 0.512339
+vt 0.737661 0.773926
+vt 0.727567 0.997987
+vt 0.000000 0.477568
+vt 0.112483 0.487661
+vt 0.750000 0.775033
+vt 0.750000 1.000000
+vt 0.002013 0.432883
+vt 0.113591 0.463081
+vt 0.762339 0.773926
+vt 0.772432 0.997987
+vt 0.006022 0.388739
+vt 0.115796 0.438799
+vt 0.774579 0.770613
+vt 0.794684 0.991965
+vt 0.011996 0.345491
+vt 0.119082 0.415010
+vt 0.786621 0.765122
+vt 0.816576 0.981981
+vt 0.019886 0.303487
+vt 0.123422 0.391905
+vt 0.798369 0.757496
+vt 0.837932 0.968117
+vt 0.029629 0.263066
+vt 0.128781 0.369670
+vt 0.809726 0.747797
+vt 0.858580 0.950485
+vt 0.041146 0.224552
+vt 0.135117 0.348485
+vt 0.820603 0.736102
+vt 0.878354 0.929224
+vt 0.054345 0.188255
+vt 0.142377 0.328520
+vt 0.830912 0.722507
+vt 0.897094 0.904509
+vt 0.069119 0.154469
+vt 0.150503 0.309935
+vt 0.840569 0.707120
+vt 0.914650 0.876536
+vt 0.085349 0.123464
+vt 0.159431 0.292880
+vt 0.849496 0.690065
+vt 0.930881 0.845532
+vt 0.102906 0.095492
+vt 0.169088 0.277493
+vt 0.857623 0.671481
+vt 0.945655 0.811745
+vt 0.121646 0.070776
+vt 0.179397 0.263898
+vt 0.864883 0.651515
+vt 0.958853 0.775449
+vt 0.141420 0.049516
+vt 0.190274 0.252204
+vt 0.871219 0.630330
+vt 0.970371 0.736934
+vt 0.162068 0.031883
+vt 0.201631 0.242504
+vt 0.876578 0.608095
+vt 0.980114 0.696513
+vt 0.183424 0.018019
+vt 0.213379 0.234878
+vt 0.880918 0.584990
+vt 0.988004 0.654509
+vt 0.205316 0.008035
+vt 0.225421 0.229387
+vt 0.884204 0.561201
+vt 0.993978 0.611261
+vt 0.227568 0.002013
+vt 0.237661 0.226074
+vt 0.886409 0.536919
+vt 0.997987 0.567117
+vt 0.250000 0.000000
+vt 0.250000 0.224967
+vt 0.887517 0.512339
+vt 1.000000 0.522433
+vt 0.272432 0.002013
+vt 0.262339 0.226074
+vt 0.887517 0.487661
+vt 1.000000 0.477568
+vt 0.294684 0.008035
+vt 0.274579 0.229387
+vt 0.886409 0.463081
+vt 0.997987 0.432883
+vt 0.316576 0.018019
+vt 0.286621 0.234878
+vt 0.884204 0.438799
+vt 0.993978 0.388740
+vt 0.337932 0.031883
+vt 0.298369 0.242504
+vt 0.880918 0.415010
+vt 0.988004 0.345491
+vt 0.358580 0.049516
+vt 0.309726 0.252204
+vt 0.876578 0.391905
+vt 0.980114 0.303487
+vt 0.378354 0.070776
+vt 0.320603 0.263898
+vt 0.871219 0.369670
+vt 0.970371 0.263066
+vt 0.397094 0.095492
+vt 0.330912 0.277493
+vt 0.864883 0.348485
+vt 0.958854 0.224551
+vt 0.414651 0.123464
+vt 0.340569 0.292880
+vt 0.857623 0.328519
+vt 0.945655 0.188255
+vt 0.430881 0.154469
+vt 0.349497 0.309935
+vt 0.849496 0.309935
+vt 0.930881 0.154469
+vt 0.445655 0.188255
+vt 0.357623 0.328520
+vt 0.840569 0.292880
+vt 0.914650 0.123464
+vt 0.458854 0.224551
+vt 0.364883 0.348485
+vt 0.830912 0.277493
+vt 0.897095 0.095492
+vt 0.470371 0.263065
+vt 0.371219 0.369670
+vt 0.820603 0.263898
+vt 0.878354 0.070776
+vt 0.480114 0.303487
+vt 0.376578 0.391905
+vt 0.809726 0.252204
+vt 0.858580 0.049516
+vt 0.488004 0.345491
+vt 0.380918 0.415010
+vt 0.798369 0.242504
+vt 0.837932 0.031883
+vt 0.493978 0.388739
+vt 0.384204 0.438799
+vt 0.786621 0.234878
+vt 0.816576 0.018019
+vt 0.497987 0.432883
+vt 0.386409 0.463081
+vt 0.774579 0.229387
+vt 0.794684 0.008035
+vt 0.387517 0.487661
+vt 0.762339 0.226074
+vt 0.772433 0.002013
+vt 0.387517 0.512339
+vt 0.750000 0.224967
+vt 0.750000 0.000000
+vt 0.497987 0.567117
+vt 0.386409 0.536919
+vt 0.737661 0.226074
+vt 0.727568 0.002013
+vt 0.493978 0.611260
+vt 0.384204 0.561201
+vt 0.725421 0.229387
+vt 0.705316 0.008035
+vt 0.488004 0.654508
+vt 0.380918 0.584990
+vt 0.713379 0.234878
+vt 0.683424 0.018018
+vn 1.000000 0.000000 0.000000
+vn 0.995972 0.000000 -0.089633
+vn 0.003013 0.999995 -0.000271
+vn 0.003025 0.999995 -0.000000
+vn 0.003025 -0.999995 -0.000000
+vn 0.003013 -0.999995 -0.000271
+vn 0.983917 0.000000 -0.178533
+vn 0.002976 0.999995 -0.000540
+vn 0.002976 -0.999995 -0.000540
+vn 0.963958 0.000000 -0.266030
+vn 0.002916 0.999995 -0.000805
+vn 0.002916 -0.999995 -0.000805
+vn 0.936216 0.000000 -0.351360
+vn 0.002832 0.999995 -0.001063
+vn 0.002832 -0.999995 -0.001063
+vn 0.900967 0.000000 -0.433882
+vn 0.002725 0.999995 -0.001313
+vn 0.002725 -0.999995 -0.001313
+vn 0.858425 0.000000 -0.512894
+vn 0.002597 0.999995 -0.001552
+vn 0.002597 -0.999995 -0.001552
+vn 0.809015 0.000000 -0.587756
+vn 0.002447 0.999995 -0.001778
+vn 0.002447 -0.999995 -0.001778
+vn 0.753044 0.000000 -0.657918
+vn 0.002278 0.999995 -0.001990
+vn 0.002278 -0.999995 -0.001990
+vn 0.691061 0.000000 -0.722770
+vn 0.002090 0.999995 -0.002186
+vn 0.002090 -0.999995 -0.002186
+vn 0.623463 0.000000 -0.781823
+vn 0.001886 0.999995 -0.002365
+vn 0.001886 -0.999995 -0.002365
+vn 0.550890 0.000000 -0.834559
+vn 0.001666 0.999995 -0.002525
+vn 0.001666 -0.999995 -0.002525
+vn 0.473861 0.000000 -0.880581
+vn 0.001433 0.999995 -0.002664
+vn 0.001433 -0.999995 -0.002664
+vn 0.393017 0.000000 -0.919523
+vn 0.001189 0.999995 -0.002782
+vn 0.001189 -0.999995 -0.002782
+vn 0.309000 0.000000 -0.951048
+vn 0.000935 0.999995 -0.002877
+vn 0.000935 -0.999995 -0.002877
+vn 0.222510 0.000000 -0.974914
+vn 0.000673 0.999995 -0.002949
+vn 0.000673 -0.999995 -0.002949
+vn 0.134220 0.000000 -0.990936
+vn 0.000406 0.999995 -0.002998
+vn 0.000406 -0.999995 -0.002998
+vn 0.044862 0.000000 -0.998993
+vn 0.000136 0.999995 -0.003022
+vn 0.000136 -0.999995 -0.003022
+vn -0.044862 0.000000 -0.998993
+vn -0.000136 0.999995 -0.003022
+vn -0.000136 -0.999995 -0.003022
+vn -0.134220 0.000000 -0.990936
+vn -0.000406 0.999995 -0.002998
+vn -0.000406 -0.999995 -0.002998
+vn -0.222510 0.000000 -0.974914
+vn -0.000673 0.999995 -0.002949
+vn -0.000673 -0.999995 -0.002949
+vn -0.309000 0.000000 -0.951048
+vn -0.000935 0.999995 -0.002877
+vn -0.000935 -0.999995 -0.002877
+vn -0.393017 0.000000 -0.919523
+vn -0.001189 0.999995 -0.002782
+vn -0.001189 -0.999995 -0.002782
+vn -0.473861 0.000000 -0.880581
+vn -0.001433 0.999995 -0.002664
+vn -0.001433 -0.999995 -0.002664
+vn -0.550890 0.000000 -0.834559
+vn -0.001666 0.999995 -0.002525
+vn -0.001666 -0.999995 -0.002525
+vn -0.623463 0.000000 -0.781823
+vn -0.001886 0.999995 -0.002365
+vn -0.001886 -0.999995 -0.002365
+vn -0.691061 0.000000 -0.722770
+vn -0.002090 0.999995 -0.002186
+vn -0.002090 -0.999995 -0.002186
+vn -0.753044 0.000000 -0.657918
+vn -0.002278 0.999995 -0.001990
+vn -0.002278 -0.999995 -0.001990
+vn -0.809015 0.000000 -0.587756
+vn -0.002447 0.999995 -0.001778
+vn -0.002447 -0.999995 -0.001778
+vn -0.858425 0.000000 -0.512894
+vn -0.002597 0.999995 -0.001552
+vn -0.002597 -0.999995 -0.001552
+vn -0.900967 0.000000 -0.433882
+vn -0.002725 0.999995 -0.001313
+vn -0.002725 -0.999995 -0.001313
+vn -0.936216 0.000000 -0.351360
+vn -0.002832 0.999995 -0.001063
+vn -0.002832 -0.999995 -0.001063
+vn -0.963958 0.000000 -0.266030
+vn -0.002916 0.999995 -0.000805
+vn -0.002916 -0.999995 -0.000805
+vn -0.983917 0.000000 -0.178533
+vn -0.002976 0.999995 -0.000540
+vn -0.002976 -0.999995 -0.000540
+vn -0.995972 0.000000 -0.089633
+vn -0.003013 0.999995 -0.000271
+vn -0.003013 -0.999995 -0.000271
+vn -0.999969 0.000000 0.000000
+vn -0.003025 0.999995 -0.000000
+vn -0.003025 -0.999995 -0.000000
+vn -0.995972 0.000000 0.089633
+vn -0.003013 0.999995 0.000271
+vn -0.003013 -0.999995 0.000271
+vn -0.983917 0.000000 0.178533
+vn -0.002976 0.999995 0.000540
+vn -0.002976 -0.999995 0.000540
+vn -0.963958 0.000000 0.266030
+vn -0.002916 0.999995 0.000805
+vn -0.002916 -0.999995 0.000805
+vn -0.936216 0.000000 0.351360
+vn -0.002832 0.999995 0.001063
+vn -0.002832 -0.999995 0.001063
+vn -0.900967 0.000000 0.433882
+vn -0.002725 0.999995 0.001313
+vn -0.002725 -0.999995 0.001313
+vn -0.858425 0.000000 0.512894
+vn -0.002597 0.999995 0.001552
+vn -0.002597 -0.999995 0.001552
+vn -0.809015 0.000000 0.587756
+vn -0.002447 0.999995 0.001778
+vn -0.002447 -0.999995 0.001778
+vn -0.753044 0.000000 0.657918
+vn -0.002278 0.999995 0.001990
+vn -0.002278 -0.999995 0.001990
+vn -0.691061 0.000000 0.722770
+vn -0.002090 0.999995 0.002186
+vn -0.002090 -0.999995 0.002186
+vn -0.623463 0.000000 0.781823
+vn -0.001886 0.999995 0.002365
+vn -0.001886 -0.999995 0.002365
+vn -0.550890 0.000000 0.834559
+vn -0.001666 0.999995 0.002525
+vn -0.001666 -0.999995 0.002525
+vn -0.473861 0.000000 0.880581
+vn -0.001433 0.999995 0.002664
+vn -0.001433 -0.999995 0.002664
+vn -0.393017 0.000000 0.919523
+vn -0.001189 0.999995 0.002782
+vn -0.001189 -0.999995 0.002782
+vn -0.309000 0.000000 0.951048
+vn -0.000935 0.999995 0.002877
+vn -0.000935 -0.999995 0.002877
+vn -0.222510 0.000000 0.974914
+vn -0.000673 0.999995 0.002949
+vn -0.000673 -0.999995 0.002949
+vn -0.134220 0.000000 0.990936
+vn -0.000406 0.999995 0.002998
+vn -0.000406 -0.999995 0.002998
+vn -0.044862 0.000000 0.998993
+vn -0.000136 0.999995 0.003022
+vn -0.000136 -0.999995 0.003022
+vn 0.044862 0.000000 0.998993
+vn 0.000136 0.999995 0.003022
+vn 0.000136 -0.999995 0.003022
+vn 0.134220 0.000000 0.990936
+vn 0.000406 0.999995 0.002998
+vn 0.000406 -0.999995 0.002998
+vn 0.222510 0.000000 0.974914
+vn 0.000673 0.999995 0.002949
+vn 0.000673 -0.999995 0.002949
+vn 0.309000 0.000000 0.951048
+vn 0.000935 0.999995 0.002877
+vn 0.000935 -0.999995 0.002877
+vn 0.393017 0.000000 0.919523
+vn 0.001189 0.999995 0.002782
+vn 0.001189 -0.999995 0.002782
+vn 0.473861 0.000000 0.880581
+vn 0.001433 0.999995 0.002664
+vn 0.001433 -0.999995 0.002664
+vn 0.550890 0.000000 0.834559
+vn 0.001666 0.999995 0.002525
+vn 0.001666 -0.999995 0.002525
+vn 0.623463 0.000000 0.781823
+vn 0.001886 0.999995 0.002365
+vn 0.001886 -0.999995 0.002365
+vn 0.691061 0.000000 0.722770
+vn 0.002090 0.999995 0.002186
+vn 0.002090 -0.999995 0.002186
+vn 0.753044 0.000000 0.657918
+vn 0.002278 0.999995 0.001990
+vn 0.002278 -0.999995 0.001990
+vn 0.809015 0.000000 0.587756
+vn 0.002447 0.999995 0.001778
+vn 0.002447 -0.999995 0.001778
+vn 0.858425 0.000000 0.512894
+vn 0.002597 0.999995 0.001552
+vn 0.002597 -0.999995 0.001552
+vn 0.900967 0.000000 0.433882
+vn 0.002725 0.999995 0.001313
+vn 0.002725 -0.999995 0.001313
+vn 0.936216 0.000000 0.351360
+vn 0.002832 0.999995 0.001063
+vn 0.002832 -0.999995 0.001063
+vn 0.963958 0.000000 0.266030
+vn 0.002916 0.999995 0.000805
+vn 0.002916 -0.999995 0.000805
+vn 0.983917 0.000000 0.178533
+vn 0.002976 0.999995 0.000540
+vn 0.002976 -0.999995 0.000540
+vn 0.995972 0.000000 0.089633
+vn 0.003013 0.999995 0.000271
+vn 0.003013 -0.999995 0.000271
+s 1
+f 1/1/1 4/2/2 5/3/3 2/4/4
+f 1/5/1 3/6/5 6/7/6 4/8/2
+f 4/2/2 7/9/7 8/10/8 5/3/3
+f 6/7/6 9/11/9 7/12/7 4/8/2
+f 7/9/7 10/13/10 11/14/11 8/10/8
+f 9/11/9 12/15/12 10/16/10 7/12/7
+f 10/13/10 13/17/13 14/18/14 11/14/11
+f 12/15/12 15/19/15 13/20/13 10/16/10
+f 13/17/13 16/21/16 17/22/17 14/18/14
+f 15/19/15 18/23/18 16/24/16 13/20/13
+f 16/21/16 19/25/19 20/26/20 17/22/17
+f 18/23/18 21/27/21 19/28/19 16/24/16
+f 19/25/19 22/29/22 23/30/23 20/26/20
+f 21/27/21 24/31/24 22/32/22 19/28/19
+f 22/29/22 25/33/25 26/34/26 23/30/23
+f 24/31/24 27/35/27 25/36/25 22/32/22
+f 25/33/25 28/37/28 29/38/29 26/34/26
+f 27/35/27 30/39/30 28/40/28 25/36/25
+f 28/37/28 31/41/31 32/42/32 29/38/29
+f 30/39/30 33/43/33 31/44/31 28/40/28
+f 31/41/31 34/45/34 35/46/35 32/42/32
+f 33/43/33 36/47/36 34/48/34 31/44/31
+f 34/45/34 37/49/37 38/50/38 35/46/35
+f 36/47/36 39/51/39 37/52/37 34/48/34
+f 37/49/37 40/53/40 41/54/41 38/50/38
+f 39/51/39 42/55/42 40/56/40 37/52/37
+f 40/53/40 43/57/43 44/58/44 41/54/41
+f 42/55/42 45/59/45 43/60/43 40/56/40
+f 43/57/43 46/61/46 47/62/47 44/58/44
+f 45/59/45 48/63/48 46/64/46 43/60/43
+f 46/61/46 49/65/49 50/66/50 47/62/47
+f 48/63/48 51/67/51 49/68/49 46/64/46
+f 49/65/49 52/69/52 53/70/53 50/66/50
+f 51/67/51 54/71/54 52/72/52 49/68/49
+f 52/69/52 55/73/55 56/74/56 53/70/53
+f 54/71/54 57/75/57 55/76/55 52/72/52
+f 55/73/55 58/77/58 59/78/59 56/74/56
+f 57/75/57 60/79/60 58/80/58 55/76/55
+f 58/77/58 61/81/61 62/82/62 59/78/59
+f 60/79/60 63/83/63 61/84/61 58/80/58
+f 61/81/61 64/85/64 65/86/65 62/82/62
+f 63/83/63 66/87/66 64/88/64 61/84/61
+f 64/85/64 67/89/67 68/90/68 65/86/65
+f 66/87/66 69/91/69 67/92/67 64/88/64
+f 67/89/67 70/93/70 71/94/71 68/90/68
+f 69/91/69 72/95/72 70/96/70 67/92/67
+f 70/93/70 73/97/73 74/98/74 71/94/71
+f 72/95/72 75/99/75 73/100/73 70/96/70
+f 73/97/73 76/101/76 77/102/77 74/98/74
+f 75/99/75 78/103/78 76/104/76 73/100/73
+f 76/101/76 79/105/79 80/106/80 77/102/77
+f 78/103/78 81/107/81 79/108/79 76/104/76
+f 79/105/79 82/109/82 83/110/83 80/106/80
+f 81/107/81 84/111/84 82/112/82 79/108/79
+f 82/109/82 85/113/85 86/114/86 83/110/83
+f 84/111/84 87/115/87 85/116/85 82/112/82
+f 85/113/85 88/117/88 89/118/89 86/114/86
+f 87/115/87 90/119/90 88/120/88 85/116/85
+f 88/117/88 91/121/91 92/122/92 89/118/89
+f 90/119/90 93/123/93 91/124/91 88/120/88
+f 91/121/91 94/125/94 95/126/95 92/122/92
+f 93/123/93 96/127/96 94/128/94 91/124/91
+f 94/125/94 97/129/97 98/130/98 95/126/95
+f 96/127/96 99/131/99 97/132/97 94/128/94
+f 97/129/97 100/133/100 101/134/101 98/130/98
+f 99/131/99 102/135/102 100/136/100 97/132/97
+f 100/133/100 103/137/103 104/138/104 101/134/101
+f 102/135/102 105/139/105 103/140/103 100/136/100
+f 103/137/103 106/141/106 107/142/107 104/138/104
+f 105/139/105 108/143/108 106/144/106 103/140/103
+f 106/141/106 109/145/109 110/146/110 107/142/107
+f 108/143/108 111/147/111 109/148/109 106/144/106
+f 109/145/109 112/149/112 113/150/113 110/146/110
+f 111/147/111 114/151/114 112/152/112 109/148/109
+f 112/149/112 115/153/115 116/154/116 113/150/113
+f 114/151/114 117/155/117 115/156/115 112/152/112
+f 115/153/115 118/157/118 119/158/119 116/154/116
+f 117/155/117 120/159/120 118/160/118 115/156/115
+f 118/157/118 121/161/121 122/162/122 119/158/119
+f 120/159/120 123/163/123 121/164/121 118/160/118
+f 121/161/121 124/165/124 125/166/125 122/162/122
+f 123/163/123 126/167/126 124/168/124 121/164/121
+f 124/165/124 127/169/127 128/170/128 125/166/125
+f 126/167/126 129/171/129 127/172/127 124/168/124
+f 127/169/127 130/173/130 131/174/131 128/170/128
+f 129/171/129 132/175/132 130/176/130 127/172/127
+f 130/173/130 133/177/133 134/178/134 131/174/131
+f 132/175/132 135/179/135 133/180/133 130/176/130
+f 133/177/133 136/181/136 137/182/137 134/178/134
+f 135/179/135 138/183/138 136/184/136 133/180/133
+f 136/181/136 139/185/139 140/186/140 137/182/137
+f 138/183/138 141/187/141 139/188/139 136/184/136
+f 139/185/139 142/189/142 143/190/143 140/186/140
+f 141/187/141 144/191/144 142/192/142 139/188/139
+f 142/189/142 145/193/145 146/194/146 143/190/143
+f 144/191/144 147/195/147 145/196/145 142/192/142
+f 145/193/145 148/197/148 149/198/149 146/194/146
+f 147/195/147 150/199/150 148/200/148 145/196/145
+f 148/197/148 151/201/151 152/202/152 149/198/149
+f 150/199/150 153/203/153 151/204/151 148/200/148
+f 151/201/151 154/205/154 155/206/155 152/202/152
+f 153/203/153 156/207/156 154/208/154 151/204/151
+f 154/205/154 157/209/157 158/210/158 155/206/155
+f 156/207/156 159/211/159 157/212/157 154/208/154
+f 157/209/157 160/213/160 161/214/161 158/210/158
+f 159/211/159 162/215/162 160/216/160 157/212/157
+f 160/213/160 163/217/163 164/218/164 161/214/161
+f 162/215/162 165/219/165 163/220/163 160/216/160
+f 163/217/163 166/221/166 167/222/167 164/218/164
+f 165/219/165 168/223/168 166/224/166 163/220/163
+f 166/221/166 169/225/169 170/226/170 167/222/167
+f 168/223/168 171/227/171 169/228/169 166/224/166
+f 169/225/169 172/229/172 173/230/173 170/226/170
+f 171/227/171 174/231/174 172/232/172 169/228/169
+f 172/229/172 175/233/175 176/234/176 173/230/173
+f 174/231/174 177/235/177 175/236/175 172/232/172
+f 175/233/175 178/237/178 179/238/179 176/234/176
+f 177/235/177 180/239/180 178/240/178 175/236/175
+f 178/237/178 181/241/181 182/242/182 179/238/179
+f 180/239/180 183/243/183 181/244/181 178/240/178
+f 181/241/181 184/245/184 185/246/185 182/242/182
+f 183/243/183 186/247/186 184/248/184 181/244/181
+f 184/245/184 187/249/187 188/250/188 185/246/185
+f 186/247/186 189/251/189 187/252/187 184/248/184
+f 187/249/187 190/253/190 191/254/191 188/250/188
+f 189/251/189 192/255/192 190/256/190 187/252/187
+f 190/253/190 193/257/193 194/258/194 191/254/191
+f 192/255/192 195/259/195 193/260/193 190/256/190
+f 193/257/193 196/56/196 197/261/197 194/258/194
+f 195/259/195 198/262/198 196/263/196 193/260/193
+f 196/56/196 199/60/199 200/264/200 197/261/197
+f 198/262/198 201/265/201 199/266/199 196/263/196
+f 199/60/199 202/267/202 203/268/203 200/264/200
+f 201/265/201 204/269/204 202/270/202 199/266/199
+f 202/267/202 205/271/205 206/272/206 203/268/203
+f 204/269/204 207/273/207 205/274/205 202/270/202
+f 205/271/205 208/275/208 209/276/209 206/272/206
+f 207/273/207 210/277/210 208/278/208 205/274/205
+f 208/275/208 1/1/1 2/4/4 209/276/209
+f 210/277/210 3/6/5 1/5/1 208/278/208
diff --git a/tests/manual/planets-qml/meshes/starfield.obj b/tests/manual/planets-qml/meshes/starfield.obj
new file mode 100644
index 000000000..31f70d06b
--- /dev/null
+++ b/tests/manual/planets-qml/meshes/starfield.obj
@@ -0,0 +1,4055 @@
+# Blender v2.70 (sub 0) OBJ File: ''
+# www.blender.org
+v -0.098017 0.995185 0.000000
+v -0.195090 0.980785 0.000000
+v -0.290285 0.956940 0.000000
+v -0.382683 0.923880 0.000000
+v -0.471397 0.881921 0.000000
+v -0.555570 0.831470 0.000000
+v -0.634393 0.773010 0.000000
+v -0.707107 0.707107 0.000000
+v -0.773010 0.634393 0.000000
+v -0.831470 0.555570 0.000000
+v -0.881921 0.471397 0.000000
+v -0.923880 0.382683 0.000000
+v -0.956940 0.290285 0.000000
+v -0.980785 0.195090 0.000000
+v -0.995185 0.098017 0.000000
+v -1.000000 -0.000000 0.000000
+v -0.995185 -0.098017 0.000000
+v -0.980785 -0.195091 0.000000
+v -0.956940 -0.290285 0.000000
+v -0.923879 -0.382684 0.000000
+v -0.881921 -0.471397 0.000000
+v -0.831469 -0.555571 0.000000
+v -0.773010 -0.634394 0.000000
+v -0.707106 -0.707107 0.000000
+v -0.634393 -0.773011 0.000000
+v -0.555570 -0.831470 0.000000
+v -0.471396 -0.881922 0.000000
+v -0.382683 -0.923880 0.000000
+v -0.290284 -0.956941 0.000000
+v -0.195090 -0.980785 0.000000
+v -0.098016 -0.995185 0.000000
+v -0.096134 0.995185 -0.019122
+v -0.191342 0.980785 -0.038060
+v -0.284707 0.956940 -0.056632
+v -0.375330 0.923880 -0.074658
+v -0.462339 0.881921 -0.091965
+v -0.544895 0.831470 -0.108387
+v -0.622204 0.773010 -0.123764
+v -0.693520 0.707107 -0.137950
+v -0.758157 0.634393 -0.150807
+v -0.815493 0.555570 -0.162212
+v -0.864975 0.471397 -0.172054
+v -0.906127 0.382683 -0.180240
+v -0.938553 0.290285 -0.186690
+v -0.961940 0.195090 -0.191342
+v -0.976062 0.098017 -0.194151
+v -0.980785 -0.000000 -0.195090
+v -0.976062 -0.098017 -0.194151
+v -0.961940 -0.195091 -0.191342
+v -0.938553 -0.290285 -0.186690
+v -0.906127 -0.382684 -0.180240
+v -0.864975 -0.471397 -0.172054
+v -0.815493 -0.555571 -0.162212
+v -0.758157 -0.634394 -0.150807
+v -0.693520 -0.707107 -0.137950
+v -0.622203 -0.773011 -0.123764
+v -0.544895 -0.831470 -0.108386
+v -0.462338 -0.881922 -0.091965
+v -0.375330 -0.923880 -0.074658
+v -0.284706 -0.956941 -0.056632
+v -0.191341 -0.980785 -0.038060
+v -0.096133 -0.995185 -0.019122
+v -0.090556 0.995185 -0.037510
+v -0.180240 0.980785 -0.074658
+v -0.268188 0.956940 -0.111087
+v -0.353553 0.923880 -0.146447
+v -0.435514 0.881921 -0.180396
+v -0.513280 0.831470 -0.212608
+v -0.586103 0.773010 -0.242772
+v -0.653281 0.707107 -0.270598
+v -0.714168 0.634393 -0.295819
+v -0.768178 0.555570 -0.318190
+v -0.814789 0.471397 -0.337497
+v -0.853553 0.382683 -0.353554
+v -0.884098 0.290285 -0.366206
+v -0.906127 0.195090 -0.375331
+v -0.919431 0.098017 -0.380841
+v -0.923879 -0.000000 -0.382684
+v -0.919431 -0.098017 -0.380841
+v -0.906127 -0.195091 -0.375331
+v -0.884097 -0.290285 -0.366205
+v -0.853553 -0.382684 -0.353554
+v -0.814789 -0.471397 -0.337497
+v -0.768178 -0.555571 -0.318190
+v -0.714168 -0.634394 -0.295819
+v -0.653281 -0.707107 -0.270598
+v -0.586102 -0.773011 -0.242772
+v -0.513279 -0.831470 -0.212608
+v -0.435513 -0.881922 -0.180396
+v -0.353553 -0.923880 -0.146447
+v -0.268187 -0.956941 -0.111087
+v -0.180239 -0.980785 -0.074658
+v -0.090555 -0.995185 -0.037510
+v -0.081498 0.995185 -0.054456
+v -0.162212 0.980785 -0.108387
+v -0.241363 0.956940 -0.161274
+v -0.318189 0.923880 -0.212608
+v -0.391952 0.881921 -0.261894
+v -0.461940 0.831470 -0.308659
+v -0.527479 0.773010 -0.352450
+v -0.587938 0.707107 -0.392848
+v -0.642735 0.634393 -0.429462
+v -0.691342 0.555570 -0.461940
+v -0.733291 0.471397 -0.489970
+v -0.768178 0.382683 -0.513280
+v -0.795667 0.290285 -0.531648
+v -0.815493 0.195090 -0.544896
+v -0.827466 0.098017 -0.552895
+v -0.831469 -0.000000 -0.555571
+v -0.827466 -0.098017 -0.552895
+v -0.815493 -0.195091 -0.544895
+v -0.795667 -0.290285 -0.531648
+v -0.768177 -0.382684 -0.513280
+v -0.733290 -0.471397 -0.489970
+v -0.691341 -0.555571 -0.461940
+v -0.642734 -0.634394 -0.429462
+v -0.587937 -0.707107 -0.392848
+v -0.527478 -0.773011 -0.352450
+v -0.461939 -0.831470 -0.308658
+v -0.391951 -0.881922 -0.261894
+v -0.318189 -0.923880 -0.212608
+v -0.241362 -0.956941 -0.161274
+v -0.162211 -0.980785 -0.108386
+v -0.081498 -0.995185 -0.054455
+v -0.069308 0.995185 -0.069309
+v -0.137949 0.980785 -0.137950
+v -0.205262 0.956940 -0.205263
+v -0.270598 0.923880 -0.270599
+v -0.333328 0.881921 -0.333328
+v -0.392847 0.831470 -0.392848
+v -0.448584 0.773010 -0.448584
+v -0.500000 0.707107 -0.500001
+v -0.546601 0.634393 -0.546602
+v -0.587937 0.555570 -0.587938
+v -0.623612 0.471397 -0.623613
+v -0.653281 0.382683 -0.653282
+v -0.676659 0.290285 -0.676660
+v -0.693520 0.195090 -0.693521
+v -0.703702 0.098017 -0.703702
+v -0.707106 -0.000000 -0.707107
+v -0.703702 -0.098017 -0.703702
+v -0.693520 -0.195091 -0.693520
+v -0.676659 -0.290285 -0.676660
+v -0.653281 -0.382684 -0.653282
+v -0.623612 -0.471397 -0.623613
+v -0.587937 -0.555571 -0.587938
+v -0.546601 -0.634394 -0.546601
+v -0.499999 -0.707107 -0.500000
+v -0.448583 -0.773011 -0.448584
+v -0.392847 -0.831470 -0.392848
+v -0.333327 -0.881922 -0.333328
+v -0.270597 -0.923880 -0.270598
+v -0.205261 -0.956941 -0.205262
+v -0.137949 -0.980785 -0.137950
+v -0.069308 -0.995185 -0.069309
+v -0.054455 0.995185 -0.081499
+v -0.108386 0.980785 -0.162212
+v -0.161273 0.956940 -0.241364
+v -0.212607 0.923880 -0.318190
+v -0.261894 0.881921 -0.391953
+v -0.308658 0.831470 -0.461940
+v -0.352450 0.773010 -0.527479
+v -0.392847 0.707107 -0.587938
+v -0.429461 0.634393 -0.642735
+v -0.461939 0.555570 -0.691342
+v -0.489969 0.471397 -0.733291
+v -0.513280 0.382683 -0.768178
+v -0.531647 0.290285 -0.795668
+v -0.544895 0.195090 -0.815494
+v -0.552895 0.098017 -0.827466
+v -0.555570 -0.000000 -0.831470
+v -0.552895 -0.098017 -0.827466
+v -0.544895 -0.195091 -0.815494
+v -0.531647 -0.290285 -0.795667
+v -0.513279 -0.382684 -0.768178
+v -0.489969 -0.471397 -0.733291
+v -0.461939 -0.555571 -0.691342
+v -0.429461 -0.634394 -0.642735
+v -0.392847 -0.707107 -0.587938
+v -0.352449 -0.773011 -0.527479
+v -0.308658 -0.831470 -0.461940
+v -0.261893 -0.881922 -0.391952
+v -0.212607 -0.923880 -0.318190
+v -0.161273 -0.956941 -0.241363
+v -0.108386 -0.980785 -0.162212
+v -0.054455 -0.995185 -0.081498
+v -0.037509 0.995185 -0.090557
+v -0.074657 0.980785 -0.180241
+v -0.111087 0.956940 -0.268189
+v -0.146446 0.923880 -0.353554
+v -0.180395 0.881921 -0.435514
+v -0.212607 0.831470 -0.513281
+v -0.242771 0.773010 -0.586104
+v -0.270597 0.707107 -0.653282
+v -0.295818 0.634393 -0.714169
+v -0.318189 0.555570 -0.768178
+v -0.337496 0.471397 -0.814790
+v -0.353553 0.382683 -0.853554
+v -0.366205 0.290285 -0.884098
+v -0.375330 0.195090 -0.906128
+v -0.380840 0.098017 -0.919431
+v -0.382683 -0.000000 -0.923880
+v -0.380840 -0.098017 -0.919431
+v -0.375330 -0.195091 -0.906128
+v -0.366205 -0.290285 -0.884098
+v -0.353553 -0.382684 -0.853554
+v -0.337496 -0.471397 -0.814790
+v -0.318189 -0.555571 -0.768178
+v -0.295818 -0.634394 -0.714169
+v -0.270597 -0.707107 -0.653282
+v -0.242771 -0.773011 -0.586103
+v -0.212607 -0.831470 -0.513280
+v -0.180395 -0.881922 -0.435514
+v -0.146446 -0.923880 -0.353554
+v -0.111086 -0.956941 -0.268188
+v -0.074657 -0.980785 -0.180240
+v -0.037509 -0.995185 -0.090556
+v 0.000001 -1.000000 0.000000
+v -0.019122 0.995185 -0.096135
+v -0.038060 0.980785 -0.191342
+v -0.056631 0.956940 -0.284708
+v -0.074657 0.923880 -0.375331
+v -0.091964 0.881921 -0.462340
+v -0.108386 0.831470 -0.544896
+v -0.123763 0.773010 -0.622204
+v -0.137949 0.707107 -0.693521
+v -0.150806 0.634393 -0.758158
+v -0.162211 0.555570 -0.815494
+v -0.172054 0.471397 -0.864976
+v -0.180239 0.382683 -0.906128
+v -0.186689 0.290285 -0.938554
+v -0.191341 0.195090 -0.961941
+v -0.194150 0.098017 -0.976063
+v -0.195090 -0.000000 -0.980786
+v -0.194150 -0.098017 -0.976063
+v -0.191341 -0.195091 -0.961940
+v -0.186689 -0.290285 -0.938554
+v -0.180239 -0.382684 -0.906128
+v -0.172054 -0.471397 -0.864976
+v -0.162211 -0.555571 -0.815494
+v -0.150806 -0.634394 -0.758158
+v -0.137949 -0.707107 -0.693520
+v -0.123763 -0.773011 -0.622204
+v -0.108386 -0.831470 -0.544895
+v -0.091964 -0.881922 -0.462339
+v -0.074657 -0.923880 -0.375330
+v -0.056631 -0.956941 -0.284707
+v -0.038059 -0.980785 -0.191342
+v -0.019121 -0.995185 -0.096134
+v 0.000001 0.995185 -0.098018
+v 0.000001 0.980785 -0.195091
+v 0.000001 0.956940 -0.290285
+v 0.000001 0.923880 -0.382684
+v 0.000001 0.881921 -0.471397
+v 0.000001 0.831470 -0.555571
+v 0.000001 0.773010 -0.634394
+v 0.000001 0.707107 -0.707108
+v 0.000001 0.634393 -0.773011
+v 0.000001 0.555570 -0.831470
+v 0.000001 0.471397 -0.881922
+v 0.000001 0.382683 -0.923880
+v 0.000001 0.290285 -0.956941
+v 0.000001 0.195090 -0.980786
+v 0.000001 0.098017 -0.995185
+v 0.000001 -0.000000 -1.000001
+v 0.000001 -0.098017 -0.995185
+v 0.000001 -0.195091 -0.980786
+v 0.000001 -0.290285 -0.956941
+v 0.000001 -0.382684 -0.923880
+v 0.000001 -0.471397 -0.881922
+v 0.000001 -0.555571 -0.831470
+v 0.000001 -0.634394 -0.773011
+v 0.000001 -0.707107 -0.707107
+v 0.000001 -0.773011 -0.634394
+v 0.000001 -0.831470 -0.555570
+v 0.000001 -0.881922 -0.471397
+v 0.000001 -0.923880 -0.382683
+v 0.000001 -0.956941 -0.290285
+v 0.000001 -0.980785 -0.195090
+v 0.000001 -0.995185 -0.098017
+v 0.019123 0.995185 -0.096135
+v 0.038061 0.980785 -0.191342
+v 0.056633 0.956940 -0.284708
+v 0.074659 0.923880 -0.375331
+v 0.091966 0.881921 -0.462340
+v 0.108387 0.831470 -0.544896
+v 0.123765 0.773010 -0.622204
+v 0.137951 0.707107 -0.693521
+v 0.150808 0.634393 -0.758158
+v 0.162213 0.555570 -0.815494
+v 0.172055 0.471397 -0.864976
+v 0.180241 0.382683 -0.906128
+v 0.186691 0.290285 -0.938554
+v 0.191343 0.195090 -0.961940
+v 0.194152 0.098017 -0.976063
+v 0.195091 -0.000000 -0.980786
+v 0.194152 -0.098017 -0.976063
+v 0.191343 -0.195091 -0.961940
+v 0.186691 -0.290285 -0.938554
+v 0.180241 -0.382684 -0.906128
+v 0.172055 -0.471397 -0.864976
+v 0.162213 -0.555571 -0.815494
+v 0.150808 -0.634394 -0.758158
+v 0.137951 -0.707107 -0.693520
+v 0.123765 -0.773011 -0.622204
+v 0.108387 -0.831470 -0.544895
+v 0.091966 -0.881922 -0.462339
+v 0.074659 -0.923880 -0.375330
+v 0.056633 -0.956941 -0.284707
+v 0.038061 -0.980785 -0.191342
+v 0.019123 -0.995185 -0.096134
+v 0.037511 0.995185 -0.090557
+v 0.074659 0.980785 -0.180241
+v 0.111088 0.956940 -0.268189
+v 0.146448 0.923880 -0.353554
+v 0.180397 0.881921 -0.435514
+v 0.212609 0.831470 -0.513281
+v 0.242773 0.773010 -0.586104
+v 0.270599 0.707107 -0.653282
+v 0.295819 0.634393 -0.714169
+v 0.318191 0.555570 -0.768178
+v 0.337498 0.471397 -0.814790
+v 0.353555 0.382683 -0.853554
+v 0.366206 0.290285 -0.884098
+v 0.375331 0.195090 -0.906128
+v 0.380842 0.098017 -0.919431
+v 0.382685 -0.000000 -0.923880
+v 0.380842 -0.098017 -0.919431
+v 0.375331 -0.195091 -0.906128
+v 0.366206 -0.290285 -0.884098
+v 0.353555 -0.382684 -0.853554
+v 0.337498 -0.471397 -0.814790
+v 0.318191 -0.555571 -0.768178
+v 0.295819 -0.634394 -0.714169
+v 0.270599 -0.707107 -0.653282
+v 0.242773 -0.773011 -0.586103
+v 0.212609 -0.831470 -0.513280
+v 0.180397 -0.881922 -0.435514
+v 0.146447 -0.923880 -0.353553
+v 0.111088 -0.956941 -0.268188
+v 0.074659 -0.980785 -0.180240
+v 0.037510 -0.995185 -0.090556
+v 0.054457 0.995185 -0.081499
+v 0.108388 0.980785 -0.162212
+v 0.161275 0.956940 -0.241363
+v 0.212609 0.923880 -0.318190
+v 0.261895 0.881921 -0.391952
+v 0.308660 0.831470 -0.461940
+v 0.352451 0.773010 -0.527479
+v 0.392849 0.707107 -0.587938
+v 0.429463 0.634393 -0.642735
+v 0.461941 0.555570 -0.691342
+v 0.489971 0.471397 -0.733291
+v 0.513281 0.382683 -0.768178
+v 0.531649 0.290285 -0.795667
+v 0.544896 0.195090 -0.815494
+v 0.552896 0.098017 -0.827466
+v 0.555572 -0.000000 -0.831470
+v 0.552896 -0.098017 -0.827466
+v 0.544896 -0.195091 -0.815494
+v 0.531649 -0.290285 -0.795667
+v 0.513281 -0.382684 -0.768178
+v 0.489970 -0.471397 -0.733291
+v 0.461941 -0.555571 -0.691342
+v 0.429463 -0.634394 -0.642735
+v 0.392849 -0.707107 -0.587938
+v 0.352451 -0.773011 -0.527479
+v 0.308659 -0.831470 -0.461940
+v 0.261895 -0.881922 -0.391952
+v 0.212608 -0.923880 -0.318190
+v 0.161274 -0.956941 -0.241363
+v 0.108387 -0.980785 -0.162212
+v 0.054456 -0.995185 -0.081498
+v 0.069310 0.995185 -0.069309
+v 0.137951 0.980785 -0.137950
+v 0.205264 0.956940 -0.205263
+v 0.270599 0.923880 -0.270598
+v 0.333329 0.881921 -0.333328
+v 0.392849 0.831470 -0.392848
+v 0.448585 0.773010 -0.448584
+v 0.500001 0.707107 -0.500000
+v 0.546602 0.634393 -0.546601
+v 0.587939 0.555570 -0.587938
+v 0.623614 0.471397 -0.623613
+v 0.653283 0.382683 -0.653282
+v 0.676660 0.290285 -0.676659
+v 0.693521 0.195090 -0.693520
+v 0.703703 0.098017 -0.703702
+v 0.707108 -0.000000 -0.707107
+v 0.703703 -0.098017 -0.703702
+v 0.693521 -0.195091 -0.693520
+v 0.676660 -0.290285 -0.676659
+v 0.653283 -0.382684 -0.653282
+v 0.623614 -0.471397 -0.623613
+v 0.587939 -0.555571 -0.587938
+v 0.546602 -0.634394 -0.546601
+v 0.500001 -0.707107 -0.500000
+v 0.448585 -0.773011 -0.448584
+v 0.392849 -0.831470 -0.392848
+v 0.333329 -0.881922 -0.333328
+v 0.270599 -0.923880 -0.270598
+v 0.205263 -0.956941 -0.205262
+v 0.137951 -0.980785 -0.137950
+v 0.069309 -0.995185 -0.069309
+v 0.081500 0.995185 -0.054456
+v 0.162213 0.980785 -0.108387
+v 0.241364 0.956940 -0.161274
+v 0.318191 0.923880 -0.212608
+v 0.391953 0.881921 -0.261894
+v 0.461941 0.831470 -0.308659
+v 0.527480 0.773010 -0.352450
+v 0.587939 0.707107 -0.392848
+v 0.642736 0.634393 -0.429462
+v 0.691343 0.555570 -0.461940
+v 0.733292 0.471397 -0.489969
+v 0.768179 0.382683 -0.513280
+v 0.795668 0.290285 -0.531648
+v 0.815495 0.195090 -0.544895
+v 0.827467 0.098017 -0.552895
+v 0.831471 -0.000000 -0.555571
+v 0.827467 -0.098017 -0.552895
+v 0.815494 -0.195091 -0.544895
+v 0.795668 -0.290285 -0.531648
+v 0.768179 -0.382684 -0.513280
+v 0.733292 -0.471397 -0.489969
+v 0.691343 -0.555571 -0.461940
+v 0.642736 -0.634394 -0.429462
+v 0.587939 -0.707107 -0.392848
+v 0.527480 -0.773011 -0.352450
+v 0.461941 -0.831470 -0.308658
+v 0.391953 -0.881922 -0.261894
+v 0.318191 -0.923880 -0.212607
+v 0.241364 -0.956941 -0.161273
+v 0.162213 -0.980785 -0.108386
+v 0.081499 -0.995185 -0.054455
+v 0.090558 0.995185 -0.037510
+v 0.180241 0.980785 -0.074658
+v 0.268189 0.956940 -0.111087
+v 0.353555 0.923880 -0.146447
+v 0.435515 0.881921 -0.180396
+v 0.513281 0.831470 -0.212608
+v 0.586104 0.773010 -0.242772
+v 0.653283 0.707107 -0.270598
+v 0.714170 0.634393 -0.295818
+v 0.768179 0.555570 -0.318190
+v 0.814790 0.471397 -0.337497
+v 0.853555 0.382683 -0.353554
+v 0.884099 0.290285 -0.366205
+v 0.906129 0.195090 -0.375330
+v 0.919432 0.098017 -0.380841
+v 0.923881 -0.000000 -0.382684
+v 0.919432 -0.098017 -0.380841
+v 0.906129 -0.195091 -0.375331
+v 0.884099 -0.290285 -0.366205
+v 0.853555 -0.382684 -0.353554
+v 0.814790 -0.471397 -0.337497
+v 0.768179 -0.555571 -0.318190
+v 0.714170 -0.634394 -0.295818
+v 0.653283 -0.707107 -0.270598
+v 0.586104 -0.773011 -0.242772
+v 0.513281 -0.831470 -0.212607
+v 0.435515 -0.881922 -0.180396
+v 0.353554 -0.923880 -0.146447
+v 0.268189 -0.956941 -0.111087
+v 0.180241 -0.980785 -0.074658
+v 0.090557 -0.995185 -0.037510
+v 0.096135 0.995185 -0.019122
+v 0.191343 0.980785 -0.038060
+v 0.284708 0.956940 -0.056632
+v 0.375332 0.923880 -0.074658
+v 0.462340 0.881921 -0.091965
+v 0.544897 0.831470 -0.108386
+v 0.622205 0.773010 -0.123764
+v 0.693521 0.707107 -0.137950
+v 0.758159 0.634393 -0.150807
+v 0.815494 0.555570 -0.162212
+v 0.864977 0.471397 -0.172054
+v 0.906129 0.382683 -0.180240
+v 0.938554 0.290285 -0.186690
+v 0.961941 0.195090 -0.191342
+v 0.976064 0.098017 -0.194151
+v 0.980787 -0.000000 -0.195090
+v 0.976064 -0.098017 -0.194151
+v 0.961941 -0.195091 -0.191342
+v 0.938554 -0.290285 -0.186690
+v 0.906129 -0.382684 -0.180240
+v 0.864977 -0.471397 -0.172054
+v 0.815494 -0.555571 -0.162212
+v 0.758158 -0.634394 -0.150807
+v 0.693521 -0.707107 -0.137950
+v 0.622205 -0.773011 -0.123764
+v 0.544896 -0.831470 -0.108386
+v 0.462340 -0.881922 -0.091965
+v 0.375331 -0.923880 -0.074658
+v 0.284708 -0.956941 -0.056632
+v 0.191343 -0.980785 -0.038060
+v 0.096135 -0.995185 -0.019122
+v 0.098019 0.995185 -0.000000
+v 0.195092 0.980785 0.000000
+v 0.290286 0.956940 0.000000
+v 0.382685 0.923880 0.000000
+v 0.471398 0.881921 0.000000
+v 0.555572 0.831470 0.000000
+v 0.634395 0.773010 0.000000
+v 0.707108 0.707107 0.000000
+v 0.773012 0.634393 0.000000
+v 0.831471 0.555570 0.000000
+v 0.881923 0.471397 0.000000
+v 0.923881 0.382683 0.000000
+v 0.956942 0.290285 0.000000
+v 0.980787 0.195090 0.000000
+v 0.995186 0.098017 0.000000
+v 1.000001 -0.000000 0.000000
+v 0.995186 -0.098017 0.000000
+v 0.980787 -0.195091 -0.000000
+v 0.956941 -0.290285 0.000000
+v 0.923881 -0.382684 0.000000
+v 0.881922 -0.471397 0.000000
+v 0.831471 -0.555571 0.000000
+v 0.773012 -0.634394 0.000000
+v 0.707108 -0.707107 0.000000
+v 0.634394 -0.773011 -0.000000
+v 0.555571 -0.831470 0.000000
+v 0.471398 -0.881922 0.000000
+v 0.382684 -0.923880 0.000000
+v 0.290285 -0.956941 0.000000
+v 0.195091 -0.980785 0.000000
+v 0.098018 -0.995185 0.000000
+v 0.096135 0.995185 0.019122
+v 0.191343 0.980785 0.038060
+v 0.284708 0.956940 0.056632
+v 0.375332 0.923880 0.074658
+v 0.462340 0.881921 0.091965
+v 0.544897 0.831470 0.108387
+v 0.622205 0.773010 0.123764
+v 0.693521 0.707107 0.137950
+v 0.758159 0.634393 0.150807
+v 0.815494 0.555570 0.162212
+v 0.864977 0.471397 0.172055
+v 0.906129 0.382683 0.180240
+v 0.938554 0.290285 0.186690
+v 0.961941 0.195090 0.191342
+v 0.976064 0.098017 0.194151
+v 0.980787 -0.000000 0.195090
+v 0.976064 -0.098017 0.194151
+v 0.961941 -0.195091 0.191342
+v 0.938554 -0.290285 0.186690
+v 0.906129 -0.382684 0.180240
+v 0.864977 -0.471397 0.172055
+v 0.815494 -0.555571 0.162212
+v 0.758158 -0.634394 0.150807
+v 0.693521 -0.707107 0.137950
+v 0.622205 -0.773011 0.123764
+v 0.544896 -0.831470 0.108387
+v 0.462340 -0.881922 0.091965
+v 0.375331 -0.923880 0.074658
+v 0.284708 -0.956941 0.056632
+v 0.191343 -0.980785 0.038060
+v 0.096135 -0.995185 0.019122
+v 0.090558 0.995185 0.037510
+v 0.180241 0.980785 0.074658
+v 0.268190 0.956940 0.111087
+v 0.353555 0.923880 0.146447
+v 0.435515 0.881921 0.180396
+v 0.513281 0.831470 0.212608
+v 0.586104 0.773010 0.242772
+v 0.653283 0.707107 0.270598
+v 0.714170 0.634393 0.295819
+v 0.768179 0.555570 0.318190
+v 0.814790 0.471397 0.337497
+v 0.853554 0.382683 0.353554
+v 0.884099 0.290285 0.366205
+v 0.906129 0.195090 0.375331
+v 0.919432 0.098017 0.380841
+v 0.923881 -0.000000 0.382684
+v 0.919432 -0.098017 0.380841
+v 0.906129 -0.195091 0.375330
+v 0.884099 -0.290285 0.366205
+v 0.853555 -0.382684 0.353554
+v 0.814790 -0.471397 0.337497
+v 0.768179 -0.555571 0.318190
+v 0.714170 -0.634394 0.295818
+v 0.653282 -0.707107 0.270598
+v 0.586104 -0.773011 0.242772
+v 0.513281 -0.831470 0.212608
+v 0.435515 -0.881922 0.180396
+v 0.353554 -0.923880 0.146447
+v 0.268189 -0.956941 0.111087
+v 0.180241 -0.980785 0.074658
+v 0.090557 -0.995185 0.037510
+v 0.081500 0.995185 0.054456
+v 0.162213 0.980785 0.108387
+v 0.241364 0.956940 0.161274
+v 0.318191 0.923880 0.212608
+v 0.391953 0.881921 0.261894
+v 0.461941 0.831470 0.308659
+v 0.527480 0.773010 0.352450
+v 0.587939 0.707107 0.392848
+v 0.642736 0.634393 0.429462
+v 0.691343 0.555570 0.461940
+v 0.733292 0.471397 0.489970
+v 0.768179 0.382683 0.513280
+v 0.795668 0.290285 0.531648
+v 0.815494 0.195090 0.544895
+v 0.827467 0.098017 0.552895
+v 0.831471 -0.000000 0.555571
+v 0.827467 -0.098017 0.552895
+v 0.815494 -0.195091 0.544895
+v 0.795668 -0.290285 0.531648
+v 0.768179 -0.382684 0.513280
+v 0.733292 -0.471397 0.489970
+v 0.691343 -0.555571 0.461940
+v 0.642736 -0.634394 0.429462
+v 0.587939 -0.707107 0.392848
+v 0.527480 -0.773011 0.352450
+v 0.461941 -0.831470 0.308659
+v 0.391953 -0.881922 0.261894
+v 0.318190 -0.923880 0.212608
+v 0.241364 -0.956941 0.161274
+v 0.162213 -0.980785 0.108386
+v 0.081499 -0.995185 0.054455
+v 0.069310 0.995185 0.069309
+v 0.137951 0.980785 0.137950
+v 0.205264 0.956940 0.205263
+v 0.270599 0.923880 0.270599
+v 0.333329 0.881921 0.333328
+v 0.392849 0.831470 0.392848
+v 0.448585 0.773010 0.448584
+v 0.500001 0.707107 0.500000
+v 0.546602 0.634393 0.546601
+v 0.587939 0.555570 0.587938
+v 0.623613 0.471397 0.623613
+v 0.653282 0.382683 0.653282
+v 0.676660 0.290285 0.676659
+v 0.693521 0.195090 0.693520
+v 0.703703 0.098017 0.703702
+v 0.707108 -0.000000 0.707107
+v 0.703703 -0.098017 0.703702
+v 0.693521 -0.195091 0.693520
+v 0.676660 -0.290285 0.676659
+v 0.653282 -0.382684 0.653282
+v 0.623613 -0.471397 0.623613
+v 0.587939 -0.555571 0.587938
+v 0.546602 -0.634394 0.546601
+v 0.500001 -0.707107 0.500000
+v 0.448585 -0.773011 0.448584
+v 0.392848 -0.831470 0.392848
+v 0.333329 -0.881922 0.333328
+v 0.270599 -0.923880 0.270598
+v 0.205263 -0.956941 0.205262
+v 0.137951 -0.980785 0.137950
+v 0.069309 -0.995185 0.069309
+v 0.054457 0.995185 0.081499
+v 0.108388 0.980785 0.162212
+v 0.161275 0.956940 0.241363
+v 0.212609 0.923880 0.318190
+v 0.261895 0.881921 0.391953
+v 0.308659 0.831470 0.461940
+v 0.352451 0.773010 0.527479
+v 0.392848 0.707107 0.587938
+v 0.429463 0.634393 0.642735
+v 0.461940 0.555570 0.691342
+v 0.489970 0.471397 0.733291
+v 0.513281 0.382683 0.768178
+v 0.531648 0.290285 0.795667
+v 0.544896 0.195090 0.815494
+v 0.552896 0.098017 0.827466
+v 0.555571 -0.000000 0.831470
+v 0.552896 -0.098017 0.827466
+v 0.544896 -0.195091 0.815493
+v 0.531648 -0.290285 0.795667
+v 0.513281 -0.382684 0.768178
+v 0.489970 -0.471397 0.733291
+v 0.461940 -0.555571 0.691342
+v 0.429462 -0.634394 0.642735
+v 0.392848 -0.707107 0.587938
+v 0.352451 -0.773011 0.527479
+v 0.308659 -0.831470 0.461940
+v 0.261895 -0.881922 0.391952
+v 0.212608 -0.923880 0.318190
+v 0.161274 -0.956941 0.241363
+v 0.108387 -0.980785 0.162212
+v 0.054456 -0.995185 0.081498
+v 0.037511 0.995185 0.090557
+v 0.074659 0.980785 0.180241
+v 0.111088 0.956940 0.268189
+v 0.146448 0.923880 0.353554
+v 0.180397 0.881921 0.435514
+v 0.212608 0.831470 0.513281
+v 0.242773 0.773010 0.586103
+v 0.270599 0.707107 0.653282
+v 0.295819 0.634393 0.714169
+v 0.318190 0.555570 0.768178
+v 0.337497 0.471397 0.814789
+v 0.353554 0.382683 0.853554
+v 0.366206 0.290285 0.884098
+v 0.375331 0.195090 0.906128
+v 0.380842 0.098017 0.919431
+v 0.382684 -0.000000 0.923880
+v 0.380842 -0.098017 0.919431
+v 0.375331 -0.195091 0.906127
+v 0.366206 -0.290285 0.884098
+v 0.353554 -0.382684 0.853554
+v 0.337497 -0.471397 0.814789
+v 0.318190 -0.555571 0.768178
+v 0.295819 -0.634394 0.714169
+v 0.270599 -0.707107 0.653282
+v 0.242773 -0.773011 0.586103
+v 0.212608 -0.831470 0.513280
+v 0.180396 -0.881922 0.435514
+v 0.146447 -0.923880 0.353553
+v 0.111088 -0.956941 0.268188
+v 0.074659 -0.980785 0.180240
+v 0.037510 -0.995185 0.090556
+v 0.019123 0.995185 0.096135
+v 0.038061 0.980785 0.191342
+v 0.056633 0.956940 0.284708
+v 0.074659 0.923880 0.375331
+v 0.091966 0.881921 0.462340
+v 0.108387 0.831470 0.544896
+v 0.123765 0.773010 0.622204
+v 0.137950 0.707107 0.693520
+v 0.150808 0.634393 0.758158
+v 0.162212 0.555570 0.815493
+v 0.172055 0.471397 0.864976
+v 0.180241 0.382683 0.906128
+v 0.186691 0.290285 0.938553
+v 0.191343 0.195090 0.961940
+v 0.194152 0.098017 0.976063
+v 0.195091 -0.000000 0.980786
+v 0.194152 -0.098017 0.976063
+v 0.191343 -0.195091 0.961940
+v 0.186691 -0.290285 0.938553
+v 0.180241 -0.382684 0.906128
+v 0.172055 -0.471397 0.864976
+v 0.162212 -0.555571 0.815493
+v 0.150808 -0.634394 0.758157
+v 0.137950 -0.707107 0.693520
+v 0.123765 -0.773011 0.622204
+v 0.108387 -0.831470 0.544895
+v 0.091966 -0.881922 0.462339
+v 0.074659 -0.923880 0.375330
+v 0.056632 -0.956941 0.284707
+v 0.038061 -0.980785 0.191342
+v 0.019123 -0.995185 0.096134
+v 0.000001 0.995185 0.098018
+v 0.000001 0.980785 0.195091
+v 0.000001 0.956940 0.290285
+v 0.000001 0.923880 0.382684
+v 0.000001 0.881921 0.471397
+v 0.000001 0.831470 0.555571
+v 0.000001 0.773010 0.634394
+v 0.000001 0.707107 0.707107
+v 0.000001 0.634393 0.773011
+v 0.000001 0.555570 0.831470
+v 0.000001 0.471397 0.881922
+v 0.000001 0.382683 0.923880
+v 0.000001 0.290285 0.956941
+v 0.000001 0.195090 0.980785
+v 0.000001 0.098017 0.995185
+v 0.000001 -0.000000 1.000000
+v 0.000001 -0.098017 0.995185
+v 0.000001 -0.195091 0.980785
+v 0.000001 -0.290285 0.956940
+v 0.000001 -0.382684 0.923880
+v 0.000001 -0.471397 0.881921
+v 0.000001 -0.555571 0.831470
+v 0.000001 -0.634394 0.773010
+v 0.000001 -0.707107 0.707107
+v 0.000001 -0.773011 0.634393
+v 0.000001 -0.831470 0.555570
+v 0.000001 -0.881922 0.471397
+v 0.000001 -0.923880 0.382683
+v 0.000001 -0.956941 0.290285
+v 0.000001 -0.980785 0.195090
+v 0.000001 -0.995185 0.098017
+v -0.019122 0.995185 0.096134
+v -0.038060 0.980785 0.191342
+v -0.056631 0.956940 0.284708
+v -0.074657 0.923880 0.375331
+v -0.091964 0.881921 0.462339
+v -0.108386 0.831470 0.544896
+v -0.123763 0.773010 0.622204
+v -0.137949 0.707107 0.693520
+v -0.150806 0.634393 0.758157
+v -0.162211 0.555570 0.815493
+v -0.172054 0.471397 0.864976
+v -0.180239 0.382683 0.906128
+v -0.186689 0.290285 0.938553
+v -0.191341 0.195090 0.961940
+v -0.194150 0.098017 0.976063
+v -0.195090 -0.000000 0.980785
+v -0.194150 -0.098017 0.976063
+v -0.191341 -0.195091 0.961940
+v -0.186689 -0.290285 0.938553
+v -0.180239 -0.382684 0.906128
+v -0.172054 -0.471397 0.864975
+v -0.162211 -0.555571 0.815493
+v -0.150806 -0.634394 0.758157
+v -0.137949 -0.707107 0.693520
+v -0.123763 -0.773011 0.622203
+v -0.108386 -0.831470 0.544895
+v -0.091964 -0.881922 0.462339
+v -0.074657 -0.923880 0.375330
+v -0.056631 -0.956941 0.284707
+v -0.038059 -0.980785 0.191342
+v -0.019121 -0.995185 0.096134
+v -0.037509 0.995185 0.090557
+v -0.074657 0.980785 0.180241
+v -0.111087 0.956940 0.268189
+v -0.146446 0.923880 0.353554
+v -0.180395 0.881921 0.435514
+v -0.212607 0.831470 0.513280
+v -0.242771 0.773010 0.586103
+v -0.270597 0.707107 0.653282
+v -0.295818 0.634393 0.714169
+v -0.318189 0.555570 0.768178
+v -0.337496 0.471397 0.814789
+v -0.353553 0.382683 0.853553
+v -0.366205 0.290285 0.884098
+v -0.375330 0.195090 0.906127
+v -0.380840 0.098017 0.919431
+v -0.382683 -0.000000 0.923880
+v -0.380840 -0.098017 0.919431
+v -0.375329 -0.195091 0.906127
+v -0.366204 -0.290285 0.884098
+v -0.353553 -0.382684 0.853553
+v -0.337496 -0.471397 0.814789
+v -0.318189 -0.555571 0.768178
+v -0.295817 -0.634394 0.714168
+v -0.270597 -0.707107 0.653281
+v -0.242771 -0.773011 0.586103
+v -0.212607 -0.831470 0.513280
+v -0.180395 -0.881922 0.435514
+v -0.146446 -0.923880 0.353553
+v -0.111086 -0.956941 0.268188
+v -0.074657 -0.980785 0.180240
+v -0.037509 -0.995185 0.090556
+v -0.054455 0.995185 0.081499
+v -0.108386 0.980785 0.162212
+v -0.161273 0.956940 0.241363
+v -0.212607 0.923880 0.318190
+v -0.261894 0.881921 0.391952
+v -0.308658 0.831470 0.461940
+v -0.352450 0.773010 0.527479
+v -0.392847 0.707107 0.587938
+v -0.429461 0.634393 0.642735
+v -0.461939 0.555570 0.691341
+v -0.489969 0.471397 0.733291
+v -0.513279 0.382683 0.768178
+v -0.531647 0.290285 0.795667
+v -0.544894 0.195090 0.815493
+v -0.552894 0.098017 0.827466
+v -0.555570 -0.000000 0.831470
+v -0.552894 -0.098017 0.827466
+v -0.544894 -0.195091 0.815493
+v -0.531647 -0.290285 0.795667
+v -0.513279 -0.382684 0.768178
+v -0.489968 -0.471397 0.733291
+v -0.461939 -0.555571 0.691341
+v -0.429461 -0.634394 0.642735
+v -0.392847 -0.707107 0.587938
+v -0.352449 -0.773011 0.527479
+v -0.308658 -0.831470 0.461940
+v -0.261893 -0.881922 0.391952
+v -0.212607 -0.923880 0.318190
+v -0.161273 -0.956941 0.241363
+v -0.108386 -0.980785 0.162212
+v -0.054455 -0.995185 0.081498
+v 0.000000 1.000000 0.000001
+v -0.069308 0.995185 0.069309
+v -0.137949 0.980785 0.137950
+v -0.205262 0.956940 0.205263
+v -0.270598 0.923880 0.270598
+v -0.333327 0.881921 0.333328
+v -0.392847 0.831470 0.392848
+v -0.448583 0.773010 0.448584
+v -0.499999 0.707107 0.500000
+v -0.546600 0.634393 0.546601
+v -0.587937 0.555570 0.587937
+v -0.623612 0.471397 0.623612
+v -0.653281 0.382683 0.653281
+v -0.676658 0.290285 0.676659
+v -0.693519 0.195090 0.693520
+v -0.703701 0.098017 0.703702
+v -0.707106 -0.000000 0.707107
+v -0.703701 -0.098017 0.703702
+v -0.693519 -0.195091 0.693520
+v -0.676658 -0.290285 0.676659
+v -0.653281 -0.382684 0.653281
+v -0.623612 -0.471397 0.623612
+v -0.587937 -0.555571 0.587937
+v -0.546600 -0.634394 0.546601
+v -0.499999 -0.707107 0.500000
+v -0.448583 -0.773011 0.448584
+v -0.392847 -0.831470 0.392847
+v -0.333327 -0.881922 0.333328
+v -0.270597 -0.923880 0.270598
+v -0.205261 -0.956941 0.205262
+v -0.137949 -0.980785 0.137950
+v -0.069308 -0.995185 0.069309
+v -0.081498 0.995185 0.054456
+v -0.162211 0.980785 0.108387
+v -0.241363 0.956940 0.161274
+v -0.318189 0.923880 0.212608
+v -0.391952 0.881921 0.261894
+v -0.461939 0.831470 0.308658
+v -0.527478 0.773010 0.352450
+v -0.587937 0.707107 0.392847
+v -0.642734 0.634393 0.429461
+v -0.691341 0.555570 0.461939
+v -0.733290 0.471397 0.489969
+v -0.768177 0.382683 0.513280
+v -0.795666 0.290285 0.531647
+v -0.815492 0.195090 0.544895
+v -0.827465 0.098017 0.552895
+v -0.831469 -0.000000 0.555570
+v -0.827465 -0.098017 0.552895
+v -0.815492 -0.195091 0.544895
+v -0.795666 -0.290285 0.531647
+v -0.768177 -0.382684 0.513280
+v -0.733290 -0.471397 0.489969
+v -0.691341 -0.555571 0.461939
+v -0.642734 -0.634394 0.429461
+v -0.587937 -0.707107 0.392847
+v -0.527478 -0.773011 0.352450
+v -0.461939 -0.831470 0.308658
+v -0.391951 -0.881922 0.261894
+v -0.318189 -0.923880 0.212607
+v -0.241362 -0.956941 0.161273
+v -0.162211 -0.980785 0.108386
+v -0.081497 -0.995185 0.054455
+v -0.090556 0.995185 0.037510
+v -0.180240 0.980785 0.074658
+v -0.268188 0.956940 0.111087
+v -0.353553 0.923880 0.146447
+v -0.435513 0.881921 0.180396
+v -0.513280 0.831470 0.212608
+v -0.586102 0.773010 0.242772
+v -0.653281 0.707107 0.270598
+v -0.714168 0.634393 0.295818
+v -0.768177 0.555570 0.318189
+v -0.814788 0.471397 0.337496
+v -0.853553 0.382683 0.353553
+v -0.884097 0.290285 0.366205
+v -0.906127 0.195090 0.375330
+v -0.919430 0.098017 0.380840
+v -0.923879 -0.000000 0.382683
+v -0.919430 -0.098017 0.380840
+v -0.906126 -0.195091 0.375330
+v -0.884097 -0.290285 0.366205
+v -0.853553 -0.382684 0.353553
+v -0.814788 -0.471397 0.337496
+v -0.768177 -0.555571 0.318189
+v -0.714168 -0.634394 0.295818
+v -0.653281 -0.707107 0.270598
+v -0.586102 -0.773011 0.242772
+v -0.513279 -0.831470 0.212607
+v -0.435513 -0.881922 0.180396
+v -0.353553 -0.923880 0.146447
+v -0.268187 -0.956941 0.111087
+v -0.180239 -0.980785 0.074658
+v -0.090555 -0.995185 0.037510
+v -0.096134 0.995185 0.019122
+v -0.191342 0.980785 0.038060
+v -0.284707 0.956940 0.056632
+v -0.375330 0.923880 0.074658
+v -0.462339 0.881921 0.091965
+v -0.544895 0.831470 0.108386
+v -0.622203 0.773010 0.123764
+v -0.693519 0.707107 0.137950
+v -0.758156 0.634393 0.150807
+v -0.815492 0.555570 0.162211
+v -0.864975 0.471397 0.172054
+v -0.906127 0.382683 0.180240
+v -0.938552 0.290285 0.186689
+v -0.961939 0.195090 0.191341
+v -0.976061 0.098017 0.194151
+v -0.980784 -0.000000 0.195090
+v -0.976061 -0.098017 0.194151
+v -0.961939 -0.195091 0.191342
+v -0.938552 -0.290285 0.186690
+v -0.906127 -0.382684 0.180240
+v -0.864974 -0.471397 0.172054
+v -0.815492 -0.555571 0.162211
+v -0.758156 -0.634394 0.150807
+v -0.693519 -0.707107 0.137950
+v -0.622203 -0.773011 0.123764
+v -0.544894 -0.831470 0.108386
+v -0.462338 -0.881922 0.091965
+v -0.375329 -0.923880 0.074658
+v -0.284706 -0.956941 0.056632
+v -0.191341 -0.980785 0.038060
+v -0.096133 -0.995185 0.019122
+vt 0.048386 0.386583
+vt 0.025234 0.393773
+vt 0.027128 0.424811
+vt 0.051722 0.417180
+vt 0.448527 0.905466
+vt 0.466638 0.912069
+vt 0.484410 0.882871
+vt 0.476781 0.880291
+vt 0.086675 0.722835
+vt 0.047714 0.735006
+vt 0.051220 0.765862
+vt 0.092315 0.752973
+vt 0.054891 0.447811
+vt 0.028936 0.455858
+vt 0.030694 0.486912
+vt 0.057960 0.478461
+vt 0.099157 0.782869
+vt 0.055570 0.796623
+vt 0.061220 0.827236
+vt 0.107782 0.812401
+vt 0.008192 0.175780
+vt 0.002639 0.177560
+vt 0.008043 0.208201
+vt 0.017784 0.205113
+vt 0.060989 0.509118
+vt 0.032439 0.517967
+vt 0.034202 0.549019
+vt 0.064035 0.539773
+vt 0.119162 0.841363
+vt 0.069012 0.857605
+vt 0.080647 0.887528
+vt 0.135028 0.869370
+vt 0.025262 0.234880
+vt 0.012236 0.238980
+vt 0.015638 0.269848
+vt 0.031336 0.264931
+vt 0.067156 0.570413
+vt 0.036021 0.580066
+vt 0.037933 0.611102
+vt 0.070415 0.601025
+vt 0.158630 0.895647
+vt 0.100093 0.916525
+vt 0.138246 0.943159
+vt 0.196016 0.918498
+vt 0.036443 0.295175
+vt 0.018502 0.300777
+vt 0.020989 0.331748
+vt 0.040867 0.325557
+vt 0.255549 0.934245
+vt 0.224868 0.962070
+vt 0.356456 0.960107
+vt 0.333915 0.937286
+vt 0.073887 0.631595
+vt 0.039986 0.642122
+vt 0.042240 0.673119
+vt 0.077666 0.662105
+vt 0.044802 0.356035
+vt 0.023207 0.362750
+vt 0.403086 0.926035
+vt 0.432743 0.939261
+vt 0.081872 0.692529
+vt 0.044778 0.704085
+vt 0.001511 0.365736
+vt 0.001965 0.396975
+vt 0.479740 0.946215
+vt 0.488610 0.915189
+vt 0.006404 0.709363
+vt 0.007085 0.740596
+vt 0.002390 0.428214
+vt 0.002796 0.459454
+vt 0.007906 0.771825
+vt 0.008937 0.803049
+vt 0.003192 0.490694
+vt 0.003585 0.521934
+vt 0.010297 0.834265
+vt 0.012221 0.865467
+vt 1.008043 0.208201
+vt 0.998129 0.209571
+vt 0.999064 0.240798
+vt 1.012236 0.238980
+vt 0.003984 0.553174
+vt 0.004397 0.584414
+vt 0.015221 0.896641
+vt 0.020690 0.927753
+vt 1.015638 0.269848
+vt 0.999822 0.272029
+vt 1.000460 0.303263
+vt 1.018502 0.300777
+vt 0.004832 0.615653
+vt 0.005301 0.646891
+vt 0.034176 0.958662
+vt 0.116368 0.987720
+vt 0.001015 0.334499
+vt 0.447683 0.976645
+vt 0.005818 0.678128
+vt 0.492795 0.884044
+vt 1.002639 0.177560
+vt 0.996922 0.178352
+vt 0.000460 0.303263
+vt 1.001015 0.334499
+vt 0.981020 0.333755
+vt 0.979792 0.364929
+vt 1.001511 0.365736
+vt 0.595878 0.971215
+vt 0.532576 0.944247
+vt 1.005818 0.678128
+vt 0.969157 0.676767
+vt 0.967719 0.707927
+vt 1.006404 0.709363
+vt 1.001965 0.396975
+vt 0.978668 0.396109
+vt 0.977617 0.427293
+vt 1.002390 0.428214
+vt 0.511577 0.914333
+vt 0.501357 0.883725
+vt 1.007085 0.740596
+vt 0.966048 0.739073
+vt 0.964039 0.770198
+vt 1.007906 0.771825
+vt 1.002796 0.459454
+vt 0.976612 0.458481
+vt 0.975633 0.489670
+vt 1.003192 0.490694
+vt 1.008937 0.803049
+vt 0.961528 0.801291
+vt 0.958226 0.832335
+vt 1.010297 0.834265
+vt 0.991167 0.178137
+vt 0.988176 0.209201
+vt 1.003585 0.521934
+vt 0.974660 0.520859
+vt 0.973675 0.552048
+vt 1.003984 0.553174
+vt 1.012221 0.865467
+vt 0.953591 0.863296
+vt 0.946455 0.894099
+vt 1.015221 0.896641
+vt 0.985859 0.240306
+vt 0.983979 0.271439
+vt 1.004397 0.584414
+vt 0.972657 0.583235
+vt 0.971584 0.614418
+vt 1.004832 0.615653
+vt 1.020690 0.927753
+vt 0.933791 0.924551
+vt 0.904978 0.953949
+vt 1.034176 0.958662
+vt 0.982396 0.302591
+vt 1.116368 0.987720
+vt 0.802012 0.977654
+vt 1.005301 0.646891
+vt 0.970429 0.645596
+vt 0.964388 0.298773
+vt 0.961079 0.329532
+vt 0.750357 0.950264
+vt 0.647808 0.950687
+vt 0.936013 0.638321
+vt 0.933077 0.669136
+vt 0.958131 0.360345
+vt 0.955439 0.391196
+vt 0.572544 0.934207
+vt 0.532175 0.909643
+vt 0.929787 0.699898
+vt 0.925998 0.730586
+vt 0.952928 0.422075
+vt 0.950535 0.452971
+vt 0.921503 0.761167
+vt 0.915973 0.791592
+vt 0.948212 0.483877
+vt 0.945911 0.514786
+vt 0.908873 0.821779
+vt 0.899253 0.851580
+vt 0.978319 0.207096
+vt 0.972735 0.237513
+vt 0.943589 0.545693
+vt 0.941200 0.576589
+vt 0.885287 0.880701
+vt 0.863100 0.908490
+vt 0.968202 0.268089
+vt 0.938695 0.607468
+vt 0.823807 0.933258
+vt 0.509485 0.881938
+vt 0.985504 0.176922
+vt 0.952583 0.262030
+vt 0.946512 0.291873
+vt 0.906587 0.595195
+vt 0.902582 0.625524
+vt 0.777305 0.907037
+vt 0.725530 0.922454
+vt 0.941260 0.321910
+vt 0.936596 0.352086
+vt 0.659037 0.927175
+vt 0.595241 0.919299
+vt 0.898247 0.655777
+vt 0.893448 0.685920
+vt 0.932358 0.382361
+vt 0.928422 0.412706
+vt 0.548166 0.901813
+vt 0.516647 0.878810
+vt 0.888008 0.715913
+vt 0.881675 0.745694
+vt 0.924693 0.443100
+vt 0.921090 0.473523
+vt 0.874077 0.775173
+vt 0.864639 0.804207
+vt 0.980061 0.174734
+vt 0.968694 0.203293
+vt 0.917545 0.503960
+vt 0.913991 0.534395
+vt 0.852434 0.832558
+vt 0.835902 0.859805
+vt 0.959806 0.232461
+vt 0.910362 0.564812
+vt 0.812344 0.885155
+vt 0.947194 0.225227
+vt 0.937209 0.253354
+vt 0.880347 0.548455
+vt 0.875513 0.578234
+vt 0.774598 0.858570
+vt 0.745300 0.879338
+vt 0.928832 0.282007
+vt 0.921611 0.311033
+vt 0.706220 0.895079
+vt 0.657607 0.903302
+vt 0.870446 0.607941
+vt 0.865033 0.637539
+vt 0.915233 0.340327
+vt 0.909472 0.369816
+vt 0.605515 0.902091
+vt 0.558962 0.891763
+vt 0.859136 0.666985
+vt 0.852572 0.696220
+vt 0.904157 0.399445
+vt 0.899158 0.429173
+vt 0.845097 0.725165
+vt 0.836368 0.753704
+vt 0.894366 0.458966
+vt 0.889689 0.488794
+vt 0.825891 0.781668
+vt 0.812932 0.808795
+vt 0.959449 0.197859
+vt 0.885044 0.518632
+vt 0.796385 0.834663
+vt 0.522459 0.874552
+vt 0.974972 0.171626
+vt 0.950742 0.190891
+vt 0.935024 0.215919
+vt 0.856782 0.499022
+vt 0.851201 0.528217
+vt 0.763610 0.807482
+vt 0.744276 0.830842
+vt 0.922167 0.242191
+vt 0.911394 0.269332
+vt 0.845529 0.557376
+vt 0.839664 0.586461
+vt 0.719784 0.851588
+vt 0.688803 0.868469
+vt 0.902153 0.297095
+vt 0.894043 0.325308
+vt 0.650900 0.879836
+vt 0.608064 0.884052
+vt 0.833492 0.615429
+vt 0.826879 0.644227
+vt 0.886774 0.353851
+vt 0.880126 0.382636
+vt 0.565047 0.880357
+vt 0.526716 0.869422
+vt 0.819658 0.672789
+vt 0.811613 0.701028
+vt 0.873929 0.411594
+vt 0.868047 0.440673
+vt 0.802458 0.728825
+vt 0.791803 0.756015
+vt 0.970378 0.167675
+vt 0.862365 0.469829
+vt 0.779106 0.782355
+vt 0.966426 0.162982
+vt 0.942759 0.182514
+vt 0.835477 0.447684
+vt 0.829105 0.476260
+vt 0.749262 0.754713
+vt 0.735147 0.779653
+vt 0.923444 0.204677
+vt 0.907539 0.228698
+vt 0.822818 0.504873
+vt 0.816514 0.533478
+vt 0.718181 0.803112
+vt 0.697492 0.824480
+vt 0.894226 0.254040
+vt 0.882867 0.280332
+vt 0.672136 0.842888
+vt 0.641452 0.857178
+vt 0.810089 0.562030
+vt 0.803432 0.590481
+vt 0.872978 0.307318
+vt 0.864196 0.334814
+vt 0.605795 0.866019
+vt 0.567268 0.868303
+vt 0.796418 0.618773
+vt 0.788899 0.646840
+vt 0.856248 0.362688
+vt 0.848919 0.390841
+vt 0.780693 0.674598
+vt 0.771569 0.701938
+vt 0.842042 0.419194
+vt 0.761225 0.728711
+vt 0.529369 0.863700
+vt 0.816157 0.395125
+vt 0.808822 0.423029
+vt 0.733104 0.700875
+vt 0.722067 0.726926
+vt 0.935719 0.172890
+vt 0.912628 0.191668
+vt 0.801799 0.451083
+vt 0.794966 0.479228
+vt 0.709376 0.752105
+vt 0.694528 0.776099
+vt 0.893414 0.213060
+vt 0.877330 0.236347
+vt 0.788211 0.507411
+vt 0.781429 0.535580
+vt 0.676891 0.798465
+vt 0.655729 0.818587
+vt 0.863688 0.261010
+vt 0.851921 0.286680
+vt 0.630338 0.835623
+vt 0.600383 0.848519
+vt 0.774511 0.563685
+vt 0.767340 0.591667
+vt 0.841590 0.313094
+vt 0.832352 0.340062
+vt 0.566457 0.856148
+vt 0.530481 0.857657
+vt 0.759786 0.619465
+vt 0.751695 0.647000
+vt 0.823944 0.367441
+vt 0.742880 0.674178
+vt 0.963275 0.157675
+vt 0.798714 0.341964
+vt 0.790091 0.369104
+vt 0.715662 0.646481
+vt 0.706593 0.673391
+vt 0.961095 0.151908
+vt 0.929896 0.162212
+vt 0.782092 0.396562
+vt 0.774547 0.424249
+vt 0.696552 0.699794
+vt 0.685241 0.725518
+vt 0.902802 0.177085
+vt 0.879896 0.195479
+vt 0.767315 0.452093
+vt 0.760273 0.480033
+vt 0.672277 0.750331
+vt 0.657173 0.773912
+vt 0.860681 0.216489
+vt 0.844487 0.239416
+vt 0.639332 0.795815
+vt 0.618082 0.815427
+vt 0.753309 0.508010
+vt 0.746314 0.535973
+vt 0.830674 0.263748
+vt 0.818709 0.289116
+vt 0.592813 0.831927
+vt 0.563300 0.844314
+vt 0.739177 0.563865
+vt 0.731782 0.591627
+vt 0.808166 0.315253
+vt 0.723996 0.619193
+vt 0.530183 0.851546
+vt 0.783291 0.288800
+vt 0.772822 0.315021
+vt 0.697047 0.592015
+vt 0.689317 0.619641
+vt 0.763440 0.341809
+vt 0.754885 0.369020
+vt 0.681040 0.646993
+vt 0.672028 0.673970
+vt 0.925640 0.150719
+vt 0.894282 0.161153
+vt 0.746950 0.396543
+vt 0.739467 0.424292
+vt 0.662044 0.700446
+vt 0.650787 0.726249
+vt 0.867123 0.176171
+vt 0.844220 0.194710
+vt 0.732295 0.452196
+vt 0.725311 0.480192
+vt 0.637870 0.751148
+vt 0.622801 0.774822
+vt 0.825051 0.215853
+vt 0.808921 0.238900
+vt 0.604972 0.796825
+vt 0.583692 0.816539
+vt 0.718404 0.508227
+vt 0.711466 0.536245
+vt 0.795182 0.263338
+vt 0.558329 0.833135
+vt 0.528639 0.845595
+vt 0.704386 0.564194
+vt 0.960059 0.145864
+vt 0.770454 0.236269
+vt 0.757161 0.261303
+vt 0.551952 0.822878
+vt 0.526026 0.840003
+vt 0.677155 0.537971
+vt 0.670392 0.566230
+vt 0.745716 0.287291
+vt 0.735678 0.313982
+vt 0.663371 0.594370
+vt 0.655961 0.622326
+vt 0.960342 0.139752
+vt 0.923407 0.138703
+vt 0.726705 0.341193
+vt 0.718539 0.368791
+vt 0.648007 0.650026
+vt 0.639317 0.677374
+vt 0.887539 0.144135
+vt 0.855307 0.155367
+vt 0.710973 0.396675
+vt 0.703843 0.424763
+vt 0.629652 0.704248
+vt 0.618699 0.730483
+vt 0.827842 0.171258
+vt 0.805029 0.190637
+vt 0.606053 0.755855
+vt 0.591182 0.780044
+vt 0.697011 0.452990
+vt 0.690358 0.481301
+vt 0.786170 0.212545
+vt 0.573413 0.802599
+vt 0.683774 0.509644
+vt 0.761639 0.185155
+vt 0.743695 0.208508
+vt 0.562248 0.790318
+vt 0.544481 0.813763
+vt 0.655731 0.484878
+vt 0.649724 0.513728
+vt 0.728977 0.233468
+vt 0.716667 0.259562
+vt 0.643669 0.542558
+vt 0.637465 0.571326
+vt 0.706150 0.286468
+vt 0.696970 0.313966
+vt 0.631000 0.599984
+vt 0.624145 0.628479
+vt 0.923791 0.126533
+vt 0.883311 0.126356
+vt 0.688793 0.341898
+vt 0.681363 0.370149
+vt 0.616747 0.656744
+vt 0.608610 0.684693
+vt 0.844816 0.133311
+vt 0.811364 0.146382
+vt 0.674486 0.398635
+vt 0.668005 0.427287
+vt 0.599486 0.712215
+vt 0.589042 0.739154
+vt 0.783837 0.164110
+vt 0.576832 0.765294
+vt 0.661791 0.456050
+vt 0.522515 0.834940
+vt 0.962096 0.133813
+vt 0.760428 0.136665
+vt 0.734028 0.157321
+vt 0.562017 0.752770
+vt 0.550398 0.779880
+vt 0.632389 0.433338
+vt 0.627046 0.462757
+vt 0.713639 0.180821
+vt 0.697627 0.206188
+vt 0.536166 0.805967
+vt 0.518271 0.830548
+vt 0.621819 0.492217
+vt 0.616615 0.521685
+vt 0.684737 0.232805
+vt 0.674080 0.260281
+vt 0.611345 0.551130
+vt 0.605914 0.580518
+vt 0.965428 0.128309
+vt 0.927547 0.114679
+vt 0.665037 0.288362
+vt 0.657175 0.316877
+vt 0.600218 0.609812
+vt 0.594131 0.638967
+vt 0.882828 0.108243
+vt 0.836350 0.110271
+vt 0.650183 0.345708
+vt 0.643831 0.374768
+vt 0.587502 0.667928
+vt 0.580132 0.696621
+vt 0.794461 0.120333
+vt 0.571758 0.724949
+vt 0.637946 0.403995
+vt 0.776448 0.093364
+vt 0.732723 0.108828
+vt 0.554213 0.713446
+vt 0.546824 0.742646
+vt 0.606595 0.384057
+vt 0.601947 0.414034
+vt 0.701058 0.129901
+vt 0.678348 0.154298
+vt 0.538024 0.771438
+vt 0.527209 0.799637
+vt 0.597536 0.444077
+vt 0.593270 0.474160
+vt 0.661610 0.180674
+vt 0.648805 0.208274
+vt 0.589070 0.504263
+vt 0.584859 0.534361
+vt 0.638638 0.236665
+vt 0.630288 0.265588
+vt 0.580561 0.564436
+vt 0.576092 0.594463
+vt 0.935538 0.103753
+vt 0.888209 0.090429
+vt 0.623219 0.294879
+vt 0.617071 0.324434
+vt 0.571358 0.624416
+vt 0.566241 0.654262
+vt 0.831424 0.086572
+vt 0.611590 0.354177
+vt 0.560593 0.683957
+vt 0.513448 0.826944
+vt 0.970361 0.123516
+vt 0.833915 0.062714
+vt 0.755548 0.065755
+vt 0.577666 0.337895
+vt 0.573887 0.368405
+vt 0.540867 0.674443
+vt 0.536443 0.704824
+vt 0.696016 0.081502
+vt 0.658630 0.104353
+vt 0.531336 0.735069
+vt 0.525262 0.765119
+vt 0.570415 0.398975
+vt 0.567156 0.429587
+vt 0.635028 0.130630
+vt 0.619162 0.158637
+vt 0.517784 0.794886
+vt 0.508192 0.824219
+vt 0.564035 0.460227
+vt 0.560989 0.490881
+vt 0.607782 0.187599
+vt 0.599157 0.217131
+vt 0.557960 0.521539
+vt 0.554891 0.552189
+vt 0.976781 0.119709
+vt 0.948527 0.094534
+vt 0.592315 0.247027
+vt 0.586675 0.277165
+vt 0.551722 0.582819
+vt 0.548386 0.613416
+vt 0.903085 0.073965
+vt 0.581872 0.307471
+vt 0.544802 0.643964
+vt 0.984410 0.117129
+vt 0.966637 0.087931
+vt 0.551220 0.234138
+vt 0.547714 0.264994
+vt 0.523207 0.637250
+vt 0.520989 0.668251
+vt 0.932742 0.060739
+vt 0.856455 0.039893
+vt 0.544778 0.295915
+vt 0.542240 0.326881
+vt 0.518502 0.699223
+vt 0.515638 0.730152
+vt 0.539986 0.357878
+vt 0.537933 0.388898
+vt 0.724867 0.037930
+vt 0.638246 0.056841
+vt 0.512236 0.761020
+vt 0.508043 0.791799
+vt 0.536021 0.419934
+vt 0.534202 0.450981
+vt 0.600093 0.083475
+vt 0.580647 0.112472
+vt 0.532439 0.482033
+vt 0.530694 0.513088
+vt 0.569012 0.142396
+vt 0.561220 0.172764
+vt 0.528936 0.544141
+vt 0.527129 0.575189
+vt 0.555570 0.203377
+vt 0.525234 0.606227
+vt 0.502639 0.822440
+vt 0.508937 0.196951
+vt 0.507907 0.228175
+vt 0.502796 0.540546
+vt 0.502390 0.571786
+vt 0.988610 0.084811
+vt 0.979740 0.053785
+vt 0.507086 0.259404
+vt 0.506404 0.290637
+vt 0.501965 0.603025
+vt 0.501511 0.634263
+vt 0.947681 0.023355
+vt 0.616368 0.012280
+vt 0.505819 0.321872
+vt 0.505301 0.353109
+vt 0.501016 0.665501
+vt 0.500461 0.696737
+vt 0.534176 0.041338
+vt 0.520690 0.072247
+vt 0.499822 0.727971
+vt 0.499064 0.759202
+vt 0.504832 0.384347
+vt 0.504397 0.415586
+vt 0.515221 0.103359
+vt 0.512221 0.134533
+vt 0.498129 0.790428
+vt 0.496922 0.821648
+vt 0.503985 0.446826
+vt 0.503586 0.478066
+vt 0.510297 0.165735
+vt 0.503192 0.509306
+vt 0.992795 0.115956
+vt 0.458226 0.167665
+vt 0.461528 0.198709
+vt 0.475633 0.510330
+vt 0.476612 0.541519
+vt 1.001356 0.116274
+vt 1.011577 0.085667
+vt 0.464040 0.229802
+vt 0.466048 0.260927
+vt 0.477617 0.572706
+vt 0.478668 0.603891
+vt 1.032575 0.055753
+vt 1.095877 0.028785
+vt 0.467719 0.292073
+vt 0.469157 0.323233
+vt 0.479792 0.635071
+vt 0.481020 0.666245
+vt 0.302013 0.022346
+vt 0.404979 0.046051
+vt 0.482396 0.697409
+vt 0.483979 0.728560
+vt 0.470429 0.354404
+vt 0.471585 0.385582
+vt 0.433792 0.075450
+vt 0.446455 0.105901
+vt 0.485859 0.759693
+vt 0.488176 0.790799
+vt 0.472657 0.416765
+vt 0.473675 0.447952
+vt 0.453591 0.136705
+vt 0.474661 0.479141
+vt 1.302013 0.022346
+vt 0.491168 0.821862
+vt 0.399253 0.148420
+vt 0.408873 0.178221
+vt 0.445911 0.485214
+vt 0.448212 0.516123
+vt 0.415973 0.208408
+vt 0.421503 0.238833
+vt 0.450536 0.547029
+vt 0.452928 0.577925
+vt 0.011577 0.085667
+vt 0.032175 0.090357
+vt 0.072544 0.065793
+vt 0.032575 0.055753
+vt 0.425999 0.269414
+vt 0.429787 0.300102
+vt 0.455439 0.608803
+vt 0.458131 0.639655
+vt 0.095877 0.028785
+vt 0.147808 0.049312
+vt 0.250357 0.049736
+vt 0.433078 0.330864
+vt 0.436013 0.361679
+vt 0.461079 0.670468
+vt 0.464388 0.701227
+vt 0.323807 0.066742
+vt 0.363100 0.091510
+vt 0.468202 0.731911
+vt 0.472735 0.762486
+vt 0.438695 0.392531
+vt 0.441201 0.423411
+vt 0.385287 0.119299
+vt 0.478319 0.792903
+vt 0.485504 0.823077
+vt 0.443589 0.454307
+vt 0.001356 0.116274
+vt 0.009485 0.118062
+vt 0.335902 0.140195
+vt 0.352435 0.167442
+vt 0.468695 0.796706
+vt 0.480062 0.825265
+vt 0.413991 0.465605
+vt 0.417545 0.496040
+vt 0.364639 0.195793
+vt 0.374077 0.224827
+vt 0.421090 0.526476
+vt 0.424693 0.556900
+vt 0.016646 0.121190
+vt 0.048166 0.098187
+vt 0.381676 0.254305
+vt 0.388009 0.284087
+vt 0.428422 0.587293
+vt 0.432358 0.617639
+vt 0.095241 0.080701
+vt 0.159037 0.072825
+vt 0.393448 0.314080
+vt 0.398247 0.344223
+vt 0.436597 0.647914
+vt 0.441260 0.678089
+vt 0.225530 0.077545
+vt 0.277305 0.092963
+vt 0.446512 0.708126
+vt 0.452583 0.737970
+vt 0.402583 0.374475
+vt 0.406587 0.404805
+vt 0.312344 0.114845
+vt 0.459807 0.767538
+vt 0.410362 0.435188
+vt 0.274598 0.141429
+vt 0.296386 0.165337
+vt 0.447194 0.774773
+vt 0.459449 0.802140
+vt 0.380347 0.451545
+vt 0.385044 0.481367
+vt 0.312933 0.191205
+vt 0.325892 0.218332
+vt 0.389690 0.511205
+vt 0.394366 0.541034
+vt 0.336369 0.246296
+vt 0.345098 0.274835
+vt 0.399158 0.570827
+vt 0.404157 0.600554
+vt 0.058962 0.108237
+vt 0.105515 0.097909
+vt 0.352573 0.303779
+vt 0.359136 0.333015
+vt 0.409472 0.630184
+vt 0.415233 0.659672
+vt 0.157607 0.096698
+vt 0.206220 0.104921
+vt 0.365034 0.362461
+vt 0.370446 0.392059
+vt 0.421611 0.688966
+vt 0.428832 0.717992
+vt 0.245300 0.120661
+vt 0.437209 0.746645
+vt 0.375513 0.421766
+vt 0.474973 0.828373
+vt 0.022458 0.125448
+vt 0.219785 0.148411
+vt 0.244276 0.169157
+vt 0.422167 0.757809
+vt 0.435025 0.784080
+vt 0.345529 0.442624
+vt 0.351201 0.471783
+vt 0.263610 0.192518
+vt 0.279107 0.217645
+vt 0.450742 0.809109
+vt 0.470378 0.832324
+vt 0.356782 0.500978
+vt 0.362365 0.530171
+vt 0.291803 0.243984
+vt 0.302458 0.271174
+vt 0.368048 0.559326
+vt 0.373930 0.588406
+vt 0.026715 0.130577
+vt 0.065046 0.119642
+vt 0.311613 0.298972
+vt 0.319658 0.327211
+vt 0.380126 0.617364
+vt 0.386774 0.646148
+vt 0.108064 0.115948
+vt 0.150900 0.120164
+vt 0.326879 0.355772
+vt 0.333492 0.384570
+vt 0.394043 0.674691
+vt 0.402153 0.702905
+vt 0.188803 0.131531
+vt 0.411394 0.730667
+vt 0.339664 0.413538
+vt 0.172136 0.157112
+vt 0.197492 0.175520
+vt 0.394226 0.745960
+vt 0.407539 0.771302
+vt 0.310089 0.437969
+vt 0.316514 0.466522
+vt 0.218181 0.196888
+vt 0.235147 0.220346
+vt 0.423444 0.795322
+vt 0.442759 0.817485
+vt 0.322818 0.495127
+vt 0.329105 0.523740
+vt 0.249262 0.245287
+vt 0.261226 0.271289
+vt 0.335478 0.552315
+vt 0.342043 0.580806
+vt 0.271570 0.298062
+vt 0.280694 0.325401
+vt 0.348920 0.609159
+vt 0.356248 0.637311
+vt 0.067268 0.131696
+vt 0.105795 0.133981
+vt 0.288899 0.353160
+vt 0.296418 0.381227
+vt 0.364197 0.665186
+vt 0.372978 0.692682
+vt 0.141452 0.142821
+vt 0.303432 0.409519
+vt 0.382867 0.719668
+vt 0.466426 0.837017
+vt 0.029369 0.136300
+vt 0.130338 0.164376
+vt 0.155730 0.181412
+vt 0.274511 0.436315
+vt 0.281429 0.464419
+vt 0.363688 0.738990
+vt 0.377331 0.763653
+vt 0.176891 0.201534
+vt 0.194529 0.223901
+vt 0.393414 0.786940
+vt 0.412628 0.808332
+vt 0.288212 0.492589
+vt 0.294966 0.520772
+vt 0.209376 0.247895
+vt 0.222067 0.273074
+vt 0.435719 0.827110
+vt 0.463275 0.842324
+vt 0.301799 0.548917
+vt 0.308822 0.576971
+vt 0.233105 0.299124
+vt 0.242880 0.325821
+vt 0.316157 0.604875
+vt 0.323944 0.632559
+vt 0.030481 0.142343
+vt 0.066457 0.143852
+vt 0.251696 0.352999
+vt 0.259786 0.380535
+vt 0.332352 0.659938
+vt 0.341590 0.686906
+vt 0.100383 0.151481
+vt 0.267340 0.408332
+vt 0.351921 0.713320
+vt 0.092813 0.168072
+vt 0.118082 0.184573
+vt 0.239178 0.436135
+vt 0.246314 0.464027
+vt 0.330675 0.736251
+vt 0.344487 0.760583
+vt 0.139332 0.204184
+vt 0.157173 0.226087
+vt 0.360682 0.783511
+vt 0.379896 0.804521
+vt 0.253309 0.491989
+vt 0.260273 0.519967
+vt 0.172277 0.249668
+vt 0.185241 0.274481
+vt 0.402802 0.822915
+vt 0.429896 0.837788
+vt 0.267315 0.547906
+vt 0.274547 0.575751
+vt 0.196552 0.300206
+vt 0.206593 0.326609
+vt 0.282092 0.603438
+vt 0.290092 0.630896
+vt 0.215662 0.353519
+vt 0.223996 0.380807
+vt 0.298714 0.658036
+vt 0.308167 0.684747
+vt 0.063300 0.155685
+vt 0.231783 0.408372
+vt 0.318709 0.710884
+vt 0.461095 0.848091
+vt 0.030183 0.148454
+vt 0.058329 0.166864
+vt 0.083692 0.183461
+vt 0.204386 0.435805
+vt 0.211466 0.463754
+vt 0.295182 0.736662
+vt 0.308922 0.761100
+vt 0.104972 0.203174
+vt 0.122801 0.225177
+vt 0.218404 0.491773
+vt 0.225311 0.519808
+vt 0.325051 0.784147
+vt 0.344221 0.805290
+vt 0.137870 0.248851
+vt 0.150787 0.273750
+vt 0.367123 0.823828
+vt 0.394283 0.838847
+vt 0.232295 0.547804
+vt 0.239467 0.575708
+vt 0.162044 0.299553
+vt 0.172028 0.326029
+vt 0.425640 0.849281
+vt 0.460060 0.854136
+vt 0.246950 0.603457
+vt 0.254885 0.630980
+vt 0.181041 0.353007
+vt 0.189317 0.380358
+vt 0.263440 0.658191
+vt 0.272822 0.684979
+vt 0.028639 0.154404
+vt 0.197047 0.407985
+vt 0.283292 0.711200
+vt 0.026025 0.159996
+vt 0.051952 0.177121
+vt 0.170392 0.433769
+vt 0.177155 0.462029
+vt 0.257161 0.738697
+vt 0.270454 0.763731
+vt 0.073413 0.197401
+vt 0.091182 0.219955
+vt 0.183774 0.490355
+vt 0.190358 0.518699
+vt 0.286171 0.787455
+vt 0.305029 0.809363
+vt 0.106052 0.244144
+vt 0.118699 0.269516
+vt 0.327842 0.828742
+vt 0.355308 0.844632
+vt 0.197011 0.547009
+vt 0.203843 0.575237
+vt 0.129652 0.295752
+vt 0.139317 0.322626
+vt 0.387539 0.855864
+vt 0.423407 0.861296
+vt 0.210973 0.603325
+vt 0.218539 0.631209
+vt 0.148007 0.349974
+vt 0.155961 0.377673
+vt 0.226706 0.658807
+vt 0.235678 0.686018
+vt 0.163371 0.405630
+vt 0.245717 0.712709
+vt 0.460342 0.860247
+vt 0.137465 0.428674
+vt 0.143669 0.457442
+vt 0.216668 0.740438
+vt 0.228978 0.766532
+vt 0.044481 0.186237
+vt 0.062248 0.209681
+vt 0.149724 0.486272
+vt 0.155731 0.515122
+vt 0.243695 0.791492
+vt 0.261640 0.814845
+vt 0.076832 0.234705
+vt 0.089042 0.260845
+vt 0.161791 0.543950
+vt 0.168005 0.572713
+vt 0.283838 0.835890
+vt 0.311365 0.853618
+vt 0.099486 0.287784
+vt 0.108610 0.315306
+vt 0.344817 0.866689
+vt 0.383311 0.873644
+vt 0.174486 0.601365
+vt 0.181363 0.629851
+vt 0.116747 0.343256
+vt 0.124145 0.371520
+vt 0.423791 0.873467
+vt 0.462096 0.866187
+vt 0.188793 0.658102
+vt 0.196970 0.686034
+vt 0.131000 0.400015
+vt 0.206150 0.713532
+vt 0.022514 0.165060
+vt 0.105914 0.419482
+vt 0.111345 0.448870
+vt 0.174080 0.739719
+vt 0.184737 0.767195
+vt 0.018270 0.169451
+vt 0.036166 0.194032
+vt 0.116615 0.478315
+vt 0.121819 0.507783
+vt 0.197627 0.793813
+vt 0.213639 0.819179
+vt 0.050398 0.220120
+vt 0.062017 0.247229
+vt 0.127046 0.537243
+vt 0.132389 0.566662
+vt 0.234028 0.842679
+vt 0.260429 0.863335
+vt 0.071758 0.275050
+vt 0.080132 0.303378
+vt 0.294461 0.879667
+vt 0.336350 0.889729
+vt 0.137946 0.596005
+vt 0.143831 0.625232
+vt 0.087502 0.332072
+vt 0.094131 0.361033
+vt 0.382829 0.891756
+vt 0.427547 0.885321
+vt 0.150183 0.654292
+vt 0.157175 0.683123
+vt 0.100218 0.390188
+vt 0.165037 0.711638
+vt 0.465429 0.871691
+vt 0.076092 0.405536
+vt 0.080561 0.435563
+vt 0.130288 0.734413
+vt 0.138638 0.763335
+vt 0.084859 0.465638
+vt 0.089070 0.495737
+vt 0.148805 0.791726
+vt 0.161611 0.819326
+vt 0.027209 0.200362
+vt 0.038024 0.228561
+vt 0.093270 0.525839
+vt 0.097536 0.555923
+vt 0.178349 0.845702
+vt 0.201058 0.870099
+vt 0.046824 0.257353
+vt 0.054213 0.286553
+vt 0.101947 0.585966
+vt 0.106595 0.615943
+vt 0.232723 0.891172
+vt 0.276449 0.906636
+vt 0.060593 0.316042
+vt 0.066241 0.345738
+vt 0.331424 0.913428
+vt 0.388210 0.909571
+vt 0.111590 0.645823
+vt 0.117071 0.675566
+vt 0.071358 0.375583
+vt 0.435539 0.896247
+vt 0.470361 0.876483
+vt 0.123219 0.705121
+vt 0.013448 0.173055
+vt 0.495265 0.852856
+vt 0.995265 0.147143
+vt 1.008192 0.175780
+vt 1.009485 0.118062
+vt 1.016646 0.121190
+vt 1.022458 0.125448
+vt 1.026716 0.130577
+vt 1.029369 0.136300
+vt 1.030481 0.142343
+vt 1.030183 0.148454
+vt 1.028639 0.154404
+vt 1.026025 0.159996
+vt 1.022514 0.165060
+vt 1.018270 0.169451
+vt 1.013448 0.173055
+vn 0.708609 0.705557 0.000000
+vn 0.694998 0.705557 0.138218
+vn 0.759331 0.632893 0.151036
+vn 0.774224 0.632893 0.000000
+vn 0.198035 -0.980193 0.000000
+vn 0.194220 -0.980193 0.038606
+vn 0.099094 -0.994873 0.019684
+vn 0.101047 -0.994873 0.000000
+vn 0.957183 -0.289438 0.000000
+vn 0.938780 -0.289438 0.186712
+vn 0.906552 -0.381603 0.180303
+vn 0.924314 -0.381603 0.000000
+vn 0.832392 0.554155 0.000000
+vn 0.816401 0.554155 0.162389
+vn 0.865627 0.470107 0.172185
+vn 0.882595 0.470107 0.000000
+vn 0.882595 -0.470107 0.000000
+vn 0.865627 -0.470107 0.172185
+vn 0.816401 -0.554155 0.162389
+vn 0.832392 -0.554155 0.000000
+vn 0.101047 0.994873 0.000000
+vn 0.099094 0.994873 0.019684
+vn 0.194220 0.980193 0.038606
+vn 0.198035 0.980193 0.000000
+vn 0.924314 0.381603 0.000000
+vn 0.906552 0.381603 0.180303
+vn 0.938780 0.289438 0.186712
+vn 0.957183 0.289438 0.000000
+vn 0.774224 -0.632893 0.000000
+vn 0.759331 -0.632893 0.151036
+vn 0.694998 -0.705557 0.138218
+vn 0.708609 -0.705557 0.000000
+vn 0.293069 0.956084 0.000000
+vn 0.287454 0.956084 0.057161
+vn 0.377880 0.922788 0.075167
+vn 0.385266 0.922788 0.000000
+vn 0.980895 0.194494 0.000000
+vn 0.962035 0.194494 0.191351
+vn 0.976074 0.097690 0.194128
+vn 0.995209 0.097690 0.000000
+vn 0.636189 -0.771508 0.000000
+vn 0.623981 -0.771508 0.124119
+vn 0.546953 -0.830042 0.108798
+vn 0.557665 -0.830042 0.000000
+vn 0.473769 0.880642 0.000000
+vn 0.464644 0.880642 0.092410
+vn 0.546953 0.830042 0.108768
+vn 0.557665 0.830042 0.000000
+vn 0.473769 -0.880642 0.000000
+vn 0.464644 -0.880642 0.092410
+vn 0.377880 -0.922788 0.075137
+vn 0.385266 -0.922788 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.980773 0.000000 0.195074
+vn 0.976074 -0.097690 0.194128
+vn 0.995209 -0.097690 0.000000
+vn 0.636189 0.771508 0.000000
+vn 0.623981 0.771508 0.124119
+vn 0.293069 -0.956084 0.000000
+vn 0.287454 -0.956084 0.057161
+vn 0.980895 -0.194494 0.000000
+vn 0.962035 -0.194494 0.191351
+vn 0.587786 0.771508 0.243446
+vn 0.654683 0.705557 0.271157
+vn 0.270760 -0.956084 0.112156
+vn 0.182958 -0.980193 0.075777
+vn 0.906217 -0.194494 0.375347
+vn 0.884304 -0.289438 0.366283
+vn 0.715293 0.632893 0.296274
+vn 0.769036 0.554155 0.318522
+vn 0.853938 -0.381603 0.353710
+vn 0.815394 -0.470107 0.337748
+vn 0.815394 0.470107 0.337748
+vn 0.853938 0.381603 0.353710
+vn 0.769036 -0.554155 0.318522
+vn 0.715293 -0.632893 0.296274
+vn 0.182958 0.980193 0.075777
+vn 0.270760 0.956084 0.112156
+vn 0.884304 0.289438 0.366283
+vn 0.906217 0.194494 0.375347
+vn 0.654683 -0.705557 0.271157
+vn 0.587786 -0.771508 0.243446
+vn 0.355937 0.922788 0.147435
+vn 0.437696 0.880642 0.181280
+vn 0.919431 0.097690 0.380840
+vn 0.923856 0.000000 0.382672
+vn 0.515213 -0.830042 0.213385
+vn 0.437696 -0.880642 0.181280
+vn 0.515213 0.830042 0.213385
+vn 0.355937 -0.922788 0.147435
+vn 0.919431 -0.097690 0.380840
+vn 0.093356 -0.994873 0.038667
+vn 0.093356 0.994873 0.038667
+vn 0.463668 0.830042 0.309824
+vn 0.528977 0.771508 0.353435
+vn 0.320353 -0.922788 0.214057
+vn 0.243690 -0.956084 0.162816
+vn 0.827479 -0.097690 0.552904
+vn 0.815577 -0.194494 0.544939
+vn 0.589190 0.705557 0.393689
+vn 0.643727 0.632893 0.430128
+vn 0.164647 -0.980193 0.110019
+vn 0.084017 -0.994873 0.056124
+vn 0.795862 -0.289438 0.531785
+vn 0.768548 -0.381603 0.513504
+vn 0.692099 0.554155 0.462447
+vn 0.733848 0.470107 0.490341
+vn 0.733848 -0.470107 0.490341
+vn 0.692099 -0.554155 0.462447
+vn 0.084017 0.994873 0.056124
+vn 0.164647 0.980193 0.110019
+vn 0.768548 0.381603 0.513504
+vn 0.795862 0.289438 0.531785
+vn 0.643727 -0.632893 0.430128
+vn 0.589190 -0.705557 0.393689
+vn 0.243690 0.956084 0.162816
+vn 0.320353 0.922788 0.214057
+vn 0.815577 0.194494 0.544939
+vn 0.827479 0.097690 0.552904
+vn 0.528977 -0.771508 0.353435
+vn 0.463668 -0.830042 0.309824
+vn 0.393902 0.880642 0.263192
+vn 0.393902 -0.880642 0.263192
+vn 0.831446 0.000000 0.555559
+vn 0.335002 0.880642 0.335002
+vn 0.394330 0.830042 0.394330
+vn 0.335002 -0.880642 0.335002
+vn 0.272439 -0.922788 0.272439
+vn 0.707083 0.000000 0.707083
+vn 0.703696 -0.097690 0.703696
+vn 0.449873 0.771508 0.449873
+vn 0.501053 0.705557 0.501053
+vn 0.207221 -0.956084 0.207221
+vn 0.140019 -0.980193 0.140019
+vn 0.693594 -0.194494 0.693594
+vn 0.676840 -0.289438 0.676840
+vn 0.547441 0.632893 0.547441
+vn 0.588580 0.554155 0.588580
+vn 0.653584 -0.381603 0.653584
+vn 0.624073 -0.470107 0.624073
+vn 0.624073 0.470107 0.624073
+vn 0.653584 0.381603 0.653584
+vn 0.588580 -0.554155 0.588580
+vn 0.547441 -0.632893 0.547441
+vn 0.140019 0.980193 0.140019
+vn 0.207221 0.956084 0.207221
+vn 0.676840 0.289438 0.676840
+vn 0.693594 0.194494 0.693594
+vn 0.501053 -0.705557 0.501053
+vn 0.449873 -0.771508 0.449873
+vn 0.272439 0.922788 0.272439
+vn 0.703696 0.097690 0.703696
+vn 0.394330 -0.830042 0.394330
+vn 0.071444 -0.994873 0.071444
+vn 0.071444 0.994873 0.071444
+vn 0.214057 0.922788 0.320353
+vn 0.263192 0.880642 0.393902
+vn 0.552904 0.097690 0.827479
+vn 0.555559 0.000000 0.831446
+vn 0.309824 -0.830042 0.463668
+vn 0.263192 -0.880642 0.393902
+vn 0.309824 0.830042 0.463668
+vn 0.353435 0.771508 0.528977
+vn 0.214057 -0.922788 0.320353
+vn 0.162816 -0.956084 0.243690
+vn 0.552904 -0.097690 0.827479
+vn 0.544939 -0.194494 0.815577
+vn 0.393689 0.705557 0.589190
+vn 0.430128 0.632893 0.643727
+vn 0.110019 -0.980193 0.164647
+vn 0.056124 -0.994873 0.084017
+vn 0.531785 -0.289438 0.795862
+vn 0.513504 -0.381603 0.768548
+vn 0.462447 0.554155 0.692099
+vn 0.490341 0.470107 0.733848
+vn 0.490341 -0.470107 0.733848
+vn 0.462447 -0.554155 0.692099
+vn 0.056124 0.994873 0.084017
+vn 0.110019 0.980193 0.164647
+vn 0.513504 0.381603 0.768548
+vn 0.531785 0.289438 0.795862
+vn 0.430128 -0.632893 0.643727
+vn 0.393689 -0.705557 0.589190
+vn 0.162816 0.956084 0.243690
+vn 0.544939 0.194494 0.815577
+vn 0.353435 -0.771508 0.528977
+vn 0.112156 0.956084 0.270760
+vn 0.147435 0.922788 0.355937
+vn 0.375347 0.194494 0.906217
+vn 0.380840 0.097690 0.919431
+vn 0.243446 -0.771508 0.587786
+vn 0.213385 -0.830042 0.515213
+vn 0.181280 0.880642 0.437696
+vn 0.213385 0.830042 0.515213
+vn 0.181280 -0.880642 0.437696
+vn 0.147435 -0.922788 0.355937
+vn 0.382672 0.000000 0.923856
+vn 0.380840 -0.097690 0.919431
+vn 0.243446 0.771508 0.587786
+vn 0.271157 0.705557 0.654683
+vn 0.112156 -0.956084 0.270760
+vn 0.075777 -0.980193 0.182958
+vn 0.375347 -0.194494 0.906217
+vn 0.366283 -0.289438 0.884304
+vn 0.296274 0.632893 0.715293
+vn 0.318522 0.554155 0.769036
+vn 0.353710 -0.381603 0.853938
+vn 0.337748 -0.470107 0.815394
+vn 0.337748 0.470107 0.815394
+vn 0.353710 0.381603 0.853938
+vn 0.318522 -0.554155 0.769036
+vn 0.296274 -0.632893 0.715293
+vn 0.075777 0.980193 0.182958
+vn 0.366283 0.289438 0.884304
+vn 0.271157 -0.705557 0.654683
+vn 0.038667 -0.994873 0.093356
+vn 0.038667 0.994873 0.093356
+vn 0.038606 0.980193 0.194220
+vn 0.057161 0.956084 0.287454
+vn 0.186712 0.289438 0.938780
+vn 0.191351 0.194494 0.962035
+vn 0.138218 -0.705557 0.694998
+vn 0.124119 -0.771508 0.623981
+vn 0.075137 0.922788 0.377880
+vn 0.092410 0.880642 0.464644
+vn 0.194128 0.097690 0.976074
+vn 0.195074 0.000000 0.980773
+vn 0.108768 -0.830042 0.546953
+vn 0.092410 -0.880642 0.464644
+vn 0.108768 0.830042 0.546953
+vn 0.124119 0.771508 0.623981
+vn 0.075167 -0.922788 0.377880
+vn 0.057161 -0.956084 0.287454
+vn 0.194128 -0.097690 0.976074
+vn 0.191351 -0.194494 0.962035
+vn 0.138218 0.705557 0.694998
+vn 0.151036 0.632893 0.759331
+vn 0.038606 -0.980193 0.194220
+vn 0.019684 -0.994873 0.099094
+vn 0.186712 -0.289438 0.938780
+vn 0.180303 -0.381603 0.906552
+vn 0.162389 0.554155 0.816401
+vn 0.172185 0.470107 0.865627
+vn 0.172185 -0.470107 0.865627
+vn 0.162389 -0.554155 0.816401
+vn 0.019684 0.994873 0.099094
+vn 0.180303 0.381603 0.906552
+vn 0.151036 -0.632893 0.759331
+vn 0.000000 0.994873 0.101047
+vn 0.000000 0.980193 0.198035
+vn 0.000000 0.381603 0.924314
+vn 0.000000 0.289438 0.957183
+vn 0.000000 -0.632893 0.774224
+vn 0.000000 -0.705557 0.708609
+vn 0.000000 0.956084 0.293069
+vn 0.000000 0.922788 0.385266
+vn 0.000000 0.194494 0.980895
+vn 0.000000 0.097690 0.995209
+vn 0.000000 -0.771508 0.636189
+vn 0.000000 -0.830042 0.557665
+vn 0.000000 0.880642 0.473769
+vn 0.000000 0.830042 0.557665
+vn 0.000000 -0.880642 0.473769
+vn 0.000000 -0.922788 0.385266
+vn 0.000000 0.000000 0.999969
+vn 0.000000 -0.097690 0.995209
+vn 0.000000 0.771508 0.636189
+vn 0.000000 0.705557 0.708609
+vn 0.000000 -0.956084 0.293069
+vn 0.000000 -0.980193 0.198035
+vn 0.000000 -0.194494 0.980895
+vn 0.000000 -0.289438 0.957183
+vn 0.000000 0.632893 0.774224
+vn 0.000000 0.554155 0.832392
+vn 0.000000 -0.381603 0.924314
+vn 0.000000 -0.470107 0.882595
+vn 0.000000 0.470107 0.882595
+vn 0.000000 -0.554155 0.832392
+vn 0.000000 -0.994873 0.101047
+vn -0.172185 0.470107 0.865627
+vn -0.180303 0.381603 0.906552
+vn -0.162389 -0.554155 0.816401
+vn -0.151036 -0.632893 0.759331
+vn -0.038606 0.980193 0.194220
+vn -0.057161 0.956084 0.287454
+vn -0.186712 0.289438 0.938780
+vn -0.191351 0.194494 0.962035
+vn -0.138218 -0.705557 0.694998
+vn -0.124119 -0.771508 0.623981
+vn -0.075167 0.922788 0.377880
+vn -0.092410 0.880642 0.464644
+vn -0.194128 0.097690 0.976074
+vn -0.195074 0.000000 0.980773
+vn -0.108768 -0.830042 0.546953
+vn -0.092410 -0.880642 0.464644
+vn -0.108768 0.830042 0.546953
+vn -0.124119 0.771508 0.623981
+vn -0.075167 -0.922788 0.377880
+vn -0.057161 -0.956084 0.287454
+vn -0.194128 -0.097690 0.976074
+vn -0.191351 -0.194494 0.962035
+vn -0.138218 0.705557 0.694998
+vn -0.151036 0.632893 0.759331
+vn -0.038606 -0.980193 0.194220
+vn -0.019684 -0.994873 0.099094
+vn -0.186712 -0.289438 0.938780
+vn -0.180303 -0.381603 0.906552
+vn -0.162389 0.554155 0.816401
+vn -0.172185 -0.470107 0.865627
+vn -0.019684 0.994873 0.099094
+vn -0.318522 0.554155 0.769036
+vn -0.337748 0.470107 0.815394
+vn -0.337748 -0.470107 0.815394
+vn -0.318522 -0.554155 0.769036
+vn -0.038667 0.994873 0.093356
+vn -0.075777 0.980193 0.182958
+vn -0.353710 0.381603 0.853938
+vn -0.366283 0.289438 0.884304
+vn -0.296274 -0.632893 0.715293
+vn -0.271157 -0.705557 0.654683
+vn -0.112156 0.956084 0.270760
+vn -0.147435 0.922788 0.355937
+vn -0.375347 0.194494 0.906217
+vn -0.380840 0.097690 0.919431
+vn -0.243446 -0.771508 0.587786
+vn -0.213385 -0.830042 0.515213
+vn -0.181280 0.880642 0.437696
+vn -0.213385 0.830042 0.515213
+vn -0.181280 -0.880642 0.437696
+vn -0.147435 -0.922788 0.355937
+vn -0.382672 0.000000 0.923856
+vn -0.380840 -0.097690 0.919431
+vn -0.243446 0.771508 0.587786
+vn -0.271157 0.705557 0.654683
+vn -0.112156 -0.956084 0.270760
+vn -0.075777 -0.980193 0.182958
+vn -0.375347 -0.194494 0.906217
+vn -0.366283 -0.289438 0.884304
+vn -0.296274 0.632893 0.715293
+vn -0.353710 -0.381603 0.853938
+vn -0.038667 -0.994873 0.093356
+vn -0.430128 0.632893 0.643727
+vn -0.462447 0.554155 0.692099
+vn -0.513504 -0.381603 0.768548
+vn -0.490341 -0.470107 0.733848
+vn -0.490341 0.470107 0.733848
+vn -0.513504 0.381603 0.768548
+vn -0.462447 -0.554155 0.692099
+vn -0.430128 -0.632893 0.643727
+vn -0.110019 0.980193 0.164647
+vn -0.162816 0.956084 0.243690
+vn -0.531785 0.289438 0.795862
+vn -0.544939 0.194494 0.815577
+vn -0.393689 -0.705557 0.589190
+vn -0.353435 -0.771508 0.528977
+vn -0.214057 0.922788 0.320353
+vn -0.263192 0.880642 0.393902
+vn -0.552904 0.097690 0.827479
+vn -0.555559 0.000000 0.831446
+vn -0.309824 -0.830042 0.463668
+vn -0.263192 -0.880642 0.393902
+vn -0.309824 0.830042 0.463668
+vn -0.353435 0.771508 0.528977
+vn -0.214057 -0.922788 0.320353
+vn -0.162816 -0.956084 0.243690
+vn -0.552904 -0.097690 0.827479
+vn -0.544939 -0.194494 0.815577
+vn -0.393689 0.705557 0.589190
+vn -0.110019 -0.980193 0.164647
+vn -0.056124 -0.994873 0.084017
+vn -0.531785 -0.289438 0.795862
+vn -0.056124 0.994873 0.084017
+vn -0.501053 0.705557 0.501053
+vn -0.547441 0.632893 0.547441
+vn -0.140019 -0.980193 0.140019
+vn -0.071444 -0.994873 0.071444
+vn -0.676840 -0.289438 0.676840
+vn -0.653584 -0.381603 0.653584
+vn -0.588580 0.554155 0.588580
+vn -0.624073 0.470107 0.624073
+vn -0.624073 -0.470107 0.624073
+vn -0.588580 -0.554155 0.588580
+vn -0.071444 0.994873 0.071444
+vn -0.140019 0.980193 0.140019
+vn -0.653584 0.381603 0.653584
+vn -0.676840 0.289407 0.676840
+vn -0.547441 -0.632893 0.547441
+vn -0.501053 -0.705557 0.501053
+vn -0.207221 0.956084 0.207221
+vn -0.272439 0.922788 0.272439
+vn -0.693594 0.194494 0.693594
+vn -0.703696 0.097690 0.703696
+vn -0.449873 -0.771508 0.449873
+vn -0.394330 -0.830042 0.394330
+vn -0.335002 0.880642 0.335002
+vn -0.394330 0.830042 0.394330
+vn -0.335002 -0.880642 0.335002
+vn -0.272439 -0.922788 0.272439
+vn -0.707083 0.000000 0.707083
+vn -0.703696 -0.097690 0.703696
+vn -0.449873 0.771508 0.449873
+vn -0.207221 -0.956084 0.207221
+vn -0.693594 -0.194494 0.693594
+vn -0.528977 0.771508 0.353435
+vn -0.589190 0.705557 0.393689
+vn -0.243690 -0.956084 0.162816
+vn -0.164647 -0.980193 0.110019
+vn -0.815577 -0.194494 0.544939
+vn -0.795862 -0.289438 0.531785
+vn -0.643727 0.632893 0.430128
+vn -0.692099 0.554155 0.462447
+vn -0.768548 -0.381603 0.513504
+vn -0.733848 -0.470107 0.490341
+vn -0.733848 0.470107 0.490341
+vn -0.768548 0.381603 0.513504
+vn -0.692099 -0.554155 0.462447
+vn -0.643727 -0.632893 0.430128
+vn -0.164647 0.980193 0.110019
+vn -0.243690 0.956084 0.162816
+vn -0.795862 0.289438 0.531785
+vn -0.815577 0.194494 0.544939
+vn -0.589190 -0.705557 0.393689
+vn -0.528977 -0.771508 0.353435
+vn -0.320353 0.922788 0.214057
+vn -0.393902 0.880642 0.263192
+vn -0.827479 0.097720 0.552904
+vn -0.831446 0.000000 0.555559
+vn -0.463668 -0.830042 0.309824
+vn -0.393902 -0.880642 0.263192
+vn -0.463668 0.830042 0.309824
+vn -0.320353 -0.922788 0.214057
+vn -0.827479 -0.097690 0.552904
+vn -0.084017 -0.994873 0.056124
+vn -0.084017 0.994873 0.056124
+vn -0.515213 0.830042 0.213385
+vn -0.587786 0.771508 0.243446
+vn -0.355937 -0.922788 0.147435
+vn -0.270760 -0.956084 0.112156
+vn -0.919431 -0.097690 0.380840
+vn -0.906217 -0.194494 0.375347
+vn -0.654683 0.705557 0.271157
+vn -0.715293 0.632893 0.296274
+vn -0.182958 -0.980193 0.075777
+vn -0.093356 -0.994873 0.038667
+vn -0.884304 -0.289438 0.366283
+vn -0.853938 -0.381603 0.353710
+vn -0.769036 0.554155 0.318522
+vn -0.815394 0.470107 0.337748
+vn -0.815394 -0.470107 0.337748
+vn -0.769036 -0.554155 0.318522
+vn -0.093356 0.994873 0.038667
+vn -0.182958 0.980193 0.075777
+vn -0.853938 0.381603 0.353710
+vn -0.884304 0.289407 0.366283
+vn -0.715293 -0.632893 0.296274
+vn -0.654683 -0.705557 0.271157
+vn -0.270760 0.956084 0.112156
+vn -0.355937 0.922788 0.147435
+vn -0.906217 0.194494 0.375347
+vn -0.919431 0.097720 0.380840
+vn -0.587786 -0.771508 0.243446
+vn -0.515213 -0.830042 0.213385
+vn -0.437696 0.880642 0.181280
+vn -0.437696 -0.880642 0.181280
+vn -0.923856 0.000000 0.382672
+vn -0.464644 0.880642 0.092410
+vn -0.546953 0.830042 0.108768
+vn -0.464644 -0.880642 0.092410
+vn -0.377880 -0.922788 0.075167
+vn -0.980773 0.000000 0.195074
+vn -0.976074 -0.097690 0.194128
+vn -0.623981 0.771508 0.124119
+vn -0.694998 0.705557 0.138218
+vn -0.287454 -0.956084 0.057161
+vn -0.194220 -0.980193 0.038606
+vn -0.962035 -0.194494 0.191351
+vn -0.938780 -0.289438 0.186712
+vn -0.759331 0.632893 0.151036
+vn -0.816401 0.554155 0.162389
+vn -0.906552 -0.381603 0.180303
+vn -0.865627 -0.470107 0.172185
+vn -0.865627 0.470107 0.172185
+vn -0.906552 0.381603 0.180303
+vn -0.816401 -0.554155 0.162389
+vn -0.759331 -0.632893 0.151036
+vn -0.194220 0.980193 0.038606
+vn -0.287454 0.956084 0.057161
+vn -0.938780 0.289407 0.186712
+vn -0.962035 0.194494 0.191351
+vn -0.694998 -0.705557 0.138218
+vn -0.623981 -0.771508 0.124119
+vn -0.377880 0.922788 0.075137
+vn -0.976074 0.097690 0.194128
+vn -0.546953 -0.830042 0.108768
+vn -0.099094 -0.994873 0.019684
+vn -0.099094 0.994873 0.019684
+vn -0.385266 0.922788 0.000000
+vn -0.473769 0.880642 0.000000
+vn -0.995209 0.097720 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.557665 -0.830042 0.000000
+vn -0.473769 -0.880642 0.000000
+vn -0.557665 0.830042 0.000000
+vn -0.636189 0.771508 0.000000
+vn -0.385266 -0.922788 0.000000
+vn -0.293069 -0.956084 0.000000
+vn -0.995209 -0.097690 0.000000
+vn -0.980895 -0.194494 0.000000
+vn -0.708609 0.705557 0.000000
+vn -0.774224 0.632893 0.000000
+vn -0.198035 -0.980193 0.000000
+vn -0.101047 -0.994873 0.000000
+vn -0.957183 -0.289438 0.000000
+vn -0.924314 -0.381603 0.000000
+vn -0.832392 0.554155 0.000000
+vn -0.882595 0.470107 0.000000
+vn -0.882595 -0.470107 0.000000
+vn -0.832392 -0.554155 0.000000
+vn -0.101047 0.994873 0.000000
+vn -0.198035 0.980193 0.000000
+vn -0.924314 0.381603 0.000000
+vn -0.957183 0.289407 0.000000
+vn -0.774224 -0.632893 0.000000
+vn -0.708609 -0.705557 0.000000
+vn -0.293069 0.956084 0.000000
+vn -0.980895 0.194494 0.000000
+vn -0.636189 -0.771508 0.000000
+vn -0.099094 0.994873 -0.019684
+vn -0.194220 0.980193 -0.038606
+vn -0.906552 0.381603 -0.180303
+vn -0.938780 0.289407 -0.186712
+vn -0.623981 -0.771508 -0.124119
+vn -0.546953 -0.830042 -0.108768
+vn -0.287454 0.956084 -0.057161
+vn -0.377880 0.922788 -0.075167
+vn -0.962035 0.194494 -0.191351
+vn -0.976074 0.097720 -0.194128
+vn -0.464644 -0.880642 -0.092410
+vn -0.377880 -0.922788 -0.075167
+vn -0.980773 0.000000 -0.195074
+vn -0.976074 -0.097690 -0.194128
+vn -0.464644 0.880642 -0.092410
+vn -0.546953 0.830042 -0.108798
+vn -0.287454 -0.956084 -0.057161
+vn -0.194220 -0.980193 -0.038606
+vn -0.962035 -0.194494 -0.191351
+vn -0.938780 -0.289438 -0.186712
+vn -0.623981 0.771508 -0.124119
+vn -0.694998 0.705557 -0.138218
+vn -0.906552 -0.381603 -0.180303
+vn -0.865627 -0.470107 -0.172185
+vn -0.759331 0.632893 -0.151036
+vn -0.816401 0.554155 -0.162389
+vn -0.816401 -0.554155 -0.162389
+vn -0.759331 -0.632893 -0.151036
+vn -0.865627 0.470107 -0.172185
+vn -0.694998 -0.705557 -0.138218
+vn -0.099094 -0.994873 -0.019684
+vn -0.815394 0.470107 -0.337748
+vn -0.853938 0.381603 -0.353710
+vn -0.769036 -0.554155 -0.318522
+vn -0.715293 -0.632893 -0.296274
+vn -0.182958 0.980193 -0.075777
+vn -0.270760 0.956084 -0.112156
+vn -0.884304 0.289407 -0.366283
+vn -0.906217 0.194494 -0.375347
+vn -0.654683 -0.705557 -0.271157
+vn -0.587786 -0.771508 -0.243446
+vn -0.355937 0.922788 -0.147435
+vn -0.437696 0.880642 -0.181280
+vn -0.919431 0.097720 -0.380840
+vn -0.923856 0.000000 -0.382672
+vn -0.515213 -0.830042 -0.213385
+vn -0.437696 -0.880642 -0.181280
+vn -0.515213 0.830042 -0.213416
+vn -0.587786 0.771508 -0.243446
+vn -0.355937 -0.922788 -0.147435
+vn -0.270760 -0.956084 -0.112156
+vn -0.919431 -0.097690 -0.380840
+vn -0.906217 -0.194494 -0.375347
+vn -0.654683 0.705557 -0.271157
+vn -0.715293 0.632893 -0.296274
+vn -0.182958 -0.980193 -0.075777
+vn -0.093356 -0.994873 -0.038667
+vn -0.884304 -0.289438 -0.366283
+vn -0.853938 -0.381603 -0.353710
+vn -0.769036 0.554155 -0.318522
+vn -0.815394 -0.470107 -0.337748
+vn -0.093356 0.994873 -0.038667
+vn -0.692099 0.554155 -0.462447
+vn -0.733848 0.470107 -0.490341
+vn -0.733848 -0.470107 -0.490341
+vn -0.692099 -0.554155 -0.462447
+vn -0.084017 0.994873 -0.056124
+vn -0.164647 0.980193 -0.110019
+vn -0.768548 0.381603 -0.513504
+vn -0.795862 0.289407 -0.531785
+vn -0.643727 -0.632893 -0.430128
+vn -0.589190 -0.705557 -0.393689
+vn -0.243690 0.956084 -0.162816
+vn -0.320353 0.922788 -0.214057
+vn -0.815577 0.194494 -0.544939
+vn -0.827479 0.097720 -0.552904
+vn -0.528977 -0.771508 -0.353435
+vn -0.463668 -0.830042 -0.309824
+vn -0.393902 0.880642 -0.263192
+vn -0.463668 0.830042 -0.309824
+vn -0.393902 -0.880642 -0.263192
+vn -0.320353 -0.922788 -0.214057
+vn -0.831446 0.000000 -0.555559
+vn -0.827479 -0.097690 -0.552904
+vn -0.528977 0.771508 -0.353435
+vn -0.589190 0.705557 -0.393689
+vn -0.243690 -0.956084 -0.162816
+vn -0.164647 -0.980193 -0.110019
+vn -0.815577 -0.194494 -0.544939
+vn -0.795862 -0.289438 -0.531785
+vn -0.643727 0.632893 -0.430128
+vn -0.768548 -0.381603 -0.513504
+vn -0.084017 -0.994873 -0.056124
+vn -0.547441 0.632893 -0.547441
+vn -0.588580 0.554155 -0.588580
+vn -0.653584 -0.381603 -0.653584
+vn -0.624073 -0.470107 -0.624073
+vn -0.624073 0.470107 -0.624073
+vn -0.653584 0.381603 -0.653584
+vn -0.588580 -0.554155 -0.588580
+vn -0.547441 -0.632893 -0.547441
+vn -0.140019 0.980193 -0.140019
+vn -0.207221 0.956084 -0.207221
+vn -0.676840 0.289407 -0.676840
+vn -0.693594 0.194494 -0.693594
+vn -0.501053 -0.705557 -0.501053
+vn -0.449873 -0.771508 -0.449873
+vn -0.272439 0.922788 -0.272439
+vn -0.335002 0.880642 -0.335002
+vn -0.703696 0.097720 -0.703696
+vn -0.707083 0.000000 -0.707083
+vn -0.394330 -0.830042 -0.394330
+vn -0.335002 -0.880642 -0.335002
+vn -0.394330 0.830042 -0.394330
+vn -0.449873 0.771508 -0.449873
+vn -0.272439 -0.922788 -0.272439
+vn -0.207221 -0.956084 -0.207221
+vn -0.703696 -0.097690 -0.703696
+vn -0.693594 -0.194494 -0.693594
+vn -0.501053 0.705557 -0.501053
+vn -0.140019 -0.980193 -0.140019
+vn -0.071444 -0.994873 -0.071444
+vn -0.676840 -0.289438 -0.676840
+vn -0.071444 0.994873 -0.071444
+vn -0.393689 0.705557 -0.589190
+vn -0.430128 0.632893 -0.643727
+vn -0.110019 -0.980193 -0.164647
+vn -0.056124 -0.994873 -0.084017
+vn -0.531785 -0.289438 -0.795862
+vn -0.513504 -0.381603 -0.768548
+vn -0.462447 0.554155 -0.692099
+vn -0.490341 0.470107 -0.733848
+vn -0.490341 -0.470107 -0.733848
+vn -0.462447 -0.554155 -0.692099
+vn -0.056124 0.994873 -0.084017
+vn -0.110019 0.980193 -0.164647
+vn -0.513504 0.381603 -0.768548
+vn -0.531785 0.289407 -0.795862
+vn -0.430128 -0.632893 -0.643727
+vn -0.393689 -0.705557 -0.589190
+vn -0.162816 0.956084 -0.243690
+vn -0.214057 0.922788 -0.320353
+vn -0.544939 0.194494 -0.815577
+vn -0.552904 0.097720 -0.827479
+vn -0.353435 -0.771508 -0.528977
+vn -0.309824 -0.830042 -0.463668
+vn -0.263192 0.880642 -0.393902
+vn -0.309824 0.830042 -0.463668
+vn -0.263192 -0.880642 -0.393902
+vn -0.214057 -0.922788 -0.320353
+vn -0.555559 0.000000 -0.831446
+vn -0.552904 -0.097690 -0.827479
+vn -0.353435 0.771508 -0.528977
+vn -0.162816 -0.956084 -0.243690
+vn -0.544939 -0.194494 -0.815577
+vn -0.243446 0.771508 -0.587786
+vn -0.271157 0.705557 -0.654683
+vn -0.112156 -0.956084 -0.270760
+vn -0.075777 -0.980193 -0.182958
+vn -0.375347 -0.194494 -0.906217
+vn -0.366283 -0.289438 -0.884304
+vn -0.296274 0.632893 -0.715293
+vn -0.318522 0.554155 -0.769036
+vn -0.353710 -0.381603 -0.853938
+vn -0.337748 -0.470107 -0.815394
+vn -0.337748 0.470107 -0.815394
+vn -0.353710 0.381603 -0.853938
+vn -0.318522 -0.554155 -0.769036
+vn -0.296274 -0.632893 -0.715293
+vn -0.075777 0.980193 -0.182958
+vn -0.112156 0.956084 -0.270760
+vn -0.366283 0.289407 -0.884335
+vn -0.375347 0.194494 -0.906217
+vn -0.271157 -0.705557 -0.654683
+vn -0.243446 -0.771508 -0.587786
+vn -0.147435 0.922788 -0.355937
+vn -0.181280 0.880642 -0.437696
+vn -0.380840 0.097720 -0.919431
+vn -0.382672 0.000000 -0.923856
+vn -0.213385 -0.830042 -0.515213
+vn -0.181280 -0.880642 -0.437696
+vn -0.213385 0.830042 -0.515213
+vn -0.147435 -0.922788 -0.355937
+vn -0.380840 -0.097690 -0.919431
+vn -0.038667 -0.994873 -0.093356
+vn -0.038667 0.994873 -0.093356
+vn -0.108768 0.830042 -0.546953
+vn -0.124119 0.771508 -0.623981
+vn -0.075167 -0.922788 -0.377880
+vn -0.057161 -0.956084 -0.287454
+vn -0.194128 -0.097690 -0.976074
+vn -0.191351 -0.194494 -0.962035
+vn -0.138218 0.705557 -0.694998
+vn -0.151036 0.632893 -0.759331
+vn -0.038606 -0.980193 -0.194220
+vn -0.019684 -0.994873 -0.099094
+vn -0.186712 -0.289438 -0.938780
+vn -0.180303 -0.381603 -0.906552
+vn -0.162389 0.554155 -0.816401
+vn -0.172185 0.470107 -0.865627
+vn -0.172185 -0.470107 -0.865627
+vn -0.162389 -0.554155 -0.816401
+vn -0.019684 0.994873 -0.099094
+vn -0.038606 0.980193 -0.194220
+vn -0.180303 0.381603 -0.906552
+vn -0.186712 0.289407 -0.938780
+vn -0.151036 -0.632893 -0.759362
+vn -0.138218 -0.705557 -0.694998
+vn -0.057161 0.956084 -0.287454
+vn -0.075167 0.922788 -0.377880
+vn -0.191351 0.194494 -0.962035
+vn -0.194128 0.097720 -0.976074
+vn -0.124119 -0.771508 -0.623981
+vn -0.108768 -0.830042 -0.546953
+vn -0.092410 0.880642 -0.464644
+vn -0.092410 -0.880642 -0.464644
+vn -0.195074 0.000000 -0.980773
+vn 0.000000 0.880642 -0.473769
+vn 0.000000 0.830042 -0.557665
+vn 0.000000 -0.880642 -0.473769
+vn 0.000000 -0.922788 -0.385266
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -0.097690 -0.995209
+vn 0.000000 0.771508 -0.636189
+vn 0.000000 0.705557 -0.708609
+vn 0.000000 -0.956084 -0.293069
+vn 0.000000 -0.980193 -0.198035
+vn 0.000000 -0.194494 -0.980895
+vn 0.000000 -0.289438 -0.957183
+vn 0.000000 0.632893 -0.774224
+vn 0.000000 0.554155 -0.832392
+vn 0.000000 -0.381603 -0.924314
+vn 0.000000 -0.470107 -0.882595
+vn 0.000000 0.470107 -0.882595
+vn 0.000000 0.381603 -0.924314
+vn 0.000000 -0.554155 -0.832392
+vn 0.000000 -0.632893 -0.774224
+vn 0.000000 0.980193 -0.198035
+vn 0.000000 0.956084 -0.293069
+vn 0.000000 0.289407 -0.957183
+vn 0.000000 0.194494 -0.980895
+vn 0.000000 -0.705557 -0.708609
+vn 0.000000 -0.771508 -0.636189
+vn 0.000000 0.922788 -0.385266
+vn 0.000000 0.097720 -0.995209
+vn 0.000000 -0.830042 -0.557665
+vn 0.000000 -0.994873 -0.101047
+vn 0.000000 0.994873 -0.101047
+vn 0.075167 0.922788 -0.377880
+vn 0.092410 0.880642 -0.464644
+vn 0.194128 0.097720 -0.976074
+vn 0.195074 0.000000 -0.980773
+vn 0.108798 -0.830042 -0.546953
+vn 0.092410 -0.880642 -0.464644
+vn 0.108798 0.830042 -0.546953
+vn 0.124119 0.771508 -0.623981
+vn 0.075167 -0.922788 -0.377880
+vn 0.057161 -0.956084 -0.287454
+vn 0.194128 -0.097690 -0.976074
+vn 0.191351 -0.194494 -0.962035
+vn 0.138218 0.705557 -0.694998
+vn 0.151036 0.632893 -0.759331
+vn 0.038606 -0.980193 -0.194220
+vn 0.019684 -0.994873 -0.099094
+vn 0.186712 -0.289438 -0.938780
+vn 0.180303 -0.381603 -0.906552
+vn 0.162389 0.554155 -0.816401
+vn 0.172185 0.470107 -0.865627
+vn 0.172185 -0.470107 -0.865627
+vn 0.162389 -0.554155 -0.816401
+vn 0.019684 0.994873 -0.099094
+vn 0.038606 0.980193 -0.194220
+vn 0.180303 0.381603 -0.906552
+vn 0.186712 0.289407 -0.938780
+vn 0.151036 -0.632893 -0.759331
+vn 0.138218 -0.705557 -0.694998
+vn 0.057161 0.956084 -0.287454
+vn 0.191351 0.194494 -0.962035
+vn 0.124119 -0.771508 -0.623981
+vn 0.112156 0.956084 -0.270760
+vn 0.147435 0.922788 -0.355937
+vn 0.375347 0.194494 -0.906217
+vn 0.380840 0.097720 -0.919431
+vn 0.243446 -0.771508 -0.587786
+vn 0.213416 -0.830042 -0.515213
+vn 0.181280 0.880642 -0.437696
+vn 0.213416 0.830042 -0.515213
+vn 0.181280 -0.880642 -0.437696
+vn 0.147435 -0.922788 -0.355937
+vn 0.382672 0.000000 -0.923856
+vn 0.380840 -0.097690 -0.919431
+vn 0.243446 0.771508 -0.587786
+vn 0.271157 0.705557 -0.654683
+vn 0.112156 -0.956084 -0.270760
+vn 0.075777 -0.980193 -0.182958
+vn 0.375347 -0.194494 -0.906217
+vn 0.366283 -0.289407 -0.884304
+vn 0.296274 0.632893 -0.715293
+vn 0.318522 0.554155 -0.769036
+vn 0.353710 -0.381603 -0.853938
+vn 0.337748 -0.470107 -0.815394
+vn 0.337748 0.470107 -0.815394
+vn 0.353710 0.381603 -0.853938
+vn 0.318522 -0.554155 -0.769036
+vn 0.296274 -0.632893 -0.715293
+vn 0.075777 0.980193 -0.182958
+vn 0.366283 0.289407 -0.884304
+vn 0.271157 -0.705557 -0.654683
+vn 0.038667 -0.994873 -0.093356
+vn 0.038667 0.994873 -0.093356
+vn 0.110019 0.980193 -0.164647
+vn 0.162816 0.956084 -0.243690
+vn 0.531785 0.289407 -0.795862
+vn 0.544939 0.194494 -0.815577
+vn 0.393689 -0.705557 -0.589190
+vn 0.353435 -0.771508 -0.528977
+vn 0.214057 0.922788 -0.320353
+vn 0.263192 0.880642 -0.393902
+vn 0.552904 0.097720 -0.827479
+vn 0.555559 0.000000 -0.831446
+vn 0.309824 -0.830042 -0.463668
+vn 0.263192 -0.880642 -0.393902
+vn 0.309824 0.830042 -0.463668
+vn 0.353435 0.771508 -0.528977
+vn 0.214057 -0.922788 -0.320353
+vn 0.162816 -0.956084 -0.243690
+vn 0.552904 -0.097690 -0.827479
+vn 0.544939 -0.194494 -0.815577
+vn 0.393689 0.705557 -0.589190
+vn 0.430128 0.632893 -0.643727
+vn 0.110019 -0.980193 -0.164647
+vn 0.056124 -0.994873 -0.084017
+vn 0.531785 -0.289407 -0.795862
+vn 0.513504 -0.381603 -0.768548
+vn 0.462447 0.554155 -0.692099
+vn 0.490341 0.470107 -0.733848
+vn 0.490341 -0.470107 -0.733848
+vn 0.462447 -0.554155 -0.692099
+vn 0.056124 0.994873 -0.084017
+vn 0.513504 0.381603 -0.768548
+vn 0.430128 -0.632893 -0.643727
+vn 0.071444 0.994873 -0.071444
+vn 0.140019 0.980193 -0.140019
+vn 0.653584 0.381603 -0.653584
+vn 0.676840 0.289407 -0.676840
+vn 0.547441 -0.632893 -0.547441
+vn 0.501053 -0.705557 -0.501053
+vn 0.207221 0.956084 -0.207221
+vn 0.272439 0.922788 -0.272439
+vn 0.693594 0.194494 -0.693594
+vn 0.703696 0.097720 -0.703696
+vn 0.449873 -0.771508 -0.449873
+vn 0.394330 -0.830042 -0.394330
+vn 0.335002 0.880642 -0.335002
+vn 0.394330 0.830042 -0.394330
+vn 0.335002 -0.880642 -0.335002
+vn 0.272439 -0.922788 -0.272439
+vn 0.707083 0.000000 -0.707083
+vn 0.703696 -0.097690 -0.703696
+vn 0.449873 0.771508 -0.449873
+vn 0.501053 0.705557 -0.501053
+vn 0.207221 -0.956084 -0.207221
+vn 0.140019 -0.980193 -0.140019
+vn 0.693594 -0.194494 -0.693594
+vn 0.676840 -0.289407 -0.676840
+vn 0.547441 0.632893 -0.547441
+vn 0.588580 0.554155 -0.588580
+vn 0.653584 -0.381603 -0.653584
+vn 0.624073 -0.470107 -0.624073
+vn 0.624073 0.470107 -0.624073
+vn 0.588580 -0.554155 -0.588580
+vn 0.071444 -0.994873 -0.071444
+vn 0.733848 0.470107 -0.490341
+vn 0.768548 0.381603 -0.513504
+vn 0.692099 -0.554155 -0.462447
+vn 0.643727 -0.632893 -0.430128
+vn 0.164647 0.980193 -0.110019
+vn 0.243690 0.956084 -0.162816
+vn 0.795862 0.289407 -0.531785
+vn 0.815577 0.194494 -0.544939
+vn 0.589190 -0.705557 -0.393689
+vn 0.528977 -0.771508 -0.353435
+vn 0.320353 0.922788 -0.214057
+vn 0.393902 0.880642 -0.263192
+vn 0.827479 0.097720 -0.552904
+vn 0.831446 0.000000 -0.555559
+vn 0.463668 -0.830042 -0.309824
+vn 0.393902 -0.880642 -0.263192
+vn 0.463668 0.830042 -0.309824
+vn 0.528977 0.771508 -0.353435
+vn 0.320353 -0.922788 -0.214057
+vn 0.243690 -0.956084 -0.162816
+vn 0.827479 -0.097690 -0.552904
+vn 0.815577 -0.194494 -0.544939
+vn 0.589190 0.705557 -0.393689
+vn 0.643727 0.632893 -0.430128
+vn 0.164647 -0.980193 -0.110019
+vn 0.084017 -0.994873 -0.056124
+vn 0.795862 -0.289407 -0.531785
+vn 0.768548 -0.381603 -0.513504
+vn 0.692099 0.554155 -0.462447
+vn 0.733848 -0.470107 -0.490341
+vn 0.084017 0.994873 -0.056124
+vn 0.769036 0.554155 -0.318522
+vn 0.815394 0.470107 -0.337748
+vn 0.815394 -0.470107 -0.337748
+vn 0.769036 -0.554155 -0.318522
+vn 0.093356 0.994873 -0.038667
+vn 0.182958 0.980193 -0.075777
+vn 0.853938 0.381603 -0.353710
+vn 0.884335 0.289407 -0.366283
+vn 0.715293 -0.632893 -0.296274
+vn 0.654683 -0.705557 -0.271157
+vn 0.270760 0.956084 -0.112156
+vn 0.355937 0.922788 -0.147435
+vn 0.906217 0.194494 -0.375347
+vn 0.919431 0.097720 -0.380840
+vn 0.587786 -0.771508 -0.243446
+vn 0.515213 -0.830042 -0.213385
+vn 0.437696 0.880642 -0.181280
+vn 0.515213 0.830042 -0.213385
+vn 0.437696 -0.880642 -0.181280
+vn 0.355937 -0.922788 -0.147435
+vn 0.923856 0.000000 -0.382672
+vn 0.919431 -0.097690 -0.380840
+vn 0.587786 0.771508 -0.243446
+vn 0.654683 0.705557 -0.271157
+vn 0.270760 -0.956084 -0.112156
+vn 0.182958 -0.980193 -0.075777
+vn 0.906217 -0.194494 -0.375347
+vn 0.884335 -0.289407 -0.366283
+vn 0.715293 0.632893 -0.296274
+vn 0.853938 -0.381603 -0.353710
+vn 0.093356 -0.994873 -0.038667
+vn 0.759331 0.632893 -0.151036
+vn 0.816401 0.554155 -0.162389
+vn 0.906552 -0.381603 -0.180303
+vn 0.865627 -0.470107 -0.172185
+vn 0.865627 0.470107 -0.172185
+vn 0.906552 0.381603 -0.180303
+vn 0.816401 -0.554155 -0.162389
+vn 0.759331 -0.632893 -0.151036
+vn 0.194220 0.980193 -0.038606
+vn 0.287454 0.956084 -0.057161
+vn 0.938780 0.289407 -0.186712
+vn 0.962035 0.194494 -0.191351
+vn 0.694998 -0.705557 -0.138249
+vn 0.623981 -0.771508 -0.124119
+vn 0.377880 0.922788 -0.075167
+vn 0.464644 0.880642 -0.092410
+vn 0.976074 0.097720 -0.194159
+vn 0.980773 0.000000 -0.195074
+vn 0.546953 -0.830042 -0.108798
+vn 0.464644 -0.880642 -0.092410
+vn 0.546953 0.830042 -0.108798
+vn 0.623981 0.771508 -0.124119
+vn 0.377880 -0.922788 -0.075167
+vn 0.287454 -0.956084 -0.057161
+vn 0.976074 -0.097690 -0.194159
+vn 0.962035 -0.194494 -0.191351
+vn 0.694998 0.705557 -0.138249
+vn 0.194220 -0.980193 -0.038606
+vn 0.099094 -0.994873 -0.019684
+vn 0.938780 -0.289407 -0.186712
+vn 0.099094 0.994873 -0.019684
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+s 1
+f 24/1/1 55/2/2 54/3/3 23/4/4
+f 2/5/5 33/6/6 32/7/7 1/8/8
+f 13/9/9 44/10/10 43/11/11 12/12/12
+f 22/13/13 53/14/14 52/15/15 21/16/16
+f 11/17/17 42/18/18 41/19/19 10/20/20
+f 31/21/21 62/22/22 61/23/23 30/24/24
+f 20/25/25 51/26/26 50/27/27 19/28/28
+f 9/29/29 40/30/30 39/31/31 8/32/32
+f 29/33/33 60/34/34 59/35/35 28/36/36
+f 18/37/37 49/38/38 48/39/39 17/40/40
+f 7/41/41 38/42/42 37/43/43 6/44/44
+f 27/45/45 58/46/46 57/47/47 26/48/48
+f 5/49/49 36/50/50 35/51/51 4/52/52
+f 16/53/53 47/54/54 46/55/55 15/56/56
+f 25/57/57 56/58/58 55/2/2 24/1/1
+f 3/59/59 34/60/60 33/6/6 2/5/5
+f 14/61/61 45/62/62 44/10/10 13/9/9
+f 23/4/4 54/3/3 53/14/14 22/13/13
+f 12/12/12 43/11/11 42/18/18 11/17/17
+f 21/16/16 52/15/15 51/26/26 20/25/25
+f 10/20/20 41/19/19 40/30/30 9/29/29
+f 30/24/24 61/23/23 60/34/34 29/33/33
+f 19/28/28 50/27/27 49/38/38 18/37/37
+f 8/32/32 39/31/31 38/42/42 7/41/41
+f 28/36/36 59/35/35 58/46/46 27/45/45
+f 17/40/40 48/39/39 47/54/54 16/53/53
+f 6/44/44 37/43/43 36/50/50 5/49/49
+f 26/48/48 57/47/47 56/58/58 25/57/57
+f 4/52/52 35/51/51 34/60/60 3/59/59
+f 15/56/56 46/55/55 45/62/62 14/61/61
+f 56/58/58 87/63/63 86/64/64 55/2/2
+f 34/60/60 65/65/65 64/66/66 33/6/6
+f 45/62/62 76/67/67 75/68/68 44/10/10
+f 54/3/3 85/69/69 84/70/70 53/14/14
+f 43/11/11 74/71/71 73/72/72 42/18/18
+f 52/15/15 83/73/73 82/74/74 51/26/26
+f 41/19/19 72/75/75 71/76/76 40/30/30
+f 61/77/23 92/78/77 91/79/78 60/80/34
+f 50/27/27 81/81/79 80/82/80 49/38/38
+f 39/31/31 70/83/81 69/84/82 38/42/42
+f 59/85/35 90/86/83 89/87/84 58/88/46
+f 48/39/39 79/89/85 78/90/86 47/54/54
+f 37/43/43 68/91/87 67/92/88 36/50/50
+f 57/47/47 88/93/89 87/63/63 56/58/58
+f 35/51/51 66/94/90 65/65/65 34/60/60
+f 46/55/55 77/95/91 76/67/67 45/62/62
+f 55/2/2 86/64/64 85/69/69 54/3/3
+f 33/6/6 64/66/66 63/96/92 32/7/7
+f 44/10/10 75/68/68 74/71/71 43/11/11
+f 53/14/14 84/70/70 83/73/73 52/15/15
+f 42/18/18 73/72/72 72/75/75 41/19/19
+f 62/97/22 93/98/93 92/78/77 61/77/23
+f 51/26/26 82/74/74 81/81/79 50/27/27
+f 40/30/30 71/76/76 70/83/81 39/31/31
+f 60/80/34 91/79/78 90/86/83 59/85/35
+f 49/38/38 80/82/80 79/89/85 48/39/39
+f 38/42/42 69/84/82 68/91/87 37/43/43
+f 58/46/46 89/99/84 88/93/89 57/47/47
+f 36/50/50 67/92/88 66/94/90 35/51/51
+f 47/54/54 78/90/86 77/95/91 46/55/55
+f 88/100/89 119/101/94 118/102/95 87/103/63
+f 66/94/90 97/104/96 96/105/97 65/65/65
+f 77/106/91 108/107/98 107/108/99 76/109/67
+f 86/110/64 117/111/100 116/112/101 85/113/69
+f 64/66/66 95/114/102 94/115/103 63/96/92
+f 75/116/68 106/117/104 105/118/105 74/119/71
+f 84/120/70 115/121/106 114/122/107 83/123/73
+f 73/124/72 104/125/108 103/126/109 72/127/75
+f 93/98/93 124/128/110 123/129/111 92/78/77
+f 82/130/74 113/131/112 112/132/113 81/133/79
+f 71/134/76 102/135/114 101/136/115 70/137/81
+f 91/79/78 122/138/116 121/139/117 90/86/83
+f 80/140/80 111/141/118 110/142/119 79/143/85
+f 69/144/82 100/145/120 99/146/121 68/147/87
+f 89/87/84 120/148/122 119/101/94 88/100/89
+f 67/149/88 98/150/123 97/104/96 66/94/90
+f 78/151/86 109/152/124 108/107/98 77/106/91
+f 87/103/63 118/102/95 117/111/100 86/110/64
+f 65/65/65 96/105/97 95/114/102 64/66/66
+f 76/109/67 107/108/99 106/117/104 75/116/68
+f 85/113/69 116/112/101 115/121/106 84/120/70
+f 74/119/71 105/118/105 104/125/108 73/124/72
+f 83/123/73 114/122/107 113/131/112 82/130/74
+f 72/127/75 103/126/109 102/135/114 71/134/76
+f 92/78/77 123/129/111 122/138/116 91/79/78
+f 81/133/79 112/132/113 111/141/118 80/140/80
+f 70/137/81 101/136/115 100/145/120 69/144/82
+f 90/86/83 121/139/117 120/148/122 89/87/84
+f 79/143/85 110/142/119 109/152/124 78/151/86
+f 68/147/87 99/146/121 98/150/123 67/149/88
+f 120/148/122 151/153/125 150/154/126 119/101/94
+f 98/150/123 129/155/127 128/156/128 97/104/96
+f 109/152/124 140/157/129 139/158/130 108/107/98
+f 118/102/95 149/159/131 148/160/132 117/111/100
+f 96/105/97 127/161/133 126/162/134 95/114/102
+f 107/108/99 138/163/135 137/164/136 106/117/104
+f 116/112/101 147/165/137 146/166/138 115/121/106
+f 105/118/105 136/167/139 135/168/140 104/125/108
+f 114/122/107 145/169/141 144/170/142 113/131/112
+f 103/126/109 134/171/143 133/172/144 102/135/114
+f 123/129/111 154/173/145 153/174/146 122/138/116
+f 112/132/113 143/175/147 142/176/148 111/141/118
+f 101/136/115 132/177/149 131/178/150 100/145/120
+f 121/139/117 152/179/151 151/153/125 120/148/122
+f 110/142/119 141/180/152 140/157/129 109/152/124
+f 99/146/121 130/181/153 129/155/127 98/150/123
+f 119/101/94 150/154/126 149/159/131 118/102/95
+f 97/104/96 128/156/128 127/161/133 96/105/97
+f 108/107/98 139/158/130 138/163/135 107/108/99
+f 117/111/100 148/160/132 147/165/137 116/112/101
+f 95/114/102 126/162/134 125/182/154 94/115/103
+f 106/117/104 137/164/136 136/167/139 105/118/105
+f 115/121/106 146/166/138 145/169/141 114/122/107
+f 104/125/108 135/168/140 134/171/143 103/126/109
+f 124/128/110 155/183/155 154/173/145 123/129/111
+f 113/131/112 144/170/142 143/175/147 112/132/113
+f 102/135/114 133/172/144 132/177/149 101/136/115
+f 122/138/116 153/174/146 152/179/151 121/139/117
+f 111/141/118 142/176/148 141/180/152 110/142/119
+f 100/145/120 131/178/150 130/181/153 99/146/121
+f 152/179/151 183/184/156 182/185/157 151/153/125
+f 141/180/152 172/186/158 171/187/159 140/157/129
+f 130/181/153 161/188/160 160/189/161 129/155/127
+f 150/154/126 181/190/162 180/191/163 149/159/131
+f 128/156/128 159/192/164 158/193/165 127/161/133
+f 139/158/130 170/194/166 169/195/167 138/163/135
+f 148/160/132 179/196/168 178/197/169 147/165/137
+f 126/162/134 157/198/170 156/199/171 125/182/154
+f 137/164/136 168/200/172 167/201/173 136/167/139
+f 146/166/138 177/202/174 176/203/175 145/169/141
+f 135/168/140 166/204/176 165/205/177 134/171/143
+f 155/183/155 186/206/178 185/207/179 154/173/145
+f 144/170/142 175/208/180 174/209/181 143/175/147
+f 133/172/144 164/210/182 163/211/183 132/177/149
+f 153/174/146 184/212/184 183/184/156 152/179/151
+f 142/176/148 173/213/185 172/186/158 141/180/152
+f 131/178/150 162/214/186 161/188/160 130/181/153
+f 151/153/125 182/185/157 181/190/162 150/154/126
+f 129/155/127 160/189/161 159/192/164 128/156/128
+f 140/157/129 171/187/159 170/194/166 139/158/130
+f 149/159/131 180/191/163 179/196/168 148/160/132
+f 127/161/133 158/193/165 157/198/170 126/162/134
+f 138/163/135 169/195/167 168/200/172 137/164/136
+f 147/165/137 178/197/169 177/202/174 146/166/138
+f 136/167/139 167/201/173 166/204/176 135/168/140
+f 145/169/141 176/203/175 175/208/180 144/170/142
+f 134/171/143 165/205/177 164/210/182 133/172/144
+f 154/173/145 185/207/179 184/212/184 153/174/146
+f 143/175/147 174/209/181 173/213/185 142/176/148
+f 132/177/149 163/211/183 162/214/186 131/178/150
+f 184/212/184 215/215/187 214/216/188 183/184/156
+f 173/213/185 204/217/189 203/218/190 172/186/158
+f 162/214/186 193/219/191 192/220/192 161/188/160
+f 182/185/157 213/221/193 212/222/194 181/190/162
+f 160/189/161 191/223/195 190/224/196 159/192/164
+f 171/187/159 202/225/197 201/226/198 170/194/166
+f 180/191/163 211/227/199 210/228/200 179/196/168
+f 158/193/165 189/229/201 188/230/202 157/198/170
+f 169/195/167 200/231/203 199/232/204 168/200/172
+f 178/197/169 209/233/205 208/234/206 177/202/174
+f 167/201/173 198/235/207 197/236/208 166/204/176
+f 176/203/175 207/237/209 206/238/210 175/208/180
+f 165/205/177 196/239/211 195/240/212 164/210/182
+f 185/207/179 216/241/213 215/215/187 184/212/184
+f 174/209/181 205/242/214 204/217/189 173/213/185
+f 163/211/183 194/243/215 193/219/191 162/214/186
+f 183/184/156 214/216/188 213/221/193 182/185/157
+f 172/186/158 203/218/190 202/225/197 171/187/159
+f 161/188/160 192/220/192 191/223/195 160/189/161
+f 181/190/162 212/222/194 211/227/199 180/191/163
+f 159/192/164 190/224/196 189/229/201 158/193/165
+f 170/194/166 201/226/198 200/231/203 169/195/167
+f 179/196/168 210/228/200 209/233/205 178/197/169
+f 157/198/170 188/230/202 187/244/216 156/199/171
+f 168/200/172 199/232/204 198/235/207 167/201/173
+f 177/202/174 208/234/206 207/237/209 176/203/175
+f 166/204/176 197/236/208 196/239/211 165/205/177
+f 186/206/178 217/245/217 216/241/213 185/207/179
+f 175/208/180 206/238/210 205/242/214 174/209/181
+f 164/210/182 195/240/212 194/243/215 163/211/183
+f 216/241/213 248/246/218 247/247/219 215/215/187
+f 205/242/214 237/248/220 236/249/221 204/217/189
+f 194/243/215 226/250/222 225/251/223 193/219/191
+f 214/216/188 246/252/224 245/253/225 213/221/193
+f 203/218/190 235/254/226 234/255/227 202/225/197
+f 192/220/192 224/256/228 223/257/229 191/223/195
+f 212/222/194 244/258/230 243/259/231 211/227/199
+f 190/224/196 222/260/232 221/261/233 189/229/201
+f 201/226/198 233/262/234 232/263/235 200/231/203
+f 210/228/200 242/264/236 241/265/237 209/233/205
+f 188/230/202 220/266/238 219/267/239 187/244/216
+f 199/232/204 231/268/240 230/269/241 198/235/207
+f 208/234/206 240/270/242 239/271/243 207/237/209
+f 197/236/208 229/272/244 228/273/245 196/239/211
+f 217/245/217 249/274/246 248/246/218 216/241/213
+f 206/238/210 238/275/247 237/248/220 205/242/214
+f 195/240/212 227/276/248 226/250/222 194/243/215
+f 215/215/187 247/247/219 246/252/224 214/216/188
+f 204/217/189 236/249/221 235/254/226 203/218/190
+f 193/219/191 225/251/223 224/256/228 192/220/192
+f 213/221/193 245/253/225 244/258/230 212/222/194
+f 191/223/195 223/257/229 222/260/232 190/224/196
+f 202/225/197 234/255/227 233/262/234 201/226/198
+f 211/227/199 243/259/231 242/264/236 210/228/200
+f 189/229/201 221/261/233 220/266/238 188/230/202
+f 200/231/203 232/263/235 231/268/240 199/232/204
+f 209/233/205 241/265/237 240/270/242 208/234/206
+f 198/235/207 230/269/241 229/272/244 197/236/208
+f 207/237/209 239/271/243 238/275/247 206/238/210
+f 196/239/211 228/273/245 227/276/248 195/240/212
+f 249/274/246 280/277/249 279/278/250 248/246/218
+f 238/275/247 269/279/251 268/280/252 237/248/220
+f 227/276/248 258/281/253 257/282/254 226/250/222
+f 247/247/219 278/283/255 277/284/256 246/252/224
+f 236/249/221 267/285/257 266/286/258 235/254/226
+f 225/251/223 256/287/259 255/288/260 224/256/228
+f 245/253/225 276/289/261 275/290/262 244/258/230
+f 223/257/229 254/291/263 253/292/264 222/260/232
+f 234/255/227 265/293/265 264/294/266 233/262/234
+f 243/259/231 274/295/267 273/296/268 242/264/236
+f 221/261/233 252/297/269 251/298/270 220/266/238
+f 232/263/235 263/299/271 262/300/272 231/268/240
+f 241/265/237 272/301/273 271/302/274 240/270/242
+f 230/269/241 261/303/275 260/304/276 229/272/244
+f 239/271/243 270/305/277 269/279/251 238/275/247
+f 228/273/245 259/306/278 258/281/253 227/276/248
+f 248/246/218 279/278/250 278/283/255 247/247/219
+f 237/248/220 268/280/252 267/285/257 236/249/221
+f 226/250/222 257/282/254 256/287/259 225/251/223
+f 246/252/224 277/284/256 276/289/261 245/253/225
+f 235/254/226 266/286/258 265/293/265 234/255/227
+f 224/256/228 255/288/260 254/291/263 223/257/229
+f 244/258/230 275/290/262 274/295/267 243/259/231
+f 222/260/232 253/292/264 252/297/269 221/261/233
+f 233/262/234 264/294/266 263/299/271 232/263/235
+f 242/264/236 273/296/268 272/301/273 241/265/237
+f 220/266/238 251/298/270 250/307/279 219/267/239
+f 231/268/240 262/300/272 261/303/275 230/269/241
+f 240/270/242 271/302/274 270/305/277 239/271/243
+f 229/272/244 260/304/276 259/306/278 228/273/245
+f 270/305/277 301/308/280 300/309/281 269/279/251
+f 259/306/278 290/310/282 289/311/283 258/281/253
+f 279/278/250 310/312/284 309/313/285 278/283/255
+f 268/280/252 299/314/286 298/315/287 267/285/257
+f 257/282/254 288/316/288 287/317/289 256/287/259
+f 277/284/256 308/318/290 307/319/291 276/289/261
+f 266/286/258 297/320/292 296/321/293 265/293/265
+f 255/288/260 286/322/294 285/323/295 254/291/263
+f 275/290/262 306/324/296 305/325/297 274/295/267
+f 253/292/264 284/326/298 283/327/299 252/297/269
+f 264/294/266 295/328/300 294/329/301 263/299/271
+f 273/296/268 304/330/302 303/331/303 272/301/273
+f 251/298/270 282/332/304 281/333/305 250/307/279
+f 262/300/272 293/334/306 292/335/307 261/303/275
+f 271/302/274 302/336/308 301/308/280 270/305/277
+f 260/304/276 291/337/309 290/310/282 259/306/278
+f 280/277/249 311/338/310 310/312/284 279/278/250
+f 269/279/251 300/309/281 299/314/286 268/280/252
+f 258/281/253 289/311/283 288/316/288 257/282/254
+f 278/283/255 309/313/285 308/318/290 277/284/256
+f 267/285/257 298/315/287 297/320/292 266/286/258
+f 256/287/259 287/317/289 286/322/294 255/288/260
+f 276/289/261 307/319/291 306/324/296 275/290/262
+f 254/291/263 285/323/295 284/326/298 253/292/264
+f 265/293/265 296/321/293 295/328/300 264/294/266
+f 274/295/267 305/325/297 304/330/302 273/296/268
+f 252/297/269 283/327/299 282/332/304 251/298/270
+f 263/299/271 294/329/301 293/334/306 262/300/272
+f 272/301/273 303/331/303 302/336/308 271/302/274
+f 261/303/275 292/335/307 291/337/309 260/304/276
+f 302/336/308 333/339/311 332/340/312 301/308/280
+f 291/337/309 322/341/313 321/342/314 290/310/282
+f 311/338/310 342/343/315 341/344/316 310/312/284
+f 300/309/281 331/345/317 330/346/318 299/314/286
+f 289/311/283 320/347/319 319/348/320 288/316/288
+f 309/313/285 340/349/321 339/350/322 308/318/290
+f 298/315/287 329/351/323 328/352/324 297/320/292
+f 287/317/289 318/353/325 317/354/326 286/322/294
+f 307/319/291 338/355/327 337/356/328 306/324/296
+f 285/323/295 316/357/329 315/358/330 284/326/298
+f 296/321/293 327/359/331 326/360/332 295/328/300
+f 305/325/297 336/361/333 335/362/334 304/330/302
+f 283/327/299 314/363/335 313/364/336 282/332/304
+f 294/329/301 325/365/337 324/366/338 293/334/306
+f 303/331/303 334/367/339 333/339/311 302/336/308
+f 292/335/307 323/368/340 322/341/313 291/337/309
+f 301/308/280 332/340/312 331/345/317 300/309/281
+f 290/310/282 321/342/314 320/347/319 289/311/283
+f 310/312/284 341/344/316 340/349/321 309/313/285
+f 299/314/286 330/346/318 329/351/323 298/315/287
+f 288/316/288 319/348/320 318/353/325 287/317/289
+f 308/318/290 339/350/322 338/355/327 307/319/291
+f 297/320/292 328/352/324 327/359/331 296/321/293
+f 286/322/294 317/354/326 316/357/329 285/323/295
+f 306/324/296 337/356/328 336/361/333 305/325/297
+f 284/326/298 315/358/330 314/363/335 283/327/299
+f 295/328/300 326/360/332 325/365/337 294/329/301
+f 304/330/302 335/362/334 334/367/339 303/331/303
+f 282/332/304 313/364/336 312/369/341 281/333/305
+f 293/334/306 324/366/338 323/368/340 292/335/307
+f 334/367/339 365/370/342 364/371/343 333/339/311
+f 323/368/340 354/372/344 353/373/345 322/341/313
+f 332/340/312 363/374/346 362/375/347 331/345/317
+f 321/342/314 352/376/348 351/377/349 320/347/319
+f 341/344/316 372/378/350 371/379/351 340/349/321
+f 330/346/318 361/380/352 360/381/353 329/351/323
+f 319/348/320 350/382/354 349/383/355 318/353/325
+f 339/350/322 370/384/356 369/385/357 338/355/327
+f 328/352/324 359/386/358 358/387/359 327/359/331
+f 317/354/326 348/388/360 347/389/361 316/357/329
+f 337/356/328 368/390/362 367/391/363 336/361/333
+f 315/358/330 346/392/364 345/393/365 314/363/335
+f 326/360/332 357/394/366 356/395/367 325/365/337
+f 335/362/334 366/396/368 365/370/342 334/367/339
+f 313/364/336 344/397/369 343/398/370 312/369/341
+f 324/366/338 355/399/371 354/372/344 323/368/340
+f 333/339/311 364/371/343 363/374/346 332/340/312
+f 322/341/313 353/373/345 352/376/348 321/342/314
+f 342/343/315 373/400/372 372/378/350 341/344/316
+f 331/345/317 362/375/347 361/380/352 330/346/318
+f 320/347/319 351/377/349 350/382/354 319/348/320
+f 340/349/321 371/379/351 370/384/356 339/350/322
+f 329/351/323 360/381/353 359/386/358 328/352/324
+f 318/353/325 349/383/355 348/388/360 317/354/326
+f 338/355/327 369/385/357 368/390/362 337/356/328
+f 316/357/329 347/389/361 346/392/364 315/358/330
+f 327/359/331 358/387/359 357/394/366 326/360/332
+f 336/361/333 367/391/363 366/396/368 335/362/334
+f 314/363/335 345/393/365 344/397/369 313/364/336
+f 325/365/337 356/395/367 355/399/371 324/366/338
+f 366/396/368 397/401/373 396/402/374 365/370/342
+f 344/397/369 375/403/375 374/404/376 343/398/370
+f 355/399/371 386/405/377 385/406/378 354/372/344
+f 364/371/343 395/407/379 394/408/380 363/374/346
+f 353/373/345 384/409/381 383/410/382 352/376/348
+f 373/400/372 404/411/383 403/412/384 372/378/350
+f 362/375/347 393/413/385 392/414/386 361/380/352
+f 351/377/349 382/415/387 381/416/388 350/382/354
+f 371/379/351 402/417/389 401/418/390 370/384/356
+f 360/381/353 391/419/391 390/420/392 359/386/358
+f 349/383/355 380/421/393 379/422/394 348/388/360
+f 369/385/357 400/423/395 399/424/396 368/390/362
+f 347/389/361 378/425/397 377/426/398 346/392/364
+f 358/387/359 389/427/399 388/428/400 357/394/366
+f 367/391/363 398/429/401 397/401/373 366/396/368
+f 345/393/365 376/430/402 375/403/375 344/397/369
+f 356/395/367 387/431/403 386/405/377 355/399/371
+f 365/370/342 396/402/374 395/407/379 364/371/343
+f 354/372/344 385/406/378 384/409/381 353/373/345
+f 363/374/346 394/408/380 393/413/385 362/375/347
+f 352/376/348 383/410/382 382/415/387 351/377/349
+f 372/378/350 403/412/384 402/417/389 371/379/351
+f 361/380/352 392/414/386 391/419/391 360/381/353
+f 350/382/354 381/416/388 380/421/393 349/383/355
+f 370/384/356 401/418/390 400/423/395 369/385/357
+f 359/386/358 390/420/392 389/427/399 358/387/359
+f 348/388/360 379/422/394 378/425/397 347/389/361
+f 368/390/362 399/424/396 398/429/401 367/391/363
+f 346/392/364 377/426/398 376/430/402 345/393/365
+f 357/394/366 388/428/400 387/431/403 356/395/367
+f 398/429/401 429/432/404 428/433/405 397/401/373
+f 376/430/402 407/434/406 406/435/407 375/403/375
+f 387/431/403 418/436/408 417/437/409 386/405/377
+f 396/402/374 427/438/410 426/439/411 395/407/379
+f 385/406/378 416/440/412 415/441/413 384/409/381
+f 394/408/380 425/442/414 424/443/415 393/413/385
+f 383/410/382 414/444/416 413/445/417 382/415/387
+f 403/412/384 434/446/418 433/447/419 402/417/389
+f 392/414/386 423/448/420 422/449/421 391/419/391
+f 381/416/388 412/450/422 411/451/423 380/421/393
+f 401/418/390 432/452/424 431/453/425 400/423/395
+f 390/420/392 421/454/426 420/455/427 389/427/399
+f 379/422/394 410/456/428 409/457/429 378/425/397
+f 399/424/396 430/458/430 429/432/404 398/429/401
+f 377/426/398 408/459/431 407/434/406 376/430/402
+f 388/428/400 419/460/432 418/436/408 387/431/403
+f 397/401/373 428/433/405 427/438/410 396/402/374
+f 375/403/375 406/435/407 405/461/433 374/404/376
+f 386/405/377 417/437/409 416/440/412 385/406/378
+f 395/407/379 426/439/411 425/442/414 394/408/380
+f 384/409/381 415/441/413 414/444/416 383/410/382
+f 404/411/383 435/462/434 434/446/418 403/412/384
+f 393/413/385 424/443/415 423/448/420 392/414/386
+f 382/415/387 413/445/417 412/450/422 381/416/388
+f 402/417/389 433/447/419 432/452/424 401/418/390
+f 391/419/391 422/449/421 421/454/426 390/420/392
+f 380/421/393 411/451/423 410/456/428 379/422/394
+f 400/423/395 431/453/425 430/458/430 399/424/396
+f 378/425/397 409/457/429 408/459/431 377/426/398
+f 389/427/399 420/455/427 419/460/432 388/428/400
+f 430/458/430 461/463/435 460/464/436 429/432/404
+f 408/459/431 439/465/437 438/466/438 407/434/406
+f 419/460/432 450/467/439 449/468/440 418/436/408
+f 428/433/405 459/469/441 458/470/442 427/438/410
+f 406/435/407 437/471/443 436/472/444 405/461/433
+f 417/437/409 448/473/445 447/474/446 416/440/412
+f 426/439/411 457/475/447 456/476/448 425/442/414
+f 415/441/413 446/477/449 445/478/450 414/444/416
+f 435/462/434 466/479/451 465/480/452 434/446/418
+f 424/443/415 455/481/453 454/482/454 423/448/420
+f 413/445/417 444/483/455 443/484/456 412/450/422
+f 433/447/419 464/485/457 463/486/458 432/452/424
+f 422/449/421 453/487/459 452/488/460 421/454/426
+f 411/451/423 442/489/461 441/490/462 410/456/428
+f 431/453/425 462/491/463 461/463/435 430/458/430
+f 409/457/429 440/492/464 439/465/437 408/459/431
+f 420/455/427 451/493/465 450/467/439 419/460/432
+f 429/432/404 460/464/436 459/469/441 428/433/405
+f 407/434/406 438/466/438 437/471/443 406/435/407
+f 418/436/408 449/468/440 448/473/445 417/437/409
+f 427/438/410 458/470/442 457/475/447 426/439/411
+f 416/440/412 447/474/446 446/477/449 415/441/413
+f 425/442/414 456/476/448 455/481/453 424/443/415
+f 414/444/416 445/478/450 444/483/455 413/445/417
+f 434/446/418 465/480/452 464/485/457 433/447/419
+f 423/448/420 454/482/454 453/487/459 422/449/421
+f 412/450/422 443/484/456 442/489/461 411/451/423
+f 432/452/424 463/486/458 462/491/463 431/453/425
+f 421/454/426 452/488/460 451/493/465 420/455/427
+f 410/456/428 441/490/462 440/492/464 409/457/429
+f 462/491/463 493/494/466 492/495/467 461/463/435
+f 440/492/464 471/496/468 470/497/469 439/465/437
+f 451/493/465 482/498/470 481/499/471 450/467/439
+f 460/464/436 491/500/472 490/501/473 459/469/441
+f 438/466/438 469/502/474 468/503/475 437/471/443
+f 449/468/440 480/504/476 479/505/477 448/473/445
+f 458/470/442 489/506/478 488/507/479 457/475/447
+f 447/474/446 478/508/480 477/509/481 446/477/449
+f 456/476/448 487/510/482 486/511/483 455/481/453
+f 445/478/450 476/512/484 475/513/485 444/483/455
+f 465/480/452 496/514/486 495/515/487 464/485/457
+f 454/482/454 485/516/488 484/517/489 453/487/459
+f 443/484/456 474/518/490 473/519/491 442/489/461
+f 463/486/458 494/520/492 493/494/466 462/491/463
+f 452/488/460 483/521/493 482/498/470 451/493/465
+f 441/490/462 472/522/494 471/496/468 440/492/464
+f 461/463/435 492/495/467 491/500/472 460/464/436
+f 439/465/437 470/497/469 469/502/474 438/466/438
+f 450/467/439 481/499/471 480/504/476 449/468/440
+f 459/469/441 490/501/473 489/506/478 458/470/442
+f 437/471/443 468/503/475 467/523/495 436/472/444
+f 448/473/445 479/505/477 478/508/480 447/474/446
+f 457/475/447 488/507/479 487/510/482 456/476/448
+f 446/477/449 477/509/481 476/512/484 445/478/450
+f 466/479/451 497/524/496 496/514/486 465/480/452
+f 455/481/453 486/511/483 485/516/488 454/482/454
+f 444/483/455 475/513/485 474/518/490 443/484/456
+f 464/485/457 495/515/487 494/520/492 463/486/458
+f 453/487/459 484/517/489 483/521/493 452/488/460
+f 442/489/461 473/519/491 472/522/494 441/490/462
+f 494/520/492 525/525/497 524/526/498 493/494/466
+f 483/521/493 514/527/499 513/528/500 482/498/470
+f 472/522/494 503/529/501 502/530/502 471/496/468
+f 492/495/467 523/531/503 522/532/504 491/500/472
+f 470/497/469 501/533/505 500/534/506 469/502/474
+f 481/499/471 512/535/507 511/536/508 480/504/476
+f 490/501/473 521/537/509 520/538/510 489/506/478
+f 468/503/475 499/539/511 498/540/512 467/523/495
+f 479/505/477 510/541/513 509/542/514 478/508/480
+f 488/507/479 519/543/515 518/544/516 487/510/482
+f 477/509/481 508/545/517 507/546/518 476/512/484
+f 497/524/496 528/547/519 527/548/520 496/514/486
+f 486/511/483 517/549/521 516/550/522 485/516/488
+f 475/513/485 506/551/523 505/552/524 474/518/490
+f 495/515/487 526/553/525 525/525/497 494/520/492
+f 484/517/489 515/554/526 514/527/499 483/521/493
+f 473/519/491 504/555/527 503/529/501 472/522/494
+f 493/494/466 524/526/498 523/531/503 492/495/467
+f 471/496/468 502/530/502 501/533/505 470/497/469
+f 482/498/470 513/528/500 512/535/507 481/499/471
+f 491/500/472 522/532/504 521/537/509 490/501/473
+f 469/502/474 500/534/506 499/539/511 468/503/475
+f 480/504/476 511/536/508 510/541/513 479/505/477
+f 489/506/478 520/538/510 519/543/515 488/507/479
+f 478/508/480 509/542/514 508/545/517 477/509/481
+f 487/510/482 518/544/516 517/549/521 486/511/483
+f 476/512/484 507/546/518 506/551/523 475/513/485
+f 496/514/486 527/548/520 526/553/525 495/515/487
+f 485/516/488 516/550/522 515/554/526 484/517/489
+f 474/518/490 505/552/524 504/555/527 473/519/491
+f 528/547/519 559/556/528 558/557/529 527/548/520
+f 517/549/521 548/558/530 547/559/531 516/550/522
+f 504/555/527 535/560/532 534/561/533 503/529/501
+f 526/553/525 557/562/534 556/563/535 525/525/497
+f 515/554/526 546/564/536 545/565/537 514/527/499
+f 502/530/502 533/566/538 532/567/539 501/533/505
+f 513/528/500 544/568/540 543/569/541 512/535/507
+f 524/526/498 555/570/542 554/571/543 523/531/503
+f 500/534/506 531/572/544 530/573/545 499/539/511
+f 511/536/508 542/574/546 541/575/547 510/541/513
+f 522/532/504 553/576/548 552/577/549 521/537/509
+f 509/542/514 540/578/550 539/579/551 508/545/517
+f 520/538/510 551/580/552 550/581/553 519/543/515
+f 507/546/518 538/582/554 537/583/555 506/551/523
+f 518/544/516 549/584/556 548/558/530 517/549/521
+f 505/552/524 536/585/557 535/560/532 504/555/527
+f 527/548/520 558/557/529 557/562/534 526/553/525
+f 516/550/522 547/559/531 546/564/536 515/554/526
+f 503/529/501 534/561/533 533/566/538 502/530/502
+f 525/525/497 556/563/535 555/570/542 524/526/498
+f 514/527/499 545/565/537 544/568/540 513/528/500
+f 501/533/505 532/567/539 531/572/544 500/534/506
+f 512/535/507 543/569/541 542/574/546 511/536/508
+f 523/531/503 554/571/543 553/576/548 522/532/504
+f 499/539/511 530/573/545 529/586/558 498/540/512
+f 510/541/513 541/575/547 540/578/550 509/542/514
+f 521/537/509 552/577/549 551/580/552 520/538/510
+f 508/545/517 539/579/551 538/582/554 507/546/518
+f 519/543/515 550/581/553 549/584/556 518/544/516
+f 506/551/523 537/583/555 536/585/557 505/552/524
+f 549/584/556 580/587/559 579/588/560 548/558/530
+f 538/582/554 569/589/561 568/590/562 537/583/555
+f 558/557/529 589/591/563 588/592/564 557/562/534
+f 547/559/531 578/593/565 577/594/566 546/564/536
+f 536/585/557 567/595/567 566/596/568 535/560/532
+f 556/563/535 587/597/569 586/598/570 555/570/542
+f 545/565/537 576/599/571 575/600/572 544/568/540
+f 534/561/533 565/601/573 564/602/574 533/566/538
+f 554/571/543 585/603/575 584/604/576 553/576/548
+f 532/567/539 563/605/577 562/606/578 531/572/544
+f 543/569/541 574/607/579 573/608/580 542/574/546
+f 552/577/549 583/609/581 582/610/582 551/580/552
+f 530/573/545 561/611/583 560/612/584 529/586/558
+f 541/575/547 572/613/585 571/614/586 540/578/550
+f 550/581/553 581/615/587 580/587/559 549/584/556
+f 539/579/551 570/616/588 569/589/561 538/582/554
+f 559/556/528 590/617/589 589/591/563 558/557/529
+f 548/558/530 579/588/560 578/593/565 547/559/531
+f 537/583/555 568/590/562 567/595/567 536/585/557
+f 557/562/534 588/592/564 587/597/569 556/563/535
+f 546/564/536 577/594/566 576/599/571 545/565/537
+f 535/560/532 566/596/568 565/601/573 534/561/533
+f 555/570/542 586/598/570 585/603/575 554/571/543
+f 533/566/538 564/602/574 563/605/577 532/567/539
+f 544/568/540 575/600/572 574/607/579 543/569/541
+f 553/576/548 584/604/576 583/609/581 552/577/549
+f 531/572/544 562/606/578 561/611/583 530/573/545
+f 542/574/546 573/608/580 572/613/585 541/575/547
+f 551/580/552 582/610/582 581/615/587 550/581/553
+f 540/578/550 571/614/586 570/616/588 539/579/551
+f 581/615/587 612/618/590 611/619/591 580/587/559
+f 570/616/588 601/620/592 600/621/593 569/589/561
+f 590/617/589 621/622/594 620/623/595 589/591/563
+f 579/588/560 610/624/596 609/625/597 578/593/565
+f 568/590/562 599/626/598 598/627/599 567/595/567
+f 588/592/564 619/628/600 618/629/601 587/597/569
+f 577/594/566 608/630/602 607/631/603 576/599/571
+f 566/596/568 597/632/604 596/633/605 565/601/573
+f 586/598/570 617/634/606 616/635/607 585/603/575
+f 564/602/574 595/636/608 594/637/609 563/605/577
+f 575/600/572 606/638/610 605/639/611 574/607/579
+f 584/604/576 615/640/612 614/641/613 583/609/581
+f 562/606/578 593/642/614 592/643/615 561/611/583
+f 573/608/580 604/644/616 603/645/617 572/613/585
+f 582/610/582 613/646/618 612/618/590 581/615/587
+f 571/614/586 602/647/619 601/620/592 570/616/588
+f 580/587/559 611/619/591 610/624/596 579/588/560
+f 569/589/561 600/621/593 599/626/598 568/590/562
+f 589/591/563 620/623/595 619/628/600 588/592/564
+f 578/593/565 609/625/597 608/630/602 577/594/566
+f 567/595/567 598/627/599 597/632/604 566/596/568
+f 587/597/569 618/629/601 617/648/606 586/598/570
+f 576/599/571 607/631/603 606/638/610 575/600/572
+f 565/601/573 596/633/605 595/636/608 564/602/574
+f 585/603/575 616/635/607 615/640/612 584/604/576
+f 563/605/577 594/637/609 593/642/614 562/606/578
+f 574/607/579 605/639/611 604/644/616 573/608/580
+f 583/609/581 614/641/613 613/646/618 582/610/582
+f 561/611/583 592/643/615 591/649/620 560/612/584
+f 572/613/585 603/645/617 602/647/619 571/614/586
+f 613/646/618 644/650/621 643/651/622 612/618/590
+f 602/647/619 633/652/623 632/653/624 601/620/592
+f 611/619/591 642/654/625 641/655/626 610/624/596
+f 600/621/593 631/656/627 630/657/628 599/626/598
+f 620/658/595 651/659/629 650/660/630 619/661/600
+f 609/625/597 640/662/631 639/663/632 608/630/602
+f 598/627/599 629/664/633 628/665/634 597/632/604
+f 618/666/601 649/667/635 648/668/636 617/634/606
+f 607/631/603 638/669/637 637/670/638 606/638/610
+f 596/633/605 627/671/639 626/672/640 595/636/608
+f 616/635/607 647/673/641 646/674/642 615/640/612
+f 594/637/609 625/675/643 624/676/644 593/642/614
+f 605/639/611 636/677/645 635/678/646 604/644/616
+f 614/641/613 645/679/647 644/650/621 613/646/618
+f 592/643/615 623/680/648 622/681/649 591/649/620
+f 603/645/617 634/682/650 633/652/623 602/647/619
+f 612/618/590 643/651/622 642/654/625 611/619/591
+f 601/620/592 632/653/624 631/656/627 600/621/593
+f 621/683/594 652/684/651 651/659/629 620/658/595
+f 610/624/596 641/655/626 640/662/631 609/625/597
+f 599/626/598 630/657/628 629/664/633 598/627/599
+f 619/661/600 650/660/630 649/667/635 618/666/601
+f 608/630/602 639/663/632 638/669/637 607/631/603
+f 597/632/604 628/665/634 627/671/639 596/633/605
+f 617/634/606 648/668/636 647/673/641 616/635/607
+f 595/636/608 626/672/640 625/675/643 594/637/609
+f 606/638/610 637/670/638 636/677/645 605/639/611
+f 615/640/612 646/674/642 645/679/647 614/641/613
+f 593/642/614 624/676/644 623/680/648 592/643/615
+f 604/644/616 635/678/646 634/682/650 603/645/617
+f 645/679/647 676/685/652 675/686/653 644/650/621
+f 623/680/648 654/687/654 653/688/655 622/681/649
+f 634/682/650 665/689/656 664/690/657 633/652/623
+f 643/651/622 674/691/658 673/692/659 642/654/625
+f 632/653/624 663/693/660 662/694/661 631/656/627
+f 652/684/651 683/695/662 682/696/663 651/659/629
+f 641/655/626 672/697/664 671/698/665 640/662/631
+f 630/657/628 661/699/666 660/700/667 629/664/633
+f 650/660/630 681/701/668 680/702/669 649/667/635
+f 639/663/632 670/703/670 669/704/671 638/669/637
+f 628/665/634 659/705/672 658/706/673 627/671/639
+f 648/668/636 679/707/674 678/708/675 647/673/641
+f 626/672/640 657/709/676 656/710/677 625/675/643
+f 637/670/638 668/711/678 667/712/679 636/677/645
+f 646/674/642 677/713/680 676/685/652 645/679/647
+f 624/676/644 655/714/681 654/687/654 623/680/648
+f 635/678/646 666/715/682 665/689/656 634/682/650
+f 644/650/621 675/686/653 674/691/658 643/651/622
+f 633/652/623 664/690/657 663/693/660 632/653/624
+f 642/654/625 673/692/659 672/697/664 641/655/626
+f 631/656/627 662/694/661 661/699/666 630/657/628
+f 651/659/629 682/696/663 681/701/668 650/660/630
+f 640/662/631 671/698/665 670/703/670 639/663/632
+f 629/664/633 660/700/667 659/705/672 628/665/634
+f 649/667/635 680/702/669 679/707/674 648/668/636
+f 638/669/637 669/704/671 668/711/678 637/670/638
+f 627/671/639 658/706/673 657/709/676 626/672/640
+f 647/673/641 678/708/675 677/713/680 646/674/642
+f 625/675/643 656/710/677 655/714/681 624/676/644
+f 636/677/645 667/712/679 666/715/682 635/678/646
+f 677/713/680 708/716/683 707/717/684 676/685/652
+f 655/714/681 686/718/685 685/719/686 654/687/654
+f 666/715/682 697/720/687 696/721/688 665/689/656
+f 675/686/653 706/722/689 705/723/690 674/691/658
+f 664/690/657 695/724/691 694/725/692 663/693/660
+f 673/692/659 704/726/693 703/727/694 672/697/664
+f 662/694/661 693/728/695 692/729/696 661/699/666
+f 682/696/663 713/730/697 712/731/698 681/701/668
+f 671/698/665 702/732/699 701/733/700 670/703/670
+f 660/700/667 691/734/701 690/735/702 659/705/672
+f 680/702/669 711/736/703 710/737/704 679/707/674
+f 669/704/671 700/738/705 699/739/706 668/711/678
+f 658/706/673 689/740/707 688/741/708 657/709/676
+f 678/708/675 709/742/709 708/716/683 677/713/680
+f 656/710/677 687/743/710 686/718/685 655/714/681
+f 667/712/679 698/744/711 697/720/687 666/715/682
+f 676/685/652 707/717/684 706/722/689 675/686/653
+f 654/687/654 685/719/686 684/745/712 653/688/655
+f 665/689/656 696/721/688 695/724/691 664/690/657
+f 674/691/658 705/723/690 704/726/693 673/692/659
+f 663/693/660 694/725/692 693/728/695 662/694/661
+f 683/695/662 714/746/713 713/730/697 682/696/663
+f 672/697/664 703/727/694 702/732/699 671/698/665
+f 661/699/666 692/729/696 691/734/701 660/700/667
+f 681/701/668 712/731/698 711/736/703 680/702/669
+f 670/703/670 701/733/700 700/738/705 669/704/671
+f 659/705/672 690/735/702 689/740/707 658/706/673
+f 679/707/674 710/737/704 709/742/709 678/708/675
+f 657/709/676 688/741/708 687/743/710 656/710/677
+f 668/711/678 699/739/706 698/744/711 667/712/679
+f 709/742/709 740/747/714 739/748/715 708/716/683
+f 687/743/710 718/749/716 717/750/717 686/718/685
+f 698/744/711 729/751/718 728/752/719 697/720/687
+f 707/717/684 738/753/720 737/754/721 706/722/689
+f 685/719/686 716/755/722 715/756/723 684/745/712
+f 696/721/688 727/757/724 726/758/725 695/724/691
+f 705/723/690 736/759/726 735/760/727 704/726/693
+f 694/725/692 725/761/728 724/762/729 693/728/695
+f 714/746/713 745/763/730 744/764/731 713/730/697
+f 703/727/694 734/765/732 733/766/733 702/732/699
+f 692/729/696 723/767/734 722/768/735 691/734/701
+f 712/731/698 743/769/736 742/770/737 711/736/703
+f 701/733/700 732/771/738 731/772/739 700/738/705
+f 690/735/702 721/773/740 720/774/741 689/740/707
+f 710/737/704 741/775/742 740/747/714 709/742/709
+f 688/741/708 719/776/743 718/749/716 687/743/710
+f 699/739/706 730/777/744 729/751/718 698/744/711
+f 708/716/683 739/748/715 738/753/720 707/717/684
+f 686/718/685 717/750/717 716/755/722 685/719/686
+f 697/720/687 728/752/719 727/757/724 696/721/688
+f 706/722/689 737/754/721 736/759/726 705/723/690
+f 695/724/691 726/758/725 725/761/728 694/725/692
+f 704/726/693 735/760/727 734/765/732 703/727/694
+f 693/728/695 724/762/729 723/767/734 692/729/696
+f 713/730/697 744/764/731 743/769/736 712/731/698
+f 702/732/699 733/766/733 732/771/738 701/733/700
+f 691/734/701 722/768/735 721/773/740 690/735/702
+f 711/736/703 742/770/737 741/775/742 710/737/704
+f 700/738/705 731/772/739 730/777/744 699/739/706
+f 689/740/707 720/774/741 719/776/743 688/741/708
+f 741/775/742 772/778/745 771/779/746 740/747/714
+f 719/776/743 750/780/747 749/781/748 718/749/716
+f 730/777/744 761/782/749 760/783/750 729/751/718
+f 739/748/715 770/784/751 769/785/752 738/753/720
+f 717/750/717 748/786/753 747/787/754 716/755/722
+f 728/752/719 759/788/755 758/789/756 727/757/724
+f 737/754/721 768/790/757 767/791/758 736/759/726
+f 726/758/725 757/792/759 756/793/760 725/761/728
+f 735/760/727 766/794/761 765/795/762 734/765/732
+f 724/762/729 755/796/763 754/797/764 723/767/734
+f 744/764/731 775/798/765 774/799/766 743/769/736
+f 733/766/733 764/800/767 763/801/768 732/771/738
+f 722/768/735 753/802/769 752/803/770 721/773/740
+f 742/770/737 773/804/771 772/778/745 741/775/742
+f 731/772/739 762/805/772 761/782/749 730/777/744
+f 720/774/741 751/806/773 750/780/747 719/776/743
+f 740/747/714 771/779/746 770/784/751 739/748/715
+f 718/749/716 749/781/748 748/786/753 717/750/717
+f 729/751/718 760/783/750 759/788/755 728/752/719
+f 738/753/720 769/785/752 768/790/757 737/754/721
+f 716/755/722 747/787/754 746/807/774 715/756/723
+f 727/757/724 758/789/756 757/792/759 726/758/725
+f 736/759/726 767/791/758 766/794/761 735/760/727
+f 725/761/728 756/793/760 755/796/763 724/762/729
+f 745/763/730 776/808/775 775/798/765 744/764/731
+f 734/765/732 765/795/762 764/800/767 733/766/733
+f 723/767/734 754/797/764 753/802/769 722/768/735
+f 743/769/736 774/799/766 773/804/771 742/770/737
+f 732/771/738 763/801/768 762/805/772 731/772/739
+f 721/773/740 752/803/770 751/806/773 720/774/741
+f 773/804/771 804/809/776 803/810/777 772/778/745
+f 762/805/772 793/811/778 792/812/779 761/782/749
+f 751/806/773 782/813/780 781/814/781 750/780/747
+f 771/779/746 802/815/782 801/816/783 770/784/751
+f 749/781/748 780/817/784 779/818/785 748/786/753
+f 760/783/750 791/819/786 790/820/787 759/788/755
+f 769/785/752 800/821/788 799/822/789 768/790/757
+f 747/787/754 778/823/790 777/824/791 746/807/774
+f 758/789/756 789/825/792 788/826/793 757/792/759
+f 767/791/758 798/827/794 797/828/795 766/794/761
+f 756/793/760 787/829/796 786/830/797 755/796/763
+f 776/808/775 807/831/798 806/832/799 775/798/765
+f 765/795/762 796/833/800 795/834/801 764/800/767
+f 754/797/764 785/835/802 784/836/803 753/802/769
+f 774/799/766 805/837/804 804/809/776 773/804/771
+f 763/801/768 794/838/805 793/811/778 762/805/772
+f 752/803/770 783/839/806 782/813/780 751/806/773
+f 772/778/745 803/810/777 802/815/782 771/779/746
+f 750/780/747 781/814/781 780/817/784 749/781/748
+f 761/782/749 792/812/779 791/819/786 760/783/750
+f 770/784/751 801/816/783 800/821/788 769/785/752
+f 748/786/753 779/818/785 778/823/790 747/787/754
+f 759/788/755 790/820/787 789/825/792 758/789/756
+f 768/790/757 799/822/789 798/827/794 767/791/758
+f 757/792/759 788/826/793 787/829/796 756/793/760
+f 766/794/761 797/828/795 796/833/800 765/795/762
+f 755/796/763 786/830/797 785/835/802 754/797/764
+f 775/798/765 806/832/799 805/837/804 774/799/766
+f 764/800/767 795/834/801 794/838/805 763/801/768
+f 753/802/769 784/836/803 783/839/806 752/803/770
+f 805/837/804 836/840/807 835/841/808 804/809/776
+f 794/838/805 825/842/809 824/843/810 793/811/778
+f 783/839/806 814/844/811 813/845/812 782/813/780
+f 803/810/777 834/846/813 833/847/814 802/815/782
+f 781/814/781 812/848/815 811/849/816 780/817/784
+f 792/812/779 823/850/817 822/851/818 791/819/786
+f 801/816/783 832/852/819 831/853/820 800/821/788
+f 779/818/785 810/854/821 809/855/822 778/823/790
+f 790/820/787 821/856/823 820/857/824 789/825/792
+f 799/822/789 830/858/825 829/859/826 798/827/794
+f 788/826/793 819/860/827 818/861/828 787/829/796
+f 797/828/795 828/862/829 827/863/830 796/833/800
+f 786/830/797 817/864/831 816/865/832 785/835/802
+f 806/832/799 837/866/833 836/840/807 805/837/804
+f 795/834/801 826/867/834 825/842/809 794/838/805
+f 784/836/803 815/868/835 814/844/811 783/839/806
+f 804/809/776 835/841/808 834/846/813 803/810/777
+f 793/811/778 824/843/810 823/850/817 792/812/779
+f 782/813/780 813/845/812 812/848/815 781/814/781
+f 802/815/782 833/847/814 832/852/819 801/816/783
+f 780/817/784 811/849/816 810/854/821 779/818/785
+f 791/819/786 822/851/818 821/856/823 790/820/787
+f 800/821/788 831/853/820 830/858/825 799/822/789
+f 778/823/790 809/855/822 808/869/836 777/824/791
+f 789/825/792 820/857/824 819/860/827 788/826/793
+f 798/827/794 829/859/826 828/862/829 797/828/795
+f 787/829/796 818/861/828 817/864/831 786/830/797
+f 807/831/798 838/870/837 837/866/833 806/832/799
+f 796/833/800 827/863/830 826/867/834 795/834/801
+f 785/835/802 816/865/832 815/868/835 784/836/803
+f 837/866/833 868/871/838 867/872/839 836/840/807
+f 826/867/834 857/873/840 856/874/841 825/842/809
+f 815/868/835 846/875/842 845/876/843 814/844/811
+f 835/841/808 866/877/844 865/878/845 834/846/813
+f 824/843/810 855/879/846 854/880/847 823/850/817
+f 813/845/812 844/881/848 843/882/849 812/848/815
+f 833/847/814 864/883/850 863/884/851 832/852/819
+f 811/849/816 842/885/852 841/886/853 810/854/821
+f 822/851/818 853/887/854 852/888/855 821/856/823
+f 831/853/820 862/889/856 861/890/857 830/858/825
+f 809/855/822 840/891/858 839/892/859 808/869/836
+f 820/857/824 851/893/860 850/894/861 819/860/827
+f 829/859/826 860/895/862 859/896/863 828/862/829
+f 818/861/828 849/897/864 848/898/865 817/864/831
+f 838/870/837 869/899/866 868/871/838 837/866/833
+f 827/863/830 858/900/867 857/873/840 826/867/834
+f 816/865/832 847/901/868 846/875/842 815/868/835
+f 836/840/807 867/872/839 866/877/844 835/841/808
+f 825/842/809 856/874/841 855/879/846 824/843/810
+f 814/844/811 845/876/843 844/881/848 813/845/812
+f 834/846/813 865/878/845 864/883/850 833/847/814
+f 812/848/815 843/882/849 842/885/852 811/849/816
+f 823/850/817 854/880/847 853/887/854 822/851/818
+f 832/852/819 863/884/851 862/889/856 831/853/820
+f 810/854/821 841/886/853 840/891/858 809/855/822
+f 821/856/823 852/888/855 851/893/860 820/857/824
+f 830/858/825 861/890/857 860/895/862 829/859/826
+f 819/860/827 850/894/861 849/897/864 818/861/828
+f 828/862/829 859/896/863 858/900/867 827/863/830
+f 817/864/831 848/898/865 847/901/868 816/865/832
+f 869/899/866 901/902/869 900/903/870 868/871/838
+f 858/900/867 890/904/871 889/905/872 857/873/840
+f 847/901/868 879/906/873 878/907/874 846/875/842
+f 867/872/839 899/908/875 898/909/876 866/877/844
+f 856/874/841 888/910/877 887/911/878 855/879/846
+f 845/876/843 877/912/879 876/913/880 844/881/848
+f 865/878/845 897/914/881 896/915/882 864/883/850
+f 843/882/849 875/916/883 874/917/884 842/885/852
+f 854/880/847 886/918/885 885/919/886 853/887/854
+f 863/884/851 895/920/887 894/921/888 862/889/856
+f 841/886/853 873/922/889 872/923/890 840/891/858
+f 852/888/855 884/924/891 883/925/892 851/893/860
+f 861/890/857 893/926/893 892/927/894 860/895/862
+f 850/894/861 882/928/895 881/929/896 849/897/864
+f 859/896/863 891/930/897 890/904/871 858/900/867
+f 848/898/865 880/931/898 879/906/873 847/901/868
+f 868/871/838 900/903/870 899/908/875 867/872/839
+f 857/873/840 889/905/872 888/910/877 856/874/841
+f 846/875/842 878/907/874 877/912/879 845/876/843
+f 866/877/844 898/909/876 897/914/881 865/878/845
+f 855/879/846 887/911/878 886/918/885 854/880/847
+f 844/881/848 876/913/880 875/916/883 843/882/849
+f 864/883/850 896/915/882 895/920/887 863/884/851
+f 842/885/852 874/917/884 873/922/889 841/886/853
+f 853/887/854 885/919/886 884/924/891 852/888/855
+f 862/889/856 894/921/888 893/926/893 861/890/857
+f 840/891/858 872/923/890 871/932/899 839/892/859
+f 851/893/860 883/925/892 882/928/895 850/894/861
+f 860/895/862 892/927/894 891/930/897 859/896/863
+f 849/897/864 881/929/896 880/931/898 848/898/865
+f 891/930/897 922/933/900 921/934/901 890/904/871
+f 880/931/898 911/935/902 910/936/903 879/906/873
+f 900/903/870 931/937/904 930/938/905 899/908/875
+f 889/905/872 920/939/906 919/940/907 888/910/877
+f 878/907/874 909/941/908 908/942/909 877/912/879
+f 898/909/876 929/943/910 928/944/911 897/914/881
+f 887/911/878 918/945/912 917/946/913 886/918/885
+f 876/913/880 907/947/914 906/948/915 875/916/883
+f 896/915/882 927/949/916 926/950/917 895/920/887
+f 874/917/884 905/951/918 904/952/919 873/922/889
+f 885/919/886 916/953/920 915/954/921 884/924/891
+f 894/921/888 925/955/922 924/956/923 893/926/893
+f 872/923/890 903/957/924 902/958/925 871/932/899
+f 883/925/892 914/959/926 913/960/927 882/928/895
+f 892/927/894 923/961/928 922/933/900 891/930/897
+f 881/929/896 912/962/929 911/935/902 880/931/898
+f 901/902/869 932/963/930 931/937/904 900/903/870
+f 890/904/871 921/934/901 920/939/906 889/905/872
+f 879/906/873 910/936/903 909/941/908 878/907/874
+f 899/908/875 930/938/905 929/943/910 898/909/876
+f 888/910/877 919/940/907 918/945/912 887/911/878
+f 877/912/879 908/942/909 907/947/914 876/913/880
+f 897/914/881 928/944/911 927/949/916 896/915/882
+f 875/916/883 906/948/915 905/951/918 874/917/884
+f 886/918/885 917/946/913 916/953/920 885/919/886
+f 895/920/887 926/950/917 925/955/922 894/921/888
+f 873/922/889 904/952/919 903/957/924 872/923/890
+f 884/924/891 915/954/921 914/959/926 883/925/892
+f 893/926/893 924/956/923 923/961/928 892/927/894
+f 882/928/895 913/960/927 912/962/929 881/929/896
+f 923/961/928 954/964/931 953/965/932 922/933/900
+f 912/962/929 943/966/933 942/967/934 911/935/902
+f 932/963/930 963/968/935 962/969/936 931/937/904
+f 921/934/901 952/970/937 951/971/938 920/939/906
+f 910/936/903 941/972/939 940/973/940 909/941/908
+f 930/938/905 961/974/941 960/975/942 929/943/910
+f 919/940/907 950/976/943 949/977/944 918/945/912
+f 908/942/909 939/978/945 938/979/946 907/947/914
+f 928/944/911 959/980/947 958/981/948 927/949/916
+f 906/948/915 937/982/949 936/983/950 905/951/918
+f 917/946/913 948/984/951 947/985/952 916/953/920
+f 926/950/917 957/986/953 956/987/954 925/955/922
+f 904/952/919 935/988/955 934/989/956 903/957/924
+f 915/954/921 946/990/957 945/991/958 914/959/926
+f 924/956/923 955/992/959 954/964/931 923/961/928
+f 913/960/927 944/993/960 943/966/933 912/962/929
+f 922/933/900 953/965/932 952/970/937 921/934/901
+f 911/935/902 942/967/934 941/972/939 910/936/903
+f 931/937/904 962/969/936 961/974/941 930/938/905
+f 920/939/906 951/971/938 950/976/943 919/940/907
+f 909/941/908 940/973/940 939/978/945 908/942/909
+f 929/943/910 960/975/942 959/980/947 928/944/911
+f 918/945/912 949/977/944 948/984/951 917/946/913
+f 907/947/914 938/979/946 937/982/949 906/948/915
+f 927/949/916 958/981/948 957/986/953 926/950/917
+f 905/951/918 936/983/950 935/988/955 904/952/919
+f 916/953/920 947/985/952 946/990/957 915/954/921
+f 925/955/922 956/987/954 955/992/959 924/956/923
+f 903/957/924 934/989/956 933/994/961 902/958/925
+f 914/959/926 945/991/958 944/993/960 913/960/927
+f 955/992/959 986/995/962 985/996/963 954/964/931
+f 944/993/960 975/997/964 974/998/965 943/966/933
+f 953/965/932 984/999/966 983/1000/967 952/970/937
+f 942/967/934 973/1001/968 972/1002/969 941/972/939
+f 962/969/936 993/1003/970 992/1004/971 961/974/941
+f 951/971/938 982/1005/972 981/1006/973 950/976/943
+f 940/973/940 971/1007/974 970/1008/975 939/978/945
+f 960/975/942 991/1009/976 990/1010/977 959/980/947
+f 949/977/944 980/1011/978 979/1012/979 948/984/951
+f 938/979/946 969/1013/980 968/1014/981 937/982/949
+f 958/981/948 989/1015/982 988/1016/983 957/986/953
+f 936/983/950 967/1017/984 966/1018/985 935/988/955
+f 947/985/952 978/1019/986 977/1020/987 946/990/957
+f 956/987/954 987/1021/988 986/995/962 955/992/959
+f 934/989/956 965/1022/989 964/1023/990 933/994/961
+f 945/991/958 976/1024/991 975/997/964 944/993/960
+f 954/964/931 985/996/963 984/999/966 953/965/932
+f 943/966/933 974/998/965 973/1001/968 942/967/934
+f 963/968/935 994/1025/992 993/1003/970 962/969/936
+f 952/970/937 983/1000/967 982/1005/972 951/971/938
+f 941/972/939 972/1002/969 971/1007/974 940/973/940
+f 961/974/941 992/1004/971 991/1009/976 960/975/942
+f 950/976/943 981/1006/973 980/1011/978 949/977/944
+f 939/978/945 970/1008/975 969/1013/980 938/979/946
+f 959/980/947 990/1010/977 989/1015/982 958/981/948
+f 937/982/949 968/1014/981 967/1017/984 936/983/950
+f 948/984/951 979/1012/979 978/1019/986 947/985/952
+f 957/986/953 988/1016/983 987/1021/988 956/987/954
+f 935/988/955 966/1018/985 965/1022/989 934/989/956
+f 946/990/957 977/1020/987 976/1024/991 945/991/958
+f 1/8/8 32/7/7 870/1026/993
+f 218/1027/994 62/97/22 31/1028/21
+f 32/7/7 63/96/92 870/1026/993
+f 218/1027/994 93/98/93 62/97/22
+f 63/96/92 94/115/103 870/1026/993
+f 218/1027/994 124/128/110 93/98/93
+f 94/115/103 125/182/154 870/1026/993
+f 218/1027/994 155/183/155 124/128/110
+f 125/182/154 156/199/171 870/1026/993
+f 218/1027/994 186/206/178 155/183/155
+f 156/199/171 187/244/216 870/1026/993
+f 218/1027/994 217/245/217 186/206/178
+f 187/244/216 219/267/239 870/1026/993
+f 218/1027/994 249/274/246 217/245/217
+f 219/267/239 250/307/279 870/1026/993
+f 218/1027/994 280/277/249 249/274/246
+f 218/1027/994 311/338/310 280/277/249
+f 250/307/279 281/333/305 870/1026/993
+f 281/333/305 312/369/341 870/1026/993
+f 218/1027/994 342/343/315 311/338/310
+f 312/369/341 343/398/370 870/1026/993
+f 218/1027/994 373/400/372 342/343/315
+f 343/398/370 374/404/376 870/1026/993
+f 218/1027/994 404/411/383 373/400/372
+f 374/404/376 405/461/433 870/1026/993
+f 218/1027/994 435/462/434 404/411/383
+f 405/461/433 436/472/444 870/1026/993
+f 218/1027/994 466/479/451 435/462/434
+f 436/472/444 467/523/495 870/1026/993
+f 218/1027/994 497/524/496 466/479/451
+f 467/523/495 498/540/512 870/1026/993
+f 218/1027/994 528/547/519 497/524/496
+f 498/540/512 529/586/558 870/1026/993
+f 218/1027/994 559/556/528 528/547/519
+f 218/1027/994 590/617/589 559/556/528
+f 529/586/558 560/612/584 870/1026/993
+f 560/612/584 591/649/620 870/1026/993
+f 218/1027/994 621/622/594 590/617/589
+f 591/649/620 622/681/649 870/1026/993
+f 218/1027/994 652/1029/651 621/622/594
+f 622/681/649 653/688/655 870/1026/993
+f 218/1027/994 683/1030/662 652/1029/651
+f 653/688/655 684/745/712 870/1026/993
+f 218/1027/994 714/1031/713 683/1030/662
+f 684/745/712 715/756/723 870/1026/993
+f 218/1027/994 745/1032/730 714/1031/713
+f 715/756/723 746/807/774 870/1026/993
+f 218/1027/994 776/1033/775 745/1032/730
+f 746/807/774 777/824/791 870/1026/993
+f 218/1027/994 807/1034/798 776/1033/775
+f 777/824/791 808/869/836 870/1026/993
+f 218/1027/994 838/1035/837 807/1034/798
+f 808/869/836 839/892/859 870/1026/993
+f 218/1027/994 869/1036/866 838/1035/837
+f 839/892/859 871/932/899 870/1026/993
+f 218/1027/994 901/1037/869 869/1036/866
+f 218/1027/994 932/1038/930 901/1037/869
+f 871/932/899 902/958/925 870/1026/993
+f 902/958/925 933/994/961 870/1026/993
+f 218/1027/994 963/1039/935 932/1038/930
+f 933/994/961 964/1023/990 870/1026/993
+f 218/1027/994 994/1040/992 963/1039/935
+f 987/1021/988 24/1/1 23/4/4 986/995/962
+f 965/1022/989 2/5/5 1/8/8 964/1023/990
+f 976/1024/991 13/9/9 12/12/12 975/997/964
+f 985/996/963 22/13/13 21/16/16 984/999/966
+f 974/998/965 11/17/17 10/20/20 973/1001/968
+f 994/1025/992 31/21/21 30/24/24 993/1003/970
+f 983/1000/967 20/25/25 19/28/28 982/1005/972
+f 972/1002/969 9/29/29 8/32/32 971/1007/974
+f 992/1004/971 29/33/33 28/36/36 991/1009/976
+f 981/1006/973 18/37/37 17/40/40 980/1011/978
+f 970/1008/975 7/41/41 6/44/44 969/1013/980
+f 990/1010/977 27/45/45 26/48/48 989/1015/982
+f 968/1014/981 5/49/49 4/52/52 967/1017/984
+f 979/1012/979 16/53/53 15/56/56 978/1019/986
+f 988/1016/983 25/57/57 24/1/1 987/1021/988
+f 966/1018/985 3/59/59 2/5/5 965/1022/989
+f 977/1020/987 14/61/61 13/9/9 976/1024/991
+f 986/995/962 23/4/4 22/13/13 985/996/963
+f 964/1023/990 1/8/8 870/1026/993
+f 975/997/964 12/12/12 11/17/17 974/998/965
+f 218/1027/994 31/1028/21 994/1040/992
+f 984/999/966 21/16/16 20/25/25 983/1000/967
+f 973/1001/968 10/20/20 9/29/29 972/1002/969
+f 993/1003/970 30/24/24 29/33/33 992/1004/971
+f 982/1005/972 19/28/28 18/37/37 981/1006/973
+f 971/1007/974 8/32/32 7/41/41 970/1008/975
+f 991/1009/976 28/36/36 27/45/45 990/1010/977
+f 980/1011/978 17/40/40 16/53/53 979/1012/979
+f 969/1013/980 6/44/44 5/49/49 968/1014/981
+f 989/1015/982 26/48/48 25/57/57 988/1016/983
+f 967/1017/984 4/52/52 3/59/59 966/1018/985
+f 978/1019/986 15/56/56 14/61/61 977/1020/987
diff --git a/tests/manual/planets-qml/networkcontroller.cpp b/tests/manual/planets-qml/networkcontroller.cpp
new file mode 100644
index 000000000..6267d8275
--- /dev/null
+++ b/tests/manual/planets-qml/networkcontroller.cpp
@@ -0,0 +1,64 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "networkcontroller.h"
+
+NetworkController::NetworkController(QObject *parent) :
+ QObject(parent)
+{
+ QObject::connect(&m_server, &QTcpServer::newConnection, this, &NetworkController::newConnection);
+
+ if (!m_server.listen(QHostAddress::Any, 8080)) {
+ qDebug() << "Failed to run http server";
+ }
+}
+
+void NetworkController::newConnection()
+{
+ QTcpSocket *socket = m_server.nextPendingConnection();
+
+ if (!socket)
+ return;
+
+ QObject::connect(socket, &QAbstractSocket::disconnected, this, &NetworkController::disconnected);
+ QObject::connect(socket, &QIODevice::readyRead, this, &NetworkController::readyRead);
+}
+
+void NetworkController::disconnected()
+{
+ QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
+ if (!socket)
+ return;
+
+ socket->disconnect();
+ socket->deleteLater();
+}
+
+void NetworkController::readyRead()
+{
+ QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());
+ if (!socket || socket->state() == QTcpSocket::ClosingState)
+ return;
+
+ QString requestData = socket->readAll();
+ QStringList list = requestData.split(' ');
+ QString path = list[1];
+ list = path.split('/');
+
+ QByteArray reply;
+ if (list.count() == 3) {
+ socket->write("HTTP/1.1 200 OK\r\n");
+ reply = QStringLiteral("Command accepted: %1 %2").arg(list[1], list[2]).toUtf8();
+ emit commandAccepted(list[1], list[2]);
+ } else {
+ socket->write("HTTP/1.1 404 Not Found\r\n");
+ reply = "Command rejected";
+ }
+
+ socket->write("Content-Type: text/plain\r\n");
+ socket->write(QStringLiteral("Content-Length: %1\r\n").arg(reply.size()).toUtf8());
+ socket->write("Connection: close\r\n");
+ socket->write("\r\n");
+ socket->write(reply);
+ socket->disconnectFromHost();
+}
diff --git a/tests/manual/planets-qml/networkcontroller.h b/tests/manual/planets-qml/networkcontroller.h
new file mode 100644
index 000000000..90712025e
--- /dev/null
+++ b/tests/manual/planets-qml/networkcontroller.h
@@ -0,0 +1,30 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef NETWORKCONTROLLER_H
+#define NETWORKCONTROLLER_H
+
+#include <QObject>
+#include <QTcpServer>
+#include <QTcpSocket>
+
+class NetworkController : public QObject
+{
+ Q_OBJECT
+
+public:
+ explicit NetworkController(QObject *parent = 0);
+
+private:
+ QTcpServer m_server;
+
+private slots:
+ void newConnection();
+ void disconnected();
+ void readyRead();
+
+signals:
+ void commandAccepted(QString command, QString value);
+};
+
+#endif // NETWORKCONTROLLER_H
diff --git a/tests/manual/planets-qml/planets-qml-images.qrc b/tests/manual/planets-qml/planets-qml-images.qrc
new file mode 100644
index 000000000..6b6b30ec4
--- /dev/null
+++ b/tests/manual/planets-qml/planets-qml-images.qrc
@@ -0,0 +1,35 @@
+<RCC>
+ <qresource prefix="/">
+ <file>images/nasa/uranusringcolortrans.png</file>
+ <file>images/solarsystemscope/earthcloudmapcolortrans.png</file>
+ <file>images/solarsystemscope/earthcloudmapspec.jpg</file>
+ <file>images/solarsystemscope/earthmap2k.jpg</file>
+ <file>images/solarsystemscope/earthnormal2k.jpg</file>
+ <file>images/solarsystemscope/earthspec2k.jpg</file>
+ <file>images/solarsystemscope/galaxy_starfield.jpg</file>
+ <file>images/solarsystemscope/jupitermap.jpg</file>
+ <file>images/solarsystemscope/license.txt</file>
+ <file>images/solarsystemscope/marsmap2k.jpg</file>
+ <file>images/solarsystemscope/marsnormal2k.jpg</file>
+ <file>images/solarsystemscope/mercurymap.jpg</file>
+ <file>images/solarsystemscope/mercurynormal.jpg</file>
+ <file>images/solarsystemscope/moonmap2k.jpg</file>
+ <file>images/solarsystemscope/moonnormal2k.jpg</file>
+ <file>images/solarsystemscope/neptunemap.jpg</file>
+ <file>images/solarsystemscope/saturnmap.jpg</file>
+ <file>images/solarsystemscope/saturnringcolortrans.png</file>
+ <file>images/solarsystemscope/sunmap.jpg</file>
+ <file>images/solarsystemscope/uranusmap.jpg</file>
+ <file>images/solarsystemscope/venusmap.jpg</file>
+ <file>images/solarsystemscope/venusnormal.jpg</file>
+ <file>images/earth.png</file>
+ <file>images/jupiter.png</file>
+ <file>images/mars.png</file>
+ <file>images/mercury.png</file>
+ <file>images/saturn.png</file>
+ <file>images/sun.png</file>
+ <file>images/uranus.png</file>
+ <file>images/venus.png</file>
+ <file>images/neptune.png</file>
+ </qresource>
+</RCC>
diff --git a/tests/manual/planets-qml/planets-qml.qrc b/tests/manual/planets-qml/planets-qml.qrc
new file mode 100644
index 000000000..d799fbdf0
--- /dev/null
+++ b/tests/manual/planets-qml/planets-qml.qrc
@@ -0,0 +1,54 @@
+<RCC>
+ <qresource prefix="/">
+ <file>SolarSystem.qml</file>
+ <file>PlanetsMain.qml</file>
+ <file>PlanetButton.qml</file>
+ <file>InfoSheet.qml</file>
+ <file>StyledSlider.qml</file>
+ <file>FpsDisplay.qml</file>
+ <file>Planet.qml</file>
+ <file>Ring.qml</file>
+ <file>PlanetsLight.qml</file>
+ <file>SunEffect.qml</file>
+ <file>PlanetEffect.qml</file>
+ <file>ShadowEffect.qml</file>
+ <file>PlanetFrameGraph.qml</file>
+ <file>PlanetMaterial.qml</file>
+ <file>planets.js</file>
+ <file>meshes/starfield.obj</file>
+ <file>meshes/ring.obj</file>
+ <file>shaders/gl3/sun.frag</file>
+ <file>shaders/gl3/sun.vert</file>
+ <file>shaders/gl3/shadowmap.frag</file>
+ <file>shaders/gl3/shadowmap.vert</file>
+ <file>shaders/gl3/planetD.frag</file>
+ <file>shaders/gl3/planetD.vert</file>
+ <file>shaders/gl3/planetDB.frag</file>
+ <file>shaders/gl3/planetDB.vert</file>
+ <file>shaders/gl3/planetDS.frag</file>
+ <file>shaders/gl3/planetDSB.frag</file>
+ <file>shaders/es2/sun.frag</file>
+ <file>shaders/es2/sun.vert</file>
+ <file>shaders/es2/planetD.frag</file>
+ <file>shaders/es2/planetD.vert</file>
+ <file>shaders/es2/planetDB.frag</file>
+ <file>shaders/es2/planetDB.vert</file>
+ <file>shaders/es2/planetDS.frag</file>
+ <file>shaders/es2/planetDSB.frag</file>
+ <file>shaders/gl3/planetDShadow.frag</file>
+ <file>shaders/gl3/planetDShadow.vert</file>
+ <file>AppleTVInput.qml</file>
+ <file>shaders/rhi/planetD.frag</file>
+ <file>shaders/rhi/planetD.vert</file>
+ <file>shaders/rhi/planetDB.frag</file>
+ <file>shaders/rhi/planetDB.vert</file>
+ <file>shaders/rhi/planetDS.frag</file>
+ <file>shaders/rhi/planetDSB.frag</file>
+ <file>shaders/rhi/planetDShadow.frag</file>
+ <file>shaders/rhi/planetDShadow.vert</file>
+ <file>shaders/rhi/shadowmap.frag</file>
+ <file>shaders/rhi/shadowmap.vert</file>
+ <file>shaders/rhi/sun.frag</file>
+ <file>shaders/rhi/sun.vert</file>
+ </qresource>
+</RCC>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..500276f67
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,56 @@
+{
+ "images" : [
+ {
+ "size" : "24x24",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "notificationCenter",
+ "subtype" : "38mm"
+ },
+ {
+ "size" : "27.5x27.5",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "notificationCenter",
+ "subtype" : "42mm"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "watch",
+ "role" : "companionSettings",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "watch",
+ "filename" : "home_icon.png",
+ "scale" : "2x",
+ "role" : "appLauncher",
+ "subtype" : "38mm"
+ },
+ {
+ "size" : "86x86",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "quickLook",
+ "subtype" : "38mm"
+ },
+ {
+ "size" : "98x98",
+ "idiom" : "watch",
+ "scale" : "2x",
+ "role" : "quickLook",
+ "subtype" : "42mm"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/home_icon.png b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/home_icon.png
new file mode 100644
index 000000000..d00a93632
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/AppIcon.appiconset/home_icon.png
Binary files differ
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/Contents.json
new file mode 100644
index 000000000..da4a164c9
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Base.lproj/Interface.storyboard b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Base.lproj/Interface.storyboard
new file mode 100644
index 000000000..d7e9194b4
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Base.lproj/Interface.storyboard
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder.WatchKit.Storyboard" version="3.0" toolsVersion="11535.1" systemVersion="16A323" targetRuntime="watchKit" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="AgC-eL-Hgc">
+ <device id="watch38" orientation="portrait">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <deployment identifier="watchOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11523"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBWatchKitPlugin" version="11508"/>
+ </dependencies>
+ <scenes>
+ <!--Interface Controller-->
+ <scene sceneID="aou-V4-d1y">
+ <objects>
+ <controller id="AgC-eL-Hgc" customClass="InterfaceController">
+ <items>
+ <label width="1" alignment="left" text="127.0.0.1:8080" numberOfLines="2" id="9HQ-YC-P4i"/>
+ <picker width="1" height="64" alignment="left" focusStyle="stack" id="ABv-8d-yEr">
+ <connections>
+ <action selector="selectedPlanetChanged:" destination="AgC-eL-Hgc" id="OU5-km-9HE"/>
+ </connections>
+ </picker>
+ <label width="1" alignment="left" text="Rotation Speed" id="xoA-aj-W51"/>
+ <slider width="1" alignment="left" value="5" minimum="1" maximum="10" steps="10" id="HWA-3V-ha8">
+ <connections>
+ <action selector="rotationSpeedChanged:" destination="AgC-eL-Hgc" id="OGB-04-Eac"/>
+ </connections>
+ </slider>
+ <label width="1" alignment="left" text="Viewing Distance" id="mHk-AK-qJi"/>
+ <slider width="1" alignment="left" value="5" minimum="1" maximum="10" steps="10" id="ETL-Aj-Rbd">
+ <connections>
+ <action selector="viewingDistanceChanged:" destination="AgC-eL-Hgc" id="05F-9h-WCb"/>
+ </connections>
+ </slider>
+ <label width="1" height="18" alignment="left" text="Planet Size" id="w4k-sT-H0q"/>
+ <slider width="1" alignment="left" value="5" minimum="1" maximum="10" steps="10" id="ohR-g5-Xt1">
+ <connections>
+ <action selector="planetSizeChanged:" destination="AgC-eL-Hgc" id="O44-Jy-fTe"/>
+ </connections>
+ </slider>
+ </items>
+ <connections>
+ <outlet property="hostLabel" destination="9HQ-YC-P4i" id="hFZ-iv-58q"/>
+ <outlet property="planetPicker" destination="ABv-8d-yEr" id="sNX-zW-lRr"/>
+ <outlet property="planetSizeSlider" destination="ohR-g5-Xt1" id="RTf-au-sBa"/>
+ <outlet property="rotationSpeedSlider" destination="HWA-3V-ha8" id="E3m-En-Rle"/>
+ <outlet property="viewingDistanceSlider" destination="ETL-Aj-Rbd" id="5rO-7Q-MYm"/>
+ </connections>
+ </controller>
+ </objects>
+ </scene>
+ </scenes>
+</document>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Info.plist b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Info.plist
new file mode 100644
index 000000000..97f7a59a2
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit App/Info.plist
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>PlanetsClient WatchKit App</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ </array>
+ <key>WKCompanionAppBundleIdentifier</key>
+ <string>Qt.PlanetsClient</string>
+ <key>WKWatchKitApp</key>
+ <true/>
+</dict>
+</plist>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json
new file mode 100644
index 000000000..9be9adbf7
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{130,145}",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{146,165}",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json
new file mode 100644
index 000000000..2eca9a1f4
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Contents.json
@@ -0,0 +1,28 @@
+{
+ "assets" : [
+ {
+ "idiom" : "watch",
+ "filename" : "Circular.imageset",
+ "role" : "circular"
+ },
+ {
+ "idiom" : "watch",
+ "filename" : "Extra Large.imageset",
+ "role" : "extra-large"
+ },
+ {
+ "idiom" : "watch",
+ "filename" : "Modular.imageset",
+ "role" : "modular"
+ },
+ {
+ "idiom" : "watch",
+ "filename" : "Utilitarian.imageset",
+ "role" : "utilitarian"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json
new file mode 100644
index 000000000..9be9adbf7
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{130,145}",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{146,165}",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json
new file mode 100644
index 000000000..9be9adbf7
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{130,145}",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{146,165}",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json
new file mode 100644
index 000000000..9be9adbf7
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+ "images" : [
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{130,145}",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "watch",
+ "screenWidth" : "{146,165}",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.h b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.h
new file mode 100644
index 000000000..dfd9b7fde
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.h
@@ -0,0 +1,8 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import <WatchKit/WatchKit.h>
+
+@interface ExtensionDelegate : NSObject <WKExtensionDelegate>
+
+@end
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.m b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.m
new file mode 100644
index 000000000..014c5fa40
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/ExtensionDelegate.m
@@ -0,0 +1,48 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import "ExtensionDelegate.h"
+
+@implementation ExtensionDelegate
+
+- (void)applicationDidFinishLaunching {
+ // Perform any final initialization of your application.
+}
+
+- (void)applicationDidBecomeActive {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+- (void)applicationWillResignActive {
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, etc.
+}
+
+- (void)handleBackgroundTasks:(NSSet<WKRefreshBackgroundTask *> *)backgroundTasks {
+ // Sent when the system needs to launch the application in the background to process tasks. Tasks arrive in a set, so loop through and process each one.
+ for (WKRefreshBackgroundTask * task in backgroundTasks) {
+ // Check the Class of each task to decide how to process it
+ if ([task isKindOfClass:[WKApplicationRefreshBackgroundTask class]]) {
+ // Be sure to complete the background task once you’re done.
+ WKApplicationRefreshBackgroundTask *backgroundTask = (WKApplicationRefreshBackgroundTask*)task;
+ [backgroundTask setTaskCompleted];
+ } else if ([task isKindOfClass:[WKSnapshotRefreshBackgroundTask class]]) {
+ // Snapshot tasks have a unique completion call, make sure to set your expiration date
+ WKSnapshotRefreshBackgroundTask *snapshotTask = (WKSnapshotRefreshBackgroundTask*)task;
+ [snapshotTask setTaskCompletedWithDefaultStateRestored:YES estimatedSnapshotExpiration:[NSDate distantFuture] userInfo:nil];
+ } else if ([task isKindOfClass:[WKWatchConnectivityRefreshBackgroundTask class]]) {
+ // Be sure to complete the background task once you’re done.
+ WKWatchConnectivityRefreshBackgroundTask *backgroundTask = (WKWatchConnectivityRefreshBackgroundTask*)task;
+ [backgroundTask setTaskCompleted];
+ } else if ([task isKindOfClass:[WKURLSessionRefreshBackgroundTask class]]) {
+ // Be sure to complete the background task once you’re done.
+ WKURLSessionRefreshBackgroundTask *backgroundTask = (WKURLSessionRefreshBackgroundTask*)task;
+ [backgroundTask setTaskCompleted];
+ } else {
+ // make sure to complete unhandled task types
+ [task setTaskCompleted];
+ }
+ }
+}
+
+@end
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Info.plist b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Info.plist
new file mode 100644
index 000000000..ece2677b1
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/Info.plist
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleDisplayName</key>
+ <string>PlanetsClient WatchKit Extension</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>XPC!</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>NSExtension</key>
+ <dict>
+ <key>NSExtensionAttributes</key>
+ <dict>
+ <key>WKAppBundleIdentifier</key>
+ <string>Qt.PlanetsClient.watchkitapp</string>
+ </dict>
+ <key>NSExtensionPointIdentifier</key>
+ <string>com.apple.watchkit</string>
+ </dict>
+ <key>WKExtensionDelegateClassName</key>
+ <string>ExtensionDelegate</string>
+</dict>
+</plist>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.h b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.h
new file mode 100644
index 000000000..0e11fa23d
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.h
@@ -0,0 +1,21 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import <WatchKit/WatchKit.h>
+#import <Foundation/Foundation.h>
+#import <WatchConnectivity/WatchConnectivity.h>
+
+@interface InterfaceController : WKInterfaceController
+
+@property (nonatomic, copy) NSString *host;
+@property (nonatomic, copy) NSNumber *port;
+@property (nonatomic, copy) NSArray *planets;
+@property (nonatomic, assign) float minimumValue;
+@property (nonatomic, assign) float maximumValue;
+@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceLabel *hostLabel;
+@property (unsafe_unretained, nonatomic) IBOutlet WKInterfacePicker *planetPicker;
+@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceSlider *rotationSpeedSlider;
+@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceSlider *viewingDistanceSlider;
+@property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceSlider *planetSizeSlider;
+
+@end
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.m b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.m
new file mode 100644
index 000000000..77f052002
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient WatchKit Extension/InterfaceController.m
@@ -0,0 +1,146 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import "InterfaceController.h"
+
+@interface InterfaceController() <WCSessionDelegate>
+
+@end
+
+@implementation InterfaceController
+
+- (id)init {
+ if ((self = [super init])) {
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ NSString *host = [defaults stringForKey:@"host"];
+ int port = [defaults integerForKey:@"port"];
+
+ if (host == nil) {
+ self.host = @"127.0.0.1";
+ } else {
+ self.host = host;
+ }
+
+ if (port == 0) {
+ self.port = [NSNumber numberWithInt:8080];
+ } else {
+ self.port = [NSNumber numberWithInt:port];
+ }
+
+ self.planets = @[@"Sun",
+ @"Mercury",
+ @"Venus",
+ @"Earth",
+ @"Mars",
+ @"Jupiter",
+ @"Saturn",
+ @"Uranus",
+ @"Neptune",
+ @"Solar System"];
+
+ self.minimumValue = 1.0f;
+ self.maximumValue = 10.0f;
+ }
+
+ return self;
+}
+
+- (void)awakeWithContext:(id)context {
+ [super awakeWithContext:context];
+
+ int planetsCount = [self.planets count];
+
+ NSMutableArray *pickerItems = [[NSMutableArray alloc] init];
+
+ for (int i = 0; i < planetsCount; i++) {
+ WKPickerItem *item = [WKPickerItem alloc];
+ item.title = self.planets[i];
+ [pickerItems addObject:item];
+ }
+
+ [self.planetPicker setItems:pickerItems];
+
+ [self.hostLabel setText:[NSString stringWithFormat:@"%@:%@", self.host, [NSString stringWithFormat:@"%d", [self.port intValue]]]];
+}
+
+- (void)willActivate {
+ [super willActivate];
+
+ if ([WCSession isSupported]) {
+ WCSession *session = [WCSession defaultSession];
+ session.delegate = self;
+ [session activateSession];
+ }
+}
+
+- (IBAction)selectedPlanetChanged:(NSInteger)value {
+ NSString *command = [@[@"selectPlanet", self.planets[value]] componentsJoinedByString:@"/"];
+
+ [self sendCommand:command];
+}
+
+- (IBAction)rotationSpeedChanged:(float)value {
+ NSString* formattedValue = [NSString stringWithFormat:@"%.02f", (value - self.minimumValue) /
+ (self.maximumValue - self.minimumValue)];
+ NSString *command = [@[@"setRotationSpeed", formattedValue] componentsJoinedByString:@"/"];
+
+ [self sendCommand:command];
+}
+
+- (IBAction)viewingDistanceChanged:(float)value {
+ NSString* formattedValue = [NSString stringWithFormat:@"%.02f", (value - self.minimumValue) /
+ (self.maximumValue - self.minimumValue)];
+ NSString *command = [@[@"setViewingDistance", formattedValue] componentsJoinedByString:@"/"];
+
+ [self sendCommand:command];
+}
+
+- (IBAction)planetSizeChanged:(float)value {
+ NSString* formattedValue = [NSString stringWithFormat:@"%.02f", (value - self.minimumValue) /
+ (self.maximumValue - self.minimumValue)];
+ NSString *command = [@[@"setPlanetSize", formattedValue] componentsJoinedByString:@"/"];
+
+ [self sendCommand:command];
+}
+
+
+- (void)sendCommand:(NSString *)command {
+ NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
+
+ NSURLComponents *urlComponents = [[NSURLComponents alloc] init];
+ urlComponents.scheme = @"http";
+ urlComponents.host = self.host;
+ urlComponents.port = self.port;
+ urlComponents.path = [NSString stringWithFormat:@"/%@", command];
+
+ [request setURL:urlComponents.URL];
+ [request setHTTPMethod:@"GET"];
+
+ NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
+ [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response,
+ NSError *error) {}] resume];
+}
+
+- (void)session:(nonnull WCSession *)session didReceiveMessage:(nonnull NSDictionary *)message replyHandler:(nonnull void (^)(NSDictionary<NSString *,id> *))replyHandler {
+ NSString *host = [message objectForKey:@"host"];
+ NSString *port = [message objectForKey:@"port"];
+
+ NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
+ numberFormatter.numberStyle = NSNumberFormatterNoStyle;
+
+ self.host = host;
+ self.port = [numberFormatter numberFromString:port];
+
+ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+ [defaults setObject:host forKey:@"host"];
+ [defaults setInteger:[self.port integerValue] forKey:@"port"];
+ [defaults synchronize];
+
+ [self.hostLabel setText:[NSString stringWithFormat:@"%@:%@", host, port]];
+}
+
+- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(NSError *)error {
+
+}
+
+@end
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.pbxproj b/tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.pbxproj
new file mode 100644
index 000000000..14afdbfb1
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.pbxproj
@@ -0,0 +1,608 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 46;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 198EE56A1DB022870021AE36 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 198EE5691DB022870021AE36 /* main.m */; };
+ 198EE56D1DB022870021AE36 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 198EE56C1DB022870021AE36 /* AppDelegate.m */; };
+ 198EE5701DB022870021AE36 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 198EE56F1DB022870021AE36 /* ViewController.m */; };
+ 198EE5731DB022870021AE36 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 198EE5711DB022870021AE36 /* Main.storyboard */; };
+ 198EE5751DB022870021AE36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 198EE5741DB022870021AE36 /* Assets.xcassets */; };
+ 198EE5781DB022870021AE36 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 198EE5761DB022870021AE36 /* LaunchScreen.storyboard */; };
+ 198EE57D1DB022880021AE36 /* PlanetsClient WatchKit App.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = 198EE57C1DB022880021AE36 /* PlanetsClient WatchKit App.app */; };
+ 198EE5831DB022880021AE36 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 198EE5811DB022880021AE36 /* Interface.storyboard */; };
+ 198EE5851DB022880021AE36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 198EE5841DB022880021AE36 /* Assets.xcassets */; };
+ 198EE58C1DB022880021AE36 /* PlanetsClient WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 198EE58B1DB022880021AE36 /* PlanetsClient WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ 198EE5921DB022880021AE36 /* InterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 198EE5911DB022880021AE36 /* InterfaceController.m */; };
+ 198EE5951DB022880021AE36 /* ExtensionDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 198EE5941DB022880021AE36 /* ExtensionDelegate.m */; };
+ 198EE5971DB022880021AE36 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 198EE5961DB022880021AE36 /* Assets.xcassets */; };
+ 19BD10BF1DB0235700520DE2 /* WatchConnectivity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 19BD10BE1DB0235700520DE2 /* WatchConnectivity.framework */; };
+ 19BD10C11DB0295200520DE2 /* WatchConnectivity.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 19BD10C01DB0295200520DE2 /* WatchConnectivity.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 198EE57E1DB022880021AE36 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 198EE55D1DB022870021AE36 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 198EE57B1DB022880021AE36;
+ remoteInfo = "PlanetsClient WatchKit App";
+ };
+ 198EE58D1DB022880021AE36 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 198EE55D1DB022870021AE36 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 198EE58A1DB022880021AE36;
+ remoteInfo = "PlanetsClient WatchKit Extension";
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 198EE59E1DB022880021AE36 /* Embed App Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ 198EE58C1DB022880021AE36 /* PlanetsClient WatchKit Extension.appex in Embed App Extensions */,
+ );
+ name = "Embed App Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 198EE5A21DB022880021AE36 /* Embed Watch Content */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "$(CONTENTS_FOLDER_PATH)/Watch";
+ dstSubfolderSpec = 16;
+ files = (
+ 198EE57D1DB022880021AE36 /* PlanetsClient WatchKit App.app in Embed Watch Content */,
+ );
+ name = "Embed Watch Content";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 198EE5651DB022870021AE36 /* PlanetsClient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PlanetsClient.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 198EE5691DB022870021AE36 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 198EE56B1DB022870021AE36 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ 198EE56C1DB022870021AE36 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ 198EE56E1DB022870021AE36 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+ 198EE56F1DB022870021AE36 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
+ 198EE5721DB022870021AE36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+ 198EE5741DB022870021AE36 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+ 198EE5771DB022870021AE36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+ 198EE5791DB022870021AE36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 198EE57C1DB022880021AE36 /* PlanetsClient WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PlanetsClient WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 198EE5821DB022880021AE36 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = "<group>"; };
+ 198EE5841DB022880021AE36 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+ 198EE5861DB022880021AE36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 198EE58B1DB022880021AE36 /* PlanetsClient WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "PlanetsClient WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 198EE5901DB022880021AE36 /* InterfaceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InterfaceController.h; sourceTree = "<group>"; };
+ 198EE5911DB022880021AE36 /* InterfaceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InterfaceController.m; sourceTree = "<group>"; };
+ 198EE5931DB022880021AE36 /* ExtensionDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtensionDelegate.h; sourceTree = "<group>"; };
+ 198EE5941DB022880021AE36 /* ExtensionDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExtensionDelegate.m; sourceTree = "<group>"; };
+ 198EE5961DB022880021AE36 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+ 198EE5981DB022880021AE36 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 19BD10BE1DB0235700520DE2 /* WatchConnectivity.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchConnectivity.framework; path = System/Library/Frameworks/WatchConnectivity.framework; sourceTree = SDKROOT; };
+ 19BD10C01DB0295200520DE2 /* WatchConnectivity.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WatchConnectivity.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS3.1.sdk/System/Library/Frameworks/WatchConnectivity.framework; sourceTree = DEVELOPER_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 198EE5621DB022870021AE36 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 19BD10BF1DB0235700520DE2 /* WatchConnectivity.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 198EE5881DB022880021AE36 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 19BD10C11DB0295200520DE2 /* WatchConnectivity.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 198EE55C1DB022870021AE36 = {
+ isa = PBXGroup;
+ children = (
+ 198EE5671DB022870021AE36 /* PlanetsClient */,
+ 198EE5801DB022880021AE36 /* PlanetsClient WatchKit App */,
+ 198EE58F1DB022880021AE36 /* PlanetsClient WatchKit Extension */,
+ 198EE5661DB022870021AE36 /* Products */,
+ 19BD10BD1DB0235700520DE2 /* Frameworks */,
+ );
+ sourceTree = "<group>";
+ };
+ 198EE5661DB022870021AE36 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 198EE5651DB022870021AE36 /* PlanetsClient.app */,
+ 198EE57C1DB022880021AE36 /* PlanetsClient WatchKit App.app */,
+ 198EE58B1DB022880021AE36 /* PlanetsClient WatchKit Extension.appex */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 198EE5671DB022870021AE36 /* PlanetsClient */ = {
+ isa = PBXGroup;
+ children = (
+ 198EE56B1DB022870021AE36 /* AppDelegate.h */,
+ 198EE56C1DB022870021AE36 /* AppDelegate.m */,
+ 198EE56E1DB022870021AE36 /* ViewController.h */,
+ 198EE56F1DB022870021AE36 /* ViewController.m */,
+ 198EE5711DB022870021AE36 /* Main.storyboard */,
+ 198EE5741DB022870021AE36 /* Assets.xcassets */,
+ 198EE5761DB022870021AE36 /* LaunchScreen.storyboard */,
+ 198EE5791DB022870021AE36 /* Info.plist */,
+ 198EE5681DB022870021AE36 /* Supporting Files */,
+ );
+ path = PlanetsClient;
+ sourceTree = "<group>";
+ };
+ 198EE5681DB022870021AE36 /* Supporting Files */ = {
+ isa = PBXGroup;
+ children = (
+ 198EE5691DB022870021AE36 /* main.m */,
+ );
+ name = "Supporting Files";
+ sourceTree = "<group>";
+ };
+ 198EE5801DB022880021AE36 /* PlanetsClient WatchKit App */ = {
+ isa = PBXGroup;
+ children = (
+ 198EE5811DB022880021AE36 /* Interface.storyboard */,
+ 198EE5841DB022880021AE36 /* Assets.xcassets */,
+ 198EE5861DB022880021AE36 /* Info.plist */,
+ );
+ path = "PlanetsClient WatchKit App";
+ sourceTree = "<group>";
+ };
+ 198EE58F1DB022880021AE36 /* PlanetsClient WatchKit Extension */ = {
+ isa = PBXGroup;
+ children = (
+ 198EE5901DB022880021AE36 /* InterfaceController.h */,
+ 198EE5911DB022880021AE36 /* InterfaceController.m */,
+ 198EE5931DB022880021AE36 /* ExtensionDelegate.h */,
+ 198EE5941DB022880021AE36 /* ExtensionDelegate.m */,
+ 198EE5961DB022880021AE36 /* Assets.xcassets */,
+ 198EE5981DB022880021AE36 /* Info.plist */,
+ );
+ path = "PlanetsClient WatchKit Extension";
+ sourceTree = "<group>";
+ };
+ 19BD10BD1DB0235700520DE2 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 19BD10C01DB0295200520DE2 /* WatchConnectivity.framework */,
+ 19BD10BE1DB0235700520DE2 /* WatchConnectivity.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 198EE5641DB022870021AE36 /* PlanetsClient */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 198EE5A31DB022880021AE36 /* Build configuration list for PBXNativeTarget "PlanetsClient" */;
+ buildPhases = (
+ 198EE5611DB022870021AE36 /* Sources */,
+ 198EE5621DB022870021AE36 /* Frameworks */,
+ 198EE5631DB022870021AE36 /* Resources */,
+ 198EE5A21DB022880021AE36 /* Embed Watch Content */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 198EE57F1DB022880021AE36 /* PBXTargetDependency */,
+ );
+ name = PlanetsClient;
+ productName = PlanetsClient;
+ productReference = 198EE5651DB022870021AE36 /* PlanetsClient.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 198EE57B1DB022880021AE36 /* PlanetsClient WatchKit App */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 198EE59F1DB022880021AE36 /* Build configuration list for PBXNativeTarget "PlanetsClient WatchKit App" */;
+ buildPhases = (
+ 198EE57A1DB022880021AE36 /* Resources */,
+ 198EE59E1DB022880021AE36 /* Embed App Extensions */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 198EE58E1DB022880021AE36 /* PBXTargetDependency */,
+ );
+ name = "PlanetsClient WatchKit App";
+ productName = "PlanetsClient WatchKit App";
+ productReference = 198EE57C1DB022880021AE36 /* PlanetsClient WatchKit App.app */;
+ productType = "com.apple.product-type.application.watchapp2";
+ };
+ 198EE58A1DB022880021AE36 /* PlanetsClient WatchKit Extension */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 198EE59B1DB022880021AE36 /* Build configuration list for PBXNativeTarget "PlanetsClient WatchKit Extension" */;
+ buildPhases = (
+ 198EE5871DB022880021AE36 /* Sources */,
+ 198EE5881DB022880021AE36 /* Frameworks */,
+ 198EE5891DB022880021AE36 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "PlanetsClient WatchKit Extension";
+ productName = "PlanetsClient WatchKit Extension";
+ productReference = 198EE58B1DB022880021AE36 /* PlanetsClient WatchKit Extension.appex */;
+ productType = "com.apple.product-type.watchkit2-extension";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 198EE55D1DB022870021AE36 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 0810;
+ ORGANIZATIONNAME = "Oleg Yadrov";
+ TargetAttributes = {
+ 198EE5641DB022870021AE36 = {
+ CreatedOnToolsVersion = 8.1;
+ ProvisioningStyle = Automatic;
+ };
+ 198EE57B1DB022880021AE36 = {
+ CreatedOnToolsVersion = 8.1;
+ ProvisioningStyle = Automatic;
+ };
+ 198EE58A1DB022880021AE36 = {
+ CreatedOnToolsVersion = 8.1;
+ ProvisioningStyle = Automatic;
+ };
+ };
+ };
+ buildConfigurationList = 198EE5601DB022870021AE36 /* Build configuration list for PBXProject "PlanetsClient" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 198EE55C1DB022870021AE36;
+ productRefGroup = 198EE5661DB022870021AE36 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 198EE5641DB022870021AE36 /* PlanetsClient */,
+ 198EE57B1DB022880021AE36 /* PlanetsClient WatchKit App */,
+ 198EE58A1DB022880021AE36 /* PlanetsClient WatchKit Extension */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 198EE5631DB022870021AE36 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 198EE5781DB022870021AE36 /* LaunchScreen.storyboard in Resources */,
+ 198EE5751DB022870021AE36 /* Assets.xcassets in Resources */,
+ 198EE5731DB022870021AE36 /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 198EE57A1DB022880021AE36 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 198EE5851DB022880021AE36 /* Assets.xcassets in Resources */,
+ 198EE5831DB022880021AE36 /* Interface.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 198EE5891DB022880021AE36 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 198EE5971DB022880021AE36 /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 198EE5611DB022870021AE36 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 198EE5701DB022870021AE36 /* ViewController.m in Sources */,
+ 198EE56D1DB022870021AE36 /* AppDelegate.m in Sources */,
+ 198EE56A1DB022870021AE36 /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 198EE5871DB022880021AE36 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 198EE5951DB022880021AE36 /* ExtensionDelegate.m in Sources */,
+ 198EE5921DB022880021AE36 /* InterfaceController.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 198EE57F1DB022880021AE36 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 198EE57B1DB022880021AE36 /* PlanetsClient WatchKit App */;
+ targetProxy = 198EE57E1DB022880021AE36 /* PBXContainerItemProxy */;
+ };
+ 198EE58E1DB022880021AE36 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 198EE58A1DB022880021AE36 /* PlanetsClient WatchKit Extension */;
+ targetProxy = 198EE58D1DB022880021AE36 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 198EE5711DB022870021AE36 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 198EE5721DB022870021AE36 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "<group>";
+ };
+ 198EE5761DB022870021AE36 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 198EE5771DB022870021AE36 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "<group>";
+ };
+ 198EE5811DB022880021AE36 /* Interface.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 198EE5821DB022880021AE36 /* Base */,
+ );
+ name = Interface.storyboard;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 198EE5991DB022880021AE36 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_SUSPICIOUS_MOVES = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 10.1;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 198EE59A1DB022880021AE36 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_SUSPICIOUS_MOVES = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 10.1;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 198EE59C1DB022880021AE36 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
+ DEVELOPMENT_TEAM = "";
+ INFOPLIST_FILE = "PlanetsClient WatchKit Extension/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = Qt.PlanetsClient.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 2.0;
+ };
+ name = Debug;
+ };
+ 198EE59D1DB022880021AE36 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_COMPLICATION_NAME = Complication;
+ DEVELOPMENT_TEAM = "";
+ INFOPLIST_FILE = "PlanetsClient WatchKit Extension/Info.plist";
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = Qt.PlanetsClient.watchkitapp.watchkitextension;
+ PRODUCT_NAME = "${TARGET_NAME}";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 2.0;
+ };
+ name = Release;
+ };
+ 198EE5A01DB022880021AE36 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ DEVELOPMENT_TEAM = "";
+ IBSC_MODULE = PlanetsClient_WatchKit_Extension;
+ INFOPLIST_FILE = "PlanetsClient WatchKit App/Info.plist";
+ PRODUCT_BUNDLE_IDENTIFIER = Qt.PlanetsClient.watchkitapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 2.0;
+ };
+ name = Debug;
+ };
+ 198EE5A11DB022880021AE36 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ DEVELOPMENT_TEAM = "";
+ IBSC_MODULE = PlanetsClient_WatchKit_Extension;
+ INFOPLIST_FILE = "PlanetsClient WatchKit App/Info.plist";
+ PRODUCT_BUNDLE_IDENTIFIER = Qt.PlanetsClient.watchkitapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = watchos;
+ SKIP_INSTALL = YES;
+ TARGETED_DEVICE_FAMILY = 4;
+ WATCHOS_DEPLOYMENT_TARGET = 2.0;
+ };
+ name = Release;
+ };
+ 198EE5A41DB022880021AE36 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ DEVELOPMENT_TEAM = "";
+ INFOPLIST_FILE = PlanetsClient/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = Qt.PlanetsClient;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WATCHOS_DEPLOYMENT_TARGET = 2.0;
+ };
+ name = Debug;
+ };
+ 198EE5A51DB022880021AE36 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ DEVELOPMENT_TEAM = "";
+ INFOPLIST_FILE = PlanetsClient/Info.plist;
+ IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
+ PRODUCT_BUNDLE_IDENTIFIER = Qt.PlanetsClient;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ WATCHOS_DEPLOYMENT_TARGET = 2.0;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 198EE5601DB022870021AE36 /* Build configuration list for PBXProject "PlanetsClient" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 198EE5991DB022880021AE36 /* Debug */,
+ 198EE59A1DB022880021AE36 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 198EE59B1DB022880021AE36 /* Build configuration list for PBXNativeTarget "PlanetsClient WatchKit Extension" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 198EE59C1DB022880021AE36 /* Debug */,
+ 198EE59D1DB022880021AE36 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 198EE59F1DB022880021AE36 /* Build configuration list for PBXNativeTarget "PlanetsClient WatchKit App" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 198EE5A01DB022880021AE36 /* Debug */,
+ 198EE5A11DB022880021AE36 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 198EE5A31DB022880021AE36 /* Build configuration list for PBXNativeTarget "PlanetsClient" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 198EE5A41DB022880021AE36 /* Debug */,
+ 198EE5A51DB022880021AE36 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 198EE55D1DB022870021AE36 /* Project object */;
+}
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 000000000..194b0d2ec
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:PlanetsClient.xcodeproj">
+ </FileRef>
+</Workspace>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.h b/tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.h
new file mode 100644
index 000000000..8ec37d7ee
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.h
@@ -0,0 +1,12 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong, nonatomic) UIWindow *window;
+
+
+@end
+
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.m b/tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.m
new file mode 100644
index 000000000..b44f13fd3
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/AppDelegate.m
@@ -0,0 +1,46 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ // Override point for customization after application launch.
+ return YES;
+}
+
+
+- (void)applicationWillResignActive:(UIApplication *)application {
+ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
+ // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
+}
+
+
+- (void)applicationDidEnterBackground:(UIApplication *)application {
+ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
+ // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
+}
+
+
+- (void)applicationWillEnterForeground:(UIApplication *)application {
+ // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
+}
+
+
+- (void)applicationDidBecomeActive:(UIApplication *)application {
+ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
+}
+
+
+- (void)applicationWillTerminate:(UIApplication *)application {
+ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
+}
+
+
+@end
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/Contents.json b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 000000000..a3ed4cb66
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,95 @@
+{
+ "images" : [
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "20x20",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "29x29",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "40x40",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "icon120.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "iphone",
+ "size" : "60x60",
+ "scale" : "3x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "20x20",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "29x29",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "29x29",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "40x40",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "40x40",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "icon180.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "76x76",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "ipad",
+ "size" : "83.5x83.5",
+ "scale" : "2x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon120.png b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon120.png
new file mode 100644
index 000000000..c8ff9a2eb
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon120.png
Binary files differ
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon180.png b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon180.png
new file mode 100644
index 000000000..8d312e8a4
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Assets.xcassets/AppIcon.appiconset/icon180.png
Binary files differ
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/LaunchScreen.storyboard b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 000000000..fdf3f97d1
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11134" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11106"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="EHf-IW-A2E">
+ <objects>
+ <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="Llm-lL-Icb"/>
+ <viewControllerLayoutGuide type="bottom" id="xb3-aO-Qok"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="53" y="375"/>
+ </scene>
+ </scenes>
+</document>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/Main.storyboard b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/Main.storyboard
new file mode 100644
index 000000000..d15768d40
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Base.lproj/Main.storyboard
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11535.1" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
+ <device id="retina4_7" orientation="portrait">
+ <adaptation id="fullscreen"/>
+ </device>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11523"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="tne-QT-ifu">
+ <objects>
+ <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
+ <layoutGuides>
+ <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
+ <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
+ </layoutGuides>
+ <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Host Name (or IP address)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="yQD-6e-UAt">
+ <rect key="frame" x="16" y="28" width="343" height="21"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <nil key="textColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <button opaque="NO" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="bpy-NM-f5W">
+ <rect key="frame" x="16" y="162" width="343" height="30"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <state key="normal" title="Apply"/>
+ <connections>
+ <action selector="applyButtonClicked:" destination="BYZ-38-t0r" eventType="touchUpInside" id="Vac-dy-zbh"/>
+ </connections>
+ </button>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Port" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Myw-mc-Fnd">
+ <rect key="frame" x="16" y="95" width="343" height="21"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <fontDescription key="fontDescription" type="system" pointSize="17"/>
+ <nil key="textColor"/>
+ <nil key="highlightedColor"/>
+ </label>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="8080" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="3ss-x9-aC2">
+ <rect key="frame" x="16" y="124" width="343" height="30"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <nil key="textColor"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" fixedFrame="YES" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="127.0.0.1" borderStyle="roundedRect" textAlignment="natural" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="lbT-LC-4Rv">
+ <rect key="frame" x="16" y="57" width="343" height="30"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+ <nil key="textColor"/>
+ <fontDescription key="fontDescription" type="system" pointSize="14"/>
+ <textInputTraits key="textInputTraits"/>
+ </textField>
+ </subviews>
+ <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </view>
+ <connections>
+ <outlet property="applyButton" destination="bpy-NM-f5W" id="6ch-bt-ccO"/>
+ <outlet property="hostNameTextField" destination="lbT-LC-4Rv" id="mNc-AV-o4s"/>
+ <outlet property="portTextField" destination="3ss-x9-aC2" id="zzX-4j-Sk4"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+ </objects>
+ </scene>
+ </scenes>
+</document>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/Info.plist b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Info.plist
new file mode 100644
index 000000000..d05247386
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/Info.plist
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>$(EXECUTABLE_NAME)</string>
+ <key>CFBundleIdentifier</key>
+ <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>$(PRODUCT_NAME)</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.0</string>
+ <key>CFBundleVersion</key>
+ <string>1</string>
+ <key>LSRequiresIPhoneOS</key>
+ <true/>
+ <key>UILaunchStoryboardName</key>
+ <string>LaunchScreen</string>
+ <key>UIMainStoryboardFile</key>
+ <string>Main</string>
+ <key>UIRequiredDeviceCapabilities</key>
+ <array>
+ <string>armv7</string>
+ </array>
+ <key>UISupportedInterfaceOrientations</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+ <key>UISupportedInterfaceOrientations~ipad</key>
+ <array>
+ <string>UIInterfaceOrientationPortrait</string>
+ <string>UIInterfaceOrientationPortraitUpsideDown</string>
+ <string>UIInterfaceOrientationLandscapeLeft</string>
+ <string>UIInterfaceOrientationLandscapeRight</string>
+ </array>
+</dict>
+</plist>
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.h b/tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.h
new file mode 100644
index 000000000..63f2b6ec1
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.h
@@ -0,0 +1,13 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import <UIKit/UIKit.h>
+#import <WatchConnectivity/WatchConnectivity.h>
+
+@interface ViewController : UIViewController
+@property (weak, nonatomic) IBOutlet UITextField *hostNameTextField;
+@property (weak, nonatomic) IBOutlet UITextField *portTextField;
+@property (weak, nonatomic) IBOutlet UIButton *applyButton;
+
+@end
+
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.m b/tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.m
new file mode 100644
index 000000000..985a08a1d
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/ViewController.m
@@ -0,0 +1,48 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#import "ViewController.h"
+
+@interface ViewController () <WCSessionDelegate>
+
+@end
+
+@implementation ViewController
+
+- (void)session:(WCSession *)session activationDidCompleteWithState:(WCSessionActivationState)activationState error:(NSError *)error {
+
+}
+
+- (void)sessionDidBecomeInactive:(WCSession *)session {
+
+}
+
+- (void)sessionDidDeactivate:(WCSession *)session {
+
+}
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ // Do any additional setup after loading the view, typically from a nib.
+
+ if ([WCSession isSupported]) {
+ WCSession *session = [WCSession defaultSession];
+ session.delegate = self;
+ [session activateSession];
+ }
+}
+
+- (IBAction)applyButtonClicked:(id)sender {
+ if ([[WCSession defaultSession] isReachable]) {
+ NSDictionary *dictionary = @{
+ @"host" : [self.hostNameTextField text],
+ @"port" : [self.portTextField text]
+ };
+
+ [[WCSession defaultSession] sendMessage:dictionary
+ replyHandler:^(NSDictionary *replyHandler) {}
+ errorHandler:^(NSError *error) {}];
+ }
+}
+
+@end
diff --git a/tests/manual/planets-qml/planets-watchos/PlanetsClient/main.m b/tests/manual/planets-qml/planets-watchos/PlanetsClient/main.m
new file mode 100644
index 000000000..22b991ddd
--- /dev/null
+++ b/tests/manual/planets-qml/planets-watchos/PlanetsClient/main.m
@@ -0,0 +1,16 @@
+//
+// main.m
+// PlanetsClient
+//
+// Created by Oleg Yadrov on 10/13/16.
+// Copyright © 2016 Oleg Yadrov. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ @autoreleasepool {
+ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
+ }
+}
diff --git a/tests/manual/planets-qml/planets.js b/tests/manual/planets-qml/planets.js
new file mode 100644
index 000000000..661f836ea
--- /dev/null
+++ b/tests/manual/planets-qml/planets.js
@@ -0,0 +1,187 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+.pragma library
+
+var SUN = 0;
+var MERCURY = 1;
+var VENUS = 2;
+var EARTH = 3;
+var MARS = 4;
+var JUPITER = 5;
+var SATURN = 6;
+var URANUS = 7;
+var NEPTUNE = 8;
+var NUM_SELECTABLE_PLANETS = 9;
+var MOON = 9;
+var SOLAR_SYSTEM = 100;
+
+function planetId(planetName) {
+ switch (planetName) {
+ case "Sun":
+ return SUN
+ case "Mercury":
+ return MERCURY
+ case "Venus":
+ return VENUS
+ case "Earth":
+ return EARTH
+ case "Mars":
+ return MARS
+ case "Jupiter":
+ return JUPITER
+ case "Saturn":
+ return SATURN
+ case "Uranus":
+ return URANUS
+ case "Neptune":
+ return NEPTUNE
+ case "Solar System":
+ return SOLAR_SYSTEM
+ }
+}
+
+function planetIndex(planetName) {
+ switch (planetName) {
+ case "Sun":
+ return 0
+ case "Mercury":
+ return 1
+ case "Venus":
+ return 2
+ case "Earth":
+ return 3
+ case "Mars":
+ return 4
+ case "Jupiter":
+ return 5
+ case "Saturn":
+ return 6
+ case "Uranus":
+ return 7
+ case "Neptune":
+ return 8
+ case "Solar System":
+ return 9
+ }
+}
+
+var planets = []; // Planet data info
+
+// Units are in 10^3 KM
+
+var solarDistance = 2600.000;
+var saturnOuterRadius = 0.120700;
+var uranusOuterRadius = 0.040;
+
+var auScale = 149.597870700; // 0.001 AU (in thousands of kilometers)
+
+function loadPlanetData() {
+
+ // Planet Data
+ // radius - planet radius
+ // tilt - planet axis angle
+ // N1/2 - longitude of the ascending node
+ // i1/2 - inclination to the ecliptic (plane of the Earth's orbit)
+ // w1/2 - argument of perihelion
+ // a1/2 - semi-major axis, or mean distance from Sun
+ // e1/2 - eccentricity (0=circle, 0-1=ellipse, 1=parabola)
+ // M1/2 - mean anomaly (0 at perihelion; increases uniformly with time)
+ // period - sidereal rotation period
+ // centerOfOrbit - the planet in the center of the orbit
+ // (orbital elements based on http://www.stjarnhimlen.se/comp/ppcomp.html)
+
+ var sun = { radius: 0.694439, tilt: 63.87, period: 25.05, x: 0, y: 0, z: 0,
+ roll: 0 };
+ planets.push(sun);
+ var mercury = {
+ radius: 0.002433722, tilt: 0.04, N1: 48.3313, N2: 0.0000324587,
+ i1: 7.0047, i2: 0.0000000500, w1: 29.1241, w2: 0.0000101444,
+ a1: 0.387098, a2: 0, e1: 0.205635, e2: 0.000000000559,
+ M1: 168.6562, M2: 4.0923344368, period: 58.646, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(mercury);
+ var venus = {
+ radius: 0.006046079, tilt: 177.36, N1: 76.6799, N2: 0.0000246590,
+ i1: 3.3946, i2: 0.0000000275, w1: 54.8910, w2: 0.0000138374,
+ a1: 0.723330, a2: 0, e1: 0.006773, e2: -0.000000001302,
+ M1: 48.0052, M2: 1.6021302244, period: 243.0185, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(venus);
+ var earth = {
+ radius: 0.006371, tilt: 25.44, N1: 174.873, N2: 0,
+ i1: 0.00005, i2: 0, w1: 102.94719, w2: 0,
+ a1: 1, a2: 0, e1: 0.01671022, e2: 0,
+ M1: 357.529, M2: 0.985608, period: 0.997, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(earth);
+ var mars = {
+ radius: 0.003389372, tilt: 25.19, N1: 49.5574, N2: 0.0000211081,
+ i1: 1.8497, i2: -0.0000000178, w1: 286.5016, w2: 0.0000292961,
+ a1: 1.523688, a2: 0, e1: 0.093405, e2: 0.000000002516,
+ M1: 18.6021, M2: 0.5240207766, period: 1.025957, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(mars);
+ var jupiter = {
+ radius: 0.07141254, tilt: 3.13, N1: 100.4542, N2: 0.0000276854,
+ i1: 1.3030, i2: -0.0000001557, w1: 273.8777, w2: 0.0000164505,
+ a1: 5.20256, a2: 0, e1: 0.048498, e2: 0.000000004469,
+ M1: 19.8950, M2: 0.0830853001, period: 0.4135, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(jupiter);
+ var saturn = {
+ radius: 0.06019958, tilt: 26.73, N1: 113.6634, N2: 0.0000238980,
+ i1: 2.4886, i2: -0.0000001081, w1: 339.3939, w2: 0.0000297661,
+ a1: 9.55475, a2: 0, e1: 0.055546, e2: -0.000000009499,
+ M1: 316.9670, M2: 0.0334442282, period: 0.4395, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(saturn);
+ var uranus = {
+ radius: 0.0255286, tilt: 97.77, N1: 74.0005, N2: 0.000013978,
+ i1: 0.7733, i2: 0.000000019, w1: 96.6612, w2: 0.000030565,
+ a1: 19.18171, a2: -0.0000000155, e1: 0.047318, e2: 0.00000000745,
+ M1: 142.5905, M2: 0.011725806, period: 0.71833, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(uranus);
+ var neptune = {
+ radius: 0.02473859, tilt: 28.32, N1: 131.7806, N2: 0.000030173,
+ i1: 1.7700, i2: -0.000000255, w1: 272.8461, w2: 0.000006027,
+ a1: 30.05826, a2: 0.00000003313, e1: 0.008606, e2: 0.00000000215,
+ M1: 260.2471, M2: 0.005995147, period: 0.6713, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: SUN
+ };
+ planets.push(neptune);
+ var moon = {
+ radius: 0.0015424, tilt: 28.32, N1: 125.1228, N2: -0.0529538083,
+ i1: 5.1454, i2: 0, w1: 318.0634, w2: 0.1643573223,
+ a1: 0.273, a2: 0, e1: 0.054900, e2: 0,
+ M1: 115.3654, M2: 13.0649929509, period: 27.321582, x: 0, y: 0, z: 0,
+ roll: 0, centerOfOrbit: EARTH
+ };
+ planets.push(moon);
+
+ return planets;
+}
+
+function getOuterRadius(planet) {
+ var outerRadius = solarDistance;
+ if (planet !== SOLAR_SYSTEM) {
+ outerRadius = planets[planet]["radius"];
+ if (planet === SATURN) {
+ outerRadius =+ saturnOuterRadius;
+ } else if (planet === URANUS) {
+ outerRadius =+ uranusOuterRadius;
+ } else if (planet === SUN) {
+ outerRadius = planets[planet]["radius"] / 10;
+ }
+ }
+
+ return outerRadius;
+}
diff --git a/tests/manual/planets-qml/shaders/es2/planetD.frag b/tests/manual/planets-qml/shaders/es2/planetD.frag
new file mode 100644
index 000000000..f34a2a23e
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/planetD.frag
@@ -0,0 +1,60 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+uniform highp mat4 viewMatrix;
+
+uniform highp vec3 lightPosition;
+uniform highp vec3 lightIntensity;
+
+uniform highp vec3 ka; // Ambient reflectivity
+uniform highp vec3 ks; // Specular reflectivity
+uniform highp float shininess; // Specular shininess factor
+uniform highp float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+
+varying highp vec4 positionInLightSpace;
+
+varying highp vec3 position;
+varying highp vec3 normal;
+varying highp vec2 texCoord;
+
+highp vec3 dModel(const highp vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ highp vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ highp vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ highp vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ highp float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ highp float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ highp vec3 diffuseColor = texture2D(diffuseTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * ks);
+}
+
+void main()
+{
+ highp vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ highp vec3 result = dModel(flipYTexCoord);
+
+ highp float alpha = opacity * texture2D(diffuseTexture, flipYTexCoord).a;
+
+ gl_FragColor = vec4(result, alpha);
+}
diff --git a/tests/manual/planets-qml/shaders/es2/planetD.vert b/tests/manual/planets-qml/shaders/es2/planetD.vert
new file mode 100644
index 000000000..a5da1441e
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/planetD.vert
@@ -0,0 +1,36 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+attribute vec3 vertexPosition;
+attribute vec3 vertexNormal;
+attribute vec2 vertexTexCoord;
+
+varying vec4 positionInLightSpace;
+varying vec3 position;
+varying vec3 normal;
+varying vec2 texCoord;
+
+uniform mat4 lightViewProjection;
+uniform mat4 modelMatrix;
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+void main()
+{
+ const mat4 shadowMatrix = mat4(0.5, 0.0, 0.0, 0.0,
+ 0.0, 0.5, 0.0, 0.0,
+ 0.0, 0.0, 0.5, 0.0,
+ 0.5, 0.5, 0.5, 1.0);
+
+ positionInLightSpace = shadowMatrix * lightViewProjection * modelMatrix * vec4(vertexPosition, 1.0);
+
+ texCoord = vertexTexCoord * texCoordScale;
+ normal = normalize(modelViewNormal * vertexNormal);
+ position = vec3(modelView * vec4(vertexPosition, 1.0));
+
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/es2/planetDB.frag b/tests/manual/planets-qml/shaders/es2/planetDB.frag
new file mode 100644
index 000000000..376e38939
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/planetDB.frag
@@ -0,0 +1,56 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+uniform highp mat4 viewMatrix;
+
+uniform highp vec3 lightPosition;
+uniform highp vec3 lightIntensity;
+
+uniform highp vec3 ka; // Ambient reflectivity
+uniform highp vec3 ks; // Specular reflectivity
+uniform highp float shininess; // Specular shininess factor
+uniform highp float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D normalTexture;
+
+varying highp vec4 positionInLightSpace;
+
+varying highp vec3 lightDir;
+varying highp vec3 viewDir;
+varying highp vec2 texCoord;
+
+highp vec3 dbModel(const highp vec3 norm, const highp vec2 flipYTexCoord)
+{
+ // Reflection of light direction about normal
+ highp vec3 r = reflect(-lightDir, norm);
+
+ highp vec3 diffuseColor = texture2D(diffuseTexture, flipYTexCoord).rgb;
+
+ // Calculate the ambient contribution
+ highp vec3 ambient = lightIntensity * ka * diffuseColor;
+
+ // Calculate the diffuse contribution
+ highp float sDotN = max(dot(lightDir, norm), 0.0);
+ highp vec3 diffuse = lightIntensity * diffuseColor * sDotN;
+
+ // Calculate the specular highlight contribution
+ highp vec3 specular = vec3(0.0);
+ if (sDotN > 0.0)
+ specular = (lightIntensity * ks) * pow(max(dot(r, viewDir), 0.0), shininess);
+
+ return ambient + diffuse + specular;
+}
+
+void main()
+{
+ highp vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ highp vec4 normal = 2.0 * texture2D(normalTexture, flipYTexCoord) - vec4(1.0);
+
+ highp vec3 result = dbModel(normalize(normal.xyz), flipYTexCoord);
+
+ gl_FragColor = vec4(result, opacity);
+}
diff --git a/tests/manual/planets-qml/shaders/es2/planetDB.vert b/tests/manual/planets-qml/shaders/es2/planetDB.vert
new file mode 100644
index 000000000..0a7c08604
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/planetDB.vert
@@ -0,0 +1,61 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+attribute vec3 vertexPosition;
+attribute vec3 vertexNormal;
+attribute vec2 vertexTexCoord;
+attribute vec4 vertexTangent;
+
+varying vec4 positionInLightSpace;
+varying vec3 lightDir;
+varying vec3 viewDir;
+varying vec2 texCoord;
+
+uniform mat4 viewMatrix;
+uniform mat4 lightViewProjection;
+uniform mat4 modelMatrix;
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+uniform vec3 lightPosition;
+
+void main()
+{
+ const mat4 shadowMatrix = mat4(0.5, 0.0, 0.0, 0.0,
+ 0.0, 0.5, 0.0, 0.0,
+ 0.0, 0.0, 0.5, 0.0,
+ 0.5, 0.5, 0.5, 1.0);
+
+ positionInLightSpace = shadowMatrix * lightViewProjection * modelMatrix * vec4(vertexPosition, 1.0);
+
+ // Pass through texture coordinates
+ texCoord = vertexTexCoord * texCoordScale;
+
+ // Transform position, normal, and tangent to eye coords
+ vec3 normal = normalize(modelViewNormal * vertexNormal);
+ vec3 tangent = normalize(modelViewNormal * vertexTangent.xyz);
+ vec3 position = vec3(modelView * vec4(vertexPosition, 1.0));
+
+ // Calculate binormal vector
+ vec3 binormal = normalize(cross(normal, tangent));
+
+ // Construct matrix to transform from eye coords to tangent space
+ mat3 tangentMatrix = mat3 (
+ tangent.x, binormal.x, normal.x,
+ tangent.y, binormal.y, normal.y,
+ tangent.z, binormal.z, normal.z);
+
+ // Transform light direction and view direction to tangent space
+ vec3 s = lightPosition - position;
+ lightDir = normalize(tangentMatrix * vec3(viewMatrix * vec4(s, 1.0)));
+
+ vec3 v = -position;
+ viewDir = normalize(tangentMatrix * v);
+
+ // Calculate vertex position in clip coordinates
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/es2/planetDS.frag b/tests/manual/planets-qml/shaders/es2/planetDS.frag
new file mode 100644
index 000000000..d4ee704bf
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/planetDS.frag
@@ -0,0 +1,61 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+uniform highp mat4 viewMatrix;
+
+uniform highp vec3 lightPosition;
+uniform highp vec3 lightIntensity;
+
+uniform highp vec3 ka; // Ambient reflectivity
+uniform highp float shininess; // Specular shininess factor
+uniform highp float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D specularTexture;
+
+varying highp vec4 positionInLightSpace;
+
+varying highp vec3 position;
+varying highp vec3 normal;
+varying highp vec2 texCoord;
+
+highp vec3 dsModel(const highp vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ highp vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ highp vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ highp vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ highp float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ highp float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ highp vec3 diffuseColor = texture2D(diffuseTexture, flipYTexCoord).rgb;
+ highp vec3 specularColor = texture2D(specularTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * specularColor);
+}
+
+void main()
+{
+ highp vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ highp vec3 result = dsModel(flipYTexCoord);
+
+ highp float alpha = opacity * texture2D(diffuseTexture, flipYTexCoord).a;
+
+ gl_FragColor = vec4(result, alpha);
+}
diff --git a/tests/manual/planets-qml/shaders/es2/planetDSB.frag b/tests/manual/planets-qml/shaders/es2/planetDSB.frag
new file mode 100644
index 000000000..95e60e9ee
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/planetDSB.frag
@@ -0,0 +1,61 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+uniform highp mat4 viewMatrix;
+
+uniform highp vec3 lightPosition;
+uniform highp vec3 lightIntensity;
+
+uniform highp vec3 ka; // Ambient reflectivity
+uniform highp float shininess; // Specular shininess factor
+uniform highp float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D specularTexture;
+uniform sampler2D normalTexture;
+
+varying highp vec4 positionInLightSpace;
+
+varying highp vec3 lightDir;
+varying highp vec3 viewDir;
+varying highp vec2 texCoord;
+
+highp vec3 dsbModel(const highp vec3 norm, const highp vec2 flipYTexCoord)
+{
+ // Reflection of light direction about normal
+ highp vec3 r = reflect(-lightDir, norm);
+
+ highp vec3 diffuseColor = texture2D(diffuseTexture, flipYTexCoord).rgb;
+ highp vec3 specularColor = texture2D(specularTexture, flipYTexCoord).rgb;
+
+ // Calculate the ambient contribution
+ highp vec3 ambient = lightIntensity * ka * diffuseColor;
+
+ // Calculate the diffuse contribution
+ highp float sDotN = max(dot(lightDir, norm), 0.0);
+ highp vec3 diffuse = lightIntensity * diffuseColor * sDotN;
+
+ // Calculate the specular highlight contribution
+ highp vec3 specular = vec3(0.0);
+ if (sDotN > 0.0)
+ specular = (lightIntensity * (shininess / (8.0 * 3.14))) * pow(max(dot(r, viewDir), 0.0), shininess);
+
+ specular *= specularColor;
+
+ return ambient + diffuse + specular;
+}
+
+void main()
+{
+ highp vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ // Sample the textures at the interpolated texCoords
+ highp vec4 normal = 2.0 * texture2D(normalTexture, flipYTexCoord) - vec4(1.0);
+
+ highp vec3 result = dsbModel(normalize(normal.xyz), flipYTexCoord);
+
+ // Combine spec with ambient+diffuse for final fragment color
+ gl_FragColor = vec4(result, opacity);
+}
diff --git a/tests/manual/planets-qml/shaders/es2/sun.frag b/tests/manual/planets-qml/shaders/es2/sun.frag
new file mode 100644
index 000000000..f9697c8e5
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/sun.frag
@@ -0,0 +1,26 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+uniform sampler2D diffuseTexture;
+
+varying highp vec3 position;
+varying highp vec2 texCoord;
+
+highp vec4 dModel(const highp vec2 flipYTexCoord)
+{
+ // Lookup diffuse
+ highp vec3 diffuseColor = texture2D(diffuseTexture, flipYTexCoord).rgb;
+
+ return vec4(diffuseColor, 1.0);
+}
+
+void main()
+{
+ highp vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ highp vec4 result = dModel(flipYTexCoord);
+
+ gl_FragColor = result;
+}
diff --git a/tests/manual/planets-qml/shaders/es2/sun.vert b/tests/manual/planets-qml/shaders/es2/sun.vert
new file mode 100644
index 000000000..f15074d1f
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/es2/sun.vert
@@ -0,0 +1,21 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+attribute vec3 vertexPosition;
+attribute vec2 vertexTexCoord;
+
+varying vec3 position;
+varying vec2 texCoord;
+
+uniform mat4 modelView;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+void main()
+{
+ texCoord = vertexTexCoord * texCoordScale;
+ position = vec3(modelView * vec4(vertexPosition, 1.0));
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetD.frag b/tests/manual/planets-qml/shaders/gl3/planetD.frag
new file mode 100644
index 000000000..72f4a030a
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetD.frag
@@ -0,0 +1,63 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+uniform mat4 viewMatrix;
+
+uniform vec3 lightPosition;
+uniform vec3 lightIntensity;
+
+uniform vec3 ka; // Ambient reflectivity
+uniform vec3 ks; // Specular reflectivity
+uniform float shininess; // Specular shininess factor
+uniform float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+
+in vec3 position;
+in vec3 normal;
+in vec2 texCoord;
+
+out vec4 fragColor;
+
+vec3 dModel(const in vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * ks);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+ result += dModel(flipYTexCoord);
+
+ float alpha = opacity * texture(diffuseTexture, flipYTexCoord).a;
+
+ fragColor = vec4(result, alpha);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetD.vert b/tests/manual/planets-qml/shaders/gl3/planetD.vert
new file mode 100644
index 000000000..9f1b6331a
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetD.vert
@@ -0,0 +1,29 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+in vec3 vertexPosition;
+in vec3 vertexNormal;
+in vec2 vertexTexCoord;
+
+out vec3 position;
+out vec3 normal;
+out vec2 texCoord;
+
+uniform mat4 modelMatrix;
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+void main()
+{
+ texCoord = vertexTexCoord * texCoordScale;
+ normal = normalize(modelViewNormal * vertexNormal);
+ position = vec3(modelView * vec4(vertexPosition, 1.0));
+
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetDB.frag b/tests/manual/planets-qml/shaders/gl3/planetDB.frag
new file mode 100644
index 000000000..e8bd7296f
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetDB.frag
@@ -0,0 +1,66 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+uniform mat4 viewMatrix;
+
+uniform vec3 lightPosition;
+uniform vec3 lightIntensity;
+
+uniform vec3 ka; // Ambient reflectivity
+uniform vec3 ks; // Specular reflectivity
+uniform float shininess; // Specular shininess factor
+uniform float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D normalTexture;
+
+in vec3 lightDir;
+in vec3 viewDir;
+in vec2 texCoord;
+
+out vec4 fragColor;
+
+void dbModel(const in vec3 norm, const in vec2 flipYTexCoord, out vec3 ambientAndDiff, out vec3 spec)
+{
+ // Reflection of light direction about normal
+ vec3 r = reflect(-lightDir, norm);
+
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Calculate the ambient contribution
+ vec3 ambient = lightIntensity * ka * diffuseColor;
+
+ // Calculate the diffuse contribution
+ float sDotN = max(dot(lightDir, norm), 0.0);
+ vec3 diffuse = lightIntensity * diffuseColor * sDotN;
+
+ // Sum the ambient and diffuse contributions
+ ambientAndDiff = ambient + diffuse;
+
+ // Calculate the specular highlight contribution
+ spec = vec3(0.0);
+ if (sDotN > 0.0)
+ spec = (lightIntensity * ks) * pow(max(dot(r, viewDir), 0.0), shininess);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ // Sample the textures at the interpolated texCoords
+ vec4 normal = 2.0 * texture(normalTexture, flipYTexCoord) - vec4(1.0);
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Calculate the lighting model, keeping the specular component separate
+ vec3 ambientAndDiff, spec;
+ dbModel(normalize(normal.xyz), flipYTexCoord, ambientAndDiff, spec);
+ result = ambientAndDiff + spec;
+
+ // Combine spec with ambient+diffuse for final fragment color
+ fragColor = vec4(result, opacity);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetDB.vert b/tests/manual/planets-qml/shaders/gl3/planetDB.vert
new file mode 100644
index 000000000..b6a72058c
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetDB.vert
@@ -0,0 +1,54 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+in vec3 vertexPosition;
+in vec3 vertexNormal;
+in vec2 vertexTexCoord;
+in vec4 vertexTangent;
+
+out vec3 lightDir;
+out vec3 viewDir;
+out vec2 texCoord;
+
+uniform mat4 viewMatrix;
+uniform mat4 modelMatrix;
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+uniform vec3 lightPosition;
+
+void main()
+{
+ // Pass through texture coordinates
+ texCoord = vertexTexCoord * texCoordScale;
+
+ // Transform position, normal, and tangent to eye coords
+ vec3 normal = normalize(modelViewNormal * vertexNormal);
+ vec3 tangent = normalize(modelViewNormal * vertexTangent.xyz);
+ vec3 position = vec3(modelView * vec4(vertexPosition, 1.0));
+
+ // Calculate binormal vector
+ vec3 binormal = normalize(cross(normal, tangent));
+
+ // Construct matrix to transform from eye coords to tangent space
+ mat3 tangentMatrix = mat3 (
+ tangent.x, binormal.x, normal.x,
+ tangent.y, binormal.y, normal.y,
+ tangent.z, binormal.z, normal.z);
+
+ // Transform light direction and view direction to tangent space
+ vec3 s = lightPosition - position;
+ lightDir = normalize(tangentMatrix * vec3(viewMatrix * vec4(s, 1.0)));
+
+ vec3 v = -position;
+ viewDir = normalize(tangentMatrix * v);
+
+ // Calculate vertex position in clip coordinates
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetDS.frag b/tests/manual/planets-qml/shaders/gl3/planetDS.frag
new file mode 100644
index 000000000..ccf48d6cb
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetDS.frag
@@ -0,0 +1,62 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+uniform mat4 viewMatrix;
+
+uniform vec3 lightPosition;
+uniform vec3 lightIntensity;
+
+uniform vec3 ka; // Ambient reflectivity
+uniform float shininess; // Specular shininess factor
+uniform float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D specularTexture;
+
+in vec3 position;
+in vec3 normal;
+in vec2 texCoord;
+
+out vec4 fragColor;
+
+vec3 dsModel(const in vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+ vec3 specularColor = texture(specularTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * specularColor);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+ result += dsModel(flipYTexCoord);
+
+ fragColor = vec4(result, opacity * texture(diffuseTexture, flipYTexCoord).a);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetDSB.frag b/tests/manual/planets-qml/shaders/gl3/planetDSB.frag
new file mode 100644
index 000000000..c7206e559
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetDSB.frag
@@ -0,0 +1,67 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+uniform mat4 viewMatrix;
+
+uniform vec3 lightPosition;
+uniform vec3 lightIntensity;
+
+uniform vec3 ka; // Ambient reflectivity
+uniform float shininess; // Specular shininess factor
+uniform float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+uniform sampler2D specularTexture;
+uniform sampler2D normalTexture;
+
+in vec3 lightDir;
+in vec3 viewDir;
+in vec2 texCoord;
+
+out vec4 fragColor;
+
+void dsbModel(const in vec3 norm, const in vec2 flipXTexCoord, out vec3 ambientAndDiff, out vec3 spec)
+{
+ // Reflection of light direction about normal
+ vec3 r = reflect(-lightDir, norm);
+
+ vec3 diffuseColor = texture(diffuseTexture, flipXTexCoord).rgb;
+ vec3 specularColor = texture(specularTexture, flipXTexCoord).rgb;
+
+ // Calculate the ambient contribution
+ vec3 ambient = lightIntensity * ka * diffuseColor;
+
+ // Calculate the diffuse contribution
+ float sDotN = max(dot(lightDir, norm), 0.0);
+ vec3 diffuse = lightIntensity * diffuseColor * sDotN;
+
+ // Sum the ambient and diffuse contributions
+ ambientAndDiff = ambient + diffuse;
+
+ // Calculate the specular highlight contribution
+ spec = vec3(0.0);
+ if (sDotN > 0.0)
+ spec = (lightIntensity * (shininess / (8.0 * 3.14))) * pow(max(dot(r, viewDir), 0.0), shininess);
+
+ spec *= specularColor;
+}
+
+void main()
+{
+ vec2 flipXTexCoord = texCoord;
+ flipXTexCoord.x = 1.0 - texCoord.x;
+
+ // Sample the textures at the interpolated texCoords
+ vec4 normal = 2.0 * texture(normalTexture, flipXTexCoord) - vec4(1.0);
+
+ // Calculate the lighting model, keeping the specular component separate
+ vec3 ambientAndDiff, spec;
+ dsbModel(normalize(normal.xyz), flipXTexCoord, ambientAndDiff, spec);
+ vec3 result = ambientAndDiff + spec;
+
+ // Combine spec with ambient+diffuse for final fragment color
+ fragColor = vec4(result, opacity);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetDShadow.frag b/tests/manual/planets-qml/shaders/gl3/planetDShadow.frag
new file mode 100644
index 000000000..02eea673e
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetDShadow.frag
@@ -0,0 +1,70 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+uniform mat4 viewMatrix;
+
+uniform vec3 lightPosition;
+uniform vec3 lightIntensity;
+
+uniform vec3 ka; // Ambient reflectivity
+uniform vec3 ks; // Specular reflectivity
+uniform float shininess; // Specular shininess factor
+uniform float opacity; // Alpha channel
+
+uniform sampler2D diffuseTexture;
+
+uniform sampler2DShadow shadowMapTexture;
+
+in vec4 positionInLightSpace;
+
+in vec3 position;
+in vec3 normal;
+in vec2 texCoord;
+
+out vec4 fragColor;
+
+vec3 dModel(const in vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * ks);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ float shadowMapSample = textureProj(shadowMapTexture, positionInLightSpace);
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+ if (shadowMapSample > 0)
+ result += dModel(flipYTexCoord);
+
+ float alpha = opacity * texture(diffuseTexture, flipYTexCoord).a;
+
+ fragColor = vec4(result, alpha);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/planetDShadow.vert b/tests/manual/planets-qml/shaders/gl3/planetDShadow.vert
new file mode 100644
index 000000000..e2dbaa0df
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/planetDShadow.vert
@@ -0,0 +1,38 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+in vec3 vertexPosition;
+in vec3 vertexNormal;
+in vec2 vertexTexCoord;
+
+out vec4 positionInLightSpace;
+out vec3 position;
+out vec3 normal;
+out vec2 texCoord;
+
+uniform mat4 lightViewProjection;
+uniform mat4 modelMatrix;
+uniform mat4 modelView;
+uniform mat3 modelViewNormal;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+void main()
+{
+ const mat4 shadowMatrix = mat4(0.5, 0.0, 0.0, 0.0,
+ 0.0, 0.5, 0.0, 0.0,
+ 0.0, 0.0, 0.5, 0.0,
+ 0.5, 0.5, 0.5, 1.0);
+
+ positionInLightSpace = shadowMatrix * lightViewProjection * modelMatrix * vec4(vertexPosition, 1.0);
+
+ texCoord = vertexTexCoord * texCoordScale;
+ normal = normalize(modelViewNormal * vertexNormal);
+ position = vec3(modelView * vec4(vertexPosition, 1.0));
+
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/shadowmap.frag b/tests/manual/planets-qml/shaders/gl3/shadowmap.frag
new file mode 100644
index 000000000..31b39e148
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/shadowmap.frag
@@ -0,0 +1,8 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+void main()
+{
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/shadowmap.vert b/tests/manual/planets-qml/shaders/gl3/shadowmap.vert
new file mode 100644
index 000000000..d245cd127
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/shadowmap.vert
@@ -0,0 +1,13 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+in vec3 vertexPosition;
+
+uniform mat4 mvp;
+
+void main()
+{
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/sun.frag b/tests/manual/planets-qml/shaders/gl3/sun.frag
new file mode 100644
index 000000000..d62e87954
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/sun.frag
@@ -0,0 +1,30 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+uniform sampler2D diffuseTexture;
+
+in vec3 position;
+in vec2 texCoord;
+
+out vec4 fragColor;
+
+vec4 dModel(const in vec2 flipYTexCoord)
+{
+ // Lookup diffuse
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ return vec4(diffuseColor, 1.0);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ vec4 result = dModel(flipYTexCoord);
+
+ fragColor = result;
+}
diff --git a/tests/manual/planets-qml/shaders/gl3/sun.vert b/tests/manual/planets-qml/shaders/gl3/sun.vert
new file mode 100644
index 000000000..0734c1c1a
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/gl3/sun.vert
@@ -0,0 +1,23 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 150 core
+
+in vec3 vertexPosition;
+in vec2 vertexTexCoord;
+
+out vec3 position;
+out vec2 texCoord;
+
+uniform mat4 modelView;
+uniform mat4 mvp;
+
+uniform float texCoordScale;
+
+void main()
+{
+ texCoord = vertexTexCoord * texCoordScale;
+ position = vec3(modelView * vec4(vertexPosition, 1.0));
+ gl_Position = mvp * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetD.frag b/tests/manual/planets-qml/shaders/rhi/planetD.frag
new file mode 100644
index 000000000..9dde7b266
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetD.frag
@@ -0,0 +1,82 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+layout(binding=3) uniform sampler2D diffuseTexture;
+
+layout(location=0) in vec3 position;
+layout(location=1) in vec3 normal;
+layout(location=2) in vec2 texCoord;
+
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 uncorrectedProjectionMatrix;
+ mat4 clipCorrectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(location=0) out vec4 fragColor;
+
+vec3 dModel(const in vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * ks);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+ result += dModel(flipYTexCoord);
+
+ float alpha = opacity * texture(diffuseTexture, flipYTexCoord).a;
+
+ fragColor = vec4(result, alpha);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetD.vert b/tests/manual/planets-qml/shaders/rhi/planetD.vert
new file mode 100644
index 000000000..2c5c45176
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetD.vert
@@ -0,0 +1,43 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(location=0) in vec3 vertexPosition;
+layout(location=1) in vec3 vertexNormal;
+layout(location=2) in vec2 vertexTexCoord;
+
+layout(location=0) out vec3 position;
+layout(location=1) out vec3 normal;
+layout(location=2) out vec2 texCoord;
+
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+void main()
+{
+ texCoord = vertexTexCoord * texCoordScale;
+ normal = normalize(modelNormalMatrix * vertexNormal);
+ position = vec3(modelViewMatrix * vec4(vertexPosition, 1.0));
+
+ gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetDB.frag b/tests/manual/planets-qml/shaders/rhi/planetDB.frag
new file mode 100644
index 000000000..a2977a9a0
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetDB.frag
@@ -0,0 +1,85 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 uncorrectedProjectionMatrix;
+ mat4 clipCorrectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+layout(binding=3) uniform sampler2D diffuseTexture;
+layout(binding=4) uniform sampler2D normalTexture;
+
+layout(location = 0) in vec3 lightDir;
+layout(location = 1) in vec3 viewDir;
+layout(location = 2) in vec2 texCoord;
+
+layout(location = 0) out vec4 fragColor;
+
+void dbModel(const in vec3 norm, const in vec2 flipYTexCoord, out vec3 ambientAndDiff, out vec3 spec)
+{
+ // Reflection of light direction about normal
+ vec3 r = reflect(-lightDir, norm);
+
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Calculate the ambient contribution
+ vec3 ambient = lightIntensity * ka * diffuseColor;
+
+ // Calculate the diffuse contribution
+ float sDotN = max(dot(lightDir, norm), 0.0);
+ vec3 diffuse = lightIntensity * diffuseColor * sDotN;
+
+ // Sum the ambient and diffuse contributions
+ ambientAndDiff = ambient + diffuse;
+
+ // Calculate the specular highlight contribution
+ spec = vec3(0.0);
+ if (sDotN > 0.0)
+ spec = (lightIntensity * ks) * pow(max(dot(r, viewDir), 0.0), shininess);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ // Sample the textures at the interpolated texCoords
+ vec4 normal = 2.0 * texture(normalTexture, flipYTexCoord) - vec4(1.0);
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Calculate the lighting model, keeping the specular component separate
+ vec3 ambientAndDiff, spec;
+ dbModel(normalize(normal.xyz), flipYTexCoord, ambientAndDiff, spec);
+ result = ambientAndDiff + spec;
+
+ // Combine spec with ambient+diffuse for final fragment color
+ fragColor = vec4(result, opacity);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetDB.vert b/tests/manual/planets-qml/shaders/rhi/planetDB.vert
new file mode 100644
index 000000000..56efa668c
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetDB.vert
@@ -0,0 +1,84 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(location=0) in vec3 vertexPosition;
+layout(location=1) in vec3 vertexNormal;
+layout(location=2) in vec2 vertexTexCoord;
+layout(location=3) in vec4 vertexTangent;
+
+layout(location=0) out vec3 lightDir;
+layout(location=1) out vec3 viewDir;
+layout(location=2) out vec2 texCoord;
+
+
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 uncorrectedProjectionMatrix;
+ mat4 clipCorrectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+void main()
+{
+ // Pass through texture coordinates
+ texCoord = vertexTexCoord * texCoordScale;
+
+ // Transform position, normal, and tangent to eye coords
+ vec3 normal = normalize(modelNormalMatrix * vertexNormal);
+ vec3 tangent = normalize(modelNormalMatrix * vertexTangent.xyz);
+ vec3 position = vec3(modelViewMatrix * vec4(vertexPosition, 1.0));
+
+ // Calculate binormal vector
+ vec3 binormal = normalize(cross(normal, tangent));
+
+ // Construct matrix to transform from eye coords to tangent space
+ mat3 tangentMatrix = mat3 (
+ tangent.x, binormal.x, normal.x,
+ tangent.y, binormal.y, normal.y,
+ tangent.z, binormal.z, normal.z);
+
+ // Transform light direction and view direction to tangent space
+ vec3 s = lightPosition - position;
+ lightDir = normalize(tangentMatrix * vec3(viewMatrix * vec4(s, 1.0)));
+
+ vec3 v = -position;
+ viewDir = normalize(tangentMatrix * v);
+
+ // Calculate vertex position in clip coordinates
+ gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetDS.frag b/tests/manual/planets-qml/shaders/rhi/planetDS.frag
new file mode 100644
index 000000000..f8cd25d0a
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetDS.frag
@@ -0,0 +1,82 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+layout(binding=3) uniform sampler2D diffuseTexture;
+layout(binding=4) uniform sampler2D specularTexture;
+
+layout(location=0) in vec3 position;
+layout(location=1) in vec3 normal;
+layout(location=2) in vec2 texCoord;
+
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 uncorrectedProjectionMatrix;
+ mat4 clipCorrectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(location=0) out vec4 fragColor;
+
+vec3 dsModel(const in vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+ vec3 specularColor = texture(specularTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * specularColor);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+ result += dsModel(flipYTexCoord);
+
+ fragColor = vec4(result, opacity * texture(diffuseTexture, flipYTexCoord).a);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetDSB.frag b/tests/manual/planets-qml/shaders/rhi/planetDSB.frag
new file mode 100644
index 000000000..875a06185
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetDSB.frag
@@ -0,0 +1,87 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 uncorrectedProjectionMatrix;
+ mat4 clipCorrectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+layout(binding=3) uniform sampler2D diffuseTexture;
+layout(binding=4) uniform sampler2D normalTexture;
+layout(binding=5) uniform sampler2D specularTexture;
+
+layout(location = 0) in vec3 lightDir;
+layout(location = 1) in vec3 viewDir;
+layout(location = 2) in vec2 texCoord;
+
+layout(location = 0) out vec4 fragColor;
+
+void dsbModel(const in vec3 norm, const in vec2 flipXTexCoord, out vec3 ambientAndDiff, out vec3 spec)
+{
+ // Reflection of light direction about normal
+ vec3 r = reflect(-lightDir, norm);
+
+ vec3 diffuseColor = texture(diffuseTexture, flipXTexCoord).rgb;
+ vec3 specularColor = texture(specularTexture, flipXTexCoord).rgb;
+
+ // Calculate the ambient contribution
+ vec3 ambient = lightIntensity * ka * diffuseColor;
+
+ // Calculate the diffuse contribution
+ float sDotN = max(dot(lightDir, norm), 0.0);
+ vec3 diffuse = lightIntensity * diffuseColor * sDotN;
+
+ // Sum the ambient and diffuse contributions
+ ambientAndDiff = ambient + diffuse;
+
+ // Calculate the specular highlight contribution
+ spec = vec3(0.0);
+ if (sDotN > 0.0)
+ spec = (lightIntensity * (shininess / (8.0 * 3.14))) * pow(max(dot(r, viewDir), 0.0), shininess);
+
+ spec *= specularColor;
+}
+
+void main()
+{
+ vec2 flipXTexCoord = texCoord;
+ flipXTexCoord.x = 1.0 - texCoord.x;
+
+ // Sample the textures at the interpolated texCoords
+ vec4 normal = 2.0 * texture(normalTexture, flipXTexCoord) - vec4(1.0);
+
+ // Calculate the lighting model, keeping the specular component separate
+ vec3 ambientAndDiff, spec;
+ dsbModel(normalize(normal.xyz), flipXTexCoord, ambientAndDiff, spec);
+ vec3 result = ambientAndDiff + spec;
+
+ // Combine spec with ambient+diffuse for final fragment color
+ fragColor = vec4(result, opacity);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetDShadow.frag b/tests/manual/planets-qml/shaders/rhi/planetDShadow.frag
new file mode 100644
index 000000000..7b1c54210
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetDShadow.frag
@@ -0,0 +1,87 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+layout(std140, binding = 0) uniform qt3d_render_view_uniforms {
+ mat4 viewMatrix;
+ mat4 projectionMatrix;
+ mat4 uncorrectedProjectionMatrix;
+ mat4 clipCorrectionMatrix;
+ mat4 viewProjectionMatrix;
+ mat4 inverseViewMatrix;
+ mat4 inverseProjectionMatrix;
+ mat4 inverseViewProjectionMatrix;
+ mat4 viewportMatrix;
+ mat4 inverseViewportMatrix;
+ vec4 textureTransformMatrix;
+ vec3 eyePosition;
+ float aspectRatio;
+ float gamma;
+ float exposure;
+ float time;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+layout(binding=3) uniform sampler2D diffuseTexture;
+layout(binding=4) uniform sampler2DShadow shadowMapTexture;
+
+layout(location = 3) in vec4 positionInLightSpace;
+
+layout(location = 0) in vec3 position;
+layout(location = 1) in vec3 normal;
+layout(location = 2) in vec2 texCoord;
+
+layout(location = 0)out vec4 fragColor;
+
+vec3 dModel(const in vec2 flipYTexCoord)
+{
+ // Calculate the vector from the light to the fragment
+ vec3 s = normalize(vec3(viewMatrix * vec4(lightPosition, 1.0)) - position);
+
+ // Calculate the vector from the fragment to the eye position
+ // (origin since this is in "eye" or "camera" space)
+ vec3 v = normalize(-position);
+
+ // Reflect the light beam using the normal at this fragment
+ vec3 r = reflect(-s, normal);
+
+ // Calculate the diffuse component
+ float diffuse = max(dot(s, normal), 0.0);
+
+ // Calculate the specular component
+ float specular = 0.0;
+ if (dot(s, normal) > 0.0)
+ specular = (shininess / (8.0 * 3.14)) * pow(max(dot(r, v), 0.0), shininess);
+
+ // Lookup diffuse and specular factors
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ // Combine the ambient, diffuse and specular contributions
+ return lightIntensity * ((ka + diffuse) * diffuseColor + specular * ks);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ float shadowMapSample = textureProj(shadowMapTexture, positionInLightSpace);
+
+ vec3 result = lightIntensity * ka * texture(diffuseTexture, flipYTexCoord).rgb;
+ if (shadowMapSample > 0)
+ result += dModel(flipYTexCoord);
+
+ float alpha = opacity * texture(diffuseTexture, flipYTexCoord).a;
+
+ fragColor = vec4(result, alpha);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/planetDShadow.vert b/tests/manual/planets-qml/shaders/rhi/planetDShadow.vert
new file mode 100644
index 000000000..5216e9f6b
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/planetDShadow.vert
@@ -0,0 +1,52 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(location=0) in vec3 vertexPosition;
+layout(location=1) in vec3 vertexNormal;
+layout(location=2) in vec2 vertexTexCoord;
+
+layout(location = 3) out vec4 positionInLightSpace;
+
+layout(location = 0) out vec3 position;
+layout(location = 1) out vec3 normal;
+layout(location = 2) out vec2 texCoord;
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+ mat4 lightViewProjection;
+};
+
+void main()
+{
+ const mat4 shadowMatrix = mat4(0.5, 0.0, 0.0, 0.0,
+ 0.0, 0.5, 0.0, 0.0,
+ 0.0, 0.0, 0.5, 0.0,
+ 0.5, 0.5, 0.5, 1.0);
+
+ positionInLightSpace = shadowMatrix * lightViewProjection * modelMatrix * vec4(vertexPosition, 1.0);
+
+ texCoord = vertexTexCoord * texCoordScale;
+ normal = normalize(modelNormalMatrix * vertexNormal);
+ position = vec3(modelViewMatrix * vec4(vertexPosition, 1.0));
+
+ gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/shadowmap.frag b/tests/manual/planets-qml/shaders/rhi/shadowmap.frag
new file mode 100644
index 000000000..7dab1669c
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/shadowmap.frag
@@ -0,0 +1,8 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+void main()
+{
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/shadowmap.vert b/tests/manual/planets-qml/shaders/rhi/shadowmap.vert
new file mode 100644
index 000000000..c5c3a9da1
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/shadowmap.vert
@@ -0,0 +1,21 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(location=0) in vec3 vertexPosition;
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+void main()
+{
+ gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/sun.frag b/tests/manual/planets-qml/shaders/rhi/sun.frag
new file mode 100644
index 000000000..e48b206b4
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/sun.frag
@@ -0,0 +1,30 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+layout(binding=3) uniform sampler2D diffuseTexture;
+
+layout(location=0) in vec3 position;
+layout(location=1) in vec2 texCoord;
+
+layout(location = 0) out vec4 fragColor;
+
+vec4 dModel(const in vec2 flipYTexCoord)
+{
+ // Lookup diffuse
+ vec3 diffuseColor = texture(diffuseTexture, flipYTexCoord).rgb;
+
+ return vec4(diffuseColor, 1.0);
+}
+
+void main()
+{
+ vec2 flipYTexCoord = texCoord;
+ flipYTexCoord.y = 1.0 - texCoord.y;
+
+ vec4 result = dModel(flipYTexCoord);
+
+ fragColor = result;
+}
diff --git a/tests/manual/planets-qml/shaders/rhi/sun.vert b/tests/manual/planets-qml/shaders/rhi/sun.vert
new file mode 100644
index 000000000..07bb258e2
--- /dev/null
+++ b/tests/manual/planets-qml/shaders/rhi/sun.vert
@@ -0,0 +1,39 @@
+// Copyright (C) 2014 Klaralvdalens Datakonsult AB (KDAB).
+// Copyright (C) 2017 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#version 450 core
+
+
+layout(location=0) in vec3 vertexPosition;
+layout(location=1) in vec2 vertexTexCoord;
+
+layout(location=0) out vec3 position;
+layout(location=1) out vec2 texCoord;
+
+layout(std140, binding = 1) uniform qt3d_command_uniforms {
+ mat4 modelMatrix;
+ mat4 inverseModelMatrix;
+ mat4 modelViewMatrix;
+ mat3 modelNormalMatrix;
+ mat4 inverseModelViewMatrix;
+ mat4 modelViewProjection;
+ mat4 inverseModelViewProjectionMatrix;
+};
+
+layout(std140, binding = 2) uniform extras_uniforms {
+ float texCoordScale;
+ vec3 ka; // Ambient reflectivity
+ vec3 ks; // Specular reflectivity
+ float shininess; // Specular shininess factor
+ float opacity; // Alpha channel
+ vec3 lightPosition;
+ vec3 lightIntensity;
+};
+
+void main()
+{
+ texCoord = vertexTexCoord * texCoordScale;
+ position = vec3(modelViewMatrix * vec4(vertexPosition, 1.0));
+ gl_Position = modelViewProjection * vec4(vertexPosition, 1.0);
+}