Exemple #1
0
        public static RenderBase.OTexture loadTexture(string fileName)
        {
            if (File.Exists(fileName + ".xml"))
            {
                Serialization.SERI tex = Serialization.getSERI(fileName + ".xml");

                int    width           = tex.getIntegerParameter("w");
                int    height          = tex.getIntegerParameter("h");
                int    mipmap          = tex.getIntegerParameter("mipmap");
                int    format          = tex.getIntegerParameter("format");
                string textureName     = tex.getStringParameter("tex");
                string fullTextureName = fileName;

                if (File.Exists(fullTextureName))
                {
                    RenderBase.OTextureFormat fmt = RenderBase.OTextureFormat.dontCare;
                    switch (format)
                    {
                    case 0: fmt = RenderBase.OTextureFormat.l4; break;

                    case 1: fmt = RenderBase.OTextureFormat.l8; break;

                    case 3: fmt = RenderBase.OTextureFormat.la8; break;

                    case 7: fmt = RenderBase.OTextureFormat.rgb565; break;

                    case 8: fmt = RenderBase.OTextureFormat.rgba5551; break;

                    case 9: fmt = RenderBase.OTextureFormat.rgba4; break;

                    case 0xa: fmt = RenderBase.OTextureFormat.rgba8; break;

                    case 0xb: fmt = RenderBase.OTextureFormat.rgb8; break;

                    case 0xc: fmt = RenderBase.OTextureFormat.etc1; break;

                    case 0xd: fmt = RenderBase.OTextureFormat.etc1a4; break;

                    default: Debug.WriteLine("NLP Model: Unknown Texture format 0x" + format.ToString("X8")); break;
                    }

                    string name   = Path.GetFileNameWithoutExtension(textureName);
                    byte[] buffer = File.ReadAllBytes(fullTextureName);
                    if (mipmap > 1)
                    {
                        int lenght  = 0;
                        var texture = (fmt == RenderBase.OTextureFormat.etc1 || fmt == RenderBase.OTextureFormat.etc1a4?
                                       TextureCodec.decode(buffer, width, height, fmt, out lenght) :
                                       TextureCodec.getIMG(buffer, width, height, fmt, out lenght));
                        List <Bitmap> miptextures = new List <Bitmap>();
                        int           lenghtall   = lenght;
                        for (var i = 1; i < mipmap; i++)
                        {
                            var mip = new byte[lenghtall];
                            Buffer.BlockCopy(buffer, lenghtall, mip, 0, buffer.Length - lenghtall);
                            var miptexture = (fmt == RenderBase.OTextureFormat.etc1 || fmt == RenderBase.OTextureFormat.etc1a4 ?
                                              TextureCodec.decode(mip, width / Convert.ToInt32(Math.Pow(2, i)), height / Convert.ToInt32(Math.Pow(2, i)), fmt, out lenght) :
                                              TextureCodec.getIMG(mip, width / Convert.ToInt32(Math.Pow(2, i)), height / Convert.ToInt32(Math.Pow(2, i)), fmt, out lenght));
                            miptextures.Add(miptexture);
                            lenghtall += lenght;
                        }

                        return(new RenderBase.OTexture(texture, miptextures, name));
                    }
                    else
                    {
                        int dataOffset;

                        //TextureCodec.encode(TextureCodec.decode(buffer, width, height, fmt, out dataOffset), fmt);
                        return(new RenderBase.OTexture(TextureCodec.decode(buffer, width, height, fmt, out dataOffset), name));
                    }
                }
            }

            return(null);
        }
Exemple #2
0
        public static byte[] EncodeTexture(string fileName)
        {
            if (File.Exists(fileName))
            {
                if (File.Exists(fileName.Replace(filetype, ".texi.xml")))
                {
                    Serialization.SERI tex = Serialization.getSERI(fileName.Replace(filetype, ".texi.xml"));
                    int    width           = tex.getIntegerParameter("w");
                    int    height          = tex.getIntegerParameter("h");
                    int    mipmap          = tex.getIntegerParameter("mipmap");
                    int    format          = tex.getIntegerParameter("format");
                    string textureName     = tex.getStringParameter("tex");
                    //string fullTextureName = Path.Combine(Path.GetDirectoryName(fileName), textureName);


                    RenderBase.OTextureFormat fmt = RenderBase.OTextureFormat.dontCare;
                    switch (format)
                    {
                    case 0: fmt = RenderBase.OTextureFormat.l4; break;

                    case 1: fmt = RenderBase.OTextureFormat.l8; break;

                    case 3: fmt = RenderBase.OTextureFormat.la8; break;

                    case 7: fmt = RenderBase.OTextureFormat.rgb565; break;

                    case 8: fmt = RenderBase.OTextureFormat.rgba5551; break;

                    case 9: fmt = RenderBase.OTextureFormat.rgba4; break;

                    case 0xa: fmt = RenderBase.OTextureFormat.rgba8; break;

                    case 0xb: fmt = RenderBase.OTextureFormat.rgb8; break;

                    case 0xc: fmt = RenderBase.OTextureFormat.etc1; break;

                    case 0xd: fmt = RenderBase.OTextureFormat.etc1a4; break;

                    default: Debug.WriteLine("NLP Model: Unknown Texture format 0x" + format.ToString("X8")); break;
                    }

                    Stream           imageStreamSource = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
                    PngBitmapDecoder decoder           = new PngBitmapDecoder(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
                    int          frame        = 0; // adjust/ loop for multiframe tiffs
                    BitmapSource bitmapSource = decoder.Frames[0];

                    // this piece works for 8-bit grayscale. Adjust for other formats.
                    Bitmap     img  = new Bitmap(bitmapSource.PixelWidth, bitmapSource.PixelHeight, PixelFormat.Format32bppArgb);
                    BitmapData data = img.LockBits(new Rectangle(System.Drawing.Point.Empty, img.Size), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
                    bitmapSource.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
                    img.UnlockBits(data);

                    IEnumerable <byte> main = TextureCodec.getPixelData(img, fmt);

                    if (mipmap > 1)
                    {
                        for (var i = 1; i < mipmap; i++)
                        {
                            var mimefile = fileName.Replace(filetype, ".mip" + (img.Width / Convert.ToInt32(Math.Pow(2, i))).ToString() + "X" + (img.Height / Convert.ToInt32(Math.Pow(2, i))).ToString() + filetype);
                            if (File.Exists(mimefile))
                            {
                                Bitmap mip = new Bitmap(mimefile);
                                main = main.Concat(TextureCodec.getPixelData(mip, fmt));
                                mip.Dispose();
                            }
                            else
                            {
                                Console.WriteLine(Path.GetFileName(mimefile) + " not found");
                            }
                        }
                    }
                    img.Dispose();
                    return(main.ToArray());
                }
            }

            return(null);
        }