Skip to content
This repository was archived by the owner on Aug 1, 2026. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
539 commits
Select commit Hold shift + click to select a range
8d24c88
refactor(core): remove attachment registration facade
Blovien Jun 16, 2026
43be33d
fix(core): attach physics runtime resource to entity store
Blovien Jun 16, 2026
9b71665
refactor(core): rename stale owner lane wording
Blovien Jun 16, 2026
9f9af79
refactor(examples): use public physics store read helpers
Blovien Jun 16, 2026
29e964e
refactor(core): require physics store ref facade reads
Blovien Jun 16, 2026
af86ee1
docs(core): update physics event identity wording
Blovien Jun 16, 2026
ac6d4b1
test(core): align physics store tests with ecs runtime
Blovien Jun 16, 2026
0f8e427
fix(build): enable physics store early plugin for runAllMods
Blovien Jun 16, 2026
731fbfa
fix(core): repair physics store early startup
Blovien Jun 16, 2026
5d9c901
fix(core): restore physics store owner lane stepping
Blovien Jun 16, 2026
214c47c
fix(core): defer clean until physics backend idle
Blovien Jun 16, 2026
356036d
fix(core): tolerate partial physics store shutdown
Blovien Jun 16, 2026
5b1bc3d
fix(core): publish physics snapshots from owner lane
Blovien Jun 16, 2026
e48a12c
fix(core): avoid streamed float persistence decoding
Blovien Jun 16, 2026
8c467c8
fix(core): detach external physics attachments on clean
Blovien Jun 16, 2026
9a06b5a
refactor(core): normalize physics plugin api names
Blovien Jun 17, 2026
91b330f
refactor(core): split physics type registries
Blovien Jun 17, 2026
9fc8bcb
refactor(core): flatten physics store internals
Blovien Jun 17, 2026
1b54e08
refactor(core): simplify visual runtime refs
Blovien Jun 17, 2026
d6f526d
refactor(core): centralize physics type registration
Blovien Jun 17, 2026
4a85ba7
refactor(core): flatten physicsstore runtime resources
Blovien Jun 17, 2026
32b4c29
refactor(core): introduce physics entity subplugin
Blovien Jun 17, 2026
162d0ef
refactor(core): rename world collision subplugin to physics chunk
Blovien Jun 17, 2026
b07cf73
refactor(core): register chunk physics types in physics chunk
Blovien Jun 17, 2026
0bba274
feat(core): add physics store helper APIs
Blovien Jun 17, 2026
fa2d722
refactor(core): split physics integration modules
Blovien Jun 17, 2026
a3e825b
refactor(core): move physics chunk commands to module
Blovien Jun 17, 2026
de7beb1
refactor(core): delegate world collision resource helpers
Blovien Jun 17, 2026
38df47e
refactor(core): centralize module system registration
Blovien Jun 17, 2026
de66adc
test(core): migrate physics module tests
Blovien Jun 17, 2026
7724f51
refactor(core): expose physics chunk profiling helpers
Blovien Jun 17, 2026
d911333
refactor(core): narrow physics chunk command boundary
Blovien Jun 17, 2026
e65d6e2
refactor(core): expose physics runtime profiling views
Blovien Jun 17, 2026
df1a2a2
refactor(core): expose profiling drain snapshots
Blovien Jun 17, 2026
5095125
test(chunk): use profiling value views
Blovien Jun 17, 2026
aeb115b
refactor(core): hide internal physics type handles
Blovien Jun 17, 2026
2973af6
refactor(core): move world collision off world resource
Blovien Jun 17, 2026
6eac336
refactor(examples): read physics state through store helpers
Blovien Jun 17, 2026
8e3323f
refactor(physicschunk): resolve settings spaces as refs
Blovien Jun 17, 2026
87d8a8b
refactor(core): route settings commands through physics store
Blovien Jun 17, 2026
59723ba
refactor(core): route space commands through physics store
Blovien Jun 17, 2026
8d2424d
docs(core): align physics store helper guidance
Blovien Jun 17, 2026
5251ea2
fix(core): idle-schedule physics body cleanup
Blovien Jun 17, 2026
e2bc488
refactor(core): route control state through physics store
Blovien Jun 17, 2026
34df971
refactor(physicsentity): move attachment api into module
Blovien Jun 17, 2026
abd271a
refactor(core): simplify physics store helper surfaces
Blovien Jun 17, 2026
7ac49b4
refactor(physicsentity): own generated proxy component type
Blovien Jun 17, 2026
076e6ad
refactor(core): centralize physics store world access
Blovien Jun 17, 2026
8427a74
refactor(commands): centralize physics store access
Blovien Jun 17, 2026
e195ace
refactor(core): route internal store access through physics threading
Blovien Jun 17, 2026
89fbf3b
refactor(sync): centralize physics store access
Blovien Jun 17, 2026
dba624e
refactor(crucible): use physics threading store access
Blovien Jun 17, 2026
70f886e
test(physicsentity): update attachment component imports
Blovien Jun 17, 2026
579e822
fix(core): collect physics contacts on owner lane
Blovien Jun 17, 2026
36a2de4
perf(core): store physics body snapshots as scalars
Blovien Jun 17, 2026
06ef592
perf(core): reduce physics snapshot publication allocation
Blovien Jun 17, 2026
740bbbd
perf(core): avoid duplicate snapshot index copies
Blovien Jun 17, 2026
9d16604
perf(core): skip unchanged body registration publication
Blovien Jun 17, 2026
ff48e71
refactor(core): own physics store terrain registration
Blovien Jun 17, 2026
b67a7a7
refactor(core): harden physics entity module lifecycle
Blovien Jun 17, 2026
18f9e5e
refactor(examples): avoid cached physics entity component handles
Blovien Jun 17, 2026
b41bd2e
refactor(examples): avoid cached physics entity handles in systems
Blovien Jun 17, 2026
a5407ac
refactor(core): guard physics entity availability
Blovien Jun 17, 2026
025d7df
test(core): add physics entity subplugin smoke
Blovien Jun 17, 2026
bf17d55
refactor(core): bundle physics subplugins in core
Blovien Jun 17, 2026
23a87e0
refactor(core): align physics subplugin ownership
Blovien Jun 17, 2026
3480989
fix(core): order physics subplugin startup
Blovien Jun 17, 2026
bec4e2d
fix(core): use loader-safe subplugin ordering
Blovien Jun 17, 2026
ca0867a
fix(core): stabilize crucible physics runtime checks
Blovien Jun 17, 2026
7902268
fix(api): avoid legacy snapshot body-list scans
Blovien Jun 17, 2026
234df25
refactor(core): expose physics chunk terrain names
Blovien Jun 17, 2026
1ad6a27
refactor(core): make physics chunk terrain facade authoritative
Blovien Jun 17, 2026
bc16fda
perf(api): batch legacy body snapshots
Blovien Jun 17, 2026
a2858b4
fix(core): settle physics benchmark warmup
Blovien Jun 17, 2026
1f34d7d
refactor(core): canonicalize physics chunk terrain component
Blovien Jun 17, 2026
3f6f481
refactor(core): keep physics chunk lifecycle internal
Blovien Jun 17, 2026
011eb18
refactor(core): internalize physics chunk type registration
Blovien Jun 17, 2026
b154709
refactor(core): internalize physics entity type registration
Blovien Jun 17, 2026
64940ff
fix(core): preserve physics entity type facade compatibility
Blovien Jun 17, 2026
5ac8ac2
refactor(core): internalize physics registration boundaries
Blovien Jun 17, 2026
6a95077
refactor(core): internalize control module registration
Blovien Jun 17, 2026
abf3a58
refactor(core): name physics integrations as subplugins
Blovien Jun 17, 2026
cc83a81
refactor(core): mark worldcollision adapters deprecated
Blovien Jun 17, 2026
47df407
refactor(examples): use physicschunk terrain wording
Blovien Jun 17, 2026
2821fe3
test(core): cover subplugin boundary refactors
Blovien Jun 17, 2026
3eba847
refactor(examples): resolve physics spaces once
Blovien Jun 17, 2026
7086e9c
fix(core): preserve generated proxy attachments
Blovien Jun 17, 2026
7b693e2
test(core): guard generated proxy cleanup
Blovien Jun 17, 2026
e5f0a00
refactor(core): clarify physics subplugin naming
Blovien Jun 17, 2026
d32e2f8
test(core): clarify subplugin lifecycle guards
Blovien Jun 17, 2026
80f21c3
refactor(core): reduce physics component accessor boilerplate
Blovien Jun 17, 2026
8b94259
refactor(core): move visual settings under physics entity
Blovien Jun 17, 2026
304c7be
chore(core): tidy debug profiling lookups
Blovien Jun 17, 2026
fc153fd
refactor(core): move collision lod settings under physicschunk
Blovien Jun 17, 2026
80b71ae
test(core): guard physicschunk collision lod compatibility
Blovien Jun 17, 2026
8db48e4
refactor(core): move terrain settings under physicschunk
Blovien Jun 18, 2026
1f7e2a8
test(core): guard terrain settings compatibility
Blovien Jun 18, 2026
ca6703f
test(core): guard moved settings imports in examples
Blovien Jun 18, 2026
3e24da7
fix(core): wait for physics store owner lane before async mutations
Blovien Jun 18, 2026
57c90b1
test(core): guard physics store owner lane scheduling
Blovien Jun 18, 2026
0dd88e8
refactor(core): remove physicschunk compatibility aliases
Blovien Jun 18, 2026
e2d4b50
test(core): guard canonical physicschunk naming
Blovien Jun 18, 2026
bd28675
test(core): benchmark physics component granularity
Blovien Jun 18, 2026
087edc9
refactor(core): store sparse physics space settings
Blovien Jun 18, 2026
c5a5a34
refactor(core): bind voxel shapes through body rows
Blovien Jun 18, 2026
eb62aa8
feat(core): add chunk collision source component
Blovien Jun 18, 2026
17ac74e
refactor(core): fan out terrain into body rows
Blovien Jun 18, 2026
86c1492
feat(core): stitch voxel terrain body rows
Blovien Jun 18, 2026
69e9319
refactor(core): stop persisting terrain collider rows
Blovien Jun 18, 2026
1b58020
refactor(core): include terrain body rows in debug queries
Blovien Jun 18, 2026
d1a5da2
refactor(core): remove terrain collider rows
Blovien Jun 18, 2026
f7396d6
refactor(core): rename chunk collision pipeline
Blovien Jun 18, 2026
3321865
test(core): update chunk collision runtime guards
Blovien Jun 18, 2026
26c2c28
refactor(core): model chunk collision material as body material
Blovien Jun 18, 2026
289c666
refactor(core): model chunk collision filter as body filter
Blovien Jun 18, 2026
4f5907e
test(core): cover chunk collision filter persistence
Blovien Jun 18, 2026
8c357a7
test(core): exclude chunk collision rows from persistence
Blovien Jun 18, 2026
9ec4f01
test(core): cover chunk collision row generation
Blovien Jun 18, 2026
f360228
refactor(core): extract physics chunk terrain helpers
Blovien Jun 18, 2026
65951b0
test(core): cover chunk collision native rows
Blovien Jun 18, 2026
356f4fe
refactor(core): remove legacy voxel terrain cache
Blovien Jun 18, 2026
df461cd
refactor(core): align chunk collision settings naming
Blovien Jun 18, 2026
7fa3c60
fix(core): retain chunk collision payloads only for voxels
Blovien Jun 18, 2026
2976fcb
refactor(core): align chunk collision row material naming
Blovien Jun 18, 2026
0edb709
fix(core): clean stale physics entity projections
Blovien Jun 18, 2026
4f2600b
refactor(core): align chunk collision settings api
Blovien Jun 18, 2026
9738bb7
fix(core): bridge physics chunk collision filters
Blovien Jun 19, 2026
5d2667d
refactor(core): centralize physics body row helpers
Blovien Jun 19, 2026
37682c0
refactor(examples): keep runtime refs on body attachments
Blovien Jun 19, 2026
1cda75f
fix(core): preserve last chunk collision mutation
Blovien Jun 19, 2026
caadcf6
fix(core): clean restored orphan visual proxies
Blovien Jun 19, 2026
ddd8835
fix(core): keep terrain out of radius clean
Blovien Jun 19, 2026
c304430
refactor(core): internalize chunk collision source rows
Blovien Jun 19, 2026
a348736
refactor(core): narrow physics world resource api
Blovien Jun 19, 2026
5efac58
refactor(core): trim physics chunk settings accessors
Blovien Jun 19, 2026
54b2222
refactor(core): move body reads off world resource
Blovien Jun 19, 2026
2e4f163
refactor(core): reuse space material for chunk collision
Blovien Jun 19, 2026
ed3630c
refactor(core): remove terrain material settings
Blovien Jun 19, 2026
88a0880
test(core): update chunk collision component contract
Blovien Jun 19, 2026
fc5ca4b
refactor(core): sync chunk collision body surfaces
Blovien Jun 19, 2026
3ef04b2
test(core): cover chunk collision surface sync
Blovien Jun 19, 2026
81b3154
refactor(core): write space settings by component domain
Blovien Jun 19, 2026
e1b1956
test(core): cover sparse space settings components
Blovien Jun 19, 2026
74e32bc
refactor(core): move visual settings components to physicsentity
Blovien Jun 19, 2026
85a3650
test(core): cover physicsentity visual settings components
Blovien Jun 19, 2026
68271a2
refactor(core): rename physicschunk collision settings
Blovien Jun 19, 2026
c6068ee
test(core): update physicschunk collision settings tests
Blovien Jun 19, 2026
2856daa
refactor(core): rename physicschunk collision mode
Blovien Jun 19, 2026
3f6552a
test(core): update physicschunk collision mode assertions
Blovien Jun 19, 2026
6f48ddb
refactor(core): rename physicschunk collision facade
Blovien Jun 19, 2026
55693d5
test(core): cover physicschunk collision behavior
Blovien Jun 19, 2026
978220a
test(core): remove source-shape guard tests
Blovien Jun 19, 2026
7b7854f
refactor(core): add ref-first physicschunk collision api
Blovien Jun 19, 2026
ff7e610
refactor(examples): show direct physicsstore body authoring
Blovien Jun 19, 2026
ad4eb62
refactor(examples): remove hidden block body spawn helper
Blovien Jun 19, 2026
0d6cd91
refactor(core): add ref-first physics runtime indexes
Blovien Jun 19, 2026
a3ced65
test(core): cover physics runtime ref indexes
Blovien Jun 19, 2026
91a85f2
refactor(core): resolve physics runtimes by row ref
Blovien Jun 19, 2026
7b00659
test(core): cover ref runtime resolution
Blovien Jun 19, 2026
72dee04
refactor(core): centralize physicsstore row cleanup
Blovien Jun 19, 2026
16289d7
fix(core): refresh physicsstore row refs after cleanup
Blovien Jun 19, 2026
f03e978
test(core): cover physicsstore topology cleanup
Blovien Jun 19, 2026
d72703a
refactor(core): delegate physicschunk store registration
Blovien Jun 19, 2026
266a69e
fix(core): skip stale physicschunk collision upserts
Blovien Jun 19, 2026
d75345a
test(core): cover stale physicschunk mutations
Blovien Jun 19, 2026
5d6e12d
test(core): register physicschunk resources in fixtures
Blovien Jun 19, 2026
b3cd78d
refactor(core): remove stale physics naming shims
Blovien Jun 19, 2026
ffd85c6
refactor(examples): clarify stress spawn timings
Blovien Jun 19, 2026
105d67f
refactor(core): align physicschunk naming
Blovien Jun 19, 2026
6e3919e
refactor(core): move module settings enums
Blovien Jun 19, 2026
9331af9
test(core): update module settings enum imports
Blovien Jun 19, 2026
f55778d
test(examples): use physicsentity registry in utils tests
Blovien Jun 19, 2026
8b1f8d8
refactor(backends): discover runtime providers only
Blovien Jun 19, 2026
03222c5
test(core): cover runtime provider discovery
Blovien Jun 19, 2026
65facbc
refactor(api): remove unused legacy backend registry
Blovien Jun 19, 2026
8bb5c26
test(api): remove legacy event buffer coverage
Blovien Jun 19, 2026
43d6299
refactor(core): require refs for physics entity builders
Blovien Jun 19, 2026
b613883
refactor(core): require refs for physicschunk collision
Blovien Jun 19, 2026
364b4aa
refactor(core): require refs for live physics reads
Blovien Jun 19, 2026
7e3816d
refactor(core): remove dead sync helpers
Blovien Jun 19, 2026
6ba603d
feat(core): persist physics store holders as bson
Blovien Jun 19, 2026
5bbda0c
test(core): cover physics store holder persistence
Blovien Jun 19, 2026
21da107
fix(core): tolerate missing physics holder save paths
Blovien Jun 19, 2026
4502132
refactor(core): demote dto physics persistence to fallback
Blovien Jun 19, 2026
58ad701
test(core): cover holder primary physics persistence
Blovien Jun 19, 2026
0782c10
fix(core): preflight physics holder imports
Blovien Jun 19, 2026
a579750
test(core): cover invalid physics holder imports
Blovien Jun 19, 2026
952ceea
fix(core): tolerate missing physics shutdown resources
Blovien Jun 19, 2026
9523e8b
fix(examples): destroy explosive source body
Blovien Jun 19, 2026
378bc15
refactor(physicschunk): own physics store registrations
Blovien Jun 19, 2026
f4b5ed4
refactor(api): remove unused simulation helpers
Blovien Jun 19, 2026
18e206f
refactor(core): remove body registration metadata
Blovien Jun 19, 2026
9f94fbc
refactor(core): remove legacy physics world facade
Blovien Jun 20, 2026
94c23f8
refactor(core): move joint type into components
Blovien Jun 20, 2026
f7c318e
fix(core): batch PhysicsStore body cleanup
Blovien Jun 20, 2026
3d3a4be
fix(core): buffer body command component writes
Blovien Jun 20, 2026
f49804c
fix(core): harden subplugin lifecycle cleanup
Blovien Jun 20, 2026
61f3156
feat(api): add bounded contact reads
Blovien Jun 20, 2026
5e7f431
fix(core): bound contact debug queries
Blovien Jun 20, 2026
25e9589
feat(core): report backend runtime pressure
Blovien Jun 20, 2026
efbc441
fix(core): rebuild physics uuid indexes serially
Blovien Jun 20, 2026
4461245
test(rapier): cover native voxel terrain floors
Blovien Jun 20, 2026
dc8f39b
refactor(core): remove body registration resource
Blovien Jun 20, 2026
4b8e8e2
refactor(commands): register module command sets
Blovien Jun 20, 2026
dac751a
fix(core): enforce physics runtime identity boundaries
Blovien Jun 20, 2026
ede2e1b
feat(runtime): reduce physics memory footprint
Blovien Jun 20, 2026
d7c07a3
refactor(core): use lombok schema version getter
Blovien Jun 20, 2026
c52d567
refactor(api)!: remove legacy backend contracts
Blovien Jun 20, 2026
3848eba
feat(jolt): add Panama-backed native runtime
Blovien Jun 20, 2026
af8af5e
refactor(physicsentity): own visual sync policy
Blovien Jun 21, 2026
f7a9f71
fix(core): harden runtime identity restore state
Blovien Jun 21, 2026
79aa2c0
fix(core): delete spaces on owner lane
Blovien Jun 21, 2026
61faddc
fix(core): keep drop-pending dt cadence steady
Blovien Jun 21, 2026
0d88b30
perf(physicschunk): batch generated collision cleanup
Blovien Jun 21, 2026
b37a64a
feat(jolt): implement native joint lifecycle
Blovien Jun 21, 2026
e16952b
perf(core): publish compact physics snapshots
Blovien Jun 21, 2026
a800682
fix(physicschunk): preserve streaming cache clones
Blovien Jun 21, 2026
8fd6589
test(examples): remove stale unit coverage
Blovien Jun 21, 2026
cff751d
fix(core): delete spaces with chunk collision rows
Blovien Jun 21, 2026
0f24170
feat(core): deprecate physics event plugin api
Blovien Jun 21, 2026
bbf864d
refactor(examples): localize physics store demo helpers
Blovien Jun 21, 2026
2d723b9
refactor(jolt): clamp raycast hit counts
Blovien Jun 21, 2026
5be29c2
refactor(core): move physics values into plugin physics
Blovien Jun 21, 2026
477386c
perf(core): skip step submission without runtime spaces
Blovien Jun 21, 2026
35bf14f
fix(control): clear released anchor body state
Blovien Jun 21, 2026
7e78b4c
fix(core): recover restore status after cleanup
Blovien Jun 21, 2026
27d94ab
refactor(core): use holder-only physics persistence
Blovien Jun 21, 2026
d77d9a5
docs(physicschunk): remove empty package docs
Blovien Jun 21, 2026
2ae234f
feat(commands): split explicit space lifecycle commands
Blovien Jun 22, 2026
051e070
fix(control): prevent stealing actively controlled bodies
Blovien Jun 22, 2026
e422ed7
refactor(core): move module-owned runtime types into owning packages
Blovien Jun 22, 2026
e8b338a
fix(core): resolve physics rows through store uuid data
Blovien Jun 22, 2026
d2137a6
feat(core): add module-owned PhysicsStore cleanup hooks
Blovien Jun 22, 2026
49b59d3
fix(physicsentity): preserve projection cleanup backend state
Blovien Jun 22, 2026
36ed2c0
feat(physicschunk): prewarm collision rows before restored body binding
Blovien Jun 22, 2026
73a8abb
feat(examples): add directional pendulums demo
Blovien Jun 22, 2026
d38d02e
test(rapier): cover directional gravity round trips
Blovien Jun 22, 2026
a187868
refactor(jolt): use Math.clamp for native result bounds
Blovien Jun 22, 2026
94cc8a7
refactor(jolt): split native ABI from internals
Blovien Jun 22, 2026
a2a00eb
feat(backend-api): seed body state during creation
Blovien Jun 22, 2026
e9e37eb
fix(core): sync near awake visuals every tick
Blovien Jun 22, 2026
f0509c2
fix(core): sanitize visual sync rotations
Blovien Jun 22, 2026
9f008f5
refactor(api): rename backend registry facade
Blovien Jun 23, 2026
71728f2
test(core): replace crucible with junit coverage
Blovien Jun 23, 2026
7e4346c
refactor(backends): nest backend modules
Blovien Jun 25, 2026
fea1ade
refactor(core): relocate physics internals
Blovien Jun 25, 2026
211bf3a
refactor(control): extract builtin plugin
Blovien Jun 25, 2026
afad4a7
refactor(core): align projection ref comparison
Blovien Jun 25, 2026
a1621b2
build(builtins): shadow control into impulse plugin
Blovien Jun 25, 2026
13c1a0c
chore(control): marked for deprecation
Blovien Jun 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
[patch.crates-io]
rapier3d = { path = "impulse-rapier/src/main/rust/target/impulse-patched/rapier3d-0.32.0-impulse" }
rapier3d = { path = "impulse-backends/rapier/src/main/rust/target/impulse-patched/rapier3d-0.32.0-impulse" }
8 changes: 4 additions & 4 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,11 @@ body:
label: Validation already run
placeholder: "./gradlew headlessTest"
- type: textarea
id: crucible-test
id: runtime-reproduction
attributes:
label: Crucible reproduction
description: If this is a runtime/server bug, include the failing Crucible test or describe the test case that should be added.
placeholder: "Example: add a focused Crucible smoke that unloads/reloads the affected plugin after spawning the failing entity state."
label: Runtime reproduction
description: If this is a runtime/server bug, include the focused regression test or describe the manual runAllMods scenario.
placeholder: "Example: runAllMods, create space --backend=impulse:rapier, spawn the failing entity state, then unload/reload the affected plugin."
- type: textarea
id: logs
attributes:
Expand Down
135 changes: 110 additions & 25 deletions .github/workflows/backend-artifacts.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,66 @@ permissions:
contents: read

