Пример #1
0
            public static CLIM analyze(string path)
            {
                CLIM bclim = new CLIM();

                bclim.FileName  = Path.GetFileNameWithoutExtension(path);
                bclim.FilePath  = Path.GetDirectoryName(path);
                bclim.Extension = Path.GetExtension(path);
                byte[] byteArray = File.ReadAllBytes(path);
                using (BinaryReader br = new BinaryReader(new MemoryStream(byteArray)))
                {
                    br.BaseStream.Seek(br.BaseStream.Length - 0x28, SeekOrigin.Begin);
                    bclim.Magic = br.ReadUInt32();

                    bclim.BOM         = br.ReadUInt16();
                    bclim.CLIMLength  = br.ReadUInt32();
                    bclim.TileWidth   = 2 << br.ReadByte();
                    bclim.TileHeight  = 2 << br.ReadByte();
                    bclim.totalLength = br.ReadUInt32();
                    bclim.Count       = br.ReadUInt32();

                    bclim.imag       = br.ReadChars(4);
                    bclim.imagLength = br.ReadUInt32();
                    bclim.Width      = br.ReadUInt16();
                    bclim.Height     = br.ReadUInt16();
                    bclim.FileFormat = br.ReadInt32();
                    bclim.dataLength = br.ReadUInt32();

                    bclim.BaseSize = Math.Max(nlpo2(bclim.Width), nlpo2(bclim.Height));

                    br.BaseStream.Seek(0, SeekOrigin.Begin);
                    bclim.Data = br.ReadBytes((int)bclim.dataLength);

                    return(bclim);
                }
            }
Пример #2
0
        public override void Render(CLYT Layout, CLIM[] Textures, int InfluenceAlpha)
        {
            Gl.glPushMatrix();
            {
                SetupMaterial(Layout, MaterialId);
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glTranslatef(Translation.X, Translation.Y, Translation.Z);
                Gl.glRotatef(Rotation.X, 1, 0, 0);
                Gl.glRotatef(Rotation.Y, 0, 1, 0);
                Gl.glRotatef(Rotation.Z, 0, 0, 1);
                Gl.glScalef(Scale.X, Scale.Y, 1);
                Gl.glPushMatrix();
                {
                    Gl.glTranslatef(-0.5f * Size.X * (float)HAlignment, -0.5f * Size.Y * (-(float)VAlignment), 0);
                    float[,] Vertex2 = SetupRect();
                    float[][] VtxColor = SetupVtxColors(InfluenceAlpha);
                    Gl.glBegin(Gl.GL_QUADS);

                    /*for (int o = 0; o < TexCoordEntries.Length; o++)
                    {
                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0 + o,
                            TexCoordEntries[o].TexCoordLT.X, TexCoordEntries[o].TexCoordLT.Y);
                    }
                    if (TexCoordEntries.Length == 0)*/ Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                    Gl.glColor4f(VtxColor[0][0], VtxColor[0][1], VtxColor[0][2], VtxColor[0][3]);
                    Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);
                    /*for (int o = 0; o < TexCoordEntries.Length; o++)
                    {
                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0 + o,
                            TexCoordEntries[o].TexCoordRT.X, TexCoordEntries[o].TexCoordRT.Y);
                    }
                    if (TexCoordEntries.Length == 0)*/ Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, 0);
                    Gl.glColor4f(VtxColor[1][0], VtxColor[1][1], VtxColor[1][2], VtxColor[1][3]);
                    Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);
                    /*for (int o = 0; o < TexCoordEntries.Length; o++)
                    {
                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0 + o,
                            TexCoordEntries[o].TexCoordRB.X, TexCoordEntries[o].TexCoordRB.Y);
                    }
                    if (TexCoordEntries.Length == 0)*/ Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, 1);
                    Gl.glColor4f(VtxColor[2][0], VtxColor[2][1], VtxColor[2][2], VtxColor[2][3]);
                    Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);
                    /*for (int o = 0; o < TexCoordEntries.Length; o++)
                    {
                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0 + o,
                            TexCoordEntries[o].TexCoordLB.X, TexCoordEntries[o].TexCoordLB.Y);
                    }
                    if (TexCoordEntries.Length == 0)*/Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 1);
                    Gl.glColor4f(VtxColor[3][0], VtxColor[3][1], VtxColor[3][2], VtxColor[3][3]);
                    Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                    Gl.glEnd();
                }
                Gl.glPopMatrix();
                foreach (pan1 p in Children)
                {
                    p.Render(Layout, Textures, InfluencedAlpha ? (int)((float)(Alpha * InfluenceAlpha) / 255f) : Alpha);
                }
            }
            Gl.glPopMatrix();
        }
Пример #3
0
        internal static Bitmap getIMG_XY7(CLIM bclim)
        {
            Bitmap img = new Bitmap(bclim.BaseSize, bclim.BaseSize);

            using (Stream BitmapStream = new MemoryStream(bclim.Data))
                using (BinaryReader br = new BinaryReader(BitmapStream))
                {
                    // Fetch Color stuff.
                    if (br.ReadUInt16() != 2)
                    {
                        return(null);
                    }
                    ushort  colors = br.ReadUInt16();
                    Color[] ca     = new Color[colors];
                    for (int i = 0; i < colors; i++)
                    {
                        ca[i] = DecodeColor(br.ReadUInt16(), 7);
                    }

                    // Coordinates
                    // Colors
                    // Tiles Per Width
                    int p = gcm(img.Width, 8) / 8;
                    if (p == 0)
                    {
                        p = 1;
                    }

                    for (uint i = 0; i < bclim.BaseSize * bclim.BaseSize; i++) // for every pixel
                    {
                        uint x;
                        uint y;
                        d2xy(i % 64, out x, out y);
                        uint tile = i / 64;

                        // Shift Tile Coordinate into Tilemap
                        x += (uint)(tile % p) * 8;
                        y += (uint)(tile / p) * 8;

                        byte val = br.ReadByte();
                        if (colors <= 0x10) // Handle 2 pixels at a time
                        {
                            img.SetPixel((int)x, (int)y, ca[val >> 4]);
                            x++; i++; val &= 0xF;
                            img.SetPixel((int)x, (int)y, ca[val]);
                        }
                        else //1bpp instead of .5, handle 2 pixels at a time the same way for no reason
                        {
                            img.SetPixel((int)x, (int)y, ca[val]);
                            x++; i++; val = br.ReadByte();
                            img.SetPixel((int)x, (int)y, ca[val]);
                        }
                    }
                }
            return(img);
        }
Пример #4
0
        private void UploadTex(mat1.MaterialEntry.TexMap TexMap, CLIM Texture, int Id)
        {
            GL.BindTexture(TextureTarget.Texture2D, Id);
            GL.Color3(1, 1, 1);
            Bitmap b = Texture.ToBitmap();
            //b.RotateFlip(RotateFlipType.RotateNoneFlipY);
            BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, b.Width, b.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, d.Scan0);
            b.UnlockBits(d);

            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (TexMap.MagFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? (int)TextureMagFilter.Linear : (int)TextureMagFilter.Nearest);
            GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (TexMap.MinFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? (int)TextureMinFilter.Linear : (int)TextureMinFilter.Nearest);

            switch (TexMap.WrapS)
            {
            case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToEdge);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.MirroredRepeat);
                break;

            default:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat);
                break;
            }

            switch (TexMap.WrapT)
            {
            case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToEdge);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.MirroredRepeat);
                break;

            default:
                GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat);
                break;
            }
        }
Пример #5
0
        private void UploadTex(mat1.MaterialEntry.TexMap TexMap, CLIM Texture, int Id)
        {
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
            Gl.glColor3f(1, 1, 1);
            Bitmap b = Texture.ToBitmap();
            //b.RotateFlip(RotateFlipType.RotateNoneFlipY);
            BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, b.Width, b.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, d.Scan0);
            b.UnlockBits(d);

            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, (TexMap.MagFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? Gl.GL_LINEAR : Gl.GL_NEAREST);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, (TexMap.MinFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? Gl.GL_LINEAR : Gl.GL_NEAREST);

            switch (TexMap.WrapS)
            {
            case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT);
                break;

            default:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
                break;
            }

            switch (TexMap.WrapT)
            {
            case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
                break;

            case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT);
                break;

            default:
                Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
                break;
            }
        }
