From: havoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Sun, 16 Apr 2006 06:40:20 +0000 (+0000)
Subject: fixed zym loading bugs that made models lose surfaces
X-Git-Tag: xonotic-v0.1.0preview~4074
X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=e21b645a6ba7388b0de1cdfd8dc94746eb0520d4;p=xonotic%2Fdarkplaces.git

fixed zym loading bugs that made models lose surfaces


git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6290 d7cf8633-e32d-0410-b094-e92efae38249
---

diff --git a/model_alias.c b/model_alias.c
index 4377c021..dd4bb31f 100644
--- a/model_alias.c
+++ b/model_alias.c
@@ -1390,7 +1390,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 +1402,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