jobs:
jolt-native:
name: Jolt native ${{ matrix.platform }}
runs-on: ${{ matrix.runner }}

strategy:
fail-fast: false
matrix:
include:
- platform: linux-x86_64
runner: ubuntu-22.04
resource-path: linux/x86_64
library: libimpulse_jolt.so
gradle-command: ./gradlew :impulse-backends:jolt:stageJoltNativeResource
- platform: linux-arm64
runner: ubuntu-24.04-arm
resource-path: linux/arm64
library: libimpulse_jolt.so
gradle-command: ./gradlew :impulse-backends:jolt:stageJoltNativeResource
- platform: osx-arm64
runner: macos-15
resource-path: osx/arm64
library: libimpulse_jolt.dylib
gradle-command: ./gradlew :impulse-backends:jolt:stageJoltNativeResource
- platform: windows-x86_64
runner: windows-2025
resource-path: windows/x86_64
library: impulse_jolt.dll
gradle-command: ./gradlew.bat :impulse-backends:jolt:stageJoltNativeResource

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Set up Java 25
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '25'

- name: Set up Gradle cache
uses: gradle/actions/setup-gradle@v4

- name: Build Jolt native resource
shell: bash
run: ${{ matrix.gradle-command }}

- name: Stage Jolt native artifact
shell: bash
run: |
artifact_dir="jolt-native-artifact/native/${{ matrix.resource-path }}"
mkdir -p "$artifact_dir"
cp "impulse-backends/jolt/build/generated/jolt-native/native/${{ matrix.resource-path }}/${{ matrix.library }}" "$artifact_dir/"

