group2 0.1.0
CSE 125 Group 2
Loading...
Searching...
No Matches
TriMeshCollision.hpp
Go to the documentation of this file.
1
9
10#pragma once
11
12#include "SweptCollision.hpp"
13
14#include <cstdint>
15#include <glm/glm.hpp>
16
17namespace physics
18{
19
26enum class TriRegion : uint8_t
27{
28 Face = 0,
29 Edge0 = 1,
30 Edge1 = 2,
31 Edge2 = 3,
32 Vert0 = 4,
33 Vert1 = 5,
34 Vert2 = 6,
35};
36
42void buildTriMeshBVH(WorldTriMesh& mesh);
43
66void weldTriMesh(WorldTriMesh& mesh, float coplanarTolerance = 0.0349065850f /* 2° */);
67
70{
71 uint32_t triangleCount{0};
74 uint32_t nonManifoldEdges{0};
75 uint32_t invalidIndices{0};
76
77 [[nodiscard]] bool valid() const noexcept
78 {
80 invalidIndices == 0;
81 }
82};
83
86{
87 uint32_t meshCount{0};
88 uint32_t invalidMeshCount{0};
89 uint32_t triangleCount{0};
92 uint32_t nonManifoldEdges{0};
93 uint32_t invalidIndices{0};
94
95 [[nodiscard]] bool valid() const noexcept
96 {
99 }
100};
101
109TriMeshValidationReport validateTriMesh(const WorldTriMesh& mesh, float positionEpsilon = 1e-4f);
110
112TriMeshValidationTotals validateTriMeshes(std::span<const WorldTriMesh> meshes, float positionEpsilon = 1e-4f);
113
116{
117 uint32_t meshCount{0};
118 uint32_t vertexCount{0};
119 uint32_t triangleCount{0};
120 uint32_t meshBvhNodeCount{0};
121 uint32_t meshBvhLeafCount{0};
122 uint32_t maxMeshBvhDepth{0};
123 uint32_t activeHalfEdges{0};
124 uint32_t weldedHalfEdges{0};
125 uint32_t boundaryHalfEdges{0};
126 uint32_t invalidNormals{0};
127};
128
133TriMeshCookStats collectTriMeshCookStats(std::span<const WorldTriMesh> meshes);
134
148HitResult sweepAABBvsTriMesh(glm::vec3 halfExtents, glm::vec3 start, glm::vec3 end, const WorldTriMesh& mesh);
149
173 glm::vec3& pos, glm::vec3& vel, glm::vec3 halfExtents, const WorldTriMesh& mesh, float pushback = 0.03125f);
174
180HitResult sweepCapsuleVsTriMesh(CapsuleShape capsule, glm::vec3 start, glm::vec3 end, const WorldTriMesh& mesh);
181
190DepenContact
191deepestCapsuleContactVsTriMesh(CapsuleShape capsule, glm::vec3 pos, glm::vec3 vel, const WorldTriMesh& mesh);
192
201{
202 bool found{false};
203 float dist{1e30f};
204 glm::vec3 pointOnSegment{0.0f};
205 glm::vec3 pointOnMesh{0.0f};
206 glm::vec3 normal{0.0f, 1.0f, 0.0f};
207 uint32_t triId{UINT32_MAX};
209};
210
222ClosestPointOnMeshResult closestPointOnMesh(glm::vec3 segA, glm::vec3 segB, float maxDist, const WorldTriMesh& mesh);
223
226ClosestPointOnMeshResult
227closestPointOnMesh(CapsuleShape capsule, glm::vec3 center, float maxDist, const WorldTriMesh& mesh);
228
234ClosestPointOnMeshResult closestPointOnMeshTriangle(
235 CapsuleShape capsule, glm::vec3 center, float maxDist, const WorldTriMesh& mesh, uint32_t triId);
236
245ClearanceResult
246clearanceCapsuleVsTriMesh(CapsuleShape capsule, glm::vec3 pos, float maxReach, const WorldTriMesh& mesh);
247
255GroundProbeResult groundProbeCapsuleVsTriMesh(
256 CapsuleShape capsule, glm::vec3 pos, float maxDistance, float minWalkableDot, const WorldTriMesh& mesh);
257
258} // namespace physics
Swept AABB and sphere collision queries against world geometry.
Pure physics math — no ECS types, no registry.
Definition BroadphaseTree.cpp:11
HitResult sweepCapsuleVsTriMesh(CapsuleShape capsule, glm::vec3 start, glm::vec3 end, const WorldTriMesh &mesh)
Sweep a capsule against a triangle mesh.
Definition TriMeshCollision.cpp:1597
GroundProbeResult groundProbeCapsuleVsTriMesh(CapsuleShape capsule, glm::vec3 pos, float maxDistance, float minWalkableDot, const WorldTriMesh &mesh)
Downward ground probe against walkable triangle faces only.
Definition TriMeshCollision.cpp:1876
TriRegion
Voronoi region of a triangle.
Definition TriMeshCollision.hpp:27
@ Vert2
Definition TriMeshCollision.hpp:34
@ Vert1
Definition TriMeshCollision.hpp:33
@ Edge0
Edge v0 → v1.
Definition TriMeshCollision.hpp:29
@ Vert0
Definition TriMeshCollision.hpp:32
@ Face
Definition TriMeshCollision.hpp:28
@ Edge2
Edge v2 → v0.
Definition TriMeshCollision.hpp:31
@ Edge1
Edge v1 → v2.
Definition TriMeshCollision.hpp:30
ClosestPointOnMeshResult closestPointOnMeshTriangle(CapsuleShape capsule, glm::vec3 center, float maxDist, const WorldTriMesh &mesh, uint32_t triId)
Closest point from a capsule axis to one specific cooked triangle.
Definition TriMeshCollision.cpp:1818
TriMeshValidationTotals validateTriMeshes(std::span< const WorldTriMesh > meshes, float positionEpsilon)
Validate every triangle mesh in an authored collision set.
Definition TriMeshCollision.cpp:1263
void buildTriMeshBVH(WorldTriMesh &mesh)
Build the BVH for a WorldTriMesh.
Definition TriMeshCollision.cpp:1032
ClosestPointOnMeshResult closestPointOnMesh(glm::vec3 segA, glm::vec3 segB, float maxDist, const WorldTriMesh &mesh)
Find the closest point on the mesh's surface to a query segment, considering only points within maxDi...
Definition TriMeshCollision.cpp:1726
TriMeshCookStats collectTriMeshCookStats(std::span< const WorldTriMesh > meshes)
Collect aggregate map-cooking diagnostics for already-cooked meshes.
Definition TriMeshCollision.cpp:1282
void depenetrateAABBvsTriMesh(glm::vec3 &pos, glm::vec3 &vel, glm::vec3 halfExtents, const WorldTriMesh &mesh, float pushback)
Push an AABB out of a triangle mesh using Voronoi-clipped face-normal MTVs.
Definition TriMeshCollision.cpp:1399
HitResult sweepAABBvsTriMesh(glm::vec3 halfExtents, glm::vec3 start, glm::vec3 end, const WorldTriMesh &mesh)
Sweep an AABB against a triangle mesh using Voronoi-clipped per-triangle tests.
Definition TriMeshCollision.cpp:1332
ClearanceResult clearanceCapsuleVsTriMesh(CapsuleShape capsule, glm::vec3 pos, float maxReach, const WorldTriMesh &mesh)
Capsule-vs-trimesh clearance.
Definition TriMeshCollision.cpp:1857
void weldTriMesh(WorldTriMesh &mesh, float coplanarTolerance)
Compute face normals + active edge / vertex flags for a triangle mesh.
Definition TriMeshCollision.cpp:1064
TriMeshValidationReport validateTriMesh(const WorldTriMesh &mesh, float positionEpsilon)
Validate authored collision mesh topology before/after cooking.
Definition TriMeshCollision.cpp:1199
DepenContact deepestCapsuleContactVsTriMesh(CapsuleShape capsule, glm::vec3 pos, glm::vec3 vel, const WorldTriMesh &mesh)
Single deepest surface contact of a capsule against any triangle in this mesh.
Definition TriMeshCollision.cpp:1658
Result of a closest-point-on-mesh query.
Definition TriMeshCollision.hpp:201
glm::vec3 pointOnSegment
Definition TriMeshCollision.hpp:204
bool found
Definition TriMeshCollision.hpp:202
glm::vec3 normal
Definition TriMeshCollision.hpp:206
uint32_t triId
Definition TriMeshCollision.hpp:207
float dist
Definition TriMeshCollision.hpp:203
TriRegion region
Definition TriMeshCollision.hpp:208
glm::vec3 pointOnMesh
Definition TriMeshCollision.hpp:205
Runtime/cook summary for authored static collision triangle meshes.
Definition TriMeshCollision.hpp:116
uint32_t triangleCount
Definition TriMeshCollision.hpp:119
uint32_t meshCount
Definition TriMeshCollision.hpp:117
uint32_t invalidNormals
Definition TriMeshCollision.hpp:126
uint32_t boundaryHalfEdges
Definition TriMeshCollision.hpp:125
uint32_t meshBvhNodeCount
Definition TriMeshCollision.hpp:120
uint32_t weldedHalfEdges
Definition TriMeshCollision.hpp:124
uint32_t meshBvhLeafCount
Definition TriMeshCollision.hpp:121
uint32_t vertexCount
Definition TriMeshCollision.hpp:118
uint32_t maxMeshBvhDepth
Definition TriMeshCollision.hpp:122
uint32_t activeHalfEdges
Definition TriMeshCollision.hpp:123
Map-cooking validation counters for authored collision triangle meshes.
Definition TriMeshCollision.hpp:70
uint32_t degenerateTriangles
Definition TriMeshCollision.hpp:72
bool valid() const noexcept
Definition TriMeshCollision.hpp:77
uint32_t duplicatedOppositeWindingFaces
Definition TriMeshCollision.hpp:73
uint32_t nonManifoldEdges
Definition TriMeshCollision.hpp:74
uint32_t triangleCount
Definition TriMeshCollision.hpp:71
uint32_t invalidIndices
Definition TriMeshCollision.hpp:75
Aggregate validation counters across a whole authored collision set.
Definition TriMeshCollision.hpp:86
uint32_t invalidMeshCount
Definition TriMeshCollision.hpp:88
uint32_t degenerateTriangles
Definition TriMeshCollision.hpp:90
uint32_t triangleCount
Definition TriMeshCollision.hpp:89
bool valid() const noexcept
Definition TriMeshCollision.hpp:95
uint32_t duplicatedOppositeWindingFaces
Definition TriMeshCollision.hpp:91
uint32_t nonManifoldEdges
Definition TriMeshCollision.hpp:92
uint32_t invalidIndices
Definition TriMeshCollision.hpp:93
uint32_t meshCount
Definition TriMeshCollision.hpp:87