Пример #6
0
        public static CLIM analyze(byte[] data, string shortPath)
        {
            CLIM bclim = new CLIM
            {
                FileName  = Path.GetFileNameWithoutExtension(shortPath),
                FilePath  = Path.GetDirectoryName(shortPath),
                Extension = Path.GetExtension(shortPath)
            };

            byte[] byteArray = data;
            using (BinaryReader br = new BinaryReader(new MemoryStream(byteArray)))
            {
                br.BaseStream.Seek(br.BaseStream.Length - 0x28, SeekOrigin.Begin);
                bclim.Magic = br.ReadUInt32();

                bclim.BOM         = br.ReadUInt16();
                bclim.CLIMLength  = br.ReadUInt16();
                bclim.Align       = br.ReadUInt16();
                bclim.totalLength = br.ReadUInt32();
                bclim.Count       = br.ReadUInt32();

                bclim.imag       = br.ReadChars(4);
                bclim.imagLength = br.ReadUInt32();
                bclim.Width      = br.ReadUInt16();
                bclim.Height     = br.ReadUInt16();
                if (bclim.Magic == 0x4D494C46)
                {
                    bclim.Align         = br.ReadUInt16();
                    bclim.FileFormat    = br.ReadByte();
                    bclim.SwizzleFormat = br.ReadByte();
                }
                else
                {
                    bclim.FileFormat = br.ReadInt32();
                }
                bclim.dataLength = br.ReadUInt32();

                bclim.BaseSize = Math.Max(nlpo2(bclim.Width), nlpo2(bclim.Height));

                br.BaseStream.Seek(0, SeekOrigin.Begin);
                bclim.Data = br.ReadBytes((int)bclim.dataLength);

                return(bclim);
            }
        }
Пример #7
0
        public static CLIM analyze(string path)
        {
            CLIM bclim = new CLIM
            {
                FileName = Path.GetFileNameWithoutExtension(path),
                FilePath = Path.GetDirectoryName(path),
                Extension = Path.GetExtension(path)
            };
            byte[] byteArray = File.ReadAllBytes(path);
            using (BinaryReader br = new BinaryReader(new MemoryStream(byteArray)))
            {
                br.BaseStream.Seek(br.BaseStream.Length - 0x28, SeekOrigin.Begin);
                bclim.Magic = br.ReadUInt32();

                bclim.BOM = br.ReadUInt16();
                bclim.CLIMLength = br.ReadUInt32();
                bclim.TileWidth = 2 << br.ReadByte();
                bclim.TileHeight = 2 << br.ReadByte();
                bclim.totalLength = br.ReadUInt32();
                bclim.Count = br.ReadUInt32();

                bclim.imag = br.ReadChars(4);
                bclim.imagLength = br.ReadUInt32();
                bclim.Width = br.ReadUInt16();
                bclim.Height = br.ReadUInt16();
                bclim.FileFormat = br.ReadInt32();
                bclim.dataLength = br.ReadUInt32();

                bclim.BaseSize = Math.Max(nlpo2(bclim.Width), nlpo2(bclim.Height));

                br.BaseStream.Seek(0, SeekOrigin.Begin);
                bclim.Data = br.ReadBytes((int)bclim.dataLength);

                return bclim;
            }
        }
Пример #8
0
        internal static Bitmap getIMG(CLIM bclim)
        {
            if (bclim.FileFormat == 7 && BitConverter.ToUInt16(bclim.Data, 0) == 2) // XY7
            {
                return(getIMG_XY7(bclim));
            }
            if (bclim.FileFormat == 10 || bclim.FileFormat == 11) // Use ETC1 to get image instead.
            {
                return(getIMG_ETC(bclim));
            }
            // New Image
            int w    = nlpo2(gcm(bclim.Width, 8));
            int h    = nlpo2(gcm(bclim.Height, 8));
            int f    = bclim.FileFormat;
            int area = w * h;

            if (f == 9 && area > bclim.Data.Length / 4)
            {
                w = gcm(bclim.Width, 8);
                h = gcm(bclim.Height, 8);
            }
            // Build Image
            return(getIMG(w, h, bclim.Data, f));
        }
Пример #9
0
        internal static Bitmap getIMG_ETC(CLIM bclim)
        {
            Bitmap img     = new Bitmap(Math.Max(nlpo2(bclim.Width), 16), Math.Max(nlpo2(bclim.Height), 16));
            string dllpath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\ETC1Lib.dll";

            if (!File.Exists(dllpath))
            {
                File.WriteAllBytes(dllpath, Resources.ETC1Lib);
            }

            try
            {
                /* http://jul.rustedlogic.net/thread.php?id=17312
                 * Much of this code is taken/modified from Tharsis. Thank you to Tharsis's creator, xdaniel.
                 * https://github.com/xdanieldzd/Tharsis
                 */

                /* Get compressed data & handle to it */
                byte[] textureData = bclim.Data;
                //textureData = switchEndianness(textureData, 0x10);
                ushort[] input = new ushort[textureData.Length / sizeof(ushort)];
                Buffer.BlockCopy(textureData, 0, input, 0, textureData.Length);
                GCHandle pInput = GCHandle.Alloc(input, GCHandleType.Pinned);

                /* Marshal data around, invoke ETC1.dll for conversion, etc */
                UInt32 size1 = 0;
                UInt16 w = (ushort)img.Width, h = (ushort)img.Height;

                ETC1.ConvertETC1(IntPtr.Zero, ref size1, IntPtr.Zero, w, h, bclim.FileFormat == 0xB); // true = etc1a4, false = etc1
                // System.Diagnostics.Debug.WriteLine(size1);
                uint[]   output  = new uint[size1];
                GCHandle pOutput = GCHandle.Alloc(output, GCHandleType.Pinned);
                ETC1.ConvertETC1(pOutput.AddrOfPinnedObject(), ref size1, pInput.AddrOfPinnedObject(), w, h, bclim.FileFormat == 0xB);
                pOutput.Free();
                pInput.Free();


                /* Unscramble if needed // could probably be done in ETC1Lib.dll, it's probably pretty ugly, but whatever... */
                /* Non-square code blocks could need some cleanup, verification, etc. as well... */
                uint[] finalized = new uint[output.Length];

                // Act if it's square because BCLIM swizzling is stupid
                Buffer.BlockCopy(output, 0, finalized, 0, finalized.Length);

                byte[] tmp = new byte[finalized.Length];
                Buffer.BlockCopy(finalized, 0, tmp, 0, tmp.Length);
                byte[] imgData = tmp;

                for (int i = 0; i < w; i++)
                {
                    for (int j = 0; j < h; j++)
                    {
                        int k = (j + i * img.Height) * 4;
                        img.SetPixel(i, j, Color.FromArgb(imgData[k + 3], imgData[k], imgData[k + 1], imgData[k + 2]));
                    }
                }
                // Image is 13  instead of 12
                //          24             34
                img.RotateFlip(RotateFlipType.Rotate90FlipX);
                if (w > h)
                {
                    // Image is now in appropriate order, but the shifting is messed up. Let's fix that.
                    Bitmap img2 = new Bitmap(Math.Max(nlpo2(bclim.Width), 16), Math.Max(nlpo2(bclim.Height), 16));
                    for (int y = 0; y < Math.Max(nlpo2(bclim.Width), 16); y += 8)
                    {
                        for (int x = 0; x < Math.Max(nlpo2(bclim.Height), 16); x++)
                        {
                            for (int j = 0; j < 8; j++)
                            // Treat every 8 vertical pixels as 1 pixel for purposes of calculation, add to offset later.
                            {
                                int x1 = (x + ((y / 8) * h)) % img2.Width;         // Reshift x
                                int y1 = ((x + ((y / 8) * h)) / img2.Width) * 8;   // Reshift y
                                img2.SetPixel(x1, y1 + j, img.GetPixel(x, y + j)); // Reswizzle
                            }
                        }
                    }
                    img = img2;
                }
                else if (h > w)
                {
                    Bitmap img2 = new Bitmap(Math.Max(nlpo2(bclim.Width), 16), Math.Max(nlpo2(bclim.Height), 16));
                    for (int y = 0; y < Math.Max(nlpo2(bclim.Width), 16); y += 8)
                    {
                        for (int x = 0; x < Math.Max(nlpo2(bclim.Height), 16); x++)
                        {
                            for (int j = 0; j < 8; j++)
                            // Treat every 8 vertical pixels as 1 pixel for purposes of calculation, add to offset later.
                            {
                                int x1 = x % img2.Width;                           // Reshift x
                                int y1 = ((x + ((y / 8) * h)) / img2.Width) * 8;   // Reshift y
                                img2.SetPixel(x1, y1 + j, img.GetPixel(x, y + j)); // Reswizzle
                            }
                        }
                    }
                    img = img2;
                }
            }
            catch { }
            return(img);
        }