- name: Upload Jolt native resource
uses: actions/upload-artifact@v4
with:
name: jolt-native-${{ matrix.platform }}
path: jolt-native-artifact
if-no-files-found: error

rapier-native:
name: Rapier native ${{ matrix.platform }}
runs-on: ${{ matrix.runner }}
Expand All @@ -20,25 +80,25 @@ jobs:
rust-target: x86_64-unknown-linux-gnu
resource-path: linux/x86_64
library: libimpulse_rapier.so
gradle-command: ./gradlew :impulse-rapier:stageRapierNativeResource
gradle-command: ./gradlew :impulse-backends:rapier:stageRapierNativeResource
- platform: linux-arm64
runner: ubuntu-24.04-arm
rust-target: aarch64-unknown-linux-gnu
resource-path: linux/arm64
library: libimpulse_rapier.so
gradle-command: ./gradlew :impulse-rapier:stageRapierNativeResource
gradle-command: ./gradlew :impulse-backends:rapier:stageRapierNativeResource
- platform: osx-arm64
runner: macos-15
rust-target: aarch64-apple-darwin
resource-path: osx/arm64
library: libimpulse_rapier.dylib
gradle-command: ./gradlew :impulse-rapier:stageRapierNativeResource
gradle-command: ./gradlew :impulse-backends:rapier:stageRapierNativeResource
- platform: windows-x86_64
runner: windows-2025
rust-target: x86_64-pc-windows-msvc
resource-path: windows/x86_64
library: impulse_rapier.dll
gradle-command: ./gradlew.bat :impulse-rapier:stageRapierNativeResource
gradle-command: ./gradlew.bat :impulse-backends:rapier:stageRapierNativeResource

