@plasius/gpu-physics 0.1.0 → 0.1.2

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/CHANGELOG.md CHANGED
@@ -5,3 +5,62 @@
5
5
  - Initial public release of `@plasius/gpu-physics`.
6
6
  - Added `PhysicsRoot`, `StaticRigidBody`, `DynamicRigidBody`, and `KinematicRigidBody` bridge components.
7
7
  - Added baseline tests and migration documentation.
8
+
9
+ ## [Unreleased]
10
+
11
+ - **Added**
12
+ - (placeholder)
13
+
14
+ - **Changed**
15
+ - (placeholder)
16
+
17
+ - **Fixed**
18
+ - (placeholder)
19
+
20
+ - **Security**
21
+ - (placeholder)
22
+
23
+ ## [0.1.2] - 2026-03-01
24
+
25
+ - **Added**
26
+ - `lint`, `typecheck`, and security audit scripts for local and CI enforcement.
27
+
28
+ - **Changed**
29
+ - CI now fails early on lint/typecheck/runtime dependency audit before build/test.
30
+
31
+ - **Fixed**
32
+ - Pack-check regex cleanup to remove an unnecessary path escape.
33
+
34
+ - **Security**
35
+ - Runtime dependency vulnerability checks are now enforced in CI.
36
+
37
+ ## [0.1.1] - 2026-02-28
38
+
39
+ - **Added**
40
+ - (placeholder)
41
+
42
+ - **Changed**
43
+ - Removed direct `@react-three/rapier` bridge dependency and switched to framework-neutral physics boundary components.
44
+ - Removed legacy Three.js stack dev dependencies from the package.
45
+
46
+ - **Fixed**
47
+ - (placeholder)
48
+
49
+ - **Security**
50
+ - (placeholder)
51
+
52
+ ## [0.1.0] - 2026-02-11
53
+
54
+ - **Added**
55
+ - Initial release.
56
+
57
+ - **Changed**
58
+ - (placeholder)
59
+
60
+ - **Fixed**
61
+ - (placeholder)
62
+
63
+ - **Security**
64
+ - (placeholder)
65
+ [0.1.1]: https://github.com/Plasius-LTD/gpu-physics/releases/tag/v0.1.1
66
+ [0.1.2]: https://github.com/Plasius-LTD/gpu-physics/releases/tag/v0.1.2
package/README.md CHANGED
@@ -1,10 +1,18 @@
1
1
  # @plasius/gpu-physics
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@plasius/gpu-physics.svg)](https://www.npmjs.com/package/@plasius/gpu-physics)
4
+ [![Build Status](https://img.shields.io/github/actions/workflow/status/Plasius-LTD/gpu-physics/ci.yml?branch=main&label=build&style=flat)](https://github.com/Plasius-LTD/gpu-physics/actions/workflows/ci.yml)
5
+ [![coverage](https://img.shields.io/codecov/c/github/Plasius-LTD/gpu-physics)](https://codecov.io/gh/Plasius-LTD/gpu-physics)
6
+ [![License](https://img.shields.io/github/license/Plasius-LTD/gpu-physics)](./LICENSE)
7
+ [![Code of Conduct](https://img.shields.io/badge/code%20of%20conduct-yes-blue.svg)](./CODE_OF_CONDUCT.md)
8
+ [![Security Policy](https://img.shields.io/badge/security%20policy-yes-orange.svg)](./SECURITY.md)
9
+ [![Changelog](https://img.shields.io/badge/changelog-md-blue.svg)](./CHANGELOG.md)
10
+
3
11
  Framework-ready physics bridge package for Plasius GPU migration paths.
4
12
 
5
13
  ## Why
6
14
 
7
- `@plasius/gpu-physics` provides a stable physics API surface while renderer code migrates away from direct legacy integration points. It currently wraps proven runtime primitives and keeps call sites isolated.
15
+ `@plasius/gpu-physics` provides a stable physics API surface while renderer code migrates away from direct legacy integration points. It is framework-neutral and keeps call sites isolated from any specific scene runtime.
8
16
 
9
17
  ## Install
10
18
 
@@ -32,6 +40,16 @@ import { PhysicsRoot, StaticRigidBody } from "@plasius/gpu-physics";
32
40
  - `DynamicRigidBody`
33
41
  - `KinematicRigidBody`
34
42
 
43
+ ## Development Checks
44
+
45
+ ```sh
46
+ npm run lint
47
+ npm run typecheck
48
+ npm run test:coverage
49
+ npm run build
50
+ npm run pack:check
51
+ ```
52
+
35
53
  ## License
36
54
 
37
55
  Apache-2.0
package/dist/index.cjs CHANGED
@@ -37,51 +37,66 @@ __export(index_exports, {
37
37
  });
38
38
  module.exports = __toCommonJS(index_exports);
39
39
  var import_react = __toESM(require("react"), 1);
40
- var import_rapier = require("@react-three/rapier");
41
40
  var DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);
41
+ var PhysicsContext = import_react.default.createContext({
42
+ gravity: DEFAULT_GRAVITY,
43
+ options: {}
44
+ });
45
+ var RigidBodyContext = import_react.default.createContext({
46
+ type: "fixed",
47
+ colliders: "trimesh",
48
+ options: {}
49
+ });
42
50
  function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {
43
- return import_react.default.createElement(import_rapier.Physics, { gravity, ...props }, children);
51
+ const value = import_react.default.useMemo(
52
+ () => ({
53
+ gravity,
54
+ options: props
55
+ }),
56
+ [gravity, props]
57
+ );
58
+ return import_react.default.createElement(PhysicsContext.Provider, { value }, children);
44
59
  }
45
60
  function StaticRigidBody({
46
61
  colliders = "trimesh",
47
62
  children,
48
63
  ...props
49
64
  }) {
50
- return import_react.default.createElement(
51
- import_rapier.RigidBody,
52
- {
65
+ const value = import_react.default.useMemo(
66
+ () => ({
53
67
  type: "fixed",
54
68
  colliders,
55
- ...props
56
- },
57
- children
69
+ options: props
70
+ }),
71
+ [colliders, props]
58
72
  );
73
+ return import_react.default.createElement(RigidBodyContext.Provider, { value }, children);
59
74
  }
60
75
  function DynamicRigidBody({ colliders = "hull", children, ...props }) {
61
- return import_react.default.createElement(
62
- import_rapier.RigidBody,
63
- {
76
+ const value = import_react.default.useMemo(
77
+ () => ({
64
78
  type: "dynamic",
65
79
  colliders,
66
- ...props
67
- },
68
- children
80
+ options: props
81
+ }),
82
+ [colliders, props]
69
83
  );
84
+ return import_react.default.createElement(RigidBodyContext.Provider, { value }, children);
70
85
  }
71
86
  function KinematicRigidBody({
72
87
  colliders = "hull",
73
88
  children,
74
89
  ...props
75
90
  }) {
76
- return import_react.default.createElement(
77
- import_rapier.RigidBody,
78
- {
91
+ const value = import_react.default.useMemo(
92
+ () => ({
79
93
  type: "kinematicPosition",
80
94
  colliders,
81
- ...props
82
- },
83
- children
95
+ options: props
96
+ }),
97
+ [colliders, props]
84
98
  );
99
+ return import_react.default.createElement(RigidBodyContext.Provider, { value }, children);
85
100
  }
86
101
  // Annotate the CommonJS export names for ESM import in node:
87
102
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"sourcesContent":["import React from \"react\";\nimport {\n Physics as RapierPhysics,\n RigidBody as RapierRigidBody,\n} from \"@react-three/rapier\";\n\nexport const DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);\n\nexport function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {\n return React.createElement(RapierPhysics, { gravity, ...props }, children);\n}\n\nexport function StaticRigidBody({\n colliders = \"trimesh\",\n children,\n ...props\n}) {\n return React.createElement(\n RapierRigidBody,\n {\n type: \"fixed\",\n colliders,\n ...props,\n },\n children\n );\n}\n\nexport function DynamicRigidBody({ colliders = \"hull\", children, ...props }) {\n return React.createElement(\n RapierRigidBody,\n {\n type: \"dynamic\",\n colliders,\n ...props,\n },\n children\n );\n}\n\nexport function KinematicRigidBody({\n colliders = \"hull\",\n children,\n ...props\n}) {\n return React.createElement(\n RapierRigidBody,\n {\n type: \"kinematicPosition\",\n colliders,\n ...props,\n },\n children\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAClB,oBAGO;AAEA,IAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAEnD,SAAS,YAAY,EAAE,UAAU,iBAAiB,UAAU,GAAG,MAAM,GAAG;AAC7E,SAAO,aAAAA,QAAM,cAAc,cAAAC,SAAe,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ;AAC3E;AAEO,SAAS,gBAAgB;AAAA,EAC9B,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,SAAO,aAAAD,QAAM;AAAA,IACX,cAAAE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,EAAE,YAAY,QAAQ,UAAU,GAAG,MAAM,GAAG;AAC3E,SAAO,aAAAF,QAAM;AAAA,IACX,cAAAE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB;AAAA,EACjC,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,SAAO,aAAAF,QAAM;AAAA,IACX,cAAAE;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":["React","RapierPhysics","RapierRigidBody"]}
1
+ {"version":3,"sources":["../src/index.js"],"sourcesContent":["import React from \"react\";\n\nexport const DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);\n\nconst PhysicsContext = React.createContext({\n gravity: DEFAULT_GRAVITY,\n options: {},\n});\n\nconst RigidBodyContext = React.createContext({\n type: \"fixed\",\n colliders: \"trimesh\",\n options: {},\n});\n\nexport function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {\n const value = React.useMemo(\n () => ({\n gravity,\n options: props,\n }),\n [gravity, props]\n );\n return React.createElement(PhysicsContext.Provider, { value }, children);\n}\n\nexport function StaticRigidBody({\n colliders = \"trimesh\",\n children,\n ...props\n}) {\n const value = React.useMemo(\n () => ({\n type: \"fixed\",\n colliders,\n options: props,\n }),\n [colliders, props]\n );\n return React.createElement(RigidBodyContext.Provider, { value }, children);\n}\n\nexport function DynamicRigidBody({ colliders = \"hull\", children, ...props }) {\n const value = React.useMemo(\n () => ({\n type: \"dynamic\",\n colliders,\n options: props,\n }),\n [colliders, props]\n );\n return React.createElement(RigidBodyContext.Provider, { value }, children);\n}\n\nexport function KinematicRigidBody({\n colliders = \"hull\",\n children,\n ...props\n}) {\n const value = React.useMemo(\n () => ({\n type: \"kinematicPosition\",\n colliders,\n options: props,\n }),\n [colliders, props]\n );\n return React.createElement(RigidBodyContext.Provider, { value }, children);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAEX,IAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAE1D,IAAM,iBAAiB,aAAAA,QAAM,cAAc;AAAA,EACzC,SAAS;AAAA,EACT,SAAS,CAAC;AACZ,CAAC;AAED,IAAM,mBAAmB,aAAAA,QAAM,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS,CAAC;AACZ,CAAC;AAEM,SAAS,YAAY,EAAE,UAAU,iBAAiB,UAAU,GAAG,MAAM,GAAG;AAC7E,QAAM,QAAQ,aAAAA,QAAM;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AACA,SAAO,aAAAA,QAAM,cAAc,eAAe,UAAU,EAAE,MAAM,GAAG,QAAQ;AACzE;AAEO,SAAS,gBAAgB;AAAA,EAC9B,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,QAAM,QAAQ,aAAAA,QAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,aAAAA,QAAM,cAAc,iBAAiB,UAAU,EAAE,MAAM,GAAG,QAAQ;AAC3E;AAEO,SAAS,iBAAiB,EAAE,YAAY,QAAQ,UAAU,GAAG,MAAM,GAAG;AAC3E,QAAM,QAAQ,aAAAA,QAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,aAAAA,QAAM,cAAc,iBAAiB,UAAU,EAAE,MAAM,GAAG,QAAQ;AAC3E;AAEO,SAAS,mBAAmB;AAAA,EACjC,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,QAAM,QAAQ,aAAAA,QAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,aAAAA,QAAM,cAAc,iBAAiB,UAAU,EAAE,MAAM,GAAG,QAAQ;AAC3E;","names":["React"]}
package/dist/index.js CHANGED
@@ -1,53 +1,65 @@
1
1
  // src/index.js
2
2
  import React from "react";
3
- import {
4
- Physics as RapierPhysics,
5
- RigidBody as RapierRigidBody
6
- } from "@react-three/rapier";
7
3
  var DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);
4
+ var PhysicsContext = React.createContext({
5
+ gravity: DEFAULT_GRAVITY,
6
+ options: {}
7
+ });
8
+ var RigidBodyContext = React.createContext({
9
+ type: "fixed",
10
+ colliders: "trimesh",
11
+ options: {}
12
+ });
8
13
  function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {
9
- return React.createElement(RapierPhysics, { gravity, ...props }, children);
14
+ const value = React.useMemo(
15
+ () => ({
16
+ gravity,
17
+ options: props
18
+ }),
19
+ [gravity, props]
20
+ );
21
+ return React.createElement(PhysicsContext.Provider, { value }, children);
10
22
  }
11
23
  function StaticRigidBody({
12
24
  colliders = "trimesh",
13
25
  children,
14
26
  ...props
15
27
  }) {
16
- return React.createElement(
17
- RapierRigidBody,
18
- {
28
+ const value = React.useMemo(
29
+ () => ({
19
30
  type: "fixed",
20
31
  colliders,
21
- ...props
22
- },
23
- children
32
+ options: props
33
+ }),
34
+ [colliders, props]
24
35
  );
36
+ return React.createElement(RigidBodyContext.Provider, { value }, children);
25
37
  }
26
38
  function DynamicRigidBody({ colliders = "hull", children, ...props }) {
27
- return React.createElement(
28
- RapierRigidBody,
29
- {
39
+ const value = React.useMemo(
40
+ () => ({
30
41
  type: "dynamic",
31
42
  colliders,
32
- ...props
33
- },
34
- children
43
+ options: props
44
+ }),
45
+ [colliders, props]
35
46
  );
47
+ return React.createElement(RigidBodyContext.Provider, { value }, children);
36
48
  }
37
49
  function KinematicRigidBody({
38
50
  colliders = "hull",
39
51
  children,
40
52
  ...props
41
53
  }) {
42
- return React.createElement(
43
- RapierRigidBody,
44
- {
54
+ const value = React.useMemo(
55
+ () => ({
45
56
  type: "kinematicPosition",
46
57
  colliders,
47
- ...props
48
- },
49
- children
58
+ options: props
59
+ }),
60
+ [colliders, props]
50
61
  );
62
+ return React.createElement(RigidBodyContext.Provider, { value }, children);
51
63
  }
52
64
  export {
53
65
  DEFAULT_GRAVITY,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.js"],"sourcesContent":["import React from \"react\";\nimport {\n Physics as RapierPhysics,\n RigidBody as RapierRigidBody,\n} from \"@react-three/rapier\";\n\nexport const DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);\n\nexport function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {\n return React.createElement(RapierPhysics, { gravity, ...props }, children);\n}\n\nexport function StaticRigidBody({\n colliders = \"trimesh\",\n children,\n ...props\n}) {\n return React.createElement(\n RapierRigidBody,\n {\n type: \"fixed\",\n colliders,\n ...props,\n },\n children\n );\n}\n\nexport function DynamicRigidBody({ colliders = \"hull\", children, ...props }) {\n return React.createElement(\n RapierRigidBody,\n {\n type: \"dynamic\",\n colliders,\n ...props,\n },\n children\n );\n}\n\nexport function KinematicRigidBody({\n colliders = \"hull\",\n children,\n ...props\n}) {\n return React.createElement(\n RapierRigidBody,\n {\n type: \"kinematicPosition\",\n colliders,\n ...props,\n },\n children\n );\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAClB;AAAA,EACE,WAAW;AAAA,EACX,aAAa;AAAA,OACR;AAEA,IAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAEnD,SAAS,YAAY,EAAE,UAAU,iBAAiB,UAAU,GAAG,MAAM,GAAG;AAC7E,SAAO,MAAM,cAAc,eAAe,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ;AAC3E;AAEO,SAAS,gBAAgB;AAAA,EAC9B,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,SAAO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,EAAE,YAAY,QAAQ,UAAU,GAAG,MAAM,GAAG;AAC3E,SAAO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB;AAAA,EACjC,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,SAAO,MAAM;AAAA,IACX;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN;AAAA,MACA,GAAG;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.js"],"sourcesContent":["import React from \"react\";\n\nexport const DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);\n\nconst PhysicsContext = React.createContext({\n gravity: DEFAULT_GRAVITY,\n options: {},\n});\n\nconst RigidBodyContext = React.createContext({\n type: \"fixed\",\n colliders: \"trimesh\",\n options: {},\n});\n\nexport function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {\n const value = React.useMemo(\n () => ({\n gravity,\n options: props,\n }),\n [gravity, props]\n );\n return React.createElement(PhysicsContext.Provider, { value }, children);\n}\n\nexport function StaticRigidBody({\n colliders = \"trimesh\",\n children,\n ...props\n}) {\n const value = React.useMemo(\n () => ({\n type: \"fixed\",\n colliders,\n options: props,\n }),\n [colliders, props]\n );\n return React.createElement(RigidBodyContext.Provider, { value }, children);\n}\n\nexport function DynamicRigidBody({ colliders = \"hull\", children, ...props }) {\n const value = React.useMemo(\n () => ({\n type: \"dynamic\",\n colliders,\n options: props,\n }),\n [colliders, props]\n );\n return React.createElement(RigidBodyContext.Provider, { value }, children);\n}\n\nexport function KinematicRigidBody({\n colliders = \"hull\",\n children,\n ...props\n}) {\n const value = React.useMemo(\n () => ({\n type: \"kinematicPosition\",\n colliders,\n options: props,\n }),\n [colliders, props]\n );\n return React.createElement(RigidBodyContext.Provider, { value }, children);\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAEX,IAAM,kBAAkB,OAAO,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAE1D,IAAM,iBAAiB,MAAM,cAAc;AAAA,EACzC,SAAS;AAAA,EACT,SAAS,CAAC;AACZ,CAAC;AAED,IAAM,mBAAmB,MAAM,cAAc;AAAA,EAC3C,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS,CAAC;AACZ,CAAC;AAEM,SAAS,YAAY,EAAE,UAAU,iBAAiB,UAAU,GAAG,MAAM,GAAG;AAC7E,QAAM,QAAQ,MAAM;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,SAAS,KAAK;AAAA,EACjB;AACA,SAAO,MAAM,cAAc,eAAe,UAAU,EAAE,MAAM,GAAG,QAAQ;AACzE;AAEO,SAAS,gBAAgB;AAAA,EAC9B,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,QAAM,QAAQ,MAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,MAAM,cAAc,iBAAiB,UAAU,EAAE,MAAM,GAAG,QAAQ;AAC3E;AAEO,SAAS,iBAAiB,EAAE,YAAY,QAAQ,UAAU,GAAG,MAAM,GAAG;AAC3E,QAAM,QAAQ,MAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,MAAM,cAAc,iBAAiB,UAAU,EAAE,MAAM,GAAG,QAAQ;AAC3E;AAEO,SAAS,mBAAmB;AAAA,EACjC,YAAY;AAAA,EACZ;AAAA,EACA,GAAG;AACL,GAAG;AACD,QAAM,QAAQ,MAAM;AAAA,IAClB,OAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,IACX;AAAA,IACA,CAAC,WAAW,KAAK;AAAA,EACnB;AACA,SAAO,MAAM,cAAc,iBAAiB,UAAU,EAAE,MAAM,GAAG,QAAQ;AAC3E;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plasius/gpu-physics",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Physics integration bridge package for Plasius GPU renderer migration.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -27,9 +27,17 @@
27
27
  "scripts": {
28
28
  "build": "tsup",
29
29
  "demo": "python3 -m http.server --directory ..",
30
+ "typecheck": "node --check src/index.js",
31
+ "audit:eslint": "eslint . --max-warnings=0",
32
+ "audit:deps": "npm ls --all --omit=optional --omit=peer > /dev/null 2>&1 || true",
33
+ "audit:npm": "npm audit --audit-level=high --omit=dev",
34
+ "audit:test": "npm run test:coverage",
35
+ "lint": "eslint . --max-warnings=0",
30
36
  "test": "npm run test:unit",
31
37
  "test:unit": "node --test",
32
- "test:coverage": "c8 --reporter=lcov --reporter=text node --test"
38
+ "test:coverage": "c8 --reporter=lcov --reporter=text node --test",
39
+ "pack:check": "node scripts/verify-public-package.cjs",
40
+ "prepublishOnly": "npm run build && npm run pack:check"
33
41
  },
34
42
  "keywords": [
35
43
  "physics",
@@ -43,11 +51,11 @@
43
51
  "peerDependencies": {
44
52
  "react": "^19.1.0"
45
53
  },
46
- "dependencies": {
47
- "@react-three/rapier": "^2.1.0"
48
- },
49
54
  "devDependencies": {
55
+ "@eslint/js": "^9.39.1",
50
56
  "c8": "^10.1.3",
57
+ "eslint": "^9.39.1",
58
+ "globals": "^17.3.0",
51
59
  "react": "^19.1.0",
52
60
  "tsup": "^8.5.0",
53
61
  "typescript": "^5.9.3"
@@ -72,5 +80,8 @@
72
80
  "type": "github",
73
81
  "url": "https://github.com/sponsors/Plasius-LTD"
74
82
  }
75
- ]
83
+ ],
84
+ "overrides": {
85
+ "minimatch": "^10.2.1"
86
+ }
76
87
  }
package/src/index.js CHANGED
@@ -1,13 +1,27 @@
1
1
  import React from "react";
2
- import {
3
- Physics as RapierPhysics,
4
- RigidBody as RapierRigidBody,
5
- } from "@react-three/rapier";
6
2
 
7
3
  export const DEFAULT_GRAVITY = Object.freeze([0, -9.81, 0]);
8
4
 
5
+ const PhysicsContext = React.createContext({
6
+ gravity: DEFAULT_GRAVITY,
7
+ options: {},
8
+ });
9
+
10
+ const RigidBodyContext = React.createContext({
11
+ type: "fixed",
12
+ colliders: "trimesh",
13
+ options: {},
14
+ });
15
+
9
16
  export function PhysicsRoot({ gravity = DEFAULT_GRAVITY, children, ...props }) {
10
- return React.createElement(RapierPhysics, { gravity, ...props }, children);
17
+ const value = React.useMemo(
18
+ () => ({
19
+ gravity,
20
+ options: props,
21
+ }),
22
+ [gravity, props]
23
+ );
24
+ return React.createElement(PhysicsContext.Provider, { value }, children);
11
25
  }
12
26
 
13
27
  export function StaticRigidBody({
@@ -15,27 +29,27 @@ export function StaticRigidBody({
15
29
  children,
16
30
  ...props
17
31
  }) {
18
- return React.createElement(
19
- RapierRigidBody,
20
- {
32
+ const value = React.useMemo(
33
+ () => ({
21
34
  type: "fixed",
22
35
  colliders,
23
- ...props,
24
- },
25
- children
36
+ options: props,
37
+ }),
38
+ [colliders, props]
26
39
  );
40
+ return React.createElement(RigidBodyContext.Provider, { value }, children);
27
41
  }
28
42
 
29
43
  export function DynamicRigidBody({ colliders = "hull", children, ...props }) {
30
- return React.createElement(
31
- RapierRigidBody,
32
- {
44
+ const value = React.useMemo(
45
+ () => ({
33
46
  type: "dynamic",
34
47
  colliders,
35
- ...props,
36
- },
37
- children
48
+ options: props,
49
+ }),
50
+ [colliders, props]
38
51
  );
52
+ return React.createElement(RigidBodyContext.Provider, { value }, children);
39
53
  }
40
54
 
41
55
  export function KinematicRigidBody({
@@ -43,13 +57,13 @@ export function KinematicRigidBody({
43
57
  children,
44
58
  ...props
45
59
  }) {
46
- return React.createElement(
47
- RapierRigidBody,
48
- {
60
+ const value = React.useMemo(
61
+ () => ({
49
62
  type: "kinematicPosition",
50
63
  colliders,
51
- ...props,
52
- },
53
- children
64
+ options: props,
65
+ }),
66
+ [colliders, props]
54
67
  );
68
+ return React.createElement(RigidBodyContext.Provider, { value }, children);
55
69
  }