Пример #10
0
        internal static Bitmap getIMG_XY7(CLIM bclim)
        {
            Bitmap img = new Bitmap(bclim.BaseSize, bclim.BaseSize);
            using (Stream BitmapStream = new MemoryStream(bclim.Data))
            using (BinaryReader br = new BinaryReader(BitmapStream))
            {
                // Fetch Color stuff.
                if (br.ReadUInt16() != 2) return null;
                ushort colors = br.ReadUInt16();
                Color[] ca = new Color[colors];
                for (int i = 0; i < colors; i++)
                    ca[i] = DecodeColor(br.ReadUInt16(), 7);

                // Coordinates
                // Colors
                // Tiles Per Width
                int p = gcm(img.Width, 8) / 8;
                if (p == 0) p = 1;

                for (uint i = 0; i < bclim.BaseSize * bclim.BaseSize; i++) // for every pixel
                {
                    uint x;
                    uint y;
                    d2xy(i % 64, out x, out y);
                    uint tile = i / 64;

                    // Shift Tile Coordinate into Tilemap
                    x += (uint)(tile % p) * 8;
                    y += (uint)(tile / p) * 8;

                    byte val = br.ReadByte();
                    if (colors <= 0x10) // Handle 2 pixels at a time
                    {
                        img.SetPixel((int)x, (int)y, ca[val >> 4]);
                        x++; i++; val &= 0xF;
                        img.SetPixel((int)x, (int)y, ca[val]);
                    }
                    else //1bpp instead of .5, handle 2 pixels at a time the same way for no reason
                    {
                        img.SetPixel((int)x, (int)y, ca[val]);
                        x++; i++; val = br.ReadByte();
                        img.SetPixel((int)x, (int)y, ca[val]);
                    }
                }
            }
            return img;
        }
Пример #11
0
        internal static Bitmap getIMG_ETC(CLIM bclim)
        {
            Bitmap img = new Bitmap(Math.Max(nlpo2(bclim.Width), 16), Math.Max(nlpo2(bclim.Height), 16));
            string dllpath = Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location) + "\\ETC1Lib.dll";
            if (!File.Exists(dllpath)) File.WriteAllBytes(dllpath, Resources.ETC1Lib);

            try
            {
                /* http://jul.rustedlogic.net/thread.php?id=17312
                 * Much of this code is taken/modified from Tharsis. Thank you to Tharsis's creator, xdaniel.
                 * https://github.com/xdanieldzd/Tharsis
                 */

                /* Get compressed data & handle to it */
                byte[] textureData = bclim.Data;
                //textureData = switchEndianness(textureData, 0x10);
                ushort[] input = new ushort[textureData.Length/sizeof (ushort)];
                Buffer.BlockCopy(textureData, 0, input, 0, textureData.Length);
                GCHandle pInput = GCHandle.Alloc(input, GCHandleType.Pinned);

                /* Marshal data around, invoke ETC1.dll for conversion, etc */
                UInt32 size1 = 0;
                UInt16 w = (ushort)img.Width, h = (ushort)img.Height;

                ETC1.ConvertETC1(IntPtr.Zero, ref size1, IntPtr.Zero, w, h, bclim.FileFormat == 0xB); // true = etc1a4, false = etc1
                // System.Diagnostics.Debug.WriteLine(size1);
                uint[] output = new uint[size1];
                GCHandle pOutput = GCHandle.Alloc(output, GCHandleType.Pinned);
                ETC1.ConvertETC1(pOutput.AddrOfPinnedObject(), ref size1, pInput.AddrOfPinnedObject(), w, h, bclim.FileFormat == 0xB);
                pOutput.Free();
                pInput.Free();

                /* Unscramble if needed // could probably be done in ETC1Lib.dll, it's probably pretty ugly, but whatever... */
                /* Non-square code blocks could need some cleanup, verification, etc. as well... */
                uint[] finalized = new uint[output.Length];

                // Act if it's square because BCLIM swizzling is stupid
                Buffer.BlockCopy(output, 0, finalized, 0, finalized.Length);

                byte[] tmp = new byte[finalized.Length];
                Buffer.BlockCopy(finalized, 0, tmp, 0, tmp.Length);
                byte[] imgData = tmp;

                for (int i = 0; i < w; i++)
                {
                    for (int j = 0; j < h; j++)
                    {
                        int k = (j + i*img.Height)*4;
                        img.SetPixel(i, j, Color.FromArgb(imgData[k + 3], imgData[k], imgData[k + 1], imgData[k + 2]));
                    }
                }
                // Image is 13  instead of 12
                //          24             34
                img.RotateFlip(RotateFlipType.Rotate90FlipX);
                if (w > h)
                {
                    // Image is now in appropriate order, but the shifting is messed up. Let's fix that.
                    Bitmap img2 = new Bitmap(Math.Max(nlpo2(bclim.Width), 16), Math.Max(nlpo2(bclim.Height), 16));
                    for (int y = 0; y < Math.Max(nlpo2(bclim.Width), 16); y += 8)
                    {
                        for (int x = 0; x < Math.Max(nlpo2(bclim.Height), 16); x++)
                        {
                            for (int j = 0; j < 8; j++)
                                // Treat every 8 vertical pixels as 1 pixel for purposes of calculation, add to offset later.
                            {
                                int x1 = (x + ((y/8)*h))%img2.Width; // Reshift x
                                int y1 = ((x + ((y/8)*h))/img2.Width)*8; // Reshift y
                                img2.SetPixel(x1, y1 + j, img.GetPixel(x, y + j)); // Reswizzle
                            }
                        }
                    }
                    img = img2;
                }
                else if (h > w)
                {
                    Bitmap img2 = new Bitmap(Math.Max(nlpo2(bclim.Width), 16), Math.Max(nlpo2(bclim.Height), 16));
                    for (int y = 0; y < Math.Max(nlpo2(bclim.Width), 16); y += 8)
                    {
                        for (int x = 0; x < Math.Max(nlpo2(bclim.Height), 16); x++)
                        {
                            for (int j = 0; j < 8; j++)
                                // Treat every 8 vertical pixels as 1 pixel for purposes of calculation, add to offset later.
                            {
                                int x1 = x%img2.Width; // Reshift x
                                int y1 = ((x + ((y/8)*h))/img2.Width)*8; // Reshift y
                                img2.SetPixel(x1, y1 + j, img.GetPixel(x, y + j)); // Reswizzle
                            }
                        }
                    }
                    img = img2;
                }
            }
            catch { }
            return img;
        }
Пример #12
0
 internal static Bitmap getIMG(CLIM bclim)
 {
     if (bclim.FileFormat == 7 && BitConverter.ToUInt16(bclim.Data, 0) == 2) // XY7
         return getIMG_XY7(bclim);
     if (bclim.FileFormat == 10 || bclim.FileFormat == 11) // Use ETC1 to get image instead.
         return getIMG_ETC(bclim);
     // New Image
     int w = nlpo2(gcm(bclim.Width, 8));
     int h = nlpo2(gcm(bclim.Height, 8));
     int f = bclim.FileFormat;
     int area = w * h;
     if (f == 9 && area > bclim.Data.Length / 4)
     {
         w = gcm(bclim.Width, 8);
         h = gcm(bclim.Height, 8);
     }
     // Build Image
     return getIMG(w, h, bclim.Data, f);
 }