steps:
- name: Check out repository
Expand Down Expand Up @@ -69,7 +129,7 @@ jobs:
run: |
artifact_dir="rapier-native-artifact/native/${{ matrix.resource-path }}"
mkdir -p "$artifact_dir"
cp "impulse-rapier/build/generated/rapier-native/native/${{ matrix.resource-path }}/${{ matrix.library }}" "$artifact_dir/"
cp "impulse-backends/rapier/build/generated/rapier-native/native/${{ matrix.resource-path }}/${{ matrix.library }}" "$artifact_dir/"

- name: Upload Rapier native resource
uses: actions/upload-artifact@v4
Expand All @@ -81,7 +141,9 @@ jobs:
backend-jars:
name: Backend provider jars
runs-on: ubuntu-24.04
needs: rapier-native
needs:
- jolt-native
- rapier-native

steps:
- name: Check out repository
Expand All @@ -100,26 +162,47 @@ jobs:
uses: actions/download-artifact@v4
with:
pattern: rapier-native-*
path: impulse-rapier/build/ci/rapier-native-downloads
path: impulse-backends/rapier/build/ci/rapier-native-downloads

- name: Download Jolt native resources
uses: actions/download-artifact@v4
with:
pattern: jolt-native-*
path: impulse-backends/jolt/build/ci/jolt-native-downloads

