1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-11 23:54:09 +02:00

fix scissor and viewport for split screen modes

This commit is contained in:
XProger
2019-12-22 04:01:53 +03:00
parent df9b2a8adc
commit 26bb1cbf08

View File

@@ -1850,10 +1850,23 @@ struct Level : IGame {
//vec4 s = vec4(v.x, -v.w, v.z, -v.y); //vec4 s = vec4(v.x, -v.w, v.z, -v.y);
vec4 s = v; vec4 s = v;
s = (s * 0.5 + 0.5) * vec4(float(vp.z), float(vp.w), float(vp.z), float(vp.w)); 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.z -= s.x;
s.w -= s.y; s.w -= s.y;
s.x += vp.x; s.x += vp.x;
s.y += vp.y; 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.x = clamp(s.x, -16383.0f, 16383.0f);
s.y = clamp(s.y, -16383.0f, 16383.0f); s.y = clamp(s.y, -16383.0f, 16383.0f);
s.z = clamp(s.z, -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) { void renderEye(int eye, bool showUI, bool invBG) {
float oldEye = Core::eye; float oldEye = Core::eye;
short4 oldViewport = Core::viewportDef;
GAPI::Texture *oldTarget = Core::defaultTarget; GAPI::Texture *oldTarget = Core::defaultTarget;
Core::eye = float(eye); Core::eye = float(eye);
@@ -3080,6 +3092,8 @@ struct Level : IGame {
Core::pass = Core::passCompose; Core::pass = Core::passCompose;
short4 oldViewport = Core::viewportDef;
setDefaultTarget(eye, view, invBG); setDefaultTarget(eye, view, invBG);
if (Core::settings.detail.stereo == Core::Settings::STEREO_SPLIT) { if (Core::settings.detail.stereo == Core::Settings::STEREO_SPLIT) {
@@ -3090,6 +3104,8 @@ struct Level : IGame {
setup(); setup();
renderView(camera->getRoomIndex(), true, showUI); renderView(camera->getRoomIndex(), true, showUI);
Core::viewportDef = oldViewport;
} }
} }
@@ -3103,9 +3119,11 @@ struct Level : IGame {
} }
Core::defaultTarget = oldTarget; Core::defaultTarget = oldTarget;
Core::viewportDef = oldViewport;
Core::eye = oldEye; Core::eye = oldEye;
Core::setViewport(Core::viewportDef);
Core::setScissor(Core::viewportDef);
player = players[0]; player = players[0];
if (player) { if (player) {
camera = player->camera; camera = player->camera;
@@ -3245,6 +3263,8 @@ struct Level : IGame {
} }
void renderInventoryEye(int eye, int view) { void renderInventoryEye(int eye, int view) {
short4 oldViewport = Core::viewportDef;
setDefaultTarget(eye, view, false); setDefaultTarget(eye, view, false);
Core::setTarget(NULL, NULL, RT_CLEAR_DEPTH | RT_STORE_COLOR); Core::setTarget(NULL, NULL, RT_CLEAR_DEPTH | RT_STORE_COLOR);
@@ -3283,6 +3303,8 @@ struct Level : IGame {
UI::end(); UI::end();
Core::popLights(); Core::popLights();
Core::viewportDef = oldViewport;
} }
void render() { void render() {