예제 #1
0
//==================================================================================================

        void CreateModelObject(int index)
        {
            int numFaces  = map.modelsLump[index].numfaces;
            int firstFace = map.modelsLump[index].firstface;
            int numVerts  = 0;
            int numInds   = 0;

            GameObject model = new GameObject("*" + index);

            models[index] = model;
            model.transform.SetParent(modelsObject.transform);
            model.isStatic = true;

            if (numFaces == 0)
            {
                return;
            }

            if (uSrcSettings.Inst.lightmaps && map.hasLightmaps)
            {
                model.layer = 8;
            }

            bspface    face;
            bsptexinfo ti;
            int        i = 0;


            if (!uSrcSettings.Inst.textures)
            {
                for (i = firstFace; i < firstFace + numFaces; i++)
                {
                    face = map.facesLump[i];
                    ti   = map.texinfosLump[face.texinfo];
                    if (Test.Inst.skipSky && (ti.flags & SourceBSPStructs.SURF_SKY) != 0 || face.dispinfo != -1)
                    {
                        continue;
                    }
                    if (numVerts + face.numedges > 65000)
                    {
                        break;
                    }
                    numVerts += face.numedges;
                    numInds  += (face.numedges - 2) * 3;
                }
                if (i < firstFace + numFaces)
                {
                    Debug.LogWarning("skipped " + (firstFace + numFaces - i) + " faces. Load " + numVerts + " verts");
                    numFaces = i - firstFace;
                }
                //Debug.Log ("CreateModelObject "+index+" numVerts "+numVerts);


                Vector3[] verts = new Vector3[numVerts];
                Vector2[] UVs   = new Vector2[numVerts];
                Vector2[] UV2s  = new Vector2[numVerts];
                int[]     tris  = new int[numInds];

                int vertOffs = 0;
                int indsOffs = 0;
                for (i = firstFace; i < firstFace + numFaces; i++)
                {
                    face = map.facesLump[i];
                    ti   = map.texinfosLump[face.texinfo];
                    if ((Test.Inst.skipSky && (ti.flags & SourceBSPStructs.SURF_SKY) != 0) || face.dispinfo != -1)
                    {
                        continue;
                    }

                    if (BuildFace(i, ref verts, ref UVs, ref UV2s, ref tris, vertOffs, indsOffs))
                    {
                        vertOffs += face.numedges;
                        indsOffs += (face.numedges - 2) * 3;
                    }
                    else
                    {
                        /*	GameObject subGO = new GameObject("lm"+curLightmap);
                         *      subGO.transform.SetParent(model.transform);
                         *      subGO.isStatic = true;
                         *      MeshRenderer subMR = subGO.AddComponent<MeshRenderer>();
                         *      subMR.material = Test.Inst.testMaterial;
                         *      MeshFilter subMF = model.AddComponent<MeshFilter>();
                         *      subMF.sharedMesh = new Mesh();
                         *      subMF.sharedMesh.name = "lm"+curLightmap;
                         *      subMF.sharedMesh.vertices = verts;
                         *      subMF.sharedMesh.triangles = tris;
                         *      subMF.sharedMesh.uv = UVs;
                         *      subMF.sharedMesh.uv2 = UV2s;
                         *      subMR.lightmapIndex = curLightmap;
                         *      subMF.sharedMesh.RecalculateNormals ();
                         *
                         *      LM_UploadBlock();
                         *      LM_InitBlock();*/
                    }
                }

                MeshRenderer mr = model.AddComponent <MeshRenderer>();
                mr.material = Test.Inst.testMaterial;

                MeshFilter mf = model.AddComponent <MeshFilter>();
                mf.sharedMesh           = new Mesh();
                mf.sharedMesh.name      = "BSPModel_" + index;
                mf.sharedMesh.vertices  = verts;
                mf.sharedMesh.triangles = tris;
                mf.sharedMesh.uv        = UVs;
                if (uSrcSettings.Inst.lightmaps && map.hasLightmaps && curLightmap < 255)
                {
                    mf.sharedMesh.uv2 = UV2s;
                    mr.lightmapIndex  = curLightmap;
                }

                mf.sharedMesh.RecalculateNormals();

                if (uSrcSettings.Inst.genColliders)
                {
                    model.AddComponent <MeshCollider>();
                }

                if (!uSrcSettings.Inst.showTriggers)
                {
                    string materialName = ConvertUtils.GetNullTerminatedString(map.texdataStringDataLump, map.texdataStringTableLump [map.texdataLump[ti.texdata].nameStringTableID]);
                    materialName = materialName.ToLower();
                    if ((materialName.Contains("trigger") || materialName.Contains("fogvolume")) && !uSrcSettings.Inst.showTriggers)
                    {
                        model.SetActive(false);
                    }
                }
            }
            else
            {
                bsptexdata   texdata;
                List <int>[] materialFaces = null;

                materialFaces = new List <int> [map.texdataLump.Length];
                for (i = firstFace; i < firstFace + numFaces; i++)
                {
                    face    = map.facesLump[i];
                    ti      = map.texinfosLump[face.texinfo];
                    texdata = map.texdataLump[ti.texdata];
                    if (Test.Inst.skipSky && (ti.flags & SourceBSPStructs.SURF_SKY) != 0 || face.dispinfo != -1)
                    {
                        continue;
                    }

                    if (materialFaces[ti.texdata] == null)
                    {
                        materialFaces[ti.texdata] = new List <int>();
                    }
                    materialFaces[ti.texdata].Add(i);
                    texdata.numVerts += face.numedges;
                    texdata.numInds  += (face.numedges - 2) * 3;
                }

                for (i = 0; i < map.texdataLump.Length; i++)
                {
                    if (materialFaces[i] == null)
                    {
                        continue;
                    }
                    texdata = map.texdataLump[i];

                    Vector3[] verts = new Vector3[texdata.numVerts];
                    Vector2[] UVs   = new Vector2[texdata.numVerts];
                    Vector2[] UV2s  = new Vector2[texdata.numVerts];
                    int[]     tris  = new int[texdata.numInds];

                    int vertOffs = 0;
                    int indsOffs = 0;
                    for (int j = 0; j < materialFaces[i].Count(); j++)
                    {
                        face = map.facesLump[materialFaces[i][j]];

                        if (!BuildFace(materialFaces[i][j], ref verts, ref UVs, ref UV2s, ref tris, vertOffs, indsOffs))
                        {
                            LM_UploadBlock();
                            LM_InitBlock();
                            BuildFace(materialFaces[i][j], ref verts, ref UVs, ref UV2s, ref tris, vertOffs, indsOffs);
                        }
                        vertOffs += face.numedges;
                        indsOffs += (face.numedges - 2) * 3;
                    }

                    string materialName = ConvertUtils.GetNullTerminatedString(map.texdataStringDataLump, map.texdataStringTableLump [texdata.nameStringTableID]);
                    materialName = materialName.ToLower();

                    GameObject texObj = new GameObject(materialName);
                    texObj.transform.SetParent(model.transform);
                    texObj.isStatic = true;
                    if (uSrcSettings.Inst.lightmaps && map.hasLightmaps)
                    {
                        texObj.layer = 8;
                    }

                    MeshRenderer mr   = texObj.AddComponent <MeshRenderer>();
                    MeshFilter   mf   = texObj.AddComponent <MeshFilter>();
                    Mesh         mesh = new Mesh();
                    mesh.name     = materialName;
                    mesh.vertices = verts;
                    mesh.uv       = UVs;

                    if (uSrcSettings.Inst.lightmaps && map.hasLightmaps && curLightmap < 255)
                    {
                        mesh.uv2 = UV2s;
                    }

                    mesh.triangles = tris;
                    mesh.RecalculateNormals();
                    mf.sharedMesh = mesh;

                    Material mat = ResourceManager.Inst.GetMaterial(materialName);
                    mr.material = mat;

                    if (uSrcSettings.Inst.lightmaps && map.hasLightmaps && curLightmap < 255)
                    {
                        mr.lightmapIndex = curLightmap;
                    }
                    if ((materialName.Contains("trigger") || materialName.Contains("fogvolume")) && !uSrcSettings.Inst.showTriggers)
                    {
                        texObj.SetActive(false);
                    }

                    if (uSrcSettings.Inst.genColliders)
                    {
                        texObj.AddComponent <MeshCollider>();
                    }
                }

                for (int t = 0; t < map.texdataLump.Length; t++)
                {
                    texdata = map.texdataLump[t];

                    texdata.numVerts = 0;
                    texdata.numInds  = 0;
                }
            }
        }
