diff --git a/Assets/Scripts/Minigames.cs b/Assets/Scripts/Minigames.cs
index 46574643e..e3d5c0b3e 100644
--- a/Assets/Scripts/Minigames.cs
+++ b/Assets/Scripts/Minigames.cs
@@ -706,7 +706,6 @@ namespace HeavenStudio
new Param("axis", StaticCamera.ViewAxis.All, "Axis", "The axis to scale the viewport in" )
}
),
-
new GameAction("screen shake", "Screen Shake", 1f, true,
new List()
{
@@ -714,6 +713,30 @@ namespace HeavenStudio
new Param("valB", new EntityTypes.Float(0, 10, 1), "Vertical Intensity")
}
),
+ new GameAction("scale letterbox", "Scale Letterbox", 1f, true, new List()
+ {
+ new Param("valA", new EntityTypes.Float(0, 50, 1), "Scale Letterbox X"),
+ new Param("valB", new EntityTypes.Float(0, 50, 1), "Scale Letterbox Y"),
+ new Param("ease", Util.EasingFunction.Ease.Linear, "Ease Type"),
+ new Param("axis", StaticCamera.ViewAxis.All, "Axis", "The axis to scale the letterbox in")
+ }
+ ),
+ new GameAction("complex pan", "Pan Viewport(Complex)", 1f, true, new List()
+ {
+ new Param("valA", new EntityTypes.Float(-50, 50, 1), "Pan Viewport X"),
+ new Param("valB", new EntityTypes.Float(-50, 50, 1), "Pan Viewport Y"),
+ new Param("ease", Util.EasingFunction.Ease.Linear, "Ease Type"),
+ new Param("axis", StaticCamera.ViewAxis.All, "Axis", "The axis to pan the viewport in")
+ }
+ ),
+ new GameAction("complex scale", "Scale Viewport(Complex)", 1f, true, new List()
+ {
+ new Param("valA", new EntityTypes.Float(0, 200, 100), "Scale Viewport X"),
+ new Param("valB", new EntityTypes.Float(0, 200, 100), "Scale Viewport Y"),
+ new Param("ease", Util.EasingFunction.Ease.Linear, "Ease Type"),
+ new Param("axis", StaticCamera.ViewAxis.All, "Axis", "The axis to scale the viewport in")
+ }
+ ),
new GameAction("pan window", "Move Window", 1f, true, new List()
{
diff --git a/Assets/Scripts/StaticCamera.cs b/Assets/Scripts/StaticCamera.cs
index c3f4b7b32..8c1f5b480 100644
--- a/Assets/Scripts/StaticCamera.cs
+++ b/Assets/Scripts/StaticCamera.cs
@@ -20,6 +20,8 @@ namespace HeavenStudio
[SerializeField] Image ambientBg;
[SerializeField] GameObject ambientBgGO;
[SerializeField] GameObject letterboxBgGO;
+ [SerializeField] RectTransform letterboxMask;
+ [SerializeField] RawImage viewportTexture;
public static StaticCamera instance { get; private set; }
public new Camera camera;
@@ -37,18 +39,32 @@ namespace HeavenStudio
private List panEvents = new();
private List scaleEvents = new();
private List rotationEvents = new();
+ private List letterboxEvents = new();
+ private List complexPanEvents = new();
+ private List complexScaleEvents = new();
static Vector3 defaultPan = new Vector3(0, 0, 0);
static Vector3 defaultScale = new Vector3(1, 1, 1);
static float defaultRotation = 0;
+ static Vector3 defaultLetterbox = new Vector3(1, 1, 1);
+ static Vector3 defaultComplexPan = new Vector3(0, 0, 0);
+ static Vector3 defaultComplexScale = new Vector3(1, 1, 1);
private static Vector3 pan;
private static Vector3 scale;
private static float rotation;
+ private static Vector3 letterbox;
+ private static Vector3 panInv;
+ private static Vector3 scaleInv;
+ private static Vector3 complexPan;
+ private static Vector3 complexScale;
private static Vector3 panLast;
private static Vector3 scaleLast;
private static float rotationLast;
+ private static Vector3 letterboxLast;
+ private static Vector3 complexPanLast;
+ private static Vector3 complexScaleLast;
private void Awake()
{
@@ -64,8 +80,11 @@ namespace HeavenStudio
Reset();
panLast = defaultPan;
+ letterboxLast = defaultLetterbox;
scaleLast = defaultScale;
rotationLast = defaultRotation;
+ complexPanLast = defaultComplexPan;
+ complexScaleLast = defaultComplexScale;
ToggleLetterboxBg(PersistentDataManager.gameSettings.letterboxBgEnable);
ToggleLetterboxGlow(PersistentDataManager.gameSettings.letterboxFxEnable);
@@ -78,26 +97,44 @@ namespace HeavenStudio
panEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "pan view" });
scaleEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scale view" });
rotationEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "rotate view" });
+ letterboxEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scale letterbox" });
+ complexPanEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "complex pan"});
+ complexScaleEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "complex scale" });
panLast = defaultPan;
+ letterboxLast = defaultLetterbox;
scaleLast = defaultScale;
rotationLast = defaultRotation;
-
+ complexPanLast = defaultComplexPan;
+ complexScaleLast = defaultComplexScale;
+
UpdatePan();
UpdateRotation();
UpdateScale();
+ UpdateLetterbox();
+ UpdateComplexPan();
+ UpdatecomplexScale();
}
// Update is called once per frame
void Update()
{
+ UpdateLetterbox();
UpdatePan();
UpdateRotation();
UpdateScale();
-
+ UpdateComplexPan();
+ UpdatecomplexScale();
+
canvas.localPosition = pan;
canvas.eulerAngles = new Vector3(0, 0, rotation);
- canvas.localScale = scale;
+ letterboxMask.localScale = letterbox;
+ scaleInv = scale;
+ scaleInv.x /= letterbox.x;
+ scaleInv.y /= letterbox.y;
+ scaleInv.z /= letterbox.z;
+ canvas.localScale = scaleInv;
+ viewportTexture.uvRect = new Rect(complexPan.x, complexPan.y, complexScale.x, complexScale.y);
}
private void UpdatePan()
@@ -199,11 +236,137 @@ namespace HeavenStudio
}
}
+ private void UpdateLetterbox()
+ {
+ foreach (var e in letterboxEvents)
+ {
+ float prog = Conductor.instance.GetPositionFromBeat(e.beat, e.length);
+ if (prog >= 0f)
+ {
+ Util.EasingFunction.Function func = Util.EasingFunction.GetEasingFunction((Util.EasingFunction.Ease) e["ease"]);
+ switch (e["axis"])
+ {
+ case (int) ViewAxis.X:
+ letterbox.x = func(letterboxLast.x, e["valA"], Mathf.Min(prog, 1f)) * AspectRatioWidth;
+ break;
+ case (int) ViewAxis.Y:
+ letterbox.y = func(letterboxLast.y, e["valB"], Mathf.Min(prog, 1f)) * AspectRatioHeight;
+ break;
+ default:
+ float dx = func(letterboxLast.x, e["valA"], Mathf.Min(prog, 1f)) * AspectRatioWidth;
+ float dy = func(letterboxLast.y, e["valB"], Mathf.Min(prog, 1f)) * AspectRatioHeight;
+ letterbox = new Vector3(dx, dy, 1);
+ break;
+ }
+ }
+ if (prog > 1f)
+ {
+ switch (e["axis"])
+ {
+ case (int) ViewAxis.X:
+ letterboxLast.x = e["valA"] * AspectRatioWidth;
+ break;
+ case (int) ViewAxis.Y:
+ letterboxLast.y = e["valB"] * AspectRatioHeight;
+ break;
+ default:
+ letterboxLast = new Vector3(e["valA"] * AspectRatioWidth, e["valB"] * AspectRatioHeight, 1);
+ break;
+ }
+ }
+ }
+ }
+
+ private void UpdateComplexPan()
+ {
+ foreach (var e in complexPanEvents)
+ {
+ float prog = Conductor.instance.GetPositionFromBeat(e.beat, e.length);
+ if (prog >= 0f)
+ {
+ Util.EasingFunction.Function func = Util.EasingFunction.GetEasingFunction((Util.EasingFunction.Ease) e["ease"]);
+ switch (e["axis"])
+ {
+ case (int) ViewAxis.X:
+ complexPan.x = func(complexPanLast.x, e["valA"], Mathf.Min(prog, 1f));
+ break;
+ case (int) ViewAxis.Y:
+ complexPan.y = func(complexPan.y, e["valB"], Mathf.Min(prog, 1f));
+ break;
+ default:
+ float dx = func(complexPanLast.x, e["valA"], Mathf.Min(prog, 1f));
+ float dy = func(complexPanLast.y, e["valB"], Mathf.Min(prog, 1f));
+ complexPan = new Vector3(dx, dy, 0);
+ break;
+ }
+ }
+ if (prog > 1f)
+ {
+ switch (e["axis"])
+ {
+ case (int) ViewAxis.X:
+ complexPanLast.x = e["valA"];
+ break;
+ case (int) ViewAxis.Y:
+ complexPanLast.y = e["valB"];
+ break;
+ default:
+ complexPanLast = new Vector3(e["valA"], e["valB"], 0);
+ break;
+ }
+ }
+ }
+ }
+
+ private void UpdatecomplexScale()
+ {
+ foreach (var e in complexScaleEvents)
+ {
+ float prog = Conductor.instance.GetPositionFromBeat(e.beat, e.length);
+ if (prog >= 0f)
+ {
+ Util.EasingFunction.Function func = Util.EasingFunction.GetEasingFunction((Util.EasingFunction.Ease) e["ease"]);
+ switch (e["axis"])
+ {
+ case (int) ViewAxis.X:
+ complexScale.x = func(complexScaleLast.x, e["valA"] * .01f, Mathf.Min(prog, 1f)) * AspectRatioWidth;
+ break;
+ case (int) ViewAxis.Y:
+ complexScale.y = func(complexScaleLast.y, e["valB"] * .01f, Mathf.Min(prog, 1f)) * AspectRatioHeight;
+ break;
+ default:
+ float dx = func(complexScaleLast.x, e["valA"] * .01f, Mathf.Min(prog, 1f)) * AspectRatioWidth;
+ float dy = func(complexScaleLast.y, e["valB"] * .01f, Mathf.Min(prog, 1f)) * AspectRatioHeight;
+ complexScale = new Vector3(dx, dy, 1);
+ break;
+ }
+ }
+ if (prog > 1f)
+ {
+ switch (e["axis"])
+ {
+ case (int) ViewAxis.X:
+ complexScaleLast.x = e["valA"] * .01f * AspectRatioWidth;
+ break;
+ case (int) ViewAxis.Y:
+ complexScaleLast.y = e["valB"] * .01f * AspectRatioHeight;
+ break;
+ default:
+ complexScaleLast = new Vector3(e["valA"] * .01f * AspectRatioWidth, e["valB"] * .01f * AspectRatioHeight, 1);
+ break;
+ }
+ }
+ }
+ }
+
public static void Reset()
{
pan = defaultPan;
scale = defaultScale;
rotation = defaultRotation;
+ letterbox = defaultLetterbox;
+ complexPan = defaultComplexPan;
+ complexScale = defaultComplexScale;
}
public void ToggleOverlayView(bool toggle)