]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_sprite.c
updated makefile and added r_explosion.c (forgot)
[xonotic/darkplaces.git] / model_sprite.c
index 6e2d784056bc7d0bd9ddcb73f76d866513ef3087..4db67bca50b0eb800e967a02f7bfb6b74f5e6ad9 100644 (file)
@@ -33,6 +33,21 @@ void Mod_SpriteInit (void)
 {
 }
 
+void Mod_Sprite_StripExtension(char *in, char *out)
+{
+       char *end;
+       end = in + strlen(in);
+       if ((end - in) >= 6)
+               if (strcmp(end - 6, ".spr32") == 0)
+                       end -= 6;
+       if ((end - in) >= 4)
+               if (strcmp(end - 4, ".spr") == 0)
+                       end -= 4;
+       while (in < end)
+               *out++ = *in++;
+       *out++ = 0;
+}
+
 /*
 =================
 Mod_LoadSpriteFrame
@@ -43,7 +58,7 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum,
        dspriteframe_t          *pinframe;
        mspriteframe_t          *pspriteframe;
        int                                     i, width, height, size, origin[2];
-       char                            name[64];
+       char                            name[256], tempname[256];
        byte                            *pixbuf, *pixel, *inpixel;
 
        pinframe = (dspriteframe_t *)pin;
@@ -52,7 +67,7 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum,
        height = LittleLong (pinframe->height);
        size = width * height * bytesperpixel;
 
-       pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t),loadname);
+       pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t), va("%s frames", loadname));
 
        memset (pspriteframe, 0, sizeof (mspriteframe_t));
 
@@ -68,39 +83,45 @@ void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum,
        pspriteframe->left = origin[0];
        pspriteframe->right = width + origin[0];
 
-       sprintf (name, "%s_%i", loadmodel->name, framenum);
-       pspriteframe->gl_texturenum = GL_LoadTexture (name, width, height, (byte *)(pinframe + 1), true, true, bytesperpixel);
-       // make fog version (just alpha)
-       pixbuf = pixel = malloc(width*height*4);
-       inpixel = (byte *)(pinframe + 1);
-       if (bytesperpixel == 1)
+       Mod_Sprite_StripExtension(loadmodel->name, tempname);
+       sprintf (name, "%s_%i", tempname, framenum);
+       pspriteframe->gl_texturenum = loadtextureimagewithmask(name, 0, 0, false, true);
+       pspriteframe->gl_fogtexturenum = image_masktexnum;
+       if (pspriteframe->gl_texturenum == 0)
        {
-               for (i = 0;i < width*height;i++)
+               pspriteframe->gl_texturenum = GL_LoadTexture (name, width, height, (byte *)(pinframe + 1), true, true, bytesperpixel);
+               // make fog version (just alpha)
+               pixbuf = pixel = qmalloc(width*height*4);
+               inpixel = (byte *)(pinframe + 1);
+               if (bytesperpixel == 1)
                {
-                       *pixel++ = 255;
-                       *pixel++ = 255;
-                       *pixel++ = 255;
-                       if (*inpixel++ != 255)
+                       for (i = 0;i < width*height;i++)
+                       {
+                               *pixel++ = 255;
+                               *pixel++ = 255;
                                *pixel++ = 255;
-                       else
-                               *pixel++ = 0;
+                               if (*inpixel++ != 255)
+                                       *pixel++ = 255;
+                               else
+                                       *pixel++ = 0;
+                       }
                }
-       }
-       else
-       {
-               inpixel+=3;
-               for (i = 0;i < width*height;i++)
+               else
                {
-                       *pixel++ = 255;
-                       *pixel++ = 255;
-                       *pixel++ = 255;
-                       *pixel++ = *inpixel;
-                       inpixel+=4;
+                       inpixel+=3;
+                       for (i = 0;i < width*height;i++)
+                       {
+                               *pixel++ = 255;
+                               *pixel++ = 255;
+                               *pixel++ = 255;
+                               *pixel++ = *inpixel;
+                               inpixel+=4;
+                       }
                }
+               sprintf (name, "%s_%ifog", loadmodel->name, framenum);
+               pspriteframe->gl_fogtexturenum = GL_LoadTexture (name, width, height, pixbuf, true, true, 4);
+               qfree(pixbuf);
        }
-       sprintf (name, "%s_%ifog", loadmodel->name, framenum);
-       pspriteframe->gl_fogtexturenum = GL_LoadTexture (name, width, height, pixbuf, true, true, 4);
-       free(pixbuf);
 
        return (void *)((byte *)pinframe + sizeof (dspriteframe_t) + size);
 }
@@ -124,8 +145,7 @@ void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum,
 
        numframes = LittleLong (pingroup->numframes);
 
-       pspritegroup = Hunk_AllocName (sizeof (mspritegroup_t) +
-                               (numframes - 1) * sizeof (pspritegroup->frames[0]), loadname);
+       pspritegroup = Hunk_AllocName (sizeof (mspritegroup_t) + (numframes - 1) * sizeof (pspritegroup->frames[0]), va("%s frames", loadname));
 
        pspritegroup->numframes = numframes;
 
@@ -133,7 +153,7 @@ void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum,
 
        pin_intervals = (dspriteinterval_t *)(pingroup + 1);
 
-       poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname);
+       poutintervals = Hunk_AllocName (numframes * sizeof (float), va("%s frames", loadname));
 
        pspritegroup->intervals = poutintervals;
 
@@ -150,9 +170,7 @@ void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum,
        ptemp = (void *)pin_intervals;
 
        for (i=0 ; i<numframes ; i++)
-       {
                ptemp = Mod_LoadSpriteFrame (ptemp, &pspritegroup->frames[i], framenum * 100 + i, bytesperpixel);
-       }
 
        return ptemp;
 }
@@ -206,7 +224,7 @@ void Mod_LoadSpriteModel (model_t *mod, void *buffer)
 
        size = sizeof (msprite_t) +     (numframes - 1) * sizeof (psprite->frames);
 
-       psprite = Hunk_AllocName (size, loadname);
+       psprite = Hunk_AllocName (size, va("%s info", loadname));
 
        mod->cache.data = psprite;
 
@@ -226,7 +244,7 @@ void Mod_LoadSpriteModel (model_t *mod, void *buffer)
 // load the frames
 //
        if (numframes < 1)
-               Sys_Error ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes);
+               Host_Error ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes);
 
        mod->numframes = numframes;
 
@@ -240,17 +258,9 @@ void Mod_LoadSpriteModel (model_t *mod, void *buffer)
                psprite->frames[i].type = frametype;
 
                if (frametype == SPR_SINGLE)
-               {
-                       pframetype = (dspriteframetype_t *)
-                                       Mod_LoadSpriteFrame (pframetype + 1,
-                                                                                &psprite->frames[i].frameptr, i, bytesperpixel);
-               }
+                       pframetype = (dspriteframetype_t *) Mod_LoadSpriteFrame (pframetype + 1, &psprite->frames[i].frameptr, i, bytesperpixel);
                else
-               {
-                       pframetype = (dspriteframetype_t *)
-                                       Mod_LoadSpriteGroup (pframetype + 1,
-                                                                                &psprite->frames[i].frameptr, i, bytesperpixel);
-               }
+                       pframetype = (dspriteframetype_t *) Mod_LoadSpriteGroup (pframetype + 1, &psprite->frames[i].frameptr, i, bytesperpixel);
        }
 
        mod->type = mod_sprite;