var hoverEffect = function(e) {
	var t = window.THREE;
	function n() {
			for (var e = 0; e < arguments.length; e++)
					if (void 0 !== arguments[e])
							return arguments[e]
	}

	var i = e.parent
		, a = e.displacementImage
		, r = e.image1
		, o = e.image2
		, s = n(e.intensity1, e.intensity, 1)
		, d = n(e.intensity2, e.intensity, 1)
		, l = n(e.angle, Math.PI / 4)
		, f = n(e.angle1, l)
		, v = n(e.angle2, 3 * -l)
		, p = n(e.speedIn, e.speed, 1.6)
		, u = n(e.speedOut, e.speed, 1.2)
		, c = n(e.hover, !0)
		, m = n(e.easing, JT.Expo.Out);
	if (i)
			if (r && o && a) {
					var g = new t.Scene
						, h = new t.OrthographicCamera(i.offsetWidth / -2,i.offsetWidth / 2,i.offsetHeight / 2,i.offsetHeight / -2,1,1e3);
					h.position.z = 1;
					var x = new t.WebGLRenderer({
							antialias: !1
					});
					x.setPixelRatio(window.devicePixelRatio),
					x.setClearColor(16777215, 0),
					x.setSize(i.offsetWidth, i.offsetHeight),
					i.appendChild(x.domElement);
					var y = function() {
							x.render(g, h)
					}
						, w = new t.TextureLoader;
					w.crossOrigin = "";
					var F = w.load(r, y)
						, E = w.load(o, y)
						, M = w.load(a, y);
					M.wrapS = M.wrapT = t.RepeatWrapping,
					F.magFilter = E.magFilter = t.LinearFilter,
					F.minFilter = E.minFilter = t.LinearFilter;
					var P = new t.ShaderMaterial({
							uniforms: {
									intensity1: {
											type: "f",
											value: s
									},
									intensity2: {
											type: "f",
											value: d
									},
									dispFactor: {
											type: "f",
											value: 0
									},
									angle1: {
											type: "f",
											value: f
									},
									angle2: {
											type: "f",
											value: v
									},
									texture1: {
											type: "t",
											value: F
									},
									texture2: {
											type: "t",
											value: E
									},
									disp: {
											type: "t",
											value: M
									}
							},
							vertexShader: "\nvarying vec2 vUv;\nvoid main() {\n  vUv = uv;\n  gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}\n",
							fragmentShader: "\nvarying vec2 vUv;\n\nuniform float dispFactor;\nuniform sampler2D disp;\n\nuniform sampler2D texture1;\nuniform sampler2D texture2;\nuniform float angle1;\nuniform float angle2;\nuniform float intensity1;\nuniform float intensity2;\n\nmat2 getRotM(float angle) {\n  float s = sin(angle);\n  float c = cos(angle);\n  return mat2(c, -s, s, c);\n}\n\nvoid main() {\n  vec4 disp = texture2D(disp, vUv);\n  vec2 dispVec = vec2(disp.r, disp.g);\n  vec2 distortedPosition1 = vUv + getRotM(angle1) * dispVec * intensity1 * dispFactor;\n  vec2 distortedPosition2 = vUv + getRotM(angle2) * dispVec * intensity2 * (1.0 - dispFactor);\n  vec4 _texture1 = texture2D(texture1, distortedPosition1);\n  vec4 _texture2 = texture2D(texture2, distortedPosition2);\n  gl_FragColor = mix(_texture1, _texture2, dispFactor);\n}\n",
							transparent: !0,
							opacity: 1
					})
						, L = new t.PlaneBufferGeometry(i.offsetWidth,i.offsetHeight,1)
						, R = new t.Mesh(L,P);
					g.add(R),
					c && (i.addEventListener("mouseenter", U),
					i.addEventListener("touchstart", U),
					i.addEventListener("mouseleave", C),
					i.addEventListener("touchend", C)),
					window.addEventListener("resize", function(e) {
							x.setSize(i.offsetWidth, i.offsetHeight)
					}),
					this.next = U,
					this.previous = C
			} else
					console.warn("One or more images are missing");
	else
			console.warn("Parent missing");
	function U() {
			JT.to(P.uniforms.dispFactor, p, {
					value: 1,
					ease: m,
					onUpdate: y,
					onComplete: y
			})
	}
	function C() {
		JT.pause(P.uniforms.dispFactor);
		JT.to(P.uniforms.dispFactor, u, {
				value: 0,
				ease: m,
				onUpdate: y,
				onComplete: y
		})
	}
};
