Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 43 additions & 2 deletions Prowl.Runtime/Components/Physics/Colliders/MeshCollider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public sealed class MeshCollider : Collider
{
[SerializeField] private AssetRef<Mesh> mesh;
[SerializeField] private bool convex = false;
[SerializeField] private bool autoBake = true;

public AssetRef<Mesh> Mesh
{
Expand All @@ -46,10 +47,37 @@ public bool Convex
}
}

/// <summary>
/// When false, CreateShapes() uses the TriangleMesh supplied via SetTriangleMesh and skips
/// the main-thread BVH build. You must call SetTriangleMesh before assigning Mesh.
/// Default is true (auto-bake on the main thread, original behaviour).
/// </summary>
public bool AutoBake
{
get => autoBake;
set => autoBake = value;
}

// Cached convex hull shape and its tessellation for gizmo drawing — rebuilt when mesh or convex flag changes.
[SerializeIgnore] private ConvexHullShape? _cachedConvexShape;
[SerializeIgnore] private List<JTriangle>? _cachedHullTris;

// Pre-baked TriangleMesh (BVH) supplied via SetTriangleMesh before Mesh is assigned.
// Used by CreateShapes() when AutoBake = false to skip the main-thread BVH build.
[SerializeIgnore] private TriangleMesh? _prebakedTriangleMesh;

/// <summary>
/// Builds a Jitter2 TriangleMesh BVH from a Prowl Mesh. Safe to call from a background thread.
/// Pass the result to SetTriangleMesh before assigning Mesh when AutoBake = false.
/// </summary>
public static TriangleMesh BakeMesh(Mesh mesh) => new TriangleMesh(ToTriangleList(mesh), true);

/// <summary>
/// Supplies pre-baked collision data. Must be called before the Mesh property is set
/// (which triggers CreateShapes). Has no effect when AutoBake = true.
/// </summary>
public void SetTriangleMesh(TriangleMesh triMesh) => _prebakedTriangleMesh = triMesh;

public override RigidBodyShape[] CreateShapes()
{
var m = mesh.Res;
Expand Down Expand Up @@ -79,7 +107,21 @@ public override RigidBodyShape[] CreateShapes()
}
else
{
var triMesh = new TriangleMesh(triangles, true);
TriangleMesh triMesh;
if (_prebakedTriangleMesh is not null)
{
triMesh = _prebakedTriangleMesh;
}
else if (!AutoBake)
{
Debug.LogError("MeshCollider: AutoBake is false but SetTriangleMesh was not called before assigning Mesh.");
return null;
}
else
{
triMesh = new TriangleMesh(triangles, true);
}

var shapes = new TriangleShape[triangles.Count];
for (int i = 0; i < triangles.Count; i++)
shapes[i] = new TriangleShape(triMesh, i);
Expand All @@ -92,7 +134,6 @@ public override void OnValidate()
_cachedConvexShape = null;
_cachedHullTris = null;
base.OnValidate();
Debug.Log("OnInvalidate called");
}

public override void OnEnable()
Expand Down
Loading