/// <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);
        }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
        /*
        =================
        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]);
            }
        }