import QtQuick 2.0
 import Qt3D 1.0
 Viewport {
     width: parent.width
     height: parent.height
     picking: true
     camera: Camera {
         eye: Qt.vector3d(0, 3, 10)
     }
     Effect {
         id: effect_china
         material: china
     }
     Effect {
         id: effect_china_hightlight
         material: china_highlight;
     }
     Effect {
         id: effect_metal
         material: metal
     }
     Effect {
         id: effect_metal_highlight
         material: metal_highlight;
     }
     Item3D {
         id: teapot
         transform: [
             Rotation3D {
                 id: teapot_rotate1
                 angle: 0
                 axis: Qt.vector3d(0, 1, 0)
             },
             Rotation3D {
                 id: teapot_rotate2
                 angle: 0
                 axis: Qt.vector3d(0, 0, 1)
             }
         ]
         property bool bounce: false
         Item3D {
             id: body
             mesh: Mesh { source: "teapot-body.bez" }
             effect: effect_china
             onHoverEnter: { effect = effect_china_hightlight }
             onHoverLeave: { effect = effect_china }
             onClicked: { teapot.bounce = true }
         }
         Item3D {
             id: handle
             mesh: Mesh { source: "teapot-handle.bez" }
             effect: effect_china
             onHoverEnter: { effect = effect_china_hightlight }
             onHoverLeave: { effect = effect_china }
             onClicked: {
                 if (teapot.state == "facing_left" ||
                     teapot.state == "pour_left") {
                     teapot.state = "facing_right";
                 } else if (teapot.state == "facing_right" ||
                            teapot.state == "pour_right") {
                     teapot_rotate1.angle = 0;
                     teapot.state = "facing_left";
                 } else {
                     teapot.state = "facing_left";
                 }
             }
         }
         Item3D {
             id: spout
             mesh: Mesh { source: "teapot-spout.bez" }
             effect: effect_china
             onHoverEnter: { effect = effect_china_hightlight }
             onHoverLeave: { effect = effect_china }
             onClicked: {
                 if (teapot.state == "facing_left") {
                     teapot.state = "pour_left";
                 } else if (teapot.state == "pour_left") {
                     teapot.state = "facing_left";
                     teapot.state = "pour_left";
                 } else if (teapot.state == "pour_right" ||
                            teapot.state == "facing_right") {
                     teapot.state = "";
                     teapot_rotate1.angle = 0;
                     teapot.state = "pour_right";
                 } else {
                     teapot.state = "pour_right";
                 }
             }
         }
         SequentialAnimation on y{
             running: teapot.bounce
             NumberAnimation { to : 1.0; duration: 300; easing.type: "OutQuad" }
             NumberAnimation { to : 0.0; duration: 300; easing.type: "OutBounce" }
             onCompleted: teapot.bounce = false
         }
         states: [
             State {
                 name: "facing_left"
                 PropertyChanges {
                     target: teapot_rotate1
                     angle: 180
                 }
             },
             State {
                 name: "facing_right"
                 PropertyChanges {
                     target: teapot_rotate1
                     angle: 360
                 }
             },
             State {
                 name: "pour_left"
                 PropertyChanges {
                     target: teapot
                     y: 0
                 }
                 PropertyChanges {
                     target: teapot
                     x: 0
                 }
                 PropertyChanges {
                     target: teapot_rotate1
                     angle: 180
                 }
                 PropertyChanges {
                     target: teapot_rotate2
                     angle: 0
                 }
             },
             State {
                 name: "pour_right"
                 PropertyChanges {
                     target: teapot
                     y: 0
                 }
                 PropertyChanges {
                     target: teapot
                     x: 0
                 }
                 PropertyChanges {
                     target: teapot_rotate2
                     angle: 0
                 }
             }
         ]
         transitions: [
             Transition {
                 from: "*"
                 to: "facing_left"
                 NumberAnimation {
                     targets: teapot_rotate1
                     properties: "angle"
                     duration: 300
                 }
             },
             Transition {
                 from: "*"
                 to: "facing_right"
                 NumberAnimation {
                     targets: teapot_rotate1
                     properties: "angle"
                     duration: 300
                 }
             },
             Transition {
                 from: "*"
                 to: "pour_left"
                 SequentialAnimation {
                     ParallelAnimation {
                         NumberAnimation {
                             target: teapot
                             property: "y"
                             duration: 500
                             to: 1
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot
                             property: "x"
                             duration: 500
                             to: -0.5
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot_rotate2
                             property: "angle"
                             duration: 500
                             to: 45
                             easing.type: "OutQuad"
                         }
                     }
                     PauseAnimation { duration: 700 }
                     ParallelAnimation {
                         NumberAnimation {
                             target: teapot
                             property: "y"
                             duration: 500
                             to: 0
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot
                             property: "x"
                             duration: 500
                             to: 0
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot_rotate2
                             property: "angle"
                             duration: 500
                             to: 0
                             easing.type: "OutQuad"
                         }
                     }
                 }
             },
             Transition {
                 from: "*"
                 to: "pour_right"
                 SequentialAnimation {
                     ParallelAnimation {
                         NumberAnimation {
                             target: teapot
                             property: "y"
                             duration: 500
                             to: 1
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot
                             property: "x"
                             duration: 500
                             to: 0.5
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot_rotate2
                             property: "angle"
                             duration: 500
                             to: -45
                             easing.type: "OutQuad"
                         }
                     }
                     PauseAnimation { duration: 700 }
                     ParallelAnimation {
                         NumberAnimation {
                             target: teapot
                             property: "y"
                             duration: 500
                             to: 0
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot
                             property: "x"
                             duration: 500
                             to: 0
                             easing.type: "OutQuad"
                         }
                         NumberAnimation {
                             target: teapot_rotate2
                             property: "angle"
                             duration: 500
                             to: 0
                             easing.type: "OutQuad"
                         }
                     }
                 }
             }
         ]
     }
     Teacup {
         id: teacup1
         position: Qt.vector3d(-2.3, -0.75, 0.0)
     }
     Teacup {
         id: teacup2
         position: Qt.vector3d(2.3, -0.75, 0.0)
         transform: Rotation3D {
             angle: 180
             axis: Qt.vector3d(0, 1, 0)
         }
     }
     Teaspoon {
         x: -1.7
         y: -0.58
         saucerY: teacup1.spoonY
     }
     Teaspoon {
         x: 1.7
         y: -0.58
         saucerY: teacup2.spoonY
     }
     Mesh {
         id: teacup_mesh
         source: "teacup.bez"
     }
     Mesh {
         id: teaspoon_mesh
         source: "teaspoon.bez"
     }
     Material {
         id: china
         ambientColor: "#c09680"
         specularColor: "#3c3c3c"
         shininess: 128
     }
     Material {
         id: china_highlight
         ambientColor: "#ffc000"
         specularColor: "#3c3c00"
         shininess: 128
     }
     Material {
         id: metal
         ambientColor: "#ffffff"
         diffuseColor: "#969696"
         specularColor: "#ffffff"
         shininess: 128
     }
     Material {
         id: metal_highlight
         ambientColor: "#ffff60"
         diffuseColor: "#969660"
         specularColor: "#ffffff"
         shininess: 128
     }
 }