mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-12 08:04:09 +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 = 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() {
|
||||||
|
Reference in New Issue
Block a user