]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - model_alias.c
allow changelevel to stop demos (necessary for nexuiz menu)
[xonotic/darkplaces.git] / model_alias.c
index 4377c021578e248a59540ccaf0a1935083916cdc..4a9cf0530cd6b3d8e24060eb63432b5578257ed6 100644 (file)
@@ -193,7 +193,8 @@ static void Mod_Alias_Mesh_CompileFrameZero(void)
        loadmodel->surfmesh.data_tvector3f = loadmodel->surfmesh.data_vertex3f + loadmodel->surfmesh.num_vertices * 6;
        loadmodel->surfmesh.data_normal3f = loadmodel->surfmesh.data_vertex3f + loadmodel->surfmesh.num_vertices * 9;
        Mod_Alias_GetMesh_Vertex3f(loadmodel, frameblend, loadmodel->surfmesh.data_vertex3f);
-       Mod_BuildTextureVectorsAndNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, loadmodel->surfmesh.data_normal3f, true);
+       Mod_BuildNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_normal3f, true);
+       Mod_BuildTextureVectorsFromNormals(0, loadmodel->surfmesh.num_vertices, loadmodel->surfmesh.num_triangles, loadmodel->surfmesh.data_vertex3f, loadmodel->surfmesh.data_texcoordtexture2f, loadmodel->surfmesh.data_normal3f, loadmodel->surfmesh.data_element3i, loadmodel->surfmesh.data_svector3f, loadmodel->surfmesh.data_tvector3f, true);
 }
 
 static void Mod_MDLMD2MD3_TraceBox(model_t *model, int frame, trace_t *trace, const vec3_t start, const vec3_t boxmins, const vec3_t boxmaxs, const vec3_t end, int hitsupercontentsmask)
@@ -398,7 +399,7 @@ static void Mod_BuildAliasSkinFromSkinFrame(texture_t *skin, skinframe_t *skinfr
        skin->currentframe = skin;
        skin->basematerialflags = MATERIALFLAG_WALL;
        if (skin->skin.fog)
-               skin->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_TRANSPARENT;
+               skin->basematerialflags |= MATERIALFLAG_ALPHA | MATERIALFLAG_BLENDED | MATERIALFLAG_TRANSPARENT;
        skin->currentmaterialflags = skin->basematerialflags;
 }
 
@@ -1390,7 +1391,7 @@ void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer, void *bufferend)
        meshtriangles = 0;
        for (i = 0;i < loadmodel->num_surfaces;i++)
        {
-               int lastvertex;
+               int firstvertex, lastvertex;
                if (renderlist >= renderlistend)
                        Host_Error("%s corrupt renderlist (wrong size)", loadmodel->name);
                count = BigLong(*renderlist);renderlist++;
@@ -1402,33 +1403,28 @@ void Mod_ZYMOTICMODEL_Load(model_t *mod, void *buffer, void *bufferend)
                surface->texture = loadmodel->data_textures + i;
                surface->num_firsttriangle = meshtriangles;
                surface->num_triangles = count;
-               surface->num_firstvertex = meshvertices;
-               surface->num_vertices = meshvertices;
+               meshtriangles += surface->num_triangles;
 
-               // load the elements and find the used vertex range
-               lastvertex = 0;
+               // load the elements
                outelements = loadmodel->surfmesh.data_element3i + surface->num_firsttriangle * 3;
-               for (j = 0;j < surface->num_triangles;j++)
+               for (j = 0;j < surface->num_triangles;j++, renderlist += 3)
                {
-                       outelements[2] = BigLong(renderlist[0]);
-                       outelements[1] = BigLong(renderlist[1]);
-                       outelements[0] = BigLong(renderlist[2]);
-                       if ((unsigned int)outelements[0] >= (unsigned int)pheader->numverts
-                        || (unsigned int)outelements[1] >= (unsigned int)pheader->numverts
-                        || (unsigned int)outelements[2] >= (unsigned int)pheader->numverts)
+                       outelements[j*3+2] = BigLong(renderlist[0]);
+                       outelements[j*3+1] = BigLong(renderlist[1]);
+                       outelements[j*3+0] = BigLong(renderlist[2]);
+               }
+               // validate the elements and find the used vertex range
+               firstvertex = meshvertices;
+               lastvertex = 0;
+               for (j = 0;j < surface->num_triangles * 3;j++)
+               {
+                       if ((unsigned int)outelements[j] >= (unsigned int)meshvertices)
                                Host_Error("%s corrupt renderlist (out of bounds index)", loadmodel->name);
-                       if (vertbonecounts[outelements[0]] == 0 || vertbonecounts[outelements[1]] == 0 || vertbonecounts[outelements[2]] == 0)
-                               Host_Error("%s corrupt renderlist (references vertex with no bone weights", loadmodel->name);
-                       surface->num_firstvertex = min(surface->num_firstvertex, outelements[0]);
-                       surface->num_firstvertex = min(surface->num_firstvertex, outelements[1]);
-                       surface->num_firstvertex = min(surface->num_firstvertex, outelements[2]);
-                       lastvertex = max(lastvertex, outelements[0]);
-                       lastvertex = max(lastvertex, outelements[1]);
-                       lastvertex = max(lastvertex, outelements[2]);
-                       renderlist += 3;
-                       outelements += 3;
+                       firstvertex = min(firstvertex, outelements[j]);
+                       lastvertex = max(lastvertex, outelements[j]);
                }
-               surface->num_vertices = lastvertex + 1 - surface->num_firstvertex;
+               surface->num_firstvertex = firstvertex;
+               surface->num_vertices = lastvertex + 1 - firstvertex;
 
                // since zym models do not have named sections, reuse their shader
                // name as the section name
@@ -1528,15 +1524,14 @@ void Mod_DARKPLACESMODEL_Load(model_t *mod, void *buffer, void *bufferend)
        meshtriangles = 0;
        numvertexboneweights = 0;
 
-       // load the meshes now
+       // gather combined statistics from the meshes
        dpmmesh = (dpmmesh_t *) (pbase + pheader->ofs_meshs);
-       for (i = 0;i < loadmodel->num_surfaces;i++)
+       for (i = 0;i < (int)pheader->num_meshs;i++)
        {
                int numverts = BigLong(dpmmesh->num_verts);
                meshvertices += numverts;;
                meshtriangles += BigLong(dpmmesh->num_tris);
 
-               // to find out how many weights exist we two a two-stage load...
                data = (unsigned char *) (pbase + BigLong(dpmmesh->ofs_verts));
                for (j = 0;j < numverts;j++)
                {