From e1fdcb44208fd80b198530aa7423731f20d15bf9 Mon Sep 17 00:00:00 2001
From: havoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Date: Thu, 25 Nov 2004 17:02:38 +0000
Subject: [PATCH] added model->brush.submodels[] array of pointers to submodels
 of a world model added unfinished Mod_Q1BSP_LoadMapBrushes (will be finished
 someday)

git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4792 d7cf8633-e32d-0410-b094-e92efae38249
---
 model_brush.c  | 111 +++++++++++++++++++++++++++++++++++++++++++++++--
 model_shared.h |   2 +
 2 files changed, 109 insertions(+), 4 deletions(-)

diff --git a/model_brush.c b/model_brush.c
index 7835687d..1779f9c5 100644
--- a/model_brush.c
+++ b/model_brush.c
@@ -2271,6 +2271,102 @@ static void Mod_Q1BSP_LoadPlanes(lump_t *l)
 	}
 }
 
+static void Mod_Q1BSP_LoadMapBrushes(void)
+{
+#if 0
+// unfinished
+	int submodel, numbrushes;
+	qboolean firstbrush;
+	char *text, *maptext;
+	char mapfilename[MAX_QPATH];
+	FS_StripExtension (loadmodel->name, mapfilename, sizeof (mapfilename));
+	strlcat (mapfilename, ".map", sizeof (mapfilename));
+	maptext = (qbyte*) FS_LoadFile(mapfilename, tempmempool, false);
+	if (!maptext)
+		return;
+	text = maptext;
+	if (!COM_ParseToken(&data, false))
+		return; // error
+	submodel = 0;
+	for (;;)
+	{
+		if (!COM_ParseToken(&data, false))
+			break;
+		if (com_token[0] != '{')
+			return; // error
+		// entity
+		firstbrush = true;
+		numbrushes = 0;
+		maxbrushes = 256;
+		brushes = Mem_Alloc(loadmodel->mempool, maxbrushes * sizeof(mbrush_t));
+		for (;;)
+		{
+			if (!COM_ParseToken(&data, false))
+				return; // error
+			if (com_token[0] == '}')
+				break; // end of entity
+			if (com_token[0] == '{')
+			{
+				// brush
+				if (firstbrush)
+				{
+					if (submodel)
+					{
+						if (submodel > loadmodel->brush.numsubmodels)
+						{
+							Con_Printf("Mod_Q1BSP_LoadMapBrushes: .map has more submodels than .bsp!\n");
+							model = NULL;
+						}
+						else
+							model = loadmodel->brush.submodels[submodel];
+					}
+					else
+						model = loadmodel;
+				}
+				for (;;)
+				{
+					if (!COM_ParseToken(&data, false))
+						return; // error
+					if (com_token[0] == '}')
+						break; // end of brush
+					// each brush face should be this format:
+					// ( x y z ) ( x y z ) ( x y z ) texture scroll_s scroll_t rotateangle scale_s scale_t
+					// FIXME: support hl .map format
+					for (pointnum = 0;pointnum < 3;pointnum++)
+					{
+						COM_ParseToken(&data, false);
+						for (componentnum = 0;componentnum < 3;componentnum++)
+						{
+							COM_ParseToken(&data, false);
+							point[pointnum][componentnum] = atof(com_token);
+						}
+						COM_ParseToken(&data, false);
+					}
+					COM_ParseToken(&data, false);
+					strlcpy(facetexture, com_token, sizeof(facetexture));
+					COM_ParseToken(&data, false);
+					//scroll_s = atof(com_token);
+					COM_ParseToken(&data, false);
+					//scroll_t = atof(com_token);
+					COM_ParseToken(&data, false);
+					//rotate = atof(com_token);
+					COM_ParseToken(&data, false);
+					//scale_s = atof(com_token);
+					COM_ParseToken(&data, false);
+					//scale_t = atof(com_token);
+					TriangleNormal(point[0], point[1], point[2], planenormal);
+					VectorNormalizeDouble(planenormal);
+					planedist = DotProduct(point[0], planenormal);
+					//ChooseTexturePlane(planenormal, texturevector[0], texturevector[1]);
+				}
+				continue;
+			}
+		}
+	}
+#endif
+}
+
+
 #define MAX_PORTALPOINTS 64
 
 typedef struct portal_s