Пример #13
0
 public CLIMViewer(CLIM Image)
 {
     this.Image = Image;
     InitializeComponent();
 }
Пример #14
0
        private void CLYTViewer_Load(object sender, EventArgs e)
        {
            simpleOpenGlControl1.InitializeContexts();
            simpleOpenGlControl1.Width  = (int)NWLayout.Layout.LayoutSize.X;
            simpleOpenGlControl1.Height = (int)NWLayout.Layout.LayoutSize.Y;
            Gl.ReloadFunctions();
            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
            Gl.glDisable(Gl.GL_DEPTH_TEST);
            //Gl.glDepthFunc(Gl.GL_ALWAYS);
            Gl.glEnable(Gl.GL_LOGIC_OP);
            Gl.glDisable(Gl.GL_CULL_FACE);
            Gl.glEnable(Gl.GL_TEXTURE_2D);

            //Gl.glEnable(Gl.GL_LINE_SMOOTH);
            Gl.glEnable(Gl.GL_BLEND);

            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);

            if (NWLayout.TextureList != null)
            {
                int i = 0;
                Textures = new CLIM[NWLayout.TextureList.NrTextures];
                foreach (String s in NWLayout.TextureList.TextureNames)
                {
                    byte[] data = data = ((ViewableFile)Tag).File.FindFileRelative("../timg/" + s);
                    if (data == null)
                    {
                        data = ((ViewableFile)Tag).File.FindFileRelative(s);
                    }
                    if (data != null)
                    {
                        Textures[i] = new CLIM(data);
                    }
                    i++;
                }
            }
            if (NWLayout.Materials != null)
            {
                int i = 0;
                foreach (var v in NWLayout.Materials.Materials)
                {
                    int j = 0;
                    foreach (var t in v.TexMaps)
                    {
                        if (Textures[t.TexIndex] != null)
                        {
                            UploadTex(t, Textures[t.TexIndex], i * 4 + j + 1);
                        }
                        j++;
                    }
                    v.SetupShader();
                    i++;
                }
            }
            BShader.Compile(false);

            ImageL            = new ImageList();
            ImageL.ColorDepth = ColorDepth.Depth32Bit;
            ImageL.ImageSize  = new System.Drawing.Size(16, 16);
            ImageL.Images.Add("pan1", Resource.zone16);
            ImageL.Images.Add("pic1", Resource.image16);
            ImageL.Images.Add("wnd1", Resource.slide);
            ImageL.Images.Add("txt1", Resource.edit);
            ImageL.Images.Add("grp1", Resource.zones_stack);
            ImageL.Images.Add(Resource.t_shirt);
            ImageL.Images.Add(Resource.image_sunset);
            ImageL.Images.Add(Resource.edit_language);
            treeView1.ImageList = ImageL;
            treeView2.ImageList = ImageL;
            treeView3.ImageList = ImageL;
            treeView4.ImageList = ImageL;
            treeView5.ImageList = ImageL;

            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(NWLayout.RootPane.GetTreeNodes());
            treeView1.EndUpdate();

            treeView2.BeginUpdate();
            treeView2.Nodes.Clear();
            treeView2.Nodes.Add(NWLayout.RootGroup.GetTreeNodes());
            treeView2.EndUpdate();

            if (NWLayout.Materials != null)
            {
                treeView3.BeginUpdate();
                treeView3.Nodes.Clear();
                foreach (var v in NWLayout.Materials.Materials)
                {
                    treeView3.Nodes.Add(new TreeNode(v.Name, 5, 5));
                }
                treeView3.EndUpdate();
            }

            int q = 0;

            if (NWLayout.TextureList != null)
            {
                treeView4.BeginUpdate();
                treeView4.Nodes.Clear();
                foreach (var v in NWLayout.TextureList.TextureNames)
                {
                    treeView4.Nodes.Add(new TreeNode(v, 6, 6)
                    {
                        ForeColor = (Textures[q] == null) ? Color.Red : Color.Black
                    });
                }
                treeView4.EndUpdate();
                q++;
            }

            if (NWLayout.FontList != null)
            {
                treeView5.BeginUpdate();
                treeView5.Nodes.Clear();
                foreach (var v in NWLayout.FontList.FontNames)
                {
                    treeView5.Nodes.Add(new TreeNode(v, 7, 7));
                }
                treeView5.EndUpdate();
            }


            init = true;
            Render();
        }
Пример #15
0
        private Bitmap getIMG_XY7(CLIM bclim)
        {
            Bitmap img = new Bitmap(bclim.BaseSize, bclim.BaseSize);

            using (Stream BitmapStream = new MemoryStream(bclim.Data))
                using (BinaryReader br = new BinaryReader(BitmapStream))
                {
                    int f = bclim.FileFormat;

                    // Fetch Color stuff.
                    ushort  first2 = br.ReadUInt16();
                    ushort  colors = br.ReadUInt16();
                    Color[] ca     = new Color[colors];
                    for (int i = 0; i < colors; i++)
                    {
                        ca[i] = DecodeColor(br.ReadUInt16(), 7);
                    }

                    // Coordinates
                    uint x, y = 0;
                    // Colors
                    Color c = new Color();
                    // Tiles Per Width
                    int p = gcm(img.Width, 8) / 8;
                    if (p == 0)
                    {
                        p = 1;
                    }

                    for (uint i = 0; i < bclim.BaseSize * bclim.BaseSize; i++) // for every pixel
                    {
                        d2xy(i % 64, out x, out y);
                        uint tile = i / 64;

                        // Shift Tile Coordinate into Tilemap
                        x += (uint)(tile % p) * 8;
                        y += (uint)(tile / p) * 8;

                        byte val = br.ReadByte();
                        if (colors <= 0x10) // Handle 2 pixels at a time
                        {
                            c = ca[val & 0xF];
                            img.SetPixel((int)x, (int)y, ca[val >> 4]);
                            x++; i++; val &= 0xF;
                            img.SetPixel((int)x, (int)y, ca[val]);
                        }
                        else //1bpp instead of .5, handle 2 pixels at a time the same way for no reason
                        {
                            c = ca[val];
                            img.SetPixel((int)x, (int)y, ca[val]);
                            x++; i++; val = br.ReadByte();
                            img.SetPixel((int)x, (int)y, ca[val]);
                        }
                    }
                    // Palette Box
                    Bitmap palette = new Bitmap(ca.Length * 8, 8, PixelFormat.Format32bppArgb);
                    for (int i = 0; i < ca.Length * 8; i++)
                    {
                        for (int j = 0; j < 8; j++)
                        {
                            palette.SetPixel(i, j, ca[i / 8]);
                        }
                    }
                    PaletteBox.Image       = palette; PaletteBox.Visible = true;
                    PaletteBox.Width       = 2 + 8 * ca.Length;
                    PaletteBox.Height      = 2 + 8;
                    PaletteBox.BorderStyle = BorderStyle.FixedSingle;
                }
            return(img);
        }