예제 #2
0
		//==================================================================================================

		void CreateModelObject (int index)
		{
			int numFaces = map.modelsLump[index].numfaces;
			int firstFace = map.modelsLump[index].firstface;
			int numVerts = 0;
			int numInds = 0;

			GameObject model = new GameObject ("*" + index);
			models[index] = model;
			model.transform.SetParent (modelsObject.transform);
			model.isStatic = true;

			if (numFaces == 0)
			{
				return;
			}

			if (uSrcSettings.Inst.lightmaps && map.hasLightmaps)
				model.layer = 8;

			bspface face;
			bsptexinfo ti;
			int i = 0;

			if (!uSrcSettings.Inst.textures)
			{
				for (i = firstFace; i < firstFace + numFaces; i++)
				{
					face = map.facesLump[i];
					ti = map.texinfosLump[face.texinfo];
					if (Test.Inst.skipSky && (ti.flags & SourceBSPStructs.SURF_SKY) != 0 || face.dispinfo != -1)
						continue;
					if (numVerts + face.numedges > 65000)
					{
						break;
					}
					numVerts += face.numedges;
					numInds += (face.numedges - 2) * 3;
				}
				if (i < firstFace + numFaces)
				{
					Debug.LogWarning ("skipped " + (firstFace + numFaces - i) + " faces. Load " + numVerts + " verts");
					numFaces = i - firstFace;
				}
				Debug.Log ("CreateModelObject " + index + " numVerts " + numVerts);

				Vector3[] verts = new Vector3[numVerts];
				Vector2[] UVs = new Vector2[numVerts];
				Vector2[] UV2s = new Vector2[numVerts];
				int[] tris = new int[numInds];

				int vertOffs = 0;
				int indsOffs = 0;
				for (i = firstFace; i < firstFace + numFaces; i++)
				{
					face = map.facesLump[i];
					ti = map.texinfosLump[face.texinfo];
					if ((Test.Inst.skipSky && (ti.flags & SourceBSPStructs.SURF_SKY) != 0) || face.dispinfo != -1)
						continue;

					if (BuildFace (i, ref verts, ref UVs, ref UV2s, ref tris, vertOffs, indsOffs))
					{
						vertOffs += face.numedges;
						indsOffs += (face.numedges - 2) * 3;
					}
					else
					{
						/*	GameObject subGO = new GameObject("lm"+curLightmap);
							subGO.transform.SetParent(model.transform);
							subGO.isStatic = true;
							MeshRenderer subMR = subGO.AddComponent<MeshRenderer>();
							subMR.material = Test.Inst.testMaterial;
							MeshFilter subMF = model.AddComponent<MeshFilter>();
							subMF.sharedMesh = new Mesh();
							subMF.sharedMesh.name = "lm"+curLightmap;
							subMF.sharedMesh.vertices = verts;
							subMF.sharedMesh.triangles = tris;
							subMF.sharedMesh.uv = UVs;
							subMF.sharedMesh.uv2 = UV2s;
							subMR.lightmapIndex = curLightmap;
							subMF.sharedMesh.RecalculateNormals ();

							LM_UploadBlock();
							LM_InitBlock();*/
					}
				}

				MeshRenderer mr = model.AddComponent<MeshRenderer> ();
				mr.material = Test.Inst.testMaterial;

				MeshFilter mf = model.AddComponent<MeshFilter> ();
				mf.sharedMesh = new Mesh ();
				mf.sharedMesh.name = "BSPModel_" + index;
				mf.sharedMesh.vertices = verts;
				mf.sharedMesh.triangles = tris;
				mf.sharedMesh.uv = UVs;
				if (uSrcSettings.Inst.lightmaps && map.hasLightmaps && curLightmap < 255)
				{
					mf.sharedMesh.uv2 = UV2s;
					mr.lightmapIndex = curLightmap;
				}

				mf.sharedMesh.RecalculateNormals ();

				if (uSrcSettings.Inst.genColliders)
				{
					model.AddComponent<MeshCollider> ();
				}

				if (!uSrcSettings.Inst.showTriggers)
				{
					face = map.facesLump[firstFace];
					ti = map.texinfosLump[face.texinfo];
					string materialName = ConvertUtils.GetNullTerminatedString (map.texdataStringDataLump, map.texdataStringTableLump[map.texdataLump[ti.texdata].nameStringTableID]);
					materialName = materialName.ToLower ();
					if ((materialName.Contains ("trigger") || materialName.Contains ("fogvolume")) && !uSrcSettings.Inst.showTriggers)
					{
						model.SetActive (false);
					}
				}
			}
			else
			{
				bsptexdata texdata;
				List<int>[] materialFaces = null;

				materialFaces = new List<int>[map.texdataLump.Length];
				for (i = firstFace; i < firstFace + numFaces; i++)
				{
					face = map.facesLump[i];
					ti = map.texinfosLump[face.texinfo];
					texdata = map.texdataLump[ti.texdata];
					if (Test.Inst.skipSky && (ti.flags & SourceBSPStructs.SURF_SKY) != 0 || face.dispinfo != -1)
						continue;

					if (materialFaces[ti.texdata] == null)
					{
						materialFaces[ti.texdata] = new List<int> ();
					}
					materialFaces[ti.texdata].Add (i);
					texdata.numVerts += face.numedges;
					texdata.numInds += (face.numedges - 2) * 3;
				}

				for (i = 0; i < map.texdataLump.Length; i++)
				{
					if (materialFaces[i] == null)
					{
						continue;
					}
					texdata = map.texdataLump[i];

					Vector3[] verts = new Vector3[texdata.numVerts];
					Vector2[] UVs = new Vector2[texdata.numVerts];
					Vector2[] UV2s = new Vector2[texdata.numVerts];
					int[] tris = new int[texdata.numInds];

					int vertOffs = 0;
					int indsOffs = 0;
					for (int j = 0; j < materialFaces[i].Count (); j++)
					{
						face = map.facesLump[materialFaces[i][j]];

						if (!BuildFace (materialFaces[i][j], ref verts, ref UVs, ref UV2s, ref tris, vertOffs, indsOffs))
						{
							LM_UploadBlock ();
							LM_InitBlock ();
							BuildFace (materialFaces[i][j], ref verts, ref UVs, ref UV2s, ref tris, vertOffs, indsOffs);
						}
						vertOffs += face.numedges;
						indsOffs += (face.numedges - 2) * 3;
					}

					string materialName = ConvertUtils.GetNullTerminatedString (map.texdataStringDataLump, map.texdataStringTableLump[texdata.nameStringTableID]);
					materialName = materialName.ToLowerInvariant ();
					
					//Leaked maps embedded texture paths are used twice in beta maps, tested on trainingroom.bsp
                       			 //-Jhrino
					 
					if(map.header.version < 19 && materialName.Contains(Test.Inst.mapName)) // only check if its actually embedded, forgot about this one
					{
				          //Some maps do not even directly reference the proper level name for embedded materials
                       			 //Tested on c17_01_13 with Leaknet + Megapatch
                        	           if (materialName.Split('/')[1] != Test.Inst.mapName)
					   {
					      materialName = materialName.Replace(materialName.Split('/')[1], Test.Inst.mapName);
					      materialName = materialName.Replace("maps/" + Test.Inst.mapName + "/", "");
					   }
					   //does the map repeat the embedded texture path TWICE
					   if(materialName.Contains("maps/" + Test.Inst.mapName + "/maps/" + Test.Inst.mapName + "/"))
					   {
					      materialName = materialName.Replace("maps/" + Test.Inst.mapName + "/maps/" + Test.Inst.mapName + "/", "");
					      materialName = materialName.Split('_')[0];
					   }
					   else // if not, its probably once?
					   {
					      if(materialName.Contains("maps/" + Test.Inst.mapName + "/"))
					      {
					        //Dont split anything and load the material with replace
						materialName = materialName.Replace("maps/" + Test.Inst.mapName + "/", "");
					      }
					   }
					}

					
					GameObject texObj = new GameObject (materialName);
					texObj.transform.SetParent (model.transform);
					texObj.isStatic = true;
					if (uSrcSettings.Inst.lightmaps && map.hasLightmaps)
						texObj.layer = 8;

					MeshRenderer mr = texObj.AddComponent<MeshRenderer> ();
					MeshFilter mf = texObj.AddComponent<MeshFilter> ();
					Mesh mesh = new Mesh ();
					mesh.name = materialName;
					mesh.vertices = verts;
					mesh.uv = UVs;
					mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.TwoSided; //Making model shadows two-sided for better quality.

					if (uSrcSettings.Inst.lightmaps && map.hasLightmaps && curLightmap < 255)
						mesh.uv2 = UV2s;

					mesh.triangles = tris;
					mesh.RecalculateNormals ();
					mf.sharedMesh = mesh;

					Material mat = ResourceManager.Inst.GetMaterial (materialName);
					mr.material = mat;
					

					if (uSrcSettings.Inst.lightmaps && map.hasLightmaps && curLightmap < 255)
					{
						mr.lightmapIndex = curLightmap;
					}
					if ((materialName.Contains ("trigger") || materialName.Contains ("fogvolume")) && !uSrcSettings.Inst.showTriggers)
					{
						texObj.SetActive (false);
					}

					if (uSrcSettings.Inst.genColliders)
					{
						texObj.AddComponent<MeshCollider> ();
					}
				}

				for (int t = 0; t < map.texdataLump.Length; t++)
				{
					texdata = map.texdataLump[t];

					texdata.numVerts = 0;
					texdata.numInds = 0;
				}
			}
		}