public void LoadModelForTileId(int id) { if (TileList[id].CurrentLoadState == TileListEntry.LoadState.ModelLoaded) { return; } P3DModel model = P3DParser.LoadFromFile(TileList[id].ModelPath); TileList[id].Model = model; TileList[id].Materials = new List <Material>(model.P3DNumTextures); for (int i = 0; i < model.P3DNumTextures; i++) { MaterialListEntry m = Materials.FirstOrDefault(x => x.Name == model.P3DRenderInfo[i].TextureFile); if (m == default(MaterialListEntry)) { m = new MaterialListEntry(); m.Material = model.CreateMaterial(i); m.Name = model.P3DRenderInfo[i].TextureFile; Materials.Add(m); } TileList[id].Materials.Add(m.Material); } TileList[id].CurrentLoadState = TileListEntry.LoadState.ModelLoaded; }
public TileListEntry(string name, string modelPath, Texture icon, P3DModel model, List <Material> materials, IntVector2 size) { CurrentLoadState = LoadState.ModelLoaded; Name = name; ModelPath = modelPath; Icon = icon; Model = model; Materials = materials; Size = size; }
public void Set(Vector2Int size, string Restrictions, bool isCheckpoint, P3DModel model, List <Material> materials, Texture2D icon, Vegetation[] bushes, string custom_tileset_id) { Size = size; Bushes = bushes; IsCheckpoint = isCheckpoint; Model = model; Materials = materials; Icon = icon; Custom_tileset_id = custom_tileset_id; RMCname = Size.x.ToString() + "x" + Size.y.ToString() + Restrictions; }
public static P3DModel LoadFromBytes(List <byte> data) { P3DModel model = new P3DModel(); ByteFileParser io = new ByteFileParser(data); //skip 'p3d' text and version, cause i am a bad guy io.SetReadingOffest(4); model.P3DLength = io.ReadFloat(); model.P3DHeight = io.ReadFloat(); model.P3DDepth = io.ReadFloat(); //skip 'tex' text io.AddReadingOffset(3); //4 reserved bytes io.AddReadingOffset(4); model.P3DNumTextures = io.ReadByte(); model.P3DRenderInfo = new P3DModel.RenderInfo[model.P3DNumTextures]; for (int i = 0; i < model.P3DNumTextures; i++) { P3DModel.RenderInfo newRenderInfo = new P3DModel.RenderInfo(); newRenderInfo.TextureFile = io.ReadString().ToLower(); model.P3DRenderInfo[i] = newRenderInfo; } //skip lights test io.AddReadingOffset(6); //4 reserved bytes io.AddReadingOffset(4); model.P3DNumLights = io.ReadShort(); model.P3DLights = new P3DModel.P3DLight[model.P3DNumLights]; for (int i = 0; i < model.P3DNumLights; i++) { P3DModel.P3DLight newP3DLight = new P3DModel.P3DLight(); newP3DLight.Name = io.ReadString(); newP3DLight.Pos = io.ReadVector3(); newP3DLight.Range = io.ReadFloat(); newP3DLight.Color = io.ReadInt(); newP3DLight.ShowCorona = io.ReadByte(); newP3DLight.ShowLensFlares = io.ReadByte(); newP3DLight.LightUpEnvironment = io.ReadByte(); model.P3DLights[i] = newP3DLight; } //skip meshes test io.AddReadingOffset(6); //4 reserved bytes io.AddReadingOffset(4); model.P3DNumMeshes = io.ReadShort(); model.P3DMeshes = new P3DModel.P3DMesh[model.P3DNumMeshes]; for (int m = 0; m < model.P3DNumMeshes; m++) { //skip submesh test io.AddReadingOffset(7); //4 reserved bytes io.AddReadingOffset(4); P3DModel.P3DMesh newP3DMesh = new P3DModel.P3DMesh(model.P3DNumTextures); newP3DMesh.Name = io.ReadString(); newP3DMesh.Flags = io.ReadUInt(); newP3DMesh.LocalPos = io.ReadVector3(); newP3DMesh.Length = io.ReadFloat(); newP3DMesh.Height = io.ReadFloat(); newP3DMesh.Depth = io.ReadFloat(); for (int i = 0; i < model.P3DNumTextures; i++) { P3DModel.TextureInfo newTextureInfo = new P3DModel.TextureInfo(); newTextureInfo.TextureStart = io.ReadShort(); newTextureInfo.NumFlat = io.ReadShort(); newTextureInfo.NumFlatMetal = io.ReadShort(); newTextureInfo.NumGouraud = io.ReadShort(); newTextureInfo.NumGouraudMetal = io.ReadShort(); newTextureInfo.NumGouraudMetalEnv = io.ReadShort(); newTextureInfo.NumShining = io.ReadShort(); newP3DMesh.TextureInfos[i] = newTextureInfo; } newP3DMesh.NumVertices = io.ReadShort(); newP3DMesh.Vertex = new Vector3[newP3DMesh.NumVertices]; for (int i = 0; i < newP3DMesh.NumVertices; i++) { newP3DMesh.Vertex[i] = io.ReadVector3(); } newP3DMesh.NumPolys = io.ReadShort(); newP3DMesh.Poly = new P3DModel.P3DTexPolygon[newP3DMesh.NumPolys]; for (int i = 0; i < newP3DMesh.NumPolys; i++) { P3DModel.P3DTexPolygon newP3DTexPolygon = new P3DModel.P3DTexPolygon(); newP3DTexPolygon.P1 = io.ReadShort(); newP3DTexPolygon.U1 = io.ReadFloat(); newP3DTexPolygon.V1 = io.ReadFloat(); newP3DTexPolygon.P2 = io.ReadShort(); newP3DTexPolygon.U2 = io.ReadFloat(); newP3DTexPolygon.V2 = io.ReadFloat(); newP3DTexPolygon.P3 = io.ReadShort(); newP3DTexPolygon.U3 = io.ReadFloat(); newP3DTexPolygon.V3 = io.ReadFloat(); newP3DMesh.Poly[i] = newP3DTexPolygon; } for (int i = 0; i < model.P3DNumTextures; i++) { short PolyInTex = newP3DMesh.TextureInfos[i].TextureStart; for (int n = 0; n < newP3DMesh.TextureInfos[i].NumFlat; n++) { newP3DMesh.Poly[PolyInTex + n].Material = P3DModel.P3DMaterial.Flat; newP3DMesh.Poly[PolyInTex + n].Texture = model.P3DRenderInfo[i].TextureFile; } PolyInTex += newP3DMesh.TextureInfos[i].NumFlat; for (int n = 0; n < newP3DMesh.TextureInfos[i].NumFlatMetal; n++) { newP3DMesh.Poly[PolyInTex + n].Material = P3DModel.P3DMaterial.FlatMetal; newP3DMesh.Poly[PolyInTex + n].Texture = model.P3DRenderInfo[i].TextureFile; } PolyInTex += newP3DMesh.TextureInfos[i].NumFlatMetal; for (int n = 0; n < newP3DMesh.TextureInfos[i].NumGouraud; n++) { newP3DMesh.Poly[PolyInTex + n].Material = P3DModel.P3DMaterial.Gouraud; newP3DMesh.Poly[PolyInTex + n].Texture = model.P3DRenderInfo[i].TextureFile; } PolyInTex += newP3DMesh.TextureInfos[i].NumGouraud; for (int n = 0; n < newP3DMesh.TextureInfos[i].NumGouraudMetal; n++) { newP3DMesh.Poly[PolyInTex + n].Material = P3DModel.P3DMaterial.GouraudMetal; newP3DMesh.Poly[PolyInTex + n].Texture = model.P3DRenderInfo[i].TextureFile; } PolyInTex += newP3DMesh.TextureInfos[i].NumGouraudMetal; for (int n = 0; n < newP3DMesh.TextureInfos[i].NumGouraudMetalEnv; n++) { newP3DMesh.Poly[PolyInTex + n].Material = P3DModel.P3DMaterial.GouraudMetalEnv; newP3DMesh.Poly[PolyInTex + n].Texture = model.P3DRenderInfo[i].TextureFile; } PolyInTex += newP3DMesh.TextureInfos[i].NumGouraudMetalEnv; for (int n = 0; n < newP3DMesh.TextureInfos[i].NumShining; n++) { newP3DMesh.Poly[PolyInTex + n].Material = P3DModel.P3DMaterial.Shining; newP3DMesh.Poly[PolyInTex + n].Texture = model.P3DRenderInfo[i].TextureFile; } } model.P3DMeshes[m] = newP3DMesh; } //skip user test io.AddReadingOffset(4); //4 reserved bytes io.AddReadingOffset(4); model.P3DUserDataSize = io.ReadInt(); if (model.P3DUserDataSize != 0) { model.P3DUserDataPtr = io.ReadString(model.P3DUserDataSize); } else { model.P3DUserDataPtr = ""; } return(model); }
/// <summary> /// Loads all Cfl files using directory. Has to be run before ReadCatFiles. /// </summary> /// <param name="Dir"></param> private static List <string> ReadCflFiles(string Dir, string mod_id = null, string mod_to_filter_by = null) { List <string> names = new List <string>(); string[] cfls = Directory.GetFiles(Dir, "*.cfl"); foreach (var File in cfls) { string name = Path.GetFileNameWithoutExtension(File); if (mod_to_filter_by != null && DefaultTiles.ContainsKey(name)) { List <string> mods = DefaultTiles[name]; if (mods.Count() != 0 && mods[mods.Count - 1] != mod_to_filter_by) { continue; } } string[] cfl = System.IO.File.ReadAllLines(File); for (int j = 0; j < cfl.Length; j++) { cfl[j] = IO.RemoveComment(cfl[j]); } if (cfl[2].LastIndexOf('.') < 0) { Debug.Log("modelName"); } string modelName = cfl[2].Remove(cfl[2].LastIndexOf('.')).ToLower(); // field is just block of grass. It's listed in cfl file but isn't showed. Mica used this tile as CP (weird right?) so I had to take this into consideration if (modelName == "field" && mod_id == null || modelName == "border1" || modelName == "border2") { continue; } string[] size_str = Regex.Split(cfl[3], " "); Vector2Int size = new Vector2Int(int.Parse(size_str[0]), int.Parse(size_str[1])); bool IsCheckpoint = cfl[9] == "1" ? true : false; int offset = cfl[13].Contains("STOP") ? 1 : 0; // checkpoints have one additional parameter for checkpoint dimensions, which moves forward all other parameters by one line string Restrictions = Regex.Replace(cfl[12 + offset], " ", ""); // remove STOP characters Restrictions = Restrictions.Remove(Restrictions.Length - 4); string Vegetation_str = cfl[16 + offset]; List <Vegetation> VegData = new List <Vegetation>(); if (Vegetation_str != "NO_VEGETATION" && Vegetation_str != "SAME_VEGETATION_AS") { int bushCount = int.Parse(Vegetation_str); for (int j = 0; j < bushCount; j++) { string VegName = cfl[19 + offset + 7 * j]; VegName = VegName.Substring(0, VegName.IndexOf('.')); // don't load grass and small vegetation. We are interested only in big trees // TODO //if (!Consts.AllowedBushes.Contains(VegName)) // continue; //string[] xz = Regex.Split(cfl[21 + offset + 7 * j], " "); //float x = float.Parse(xz[0], System.Globalization.CultureInfo.InvariantCulture); //float z = float.Parse(xz[1], System.Globalization.CultureInfo.InvariantCulture); //string y = cfl[23 + offset + 7 * j]; //VegData.Add(new Vegetation(VegName, x, z, y)); } } // load icon of tile Texture2D texture = Texture2D.blackTexture; if (Directory.Exists(NavigateDirUp(Dir, 2) + "\\textures\\pictures\\tiles\\")) { string[] files = Directory.GetFiles(NavigateDirUp(Dir, 2) + "\\textures\\pictures\\tiles\\", name + ".*"); files = files.Where(f => f.Contains("dds") || f.Contains("tga")).ToArray(); if (files.Length == 0) { string datapath = IO.GetCrashdayPath() + "\\data\\content\\textures\\pictures\\tiles\\" + name + ".tga"; texture = TgaDecoder.LoadTGA(datapath); } else if (files[0].Contains(".tga")) // tga format { texture = TgaDecoder.LoadTGA(files[0]); } else { // file is in dds format string ddsFilePath = NavigateDirUp(Dir, 2) + "\\textures\\pictures\\tiles\\" + name + ".dds"; byte[] bytes = System.IO.File.ReadAllBytes(ddsFilePath); texture = DDSDecoder.LoadTextureDXT(bytes, TextureFormat.DXT1); } } else { texture = Resources.Load <Texture2D>("flag"); } string Model_path = NavigateDirUp(Dir, 2) + "\\models\\" + modelName + ".p3d"; if (!System.IO.File.Exists(Model_path)) { // look for model in original files (used in mica's tiles) Model_path = IO.GetCrashdayPath() + "\\data\\content\\models\\" + modelName + ".p3d"; if (!System.IO.File.Exists(Model_path)) { Debug.LogWarning("No p3d for tile " + name); continue; } } P3DModel model = P3DParser.LoadFromFile(Model_path); List <Material> ModelMaterials = new List <Material>(model.P3DNumTextures); for (int j = 0; j < model.P3DNumTextures; j++) { MaterialListEntry m = Materials.FirstOrDefault(x => x.Name == model.P3DRenderInfo[j].TextureFile); if (m == default(MaterialListEntry)) { m = new MaterialListEntry { Material = model.CreateMaterial(j, mod_id), Name = model.P3DRenderInfo[j].TextureFile }; Materials.Add(m); } ModelMaterials.Add(m.Material); } if (TileListInfo.ContainsKey(name)) { TileListInfo[name].Set(size, Restrictions, IsCheckpoint, model, ModelMaterials, texture, VegData.ToArray(), mod_id); } else { TileListInfo.Add(name, new TileListEntry(size, Restrictions, IsCheckpoint, model, ModelMaterials, texture, VegData.ToArray(), mod_id)); } names.Add(name); } return(names); }