예제 #1
0
            public TextureAtlasData(string packFile, string imagesDir, bool flip)
            {
                Pages   = new List <Page>();
                Regions = new List <Region>();

                using (StreamReader reader = new StreamReader(packFile)) {
                    List <string> tupleData = new List <string>();
                    Page          pageImage = null;

                    while (true)
                    {
                        string line = reader.ReadLine();
                        if (line == null)
                        {
                            break;
                        }

                        if (line.Trim().Length == 0)
                        {
                            pageImage = null;
                        }
                        else if (pageImage == null)
                        {
                            string file = Path.Combine(imagesDir, line);


                            string        formatString = ReadValue(reader);
                            SurfaceFormat format;

                            if (!Enum.TryParse <SurfaceFormat>(formatString, true, out format))
                            {
                                format = TranslateSurfaceFormat(formatString);
                            }

                            ReadTuple(reader, tupleData);
                            //TextureFilter min = (TextureFilter)Enum.Parse(typeof(TextureFilter), tupleData[0], true);
                            //TextureFilter max = (TextureFilter)Enum.Parse(typeof(TextureFilter), tupleData[1], true);
                            TextureFilter filter = TranslateTextureFilter(tupleData[0], tupleData[1]);

                            string             direction = ReadValue(reader);
                            TextureAddressMode repeatX   = TextureAddressMode.Clamp;
                            TextureAddressMode repeatY   = TextureAddressMode.Clamp;
                            switch (direction)
                            {
                            case "x":
                                repeatX = TextureAddressMode.Wrap;
                                break;

                            case "y":
                                repeatY = TextureAddressMode.Wrap;
                                break;

                            case "xy":
                                repeatX = TextureAddressMode.Wrap;
                                repeatY = TextureAddressMode.Wrap;
                                break;
                            }

                            pageImage = new Page(file, filter.IsMapMap(), format, filter, repeatX, repeatY);
                            Pages.Add(pageImage);
                        }
                        else
                        {
                            bool rotate = bool.Parse(ReadValue(reader));

                            ReadTuple(reader, tupleData);
                            int left = int.Parse(tupleData[0]);
                            int top  = int.Parse(tupleData[1]);

                            ReadTuple(reader, tupleData);
                            int width  = int.Parse(tupleData[0]);
                            int height = int.Parse(tupleData[1]);

                            Region region = new Region()
                            {
                                Page   = pageImage,
                                Left   = left,
                                Top    = top,
                                Width  = width,
                                Height = height,
                                Name   = line,
                                Rotate = rotate,
                            };

                            if (ReadTuple(reader, tupleData) == 4)
                            {
                                region.Splits = new int[] {
                                    int.Parse(tupleData[0]), int.Parse(tupleData[1]),
                                    int.Parse(tupleData[2]), int.Parse(tupleData[3]),
                                };

                                if (ReadTuple(reader, tupleData) == 4)
                                {
                                    region.Pads = new int[] {
                                        int.Parse(tupleData[0]), int.Parse(tupleData[1]),
                                        int.Parse(tupleData[2]), int.Parse(tupleData[3]),
                                    };

                                    ReadTuple(reader, tupleData);
                                }
                            }

                            region.OriginalWidth  = int.Parse(tupleData[0]);
                            region.OriginalHeight = int.Parse(tupleData[1]);

                            ReadTuple(reader, tupleData);
                            region.OffsetX = int.Parse(tupleData[0]);
                            region.OffsetY = int.Parse(tupleData[1]);

                            region.Index = int.Parse(ReadValue(reader));

                            if (flip)
                            {
                                region.Flip = true;
                            }

                            Regions.Add(region);
                        }
                    }
                }

                Regions.Sort(IndexComparator);
            }