@@ -3026,7 +3122,6 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer)
 	mainmempool = mod->mempool;
 
 	Mod_Q1BSP_LoadLightList();
-	loadmodel = loadmodel;
 
 	// make a single combined shadow mesh to allow optimized shadow volume creation
 	numshadowmeshtriangles = 0;
@@ -3040,7 +3135,10 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer)
 		Mod_ShadowMesh_AddMesh(loadmodel->mempool, loadmodel->brush.shadowmesh, NULL, NULL, NULL, surf->mesh.data_vertex3f, NULL, NULL, NULL, NULL, surf->mesh.num_triangles, surf->mesh.data_element3i);
 	loadmodel->brush.shadowmesh = Mod_ShadowMesh_Finish(loadmodel->mempool, loadmodel->brush.shadowmesh, false, true);
 	Mod_BuildTriangleNeighbors(loadmodel->brush.shadowmesh->neighbor3i, loadmodel->brush.shadowmesh->element3i, loadmodel->brush.shadowmesh->numtriangles);
-	
+
+	if (loadmodel->brush.numsubmodels)
+		loadmodel->brush.submodels = Mem_Alloc(loadmodel->mempool, loadmodel->brush.numsubmodels * sizeof(model_t *));
+
 	// LordHavoc: to clear the fog around the original quake submodel code, I
 	// will explain:
 	// first of all, some background info on the submodels:
@@ -3080,6 +3178,9 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer)
 			mod->mempool = NULL;
 		}
 
+		if (loadmodel->brush.submodels)
+			loadmodel->brush.submodels[i] = mod;
+
 		bm = &mod->brushq1.submodels[i];
 
 		mod->brushq1.hulls[0].firstclipnode = bm->headnode[0];
@@ -3168,6 +3269,8 @@ void Mod_Q1BSP_Load(model_t *mod, void *buffer)
 		mod->brushq1.num_visleafs = bm->visleafs;
 	}
 
+	Mod_Q1BSP_LoadMapBrushes();
+
 	//Mod_Q1BSP_ProcessLightList();
 
 	if (developer.integer)
@@ -3896,8 +3999,8 @@ parseerror:
 			Con_DPrintf("%s: No shader found for texture \"%s\"\n", loadmodel->name, out->name);
 			out->surfaceparms = 0;
 			// these are defaults
-			if (!strncmp(out->name, "textures/skies/", 15))
-				out->surfaceparms |= Q3SURFACEPARM_SKY;
+			//if (!strncmp(out->name, "textures/skies/", 15))
+			//	out->surfaceparms |= Q3SURFACEPARM_SKY;
 			//if (!strcmp(out->name, "caulk") || !strcmp(out->name, "common/caulk") || !strcmp(out->name, "textures/common/caulk")
 			// || !strcmp(out->name, "nodraw") || !strcmp(out->name, "common/nodraw") || !strcmp(out->name, "textures/common/nodraw"))
 			//	out->surfaceparms |= Q3SURFACEPARM_NODRAW;
diff --git a/model_shared.h b/model_shared.h
index c7472b11..ddb6e1e0 100644
--- a/model_shared.h
+++ b/model_shared.h
@@ -154,6 +154,8 @@ typedef struct model_brush_s
 	// number of submodels in this map (just used by server to know how many
 	// submodels to load)
 	int numsubmodels;
+	// pointers to each of the submodels if .isworldmodel is true
+	struct model_s **submodels;
 
 	// pvs
 	int num_pvsclusters;
-- 
2.39.5