GithubHelp home page GithubHelp logo

Comments (7)

rodionstepanov avatar rodionstepanov commented on July 23, 2024 2

@ProjectPhysX I took mouse_sensitivity = 0.01. It looks like the reaction is getting slower but I still cannot control a view angle properly.

from fluidx3d.

SLGY avatar SLGY commented on July 23, 2024 2

I'm probably telling you something you already know here but you just turn off mouse-input with the "u" key and alt-tab in/out of the program where required to avoid clicking the app window and re-enabling the mouse. I do a lot of remote desktop stuff to the workstation and just turn down the multipliers for I/J/K/L keys, using the mouse is a write-off on remote sessions for me.

from fluidx3d.

ProjectPhysX avatar ProjectPhysX commented on July 23, 2024 1

Hi @rodionstepanov and @SLGY,

I think the root cause here is that the Windows Remote Desktop client fails to execute the SetCursorPos WinAPI command correctly, so it does not center the cursor after reading the distance between cursor and screen center and you see super fast uncontrollable rotation.

I've written an alternative mouse input method that does not rely on SetCursorPos and should work better on remote systems. Please replace the entire LRESULT CALLBACK WndProc(...) {...} function with this code:

LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam) {
	if(message==WM_DESTROY) {
		running = false;
		PostQuitMessage(0);
		exit(0);
	} else if(message==WM_MOUSEMOVE) {
		static int last_x=(int)camera.width/2, last_y=(int)camera.height/2;
		const int new_x=(int)LOWORD(lParam), new_y=(int)HIWORD(lParam);
		camera.input_mouse_dragged(new_x-last_x, new_y-last_y);
		last_x = new_x;
		last_y = new_y;
	} else if(message==WM_MOUSEWHEEL) {
		if((short)HIWORD(wParam)>0) camera.input_scroll_up(); else camera.input_scroll_down();
	} else if(message==WM_LBUTTONDOWN||message==WM_MBUTTONDOWN||message==WM_RBUTTONDOWN) {
		ShowCursor(!camera.lockmouse); // show/hide cursor
		camera.input_key('U');
	} else if(message==WM_KEYDOWN) {
		int key = key_windows((int)wParam);
		if(key=='U') ShowCursor(!camera.lockmouse); // show/hide cursor
		camera.set_key_state(key, true);
		key_bindings(key);
	} else if(message==WM_KEYUP) {
		int key = key_windows((int)wParam);
		camera.set_key_state(key, false);
	}
	return DefWindowProc(window, message, wParam, lParam);
}

This workaround is not a suitable general solution however, as rotation stops as soon as the cursor hits the screen boundaries and on small screens you can't fully rotate ±90° vertically and 360° horizontally. So I put this code only here and not in the repo.

As 2 alternatives with the mouse input version in the repo, you can try:

  • Disable hiding the cursor, by commenting out all ShowCursor(false); lines in src/graphics.cpp. Apparently hiding the cursor is one of the factors that break SetCursorPos.
  • In Windows Group Policy Editor, in Local Computer Policy -> Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Remote Session Environment, set Use WDDM graphic display driver for Remote Desktop Connections to disable.

Kind regards,
Moritz

from fluidx3d.

rodionstepanov avatar rodionstepanov commented on July 23, 2024 1

Hi @ProjectPhysX!
Both recipes work but I stay with first one. No issue any more. Thanks a lot. I express my deepest gratitude and respect to you. It is very cool what you are doing.

from fluidx3d.

ProjectPhysX avatar ProjectPhysX commented on July 23, 2024

Hi @rodionstepanov,

thanks for reporting this. It's the age-old poor design choice of Microsoft's SetCursorPos itself triggering a WM_MOUSEMOVE event, when setting the cursor back to the center of the screen. Usually in my implementation this is not an issue, as screen_width/2 ad screen_height/2 are subtracted and the resulting movement upon cursor centering is 0/0.

However, in another poor design choice by Microsoft, when the remote screen resolution is different and/or off-set compared to the client screen resolution, SetCursorPos(width/2, height/2) works on client and the reported position from WM_MOUSEMOVE is on remote, and when they mismatch, it adds the off-set mouse movement 60 times a second and rotates the camera very fast.

I have now changed the mouse input routine on Windows to avoid WM_MOUSEMOVE alltogether. Please test this new version on your remote setup and tell me if it resolves the bug!

Kind regards,
Moritz

from fluidx3d.

rodionstepanov avatar rodionstepanov commented on July 23, 2024

I'm sorry but it does not resolve the bug. I've test with setup for 3D Taylor-Green vortices; Looks like sensitivity is very high.

from fluidx3d.

ProjectPhysX avatar ProjectPhysX commented on July 23, 2024

@rodionstepanov can you try if reducing the mouse_sensitivity constant helps?

from fluidx3d.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.