more fixes

This commit is contained in:
Jan Racek
2026-03-28 01:32:36 +01:00
parent 13ed569eaf
commit a251eeaed5
13 changed files with 83 additions and 53 deletions

View File

@@ -18,7 +18,7 @@ namespace SplashEdit.RuntimeCode
/// At export time, the AudioClip is converted to SPU ADPCM and packed
/// into the splashpack for runtime loading.
/// </summary>
[AddComponentMenu("PSX/Audio Clip")]
[AddComponentMenu("PSX/PSX Audio Clip")]
[Icon("Packages/net.psxsplash.splashedit/Icons/PSXAudioClip.png")]
public class PSXAudioClip : MonoBehaviour
{

View File

@@ -14,25 +14,25 @@ namespace SplashEdit.RuntimeCode
[Header("Interaction Settings")]
[Tooltip("Distance within which the player can interact with this object")]
[SerializeField] private float interactionRadius = 2.0f;
[Tooltip("Button that triggers interaction (0-15, matches PS1 button mapping)")]
[SerializeField] private int interactButton = 5; // Default to Cross button
[SerializeField] private int interactButton = 14; // Default to Cross button
[Tooltip("Can this object be interacted with multiple times?")]
[SerializeField] private bool isRepeatable = true;
[Tooltip("Cooldown between interactions (in frames, 60 = 1 second at NTSC)")]
[SerializeField] private ushort cooldownFrames = 30;
[Tooltip("Show interaction prompt when in range (requires UI system)")]
[SerializeField] private bool showPrompt = true;
[Tooltip("Show a UI canvas when the player is in range")]
[SerializeField] private bool showPrompt = false;
[Tooltip("Name of the PSXCanvas to show when the player is in range")]
[SerializeField] private string promptCanvasName = "";
[Header("Advanced")]
[Tooltip("Require line-of-sight to player for interaction")]
[Tooltip("Require the player to be facing this object to interact")]
[SerializeField] private bool requireLineOfSight = false;
[Tooltip("Custom interaction point offset from object center")]
[SerializeField] private Vector3 interactionOffset = Vector3.zero;
// Public accessors for export
public float InteractionRadius => interactionRadius;
@@ -40,23 +40,19 @@ namespace SplashEdit.RuntimeCode
public bool IsRepeatable => isRepeatable;
public ushort CooldownFrames => cooldownFrames;
public bool ShowPrompt => showPrompt;
public string PromptCanvasName => promptCanvasName;
public bool RequireLineOfSight => requireLineOfSight;
public Vector3 InteractionOffset => interactionOffset;
private void OnDrawGizmosSelected()
{
// Draw interaction radius
Gizmos.color = new Color(1f, 1f, 0f, 0.3f); // Yellow, semi-transparent
Vector3 center = transform.position + interactionOffset;
Vector3 center = transform.position;
Gizmos.DrawWireSphere(center, interactionRadius);
// Draw filled sphere with lower alpha
Gizmos.color = new Color(1f, 1f, 0f, 0.1f);
Gizmos.DrawSphere(center, interactionRadius);
// Draw interaction point
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(center, 0.1f);
}
}
}

View File

@@ -311,7 +311,6 @@ namespace SplashEdit.RuntimeCode
atlases = _atlases,
interactables = _interactables,
audioClips = audioExports,
collisionExporter = _collisionExporter,
navRegionBuilder = _navRegionBuilder,
roomBuilder = _roomBuilder,
bvh = _bvh,

View File

@@ -22,7 +22,6 @@ namespace SplashEdit.RuntimeCode
public TextureAtlas[] atlases;
public PSXInteractable[] interactables;
public AudioClipExport[] audioClips;
public PSXCollisionExporter collisionExporter;
public PSXNavRegionBuilder navRegionBuilder;
public PSXRoomBuilder roomBuilder;
public BVH bvh;
@@ -169,8 +168,8 @@ namespace SplashEdit.RuntimeCode
writer.Write((ushort)scene.sceneType);
writer.Write((ushort)triggerBoxCount); // was pad0
writer.Write((ushort)scene.collisionExporter.MeshCount);
writer.Write((ushort)scene.collisionExporter.TriangleCount);
writer.Write((ushort)0); // collisionMeshCount (removed, kept for binary compat)
writer.Write((ushort)0); // collisionTriCount (removed, kept for binary compat)
writer.Write((ushort)scene.navRegionBuilder.RegionCount);
writer.Write((ushort)scene.navRegionBuilder.PortalCount);
@@ -342,7 +341,7 @@ namespace SplashEdit.RuntimeCode
scene.bvh.WriteToBinary(writer, gte);
// ──────────────────────────────────────────────────────
// Interactable components (24 bytes each)
// Interactable components (28 bytes each)
// ──────────────────────────────────────────────────────
AlignToFourBytes(writer);
foreach (PSXInteractable interactable in scene.interactables)
@@ -353,11 +352,6 @@ namespace SplashEdit.RuntimeCode
float radiusSq = interactable.InteractionRadius * interactable.InteractionRadius;
writer.Write(PSXTrig.ConvertWorldToFixed12(radiusSq / (gte * gte)));
Vector3 offset = interactable.InteractionOffset;
writer.Write(PSXTrig.ConvertWorldToFixed12(offset.x / gte));
writer.Write(PSXTrig.ConvertWorldToFixed12(-offset.y / gte));
writer.Write(PSXTrig.ConvertWorldToFixed12(offset.z / gte));
writer.Write((byte)interactable.InteractButton);
byte flags = 0;
if (interactable.IsRepeatable) flags |= 0x01;
@@ -368,15 +362,14 @@ namespace SplashEdit.RuntimeCode
writer.Write((ushort)0); // currentCooldown (runtime)
writer.Write((ushort)goIndex);
}
// ──────────────────────────────────────────────────────
// World collision soup (version 7+)
// ──────────────────────────────────────────────────────
if (scene.collisionExporter.MeshCount > 0)
{
AlignToFourBytes(writer);
scene.collisionExporter.WriteToBinary(writer, gte);
// Prompt canvas name (16 bytes, null-terminated, zero-padded)
string canvasName = interactable.PromptCanvasName ?? "";
byte[] nameBytes = new byte[16];
int len = System.Math.Min(canvasName.Length, 15);
for (int ci = 0; ci < len; ci++)
nameBytes[ci] = (byte)canvasName[ci];
writer.Write(nameBytes);
}
// ──────────────────────────────────────────────────────

View File

@@ -114,9 +114,6 @@ namespace SplashEdit.RuntimeCode
// ---- Interactable section ----
report.interactableBytes = (long)scene.interactables.Length * BytesPerInteractable;
// ---- Collision soup ----
report.collisionBytes = EstimateCollisionSize(scene.collisionExporter);
// ---- Nav region data ----
report.navRegionBytes = EstimateNavRegionSize(scene.navRegionBuilder);