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/r_data.c | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'apps/plugins/doom/r_data.c') 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, -- cgit v1.2.3