mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-18 06:29:53 +08:00
R26_dev8 - First public commit
This commit is contained in:
@@ -0,0 +1,196 @@
|
||||
using CodeWalker.GameFiles;
|
||||
using CodeWalker.Utils;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
using System.Linq;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace CodeWalker.Forms
|
||||
{
|
||||
public partial class YtdForm : Form
|
||||
{
|
||||
private string fileName;
|
||||
private YtdFile Ytd { get; set; }
|
||||
private TextureDictionary TexDict { get; set; }
|
||||
|
||||
public YtdForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
|
||||
public void LoadYtd(YtdFile ytd)
|
||||
{
|
||||
Ytd = ytd;
|
||||
|
||||
fileName = ytd?.Name;
|
||||
if (string.IsNullOrEmpty(fileName))
|
||||
{
|
||||
fileName = ytd?.RpfFileEntry?.Name;
|
||||
}
|
||||
|
||||
LoadTexDict(ytd.TextureDict, fileName);
|
||||
}
|
||||
public void LoadTexDict(TextureDictionary texdict, string filename)
|
||||
{
|
||||
TexDict = texdict;
|
||||
fileName = filename;
|
||||
|
||||
TexturesListView.Items.Clear();
|
||||
SelTexturePictureBox.Image = null;
|
||||
SelTextureNameTextBox.Text = string.Empty;
|
||||
SelTextureDimensionsLabel.Text = "-";
|
||||
SelTextureMipLabel.Text = "0";
|
||||
SelTextureMipTrackBar.Value = 0;
|
||||
SelTextureMipTrackBar.Maximum = 0;
|
||||
|
||||
if (TexDict == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if ((TexDict.Textures == null) || (TexDict.Textures.data_items == null)) return;
|
||||
var texs = TexDict.Textures.data_items;
|
||||
|
||||
for (int i = 0; i < texs.Length; i++)
|
||||
{
|
||||
var tex = texs[i];
|
||||
ListViewItem lvi = TexturesListView.Items.Add(tex.Name);
|
||||
lvi.ToolTipText = tex.Name;
|
||||
lvi.Tag = tex;
|
||||
lvi.SubItems.Add(tex.Width.ToString() + " x " + tex.Height.ToString());
|
||||
}
|
||||
|
||||
if (TexturesListView.Items.Count > 0)
|
||||
{
|
||||
TexturesListView.Items[0].Selected = true;
|
||||
}
|
||||
UpdateStatus(GetTexCountStr());
|
||||
|
||||
|
||||
UpdateFormTitle();
|
||||
}
|
||||
|
||||
private string GetTexCountStr()
|
||||
{
|
||||
var texs = TexDict?.Textures?.data_items;
|
||||
if (texs == null) return "";
|
||||
return texs.Length.ToString() + " texture" + ((texs.Length != 1) ? "s" : "");
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void ShowTextureMip(Texture tex, int mip, bool mipchange)
|
||||
{
|
||||
if (tex == null)
|
||||
{
|
||||
SelTexturePictureBox.Image = null;
|
||||
SelTextureNameTextBox.Text = string.Empty;
|
||||
SelTextureDimensionsLabel.Text = "-";
|
||||
SelTextureMipLabel.Text = "0";
|
||||
SelTextureMipTrackBar.Value = 0;
|
||||
SelTextureMipTrackBar.Maximum = 0;
|
||||
DetailsPropertyGrid.SelectedObject = null;
|
||||
UpdateStatus(GetTexCountStr());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (mipchange)
|
||||
{
|
||||
if (mip >= tex.Levels) mip = tex.Levels - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
SelTextureMipTrackBar.Maximum = tex.Levels - 1;
|
||||
}
|
||||
|
||||
SelTextureNameTextBox.Text = tex.Name;
|
||||
DetailsPropertyGrid.SelectedObject = tex;
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
int cmip = Math.Min(Math.Max(mip, 0), tex.Levels - 1);
|
||||
byte[] pixels = DDSIO.GetPixels(tex, cmip);
|
||||
int w = tex.Width >> cmip;
|
||||
int h = tex.Height >> cmip;
|
||||
Bitmap bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
|
||||
|
||||
if (pixels != null)
|
||||
{
|
||||
var BoundsRect = new System.Drawing.Rectangle(0, 0, w, h);
|
||||
BitmapData bmpData = bmp.LockBits(BoundsRect, ImageLockMode.WriteOnly, bmp.PixelFormat);
|
||||
IntPtr ptr = bmpData.Scan0;
|
||||
int bytes = bmpData.Stride * bmp.Height;
|
||||
Marshal.Copy(pixels, 0, ptr, bytes);
|
||||
bmp.UnlockBits(bmpData);
|
||||
}
|
||||
|
||||
var dimstr = w.ToString() + " x " + h.ToString();
|
||||
|
||||
SelTexturePictureBox.Image = bmp;
|
||||
SelTextureDimensionsLabel.Text = dimstr;
|
||||
|
||||
var str1 = GetTexCountStr();
|
||||
var str2 = tex.Name + ", mip " + cmip.ToString() + ", " + dimstr;
|
||||
if (!string.IsNullOrEmpty(str1))
|
||||
{
|
||||
UpdateStatus(str1 + ". " + str2);
|
||||
}
|
||||
else
|
||||
{
|
||||
UpdateStatus(str2);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
UpdateStatus("Error reading texture mip: " + ex.ToString());
|
||||
SelTexturePictureBox.Image = null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void UpdateFormTitle()
|
||||
{
|
||||
Text = fileName + " - Texture Dictionary - CodeWalker by dexyfex";
|
||||
}
|
||||
|
||||
private void UpdateStatus(string text)
|
||||
{
|
||||
StatusLabel.Text = text;
|
||||
}
|
||||
|
||||
|
||||
private void TexturesListView_SelectedIndexChanged(object sender, EventArgs e)
|
||||
{
|
||||
Texture tex = null;
|
||||
if (TexturesListView.SelectedItems.Count == 1)
|
||||
{
|
||||
tex = TexturesListView.SelectedItems[0].Tag as Texture;
|
||||
}
|
||||
ShowTextureMip(tex, 0, false);
|
||||
}
|
||||
|
||||
private void SelTextureMipTrackBar_Scroll(object sender, EventArgs e)
|
||||
{
|
||||
Texture tex = null;
|
||||
if (TexturesListView.SelectedItems.Count == 1)
|
||||
{
|
||||
tex = TexturesListView.SelectedItems[0].Tag as Texture;
|
||||
}
|
||||
SelTextureMipLabel.Text = SelTextureMipTrackBar.Value.ToString();
|
||||
ShowTextureMip(tex, SelTextureMipTrackBar.Value, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user