public static Transform Load(string ModelName) { Clear(); string OpenPath = string.Concat(Configuration.GameFld, Configuration.Mod, ModelName); ModelObject = new GameObject(ModelName); if (!File.Exists(OpenPath + ".mdl")) return ModelObject.transform; CRead = new CustomReader(File.OpenRead(OpenPath + ".mdl")); MDL_Header = CRead.ReadType<studiohdr_t>(); ParseMdlFile(); CRead = new CustomReader(File.OpenRead(OpenPath + ".vvd")); VVD_Header = CRead.ReadType<vertexFileHeader_t>(); ParseVvdFile(); CRead = new CustomReader(File.OpenRead(OpenPath + ".dx90.vtx")); VTX_Header = CRead.ReadType<FileHeader_t>(); ParseVtxFile(); if (!Configuration.Models.ContainsKey(ModelObject.name)) Configuration.Models.Add(ModelName, ModelObject.transform); CRead.Dispose(); return ModelObject.transform; }
public static Transform LoadMdl(string ModelName) { Clear(); string OpenPath = string.Concat(WorldController.GamePath, WorldController.ModName, ModelName); ModelObject = new GameObject(ModelName); if (!File.Exists(OpenPath + ".mdl")) { return(ModelObject.transform); } // ----- BEGIN READ MDL, VVD, VTX ----- // CRead = new CustomReader(new BinaryReader(File.OpenRead(OpenPath + ".mdl"))); MDL_Header = CRead.ReadType <studiohdr_t>(0); ParseMdlFile(); CRead = new CustomReader(new BinaryReader(File.OpenRead(OpenPath + ".vvd"))); VVD_Header = CRead.ReadType <vertexFileHeader_t>(0); ParseVvdFile(); CRead = new CustomReader(new BinaryReader(File.OpenRead(OpenPath + ".dx90.vtx"))); VTX_Header = CRead.ReadType <FileHeader_t>(0); ParseVtxFile(); // ----- END READ MDL, VVD, VTX ----- // return(ModelObject.transform); }
private static ColorRGBExp32 TexLightToLinear(int fileofs) { switch (BSP_Header.version) { // FITCH: If BSP version more than 20, you need load HDR lumps case 21: fileofs += BSP_Header.lumps[53].fileofs; break; default: fileofs += BSP_Header.lumps[8].fileofs; break; } ColorRGBExp32 ColorRGBExp32 = CRead.ReadType <ColorRGBExp32>(fileofs); // Convert HDR pixels to RGB ColorRGBExp32.r = (byte)Mathf.Clamp(ColorRGBExp32.r * Mathf.Pow(2, ColorRGBExp32.exponent), 0, 255); ColorRGBExp32.g = (byte)Mathf.Clamp(ColorRGBExp32.g * Mathf.Pow(2, ColorRGBExp32.exponent), 0, 255); ColorRGBExp32.b = (byte)Mathf.Clamp(ColorRGBExp32.b * Mathf.Pow(2, ColorRGBExp32.exponent), 0, 255); return(ColorRGBExp32); }
public static void LoadModel(string modelName) { BinaryReader = new BinaryReader(File.OpenRead(WorldController.GamePath + modelName + ".4ds")); CustomReader = new CustomReader(BinaryReader); ModelObject = new GameObject(modelName); _4DSMainHeader = CustomReader.ReadType <FILE>(0); Debug.Log("4DS version: " + _4DSMainHeader.fileVersion); LoadMaterialsInfo(); LoadObjectsInfo(); bool haveAnimation = BinaryReader.ReadBoolean(); BinaryReader.BaseStream.Close(); }
public static Material LoadMaterial(string MaterialName) { // Set default parameters MaterialShader = Shader.Find("Lightmapped/Diffuse"); MaterialColor = new Color32(255, 255, 255, 255); Material material = new Material(MaterialShader); MaterialName = MaterialName.Replace(".vmt", ""); // ----- BEGIN PARSE VMT ----- // if (File.Exists(WorldController.CurrentTexPath + MaterialName + ".vmt")) { VMT_File = File.ReadAllLines(WorldController.CurrentTexPath + MaterialName + ".vmt"); ParseVmtFile(ref FindInVMT); } while (true) { if (File.Exists(WorldController.DefaultTexPath + FindInVMT + ".vtf") && !File.Exists(WorldController.DefaultTexPath + FindInVMT + ".vmt")) { break; } if (File.Exists(WorldController.DefaultTexPath + FindInVMT + ".vmt")) { string _FindInVMT = FindInVMT; VMT_File = File.ReadAllLines(WorldController.DefaultTexPath + FindInVMT + ".vmt"); ParseVmtFile(ref FindInVMT); if (FindInVMT == _FindInVMT) { break; } continue; } if (File.Exists(WorldController.DefaultTexPath + FindInVMT + ".vtf")) { break; } return(material); } // ----- END PARSE VMT ----- // // Initialize reader and read VTF header CRead = new CustomReader(new BinaryReader(File.OpenRead(WorldController.DefaultTexPath + FindInVMT + ".vtf"))); VTF_Header = CRead.ReadType <tagVTFHEADER>(0); // Apply texture, shader, color to material material.mainTexture = GetTexture(); material.shader = MaterialShader; material.color = MaterialColor; return(material); }
private static void ParseMdlFile() { // ----- LOAD BODYPARTS ----- // MDL_BodyParts.AddRange(CRead.ReadType <mstudiobodyparts_t>(MDL_Header.bodypart_offset, MDL_Header.bodypart_count)); int ModelArrayOffset = 0; for (int i = 0; i < MDL_Header.bodypart_count; i++) { int ModelInputFilePosition = MDL_Header.bodypart_offset + (Marshal.SizeOf(typeof(mstudiobodyparts_t)) * i) + MDL_BodyParts[i].modelindex; MDL_Models.AddRange(CRead.ReadType <mstudiomodel_t>(ModelInputFilePosition, MDL_BodyParts[i].nummodels)); for (int l = 0; l < MDL_BodyParts[i].nummodels; l++) { int MeshInputFilePosition = ModelInputFilePosition + (Marshal.SizeOf(typeof(mstudiomodel_t)) * l) + MDL_Models[ModelArrayOffset + l].meshindex; MDL_Meshes.AddRange(CRead.ReadType <mstudiomesh_t>(MeshInputFilePosition, MDL_Models[l].nummeshes)); } ModelArrayOffset += (MDL_BodyParts[i].nummodels - 1); } // ----- LOAD TEXTURES INFO ----- // List <mstudiotexture_t> MDL_TexturesInfo = new List <mstudiotexture_t>(); MDL_TexturesInfo.AddRange(CRead.ReadType <mstudiotexture_t>(MDL_Header.texture_offset, MDL_Header.texture_count)); for (int i = 0; i < MDL_Header.texture_count; i++) { int StringInputFilePosition = MDL_Header.texture_offset + (Marshal.SizeOf(typeof(mstudiotexture_t)) * i) + MDL_TexturesInfo[i].sznameindex; MDL_Textures.Add(CRead.ReadNullTerminatedString(StringInputFilePosition)); } int[] TDirOffsets = CRead.ReadType <int>(MDL_Header.texturedir_offset, MDL_Header.texturedir_count); for (int i = 0; i < MDL_Header.texturedir_count; i++) { MDL_TDirectories.Add(CRead.ReadNullTerminatedString(TDirOffsets[i])); } // ----- LOAD BONES ----- // List <mstudiobone_t> MDL_BonesInfo = new List <mstudiobone_t>(); MDL_BonesInfo.AddRange(CRead.ReadType <mstudiobone_t>(MDL_Header.bone_offset, MDL_Header.bone_count)); for (int i = 0; i < MDL_Header.bone_count; i++) { int StringInputFilePosition = MDL_Header.bone_offset + (Marshal.SizeOf(typeof(mstudiobone_t)) * i) + MDL_BonesInfo[i].sznameindex; GameObject BoneObject = new GameObject(CRead.ReadNullTerminatedString(StringInputFilePosition)); BoneObject.transform.parent = ModelObject.transform; MDL_Bones.Add(BoneObject.transform); if (MDL_BonesInfo[i].parent >= 0) { MDL_Bones[i].transform.parent = MDL_Bones[MDL_BonesInfo[i].parent].transform; } } }
public static Texture2D Load(string TextureName) { if (!File.Exists(Configuration.GameFld + Configuration.Mod + "/materials/" + TextureName + ".vtf")) return new Texture2D(1, 1); CRead = new CustomReader(File.OpenRead(Configuration.GameFld + Configuration.Mod + "/materials/" + TextureName + ".vtf")); VTF_Header = CRead.ReadType<tagVTFHEADER>(); Texture2D VTF_Texture = default(Texture2D); TextureFormat ImageFormat; long OffsetInFile = VTF_Header.Width * VTF_Header.Height * uiBytesPerPixels[(int)VTF_Header.HighResImageFormat]; switch (VTF_Header.HighResImageFormat) { case VTFImageFormat.IMAGE_FORMAT_DXT1: OffsetInFile = ((VTF_Header.Width + 3) / 4) * ((VTF_Header.Height + 3) / 4) * 8; ImageFormat = TextureFormat.DXT1; break; case VTFImageFormat.IMAGE_FORMAT_DXT3: case VTFImageFormat.IMAGE_FORMAT_DXT5: OffsetInFile = ((VTF_Header.Width + 3) / 4) * ((VTF_Header.Height + 3) / 4) * 16; ImageFormat = TextureFormat.DXT5; break; case VTFImageFormat.IMAGE_FORMAT_RGB888: case VTFImageFormat.IMAGE_FORMAT_BGR888: ImageFormat = TextureFormat.RGB24; break; case VTFImageFormat.IMAGE_FORMAT_RGBA8888: ImageFormat = TextureFormat.RGBA32; break; case VTFImageFormat.IMAGE_FORMAT_ARGB8888: ImageFormat = TextureFormat.ARGB32; break; case VTFImageFormat.IMAGE_FORMAT_BGRA8888: ImageFormat = TextureFormat.BGRA32; break; default: return new Texture2D(1, 1); } VTF_Texture = new Texture2D(VTF_Header.Width, VTF_Header.Height, ImageFormat, false); byte[] VTF_File = CRead.GetBytes((int)OffsetInFile, CRead.InputStream.Length - OffsetInFile); if (VTF_Header.HighResImageFormat == VTFImageFormat.IMAGE_FORMAT_BGR888) { for (int i = 0; i < VTF_File.Length - 1; i += 3) { byte Temp = VTF_File[i]; VTF_File[i] = VTF_File[i + 2]; VTF_File[i + 2] = Temp; } } VTF_Texture.LoadRawTextureData(VTF_File); Texture2D Mip_Texture = new Texture2D(VTF_Header.Width, VTF_Header.Height, TextureFormat.RGBA32, true); Mip_Texture.SetPixels32(VTF_Texture.GetPixels32()); Mip_Texture.Apply(); Mip_Texture.Compress(false); Object.DestroyImmediate(VTF_Texture); CRead.Dispose(); return Mip_Texture; }
private static void LoadMaterialsInfo() { int CountMaterials = BinaryReader.ReadUInt16(); for (int i = 0; i < CountMaterials; i++) { MATERIAL _4DSMaterial = CustomReader.ReadType <MATERIAL>(); string ReflectionTexture = LoadReflectMaterial(); // Load Reflection Material Info string DiffuseTexture = LoadDiffuseMaterial(); // Load Diffuse Material Info string OpacityTexture = LoadOpacityMaterial(); // Load Opacity Material Info LoadAnimationMaterial(); // Load Animation Material Info _4DSTextures.Add(DiffuseTexture); } }
public static Texture2D Load(string TextureName) { string TextureDestinationPath = Configuration.GameFld + Configuration.Mod + "/materials/" + TextureName + ".vtf"; if (!File.Exists(TextureDestinationPath)) { if (File.Exists(Configuration.GameFld + Configuration._Mod + "/materials/" + TextureName + ".vtf")) TextureDestinationPath = Configuration.GameFld + Configuration._Mod + "/materials/" + TextureName + ".vtf"; else return new Texture2D(1, 1); } CRead = new CustomReader(File.OpenRead(TextureDestinationPath)); VTF_Header = CRead.ReadType<tagVTFHEADER>(); Texture2D VTF_Texture; TextureFormat ImageFormat; long OffsetInFile = VTF_Header.Width * VTF_Header.Height * uiBytesPerPixels[(int)VTF_Header.HighResImageFormat]; switch (VTF_Header.HighResImageFormat) { case VTFImageFormat.IMAGE_FORMAT_DXT1: OffsetInFile = ((VTF_Header.Width + 3) / 4) * ((VTF_Header.Height + 3) / 4) * 8; ImageFormat = TextureFormat.DXT1; break; case VTFImageFormat.IMAGE_FORMAT_DXT3: case VTFImageFormat.IMAGE_FORMAT_DXT5: OffsetInFile = ((VTF_Header.Width + 3) / 4) * ((VTF_Header.Height + 3) / 4) * 16; ImageFormat = TextureFormat.DXT5; break; case VTFImageFormat.IMAGE_FORMAT_RGB888: case VTFImageFormat.IMAGE_FORMAT_BGR888: ImageFormat = TextureFormat.RGB24; break; case VTFImageFormat.IMAGE_FORMAT_RGBA8888: ImageFormat = TextureFormat.RGBA32; break; case VTFImageFormat.IMAGE_FORMAT_ARGB8888: ImageFormat = TextureFormat.ARGB32; break; case VTFImageFormat.IMAGE_FORMAT_BGRA8888: ImageFormat = TextureFormat.BGRA32; break; default: return new Texture2D(1, 1); } VTF_Texture = new Texture2D(VTF_Header.Width, VTF_Header.Height, ImageFormat, false); byte[] VTF_File = CRead.GetBytes((int)OffsetInFile, CRead.InputStream.Length - OffsetInFile); if (VTF_Header.HighResImageFormat == VTFImageFormat.IMAGE_FORMAT_BGR888) { for (int i = 0; i < VTF_File.Length - 1; i += 3) { byte Temp = VTF_File[i]; VTF_File[i] = VTF_File[i + 2]; VTF_File[i + 2] = Temp; } } VTF_Texture.LoadRawTextureData(VTF_File); CRead.Dispose(); // MIPMAP NOT WORK!!! VERY SLOWLY!!! if (Configuration.AndroidCompression) { Texture2D Mip_Texture = new Texture2D(VTF_Header.Width, VTF_Header.Height); Mip_Texture.SetPixels32(VTF_Texture.GetPixels32()); EditorUtility.CompressTexture(Mip_Texture, TextureFormat.ETC_RGB4, TextureCompressionQuality.Fast); Mip_Texture.Apply(); return Mip_Texture; } VTF_Texture.Apply(); return VTF_Texture; }
public static void LoadBSP() { // Initialize readers BinaryReader = new BinaryReader(File.OpenRead(WorldController.GamePath + WorldController.ModName + "/maps/" + WorldController.MapName + ".bsp")); CRead = new CustomReader(BinaryReader); // ----- BEGIN READ BSP ----- // BSP_Header = CRead.ReadType <dheader_t>(); Debug.Log("BSP version: " + BSP_Header.version); string input = Encoding.ASCII.GetString(CRead.GetBytes(BSP_Header.lumps[0].fileofs, BSP_Header.lumps[0].filelen)); foreach (Match match in Regex.Matches(input, @"{[^}]*}", RegexOptions.IgnoreCase)) { BSP_Entities.Add(match.Value); } switch (BSP_Header.version) { // FITCH: If BSP version more than 20, you need load HDR lumps case 21: BSP_Faces.AddRange(CRead.ReadType <dface_t>(BSP_Header.lumps[58].fileofs, BSP_Header.lumps[58].filelen / 56)); break; default: BSP_Faces.AddRange(CRead.ReadType <dface_t>(BSP_Header.lumps[7].fileofs, BSP_Header.lumps[7].filelen / 56)); break; } BSP_Models.AddRange(CRead.ReadType <dmodel_t>(BSP_Header.lumps[14].fileofs, BSP_Header.lumps[14].filelen / 48)); BSP_Texdata.AddRange(CRead.ReadType <dtexdata_t>(BSP_Header.lumps[2].fileofs, BSP_Header.lumps[2].filelen / 32)); BSP_Texinfo.AddRange(CRead.ReadType <texinfo_t>(BSP_Header.lumps[6].fileofs, BSP_Header.lumps[6].filelen / 72)); BSP_DispInfo.AddRange(CRead.ReadType <ddispinfo_t>(BSP_Header.lumps[26].fileofs, BSP_Header.lumps[26].filelen / 176)); BSP_DispVerts.AddRange(CRead.ReadType <dDispVert>(BSP_Header.lumps[33].fileofs, BSP_Header.lumps[33].filelen / 20)); int[] BSP_TexStrTable = CRead.ReadType <int>(BSP_Header.lumps[44].fileofs, BSP_Header.lumps[44].filelen / 4); BSP_TexStrData.AddRange(CRead.ReadNullTerminatedString(BSP_Header.lumps[43].fileofs, BSP_TexStrTable)); BSP_Vertices.AddRange(CRead.ReadType <Vector3>(BSP_Header.lumps[3].fileofs, BSP_Header.lumps[3].filelen / 12)); BSP_Edges.AddRange(CRead.ReadType <dedge_t>(BSP_Header.lumps[12].fileofs, BSP_Header.lumps[12].filelen / 4)); BSP_Surfedges.AddRange(CRead.ReadType <int>(BSP_Header.lumps[13].fileofs, BSP_Header.lumps[13].filelen / 4)); BSP_PakFile = CRead.GetBytes(BSP_Header.lumps[40].fileofs, BSP_Header.lumps[40].filelen); // ----- END READ BSP ----- // for (int i = 0; i < BSP_Entities.Count; i++) { LoadEntity(i); } BinaryReader.BaseStream.Dispose(); }
public void Load() { Clear(); if (!File.Exists(Configuration.GameFld + Configuration.Mod + "/maps/" + LevelName + ".bsp")) throw new FileNotFoundException(Configuration.GameFld + Configuration.Mod + "/maps/" + LevelName + ".bsp"); Configuration.Initialize(LevelName); Configuration.AndroidCompression = AndroidCompression; CRead = new CustomReader(File.OpenRead(Configuration.GameFld + Configuration.Mod + "/maps/" + LevelName + ".bsp")); BSP_Header = CRead.ReadType<BspSpecification.dheader_t>(); if (BSP_Header.ident != (('P' << 24) + ('S' << 16) + ('B' << 8) + 'V')) throw new FileLoadException("Wrong magic number"); if (BSP_Header.version < 19 || BSP_Header.version > 21) throw new FileLoadException(string.Format("BSP version ({0}) isn't supported", BSP_Header.version)); if (BSP_Header.lumps[0].fileofs == 0) { Debug.Log("Found Left 4 Dead 2 header"); for (int i = 0; i < BSP_Header.lumps.Length; i++) { BSP_Header.lumps[i].fileofs = BSP_Header.lumps[i].filelen; BSP_Header.lumps[i].filelen = BSP_Header.lumps[i].version; } } string input = Encoding.ASCII.GetString(CRead.GetBytes(BSP_Header.lumps[0].filelen, BSP_Header.lumps[0].fileofs)); foreach (Match match in Regex.Matches(input, @"{[^}]*}", RegexOptions.IgnoreCase)) BSP_Entities.Add(match.Value); if (!HighDynamicRange) BSP_Faces.AddRange(CRead.ReadType<BspSpecification.dface_t>(BSP_Header.lumps[7].filelen / 56, BSP_Header.lumps[7].fileofs)); else BSP_Faces.AddRange(CRead.ReadType<BspSpecification.dface_t>(BSP_Header.lumps[58].filelen / 56, BSP_Header.lumps[58].fileofs)); BSP_Models.AddRange(CRead.ReadType<BspSpecification.dmodel_t>(BSP_Header.lumps[14].filelen / 48, BSP_Header.lumps[14].fileofs)); BSP_DispInfo.AddRange(CRead.ReadType<BspSpecification.ddispinfo_t>(BSP_Header.lumps[26].filelen / 176, BSP_Header.lumps[26].fileofs)); BSP_DispVerts.AddRange(CRead.ReadType<BspSpecification.dDispVert>(BSP_Header.lumps[33].filelen / 20, BSP_Header.lumps[33].fileofs)); BSP_TexData.AddRange(CRead.ReadType<BspSpecification.dtexdata_t>(BSP_Header.lumps[2].filelen / 32, BSP_Header.lumps[2].fileofs)); BSP_TexInfo.AddRange(CRead.ReadType<BspSpecification.texinfo_t>(BSP_Header.lumps[6].filelen / 72, BSP_Header.lumps[6].fileofs)); int[] BSP_TexStrTable = CRead.ReadType<int>(BSP_Header.lumps[44].filelen / 4, BSP_Header.lumps[44].fileofs); BSP_TexStrData.AddRange(CRead.ReadNullTerminatedString(BSP_TexStrTable, BSP_Header.lumps[43].fileofs)); BSP_Edges.AddRange(CRead.ReadType<BspSpecification.dedge_t>(BSP_Header.lumps[12].filelen / 4, BSP_Header.lumps[12].fileofs)); BSP_Vertices.AddRange(CRead.ReadType<Vector3>(BSP_Header.lumps[3].filelen / 12, BSP_Header.lumps[3].fileofs)); BSP_Surfedges.AddRange(CRead.ReadType<int>(BSP_Header.lumps[13].filelen / 4, BSP_Header.lumps[13].fileofs)); UnpackPakFile(CRead.GetBytes(BSP_Header.lumps[40].filelen, BSP_Header.lumps[40].fileofs)); for (int i = 0; i < BSP_Entities.Count; i++) LoadEntity(i); CRead.Dispose(); }