/* ================= Mod_LoadSpriteGroup ================= */ static void * Mod_LoadSpriteGroup(void *pin, mspriteframe_t **ppframe, const char *loadname, int framenum) { int i; dspriteinterval_t *pin_intervals; float *poutintervals; void *ptemp; dspritegroup_t *pingroup = (dspritegroup_t *)pin; #ifdef MSB_FIRST int numframes = LittleLong(pingroup->numframes); #else int numframes = (pingroup->numframes); #endif mspritegroup_t *pspritegroup = (mspritegroup_t*)Hunk_AllocName(sizeof(*pspritegroup) + numframes * sizeof(pspritegroup->frames[0]), loadname); pspritegroup->numframes = numframes; *ppframe = (mspriteframe_t *)pspritegroup; pin_intervals = (dspriteinterval_t *)(pingroup + 1); poutintervals = (float*)Hunk_AllocName(numframes * sizeof(float), loadname); pspritegroup->intervals = poutintervals; for (i = 0; i < numframes; i++) { #ifdef MSB_FIRST *poutintervals = LittleFloat(pin_intervals->interval); #else *poutintervals = (pin_intervals->interval); #endif if (*poutintervals <= 0.0) Sys_Error("%s: interval <= 0", __func__); poutintervals++; pin_intervals++; } ptemp = (void *)pin_intervals; for (i = 0; i < numframes; i++) { ptemp = Mod_LoadSpriteFrame(ptemp, &pspritegroup->frames[i], loadname, framenum * 100 + i); } return ptemp; }
/* ================= Mod_LoadSpriteGroup ================= */ void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum) { dspritegroup_t *pingroup; mspritegroup_t *pspritegroup; int i, numframes; dspriteinterval_t *pin_intervals; float *poutintervals; void *ptemp; pingroup = (dspritegroup_t *)pin; numframes = LittleLong (pingroup->numframes); pspritegroup = Hunk_AllocName (sizeof (mspritegroup_t) + (numframes - 1) * sizeof (pspritegroup->frames[0]), loadname); pspritegroup->numframes = numframes; *ppframe = (mspriteframe_t *)pspritegroup; pin_intervals = (dspriteinterval_t *)(pingroup + 1); poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname); pspritegroup->intervals = poutintervals; for (i=0 ; i<numframes ; i++) { *poutintervals = LittleFloat (pin_intervals->interval); if (*poutintervals <= 0.0) Sys_Error ("Mod_LoadSpriteGroup: interval<=0"); poutintervals++; pin_intervals++; } ptemp = (void *)pin_intervals; for (i=0 ; i<numframes ; i++) { ptemp = Mod_LoadSpriteFrame (ptemp, &pspritegroup->frames[i], framenum * 100 + i); } return ptemp; }
/* ================= Mod_LoadSpriteModel ================= */ void Mod_LoadSpriteModel (model_t *mod, void *buffer) { int i; int version; dsprite_t *pin; msprite_t *psprite; int numframes; int size; dspriteframetype_t *pframetype; pin = (dsprite_t *)buffer; version = LittleLong (pin->version); if (version != SPRITE_VERSION) Sys_Error ("%s has wrong version number " "(%i should be %i)", mod->name, version, SPRITE_VERSION); numframes = LittleLong (pin->numframes); size = sizeof (msprite_t) + (numframes - 1) * sizeof (psprite->frames); psprite = Hunk_AllocName (size, loadname); mod->cache.data = psprite; psprite->type = LittleLong (pin->type); psprite->maxwidth = LittleLong (pin->width); psprite->maxheight = LittleLong (pin->height); psprite->beamlength = LittleFloat (pin->beamlength); mod->synctype = LittleLong (pin->synctype); psprite->numframes = numframes; mod->mins[0] = mod->mins[1] = -psprite->maxwidth/2; mod->maxs[0] = mod->maxs[1] = psprite->maxwidth/2; mod->mins[2] = -psprite->maxheight/2; mod->maxs[2] = psprite->maxheight/2; // // load the frames // if (numframes < 1) Sys_Error ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes); mod->numframes = numframes; pframetype = (dspriteframetype_t *)(pin + 1); for (i=0 ; i<numframes ; i++) { spriteframetype_t frametype; frametype = LittleLong (pframetype->type); psprite->frames[i].type = frametype; if (frametype == SPR_SINGLE) { pframetype = (dspriteframetype_t *) Mod_LoadSpriteFrame (pframetype + 1, &psprite->frames[i].frameptr, i); } else { pframetype = (dspriteframetype_t *) Mod_LoadSpriteGroup (pframetype + 1, &psprite->frames[i].frameptr, i); } } mod->type = mod_sprite; }
/* ================= Mod_LoadSpriteModel ================= */ void Mod_LoadSpriteModel(model_t *mod, void *buffer, const char *loadname) { int i; msprite_t *psprite; int numframes; int size; dspriteframetype_t *pframetype; dsprite_t *pin = (dsprite_t *)buffer; #ifdef MSB_FIRST int version = LittleLong(pin->version); #else int version = (pin->version); #endif if (version != SPRITE_VERSION) Sys_Error("%s: %s has wrong version number (%i should be %i)", __func__, mod->name, version, SPRITE_VERSION); #ifdef MSB_FIRST numframes = LittleLong(pin->numframes); #else numframes = (pin->numframes); #endif size = sizeof(*psprite) + numframes * sizeof(psprite->frames[0]); psprite = (msprite_t*)Hunk_AllocName(size, loadname); mod->cache.data = psprite; #ifdef MSB_FIRST psprite->type = LittleLong(pin->type); psprite->maxwidth = LittleLong(pin->width); psprite->maxheight = LittleLong(pin->height); psprite->beamlength = LittleFloat(pin->beamlength); mod->synctype = (synctype_t)LittleLong(pin->synctype); #else psprite->type = (pin->type); psprite->maxwidth = (pin->width); psprite->maxheight = (pin->height); psprite->beamlength = (pin->beamlength); mod->synctype = (synctype_t)(pin->synctype); #endif psprite->numframes = numframes; mod->mins[0] = mod->mins[1] = -psprite->maxwidth / 2; mod->maxs[0] = mod->maxs[1] = psprite->maxwidth / 2; mod->mins[2] = -psprite->maxheight / 2; mod->maxs[2] = psprite->maxheight / 2; // // load the frames // if (numframes < 1) Sys_Error("%s: Invalid # of frames: %d", __func__, numframes); mod->numframes = numframes; mod->flags = 0; pframetype = (dspriteframetype_t *)(pin + 1); for (i = 0; i < numframes; i++) { spriteframetype_t frametype; #ifdef MSB_FIRST frametype = (spriteframetype_t)LittleLong(pframetype->type); #else frametype = (spriteframetype_t)(pframetype->type); #endif psprite->frames[i].type = frametype; if (frametype == SPR_SINGLE) { pframetype = (dspriteframetype_t *) Mod_LoadSpriteFrame(pframetype + 1, &psprite->frames[i].frameptr, loadname, i); } else { pframetype = (dspriteframetype_t *) Mod_LoadSpriteGroup(pframetype + 1, &psprite->frames[i].frameptr, loadname, i); } } mod->type = mod_sprite; }