]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_sprite.c
physics: fix and refactor unsticking
[xonotic/darkplaces.git] / model_sprite.c
index 0c121dc689d843c55b009839d18875c8ca103f3b..5b2e36d7cc72a1346723fed30e7519222da7086e 100644 (file)
@@ -263,7 +263,7 @@ static void Mod_Sprite_SharedSetup(const unsigned char *datapointer, int version
        loadmodel->radius2 = modelradius * modelradius;
 }
 
-void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
+void Mod_IDSP_Load(model_t *mod, void *buffer, void *bufferend)
 {
        int version;
        const unsigned char *datapointer;
@@ -274,11 +274,9 @@ void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
 
        loadmodel->type = mod_sprite;
 
-       loadmodel->DrawSky = NULL;
        loadmodel->Draw = R_Model_Sprite_Draw;
        loadmodel->DrawDepth = NULL;
        loadmodel->DrawLight = NULL;
-       loadmodel->DrawAddWaterPlanes = NULL;
 
        version = LittleLong(((dsprite_t *)buffer)->version);
        if (version == SPRITE_VERSION || version == SPRITE32_VERSION)
@@ -300,6 +298,7 @@ void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                unsigned char palette[256][4];
                const unsigned char *in;
                dspritehl_t *pinhlsprite;
+               unsigned char *aligneddata;
 
                pinhlsprite = (dspritehl_t *)datapointer;
                datapointer += sizeof(dspritehl_t);
@@ -363,7 +362,11 @@ void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
                        return;
                }
 
-               Mod_Sprite_SharedSetup(datapointer, LittleLong (pinhlsprite->version), (unsigned int *)(&palette[0][0]), rendermode == SPRHL_ADDITIVE);
+               // the above datapointer arithmetic causes misaligned access
+               aligneddata = (unsigned char *)Mem_Alloc(tempmempool, (unsigned char *)bufferend - datapointer);
+               memcpy(aligneddata, datapointer, (unsigned char *)bufferend - datapointer);
+               Mod_Sprite_SharedSetup(aligneddata, LittleLong (pinhlsprite->version), (unsigned int *)(&palette[0][0]), rendermode == SPRHL_ADDITIVE);
+               Mem_Free(aligneddata);
        }
        else
                Host_Error("Mod_IDSP_Load: %s has wrong version number (%i). Only %i (quake), %i (HalfLife), and %i (sprite32) supported",
@@ -376,7 +379,7 @@ void Mod_IDSP_Load(dp_model_t *mod, void *buffer, void *bufferend)
 }
 
 
-void Mod_IDS2_Load(dp_model_t *mod, void *buffer, void *bufferend)
+void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend)
 {
        int i, version;
        qbool fullbright;
@@ -389,11 +392,9 @@ void Mod_IDS2_Load(dp_model_t *mod, void *buffer, void *bufferend)
 
        loadmodel->type = mod_sprite;
 
-       loadmodel->DrawSky = NULL;
        loadmodel->Draw = R_Model_Sprite_Draw;
        loadmodel->DrawDepth = NULL;
        loadmodel->DrawLight = NULL;
-       loadmodel->DrawAddWaterPlanes = NULL;
 
        pinqsprite = (dsprite2_t *)buffer;