- name: Normalize Rapier native resource tree
shell: bash
run: |
mkdir -p impulse-rapier/build/ci/rapier-native/native
for dir in impulse-rapier/build/ci/rapier-native-downloads/rapier-native-*; do
mkdir -p impulse-backends/rapier/build/ci/rapier-native/native
for dir in impulse-backends/rapier/build/ci/rapier-native-downloads/rapier-native-*; do
if [ -d "$dir/native" ]; then
cp -R "$dir/native/." impulse-rapier/build/ci/rapier-native/native/
cp -R "$dir/native/." impulse-backends/rapier/build/ci/rapier-native/native/
else
cp -R "$dir/." impulse-rapier/build/ci/rapier-native/native/
cp -R "$dir/." impulse-backends/rapier/build/ci/rapier-native/native/
fi
done
find impulse-rapier/build/ci/rapier-native/native -type f | sort
find impulse-backends/rapier/build/ci/rapier-native/native -type f | sort

- name: Normalize Jolt native resource tree
shell: bash
run: |
mkdir -p impulse-backends/jolt/build/ci/jolt-native/native
for dir in impulse-backends/jolt/build/ci/jolt-native-downloads/jolt-native-*; do
if [ -d "$dir/native" ]; then
cp -R "$dir/native/." impulse-backends/jolt/build/ci/jolt-native/native/
else
cp -R "$dir/." impulse-backends/jolt/build/ci/jolt-native/native/
fi
done
find impulse-backends/jolt/build/ci/jolt-native/native -type f | sort

