浏览代码

JS Lock Mouse Editing Implementation (#959)

Jed974 4 年之前
父节点
当前提交
bf9da08f2c
共有 1 个文件被更改,包括 45 次插入11 次删除
  1. 45 11
      hxd/Window.js.hx

+ 45 - 11
hxd/Window.js.hx

@@ -26,6 +26,7 @@ class Window {
 
 	var curMouseX : Float = 0.;
 	var curMouseY : Float = 0.;
+	var _mouseLock : Bool = false;
 
 	var canvas : js.html.CanvasElement;
 	var element : js.html.EventTarget;
@@ -73,10 +74,15 @@ class Window {
 		canvasPos = canvas.getBoundingClientRect();
 		// add mousemove on window (track mouse even when outside of component)
 		// unless we're having a custom canvas (prevent leaking the listener)
-		if( customCanvas )
+		if( customCanvas ) {
 			canvas.addEventListener("mousemove", onMouseMove);
-		else
+		}
+			
+		else {
 			js.Browser.window.addEventListener("mousemove", onMouseMove);
+		}
+			
+		
 		element.addEventListener("mousedown", onMouseDown);
 		element.addEventListener("mouseup", onMouseUp);
 		element.addEventListener("wheel", onMouseWheel);
@@ -215,12 +221,21 @@ class Window {
 	}
 
 	function get_mouseLock() : Bool {
-		return false;
+		return _mouseLock;
 	}
 
 	function set_mouseLock( v : Bool ) : Bool {
-		if( v ) throw "Not implemented";
-		return false;
+		var customCanvas = canvas != null;
+		if (v) {
+				if (customCanvas) canvas.requestPointerLock();
+				else js.Browser.window.document.documentElement.requestPointerLock();
+			}
+			
+		else {
+			if (customCanvas) canvas.ownerDocument.exitPointerLock();
+			else js.Browser.window.document.exitPointerLock();
+		}
+		return _mouseLock = v;
 	}
 
 	function get_vsync() : Bool return true;
@@ -231,8 +246,14 @@ class Window {
 	}
 
 	function onMouseDown(e:js.html.MouseEvent) {
-		if(e.clientX != curMouseX || e.clientY != curMouseY)
-			onMouseMove(e);
+		if (mouseLock) {
+			if (e.movementX != 0 || e.movementY != 0)
+				onMouseMove(e);
+		}
+		else {
+			if(e.clientX != curMouseX || e.clientY != curMouseY)
+				onMouseMove(e);
+		}
 		var ev = new Event(EPush, mouseX, mouseY);
 		ev.button = switch( e.button ) {
 			case 1: 2;
@@ -243,8 +264,14 @@ class Window {
 	}
 
 	function onMouseUp(e:js.html.MouseEvent) {
-		if(e.clientX != curMouseX || e.clientY != curMouseY)
-			onMouseMove(e);
+		if (mouseLock) {
+			if (e.movementX != 0 || e.movementY != 0)
+				onMouseMove(e);
+		}
+		else {
+			if(e.clientX != curMouseX || e.clientY != curMouseY)
+				onMouseMove(e);
+		}
 		var ev = new Event(ERelease, mouseX, mouseY);
 		ev.button = switch( e.button ) {
 			case 1: 2;
@@ -255,8 +282,15 @@ class Window {
 	}
 
 	function onMouseMove(e:js.html.MouseEvent) {
-		curMouseX = e.clientX;
-		curMouseY = e.clientY;
+		if (mouseLock) {
+			curMouseX += e.movementX;
+			curMouseY += e.movementY;
+		}
+		else {
+			curMouseX = e.clientX;
+			curMouseY = e.clientY;
+		}
+		
 		event(new Event(EMove, mouseX, mouseY));
 	}