import QtQml 2.14
import QtQuick 2.14
import Qt3D.Core 2.14
import Qt3D.Render 2.14
import Qt3D.Input 2.14
import Qt3D.Logic 2.14

Entity {
	id: root

	property Entity camera

	MouseHandler {
		sourceDevice: mouseDevice
    } 

	LogicalDevice {
		enabled: true
		actions: [
            // Action {
			// 	id: transAction
			// 	ActionInput {
			// 		sourceDevice: mouseDevice
			// 		buttons: [MouseEvent.MiddleButton]
			// 	}
			// },
            // Action {
			// 	id: orbitAction
			// 	ActionInput {
			// 		sourceDevice: mouseDevice
			// 		buttons: [MouseEvent.RightButton]
			// 	}
			// }
			// ,
			// Action {
			// 	id: rotAction
			// 	ActionInput {
			// 		sourceDevice: keyboardDevice
			// 		buttons: [Qt.Key_Shift]
			// 	}
			// }
		]
		axes: [
			// Axis {
			// 	id: xAxis
			// 	AnalogAxisInput {
			// 		sourceDevice: mouseDevice
			// 		axis: MouseDevice.X
			// 	}
			// },
			// Axis {
			// 	id: yAxis
			// 	AnalogAxisInput {
			// 		sourceDevice: mouseDevice
			// 		axis: MouseDevice.Y
			// 	}
			// },
			Axis {
				id: wAxis
				AnalogAxisInput {
					sourceDevice: mouseDevice
					axis: MouseDevice.WheelY
				}
			}
		]
	}

	FrameAction {
        id: frameAction
        //property real cameraZoomACC: 1000 * wAxis.value - 5 * cameraZoomSPD
        //property real cameraZoomSPD: 0
        property real cameraZoomACC: 50 * wAxis.value - 10 * cameraZoomSPD
        property real cameraZoomSPD: 0
        onTriggered: {
			if(!selectArea.controlEnabled) return
			if(wAxis.value != 0) {
				if (selectArea.highlightItem !== null) {
					selectArea.highlightItem.destroy()
				}
                if (selectArea.measureEnabled) {
                    selectArea.clearCanvas()
                }
			}
            // The time difference since the last frame is passed in as the argument dt. It is a floating point value in units of seconds.
           var disfrontVector = camera.viewCenter.minus(camera.position)
           var frontVector = disfrontVector.normalized()
           //cameraZoomSPD = cameraZoomSPD + cameraZoomACC * dt
           cameraZoomSPD = cameraZoomSPD + cameraZoomACC * 0.03
           var proportion = Math.min(0.3, cameraZoomSPD * 0.03)
           proportion = Math.max(-0.3, proportion)
           camera.position = camera.position.plus(camera.viewCenter.minus(camera.position).times(proportion))
        //    if (orbitAction.active) {
        //         var dis = disfrontVector.length()
        //         var leftVector = camera.upVector.crossProduct(frontVector)
        //         var height = 2 * dis * Math.tan(camera.fieldOfView / 2 * Math.PI / 180)
        //         var width = height * camera.aspectRatio
        //         // if (0!=xAxis.value)
        //         //     console.log("xAxis.value: " + xAxis.value)
        //         // if (0!=yAxis.value)
        //         //     console.log("yAxis.value: " + yAxis.value)
        //         var moveRightVector = leftVector.times(1500 * xAxis.value * width / scene3d.width * dt)
        //         var moveDownVector = camera.upVector.times(1500 * -yAxis.value * height / scene3d.height * dt)
        //         var moveVector = moveRightVector.plus(moveDownVector)
        //         var point = camera.position.plus(moveVector)

        //         frontVector = camera.viewCenter.minus(point).normalized()
        //         camera.position = camera.viewCenter.minus(frontVector.times(dis))
        //         leftVector = camera.upVector.crossProduct(frontVector)
        //         camera.upVector = frontVector.crossProduct(leftVector)
        //         // console.log("width:   "+(xAxis.value*xAxis.value+yAxis.value*yAxis.value)/moveVector.dotProduct(moveVector))
        //     }
	        // if (transAction.active) {
            //     var dis = disfrontVector.length()
            //     var leftVector = camera.upVector.crossProduct(frontVector)
            //     var height = 2 * dis * Math.tan(camera.fieldOfView / 2 * Math.PI / 180)
            //     var width = height * camera.aspectRatio
            //     // if (0!=xAxis.value)
            //     //     console.log("xAxis.value: " + xAxis.value)
            //     // if (0!=yAxis.value)
            //     //     console.log("yAxis.value: " + yAxis.value)
            //     var moveRightVector = leftVector.times(120 * xAxis.value * width / scene3d.width )
            //     var moveDownVector = camera.upVector.times(120 * -yAxis.value * height / scene3d.height )
            //     var moveVector = moveRightVector.plus(moveDownVector).times(0.08*Math.pow(dis,0.008))
            //     camera.position = camera.position.plus(moveVector)
            //     camera.viewCenter = camera.viewCenter.plus(moveVector)
            // }
			// if (rotAction.active) {
			// 	var theta = Math.atan2(dy, dx)
			// 	camera.upVector = camera.upVector.times(Math.cos(theta)).plus(leftVector.times(Math.sin(theta)))
			// }
        }
    }
}