pelican-engine 0.3.26 → 0.3.27

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.
package/AGENTS.md CHANGED
@@ -240,6 +240,8 @@ not mass-coupled with cloth velocity. The body receives no reaction when the
240
240
  option is omitted. Destroyed bodies are removed on the next automatic step.
241
241
  This is not complete cloth-rigid-body coupling.
242
242
 
243
+ Sampled planes use the triangle centroid for discrete surface projection; this is not continuous triangle-plane collision.
244
+
243
245
  New cloth also resolves detected sphere overlaps against triangle surface interiors
244
246
  using closest-point barycentric projection. `inspect(id).surfaceContacts` reports
245
247
  the triangle and barycentric position. `surfaceCollisions` defaults to true for new
package/distribution.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "format": "pelican.npm-distribution",
3
- "version": "0.3.26",
3
+ "version": "0.3.27",
4
4
  "files": {
5
- "AGENTS.md": "4c6f0e952979bad6e9562663f238608c5395aeff4fef723456ccfab0a5895029",
5
+ "AGENTS.md": "ea6e8d183ab104bfa3569ad56d3d86fce3503f14dcb94782ab7656ecc4f9c0cd",
6
6
  "CONTRIBUTING.md": "0ffad5d841d90f319fc50a75b81d3c0ad6dab8d5d9bec2846c65c7f8358d5a50",
7
7
  "docs/AI-WORKFLOW.md": "aa992686df93f791795f6f3fce01713d812eea6a1b9556f07411ac5847278efa",
8
- "docs/api/index.json": "c4bf7891a87db76cd52000b298f7092173967d94ed988d44939349953994e5ad",
9
- "docs/api/REFERENCE.md": "37a5d21b2699db53ffb9dd4121a21871a6bfebcb812643a34f6bfac180a2dd00",
8
+ "docs/api/index.json": "765c761b22408c49d2c949e66d6e4ff363c73242fac115cc78677cee7414b647",
9
+ "docs/api/REFERENCE.md": "5f3fb3e68148832e22db8fedd3b56febb1b6f65d28b80a46e4aaa85b1cea2694",
10
10
  "docs/ARCHITECTURE.md": "3184b73592d466390e7793b1cf39bbb80d6052b523fba7e7cb377b5207074627",
11
11
  "docs/assets/pelican-mark.svg": "407b10cd7e292ea83cf5dba4046fb2f01c7d566a14014c55deda3a2984562b4d",
12
12
  "docs/CAPABILITIES.md": "92950817497d8c63db07830db96dc93c877befa8d038320feed1ae1f1a053cb1",
@@ -14,14 +14,14 @@
14
14
  "docs/GETTING-STARTED.md": "5519ebe4e513e8ae4517c04948ee9dc70bcb1e3d04a65d468a6537c838502663",
15
15
  "docs/GRAPHICS-GUIDE.md": "e3d0f7df6189ca3f88d81af5ffaf393f5d6bf39b9e66167bb2f64b39194b514c",
16
16
  "docs/npm/DISTRIBUTION.md": "ff25e039921a85ba253c27608c77ed614a036117d7a04f908a78d1e3ed3f19ef",
17
- "docs/npm/GAME-AUTHOR.md": "4c6f0e952979bad6e9562663f238608c5395aeff4fef723456ccfab0a5895029",
17
+ "docs/npm/GAME-AUTHOR.md": "ea6e8d183ab104bfa3569ad56d3d86fce3503f14dcb94782ab7656ecc4f9c0cd",
18
18
  "docs/PELICAN-MIGRATION.md": "c5d6ab8e5186f4d36720a0a01d1a7e4157a5d386c5400e2db99571a7d10a1e49",
19
19
  "docs/PHYSICS-LIFECYCLE-ISSUE.md": "cc78917462de4e7e9b68e77c742192ce213b4be5b516d2ba943251fff46977ac",
20
20
  "docs/RENDER-BACKENDS.md": "d981ea94742a835d028db37d536fb7fba05102e37bc6274a37baf74f5034b954",
21
21
  "docs/ROADMAP.md": "29ac1c54f36064e23c17cfe7f549d6860889257a57d1227e322958aa9c281568",
22
- "docs/STATUS.md": "59757c00f4d36f8aa6403c3cc4eda6aaae5d9e34778fcf21eef305580a1a39d7",
22
+ "docs/STATUS.md": "68cd18f05dd092f7bf754e2298715058b5de4fd4cb563d4cbec6ba7fc48b5cfc",
23
23
  "docs/THIRD-PARTY-NOTICES.md": "58f9b72e2b4dfaaaf2a4c08b9bde9ecef3d2b7e7d65fccd782ed54f39fa76fdc",
24
- "engine.manifest.json": "761c952dd0ce338f25bd134d29b06c90f8a211cd0ed969f3460fef37ba6286fd",
24
+ "engine.manifest.json": "0dbddba801aec40154f08b9b458bc573a3546bcb7efea05228f65a096a1b323e",
25
25
  "lib/assets/audio.js": "6facdce4e053afd172af5b9407569b035169844ea17b49f93f8b67f72b78895f",
26
26
  "lib/assets/errors.js": "70572678655c6e53179d31920d71f29882d373a0e12d560220bb0fc2cd74f2cc",
27
27
  "lib/assets/glb.js": "b808479a36299c154db97f50c16863a3b5a2c61f725e66bf01d01a5f62a288a5",
@@ -125,10 +125,10 @@
125
125
  "lib/runtime/world.js": "c43621fbaca8bd2b0d6477a96e60e895312f0f7b1eb97614b6e4f9b716129ea1",
126
126
  "lib/schema/index.js": "594429eecb4494c4af2f3d04537be3211f2c9297a1fc555bbba5d028d8627965",
127
127
  "lib/sdk/graph-values.js": "a58c00f127cb82aba5fd2824981942844e06d9a59a88a05e35d1d3df2fc7ed2f",
128
- "lib/sdk/index.d.ts": "7dd24ae7f2348dd458c4b2b8509624b76a49da9877dc15e6cd126dc5f141a371",
129
- "lib/sdk/index.js": "35ba8ab8303efd309b404e6628915dc99c1d5f575a7598659d741165d09fee1a",
128
+ "lib/sdk/index.d.ts": "0dba735ca063a00b6f0a00abefa645085e0eaa2b12f98bc87d99e8b0a0525267",
129
+ "lib/sdk/index.js": "6ea78d93aa08f654c7a93a2273a796d52e6df99e19a8544de1a68e93fa493837",
130
130
  "lib/simulation/cloth-plugin.js": "f9e29445b40d2b072c9b7bf61570a52e0785a5f05a58f5cc152ceabd5533a10a",
131
- "lib/simulation/cloth.js": "2abe8005e23c7acdc3c307bdcfe56436f6006ae4bfa224fbd4229287085bb3f4",
131
+ "lib/simulation/cloth.js": "8914b77ad4af29ca0221edf6a9628f031b560475ee6d183ac915799a0c8347e1",
132
132
  "lib/simulation/rope-body-coupling.js": "70694b73d17c79f223803a51fbf4a4dae551b717cd29bbea1fa38386ac98d621",
133
133
  "lib/simulation/rope-plugin.js": "08c7c4800053b3e8f255b6dd5be2b532b8e259300666c31de5494d15704717d4",
134
134
  "lib/simulation/rope-self-collision.js": "4d8dc5d5a88f0ae0ad5463f553f49b2ad3c8c126b98344a0966f619635bdb17f",
@@ -203,7 +203,7 @@
203
203
  "licenses/undici-types/LICENSE": "a6db8096b2707bc0102d256917d4d33f298ba36d8c3f25de067a2b5bb379db27",
204
204
  "licenses/uniq/LICENSE": "e67aed7df22dc8031e4fcf5338fe91cb33e3817e5c58a99a2a2802eea9069791",
205
205
  "licenses/vite/LICENSE.md": "a22152baa1aef74402443008e767e7c689a524c0909d19b0431d97f5ab066a13",
206
- "package.json": "fb602ae870412b5c1406bebbc0de92c06d11619e27b81953f43f5a651ea3c1c8",
206
+ "package.json": "d555ef517ef262a51246caa3b32f548156f3895e5cd49754d9716ced4ca4ad16",
207
207
  "README.md": "ff25e039921a85ba253c27608c77ed614a036117d7a04f908a78d1e3ed3f19ef",
208
208
  "web/index.html": "d89d6a5b5be3beae3627a8ed506ac308b165d264fb8696be3afd79fcca2f26ee"
209
209
  }
