UniversalViewer/Assets/KF3/Scripts/Containers/KF3CeruleanContainer.cs

163 lines
5.7 KiB
C#
Raw Normal View History

using KF3.Containers;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class KF3CeruleanContainer : KF3CharacterContainer
{
public UIKF3CharacterPanel CharacterPanel;
public static IEnumerator CreateAsync(string modelName, string animationSetName, System.Action<KF3CeruleanContainer> callback = null)
{
GameObject go = new GameObject(modelName);
var container = go.AddComponent<KF3CeruleanContainer>();
yield return container.BuildGeneral(modelName, animationSetName);
UIHandleCerulean.CreateAsChild(container);
Main.SelectObject(container);
container.LoadInProgress = false;
callback?.Invoke(container);
}
public override void SetAnimationReferences()
{
if (BodyAnimation)
{
BodySimpleAnimation = Body.GetComponentInChildren<SimpleAnimation>();
if (Main.OverrideClip != null)
{
foreach (var anim in BodyAnimation.prefabAnimeList)
{
anim.clip = Main.OverrideClip;
}
}
Body.refAnimationObj = BodyAnimation.gameObject;
Body.JoinReferenceParam();
}
else
{
Error.Log(Color.blue, "Body Animations Missing");
}
}
public override void SetBones()
{
var bones = Body.boneList;
var extraBones = bones.Where(b => b.name.Contains("osg")).ToList();
foreach (var bone in bones)
{
if (!bone.gameObject.TryGetComponent(out UIHandle bone1))
{
if (bone.GetComponent<Osage>() != null)
{
bone1 = UIHandlePhysicsBone.CreateAsChild(this, bone, new List<SerializableBone.BoneTags>() { SerializableBone.BoneTags.Dynamic }).SetColor(Color.cyan).SetName(bone.name);
}
else
{
bone1 = UIHandleBone.CreateAsChild(this, bone, new List<SerializableBone.BoneTags>()).SetColor(Color.gray).SetName(bone.name);
}
}
}
}
public override void DoStuff()
{
foreach (Renderer r in GetComponentsInChildren<Renderer>())
{
Material[] overrideMaterials = new Material[r.materials.Length];
for (int i = 0; i < r.materials.Length; i++)
{
overrideMaterials[i] = new Material(Shader.Find("PRD/FriendsShaderV2"));
if (ModelId >= 40400)
{
overrideMaterials[i].SetTexture("_BaseMap", r.materials[i].GetTexture("_BaseMap"));
overrideMaterials[i].SetTexture("_1st_ShadeMap", r.materials[i].GetTexture("_1st_ShadeMap"));
}
else if (ModelId >= 40000)
{
overrideMaterials[i].SetTexture("_BaseMap", r.materials[i].mainTexture);
overrideMaterials[i].SetTexture("_1st_ShadeMap", r.materials[i].mainTexture);
}
else
{
overrideMaterials[i].SetTexture("_BaseMap", r.materials[i].GetTexture("_BaseMap") as Texture2D);
overrideMaterials[i].SetTexture("_1st_ShadeMap", r.materials[i].GetTexture("_BaseMap") as Texture2D);
}
}
r.materials = overrideMaterials;
Renderers.Add(r);
}
var charaPanel = CharacterPanel = UIKF3CharacterPanel.Create(this);
InstantiatedObjects.Add(charaPanel.gameObject);
}
public override void PastePose(KeyframeData frame, PoseLoadOptions pasteParams)
{
var bones = frame as CharacterKeyframeData;
this.PlayBodyAnimation("");
if (pasteParams.Root)
{
bones.Root.ApplyTo(transform);
}
if (pasteParams.Body)
{
foreach (var bone in this.Body.boneList)
{
if (pasteParams.Other || bone.GetComponent<Osage>() == null)
bones.Bones.FirstOrDefault(b => b.Name == "Body").Bones.FirstOrDefault(b => b.Name == bone.name)?.Transform.ApplyTo(bone, pasteParams);
}
}
if (bones.Renderers != null)
{
foreach (var renderer in bones.Renderers)
{
var rend = this.Renderers.FirstOrDefault(r => KF3CharacterContainerSerializable.GetRendererName(this, r) == renderer.Name);
if (rend != null)
{
rend.enabled = renderer.Value;
}
}
}
}
public override IEnumerator GetModel(string bodyIdLong, string costumeId)
{
KF3AssetLibrary lib = Main.Assets;
List<KF3AssetBundle> abList = lib.AssetBundles.Where(ab => ab.FileName.StartsWith($"ch_{bodyIdLong}_")).ToList();
KF3AssetBundle bundle;
//load body
bundle = abList.FirstOrDefault(ab => ab.FileName == $"ch_{bodyIdLong}_{costumeId}.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
Body = spawnAndGetReferencer(ab);
});
}
public override IEnumerator GetAnimations(string idLong)
{
KF3AssetLibrary lib = Main.Assets;
KF3AssetBundle bundle;
List<KF3AssetBundle> abList = lib.AssetBundles.Where(ab => ab.FileName.StartsWith($"ch_{idLong}_")).ToList();
bundle = lib.CeruleanAnimationSets.FirstOrDefault(ab => ab.FileName == $"ch_{idLong}_a_mot.prefab");
yield return lib.LoadAsset(bundle, (ab) =>
{
BodyAnimation = spawnAndGetReferencer(ab);
});
}
public override void Select()
{
CharacterPanel.gameObject.SetActive(true);
}
public override void Deselect()
{
CharacterPanel.gameObject.SetActive(false);
}
}