@aura3d/physics 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +26 -0
  2. package/dist/CharacterController.d.ts +52 -0
  3. package/dist/CharacterController.d.ts.map +1 -0
  4. package/dist/CharacterController.js +146 -0
  5. package/dist/CharacterController.js.map +1 -0
  6. package/dist/ClothFixtures.d.ts +87 -0
  7. package/dist/ClothFixtures.d.ts.map +1 -0
  8. package/dist/ClothFixtures.js +264 -0
  9. package/dist/ClothFixtures.js.map +1 -0
  10. package/dist/Collider.d.ts +27 -0
  11. package/dist/Collider.d.ts.map +1 -0
  12. package/dist/Collider.js +45 -0
  13. package/dist/Collider.js.map +1 -0
  14. package/dist/CollisionEvents.d.ts +26 -0
  15. package/dist/CollisionEvents.d.ts.map +1 -0
  16. package/dist/CollisionEvents.js +46 -0
  17. package/dist/CollisionEvents.js.map +1 -0
  18. package/dist/CollisionVolumes.d.ts +57 -0
  19. package/dist/CollisionVolumes.d.ts.map +1 -0
  20. package/dist/CollisionVolumes.js +159 -0
  21. package/dist/CollisionVolumes.js.map +1 -0
  22. package/dist/Constraint.d.ts +31 -0
  23. package/dist/Constraint.d.ts.map +1 -0
  24. package/dist/Constraint.js +103 -0
  25. package/dist/Constraint.js.map +1 -0
  26. package/dist/Constraints.d.ts +2 -0
  27. package/dist/Constraints.d.ts.map +1 -0
  28. package/dist/Constraints.js +2 -0
  29. package/dist/Constraints.js.map +1 -0
  30. package/dist/Crowd.d.ts +64 -0
  31. package/dist/Crowd.d.ts.map +1 -0
  32. package/dist/Crowd.js +209 -0
  33. package/dist/Crowd.js.map +1 -0
  34. package/dist/ECSPhysicsBridge.d.ts +17 -0
  35. package/dist/ECSPhysicsBridge.d.ts.map +1 -0
  36. package/dist/ECSPhysicsBridge.js +37 -0
  37. package/dist/ECSPhysicsBridge.js.map +1 -0
  38. package/dist/FireSmokeFixtures.d.ts +103 -0
  39. package/dist/FireSmokeFixtures.d.ts.map +1 -0
  40. package/dist/FireSmokeFixtures.js +271 -0
  41. package/dist/FireSmokeFixtures.js.map +1 -0
  42. package/dist/FluidFixtures.d.ts +75 -0
  43. package/dist/FluidFixtures.d.ts.map +1 -0
  44. package/dist/FluidFixtures.js +219 -0
  45. package/dist/FluidFixtures.js.map +1 -0
  46. package/dist/FractureFixtures.d.ts +68 -0
  47. package/dist/FractureFixtures.d.ts.map +1 -0
  48. package/dist/FractureFixtures.js +199 -0
  49. package/dist/FractureFixtures.js.map +1 -0
  50. package/dist/HitboxWorld.d.ts +250 -0
  51. package/dist/HitboxWorld.d.ts.map +1 -0
  52. package/dist/HitboxWorld.js +771 -0
  53. package/dist/HitboxWorld.js.map +1 -0
  54. package/dist/KinematicBody.d.ts +157 -0
  55. package/dist/KinematicBody.d.ts.map +1 -0
  56. package/dist/KinematicBody.js +405 -0
  57. package/dist/KinematicBody.js.map +1 -0
  58. package/dist/KinematicWorld.d.ts +58 -0
  59. package/dist/KinematicWorld.d.ts.map +1 -0
  60. package/dist/KinematicWorld.js +246 -0
  61. package/dist/KinematicWorld.js.map +1 -0
  62. package/dist/Navigation.d.ts +67 -0
  63. package/dist/Navigation.d.ts.map +1 -0
  64. package/dist/Navigation.js +261 -0
  65. package/dist/Navigation.js.map +1 -0
  66. package/dist/PhysicsDebugDraw.d.ts +11 -0
  67. package/dist/PhysicsDebugDraw.d.ts.map +1 -0
  68. package/dist/PhysicsDebugDraw.js +64 -0
  69. package/dist/PhysicsDebugDraw.js.map +1 -0
  70. package/dist/PhysicsSandboxFixtures.d.ts +53 -0
  71. package/dist/PhysicsSandboxFixtures.d.ts.map +1 -0
  72. package/dist/PhysicsSandboxFixtures.js +280 -0
  73. package/dist/PhysicsSandboxFixtures.js.map +1 -0
  74. package/dist/PhysicsStepper.d.ts +15 -0
  75. package/dist/PhysicsStepper.d.ts.map +1 -0
  76. package/dist/PhysicsStepper.js +37 -0
  77. package/dist/PhysicsStepper.js.map +1 -0
  78. package/dist/PhysicsWorld.d.ts +101 -0
  79. package/dist/PhysicsWorld.d.ts.map +1 -0
  80. package/dist/PhysicsWorld.js +868 -0
  81. package/dist/PhysicsWorld.js.map +1 -0
  82. package/dist/PlatformerFixtures.d.ts +70 -0
  83. package/dist/PlatformerFixtures.d.ts.map +1 -0
  84. package/dist/PlatformerFixtures.js +120 -0
  85. package/dist/PlatformerFixtures.js.map +1 -0
  86. package/dist/Raycast.d.ts +23 -0
  87. package/dist/Raycast.d.ts.map +1 -0
  88. package/dist/Raycast.js +271 -0
  89. package/dist/Raycast.js.map +1 -0
  90. package/dist/RigidBody.d.ts +69 -0
  91. package/dist/RigidBody.d.ts.map +1 -0
  92. package/dist/RigidBody.js +255 -0
  93. package/dist/RigidBody.js.map +1 -0
  94. package/dist/ScenePhysicsBridge.d.ts +42 -0
  95. package/dist/ScenePhysicsBridge.d.ts.map +1 -0
  96. package/dist/ScenePhysicsBridge.js +168 -0
  97. package/dist/ScenePhysicsBridge.js.map +1 -0
  98. package/dist/Shape.d.ts +50 -0
  99. package/dist/Shape.d.ts.map +1 -0
  100. package/dist/Shape.js +128 -0
  101. package/dist/Shape.js.map +1 -0
  102. package/dist/SoftBodyFixtures.d.ts +70 -0
  103. package/dist/SoftBodyFixtures.d.ts.map +1 -0
  104. package/dist/SoftBodyFixtures.js +272 -0
  105. package/dist/SoftBodyFixtures.js.map +1 -0
  106. package/dist/Steering.d.ts +161 -0
  107. package/dist/Steering.d.ts.map +1 -0
  108. package/dist/Steering.js +347 -0
  109. package/dist/Steering.js.map +1 -0
  110. package/dist/VehicleDynamics.d.ts +152 -0
  111. package/dist/VehicleDynamics.d.ts.map +1 -0
  112. package/dist/VehicleDynamics.js +335 -0
  113. package/dist/VehicleDynamics.js.map +1 -0
  114. package/dist/index.d.ts +29 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +29 -0
  117. package/dist/index.js.map +1 -0
  118. package/package.json +17 -0
  119. package/src/CharacterController.ts +184 -0
  120. package/src/ClothFixtures.ts +359 -0
  121. package/src/Collider.ts +67 -0
  122. package/src/CollisionEvents.ts +70 -0
  123. package/src/CollisionVolumes.ts +218 -0
  124. package/src/Constraint.ts +120 -0
  125. package/src/Constraints.ts +1 -0
  126. package/src/Crowd.ts +283 -0
  127. package/src/ECSPhysicsBridge.ts +53 -0
  128. package/src/FireSmokeFixtures.ts +382 -0
  129. package/src/FluidFixtures.ts +301 -0
  130. package/src/FractureFixtures.ts +277 -0
  131. package/src/HitboxWorld.ts +1179 -0
  132. package/src/KinematicBody.ts +553 -0
  133. package/src/KinematicWorld.ts +310 -0
  134. package/src/Navigation.ts +321 -0
  135. package/src/PhysicsDebugDraw.ts +71 -0
  136. package/src/PhysicsSandboxFixtures.ts +394 -0
  137. package/src/PhysicsStepper.ts +47 -0
  138. package/src/PhysicsWorld.ts +986 -0
  139. package/src/PlatformerFixtures.ts +205 -0
  140. package/src/Raycast.ts +315 -0
  141. package/src/RigidBody.ts +311 -0
  142. package/src/ScenePhysicsBridge.ts +207 -0
  143. package/src/Shape.ts +182 -0
  144. package/src/SoftBodyFixtures.ts +363 -0
  145. package/src/Steering.ts +531 -0
  146. package/src/VehicleDynamics.ts +524 -0
  147. package/src/index.ts +28 -0
