1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-17 18:36:43 +02:00

#11 clear scene depth buffer before rendering inventory, reduce number of temporary background textures, fix for NPOT title screens

This commit is contained in:
XProger
2018-03-03 07:04:56 +03:00
parent 9ed9d48fe6
commit ee538b85ea
5 changed files with 53 additions and 37 deletions

View File

@@ -305,7 +305,7 @@ struct AmbientCache {
for (int j = 0; j < 6; j++) { for (int j = 0; j < 6; j++) {
Texture *src = textures[j * 4 + i - 1]; Texture *src = textures[j * 4 + i - 1];
Texture *dst = textures[j * 4 + i]; Texture *dst = textures[j * 4 + i];
Core::setTarget(dst, true); Core::setTarget(dst, CLEAR_ALL);
src->bind(sDiffuse); src->bind(sDiffuse);
game->getMesh()->renderQuad(); game->getMesh()->renderQuad();
} }
@@ -449,7 +449,7 @@ struct WaterCache {
blank = false; blank = false;
// texture may be initialized with trash, so... // texture may be initialized with trash, so...
Core::setTarget(data[0], true); Core::setTarget(data[0], CLEAR_ALL);
Core::validateRenderState(); // immediate clear Core::validateRenderState(); // immediate clear
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
} }
@@ -585,7 +585,7 @@ struct WaterCache {
Core::active.shader->setParam(uParam, vec4(p.x, p.z, drop.radius * DETAIL, drop.strength)); Core::active.shader->setParam(uParam, vec4(p.x, p.z, drop.radius * DETAIL, drop.strength));
item.data[0]->bind(sDiffuse); item.data[0]->bind(sDiffuse);
Core::setTarget(item.data[1], true); Core::setTarget(item.data[1], CLEAR_ALL);
Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f)); Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f));
game->getMesh()->renderQuad(); game->getMesh()->renderQuad();
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
@@ -603,7 +603,7 @@ struct WaterCache {
while (item.timer >= SIMULATE_TIMESTEP) { while (item.timer >= SIMULATE_TIMESTEP) {
// water step // water step
item.data[0]->bind(sDiffuse); item.data[0]->bind(sDiffuse);
Core::setTarget(item.data[1], true); Core::setTarget(item.data[1], CLEAR_ALL);
Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f)); Core::setViewport(0, 0, int(item.size.x * DETAIL * 2.0f + 0.5f), int(item.size.z * DETAIL * 2.0f + 0.5f));
game->getMesh()->renderQuad(); game->getMesh()->renderQuad();
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
@@ -623,12 +623,12 @@ struct WaterCache {
Core::whiteTex->bind(sReflect); Core::whiteTex->bind(sReflect);
item.data[0]->bind(sNormal); item.data[0]->bind(sNormal);
Core::setTarget(item.caustics, true); Core::setTarget(item.caustics, CLEAR_ALL);
game->getMesh()->renderPlane(); game->getMesh()->renderPlane();
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
#ifdef BLUR_CAUSTICS #ifdef BLUR_CAUSTICS
// v blur // v blur
Core::setTarget(item.caustics_tmp, true); Core::setTarget(item.caustics_tmp, CLEAR_ALL);
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false); game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
Core::active.shader->setParam(uParam, vec4(0, 1, 1.0f / item.caustics->width, 0));; Core::active.shader->setParam(uParam, vec4(0, 1, 1.0f / item.caustics->width, 0));;
item.caustics->bind(sDiffuse); item.caustics->bind(sDiffuse);
@@ -636,7 +636,7 @@ struct WaterCache {
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
// h blur // h blur
Core::setTarget(item.caustics, true); Core::setTarget(item.caustics, CLEAR_ALL);
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false); game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
Core::active.shader->setParam(uParam, vec4(1, 0, 1.0f / item.caustics->width, 0));; Core::active.shader->setParam(uParam, vec4(1, 0, 1.0f / item.caustics->width, 0));;
item.caustics_tmp->bind(sDiffuse); item.caustics_tmp->bind(sDiffuse);
@@ -689,7 +689,7 @@ struct WaterCache {
if (!refract || w != refract->width || h != refract->height) { if (!refract || w != refract->width || h != refract->height) {
delete refract; delete refract;
refract = new Texture(w, h, Texture::RGBA, false); refract = new Texture(w, h, Texture::RGBA, false);
Core::setTarget(refract, true); Core::setTarget(refract, CLEAR_ALL);
Core::validateRenderState(); // immediate clear Core::validateRenderState(); // immediate clear
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
Core::setTarget(NULL); Core::setTarget(NULL);
@@ -728,7 +728,7 @@ struct WaterCache {
} }
// render mirror reflection // render mirror reflection
Core::setTarget(reflect, true); Core::setTarget(reflect, CLEAR_ALL);
Camera *camera = (Camera*)game->getCamera(); Camera *camera = (Camera*)game->getCamera();
game->setupBinding(); game->setupBinding();

View File

@@ -503,6 +503,12 @@ enum RenderState {
RS_ALPHA_TEST = 1 << 14, RS_ALPHA_TEST = 1 << 14,
}; };
enum ClearMode {
CLEAR_COLOR = 1,
CLEAR_DEPTH = 2,
CLEAR_ALL = CLEAR_COLOR | CLEAR_DEPTH,
};
typedef uint16 Index; typedef uint16 Index;
struct Vertex { struct Vertex {
@@ -653,7 +659,7 @@ namespace Core {
struct ReqTarget { struct ReqTarget {
Texture *texture; Texture *texture;
bool clear; uint8 clear;
uint8 face; uint8 face;
} reqTarget; } reqTarget;
@@ -1278,7 +1284,7 @@ namespace Core {
} }
#endif #endif
} }
#ifdef FFP
if (mask & RS_ALPHA_TEST) { if (mask & RS_ALPHA_TEST) {
#ifdef _PSP #ifdef _PSP
if (renderState & RS_ALPHA_TEST) if (renderState & RS_ALPHA_TEST)
@@ -1292,13 +1298,16 @@ namespace Core {
glDisable(GL_ALPHA_TEST); glDisable(GL_ALPHA_TEST);
#endif #endif
} }
#endif
if (mask & RS_TARGET) { if (mask & RS_TARGET) {
if (reqTarget.clear) { if (reqTarget.clear) {
#ifdef _PSP #ifdef _PSP
sceGuClear(GU_COLOR_BUFFER_BIT | GU_DEPTH_BUFFER_BIT | GU_FAST_CLEAR_BIT); sceGuClear(((reqTarget.clear & CLEAR_COLOR) ? GU_COLOR_BUFFER_BIT : 0) |
((reqTarget.clear & CLEAR_DEPTH) ? GU_DEPTH_BUFFER_BIT : 0) |
GU_FAST_CLEAR_BIT);
#else #else
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glClear(((reqTarget.clear & CLEAR_COLOR) ? GL_COLOR_BUFFER_BIT : 0) |
((reqTarget.clear & CLEAR_DEPTH) ? GL_DEPTH_BUFFER_BIT : 0));
#endif #endif
} }
renderState &= ~RS_TARGET; renderState &= ~RS_TARGET;
@@ -1384,7 +1393,7 @@ namespace Core {
#endif #endif
} }
void setTarget(Texture *target, bool clear = false, int face = 0) { void setTarget(Texture *target, uint8 clear = 0, uint8 face = 0) {
if (!target) if (!target)
target = defaultTarget; target = defaultTarget;

View File

@@ -104,7 +104,7 @@ struct OptionItem {
} }
}; };
#define SETTINGS(x) offsetof(Core::Settings, x) #define SETTINGS(x) OFFSETOF(Core::Settings, x)
static const OptionItem optDetail[] = { static const OptionItem optDetail[] = {
OptionItem( OptionItem::TYPE_TITLE, STR_SELECT_DETAIL ), OptionItem( OptionItem::TYPE_TITLE, STR_SELECT_DETAIL ),
@@ -191,7 +191,7 @@ struct Inventory {
}; };
IGame *game; IGame *game;
Texture *background[3]; Texture *background[2];
bool active; bool active;
bool chosen; bool chosen;
@@ -1097,28 +1097,30 @@ struct Inventory {
// //
#else #else
// vertical blur // vertical blur
Core::setTarget(background[1], true); Core::setTarget(background[1], CLEAR_COLOR);
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false); game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
Core::active.shader->setParam(uParam, vec4(0, 1, 1.0f / INVENTORY_BG_SIZE, 0));; Core::active.shader->setParam(uParam, vec4(0, 1, 1.0f / INVENTORY_BG_SIZE, 0));;
background[0]->bind(sDiffuse); background[0]->bind(sDiffuse);
game->getMesh()->renderQuad(); game->getMesh()->renderQuad();
// horizontal blur // horizontal blur
Core::setTarget(background[2], true); Core::setTarget(background[0], CLEAR_COLOR);
game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false); game->setShader(Core::passFilter, Shader::FILTER_BLUR, false, false);
Core::active.shader->setParam(uParam, vec4(1, 0, 1.0f / INVENTORY_BG_SIZE, 0));; Core::active.shader->setParam(uParam, vec4(1, 0, 1.0f / INVENTORY_BG_SIZE, 0));;
background[1]->bind(sDiffuse); background[1]->bind(sDiffuse);
game->getMesh()->renderQuad(); game->getMesh()->renderQuad();
// grayscale // grayscale
Core::setTarget(background[1], true); Core::setTarget(background[1], CLEAR_COLOR);
game->setShader(Core::passFilter, Shader::FILTER_GRAYSCALE, false, false); game->setShader(Core::passFilter, Shader::FILTER_GRAYSCALE, false, false);
Core::active.shader->setParam(uParam, vec4(1, 0, 0, 0)); Core::active.shader->setParam(uParam, vec4(1, 0, 0, 0));
background[2]->bind(sDiffuse); background[0]->bind(sDiffuse);
game->getMesh()->renderQuad(); game->getMesh()->renderQuad();
swap(background[0], background[1]);
#endif #endif
Core::setTarget(NULL, true); Core::setTarget(NULL, CLEAR_ALL); // TODO: ???
Core::setDepthTest(true); Core::setDepthTest(true);
} }
@@ -1274,6 +1276,7 @@ struct Inventory {
float aspectDst = float(Core::width) / float(Core::height); float aspectDst = float(Core::width) / float(Core::height);
float aspectImg = aspectSrc / aspectDst; float aspectImg = aspectSrc / aspectDst;
float ax = background[0]->origWidth / float(background[0]->width); float ax = background[0]->origWidth / float(background[0]->width);
float ay = background[0]->origHeight / float(background[0]->height);
#ifdef FFP #ifdef FFP
mat4 m; mat4 m;
@@ -1325,6 +1328,8 @@ struct Inventory {
} }
short tw = short(ax * 32767); short tw = short(ax * 32767);
short th = short(ay * 32767);
vertices[ 0].coord = short4(-size.x, size.y, 0, 0); vertices[ 0].coord = short4(-size.x, size.y, 0, 0);
vertices[ 1].coord = short4( size.x, size.y, 0, 0); vertices[ 1].coord = short4( size.x, size.y, 0, 0);
vertices[ 2].coord = short4( size.x, -size.y, 0, 0); vertices[ 2].coord = short4( size.x, -size.y, 0, 0);
@@ -1343,10 +1348,10 @@ struct Inventory {
vertices[10].light = vertices[10].light =
vertices[11].light = ubyte4(0, 0, 0, alpha); vertices[11].light = ubyte4(0, 0, 0, alpha);
vertices[ 0].texCoord = short4( 0, 0, 0, 0); vertices[ 0].texCoord = short4( 0, 0, 0, 0);
vertices[ 1].texCoord = short4(tw, 0, 0, 0); vertices[ 1].texCoord = short4(tw, 0, 0, 0);
vertices[ 2].texCoord = short4(tw, 32767, 0, 0); vertices[ 2].texCoord = short4(tw, th, 0, 0);
vertices[ 3].texCoord = short4( 0, 32767, 0, 0); vertices[ 3].texCoord = short4( 0, th, 0, 0);
vertices[ 4].texCoord = vertices[ 4].texCoord =
vertices[ 5].texCoord = vertices[ 5].texCoord =
vertices[ 6].texCoord = vertices[ 6].texCoord =
@@ -1362,6 +1367,7 @@ struct Inventory {
} }
void renderGameBG() { void renderGameBG() {
Core::setTarget(NULL, CLEAR_DEPTH);
#ifdef _PSP #ifdef _PSP
return; return;
#endif #endif
@@ -1383,7 +1389,7 @@ struct Inventory {
game->setShader(Core::passFilter, Shader::DEFAULT, false, false); game->setShader(Core::passFilter, Shader::DEFAULT, false, false);
// blured grayscale image // blured grayscale image
background[1]->bind(sDiffuse); background[0]->bind(sDiffuse);
Core::setBlending(phaseRing < 1.0f ? bmAlpha : bmNone); Core::setBlending(phaseRing < 1.0f ? bmAlpha : bmNone);
game->getMesh()->renderBuffer(indices, COUNT(indices), vertices, COUNT(vertices)); game->getMesh()->renderBuffer(indices, COUNT(indices), vertices, COUNT(vertices));
} }

View File

@@ -388,7 +388,7 @@ struct Level : IGame {
setupCubeCamera(pos, i); setupCubeCamera(pos, i);
Core::pass = pass; Core::pass = pass;
Texture *target = (targets[0]->opt & Texture::CUBEMAP) ? targets[0] : targets[i * stride]; Texture *target = (targets[0]->opt & Texture::CUBEMAP) ? targets[0] : targets[i * stride];
Core::setTarget(target, true, i); Core::setTarget(target, CLEAR_ALL, i);
renderView(roomIndex, false, false); renderView(roomIndex, false, false);
Core::invalidateTarget(false, true); Core::invalidateTarget(false, true);
} }
@@ -1785,7 +1785,7 @@ struct Level : IGame {
} }
if (water) { if (water) {
Core::setTarget(NULL, Core::settings.detail.stereo == Core::Settings::STEREO_OFF && players[1] == NULL); // render to back buffer Core::setTarget(NULL, (Core::settings.detail.stereo == Core::Settings::STEREO_OFF && players[1] == NULL) ? CLEAR_ALL : 0); // render to back buffer
setupBinding(); setupBinding();
} }
@@ -1860,7 +1860,7 @@ struct Level : IGame {
bool colorShadow = shadow->format == Texture::RGBA ? true : false; bool colorShadow = shadow->format == Texture::RGBA ? true : false;
if (colorShadow) if (colorShadow)
Core::setClearColor(vec4(1.0f)); Core::setClearColor(vec4(1.0f));
Core::setTarget(shadow, true); Core::setTarget(shadow, CLEAR_ALL);
setupLightCamera(); setupLightCamera();
Core::setCulling(cfBack); Core::setCulling(cfBack);
@@ -2117,7 +2117,7 @@ struct Level : IGame {
ambientCache->processQueue(); ambientCache->processQueue();
//if (Core::settings.detail.stereo || Core::settings.detail.splitscreen) { //if (Core::settings.detail.stereo || Core::settings.detail.splitscreen) {
Core::setTarget(NULL, true); Core::setTarget(NULL, CLEAR_ALL);
Core::validateRenderState(); Core::validateRenderState();
//} //}
@@ -2131,7 +2131,7 @@ struct Level : IGame {
if (!cube360) if (!cube360)
cube360 = new Texture(1024, 1024, Texture::RGBA, true, NULL, true, false); cube360 = new Texture(1024, 1024, Texture::RGBA, true, NULL, true, false);
renderEnvironment(camera->getRoomIndex(), camera->pos, &cube360, 0, Core::passCompose); renderEnvironment(camera->getRoomIndex(), camera->pos, &cube360, 0, Core::passCompose);
Core::setTarget(NULL, true); Core::setTarget(NULL, Core::CLEAR_ALL);
setShader(Core::passFilter, Shader::FILTER_EQUIRECTANGULAR); setShader(Core::passFilter, Shader::FILTER_EQUIRECTANGULAR);
cube360->bind(sEnvironment); cube360->bind(sEnvironment);
mesh->renderQuad(); mesh->renderQuad();
@@ -2160,14 +2160,14 @@ struct Level : IGame {
Core::defaultTarget = Core::eyeTex[0]; Core::defaultTarget = Core::eyeTex[0];
Core::viewportDef = vec4(0, 0, float(Core::defaultTarget->width), float(Core::defaultTarget->height)); Core::viewportDef = vec4(0, 0, float(Core::defaultTarget->width), float(Core::defaultTarget->height));
Core::setTarget(NULL, true); Core::setTarget(NULL, CLEAR_ALL);
Core::eye = -1.0f; Core::eye = -1.0f;
setup(); setup();
renderView(camera->getRoomIndex(), true, false); renderView(camera->getRoomIndex(), true, false);
Core::defaultTarget = Core::eyeTex[1]; Core::defaultTarget = Core::eyeTex[1];
Core::viewportDef = vec4(0, 0, float(Core::defaultTarget->width), float(Core::defaultTarget->height)); Core::viewportDef = vec4(0, 0, float(Core::defaultTarget->width), float(Core::defaultTarget->height));
Core::setTarget(NULL, true); Core::setTarget(NULL, CLEAR_ALL);
Core::eye = 1.0f; Core::eye = 1.0f;
setup(); setup();
renderView(camera->getRoomIndex(), true, false); renderView(camera->getRoomIndex(), true, false);
@@ -2175,7 +2175,7 @@ struct Level : IGame {
Core::settings.detail.vr = false; Core::settings.detail.vr = false;
Core::defaultTarget = oldTarget; Core::defaultTarget = oldTarget;
Core::setTarget(NULL, true); Core::setTarget(NULL, CLEAR_ALL);
Core::viewportDef = vp; Core::viewportDef = vp;
} }
@@ -2268,7 +2268,7 @@ struct Level : IGame {
} }
void renderInventory(bool clear) { void renderInventory(bool clear) {
Core::setTarget(NULL, clear); Core::setTarget(NULL, clear ? CLEAR_ALL : 0);
if (!(level.isTitle() || inventory.titleTimer > 0.0f)) if (!(level.isTitle() || inventory.titleTimer > 0.0f))
inventory.renderBackground(); inventory.renderBackground();
@@ -2289,7 +2289,7 @@ struct Level : IGame {
lastTitle = title; lastTitle = title;
if (isEnded) { if (isEnded) {
Core::setTarget(NULL, true); Core::setTarget(NULL, CLEAR_ALL);
UI::begin(); UI::begin();
UI::textOut(vec2(0, 480 - 16), STR_LOADING, UI::aCenter, UI::width); UI::textOut(vec2(0, 480 - 16), STR_LOADING, UI::aCenter, UI::width);
UI::end(); UI::end();

View File

@@ -76,6 +76,7 @@ typedef unsigned int uint32;
#define FOURCC(str) uint32(((uint8*)(str))[0] | (((uint8*)(str))[1] << 8) | (((uint8*)(str))[2] << 16) | (((uint8*)(str))[3] << 24) ) #define FOURCC(str) uint32(((uint8*)(str))[0] | (((uint8*)(str))[1] << 8) | (((uint8*)(str))[2] << 16) | (((uint8*)(str))[3] << 24) )
#define COUNT(arr) (sizeof(arr) / sizeof(arr[0])) #define COUNT(arr) (sizeof(arr) / sizeof(arr[0]))
#define OFFSETOF(T, E) ((size_t)&(((T*)0)->E))
template <typename T> template <typename T>
inline const T& min(const T &a, const T &b) { inline const T& min(const T &a, const T &b) {