package/docs/STATUS.md CHANGED
@@ -35,3 +35,5 @@
35
35
  - ?????????????????????????????????????????????????
36
36
 
37
37
  - ???????????? `bodyReactions`??????/????????????????????????????????????
38
+
39
+ - ??????????????????????????????????????????
@@ -1,4 +1,4 @@
1
- # pelican 0.3.26 API 索引
1
+ # pelican 0.3.27 API 索引
2
2
 
3
3
  Installed declarations: `lib/sdk/index.d.ts` (relative to the package root).
4
4
  The signatures below come from the same public SDK source as repository games.
@@ -11,7 +11,7 @@ Source-file paths and line numbers are build-time provenance only; TypeScript so
11
11
  来源:`packages/sdk/src/index.ts:2`
12
12
 
13
13
  ```ts
14
- SDK_VERSION = "0.3.26"
14
+ SDK_VERSION = "0.3.27"
15
15
  ```
16
16
 
17
17
  ## Vec2
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "format": "pelican.api-index",
3
3
  "version": 1,
4
- "engineVersion": "0.3.26",
4
+ "engineVersion": "0.3.27",
5
5
  "entry": "pelican-engine",
6
6
  "source": "packages/sdk/src/index.ts",
7
7
  "symbols": [
8
8
  {
9
9
  "name": "SDK_VERSION",
10
10
  "kind": "constant",
11
- "signature": "SDK_VERSION = \"0.3.26\"",
11
+ "signature": "SDK_VERSION = \"0.3.27\"",
12
12
  "line": 2
13
13
  },
14
14
  {
@@ -240,6 +240,8 @@ not mass-coupled with cloth velocity. The body receives no reaction when the
240
240
  option is omitted. Destroyed bodies are removed on the next automatic step.
241
241
  This is not complete cloth-rigid-body coupling.
242
242
 
243
+ Sampled planes use the triangle centroid for discrete surface projection; this is not continuous triangle-plane collision.
244
+
243
245
  New cloth also resolves detected sphere overlaps against triangle surface interiors
244
246
  using closest-point barycentric projection. `inspect(id).surfaceContacts` reports
245
247
  the triangle and barycentric position. `surfaceCollisions` defaults to true for new
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pelican-engine",
3
- "version": "0.3.26",
3
+ "version": "0.3.27",
4
4
  "milestone": "M3",
5
5
  "stage": "advanced-rendering-development",
6
6
  "license": "MIT",
@@ -1,5 +1,5 @@
1
1
  /** Pelican Engine public API. No renderer or GPU implementation types escape this module. */
2
- export declare const SDK_VERSION = "0.3.26";
2
+ export declare const SDK_VERSION = "0.3.27";
3
3
  export type Vec2 = readonly [number, number];
4
4
  export type Vec3 = readonly [number, number, number];
5
5
  export type Vec4 = readonly [number, number, number, number];
package/lib/sdk/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /** Pelican Engine public API. No renderer or GPU implementation types escape this module. */
2
- export const SDK_VERSION = "0.3.26";
2
+ export const SDK_VERSION = "0.3.27";
3
3
  export const SYSTEM_PHASES = [
4
4
  "input",
5
5
  "prePhysics",
@@ -299,12 +299,22 @@ export class ClothSolver {
299
299
  for (let triangleIndex = 0; triangleIndex < this.config.triangles.length; triangleIndex++) {
300
300
  const triangle = this.config.triangles[triangleIndex], a = positions[triangle[0]], b = positions[triangle[1]], c = positions[triangle[2]];
301
301
  for (const collider of this.colliders) {
302
- if (collider.kind !== "sphere")
303
- continue;
304
- const closest = closestTriangle(collider.center, a, b, c), delta = [closest.point[0] - collider.center[0], closest.point[1] - collider.center[1], closest.point[2] - collider.center[2]], length = Math.hypot(...delta), depth = collider.radius + radius - length;
302
+ let closest, normal, depth;
303
+ if (collider.kind === "sphere") {
304
+ closest = closestTriangle(collider.center, a, b, c);
305
+ const delta = [closest.point[0] - collider.center[0], closest.point[1] - collider.center[1], closest.point[2] - collider.center[2]], length = Math.hypot(...delta);
306
+ depth = collider.radius + radius - length;
307
+ normal = length < 1e-12 ? [0, 1, 0] : [delta[0] / length, delta[1] / length, delta[2] / length];
308
+ }
309
+ else {
310
+ const centroid = [(a[0] + b[0] + c[0]) / 3, (a[1] + b[1] + c[1]) / 3, (a[2] + b[2] + c[2]) / 3];
311
+ normal = collider.normal;
312
+ depth = collider.offset + radius - (centroid[0] * normal[0] + centroid[1] * normal[1] + centroid[2] * normal[2]);
313
+ closest = { point: centroid, barycentric: [1 / 3, 1 / 3, 1 / 3] };
314
+ }
305
315
  if (depth <= 0)
306
316
  continue;
307
- const normal = length < 1e-12 ? [0, 1, 0] : [delta[0] / length, delta[1] / length, delta[2] / length], weights = [this.anchors.has(triangle[0]) ? 0 : closest.barycentric[0], this.anchors.has(triangle[1]) ? 0 : closest.barycentric[1], this.anchors.has(triangle[2]) ? 0 : closest.barycentric[2]], denominator = weights.reduce((sum, value) => sum + value * value, 0);
317
+ const weights = [this.anchors.has(triangle[0]) ? 0 : closest.barycentric[0], this.anchors.has(triangle[1]) ? 0 : closest.barycentric[1], this.anchors.has(triangle[2]) ? 0 : closest.barycentric[2]], denominator = weights.reduce((sum, value) => sum + value * value, 0);
308
318
  if (denominator === 0)
309
319
  continue;
310
320
  const correction = depth / denominator;
@@ -430,7 +440,7 @@ export class ClothSolver {
430
440
  const surfaceKeys = new Set();
431
441
  if (!Array.isArray(surfaceContacts) || surfaceContacts.length > this.config.triangles.length * colliders.length || (!this.config.surfaceCollisions && surfaceContacts.length > 0) ||
432
442
  surfaceContacts.some(contact => !contact || contact.tick !== input.tick || !Number.isSafeInteger(contact.triangle) || contact.triangle < 0 || contact.triangle >= this.config.triangles.length ||
433
- !colliders.some(collider => collider.id === contact.colliderId && collider.kind === "sphere") || typeof contact.penetration !== "number" || !Number.isFinite(contact.penetration) || contact.penetration <= 0 ||
443
+ !colliders.some(collider => collider.id === contact.colliderId) || typeof contact.penetration !== "number" || !Number.isFinite(contact.penetration) || contact.penetration <= 0 ||
434
444
  !Array.isArray(contact.barycentric) || contact.barycentric.length !== 3 || !contact.barycentric.every(value => typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1) ||
435
445
  Math.abs(contact.barycentric[0] + contact.barycentric[1] + contact.barycentric[2] - 1) > 1e-5 || (contact.reactionImpulse === undefined) !== (contact.reactionAngularImpulse === undefined) || (contact.reactionImpulse !== undefined && (!vec(contact.reactionImpulse) || !vec(contact.reactionAngularImpulse)))))
436
446
  fail("CLOTH_SNAPSHOT", "invalid surface contact state");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pelican-engine",
3
- "version": "0.3.26",
3
+ "version": "0.3.27",
4
4
  "description": "Pelican Engine public SDK and offline development CLI",
5
5
  "type": "module",
6
6
  "license": "MIT",