Make frame properties animatable.

This commit is contained in:
2022-12-21 20:22:41 +08:00
parent 959157255f
commit c5571e7d17
3 changed files with 48 additions and 32 deletions

View File

@@ -4,7 +4,16 @@ using Logger = Cryville.Common.Logger;
namespace Cryville.Crtr.Components {
public class SpriteInfo {
public string FrameName;
string m_frameName;
public string FrameName {
get {
return m_frameName;
}
set {
m_frameName = value;
Reload();
}
}
public SpriteFrame Frame {
get;
private set;
@@ -20,21 +29,38 @@ namespace Cryville.Crtr.Components {
return Rect.width / Rect.height;
}
}
bool _loaded;
Material _mat;
public void Bind(Material mat) {
_loaded = true;
_mat = mat;
Reload();
}
public void Load() {
if (FrameName != null) {
_loaded = true;
Reload();
}
public void Reload() {
if (!_loaded) return;
if (!string.IsNullOrEmpty(FrameName)) {
if (ChartPlayer.frames.ContainsKey(FrameName)) {
Frame = ChartPlayer.frames[FrameName];
}
else {
Logger.Log("main", 4, "Skin", "Texture {0} not found", FrameName);
Frame = null;
}
}
else Frame = null;
if (_mat != null) {
_mat.mainTexture = Frame == null ? null : Frame.Texture;
}
}
}
public class SpritePlane : SpriteBase {
public SpritePlane() {
SubmitProperty("frame", new PropOp.String(v => Frame = v));
SubmitProperty("frame", new PropOp.String(v => Frame = v), 2);
SubmitProperty("fit", new PropOp.Enum<FitMode>(v => Fit = v));
SubmitProperty("opacity", new PropOp.Float(v => Opacity = v));
}
@@ -68,16 +94,11 @@ namespace Cryville.Crtr.Components {
}
protected void OnFrameUpdate() {
if (!mesh.Initialized) return;
if (frameInfo.FrameName == null) {
if (frameInfo.Frame == null) {
mesh.Renderer.enabled = false;
return;
}
mesh.Renderer.enabled = true;
frameInfo.Load();
if (frameInfo.Frame != null)
mesh.Renderer.material.mainTexture = frameInfo.Frame.Texture;
else
Logger.Log("main", 4, "Skin", "Unable to load texture {0}", frameInfo.FrameName);
UpdateUV();
UpdateScale();
UpdateZIndex();
@@ -140,8 +161,8 @@ namespace Cryville.Crtr.Components {
}
public override void Init() {
frameInfo.Load();
InternalInit();
frameInfo.Bind(mesh.Renderer.material);
OnFrameUpdate();
UpdateOpacity();
}