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); } }
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(); }
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); }
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; } }
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; } }
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); } }
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; } }
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)); }
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); }
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; }
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; }
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); }
public CLIMViewer(CLIM Image) { this.Image = Image; InitializeComponent(); }
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(); }
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); }
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(); }
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; }
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(); }
// 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; }
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; }
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); }
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); } } }
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(); }
// 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); }
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(); }