//================================================================================================== 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; } } }
//================================================================================================== 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; } } }