Пример #16
0
        public override void Render(CLYT Layout, CLIM[] Textures, int InfluenceAlpha)
        {
            Gl.glPushMatrix();
            {
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glTranslatef(Translation.X, Translation.Y, Translation.Z);
                Gl.glRotatef(Rotation.X, 1, 0, 0);
                Gl.glRotatef(Rotation.Y, 0, 1, 0);
                Gl.glRotatef(Rotation.Z, 0, 0, 1);
                Gl.glScalef(Scale.X, Scale.Y, 1);
                Gl.glPushMatrix();
                {
                    //Translate to origin
                    Gl.glTranslatef(-0.5f * Size.X * (float)HAlignment, -0.5f * Size.Y * (-(float)VAlignment), 0);
                    switch (Kind)
                    {
                        case WindowKind.Around:
                            if (NrFrames == 1)//1 texture for all
                            {
                                mat1.MaterialEntry m = Layout.Materials.Materials[WindowFrames[0].MaterialId];
                                if (m.TexMaps.Length == 0) RenderContent(Layout, InfluenceAlpha, Size.X, Size.Y);
                                else
                                {
                                    var t = Textures[m.TexMaps[0].TexIndex];
                                    if (t == null) break;
                                    Gl.glPushMatrix();
                                    {
                                        Gl.glTranslatef(t.Image.Width, -t.Image.Height, 0);
                                        RenderContent(Layout, InfluenceAlpha, Size.X - t.Image.Width * 2, Size.Y - t.Image.Height * 2);
                                    }
                                    Gl.glPopMatrix();
                                    // _________
                                    //|______|  |
                                    //|  |   |  |
                                    //|  |___|__|
                                    //|__|______|
                                    //Top Left
                                    SetupMaterial(Layout, WindowFrames[0].MaterialId);
                                    float[,] Vertex2 = SetupRect(Size.X - t.Image.Width, t.Image.Height);
                                    Gl.glBegin(Gl.GL_QUADS);
                                    Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                    Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t.Image.Width) / t.Image.Width, 0);
                                    Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t.Image.Width) / t.Image.Width, 1);
                                    Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 1);
                                    Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                    Gl.glEnd();
                                    //Top Right
                                    Gl.glPushMatrix();
                                    {
                                        Gl.glTranslatef(Size.X - t.Image.Width, 0, 0);
                                        Vertex2 = SetupRect(t.Image.Width, Size.Y - t.Image.Height);
                                        Gl.glBegin(Gl.GL_QUADS);
                                        Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, 0);
                                        Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                        Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, (Size.Y - t.Image.Height) / t.Image.Height);
                                        Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, (Size.Y - t.Image.Height) / t.Image.Height);
                                        Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                        Gl.glEnd();
                                    }
                                    Gl.glPopMatrix();
                                    //Bottom Right
                                    Gl.glPushMatrix();
                                    {
                                        Gl.glTranslatef(t.Image.Width, -(Size.Y - t.Image.Height), 0);
                                        Vertex2 = SetupRect(Size.X - t.Image.Width, t.Image.Height);
                                        Gl.glBegin(Gl.GL_QUADS);
                                        Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t.Image.Width) / t.Image.Width, 1);
                                        Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 1);
                                        Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                        Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t.Image.Width) / t.Image.Width, 0);
                                        Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                        Gl.glEnd();
                                    }
                                    Gl.glPopMatrix();
                                    //Bottom Left
                                    Gl.glPushMatrix();
                                    {
                                        Gl.glTranslatef(0, -t.Image.Height, 0);
                                        Vertex2 = SetupRect(t.Image.Width, Size.Y - t.Image.Height);
                                        Gl.glBegin(Gl.GL_QUADS);
                                        Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, (Size.Y - t.Image.Height) / t.Image.Height);
                                        Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, (Size.Y - t.Image.Height) / t.Image.Height);
                                        Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, 0);
                                        Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                        Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                        Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                        Gl.glEnd();
                                    }
                                    Gl.glPopMatrix();
                                }
                            }
                            else if (NrFrames == 4)//Corners
                            {
                                var t1 = Textures[Layout.Materials.Materials[WindowFrames[0].MaterialId].TexMaps[0].TexIndex];
                                var t2 = Textures[Layout.Materials.Materials[WindowFrames[1].MaterialId].TexMaps[0].TexIndex];
                                var t3 = Textures[Layout.Materials.Materials[WindowFrames[2].MaterialId].TexMaps[0].TexIndex];
                                var t4 = Textures[Layout.Materials.Materials[WindowFrames[3].MaterialId].TexMaps[0].TexIndex];
                                if (t1 == null || t2 == null || t3 == null || t4 == null) break;
                                Gl.glPushMatrix();
                                {
                                    Gl.glTranslatef(t4.Image.Width, -t1.Image.Height, 0);
                                    RenderContent(Layout, InfluenceAlpha, Size.X - (t4.Image.Width + t2.Image.Width), Size.Y - (t1.Image.Height + t3.Image.Height));
                                }
                                Gl.glPopMatrix();
                                // _________
                                //|______|  |
                                //|  |   |  |
                                //|  |___|__|
                                //|__|______|
                                //Top Left
                                SetupMaterial(Layout, WindowFrames[0].MaterialId);
                                float[,] Vertex2 = SetupRect(Size.X - t2.Image.Width, t1.Image.Height);
                                Gl.glBegin(Gl.GL_QUADS);
                                Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t2.Image.Width) / t1.Image.Width, 0);
                                Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t2.Image.Width) / t1.Image.Width, 1);
                                Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 1);
                                Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                Gl.glEnd();
                                //Top Right
                                Gl.glPushMatrix();
                                {
                                    Gl.glTranslatef(Size.X - t2.Image.Width, 0, 0);
                                    SetupMaterial(Layout, WindowFrames[1].MaterialId);
                                    Vertex2 = SetupRect(t2.Image.Width, Size.Y - t3.Image.Height);
                                    Gl.glBegin(Gl.GL_QUADS);
                                    Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                    Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, 0);
                                    Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, (Size.Y - t3.Image.Height) / t2.Image.Height);
                                    Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, (Size.Y - t3.Image.Height) / t2.Image.Height);
                                    Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                    Gl.glEnd();
                                }
                                Gl.glPopMatrix();
                                //Bottom Right
                                Gl.glPushMatrix();
                                {
                                    Gl.glTranslatef(t4.Image.Width, -(Size.Y - t3.Image.Height), 0);
                                    SetupMaterial(Layout, WindowFrames[2].MaterialId);
                                    Vertex2 = SetupRect(Size.X - t4.Image.Width, t3.Image.Height);
                                    Gl.glBegin(Gl.GL_QUADS);
                                    Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t2.Image.Width) / t3.Image.Width, 0);
                                    Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 0);
                                    Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 1);
                                    Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, (Size.X - t2.Image.Width) / t3.Image.Width, 1);
                                    Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                    Gl.glEnd();
                                }
                                Gl.glPopMatrix();
                                //Bottom Left
                                Gl.glPushMatrix();
                                {
                                    Gl.glTranslatef(0, -t1.Image.Height, 0);
                                    SetupMaterial(Layout, WindowFrames[3].MaterialId);
                                    Vertex2 = SetupRect(t4.Image.Width, Size.Y - t1.Image.Height);
                                    Gl.glBegin(Gl.GL_QUADS);
                                    Gl.glColor4f(1, 1, 1, (InfluencedAlpha ? (byte)(((float)Alpha * (float)InfluenceAlpha) / 255f) : this.Alpha) / 255f);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, -(Size.Y - t1.Image.Height) / t4.Image.Height);
                                    Gl.glVertex3f(Vertex2[0, 0], Vertex2[0, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, -(Size.Y - t1.Image.Height) / t4.Image.Height);
                                    Gl.glVertex3f(Vertex2[1, 0], Vertex2[1, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 0, 1);
                                    Gl.glVertex3f(Vertex2[2, 0], Vertex2[2, 1], 0);

                                    Gl.glMultiTexCoord2f(Gl.GL_TEXTURE0, 1, 1);
                                    Gl.glVertex3f(Vertex2[3, 0], Vertex2[3, 1], 0);
                                    Gl.glEnd();
                                }
                                Gl.glPopMatrix();
                            }
                            else if (NrFrames == 8)//all
                            {
                                RenderContent(Layout, InfluenceAlpha, Size.X, Size.Y);
                            }
                            else
                            {
                                RenderContent(Layout, InfluenceAlpha, Size.X, Size.Y);
                                //not possible?
                            }
                            break;
                        default:
                            break;
                    }
                }
                Gl.glPopMatrix();
                foreach (pan1 p in Children)
                {
                    p.Render(Layout, Textures, InfluencedAlpha ? (int)((float)(Alpha * InfluenceAlpha) / 255f) : Alpha);
                }
            }
            Gl.glPopMatrix();
        }
Пример #17
0
 public CLIMViewer(CLIM Image)
 {
     this.Image = Image;
     InitializeComponent();
 }
