]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_shared.c
don't apply host_sleep when in a timedemo
[xonotic/darkplaces.git] / model_shared.c
index 524b3e73d2fb896ef86baa7ff7168331669b2502..664f0dab4c5d1eaf97397e870e58149cf8af4030 100644 (file)
@@ -320,7 +320,8 @@ dp_model_t *Mod_LoadModel(dp_model_t *mod, qboolean crash, qboolean checkdisk, q
                num = LittleLong(*((int *)buf));
                // call the apropriate loader
                loadmodel = mod;
-                    if (!memcmp(buf, "IDPO", 4)) Mod_IDP0_Load(mod, buf, bufend);
+                    if (!strcasecmp(FS_FileExtension(mod->name), "obj")) Mod_OBJ_Load(mod, buf, bufend);
+               else if (!memcmp(buf, "IDPO", 4)) Mod_IDP0_Load(mod, buf, bufend);
                else if (!memcmp(buf, "IDP2", 4)) Mod_IDP2_Load(mod, buf, bufend);
                else if (!memcmp(buf, "IDP3", 4)) Mod_IDP3_Load(mod, buf, bufend);
                else if (!memcmp(buf, "IDSP", 4)) Mod_IDSP_Load(mod, buf, bufend);
@@ -2168,6 +2169,39 @@ void Mod_VertexRangeFromElements(int numelements, const int *elements, int *firs
                *lastvertexpointer = lastvertex;
 }
 
+void Mod_MakeSortedSurfaces(dp_model_t *mod)
+{
+       // make an optimal set of texture-sorted batches to draw...
+       int j, t;
+       int *firstsurfacefortexture;
+       int *numsurfacesfortexture;
+       if (!mod->sortedmodelsurfaces)
+               mod->sortedmodelsurfaces = Mem_Alloc(loadmodel->mempool, mod->nummodelsurfaces * sizeof(*mod->sortedmodelsurfaces));
+       firstsurfacefortexture = Mem_Alloc(tempmempool, mod->num_textures * sizeof(*firstsurfacefortexture));
+       numsurfacesfortexture = Mem_Alloc(tempmempool, mod->num_textures * sizeof(*numsurfacesfortexture));
+       memset(numsurfacesfortexture, 0, mod->num_textures * sizeof(*numsurfacesfortexture));
+       for (j = 0;j < mod->nummodelsurfaces;j++)
+       {
+               const msurface_t *surface = mod->data_surfaces + j + mod->firstmodelsurface;
+               int t = (int)(surface->texture - mod->data_textures);
+               numsurfacesfortexture[t]++;
+       }
+       j = 0;
+       for (t = 0;t < mod->num_textures;t++)
+       {
+               firstsurfacefortexture[t] = j;
+               j += numsurfacesfortexture[t];
+       }
+       for (j = 0;j < mod->nummodelsurfaces;j++)
+       {
+               const msurface_t *surface = mod->data_surfaces + j + mod->firstmodelsurface;
+               int t = (int)(surface->texture - mod->data_textures);
+               mod->sortedmodelsurfaces[firstsurfacefortexture[t]++] = j + mod->firstmodelsurface;
+       }
+       Mem_Free(firstsurfacefortexture);
+       Mem_Free(numsurfacesfortexture);
+}
+
 static void Mod_BuildVBOs(void)
 {
        if (!gl_support_arb_vertex_buffer_object)
@@ -2227,10 +2261,10 @@ static void Mod_Decompile_OBJ(dp_model_t *model, const char *filename, const cha
        size_t l;
        size_t outbufferpos = 0;
        size_t outbuffermax = 0x100000;
-       char *outbuffer = Z_Malloc(outbuffermax), *oldbuffer;
+       char *outbuffer = (char *) Z_Malloc(outbuffermax), *oldbuffer;
        const msurface_t *surface;
        const int maxtextures = 256;
-       char *texturenames = Z_Malloc(maxtextures * MAX_QPATH);
+       char *texturenames = (char *) Z_Malloc(maxtextures * MAX_QPATH);
 
        // construct the mtllib file
        l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "# mtllib for %s exported by darkplaces engine\n", originalfilename);
@@ -2254,7 +2288,7 @@ static void Mod_Decompile_OBJ(dp_model_t *model, const char *filename, const cha
                {
                        outbuffermax *= 2;
                        oldbuffer = outbuffer;
-                       outbuffer = Z_Malloc(outbuffermax);
+                       outbuffer = (char *) Z_Malloc(outbuffermax);
                        memcpy(outbuffer, oldbuffer, outbufferpos);
                        Z_Free(oldbuffer);
                }
@@ -2277,7 +2311,7 @@ static void Mod_Decompile_OBJ(dp_model_t *model, const char *filename, const cha
                {
                        outbuffermax *= 2;
                        oldbuffer = outbuffer;
-                       outbuffer = Z_Malloc(outbuffermax);
+                       outbuffer = (char *) Z_Malloc(outbuffermax);
                        memcpy(outbuffer, oldbuffer, outbufferpos);
                        Z_Free(oldbuffer);
                }
@@ -2296,7 +2330,7 @@ static void Mod_Decompile_OBJ(dp_model_t *model, const char *filename, const cha
                        {
                                outbuffermax *= 2;
                                oldbuffer = outbuffer;
-                               outbuffer = Z_Malloc(outbuffermax);
+                               outbuffer = (char *) Z_Malloc(outbuffermax);
                                memcpy(outbuffer, oldbuffer, outbufferpos);
                                Z_Free(oldbuffer);
                        }
@@ -2334,7 +2368,7 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first
        size_t l;
        size_t outbufferpos = 0;
        size_t outbuffermax = 0x100000;
-       char *outbuffer = Z_Malloc(outbuffermax), *oldbuffer;
+       char *outbuffer = (char *) Z_Malloc(outbuffermax), *oldbuffer;
        const msurface_t *surface;
        l = dpsnprintf(outbuffer + outbufferpos, outbuffermax - outbufferpos, "version 1\nnodes\n");
        if (l > 0)
@@ -2355,7 +2389,7 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first
                {
                        outbuffermax *= 2;
                        oldbuffer = outbuffer;
-                       outbuffer = Z_Malloc(outbuffermax);
+                       outbuffer = (char *) Z_Malloc(outbuffermax);
                        memcpy(outbuffer, oldbuffer, outbufferpos);
                        Z_Free(oldbuffer);
                }
@@ -2382,7 +2416,7 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first
                        {
                                outbuffermax *= 2;
                                oldbuffer = outbuffer;
-                               outbuffer = Z_Malloc(outbuffermax);
+                               outbuffer = (char *) Z_Malloc(outbuffermax);
                                memcpy(outbuffer, oldbuffer, outbufferpos);
                                Z_Free(oldbuffer);
                        }
@@ -2458,7 +2492,7 @@ static void Mod_Decompile_SMD(dp_model_t *model, const char *filename, int first
                                {
                                        outbuffermax *= 2;
                                        oldbuffer = outbuffer;
-                                       outbuffer = Z_Malloc(outbuffermax);
+                                       outbuffer = (char *) Z_Malloc(outbuffermax);
                                        memcpy(outbuffer, oldbuffer, outbufferpos);
                                        Z_Free(oldbuffer);
                                }
@@ -2545,7 +2579,7 @@ static void Mod_Decompile_f(void)
        }
 
        // export SMD if possible (only for skeletal models)
-       if (mod->surfmesh.num_triangles && mod->num_poses)
+       if (mod->surfmesh.num_triangles && mod->num_bones)
        {
                dpsnprintf(outname, sizeof(outname), "%s_decompiled/ref1.smd", basename);
                Mod_Decompile_SMD(mod, outname, 0, 1, true);