Пример #1
0
    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;
    }
Пример #2
0
    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;
    }
Пример #3
0
 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;
 }
Пример #4
0
    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);
    }