Files
BepInEx/Projects/BanquetForFools/Source/Assembly-CSharp/BakedMeshAnimator.cs
2025-05-21 20:40:04 +02:00

388 lines
9.9 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
// Token: 0x020000FC RID: 252
public class BakedMeshAnimator : MonoBehaviour
{
// Token: 0x060015A7 RID: 5543 RVA: 0x0019B24C File Offset: 0x0019944C
private void Awake()
{
this.tr = base.transform;
this.currentAnimation = Mathf.Clamp(this.startAnimation, 0, this.animations.Length - 1);
if (this.animationMeshRenderer == null)
{
this.animationMeshRenderer = base.GetComponent<MeshRenderer>();
}
if (this.animationMeshRenderer == null)
{
Debug.LogError("BakedMeshAnimator: " + ((this != null) ? this.ToString() : null) + " has no assigned MeshRenderer!");
}
this.meshFilter = this.animationMeshRenderer.GetComponent<MeshFilter>();
this.meshCacheCount = this.animations[this.currentAnimation].meshes.Length;
this.currentSpeed = this.animations[this.currentAnimation].playSpeed;
this.CreateCrossFadeMesh();
this.StartCrossfade();
if (this.meshFilter.sharedMesh == null)
{
this.meshFilter.sharedMesh = this.animations[0].meshes[0];
}
}
// Token: 0x060015A8 RID: 5544 RVA: 0x0019B346 File Offset: 0x00199546
public void AnimateUpdate()
{
if (this.animations.Length == 0)
{
return;
}
this.Animate();
}
// Token: 0x060015A9 RID: 5545 RVA: 0x0019B358 File Offset: 0x00199558
public void SetAnimation(int _animation, int _transitionFrame)
{
if (this.currentAnimation == _animation)
{
return;
}
this.transitionFrame = _transitionFrame;
this.anim = _animation;
this.SetAnimCommon();
}
// Token: 0x060015AA RID: 5546 RVA: 0x0019B378 File Offset: 0x00199578
public void SetAnimation(int _animation)
{
if (this.currentAnimation == _animation)
{
return;
}
this.transitionFrame = this.animations[this.currentAnimation].transitionFrame;
this.anim = _animation;
this.SetAnimCommon();
}
// Token: 0x060015AB RID: 5547 RVA: 0x0019B3A9 File Offset: 0x001995A9
private void SetAnimCommon()
{
base.enabled = true;
this.transitioning = true;
this.StartCrossfade();
}
// Token: 0x060015AC RID: 5548 RVA: 0x0019B3C0 File Offset: 0x001995C0
public void Animate()
{
if (!this.animationMeshRenderer.isVisible)
{
return;
}
Vector3 cameraTargetPosition = Links.x.rtsCamera.cameraTargetPosition;
cameraTargetPosition.y = this.tr.position.y;
if ((this.tr.position - cameraTargetPosition).sqrMagnitude > 1600f)
{
return;
}
if (this.transitioning)
{
if (this.crossfade || (int)this.currentFrame == this.transitionFrame || this.failsafe > this.transitionFailsafe)
{
this.failsafe = 0f;
this.transitioning = false;
this.currentAnimation = this.anim;
this.meshCacheCount = this.animations[this.currentAnimation].meshes.Length;
this.currentSpeed = this.animations[this.currentAnimation].playSpeed;
if (Time.time < 1f && this.animations[this.currentAnimation].randomStartFrame)
{
this.currentFrame = (float)Random.Range(this.meshCacheCount, 0);
}
else if (this.crossfade)
{
this.currentFrame = (float)this.animations[this.currentAnimation].crossfadeFrame;
}
else
{
this.currentFrame = (float)this.animations[this.currentAnimation].transitionFrame;
}
}
else
{
this.failsafe += Time.deltaTime;
}
}
if (!this.doCrossfade)
{
if (this.animations[this.currentAnimation].pingPong)
{
this.PingPongFrame();
}
else
{
this.NextFrame();
}
if (this.currentFrameInt != (int)this.currentFrame)
{
this.currentFrameInt = (int)this.currentFrame;
if (this.crossfade && this.crossfadeNormalFix)
{
this.animations[this.currentAnimation].meshes[(int)this.currentFrame].GetVertices(this.norms);
this.crossfadeMeshEnd.SetVertices(this.norms);
}
else
{
this.meshFilter.sharedMesh = this.animations[this.currentAnimation].meshes[(int)this.currentFrame];
}
}
}
this.UpdateCrossfade();
}
// Token: 0x060015AD RID: 5549 RVA: 0x0019B5EC File Offset: 0x001997EC
public bool NextFrame()
{
this.currentFrame += this.currentSpeed * Time.deltaTime * this.playSpeedMultiplier;
if (this.currentFrame > (float)(this.meshCacheCount + 1))
{
this.currentFrame = 0f;
if (!this.animations[this.currentAnimation].loop)
{
base.enabled = false;
}
return true;
}
if (this.currentFrame >= (float)this.meshCacheCount)
{
this.currentFrame = (float)this.meshCacheCount - this.currentFrame;
if (!this.animations[this.currentAnimation].loop)
{
base.enabled = false;
}
return true;
}
return false;
}
// Token: 0x060015AE RID: 5550 RVA: 0x0019B694 File Offset: 0x00199894
public bool PingPongFrame()
{
if (this.pingPongToggle)
{
this.currentFrame += this.currentSpeed * Time.deltaTime * this.playSpeedMultiplier;
}
else
{
this.currentFrame -= this.currentSpeed * Time.deltaTime * this.playSpeedMultiplier;
}
if (this.currentFrame <= 0f)
{
this.currentFrame = 0f;
this.pingPongToggle = true;
return true;
}
if (this.currentFrame >= (float)this.meshCacheCount)
{
this.pingPongToggle = false;
this.currentFrame = (float)(this.meshCacheCount - 1);
return true;
}
return false;
}
// Token: 0x060015AF RID: 5551 RVA: 0x0019B734 File Offset: 0x00199934
public void SetSpeedMultiplier(float speed)
{
this.playSpeedMultiplier = speed;
}
// Token: 0x060015B0 RID: 5552 RVA: 0x0019B740 File Offset: 0x00199940
private void CrossfadeInit()
{
if (this.vertsDiff == null)
{
this.vertsDiff = new Vector3[this.vertsStart.Count];
}
this.crossfadeMestTo.GetVertices(this.meshVerts);
for (int i = 0; i < this.vertsStart.Count; i++)
{
this.vertsDiff[i] = this.meshVerts[i] - this.vertsStart[i];
}
}
// Token: 0x060015B1 RID: 5553 RVA: 0x0019B7BC File Offset: 0x001999BC
private void CreateCrossFadeMesh()
{
if (!this.crossfade)
{
return;
}
this.crossfadeMeshStart = this.meshFilter.sharedMesh;
this.crossfadeMeshStart.GetVertices(this.vertsStart);
if (this.crossfadeMeshEnd == null)
{
this.crossfadeMeshEnd = new Mesh();
this.crossfadeMeshEnd.MarkDynamic();
this.crossfadeMeshEnd.SetVertices(this.vertsStart);
this.crossfadeMeshEnd.triangles = this.crossfadeMeshStart.triangles;
this.crossfadeMeshEnd.uv = this.crossfadeMeshStart.uv;
this.crossfadeMeshStart.GetNormals(this.norms);
this.crossfadeMeshEnd.SetNormals(this.norms);
}
}
// Token: 0x060015B2 RID: 5554 RVA: 0x0019B878 File Offset: 0x00199A78
private void StartCrossfade()
{
if (!this.crossfade)
{
return;
}
this.crossfadeMeshStart = this.meshFilter.sharedMesh;
this.crossfadeMeshStart.GetVertices(this.vertsStart);
this.doCrossfade = true;
this.crossfadeWeight = 0f;
this.crossfadeMeshEnd.SetVertices(this.vertsStart);
this.meshFilter.mesh = this.crossfadeMeshEnd;
this.crossfadeMeshStart.GetVertices(this.vertsStart);
if (this.vertsCurrent == null)
{
this.vertsCurrent = new Vector3[this.vertsStart.Count];
}
}
// Token: 0x060015B3 RID: 5555 RVA: 0x0019B914 File Offset: 0x00199B14
private void UpdateCrossfade()
{
if (!this.crossfade)
{
return;
}
this.nextUpdate += Time.deltaTime;
if (this.nextUpdate < this.crossfadeFrequency)
{
return;
}
this.nextUpdate = 0f;
if (this.crossfadeWeight >= 1f)
{
this.doCrossfade = false;
return;
}
this.crossfadeMestTo = this.animations[this.currentAnimation].meshes[this.animations[this.currentAnimation].crossfadeFrame];
if (this.crossfadeWeight == 0f)
{
this.CrossfadeInit();
}
for (int i = 0; i < this.vertsCurrent.Length; i++)
{
this.vertsCurrent[i] = this.vertsStart[i];
}
if (this.vertsDiff.Length != this.vertsStart.Count)
{
return;
}
for (int j = 0; j < this.vertsCurrent.Length; j++)
{
this.vertsCurrent[j] += this.vertsDiff[j] * this.crossfadeWeight;
}
this.crossfadeMeshEnd.SetVertices(this.vertsCurrent);
this.crossfadeWeight += this.crossfadeWeightAdd;
}
// Token: 0x040025DA RID: 9690
public MeshRenderer animationMeshRenderer;
// Token: 0x040025DB RID: 9691
public BakedMeshAnimation[] animations;
// Token: 0x040025DC RID: 9692
public int startAnimation;
// Token: 0x040025DD RID: 9693
private int currentAnimation;
// Token: 0x040025DE RID: 9694
private MeshFilter meshFilter;
// Token: 0x040025DF RID: 9695
public float currentFrame;
// Token: 0x040025E0 RID: 9696
private int currentFrameInt;
// Token: 0x040025E1 RID: 9697
private float currentSpeed;
// Token: 0x040025E2 RID: 9698
private bool pingPongToggle;
// Token: 0x040025E3 RID: 9699
public float playSpeedMultiplier = 1f;
// Token: 0x040025E4 RID: 9700
private int meshCacheCount;
// Token: 0x040025E5 RID: 9701
public float transitionFailsafe = 0.4f;
// Token: 0x040025E6 RID: 9702
private float failsafe;
// Token: 0x040025E7 RID: 9703
private int transitionFrame;
// Token: 0x040025E8 RID: 9704
private int anim;
// Token: 0x040025E9 RID: 9705
private bool transitioning = true;
// Token: 0x040025EA RID: 9706
private Transform tr;
// Token: 0x040025EB RID: 9707
public bool crossfade;
// Token: 0x040025EC RID: 9708
public bool crossfadeNormalFix;
// Token: 0x040025ED RID: 9709
public float crossfadeFrequency = 0.05f;
// Token: 0x040025EE RID: 9710
public float crossfadeWeightAdd = 0.221f;
// Token: 0x040025EF RID: 9711
private bool doCrossfade;
// Token: 0x040025F0 RID: 9712
private float crossfadeWeight = 1f;
// Token: 0x040025F1 RID: 9713
private Mesh crossfadeMestTo;
// Token: 0x040025F2 RID: 9714
private Mesh crossfadeMeshStart;
// Token: 0x040025F3 RID: 9715
private Mesh crossfadeMeshEnd;
// Token: 0x040025F4 RID: 9716
private List<Vector3> vertsStart = new List<Vector3>();
// Token: 0x040025F5 RID: 9717
private List<Vector3> norms = new List<Vector3>();
// Token: 0x040025F6 RID: 9718
private Vector3[] vertsCurrent;
// Token: 0x040025F7 RID: 9719
private Vector3[] vertsDiff;
// Token: 0x040025F8 RID: 9720
private List<Vector3> meshVerts = new List<Vector3>();
// Token: 0x040025F9 RID: 9721
private float nextUpdate;
}