mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-14 00:54:05 +02:00
#23 mutual shader cache
This commit is contained in:
12
src/cache.h
12
src/cache.h
@@ -34,10 +34,9 @@ const char GUI[] =
|
|||||||
struct ShaderCache {
|
struct ShaderCache {
|
||||||
enum Effect { FX_NONE = 0, FX_UNDERWATER = 1, FX_ALPHA_TEST = 2, FX_CLIP_PLANE = 4 };
|
enum Effect { FX_NONE = 0, FX_UNDERWATER = 1, FX_ALPHA_TEST = 2, FX_CLIP_PLANE = 4 };
|
||||||
|
|
||||||
MeshBuilder *mesh;
|
|
||||||
Shader *shaders[Core::passMAX][Shader::MAX][(FX_UNDERWATER | FX_ALPHA_TEST | FX_CLIP_PLANE) + 1];
|
Shader *shaders[Core::passMAX][Shader::MAX][(FX_UNDERWATER | FX_ALPHA_TEST | FX_CLIP_PLANE) + 1];
|
||||||
|
|
||||||
ShaderCache(MeshBuilder *mesh) : mesh(mesh) {
|
ShaderCache() {
|
||||||
memset(shaders, 0, sizeof(shaders));
|
memset(shaders, 0, sizeof(shaders));
|
||||||
|
|
||||||
LOG("shader: cache warm up...\n");
|
LOG("shader: cache warm up...\n");
|
||||||
@@ -129,9 +128,7 @@ struct ShaderCache {
|
|||||||
|
|
||||||
src = SHADER;
|
src = SHADER;
|
||||||
typ = typeNames[type];
|
typ = typeNames[type];
|
||||||
int animTexRangesCount = mesh->animTexRangesCount;
|
sprintf(def, "%s#define PASS_%s\n#define TYPE_%s\n#define MAX_LIGHTS %d\n#define MAX_RANGES %d\n#define MAX_OFFSETS %d\n#define MAX_CONTACTS %d\n#define FOG_DIST (1.0/%d.0)\n#define WATER_FOG_DIST (1.0/%d.0)\n#define SHADOW_TEX_SIZE %d.0\n", ext, passNames[pass], typ, MAX_LIGHTS, MAX_ANIM_TEX_RANGES, MAX_ANIM_TEX_OFFSETS, MAX_CONTACTS, FOG_DIST, WATER_FOG_DIST, SHADOW_TEX_SIZE);
|
||||||
int animTexOffsetsCount = mesh->animTexOffsetsCount;
|
|
||||||
sprintf(def, "%s#define PASS_%s\n#define TYPE_%s\n#define MAX_LIGHTS %d\n#define MAX_RANGES %d\n#define MAX_OFFSETS %d\n#define MAX_CONTACTS %d\n#define FOG_DIST (1.0/%d.0)\n#define WATER_FOG_DIST (1.0/%d.0)\n#define SHADOW_TEX_SIZE %d.0\n", ext, passNames[pass], typ, MAX_LIGHTS, animTexRangesCount, animTexOffsetsCount, MAX_CONTACTS, FOG_DIST, WATER_FOG_DIST, SHADOW_TEX_SIZE);
|
|
||||||
if (fx & FX_UNDERWATER) strcat(def, "#define UNDERWATER\n" UNDERWATER_COLOR);
|
if (fx & FX_UNDERWATER) strcat(def, "#define UNDERWATER\n" UNDERWATER_COLOR);
|
||||||
if (fx & FX_ALPHA_TEST) strcat(def, "#define ALPHA_TEST\n");
|
if (fx & FX_ALPHA_TEST) strcat(def, "#define ALPHA_TEST\n");
|
||||||
if (fx & FX_CLIP_PLANE) strcat(def, "#define CLIP_PLANE\n");
|
if (fx & FX_CLIP_PLANE) strcat(def, "#define CLIP_PLANE\n");
|
||||||
@@ -172,7 +169,7 @@ struct ShaderCache {
|
|||||||
return shaders[pass][type][fx] = new Shader(src, def);
|
return shaders[pass][type][fx] = new Shader(src, def);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bind(Core::Pass pass, Shader::Type type, int fx) {
|
void bind(Core::Pass pass, Shader::Type type, int fx, IGame *game) {
|
||||||
Core::pass = pass;
|
Core::pass = pass;
|
||||||
Shader *shader = shaders[pass][type][fx];
|
Shader *shader = shaders[pass][type][fx];
|
||||||
if (!shader)
|
if (!shader)
|
||||||
@@ -184,6 +181,9 @@ struct ShaderCache {
|
|||||||
shader->setParam(uLightProj, Core::mLightProj);
|
shader->setParam(uLightProj, Core::mLightProj);
|
||||||
shader->setParam(uViewPos, Core::viewPos);
|
shader->setParam(uViewPos, Core::viewPos);
|
||||||
shader->setParam(uParam, Core::params);
|
shader->setParam(uParam, Core::params);
|
||||||
|
MeshBuilder *mesh = game->getMesh();
|
||||||
|
ASSERT(mesh->animTexRangesCount <= MAX_ANIM_TEX_RANGES);
|
||||||
|
ASSERT(mesh->animTexOffsetsCount <= MAX_ANIM_TEX_OFFSETS);
|
||||||
shader->setParam(uAnimTexRanges, mesh->animTexRanges[0], mesh->animTexRangesCount);
|
shader->setParam(uAnimTexRanges, mesh->animTexRanges[0], mesh->animTexRangesCount);
|
||||||
shader->setParam(uAnimTexOffsets, mesh->animTexOffsets[0], mesh->animTexOffsetsCount);
|
shader->setParam(uAnimTexOffsets, mesh->animTexOffsets[0], mesh->animTexOffsetsCount);
|
||||||
}
|
}
|
||||||
|
10
src/core.h
10
src/core.h
@@ -253,10 +253,12 @@ namespace Core {
|
|||||||
PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT;
|
PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAX_LIGHTS 4
|
#define MAX_LIGHTS 4
|
||||||
#define MAX_CACHED_LIGHTS 3
|
#define MAX_CACHED_LIGHTS 3
|
||||||
#define MAX_RENDER_BUFFERS 32
|
#define MAX_RENDER_BUFFERS 32
|
||||||
#define MAX_CONTACTS 15
|
#define MAX_CONTACTS 15
|
||||||
|
#define MAX_ANIM_TEX_RANGES 16
|
||||||
|
#define MAX_ANIM_TEX_OFFSETS 32
|
||||||
|
|
||||||
struct Shader;
|
struct Shader;
|
||||||
struct Texture;
|
struct Texture;
|
||||||
|
15
src/game.h
15
src/game.h
@@ -3,11 +3,14 @@
|
|||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
#include "cache.h"
|
||||||
#include "level.h"
|
#include "level.h"
|
||||||
#include "ui.h"
|
#include "ui.h"
|
||||||
|
|
||||||
|
ShaderCache *shaderCache;
|
||||||
|
|
||||||
namespace Game {
|
namespace Game {
|
||||||
Level *level;
|
Level *level;
|
||||||
Stream *nextLevel;
|
Stream *nextLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,9 +38,6 @@ namespace Game {
|
|||||||
nextLevel = NULL;
|
nextLevel = NULL;
|
||||||
|
|
||||||
Core::init();
|
Core::init();
|
||||||
UI::init(level);
|
|
||||||
|
|
||||||
Sound::callback = stopChannel;
|
|
||||||
|
|
||||||
Core::settings.detail.ambient = true;
|
Core::settings.detail.ambient = true;
|
||||||
Core::settings.detail.lighting = true;
|
Core::settings.detail.lighting = true;
|
||||||
@@ -51,6 +51,12 @@ namespace Game {
|
|||||||
Core::settings.controls.retarget = true;
|
Core::settings.controls.retarget = true;
|
||||||
Core::settings.audio.reverb = true;
|
Core::settings.audio.reverb = true;
|
||||||
|
|
||||||
|
shaderCache = new ShaderCache();
|
||||||
|
|
||||||
|
UI::init(level);
|
||||||
|
|
||||||
|
Sound::callback = stopChannel;
|
||||||
|
|
||||||
level = NULL;
|
level = NULL;
|
||||||
startLevel(lvl);
|
startLevel(lvl);
|
||||||
}
|
}
|
||||||
@@ -63,6 +69,7 @@ namespace Game {
|
|||||||
void free() {
|
void free() {
|
||||||
delete level;
|
delete level;
|
||||||
UI::free();
|
UI::free();
|
||||||
|
delete shaderCache;
|
||||||
Core::free();
|
Core::free();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -15,6 +15,7 @@
|
|||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern ShaderCache *shaderCache;
|
||||||
extern void loadAsync(Stream *stream, void *userData);
|
extern void loadAsync(Stream *stream, void *userData);
|
||||||
|
|
||||||
struct Level : IGame {
|
struct Level : IGame {
|
||||||
@@ -35,7 +36,6 @@ struct Level : IGame {
|
|||||||
float clipHeight;
|
float clipHeight;
|
||||||
} *params = (Params*)&Core::params;
|
} *params = (Params*)&Core::params;
|
||||||
|
|
||||||
ShaderCache *shaderCache;
|
|
||||||
AmbientCache *ambientCache;
|
AmbientCache *ambientCache;
|
||||||
WaterCache *waterCache;
|
WaterCache *waterCache;
|
||||||
ZoneCache *zoneCache;
|
ZoneCache *zoneCache;
|
||||||
@@ -115,7 +115,7 @@ struct Level : IGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual void setShader(Core::Pass pass, Shader::Type type, bool underwater = false, bool alphaTest = false) {
|
virtual void setShader(Core::Pass pass, Shader::Type type, bool underwater = false, bool alphaTest = false) {
|
||||||
shaderCache->bind(pass, type, (underwater ? ShaderCache::FX_UNDERWATER : 0) | (alphaTest ? ShaderCache::FX_ALPHA_TEST : 0) | ((params->clipHeight != NO_CLIP_PLANE && pass == Core::passCompose) ? ShaderCache::FX_CLIP_PLANE : 0));
|
shaderCache->bind(pass, type, (underwater ? ShaderCache::FX_UNDERWATER : 0) | (alphaTest ? ShaderCache::FX_ALPHA_TEST : 0) | ((params->clipHeight != NO_CLIP_PLANE && pass == Core::passCompose) ? ShaderCache::FX_CLIP_PLANE : 0), this);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void setupBinding() {
|
virtual void setupBinding() {
|
||||||
@@ -259,7 +259,6 @@ struct Level : IGame {
|
|||||||
initTextures();
|
initTextures();
|
||||||
mesh = new MeshBuilder(level);
|
mesh = new MeshBuilder(level);
|
||||||
|
|
||||||
shaderCache = new ShaderCache(mesh);
|
|
||||||
initOverrides();
|
initOverrides();
|
||||||
|
|
||||||
for (int i = 0; i < level.entitiesBaseCount; i++) {
|
for (int i = 0; i < level.entitiesBaseCount; i++) {
|
||||||
@@ -438,8 +437,6 @@ struct Level : IGame {
|
|||||||
for (int i = 0; i < level.entitiesCount; i++)
|
for (int i = 0; i < level.entitiesCount; i++)
|
||||||
delete (Controller*)level.entities[i].controller;
|
delete (Controller*)level.entities[i].controller;
|
||||||
|
|
||||||
delete shaderCache;
|
|
||||||
|
|
||||||
delete shadow;
|
delete shadow;
|
||||||
delete ambientCache;
|
delete ambientCache;
|
||||||
delete waterCache;
|
delete waterCache;
|
||||||
|
Reference in New Issue
Block a user