Пример #18
0
            public static CLIM analyze(string path)
            {
                CLIM bclim = new CLIM();
                bclim.FileName = Path.GetFileNameWithoutExtension(path);
                bclim.FilePath = Path.GetDirectoryName(path);
                bclim.Extension = Path.GetExtension(path);
                BinaryReader br = new BinaryReader(System.IO.File.OpenRead(path));
                long len = br.BaseStream.Length;
                int offset = 0;

                bclim.Magic = br.ReadUInt32();   

                if (bclim.Magic == 0x4D494C43)
                {
                    // Header is header.
                    br.BaseStream.Seek(0, SeekOrigin.Begin);
                    offset = 0x28;
                }
                else
                {
                    // Header is footer.
                    br.BaseStream.Seek(len - 0x28, SeekOrigin.Begin);
                    bclim.Magic = br.ReadUInt32();
                }

                bclim.BOM           = br.ReadUInt16();
                bclim.CLIMLength    = br.ReadUInt32();
                bclim.TileWidth     = 2 << br.ReadByte();
                bclim.TileHeight    = 2 << br.ReadByte();
                bclim.totalLength   = br.ReadUInt32();
                bclim.Count = br.ReadUInt32();

                bclim.imag = br.ReadChars(4);
                bclim.imagLength = br.ReadUInt32();
                bclim.Width = br.ReadUInt16();
                bclim.Height = br.ReadUInt16();
                bclim.FileFormat = br.ReadInt32();
                bclim.dataLength = br.ReadUInt32();

                bclim.BaseSize = Math.Max(nlpo2(bclim.Width), nlpo2(bclim.Height));

                br.BaseStream.Seek(offset, SeekOrigin.Begin);
                bclim.Data = br.ReadBytes((int)bclim.dataLength);

                bclim.ColorFormat = getFormat(bclim.FileFormat);

                return bclim;
            }
Пример #19
0
        private void CLYTViewer_Load(object sender, EventArgs e)
        {
            simpleOpenGlControl1.InitializeContexts();
            simpleOpenGlControl1.Width  = (int)NWLayout.Layout.LayoutSize.X;
            simpleOpenGlControl1.Height = (int)NWLayout.Layout.LayoutSize.Y;
            GL.Enable(EnableCap.ColorMaterial);
            GL.Disable(EnableCap.DepthTest);
            //GL.glDepthFunc(GL.GL_ALWAYS);
            GL.Enable(EnableCap.IndexLogicOp);             // From Tao.OpenGL.GL => public const Int32 GL_LOGIC_OP = 0x0BF1; => 3057 => GL_INDEX_LOGIC_OP
            GL.Disable(EnableCap.CullFace);
            GL.Enable(EnableCap.Texture2D);

            //GL.Enable(GL.GL_LINE_SMOOTH);
            GL.Enable(EnableCap.Blend);

            GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);

            if (NWLayout.TextureList != null)
            {
                int i = 0;
                Textures = new CLIM[NWLayout.TextureList.NrTextures];
                foreach (String s in NWLayout.TextureList.TextureNames)
                {
                    byte[] data = data = ((ViewableFile)Tag).File.FindFileRelative("../timg/" + s);
                    if (data == null)
                    {
                        data = ((ViewableFile)Tag).File.FindFileRelative(s);
                    }
                    if (data != null)
                    {
                        Textures[i] = new CLIM(data);
                    }
                    i++;
                }
            }
            if (NWLayout.Materials != null)
            {
                int i = 0;
                foreach (var v in NWLayout.Materials.Materials)
                {
                    int j = 0;
                    foreach (var t in v.TexMaps)
                    {
                        if (Textures[t.TexIndex] != null)
                        {
                            UploadTex(t, Textures[t.TexIndex], i * 4 + j + 1);
                        }
                        j++;
                    }
                    v.SetupShader();
                    i++;
                }
            }
            BShader.Compile(false);

            ImageL            = new ImageList();
            ImageL.ColorDepth = ColorDepth.Depth32Bit;
            ImageL.ImageSize  = new System.Drawing.Size(16, 16);
            ImageL.Images.Add("pan1", Resource.zone16);
            ImageL.Images.Add("pic1", Resource.image16);
            ImageL.Images.Add("wnd1", Resource.slide);
            ImageL.Images.Add("txt1", Resource.edit);
            ImageL.Images.Add("grp1", Resource.zones_stack);
            ImageL.Images.Add(Resource.t_shirt);
            ImageL.Images.Add(Resource.image_sunset);
            ImageL.Images.Add(Resource.edit_language);
            treeView1.ImageList = ImageL;
            treeView2.ImageList = ImageL;
            treeView3.ImageList = ImageL;
            treeView4.ImageList = ImageL;
            treeView5.ImageList = ImageL;

            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(NWLayout.RootPane.GetTreeNodes());
            treeView1.EndUpdate();

            treeView2.BeginUpdate();
            treeView2.Nodes.Clear();
            treeView2.Nodes.Add(NWLayout.RootGroup.GetTreeNodes());
            treeView2.EndUpdate();

            if (NWLayout.Materials != null)
            {
                treeView3.BeginUpdate();
                treeView3.Nodes.Clear();
                foreach (var v in NWLayout.Materials.Materials)
                {
                    treeView3.Nodes.Add(new TreeNode(v.Name, 5, 5));
                }
                treeView3.EndUpdate();
            }

            int q = 0;

            if (NWLayout.TextureList != null)
            {
                treeView4.BeginUpdate();
                treeView4.Nodes.Clear();
                foreach (var v in NWLayout.TextureList.TextureNames)
                {
                    treeView4.Nodes.Add(new TreeNode(v, 6, 6)
                    {
                        ForeColor = (Textures[q] == null) ? Color.Red : Color.Black
                    });
                }
                treeView4.EndUpdate();
                q++;
            }

            if (NWLayout.FontList != null)
            {
                treeView5.BeginUpdate();
                treeView5.Nodes.Clear();
                foreach (var v in NWLayout.FontList.FontNames)
                {
                    treeView5.Nodes.Add(new TreeNode(v, 7, 7));
                }
                treeView5.EndUpdate();
            }


            init = true;
            Render();
        }
Пример #20
0
        // Bitmap Data Writing
        private Bitmap getIMG(CLIM bclim)
        {
            // New Image
            Bitmap img = new Bitmap(nlpo2(gcm(bclim.Width,8)), nlpo2(gcm(bclim.Height,8)));
            int f = bclim.FileFormat;
            int area = img.Width * img.Height;
            if (f == 9 && area > bclim.Data.Length/4)
            {
                img = new Bitmap(gcm(bclim.Width, 8), gcm(bclim.Height, 8));
                area = img.Width * img.Height;
            }
            // Coordinates
            uint x, y = 0;
            // Colors
            Color c = new Color();
            uint val = 0;
            // Tiles Per Width
            int p = gcm(img.Width, 8) / 8;
            if (p == 0) p = 1;

            // Build Image
            using (Stream BitmapStream = new MemoryStream(bclim.Data))
            using (BinaryReader br = new BinaryReader(BitmapStream))
            for (uint i = 0; i < area; i++) // for every pixel
            {
                d2xy(i % 64, out x, out y);
                uint tile = i / 64;

                // Shift Tile Coordinate into Tilemap
                x += (uint)(tile % p) * 8;
                y += (uint)(tile / p) * 8;

                // Get Color
                switch (f)
                {
                    case 0x0:  // L8        // 8bit/1 byte
                    case 0x1:  // A8
                    case 0x2:  // LA4
                        c = DecodeColor(br.ReadByte(), f);
                        break;
                    case 0x3:  // LA8       // 16bit/2 byte
                    case 0x4:  // HILO8
                    case 0x5:  // RGB565
                    case 0x8:  // RGBA4444
                    case 0x7:  // RGBA5551
                        c = DecodeColor(br.ReadUInt16(), f);
                        break;
                    case 0x6:  // RGB8:     // 24bit
                        byte[] data = br.ReadBytes(3); Array.Resize(ref data, 4);
                        c = DecodeColor(BitConverter.ToUInt32(data, 0), f);
                        break;
                    case 0x9:  // RGBA8888
                        c = DecodeColor(br.ReadUInt32(), f);
                        break;
                    case 0xC:  // L4
                    case 0xD:  // A4        // 4bit - Do 2 pixels at a time.
                        val = br.ReadByte();
                        img.SetPixel((int)x, (int)y, DecodeColor(val & 0xF, f)); // lowest bits for the low pixel
                        i++; x++;
                        c = DecodeColor(val >> 4, f);   // highest bits for the high pixel
                        break;
                    case 0xA:  // ETC1
                    case 0xB:  // ETC1A4
                    default: throw new Exception("Invalid FileFormat.");
                }
                img.SetPixel((int)x, (int)y, c);
            }
            return img;
        }
