Skip to content

Commit

Permalink
Refactor: Moved various renderer domain resource caching functions
Browse files Browse the repository at this point in the history
The highest level of caching (that which occurs during map loading)
is now Rend_CacheForMap() in r_main.c
  • Loading branch information
danij-deng committed Nov 26, 2012
1 parent 7a8d538 commit 1af7297
Show file tree
Hide file tree
Showing 9 changed files with 174 additions and 32 deletions.
8 changes: 4 additions & 4 deletions doomsday/engine/api/doomsday.def
Expand Up @@ -424,7 +424,7 @@ EXPORTS
; Sys_TicksPerSecond @46 NONAME
; Sys_GetTime @47 NONAME
; Sys_GetSeconds @48 NONAME
; Timer_RealMilliseconds @49 NONAME
; Timer_RealMilliseconds @49 NONAME
Sys_Sleep @50 NONAME
Sys_CriticalMessage @51 NONAME
Sys_Quit @52 NONAME
Expand All @@ -451,7 +451,7 @@ EXPORTS

; Play.
LineDef_BoxOnSide @60 NONAME
LineDef_BoxOnSide_FixedPrecision @46 NONAME
LineDef_BoxOnSide_FixedPrecision @46 NONAME
LineDef_PointDistance @208 NONAME
LineDef_PointXYDistance @209 NONAME
LineDef_PointOnSide @695 NONAME
Expand Down Expand Up @@ -598,7 +598,7 @@ EXPORTS
P_RegisterMapObjProperty @412 NONAME

; Play: Mobjs.
P_MobjCreateXYZ @357 NONAME
P_MobjCreateXYZ @357 NONAME
P_MobjDestroy @358 NONAME
P_MobjLink @66 NONAME
P_MobjUnlink @67 NONAME
Expand Down Expand Up @@ -645,7 +645,7 @@ EXPORTS
R_SetupFogDefaults @854 NONAME
R_SetupFog @855 NONAME

R_PrecacheMobjNum @427 NONAME
Rend_CacheForMobjType @427 NONAME
Models_CacheForState @240 NONAME

R_RenderPlayerView @90 NONAME
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/api/doomsday.h
Expand Up @@ -600,7 +600,7 @@ void R_SetupMap(int mode, int flags);
void R_SetupFogDefaults(void);
void R_SetupFog(float start, float end, float density, float* rgb);

void R_PrecacheMobjNum(int mobjtypeNum);
void Rend_CacheForMobjType(int mobjtypeNum);
void Models_CacheForState(int stateIndex);

void R_RenderPlayerView(int num);
Expand Down
15 changes: 15 additions & 0 deletions doomsday/engine/include/render/r_main.h
Expand Up @@ -75,6 +75,9 @@ extern int frameCount;
extern int extraLight;
extern float extraLightDelta;
extern int rendInfoTris;

extern byte precacheMapMaterials, precacheSprites, precacheSkins;

extern fontid_t fontFixed, fontVariable[FONTSTYLE_COUNT];

extern fixed_t fineTangent[FINEANGLES / 2];
Expand Down Expand Up @@ -161,6 +164,18 @@ void R_LoadSystemFonts(void);
const char* R_ChooseFixedFont(void);
const char* R_ChooseVariableFont(fontstyle_t style, int resX, int resY);

/**
* Prepare resources for the current Map.
*/
void Rend_CacheForMap(void);

/**
* Prepare all texture resources for the specified mobjtype.
*
* @note Part of the Doomsday public API.
*/
void Rend_CacheForMobjType(int mobjtypeNum);

