From 08b417f149f061f7923d4acc2a950bcbaa49b6fa Mon Sep 17 00:00:00 2001 From: Karl Kurbjun Date: Mon, 17 Apr 2006 19:42:08 +0000 Subject: Properly cache animations at level start. Switches still need some caching code. Added a debug cache flag for use in the sim to w_wad.c. Should be taken out when switches are handled. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9706 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/doom/p_spec.c | 4 ++-- apps/plugins/doom/r_data.c | 44 +++++++++++++++++++++++++++++++++++++++++++- apps/plugins/doom/w_wad.c | 7 ++++++- 3 files changed, 51 insertions(+), 4 deletions(-) (limited to 'apps/plugins/doom') diff --git a/apps/plugins/doom/p_spec.c b/apps/plugins/doom/p_spec.c index 6270928de0..c8c04fa7e2 100644 --- a/apps/plugins/doom/p_spec.c +++ b/apps/plugins/doom/p_spec.c @@ -95,8 +95,8 @@ typedef struct #define MAXANIMS 32 // no longer a strict limit -- killough -static anim_t* lastanim; -static anim_t* anims; // new structure w/o limits -- killough +anim_t* lastanim; + anim_t* anims; // new structure w/o limits -- killough static size_t maxanims; // killough 3/7/98: Initialize generalized scrolling diff --git a/apps/plugins/doom/r_data.c b/apps/plugins/doom/r_data.c index b5ff95a364..15e8361d7f 100644 --- a/apps/plugins/doom/r_data.c +++ b/apps/plugins/doom/r_data.c @@ -897,10 +897,36 @@ int R_TextureNumForName(const char *name) // const added -- killough // to avoid using alloca(), and to improve performance. // cph - new wad lump handling, calls cache functions but acquires no locks +// Structures from p_spec.c +// Used to fully cache animations in the level -> avoids stalls on Hard Drive Systems +typedef struct +{ + boolean istexture; + int picnum; + int basepic; + int numpics; + int speed; + +} anim_t; +extern anim_t* anims; +extern anim_t* lastanim; + +anim_t * isAnim(int flatnum, boolean texcheck) +{ + anim_t *checkf; + for(checkf=anims; checkf=checkf->basepic || flatnum<=checkf->numpics)&&checkf->istexture==texcheck) + return checkf; + } + return 0; +} + void R_PrecacheLevel(void) { - register int i; + register int i, j; register byte *hitlist; + anim_t *cacheanim; if (demoplayback) return; @@ -916,6 +942,14 @@ void R_PrecacheLevel(void) for (i = numsectors; --i >= 0; ) hitlist[sectors[i].floorpic] = hitlist[sectors[i].ceilingpic] = 1; + // If flat is an animation, load those too + // Definately not the most efficient, but better then stalls in game + for(i=0; inumpics; j++) + hitlist[cacheanim->basepic+j]=1; + for (i = numflats; --i >= 0; ) if (hitlist[i]) (W_CacheLumpNum)(firstflat + i, 0); @@ -929,6 +963,14 @@ void R_PrecacheLevel(void) hitlist[sides[i].toptexture] = hitlist[sides[i].midtexture] = 1; + // If texture is an animation, load those too + // Definately not the most efficient, but better then stalls in game + for(i=0; inumpics; j++) + hitlist[cacheanim->basepic+j]=1; + // Sky texture is always present. // Note that F_SKY1 is the name used to // indicate a sky floor/ceiling as a flat, diff --git a/apps/plugins/doom/w_wad.c b/apps/plugins/doom/w_wad.c index 4bd3807191..18da216dcf 100644 --- a/apps/plugins/doom/w_wad.c +++ b/apps/plugins/doom/w_wad.c @@ -494,7 +494,7 @@ int W_LumpLength (int lump) // Loads the lump into the given buffer, // which must be >= W_LumpLength(). // - +#undef DEBUGCACHE void W_ReadLump(int lump, void *dest) { lumpinfo_t *l = lumpinfo + lump; @@ -512,6 +512,11 @@ void W_ReadLump(int lump, void *dest) { int c; +#if DEBUGCACHE + if(gamestate==GS_LEVEL) + printf("Loading %s\n", lumpinfo[lump].name); +#endif + // killough 1/31/98: Reload hack (-wart) removed lseek(l->handle, l->position, SEEK_SET); -- cgit v1.2.3