Added ability to manually select animations in ModelForm

This commit is contained in:
dexy
2019-11-21 19:01:43 +11:00
Unverified
parent 53305c3f12
commit d025f1b8d8
5 changed files with 241 additions and 64 deletions
+142 -22
View File
@@ -101,12 +101,20 @@ namespace CodeWalker.Forms
ModelMatForm materialForm = null;
private bool modelModified = false;
bool modelModified = false;
ExploreForm exploreForm = null;
RpfFileEntry rpfFileEntry = null;
bool animsInited = false;
YcdFile Ycd = null;
ClipMapEntry AnimClip = null;
MetaHash ModelHash;
Archetype ModelArchetype = null;
public ModelForm(ExploreForm ExpForm = null)
{
@@ -314,6 +322,11 @@ namespace CodeWalker.Forms
timecycle.SetTime(Renderer.timeofday);
//UpdateStatus("Timecycles loaded.");
}
if (!animsInited)
{
InitAnimation();
animsInited = true;
}
if (Renderer.renderskydome)
{
if (!weather.Inited)
@@ -355,6 +368,35 @@ namespace CodeWalker.Forms
private void InitAnimation()
{
if (InvokeRequired)
{
BeginInvoke(new Action(() => { InitAnimation(); }));
}
else
{
ClipComboBox.Items.Clear();
ClipDictComboBox.Items.Clear();
var ycds = gameFileCache.YcdDict.Values.ToList();
ycds.Sort((a, b) => { return a.Name.CompareTo(b.Name); });
ClipDictComboBox.AutoCompleteCustomSource.Clear();
List<string> ycdlist = new List<string>();
foreach (var ycde in ycds)
{
ycdlist.Add(ycde.GetShortName());
}
ClipDictComboBox.AutoCompleteCustomSource.AddRange(ycdlist.ToArray());
ClipDictComboBox.Text = "";
TrySelectClipDict();
}
}
private void LoadSettings()
{
@@ -479,17 +521,13 @@ namespace CodeWalker.Forms
private void RenderSingleItem()
{
uint hash = 0;
Archetype arch = null;
if (Ydr != null)
{
if (Ydr.Loaded)
{
hash = Ydr?.RpfFileEntry?.ShortNameHash ?? 0;
arch = TryGetArchetype(hash);
if (ModelArchetype == null) ModelArchetype = TryGetArchetype(ModelHash);
Renderer.RenderDrawable(Ydr.Drawable, arch, null, hash);
Renderer.RenderDrawable(Ydr.Drawable, ModelArchetype, null, ModelHash, null, null, AnimClip);
}
}
else if (Ydd != null)
@@ -501,9 +539,9 @@ namespace CodeWalker.Forms
{
if (!DrawableDrawFlags.ContainsKey(kvp.Value))//only render if it's checked...
{
arch = TryGetArchetype(kvp.Key);
var arch = TryGetArchetype(kvp.Key);
Renderer.RenderDrawable(kvp.Value, arch, null, Ydd.RpfFileEntry.ShortNameHash);
Renderer.RenderDrawable(kvp.Value, arch, null, Ydd.RpfFileEntry.ShortNameHash, null, null, AnimClip);
}
}
}
@@ -516,9 +554,9 @@ namespace CodeWalker.Forms
{
if (!DrawableDrawFlags.ContainsKey(kvp.Value))//only render if it's checked...
{
arch = TryGetArchetype(kvp.Key);
if (ModelArchetype == null) ModelArchetype = TryGetArchetype(kvp.Key);
Renderer.RenderDrawable(kvp.Value, arch, null, kvp.Key);
Renderer.RenderDrawable(kvp.Value, ModelArchetype, null, kvp.Key, null, null, AnimClip);
}
}
}
@@ -531,17 +569,9 @@ namespace CodeWalker.Forms
{
var f = Yft.Fragment;
hash = Yft.RpfFileEntry?.ShortNameHash ?? 0;
if (ModelArchetype == null) ModelArchetype = TryGetArchetype(ModelHash);
var namelower = Yft.RpfFileEntry?.GetShortNameLower();
if (namelower?.EndsWith("_hi") ?? false)
{
hash = JenkHash.GenHash(namelower.Substring(0, namelower.Length - 3));
}
arch = TryGetArchetype(hash);
Renderer.RenderFragment(arch, null, f, hash);
Renderer.RenderFragment(ModelArchetype, null, f, ModelHash, AnimClip);
}
}
}
@@ -577,6 +607,11 @@ namespace CodeWalker.Forms
FileName = ydr.Name;
Ydr = ydr;
rpfFileEntry = Ydr.RpfFileEntry;
ModelHash = Ydr.RpfFileEntry?.ShortNameHash ?? 0;
if (ModelHash != 0)
{
ModelArchetype = TryGetArchetype(ModelHash);
}
if (ydr.Drawable != null)
{
@@ -614,6 +649,17 @@ namespace CodeWalker.Forms
FileName = yft.Name;
Yft = yft;
rpfFileEntry = Yft.RpfFileEntry;
ModelHash = Yft.RpfFileEntry?.ShortNameHash ?? 0;
var namelower = Yft.RpfFileEntry?.GetShortNameLower();
if (namelower?.EndsWith("_hi") ?? false)
{
ModelHash = JenkHash.GenHash(namelower.Substring(0, namelower.Length - 3));
}
if (ModelHash != 0)
{
ModelArchetype = TryGetArchetype(ModelHash);
}
var dr = yft.Fragment?.Drawable;
if (dr != null)
@@ -680,7 +726,14 @@ namespace CodeWalker.Forms
}
private void TrySelectClipDict()
{
if (ModelArchetype != null)
{
var str = ModelArchetype.ClipDict.ToCleanString();
ClipDictComboBox.Text = str;
}
}
@@ -728,6 +781,63 @@ namespace CodeWalker.Forms
private void LoadClipDict(string name)
{
if (gameFileCache == null) return;
if (!gameFileCache.IsInited) return;//what to do here? wait for it..?
var ycdhash = JenkHash.GenHash(name.ToLowerInvariant());
var ycd = gameFileCache.GetYcd(ycdhash);
while ((ycd != null) && (!ycd.Loaded))
{
Thread.Sleep(20);//kinda hacky
ycd = gameFileCache.GetYcd(ycdhash);
}
Ycd = ycd;
ClipComboBox.Items.Clear();
ClipComboBox.Items.Add("");
if (ycd?.ClipMapEntries == null)
{
ClipComboBox.SelectedIndex = 0;
AnimClip = null;
return;
}
List<string> items = new List<string>();
foreach (var cme in ycd.ClipMapEntries)
{
if (cme.Clip != null)
{
items.Add(cme.Clip.ShortName);
}
}
items.Sort();
foreach (var item in items)
{
ClipComboBox.Items.Add(item);
}
}
private void SelectClip(string name)
{
MetaHash cliphash = JenkHash.GenHash(name);
ClipMapEntry cme = null;
Ycd?.ClipMap?.TryGetValue(cliphash, out cme);
AnimClip = cme;
}
private void UpdateTimeOfDayLabel()
{
int v = TimeOfDayTrackBar.Value;
@@ -1865,5 +1975,15 @@ namespace CodeWalker.Forms
{
Save(true);
}
private void ClipDictComboBox_TextChanged(object sender, EventArgs e)
{
LoadClipDict(ClipDictComboBox.Text);
}
private void ClipComboBox_TextChanged(object sender, EventArgs e)
{
SelectClip(ClipComboBox.Text);
}
}
}