Broken UI system
This commit is contained in:
@@ -87,6 +87,8 @@ namespace SplashEdit.RuntimeCode
|
||||
// Collect scene references for validation
|
||||
var exporterNames = new HashSet<string>();
|
||||
var audioNames = new HashSet<string>();
|
||||
var canvasNames = new HashSet<string>();
|
||||
var elementNames = new Dictionary<string, HashSet<string>>(); // canvas → element names
|
||||
var exporters = Object.FindObjectsByType<PSXObjectExporter>(FindObjectsSortMode.None);
|
||||
foreach (var e in exporters)
|
||||
exporterNames.Add(e.gameObject.name);
|
||||
@@ -94,6 +96,26 @@ namespace SplashEdit.RuntimeCode
|
||||
foreach (var a in audioSources)
|
||||
if (!string.IsNullOrEmpty(a.ClipName))
|
||||
audioNames.Add(a.ClipName);
|
||||
var canvases = Object.FindObjectsByType<PSXCanvas>(FindObjectsSortMode.None);
|
||||
foreach (var c in canvases)
|
||||
{
|
||||
string cName = c.CanvasName ?? "";
|
||||
if (!string.IsNullOrEmpty(cName))
|
||||
{
|
||||
canvasNames.Add(cName);
|
||||
if (!elementNames.ContainsKey(cName))
|
||||
elementNames[cName] = new HashSet<string>();
|
||||
// Gather all UI element names under this canvas
|
||||
foreach (var box in c.GetComponentsInChildren<PSXUIBox>())
|
||||
if (!string.IsNullOrEmpty(box.ElementName)) elementNames[cName].Add(box.ElementName);
|
||||
foreach (var txt in c.GetComponentsInChildren<PSXUIText>())
|
||||
if (!string.IsNullOrEmpty(txt.ElementName)) elementNames[cName].Add(txt.ElementName);
|
||||
foreach (var bar in c.GetComponentsInChildren<PSXUIProgressBar>())
|
||||
if (!string.IsNullOrEmpty(bar.ElementName)) elementNames[cName].Add(bar.ElementName);
|
||||
foreach (var img in c.GetComponentsInChildren<PSXUIImage>())
|
||||
if (!string.IsNullOrEmpty(img.ElementName)) elementNames[cName].Add(img.ElementName);
|
||||
}
|
||||
}
|
||||
|
||||
// ── Tracks ──
|
||||
EditorGUILayout.Space(8);
|
||||
@@ -114,13 +136,39 @@ namespace SplashEdit.RuntimeCode
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
bool isCameraTrack = track.TrackType == PSXTrackType.CameraPosition || track.TrackType == PSXTrackType.CameraRotation;
|
||||
EditorGUI.BeginDisabledGroup(isCameraTrack);
|
||||
track.ObjectName = EditorGUILayout.TextField("Object Name", isCameraTrack ? "(camera)" : track.ObjectName);
|
||||
EditorGUI.EndDisabledGroup();
|
||||
bool isUITrack = track.IsUITrack;
|
||||
bool isUIElementTrack = track.IsUIElementTrack;
|
||||
|
||||
// Validation
|
||||
if (!isCameraTrack && !string.IsNullOrEmpty(track.ObjectName) && !exporterNames.Contains(track.ObjectName))
|
||||
EditorGUILayout.HelpBox($"No PSXObjectExporter found for '{track.ObjectName}' in scene.", MessageType.Error);
|
||||
if (isCameraTrack)
|
||||
{
|
||||
EditorGUI.BeginDisabledGroup(true);
|
||||
EditorGUILayout.TextField("Target", "(camera)");
|
||||
EditorGUI.EndDisabledGroup();
|
||||
}
|
||||
else if (isUITrack)
|
||||
{
|
||||
track.UICanvasName = EditorGUILayout.TextField("Canvas Name", track.UICanvasName);
|
||||
if (!string.IsNullOrEmpty(track.UICanvasName) && !canvasNames.Contains(track.UICanvasName))
|
||||
EditorGUILayout.HelpBox($"No PSXCanvas with name '{track.UICanvasName}' in scene.", MessageType.Error);
|
||||
|
||||
if (isUIElementTrack)
|
||||
{
|
||||
track.UIElementName = EditorGUILayout.TextField("Element Name", track.UIElementName);
|
||||
if (!string.IsNullOrEmpty(track.UICanvasName) && !string.IsNullOrEmpty(track.UIElementName))
|
||||
{
|
||||
if (elementNames.TryGetValue(track.UICanvasName, out var elNames) && !elNames.Contains(track.UIElementName))
|
||||
EditorGUILayout.HelpBox($"No UI element '{track.UIElementName}' found under canvas '{track.UICanvasName}'.", MessageType.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
track.ObjectName = EditorGUILayout.TextField("Object Name", track.ObjectName);
|
||||
|
||||
// Validation
|
||||
if (!string.IsNullOrEmpty(track.ObjectName) && !exporterNames.Contains(track.ObjectName))
|
||||
EditorGUILayout.HelpBox($"No PSXObjectExporter found for '{track.ObjectName}' in scene.", MessageType.Error);
|
||||
}
|
||||
|
||||
// ── Keyframes ──
|
||||
if (track.Keyframes == null) track.Keyframes = new List<PSXKeyframe>();
|
||||
@@ -152,7 +200,7 @@ namespace SplashEdit.RuntimeCode
|
||||
else Debug.LogWarning("No active Scene View.");
|
||||
}
|
||||
}
|
||||
else if (track.TrackType == PSXTrackType.ObjectPosition || track.TrackType == PSXTrackType.ObjectRotationY)
|
||||
else if (!isUITrack && (track.TrackType == PSXTrackType.ObjectPosition || track.TrackType == PSXTrackType.ObjectRotationY))
|
||||
{
|
||||
if (GUILayout.Button("From Sel.", GUILayout.Width(70)))
|
||||
{
|
||||
@@ -173,13 +221,46 @@ namespace SplashEdit.RuntimeCode
|
||||
switch (track.TrackType)
|
||||
{
|
||||
case PSXTrackType.ObjectActive:
|
||||
bool active = EditorGUILayout.Toggle("Active", kf.Value.x > 0.5f);
|
||||
case PSXTrackType.UICanvasVisible:
|
||||
case PSXTrackType.UIElementVisible:
|
||||
{
|
||||
string label = track.TrackType == PSXTrackType.ObjectActive ? "Active" : "Visible";
|
||||
bool active = EditorGUILayout.Toggle(label, kf.Value.x > 0.5f);
|
||||
kf.Value = new Vector3(active ? 1f : 0f, 0, 0);
|
||||
break;
|
||||
}
|
||||
case PSXTrackType.ObjectRotationY:
|
||||
{
|
||||
float yRot = EditorGUILayout.FloatField("Y\u00b0", kf.Value.y);
|
||||
kf.Value = new Vector3(0, yRot, 0);
|
||||
break;
|
||||
}
|
||||
case PSXTrackType.UIProgress:
|
||||
{
|
||||
float progress = EditorGUILayout.Slider("Progress %", kf.Value.x, 0f, 100f);
|
||||
kf.Value = new Vector3(progress, 0, 0);
|
||||
break;
|
||||
}
|
||||
case PSXTrackType.UIPosition:
|
||||
{
|
||||
Vector2 pos = EditorGUILayout.Vector2Field("Position (px)", new Vector2(kf.Value.x, kf.Value.y));
|
||||
kf.Value = new Vector3(pos.x, pos.y, 0);
|
||||
break;
|
||||
}
|
||||
case PSXTrackType.UIColor:
|
||||
{
|
||||
// Show as RGB 0-255 integers
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
EditorGUILayout.LabelField("R", GUILayout.Width(14));
|
||||
float r = EditorGUILayout.IntField(Mathf.Clamp(Mathf.RoundToInt(kf.Value.x), 0, 255), GUILayout.Width(40));
|
||||
EditorGUILayout.LabelField("G", GUILayout.Width(14));
|
||||
float g = EditorGUILayout.IntField(Mathf.Clamp(Mathf.RoundToInt(kf.Value.y), 0, 255), GUILayout.Width(40));
|
||||
EditorGUILayout.LabelField("B", GUILayout.Width(14));
|
||||
float b = EditorGUILayout.IntField(Mathf.Clamp(Mathf.RoundToInt(kf.Value.z), 0, 255), GUILayout.Width(40));
|
||||
EditorGUILayout.EndHorizontal();
|
||||
kf.Value = new Vector3(r, g, b);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
kf.Value = EditorGUILayout.Vector3Field("Value", kf.Value);
|
||||
break;
|
||||
@@ -216,7 +297,7 @@ namespace SplashEdit.RuntimeCode
|
||||
track.Keyframes.Add(new PSXKeyframe { Frame = frame, Value = val });
|
||||
}
|
||||
}
|
||||
else if (track.TrackType == PSXTrackType.ObjectPosition || track.TrackType == PSXTrackType.ObjectRotationY)
|
||||
else if (!isUITrack && (track.TrackType == PSXTrackType.ObjectPosition || track.TrackType == PSXTrackType.ObjectRotationY))
|
||||
{
|
||||
if (GUILayout.Button("+ from Selected", GUILayout.Width(120)))
|
||||
{
|
||||
@@ -511,6 +592,15 @@ namespace SplashEdit.RuntimeCode
|
||||
if (_savedObjectActive.ContainsKey(track.ObjectName ?? ""))
|
||||
initialVal = new Vector3(_savedObjectActive[track.ObjectName] ? 1f : 0f, 0, 0);
|
||||
break;
|
||||
// UI tracks: initial values stay zero (no scene preview state to capture)
|
||||
case PSXTrackType.UICanvasVisible:
|
||||
case PSXTrackType.UIElementVisible:
|
||||
initialVal = new Vector3(1f, 0, 0); // assume visible by default
|
||||
break;
|
||||
case PSXTrackType.UIProgress:
|
||||
case PSXTrackType.UIPosition:
|
||||
case PSXTrackType.UIColor:
|
||||
break; // zero is fine
|
||||
}
|
||||
|
||||
Vector3 val = EvaluateTrack(track, frame, initialVal);
|
||||
@@ -541,6 +631,13 @@ namespace SplashEdit.RuntimeCode
|
||||
if (go != null) go.SetActive(val.x > 0.5f);
|
||||
break;
|
||||
}
|
||||
// UI tracks: no scene preview, values are applied on PS1 only
|
||||
case PSXTrackType.UICanvasVisible:
|
||||
case PSXTrackType.UIElementVisible:
|
||||
case PSXTrackType.UIProgress:
|
||||
case PSXTrackType.UIPosition:
|
||||
case PSXTrackType.UIColor:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -582,10 +679,11 @@ namespace SplashEdit.RuntimeCode
|
||||
if (track.Keyframes == null || track.Keyframes.Count == 0)
|
||||
return Vector3.zero;
|
||||
|
||||
// ObjectActive always uses step interpolation regardless of InterpMode
|
||||
if (track.TrackType == PSXTrackType.ObjectActive)
|
||||
// Step interpolation tracks: ObjectActive, UICanvasVisible, UIElementVisible
|
||||
if (track.TrackType == PSXTrackType.ObjectActive ||
|
||||
track.TrackType == PSXTrackType.UICanvasVisible ||
|
||||
track.TrackType == PSXTrackType.UIElementVisible)
|
||||
{
|
||||
// Use initial state if before first keyframe
|
||||
if (track.Keyframes.Count > 0 && track.Keyframes[0].Frame > 0 && frame < track.Keyframes[0].Frame)
|
||||
return initialValue;
|
||||
return EvaluateStep(track.Keyframes, frame);
|
||||
|
||||
Reference in New Issue
Block a user