#ifdef __cplusplus
} // extern "C"
#endif
Expand Down
12 changes: 0 additions & 12 deletions doomsday/engine/include/resource/r_data.h
Expand Up @@ -135,7 +135,6 @@ typedef struct {

extern int levelFullBright;

extern byte precacheMapMaterials, precacheSprites, precacheSkins;
extern int gameDataFormat;

void R_InitSystemTextures(void);
Expand Down Expand Up @@ -198,17 +197,6 @@ boolean R_UpdateSidedef(struct sidedef_s* side, boolean forceUpdate);
boolean R_UpdatePlane(struct plane_s* pln, boolean forceUpdate);
boolean R_UpdateSurface(struct surface_s* suf, boolean forceUpdate);

/**
* Prepare resources for the current Map.
*/
void R_PrecacheForMap(void);

/**
* Prepare all texture resources for the specified mobjtype.
*
* \note Part of the Doomsday public API.
*/
void R_PrecacheMobjNum(int mobjtypeNum);

/**
* @return @c true if the given decoration works under the specified circumstances.
Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/src/map/p_data.cpp
Expand Up @@ -52,7 +52,7 @@ static de::StringPool* entityDefs;
typedef std::map<int, de::StringPool::Id> EntityDefIdMap;
static EntityDefIdMap entityDefIdMap;

extern boolean mapSetup;
extern "C" boolean mapSetup; // We are currently setting up a map.

Uri* mapUri; // Name by which the game referred to the current map.

Expand Down
2 changes: 1 addition & 1 deletion doomsday/engine/src/map/r_world.c
Expand Up @@ -1502,7 +1502,7 @@ void R_SetupMap(int mode, int flags)
R_MapInitSurfaceLists();

startTime = Timer_Seconds();
R_PrecacheForMap();
Rend_CacheForMap();
Materials_ProcessCacheQueue();
VERBOSE( Con_Message("Precaching took %.2f seconds.\n", Timer_Seconds() - startTime) )

Expand Down
158 changes: 150 additions & 8 deletions doomsday/engine/src/render/r_main.c
Expand Up @@ -22,14 +22,6 @@
* Boston, MA 02110-1301 USA
*/

/**
* Refresh Subsystem.
*
* The refresh daemon has the highest-level rendering code.
* The view window is handled by refresh. The more specialized
* rendering code in rend_*.c does things inside the view window.
*/

// HEADER FILES ------------------------------------------------------------

#include <math.h>
Expand All @@ -47,6 +39,7 @@
#include "de_misc.h"
#include "de_ui.h"

#include "gl/svg.h"
#include "render/vignette.h"

// MACROS ------------------------------------------------------------------
Expand Down Expand Up @@ -91,6 +84,10 @@ float frameTimePos; // 0...1: fractional part for sharp game tics.

int loadInStartupMode = false;

byte precacheSkins = true;
byte precacheMapMaterials = true;
byte precacheSprites = true;

fontid_t fontFixed, fontVariable[FONTSTYLE_COUNT];

// PRIVATE DATA DEFINITIONS ------------------------------------------------
Expand Down Expand Up @@ -1312,6 +1309,151 @@ void R_RenderViewPorts(void)
R_UseViewPort(NULL);
}

static int findSpriteOwner(thinker_t* th, void* context)
{
mobj_t* mo = (mobj_t*) th;
spritedef_t* sprDef = (spritedef_t*) context;

if(mo->type >= 0 && mo->type < defs.count.mobjs.num)
{
/// @todo optimize: traverses the entire state list!
int i;
for(i = 0; i < defs.count.states.num; ++i)
{
if(stateOwners[i] != &mobjInfo[mo->type]) continue;

if(&sprites[states[i].sprite] == sprDef)
return true; // Found one.
}
}

return false; // Continue iteration.
}

static void cacheSpritesForState(int stateIndex, materialvariantspecification_t const* spec)
{
state_t* state;
spritedef_t* sprDef;
int i, k;

if(stateIndex < 0 || stateIndex >= defs.count.states.num) return;
if(!spec) return;

state = &states[stateIndex];
sprDef = &sprites[state->sprite];

for(i = 0; i < sprDef->numFrames; ++i)
{
spriteframe_t* sprFrame = &sprDef->spriteFrames[i];
for(k = 0; k < 8; ++k)
{
Materials_Precache(sprFrame->mats[k], spec, true);
}
}
}