- name: Build backend provider jars
run: >
./gradlew packageBackendPlatformJars
-PbuildJoltNative=false
-Pimpulse.joltNativeResourceRoot=${{ github.workspace }}/impulse-backends/jolt/build/ci/jolt-native
-PbuildRapierNative=false
-Pimpulse.rapierNativeResourceRoot=${{ github.workspace }}/impulse-rapier/build/ci/rapier-native
-Pimpulse.rapierNativeResourceRoot=${{ github.workspace }}/impulse-backends/rapier/build/ci/rapier-native

- name: Write artifact notice
shell: bash
Expand All @@ -129,7 +212,9 @@ jobs:

These backend provider jars may include third-party native binaries so Impulse can load the backend at runtime.

They are convenience packages for Impulse plugins and are not the official upstream distribution channel for those native libraries. Download standalone Bullet/Libbulletjme or Rapier binaries from their upstream projects instead.
They are convenience packages for Impulse plugins and are not the official upstream distribution channel for those native libraries. Download standalone Rapier binaries from its upstream project instead.

Jolt backend jars include binaries built from upstream Jolt Physics source for Impulse's native ABI.

See LICENSE and licenses/ in this artifact for packaged license notices.
EOF
Expand All @@ -141,16 +226,16 @@ jobs:
path: |
BACKEND_ARTIFACT_NOTICE.md
LICENSE
licenses/LIBBULLETJME_LICENSE
licenses/JOLT_PHYSICS_LICENSE
licenses/RAPIER_RUST_BACKEND_LICENSES
impulse-bullet/build/libs/impulse-bullet-*-linux-x86_64.jar
impulse-bullet/build/libs/impulse-bullet-*-linux-arm64.jar
impulse-bullet/build/libs/impulse-bullet-*-osx-arm64.jar
impulse-bullet/build/libs/impulse-bullet-*-windows-x86_64.jar
impulse-bullet/build/libs/impulse-bullet-*-universal.jar
impulse-rapier/build/libs/impulse-rapier-*-linux-x86_64.jar
impulse-rapier/build/libs/impulse-rapier-*-linux-arm64.jar
impulse-rapier/build/libs/impulse-rapier-*-osx-arm64.jar
impulse-rapier/build/libs/impulse-rapier-*-windows-x86_64.jar
impulse-rapier/build/libs/impulse-rapier-*-universal.jar
impulse-backends/jolt/build/libs/impulse-backend-jolt-*-linux-x86_64.jar
impulse-backends/jolt/build/libs/impulse-backend-jolt-*-linux-arm64.jar
impulse-backends/jolt/build/libs/impulse-backend-jolt-*-osx-arm64.jar
impulse-backends/jolt/build/libs/impulse-backend-jolt-*-windows-x86_64.jar
impulse-backends/jolt/build/libs/impulse-backend-jolt-*-universal.jar
impulse-backends/rapier/build/libs/impulse-backend-rapier-*-linux-x86_64.jar
impulse-backends/rapier/build/libs/impulse-backend-rapier-*-linux-arm64.jar
impulse-backends/rapier/build/libs/impulse-backend-rapier-*-osx-arm64.jar
impulse-backends/rapier/build/libs/impulse-backend-rapier-*-windows-x86_64.jar
impulse-backends/rapier/build/libs/impulse-backend-rapier-*-universal.jar
if-no-files-found: error
10 changes: 6 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ Open an issue or design discussion before changing architecture, persistence, li
backend runtime contracts, public API packages or native artifact packaging.

For bug reports, include a clear reproduction path and logs. When the bug depends on Hytale server
runtime behavior, also try to add or propose a failing Crucible test so that it can be reproduced in-game.
runtime behavior, also try to add or propose a focused JUnit/headless regression test, or document
the `runAllMods` world setup and commands needed to reproduce it.

## AI-Assisted Contributions

Expand Down Expand Up @@ -67,8 +68,9 @@ Runtime/server behavior should be checked with:
./gradlew runAllMods
```

When a runtime bug is fixed, prefer adding a focused Crucible test that reproduces the failing
server behavior.
When a runtime bug is fixed, prefer adding a focused module test that reproduces the failing
behavior. If the bug only exists in a live Hytale server loop, document the manual `runAllMods`
scenario used for validation.

Backend-specific changes should name the backend used for validation, such as `impulse:bullet` or
`impulse:rapier`.
`impulse:rapier`.
Loading
Loading