Пример #21
0
        private Bitmap getIMG_XY7(CLIM bclim)
        {
            Bitmap img = new Bitmap(bclim.BaseSize, bclim.BaseSize);
            using (Stream BitmapStream = new MemoryStream(bclim.Data))
            using (BinaryReader br = new BinaryReader(BitmapStream))
            {
                int f = bclim.FileFormat;

                // Fetch Color stuff.
                ushort first2 = br.ReadUInt16();
                ushort colors = br.ReadUInt16();
                Color[] ca = new Color[colors];
                for (int i = 0; i < colors; i++)
                    ca[i] = DecodeColor(br.ReadUInt16(), 7);

                // Coordinates
                uint x, y = 0;
                // Colors
                Color c = new Color();
                // Tiles Per Width
                int p = gcm(img.Width, 8) / 8;
                if (p == 0) p = 1;

                for (uint i = 0; i < bclim.BaseSize * bclim.BaseSize; i++) // for every pixel
                {
                    d2xy(i % 64, out x, out y);
                    uint tile = i / 64;

                    // Shift Tile Coordinate into Tilemap
                    x += (uint)(tile % p) * 8;
                    y += (uint)(tile / p) * 8;

                    byte val = br.ReadByte();
                    if (colors <= 0x10) // Handle 2 pixels at a time
                    {
                        c = ca[val & 0xF];
                        img.SetPixel((int)x, (int)y, ca[val >> 4]);
                        x++; i++; val &= 0xF;
                        img.SetPixel((int)x, (int)y, ca[val]);
                    }
                    else //1bpp instead of .5, handle 2 pixels at a time the same way for no reason
                    {
                        c = ca[val];
                        img.SetPixel((int)x, (int)y, ca[val]);
                        x++; i++; val = br.ReadByte();
                        img.SetPixel((int)x, (int)y, ca[val]);
                    }
                }
                // Palette Box
                Bitmap palette = new Bitmap(ca.Length * 8, 8, PixelFormat.Format32bppArgb);
                for (int i = 0; i < ca.Length * 8; i++)
                {
                    for (int j = 0; j < 8; j++) { palette.SetPixel(i, j, ca[i / 8]); }
                }
                PaletteBox.Image = palette; PaletteBox.Visible = true;
                PaletteBox.Width = 2 + 8 * ca.Length;
                PaletteBox.Height = 2 + 8;
                PaletteBox.BorderStyle = BorderStyle.FixedSingle;
            }
            return img;
        }
Пример #22
0
        internal static Image makeBMP(string path, bool autosave = false, bool crop = true)
        {
            CLIM bclim = analyze(path);

            if (bclim.Magic != 0x4D494C43)
            {
                System.Media.SystemSounds.Beep.Play();
                return(null);
            }

            // Interpret data.
            int f = bclim.FileFormat;

            if (f > 13)
            {
                System.Media.SystemSounds.Exclamation.Play();
                return(null);
            }

            Bitmap img;

            if (f == 7 && BitConverter.ToUInt16(bclim.Data, 0) == 2)
            {
                // PKM XY Format 7 (Color Palette)
                img = getIMG_XY7(bclim);
            }
            else if (f == 10 || f == 11)
            {
                img = getIMG_ETC(bclim);
            }
            else
            {
                img = getIMG(bclim);
            }

            if (img == null)
            {
                return(null);
            }
            Rectangle cropRect = new Rectangle(0, 0, bclim.Width, bclim.Height);
            Bitmap    CropBMP  = new Bitmap(cropRect.Width, cropRect.Height);

            using (Graphics g = Graphics.FromImage(CropBMP))
            {
                g.DrawImage(img,
                            new Rectangle(0, 0, CropBMP.Width, CropBMP.Height),
                            cropRect,
                            GraphicsUnit.Pixel);
            }
            if (!autosave)
            {
                return(!crop ? img : CropBMP);
            }

            using (MemoryStream ms = new MemoryStream())
            {
                //error will throw from here
                CropBMP.Save(ms, ImageFormat.Png);
                byte[] data = ms.ToArray();
                File.WriteAllBytes(bclim.FilePath + "\\" + bclim.FileName + ".png", data);
            }
            return(!crop ? img : CropBMP);
        }
Пример #23
0
        public void makeBMP(string path)
        {
            PaletteBox.Visible = false;
            pictureBox1.Image  = null;
            CLIM bclim = BCLIM.analyze(path);

            if (bclim.Magic != 0x4D494C43)
            {
                System.Media.SystemSounds.Beep.Play();
                return;
            }
            // Label up.
            L_FileFormat.Text = bclim.FileFormat.ToString();
            L_Width.Text      = bclim.Width.ToString();
            L_Height.Text     = bclim.Height.ToString();
            L_TileWidth.Text  = bclim.TileWidth.ToString();
            L_TileHeight.Text = bclim.TileHeight.ToString();
            groupBox2.Visible = true;

            L_FileFormat.Text = bclim.FileFormat.ToString();

            // Interpret data.
            int f = bclim.FileFormat;

            if (f > 13)
            {
                System.Media.SystemSounds.Exclamation.Play();
                return;
            }

            Bitmap img = new Bitmap(1, 1);

            if (f == 7 && BitConverter.ToUInt16(bclim.Data, 0) == 2 && 0 == 0)
            {
                // PKM XY Format 7 (Color Palette)
                img = getIMG_XY7(bclim);
            }
            else if (f == 10 || f == 11)
            {
                img = getIMG_ETC(bclim); // etc1
            }
            else
            {
                img = getIMG(bclim);
            }

            Rectangle cropRect = new Rectangle(0, 0, bclim.Width, bclim.Height);
            Bitmap    CropBMP  = new Bitmap(cropRect.Width, cropRect.Height);

            using (Graphics g = Graphics.FromImage(CropBMP))
            {
                g.DrawImage(img,
                            new Rectangle(0, 0, CropBMP.Width, CropBMP.Height),
                            cropRect,
                            GraphicsUnit.Pixel);
            }
            if (CHK_NoCrop.Checked)
            {
                pictureBox1.Image = img;
            }
            else
            {
                pictureBox1.Image = CropBMP;
            }
            if (CHK_AutoSavePNG.Checked)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    //error will throw from here
                    CropBMP.Save(ms, ImageFormat.Png);
                    byte[] data = ms.ToArray();
                    File.WriteAllBytes(bclim.FilePath + "\\" + bclim.FileName + ".png", data);
                }
            }
        }
