mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-11 15:45:05 +02:00
fix scissor and viewport for split screen modes
This commit is contained in:
26
src/level.h
26
src/level.h
@@ -1850,10 +1850,23 @@ struct Level : IGame {
|
||||
//vec4 s = vec4(v.x, -v.w, v.z, -v.y);
|
||||
vec4 s = v;
|
||||
s = (s * 0.5 + 0.5) * vec4(float(vp.z), float(vp.w), float(vp.z), float(vp.w));
|
||||
|
||||
// expand
|
||||
s.x -= 2.0f;
|
||||
s.y -= 2.0f;
|
||||
s.z += 2.0f;
|
||||
s.w += 2.0f;
|
||||
|
||||
s.z -= s.x;
|
||||
s.w -= s.y;
|
||||
s.x += vp.x;
|
||||
s.y += vp.y;
|
||||
|
||||
s.x = max(s.x, (float)vp.x);
|
||||
s.y = max(s.y, (float)vp.y);
|
||||
s.z = min(s.z, (float)vp.z);
|
||||
s.w = min(s.w, (float)vp.w);
|
||||
|
||||
s.x = clamp(s.x, -16383.0f, 16383.0f);
|
||||
s.y = clamp(s.y, -16383.0f, 16383.0f);
|
||||
s.z = clamp(s.z, -16383.0f, 16383.0f);
|
||||
@@ -3065,7 +3078,6 @@ struct Level : IGame {
|
||||
|
||||
void renderEye(int eye, bool showUI, bool invBG) {
|
||||
float oldEye = Core::eye;
|
||||
short4 oldViewport = Core::viewportDef;
|
||||
GAPI::Texture *oldTarget = Core::defaultTarget;
|
||||
|
||||
Core::eye = float(eye);
|
||||
@@ -3080,6 +3092,8 @@ struct Level : IGame {
|
||||
|
||||
Core::pass = Core::passCompose;
|
||||
|
||||
short4 oldViewport = Core::viewportDef;
|
||||
|
||||
setDefaultTarget(eye, view, invBG);
|
||||
|
||||
if (Core::settings.detail.stereo == Core::Settings::STEREO_SPLIT) {
|
||||
@@ -3090,6 +3104,8 @@ struct Level : IGame {
|
||||
|
||||
setup();
|
||||
renderView(camera->getRoomIndex(), true, showUI);
|
||||
|
||||
Core::viewportDef = oldViewport;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3103,9 +3119,11 @@ struct Level : IGame {
|
||||
}
|
||||
|
||||
Core::defaultTarget = oldTarget;
|
||||
Core::viewportDef = oldViewport;
|
||||
Core::eye = oldEye;
|
||||
|
||||
Core::setViewport(Core::viewportDef);
|
||||
Core::setScissor(Core::viewportDef);
|
||||
|
||||
player = players[0];
|
||||
if (player) {
|
||||
camera = player->camera;
|
||||
@@ -3245,6 +3263,8 @@ struct Level : IGame {
|
||||
}
|
||||
|
||||
void renderInventoryEye(int eye, int view) {
|
||||
short4 oldViewport = Core::viewportDef;
|
||||
|
||||
setDefaultTarget(eye, view, false);
|
||||
|
||||
Core::setTarget(NULL, NULL, RT_CLEAR_DEPTH | RT_STORE_COLOR);
|
||||
@@ -3283,6 +3303,8 @@ struct Level : IGame {
|
||||
UI::end();
|
||||
|
||||
Core::popLights();
|
||||
|
||||
Core::viewportDef = oldViewport;
|
||||
}
|
||||
|
||||
void render() {
|
||||
|
Reference in New Issue
Block a user