* GUIInvoke helper changed to use QMetaObject::invokeMethod which works
on threads better.
* LambdaThread helper class now has a thread member, it doesn't derive
from thread (this seems to be recommended practice).
* Since the exported C functions just take an explicit 'this' parameter
and call the corresponding function, we can just make it contractual
via a virtual interface that the pointer can be dereferenced.
* From https://github.com/Riateche/toolwindowmanager
* It seems superior to the built-in Qt docking as-is, and since it's
a few open source files it should be easy to improve with features
we might want to match DockingUI functionality.
* Programmatic sizing for the default layout seems inflexible, but since
that's a one-time thing it's not the end of the world.
* There's no auto-hide functionality.
* The highlighting of where to drop could be improved, as well as the
detection of where to drop (currently it seems to cycle through
several possibilities each second rather than having a consistent drop
location).
* Floating windows could be styled a bit better.
* Need to check whether we can have nested docking sections (so the
texture viewer e.g. can have its own docks, that won't float or go out
of the texture viewer.
* Building qrenderdoc on windows will be supported just because that's
likely where I will be developing it mostly, but for the foreseeable
future it won't be built by default. If it ever gets good enough to
replace the .NET UI, then we can look at it again.
* It's quite hacky at the moment since it doesn't read out the data in
a structured way, just enough to disassemble. For now it's a proof of
concept kind of thing.
* This is tracking my fork of the Khronos repository
https://github.com/baldurk/glslang on branch 'renderdoc'. See that
branch for my local changes. Only a subset of files is included
* This means that rapidly creating and destroying views doesn't 'leak'
and create more and more chunks in-program and more and more uselessly
created views on replay.
* The old code in m_RangeMax/m_RangeMin setters wasn't doing proper
epsilon enforcing so min=max could end up happening. It's easier to
set both at once (this is all we care about anyway) so that it does
properly make the min and max distinguishable.