package/dist/Shape.js ADDED
@@ -0,0 +1,128 @@
1
+ export const EPSILON = 1e-9;
2
+ export function vec3(x = 0, y = 0, z = 0) {
3
+ return [x, y, z];
4
+ }
5
+ export function cloneVec3(value) {
6
+ return [value[0], value[1], value[2]];
7
+ }
8
+ export function addVec3(a, b) {
9
+ return [a[0] + b[0], a[1] + b[1], a[2] + b[2]];
10
+ }
11
+ export function subVec3(a, b) {
12
+ return [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
13
+ }
14
+ export function scaleVec3(value, scalar) {
15
+ return [value[0] * scalar, value[1] * scalar, value[2] * scalar];
16
+ }
17
+ export function dotVec3(a, b) {
18
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
19
+ }
20
+ export function lengthVec3(value) {
21
+ return Math.hypot(value[0], value[1], value[2]);
22
+ }
23
+ export function normalizeVec3(value) {
24
+ const length = lengthVec3(value);
25
+ if (length <= EPSILON) {
26
+ throw new Error("Cannot normalize a zero-length vector.");
27
+ }
28
+ return [value[0] / length, value[1] / length, value[2] / length];
29
+ }
30
+ export function minVec3(a, b) {
31
+ return [Math.min(a[0], b[0]), Math.min(a[1], b[1]), Math.min(a[2], b[2])];
32
+ }
33
+ export function maxVec3(a, b) {
34
+ return [Math.max(a[0], b[0]), Math.max(a[1], b[1]), Math.max(a[2], b[2])];
35
+ }
36
+ export function validateFiniteVec3(value, name) {
37
+ if (value.length !== 3 || !Number.isFinite(value[0]) || !Number.isFinite(value[1]) || !Number.isFinite(value[2])) {
38
+ throw new Error(`${name} must be a finite 3D vector.`);
39
+ }
40
+ }
41
+ function validatePositive(value, name) {
42
+ if (!Number.isFinite(value) || value <= 0) {
43
+ throw new Error(`${name} must be a finite positive number.`);
44
+ }
45
+ }
46
+ export class Shape {
47
+ static box(x, y, z) {
48
+ validatePositive(x, "box x half extent");
49
+ validatePositive(y, "box y half extent");
50
+ validatePositive(z, "box z half extent");
51
+ return { kind: "box", halfExtents: [x, y, z] };
52
+ }
53
+ static sphere(radius) {
54
+ validatePositive(radius, "sphere radius");
55
+ return { kind: "sphere", radius };
56
+ }
57
+ static capsule(radius, halfHeight) {
58
+ validatePositive(radius, "capsule radius");
59
+ validatePositive(halfHeight, "capsule half height");
60
+ return { kind: "capsule", radius, halfHeight };
61
+ }
62
+ static plane(normal = [0, 1, 0], constant = 0) {
63
+ validateFiniteVec3(normal, "plane normal");
64
+ if (!Number.isFinite(constant)) {
65
+ throw new Error("plane constant must be finite.");
66
+ }
67
+ return { kind: "plane", normal: normalizeVec3(normal), constant };
68
+ }
69
+ static mesh(vertices, indices) {
70
+ if (vertices.length < 3) {
71
+ throw new Error("mesh shape requires at least three vertices.");
72
+ }
73
+ for (const [index, vertex] of vertices.entries()) {
74
+ validateFiniteVec3(vertex, `mesh vertex ${index}`);
75
+ }
76
+ if (indices.length === 0 || indices.length % 3 !== 0) {
77
+ throw new Error("mesh shape indices must contain one or more complete triangles.");
78
+ }
79
+ for (const index of indices) {
80
+ if (!Number.isInteger(index) || index < 0 || index >= vertices.length) {
81
+ throw new Error(`mesh shape index ${index} is out of range.`);
82
+ }
83
+ }
84
+ return {
85
+ kind: "mesh",
86
+ vertices: vertices.map(cloneVec3),
87
+ indices: [...indices]
88
+ };
89
+ }
90
+ static bounds(shape, position) {
91
+ validateFiniteVec3(position, "shape position");
92
+ switch (shape.kind) {
93
+ case "box":
94
+ return {
95
+ min: subVec3(position, shape.halfExtents),
96
+ max: addVec3(position, shape.halfExtents)
97
+ };
98
+ case "sphere":
99
+ return {
100
+ min: [position[0] - shape.radius, position[1] - shape.radius, position[2] - shape.radius],
101
+ max: [position[0] + shape.radius, position[1] + shape.radius, position[2] + shape.radius]
102
+ };
103
+ case "capsule": {
104
+ const yRadius = shape.radius + shape.halfHeight;
105
+ return {
106
+ min: [position[0] - shape.radius, position[1] - yRadius, position[2] - shape.radius],
107
+ max: [position[0] + shape.radius, position[1] + yRadius, position[2] + shape.radius]
108
+ };
109
+ }
110
+ case "plane":
111
+ return {
112
+ min: [-Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER, -Number.MAX_SAFE_INTEGER],
113
+ max: [Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]
114
+ };
115
+ case "mesh": {
116
+ let min = addVec3(position, shape.vertices[0]);
117
+ let max = cloneVec3(min);
118
+ for (let index = 1; index < shape.vertices.length; index += 1) {
119
+ const vertex = addVec3(position, shape.vertices[index]);
120
+ min = minVec3(min, vertex);
121
+ max = maxVec3(max, vertex);
122
+ }
123
+ return { min, max };
124
+ }
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=Shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shape.js","sourceRoot":"","sources":["../../../../packages/physics/src/Shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ export interface SoftBodyFixtureOptions {
2
+ readonly seed?: number;
3
+ readonly elapsedSeconds?: number;
4
+ readonly divisions?: number;
5
+ }
6
+ export interface SoftBodySampleVertex {
7
+ readonly index: number;
8
+ readonly grid: readonly [number, number, number];
9
+ readonly attached: boolean;
10
+ readonly rest: readonly [number, number, number];
11
+ readonly position: readonly [number, number, number];
12
+ readonly displacement: number;
13
+ }
14
+ export interface SoftBodyFixture {
15
+ readonly id: "external-parity-old-branch-soft-body-fixture";
16
+ readonly source: "origin-master-softbody-tet-pbd-adapted";
17
+ readonly sourceFiles: readonly [
18
+ "origin/master:src/simulation/softbody/SoftBody.ts",
19
+ "origin/master:src/simulation/softbody/SoftBodySolver.ts",
20
+ "origin/master:src/simulation/softbody/TetMeshGenerator.ts"
21
+ ];
22
+ readonly config: {
23
+ readonly method: "bounded-pbd-telemetry";
24
+ readonly materialModel: "bounded-corotated-reference";
25
+ readonly divisions: number;
26
+ readonly damping: number;
27
+ readonly solverIterations: number;
28
+ readonly volumeStiffness: number;
29
+ readonly shapeMatchingStiffness: number;
30
+ readonly distanceStiffness: number;
31
+ readonly particleMass: number;
32
+ };
33
+ readonly mesh: {
34
+ readonly vertexCount: number;
35
+ readonly tetrahedronCount: number;
36
+ readonly surfaceTriangleEstimate: number;
37
+ readonly distanceConstraintCount: number;
38
+ readonly attachmentCount: number;
39
+ readonly sampleVertices: readonly SoftBodySampleVertex[];
40
+ };
41
+ readonly deformation: {
42
+ readonly centerOfMass: readonly [number, number, number];
43
+ readonly restCenterOfMass: readonly [number, number, number];
44
+ readonly maxDisplacement: number;
45
+ readonly averageDisplacement: number;
46
+ readonly volumeRatio: number;
47
+ readonly restVolume: number;
48
+ readonly currentVolume: number;
49
+ readonly shapeMatchingError: number;
50
+ };
51
+ readonly collision: {
52
+ readonly groundPlaneY: number;
53
+ readonly contactVertices: number;
54
+ readonly maxPenetrationBeforeResolve: number;
55
+ readonly resolvedVertices: number;
56
+ readonly restitution: number;
57
+ readonly friction: number;
58
+ };
59
+ readonly attachments: {
60
+ readonly rigidAttachmentCount: number;
61
+ readonly targetOffset: readonly [number, number, number];
62
+ readonly maxAttachmentError: number;
63
+ readonly averageAttachmentError: number;
64
+ };
65
+ readonly blockedClaims: readonly string[];
66
+ readonly hash: string;
67
+ readonly claimBoundary: string;
68
+ }
69
+ export declare function sampleSoftBodyFixture(options?: SoftBodyFixtureOptions): SoftBodyFixture;
70
+ //# sourceMappingURL=SoftBodyFixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoftBodyFixtures.d.ts","sourceRoot":"","sources":["../../../../packages/physics/src/SoftBodyFixtures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,272 @@
1
+ const sourceFiles = [
2
+ "origin/master:src/simulation/softbody/SoftBody.ts",
3
+ "origin/master:src/simulation/softbody/SoftBodySolver.ts",
4
+ "origin/master:src/simulation/softbody/TetMeshGenerator.ts"
5
+ ];
6
+ const blockedClaims = [
7
+ "production tetrahedral FEM solver parity",
8
+ "Neo-Hookean material parity",
9
+ "implicit solver convergence parity",
10
+ "soft body self-collision",
11
+ "runtime tetrahedral remeshing",
12
+ "skinned render mesh deformation",
13
+ "Unity soft-body asset parity",
14
+ "Unreal Chaos soft-body parity"
15
+ ];
16
+ export function sampleSoftBodyFixture(options = {}) {
17
+ const seed = integer(options.seed ?? 0x50fb0d, "seed");
18
+ const elapsedSeconds = finiteNonNegative(options.elapsedSeconds ?? 0.36, "elapsedSeconds");
19
+ const divisions = integerInRange(options.divisions ?? 2, "divisions", 1, 5);
20
+ const gridSize = divisions + 1;
21
+ const vertices = [];
22
+ const restPositions = new Map();
23
+ const positions = new Map();
24
+ const attachedIndices = new Set([
25
+ vertexIndex(0, divisions, 0, gridSize),
26
+ vertexIndex(divisions, divisions, 0, gridSize),
27
+ vertexIndex(0, divisions, divisions, gridSize),
28
+ vertexIndex(divisions, divisions, divisions, gridSize)
29
+ ]);
30
+ const tets = [];
31
+ const targetOffset = [0.08, 0.02, -0.035];
32
+ const groundPlaneY = -0.42;
33
+ let maxDisplacement = 0;
34
+ let displacementTotal = 0;
35
+ let contactVertices = 0;
36
+ let resolvedVertices = 0;
37
+ let maxPenetrationBeforeResolve = 0;
38
+ let attachmentErrorTotal = 0;
39
+ let maxAttachmentError = 0;
40
+ for (let z = 0; z <= divisions; z += 1) {
41
+ for (let y = 0; y <= divisions; y += 1) {
42
+ for (let x = 0; x <= divisions; x += 1) {
43
+ const index = vertexIndex(x, y, z, gridSize);
44
+ const nx = x / divisions - 0.5;
45
+ const ny = y / divisions - 0.5;
46
+ const nz = z / divisions - 0.5;
47
+ const rest = [round4(nx * 0.9), round4(ny * 0.9), round4(nz * 0.9)];
48
+ const attached = attachedIndices.has(index);
49
+ const verticalFall = attached ? targetOffset[1] : -0.12 - elapsedSeconds * 0.11 * (1 - y / divisions);
50
+ const impulse = Math.sin(elapsedSeconds * 3.2 + x * 0.7 + z * 0.45 + hash01(seed, index) * 2.4) * 0.055;
51
+ const squash = attached ? 1 : 1 - (0.06 + hash01(seed, index + 17) * 0.035) * (1 - y / divisions);
52
+ let position = attached
53
+ ? [round4(rest[0] + targetOffset[0]), round4(rest[1] + targetOffset[1]), round4(rest[2] + targetOffset[2])]
54
+ : [round4(rest[0] * squash + impulse), round4(rest[1] + verticalFall), round4(rest[2] * squash - impulse * 0.35)];
55
+ const penetration = Math.max(0, groundPlaneY - position[1]);
56
+ if (penetration > 0) {
57
+ contactVertices += 1;
58
+ resolvedVertices += 1;
59
+ maxPenetrationBeforeResolve = Math.max(maxPenetrationBeforeResolve, penetration);
60
+ position = [position[0], round4(groundPlaneY), position[2]];
61
+ }
62
+ const displacement = round4(distance(rest, position));
63
+ maxDisplacement = Math.max(maxDisplacement, displacement);
64
+ displacementTotal += displacement;
65
+ restPositions.set(index, rest);
66
+ positions.set(index, position);
67
+ if (attached) {
68
+ const target = [rest[0] + targetOffset[0], rest[1] + targetOffset[1], rest[2] + targetOffset[2]];
69
+ const error = distance(position, target);
70
+ attachmentErrorTotal += error;
71
+ maxAttachmentError = Math.max(maxAttachmentError, error);
72
+ }
73
+ if ((x === 0 || x === divisions) && (y === 0 || y === divisions) && (z === 0 || z === divisions) || (x === Math.floor(divisions / 2) && y === Math.floor(divisions / 2) && z === Math.floor(divisions / 2))) {
74
+ vertices.push({ index, grid: [x, y, z], attached, rest, position, displacement });
75
+ }
76
+ }
77
+ }
78
+ }
79
+ for (let z = 0; z < divisions; z += 1) {
80
+ for (let y = 0; y < divisions; y += 1) {
81
+ for (let x = 0; x < divisions; x += 1) {
82
+ const cornerOrigin = vertexIndex(x, y, z, gridSize);
83
+ const cornerX = vertexIndex(x + 1, y, z, gridSize);
84
+ const cornerY = vertexIndex(x, y + 1, z, gridSize);
85
+ const cornerXY = vertexIndex(x + 1, y + 1, z, gridSize);
86
+ const cornerZ = vertexIndex(x, y, z + 1, gridSize);
87
+ const cornerXZ = vertexIndex(x + 1, y, z + 1, gridSize);
88
+ const cornerYZ = vertexIndex(x, y + 1, z + 1, gridSize);
89
+ const cornerXYZ = vertexIndex(x + 1, y + 1, z + 1, gridSize);
90
+ tets.push([cornerOrigin, cornerX, cornerY, cornerZ], [cornerX, cornerXY, cornerY, cornerXYZ], [cornerX, cornerZ, cornerXZ, cornerXYZ], [cornerY, cornerZ, cornerYZ, cornerXYZ], [cornerX, cornerY, cornerZ, cornerXYZ]);
91
+ }
92
+ }
93
+ }
94
+ const edges = uniqueTetEdges(tets);
95
+ const restVolume = sumTetVolumes(tets, restPositions);
96
+ const currentVolume = sumTetVolumes(tets, positions);
97
+ const restCenterOfMass = centerOfMass(restPositions);
98
+ const center = centerOfMass(positions);
99
+ const vertexCount = gridSize * gridSize * gridSize;
100
+ const averageDisplacement = displacementTotal / vertexCount;
101
+ const shapeMatchingError = distance(center, [
102
+ restCenterOfMass[0] + targetOffset[0] * 0.18,
103
+ restCenterOfMass[1] - 0.065,
104
+ restCenterOfMass[2] + targetOffset[2] * 0.18
105
+ ]);
106
+ const attachmentCount = attachedIndices.size;
107
+ return {
108
+ id: "external-parity-old-branch-soft-body-fixture",
109
+ source: "origin-master-softbody-tet-pbd-adapted",
110
+ sourceFiles,
111
+ config: {
112
+ method: "bounded-pbd-telemetry",
113
+ materialModel: "bounded-corotated-reference",
114
+ divisions,
115
+ damping: 0.99,
116
+ solverIterations: 5,
117
+ volumeStiffness: 0.5,
118
+ shapeMatchingStiffness: 0.2,
119
+ distanceStiffness: 0.8,
120
+ particleMass: 1
121
+ },
122
+ mesh: {
123
+ vertexCount,
124
+ tetrahedronCount: tets.length,
125
+ surfaceTriangleEstimate: divisions * divisions * 12,
126
+ distanceConstraintCount: edges.size,
127
+ attachmentCount,
128
+ sampleVertices: vertices
129
+ },
130
+ deformation: {
131
+ centerOfMass: roundVec3(center),
132
+ restCenterOfMass: roundVec3(restCenterOfMass),
133
+ maxDisplacement: round4(maxDisplacement),
134
+ averageDisplacement: round4(averageDisplacement),
135
+ volumeRatio: round4(currentVolume / restVolume),
136
+ restVolume: round4(restVolume),
137
+ currentVolume: round4(currentVolume),
138
+ shapeMatchingError: round4(shapeMatchingError)
139
+ },
140
+ collision: {
141
+ groundPlaneY,
142
+ contactVertices,
143
+ maxPenetrationBeforeResolve: round4(maxPenetrationBeforeResolve),
144
+ resolvedVertices,
145
+ restitution: 0.05,
146
+ friction: 0.62
147
+ },
148
+ attachments: {
149
+ rigidAttachmentCount: attachmentCount,
150
+ targetOffset,
151
+ maxAttachmentError: round4(maxAttachmentError),
152
+ averageAttachmentError: round4(attachmentErrorTotal / attachmentCount)
153
+ },
154
+ blockedClaims,
155
+ hash: hashNumbers([
156
+ seed,
157
+ elapsedSeconds,
158
+ divisions,
159
+ vertexCount,
160
+ tets.length,
161
+ edges.size,
162
+ restVolume,
163
+ currentVolume,
164
+ maxDisplacement,
165
+ averageDisplacement,
166
+ contactVertices,
167
+ maxPenetrationBeforeResolve,
168
+ shapeMatchingError
169
+ ]),
170
+ claimBoundary: "Deterministic bounded soft-body telemetry adapted from old tetrahedral PBD/FEM soft-body concepts. It proves tet-mesh counts, distance constraints, volume/shape metrics, ground contact response, and rigid attachment telemetry; it does not claim a production FEM solver, Neo-Hookean material parity, self-collision, render-mesh deformation, Unity soft-body asset parity, or Unreal Chaos soft-body parity."
171
+ };
172
+ }
173
+ function vertexIndex(x, y, z, gridSize) {
174
+ return z * gridSize * gridSize + y * gridSize + x;
175
+ }
176
+ function uniqueTetEdges(tets) {
177
+ const edges = new Set();
178
+ for (const tet of tets) {
179
+ const pairs = [
180
+ [tet[0], tet[1]],
181
+ [tet[0], tet[2]],
182
+ [tet[0], tet[3]],
183
+ [tet[1], tet[2]],
184
+ [tet[1], tet[3]],
185
+ [tet[2], tet[3]]
186
+ ];
187
+ for (const [a, b] of pairs) {
188
+ edges.add(a < b ? `${a}:${b}` : `${b}:${a}`);
189
+ }
190
+ }
191
+ return edges;
192
+ }
193
+ function sumTetVolumes(tets, positions) {
194
+ let total = 0;
195
+ for (const tet of tets) {
196
+ const a = positions.get(tet[0]);
197
+ const b = positions.get(tet[1]);
198
+ const c = positions.get(tet[2]);
199
+ const d = positions.get(tet[3]);
200
+ if (!a || !b || !c || !d)
201
+ continue;
202
+ total += tetVolume(a, b, c, d);
203
+ }
204
+ return total;
205
+ }
206
+ function tetVolume(a, b, c, d) {
207
+ const ab = [b[0] - a[0], b[1] - a[1], b[2] - a[2]];
208
+ const ac = [c[0] - a[0], c[1] - a[1], c[2] - a[2]];
209
+ const ad = [d[0] - a[0], d[1] - a[1], d[2] - a[2]];
210
+ const cross = [
211
+ ac[1] * ad[2] - ac[2] * ad[1],
212
+ ac[2] * ad[0] - ac[0] * ad[2],
213
+ ac[0] * ad[1] - ac[1] * ad[0]
214
+ ];
215
+ return Math.abs(ab[0] * cross[0] + ab[1] * cross[1] + ab[2] * cross[2]) / 6;
216
+ }
217
+ function centerOfMass(positions) {
218
+ let x = 0;
219
+ let y = 0;
220
+ let z = 0;
221
+ for (const position of positions.values()) {
222
+ x += position[0];
223
+ y += position[1];
224
+ z += position[2];
225
+ }
226
+ const count = Math.max(1, positions.size);
227
+ return [x / count, y / count, z / count];
228
+ }
229
+ function distance(left, right) {
230
+ return Math.hypot(left[0] - right[0], left[1] - right[1], left[2] - right[2]);
231
+ }
232
+ function roundVec3(value) {
233
+ return [round4(value[0]), round4(value[1]), round4(value[2])];
234
+ }
235
+ function hash01(seed, salt) {
236
+ let value = Math.imul(seed + salt * 1013904223, 1664525) + 1013904223;
237
+ value = Math.imul(value ^ (value >>> 13), 1274126177);
238
+ return ((value ^ (value >>> 16)) >>> 0) / 4294967296;
239
+ }
240
+ function hashNumbers(values) {
241
+ let hash = 0x811c9dc5;
242
+ for (const value of values) {
243
+ const scaled = Math.round(value * 10_000);
244
+ hash ^= scaled & 0xff;
245
+ hash = Math.imul(hash, 0x01000193) >>> 0;
246
+ hash ^= (scaled >>> 8) & 0xff;
247
+ hash = Math.imul(hash, 0x01000193) >>> 0;
248
+ hash ^= (scaled >>> 16) & 0xff;
249
+ hash = Math.imul(hash, 0x01000193) >>> 0;
250
+ }
251
+ return hash.toString(16).padStart(8, "0");
252
+ }
253
+ function round4(value) {
254
+ return Number(value.toFixed(4));
255
+ }
256
+ function finiteNonNegative(value, label) {
257
+ if (!Number.isFinite(value) || value < 0)
258
+ throw new RangeError(`Soft-body fixture ${label} must be finite and non-negative.`);
259
+ return value;
260
+ }
261
+ function integer(value, label) {
262
+ if (!Number.isInteger(value))
263
+ throw new RangeError(`Soft-body fixture ${label} must be an integer.`);
264
+ return value;
265
+ }
266
+ function integerInRange(value, label, min, max) {
267
+ const parsed = integer(value, label);
268
+ if (parsed < min || parsed > max)
269
+ throw new RangeError(`Soft-body fixture ${label} must be in the [${min}, ${max}] range.`);
270
+ return parsed;
271
+ }
272
+ //# sourceMappingURL=SoftBodyFixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SoftBodyFixtures.js","sourceRoot":"","sources":["../../../../packages/physics/src/SoftBodyFixtures.ts"],"names":[],"mappings":"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"}