/// @note Part of the Doomsday public API.
void Rend_CacheForMobjType(int num)
{
materialvariantspecification_t const* spec;
int i;

if(novideo || !((useModels && precacheSkins) || precacheSprites)) return;
if(num < 0 || num >= defs.count.mobjs.num) return;

spec = Rend_SpriteMaterialSpec(0/*tclass*/, 0/*tmap*/);

/// @todo Optimize: Traverses the entire state list!
for(i = 0; i < defs.count.states.num; ++i)
{
if(stateOwners[i] != &mobjInfo[num]) continue;

Models_CacheForState(i);

if(precacheSprites)
{
cacheSpritesForState(i, spec);
}
/// @todo What about sounds?
}
}

void Rend_CacheForMap()
{
// Don't precache when playing demo.
if(isDedicated || playback) return;

// Precaching from 100 to 200.
Con_SetProgress(100);

if(precacheMapMaterials)
{
materialvariantspecification_t const* spec = Rend_MapSurfaceDiffuseMaterialSpec();
uint i, k;

for(i = 0; i < NUM_SIDEDEFS; ++i)
{
SideDef* side = SIDE_PTR(i);

if(side->SW_middlematerial)
Materials_Precache(side->SW_middlematerial, spec, true);

if(side->SW_topmaterial)
Materials_Precache(side->SW_topmaterial, spec, true);

if(side->SW_bottommaterial)
Materials_Precache(side->SW_bottommaterial, spec, true);
}

for(i = 0; i < NUM_SECTORS; ++i)
{
Sector* sec = SECTOR_PTR(i);
if(!sec->lineDefCount) continue;

for(k = 0; k < sec->planeCount; ++k)
{
Materials_Precache(sec->SP_planematerial(k), spec, true);
}
}
}

if(precacheSprites)
{
materialvariantspecification_t const* spec = Rend_SpriteMaterialSpec(0/*tclass*/, 0/*tmap*/);
int i, k, m;
for(i = 0; i < numSprites; ++i)
{
spritedef_t* sprDef = &sprites[i];

if(GameMap_IterateThinkers(theMap, gx.MobjThinker, 0x1/* All mobjs are public*/,
findSpriteOwner, sprDef))
{
// This sprite is used by some state of at least one mobj.

// Precache all the frames.
for(k = 0; k < sprDef->numFrames; ++k)
{
spriteframe_t* sprFrame = &sprDef->spriteFrames[k];
for(m = 0; m < 8; ++m)
{
Materials_Precache(sprFrame->mats[m], spec, true);
}
}
}
}
}

// Sky models usually have big skins.
R_SkyPrecache();

// Precache model skins?
if(useModels && precacheSkins)
{
// All mobjs are public.
GameMap_IterateThinkers(theMap, gx.MobjThinker, 0x1, Models_CacheForMobj, NULL);
}
}

D_CMD(ViewGrid)
{
if(argc != 3)
Expand Down
4 changes: 2 additions & 2 deletions doomsday/plugins/common/src/p_mapsetup.c
Expand Up @@ -766,11 +766,11 @@ void P_SetupMap(Uri* mapUri, uint episode, uint map)
for(i = 0; types[i].type != 0; ++i)
{
if(types[i].gameModeBits & gameModeBits)
R_PrecacheMobjNum(types[i].type);
Rend_CacheForMobjType(types[i].type);
}

if(IS_NETGAME)
R_PrecacheMobjNum(MT_IFOG);
Rend_CacheForMobjType(MT_IFOG);
#endif
}

Expand Down
3 changes: 0 additions & 3 deletions doomsday/plugins/jhexen/include/r_local.h
Expand Up @@ -76,9 +76,6 @@ extern int flyheight;
extern int sscount, linecount, loopcount;
extern int extralight;

void R_InitData(void);
void R_UpdateData(void);

extern fixed_t pspritescale, pspriteiscale;

void R_UpdateTranslationTables(void);
Expand Down

0 comments on commit 1af7297

Please sign in to comment.