/// <summary> /// Mod_LoadSpriteGroup /// </summary> private Int32 LoadSpriteGroup(ByteArraySegment pin, out Object ppframe, Int32 framenum, Func <String, ByteArraySegment, Int32, Int32, Int32> onLoadSpriteTexture) { var pingroup = Utilities.BytesToStructure <dspritegroup_t>(pin.Data, pin.StartIndex); var numframes = EndianHelper.LittleLong(pingroup.numframes); var pspritegroup = new mspritegroup_t( ); pspritegroup.numframes = numframes; pspritegroup.frames = new mspriteframe_t[numframes]; ppframe = pspritegroup; var poutintervals = new Single[numframes]; pspritegroup.intervals = poutintervals; var offset = pin.StartIndex + dspritegroup_t.SizeInBytes; for (var i = 0; i < numframes; i++, offset += dspriteinterval_t.SizeInBytes) { var interval = Utilities.BytesToStructure <dspriteinterval_t>(pin.Data, offset); poutintervals[i] = EndianHelper.LittleFloat(interval.interval); if (poutintervals[i] <= 0) { Utilities.Error("Mod_LoadSpriteGroup: interval<=0"); } } for (var i = 0; i < numframes; i++) { Object tmp; offset = LoadSpriteFrame(new ByteArraySegment(pin.Data, offset), out tmp, framenum * 100 + i, onLoadSpriteTexture); pspritegroup.frames[i] = ( mspriteframe_t )tmp; } return(offset); }
public static mspriteframe_t R_GetSpriteFrame(entity_t currententity) { msprite_t psprite = (msprite_t)currententity.model.cache.data; int frame = currententity.frame; if ((frame >= psprite.numframes) || (frame < 0)) { Con_Printf("R_DrawSprite: no such frame {0}\n", frame); frame = 0; } mspriteframe_t pspriteframe; if (psprite.frames[frame].type == spriteframetype_t.SPR_SINGLE) { pspriteframe = (mspriteframe_t)psprite.frames[frame].frameptr; } else { mspritegroup_t pspritegroup = (mspritegroup_t)psprite.frames[frame].frameptr; float[] pintervals = pspritegroup.intervals; int numframes = pspritegroup.numframes; float fullinterval = pintervals[numframes - 1]; float time = (float)cl.time + currententity.syncbase; // when loading in Mod_LoadSpriteGroup, we guaranteed all interval values // are positive, so we don't have to worry about division by 0 float targettime = time - ((int)(time / fullinterval)) * fullinterval; int i; for (i = 0; i < (numframes - 1); i++) { if (pintervals[i] > targettime) { break; } } pspriteframe = pspritegroup.frames[i]; } return(pspriteframe); }
/* ================= Mod_LoadSpriteGroup ================= */ static void Mod_LoadSpriteGroup(bspfile.ByteBuffer pin, ref object ppframe) { dspritegroup_t pingroup; mspritegroup_t pspritegroup; int i, numframes; double[] poutintervals; pingroup = (dspritegroup_t)pin; numframes = pingroup.numframes; pspritegroup = new mspritegroup_t(); pspritegroup.frames = new mspriteframe_t[numframes]; for(int kk = 0; kk < numframes; kk++) pspritegroup.frames[kk] = new mspriteframe_t(); pspritegroup.numframes = numframes; ppframe = pspritegroup; pin.ofs += sizeof_dspritegroup_t; poutintervals = new double[numframes]; pspritegroup.intervals = poutintervals; for (i=0 ; i<numframes ; i++) { poutintervals[i] = BitConverter.ToSingle(pin.buffer, pin.ofs); pin.ofs += sizeof(Single); if (poutintervals[i] <= 0.0) sys_linux.Sys_Error ("Mod_LoadSpriteGroup: interval<=0"); } for (i=0 ; i<numframes ; i++) { Mod_LoadSpriteFrame (pin, ref pspritegroup.frames[i]); } }