Пример #24
0
        private void CLYTViewer_Load(object sender, EventArgs e)
        {
            simpleOpenGlControl1.InitializeContexts();
            simpleOpenGlControl1.Width = (int)NWLayout.Layout.LayoutSize.X;
            simpleOpenGlControl1.Height = (int)NWLayout.Layout.LayoutSize.Y;
            Gl.ReloadFunctions();
            Gl.glEnable(Gl.GL_COLOR_MATERIAL);
            Gl.glDisable(Gl.GL_DEPTH_TEST);
            //Gl.glDepthFunc(Gl.GL_ALWAYS);
            Gl.glEnable(Gl.GL_LOGIC_OP);
            Gl.glDisable(Gl.GL_CULL_FACE);
            Gl.glEnable(Gl.GL_TEXTURE_2D);

            //Gl.glEnable(Gl.GL_LINE_SMOOTH);
            Gl.glEnable(Gl.GL_BLEND);

            Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);

            if (NWLayout.TextureList != null)
            {
                int i = 0;
                Textures = new CLIM[NWLayout.TextureList.NrTextures];
                foreach (String s in NWLayout.TextureList.TextureNames)
                {
                    byte[] data = data = ((ViewableFile)Tag).File.FindFileRelative("../timg/" + s);
                    if (data == null) data = ((ViewableFile)Tag).File.FindFileRelative(s);
                    if (data != null) Textures[i] = new CLIM(data);
                    i++;
                }
            }
            if (NWLayout.Materials != null)
            {
                int i = 0;
                foreach (var v in NWLayout.Materials.Materials)
                {
                    int j = 0;
                    foreach (var t in v.TexMaps)
                    {
                        if (Textures[t.TexIndex] != null) UploadTex(t, Textures[t.TexIndex], i * 4 + j + 1);
                        j++;
                    }
                    v.SetupShader();
                    i++;
                }
            }
            BShader.Compile(false);

            ImageL = new ImageList();
            ImageL.ColorDepth = ColorDepth.Depth32Bit;
            ImageL.ImageSize = new System.Drawing.Size(16, 16);
            ImageL.Images.Add("pan1", Resource.zone16);
            ImageL.Images.Add("pic1", Resource.image16);
            ImageL.Images.Add("wnd1", Resource.slide);
            ImageL.Images.Add("txt1", Resource.edit);
            ImageL.Images.Add("grp1", Resource.zones_stack);
            ImageL.Images.Add(Resource.t_shirt);
            ImageL.Images.Add(Resource.image_sunset);
            ImageL.Images.Add(Resource.edit_language);
            treeView1.ImageList = ImageL;
            treeView2.ImageList = ImageL;
            treeView3.ImageList = ImageL;
            treeView4.ImageList = ImageL;
            treeView5.ImageList = ImageL;

            treeView1.BeginUpdate();
            treeView1.Nodes.Clear();
            treeView1.Nodes.Add(NWLayout.RootPane.GetTreeNodes());
            treeView1.EndUpdate();

            treeView2.BeginUpdate();
            treeView2.Nodes.Clear();
            treeView2.Nodes.Add(NWLayout.RootGroup.GetTreeNodes());
            treeView2.EndUpdate();

            if (NWLayout.Materials != null)
            {
                treeView3.BeginUpdate();
                treeView3.Nodes.Clear();
                foreach (var v in NWLayout.Materials.Materials)
                    treeView3.Nodes.Add(new TreeNode(v.Name, 5, 5));
                treeView3.EndUpdate();
            }

            int q = 0;
            if (NWLayout.TextureList != null)
            {
                treeView4.BeginUpdate();
                treeView4.Nodes.Clear();
                foreach (var v in NWLayout.TextureList.TextureNames)
                    treeView4.Nodes.Add(new TreeNode(v, 6, 6) { ForeColor = (Textures[q] == null) ? Color.Red : Color.Black });
                treeView4.EndUpdate();
                q++;
            }

            if (NWLayout.FontList != null)
            {
                treeView5.BeginUpdate();
                treeView5.Nodes.Clear();
                foreach (var v in NWLayout.FontList.FontNames)
                    treeView5.Nodes.Add(new TreeNode(v, 7, 7));
                treeView5.EndUpdate();
            }

            init = true;
            Render();
        }
Пример #25
0
        // Bitmap Data Writing
        private Bitmap getIMG(CLIM bclim)
        {
            // New Image
            Bitmap img  = new Bitmap(nlpo2(gcm(bclim.Width, 8)), nlpo2(gcm(bclim.Height, 8)));
            int    f    = bclim.FileFormat;
            int    area = img.Width * img.Height;

            if (f == 9 && area > bclim.Data.Length / 4)
            {
                img  = new Bitmap(gcm(bclim.Width, 8), gcm(bclim.Height, 8));
                area = img.Width * img.Height;
            }
            // Coordinates
            uint x, y = 0;
            // Colors
            Color c   = new Color();
            uint  val = 0;
            // Tiles Per Width
            int p = gcm(img.Width, 8) / 8;

            if (p == 0)
            {
                p = 1;
            }

            // Build Image
            using (Stream BitmapStream = new MemoryStream(bclim.Data))
                using (BinaryReader br = new BinaryReader(BitmapStream))
                    for (uint i = 0; i < area; i++) // for every pixel
                    {
                        d2xy(i % 64, out x, out y);
                        uint tile = i / 64;

                        // Shift Tile Coordinate into Tilemap
                        x += (uint)(tile % p) * 8;
                        y += (uint)(tile / p) * 8;

                        // Get Color
                        switch (f)
                        {
                        case 0x0: // L8        // 8bit/1 byte
                        case 0x1: // A8
                        case 0x2: // LA4
                            c = DecodeColor(br.ReadByte(), f);
                            break;

                        case 0x3: // LA8       // 16bit/2 byte
                        case 0x4: // HILO8
                        case 0x5: // RGB565
                        case 0x8: // RGBA4444
                        case 0x7: // RGBA5551
                            c = DecodeColor(br.ReadUInt16(), f);
                            break;

                        case 0x6: // RGB8:     // 24bit
                            byte[] data = br.ReadBytes(3); Array.Resize(ref data, 4);
                            c = DecodeColor(BitConverter.ToUInt32(data, 0), f);
                            break;

                        case 0x9: // RGBA8888
                            c = DecodeColor(br.ReadUInt32(), f);
                            break;

                        case 0xC:                                                    // L4
                        case 0xD:                                                    // A4        // 4bit - Do 2 pixels at a time.
                            val = br.ReadByte();
                            img.SetPixel((int)x, (int)y, DecodeColor(val & 0xF, f)); // lowest bits for the low pixel
                            i++; x++;
                            c = DecodeColor(val >> 4, f);                            // highest bits for the high pixel
                            break;

                        case 0xA: // ETC1
                        case 0xB: // ETC1A4
                        default: throw new Exception("Invalid FileFormat.");
                        }
                        img.SetPixel((int)x, (int)y, c);
                    }
            return(img);
        }
Пример #26
0
        private void UploadTex(mat1.MaterialEntry.TexMap TexMap, CLIM Texture, int Id)
        {
            Gl.glBindTexture(Gl.GL_TEXTURE_2D, Id);
            Gl.glColor3f(1, 1, 1);
            Bitmap b = Texture.ToBitmap();
            //b.RotateFlip(RotateFlipType.RotateNoneFlipY);
            BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, b.Width, b.Height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, d.Scan0);
            b.UnlockBits(d);

            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, (TexMap.MagFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? Gl.GL_LINEAR : Gl.GL_NEAREST);
            Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, (TexMap.MinFilter == mat1.MaterialEntry.TexMap.FilterMode.Linear) ? Gl.GL_LINEAR : Gl.GL_NEAREST);

            switch (TexMap.WrapS)
            {
                case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
                    break;
                case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
                    break;
                case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_MIRRORED_REPEAT);
                    break;
                default:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
                    break;
            }

            switch (TexMap.WrapT)
            {
                case mat1.MaterialEntry.TexMap.WrapMode.Clamp:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
                    break;
                case mat1.MaterialEntry.TexMap.WrapMode.Repeat:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
                    break;
                case mat1.MaterialEntry.TexMap.WrapMode.Mirror:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_MIRRORED_REPEAT);
                    break;
                default:
                    Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
                    break;
            }
        }
Пример #27
0
 public virtual void Render(CLYT Layout, CLIM[] Textures, int InfluenceAlpha)
 {
     Gl.glPushMatrix();
     {
         Gl.glTranslatef(Translation.X, Translation.Y, Translation.Z);
         Gl.glRotatef(Rotation.X, 1, 0, 0);
         Gl.glRotatef(Rotation.Y, 0, 1, 0);
         Gl.glRotatef(Rotation.Z, 0, 0, 1);
         Gl.glScalef(Scale.X, Scale.Y, 1);
         foreach (pan1 p in Children)
         {
             p.Render(Layout, Textures, InfluencedAlpha ? (int)((float)(Alpha * InfluenceAlpha) / 255f) : Alpha);
         }
     }
     Gl.glPopMatrix();
 }