@marble.fun/track-catalog 3.0.0

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 (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/assets.json +346 -0
  4. package/package.json +32 -0
  5. package/release.json +135 -0
  6. package/src/audio/game-audio-preference.ts +9 -0
  7. package/src/authoritative.ts +6 -0
  8. package/src/catalog.ts +1 -0
  9. package/src/index.ts +14 -0
  10. package/src/legacy-stock-catalog.ts +130 -0
  11. package/src/pages/lobby/lobby-types.ts +140 -0
  12. package/src/pages/lobby/marble-factory.ts +931 -0
  13. package/src/pages/play/race/egypt-elevator-blender.ts +159 -0
  14. package/src/pages/play/race/egypt-portal-frame.ts +382 -0
  15. package/src/pages/play/race/finish-detection.ts +1 -0
  16. package/src/pages/play/race/japanese-sakura-castle-support-blender.ts +510 -0
  17. package/src/pages/play/race/japanese-sakura-kawara-roof.ts +201 -0
  18. package/src/pages/play/race/japanese-sakura-portal-frame.ts +325 -0
  19. package/src/pages/play/race/jungle-portal-frame.ts +308 -0
  20. package/src/pages/play/race/jungle-temple-lift.ts +366 -0
  21. package/src/pages/play/race/marble-entity.ts +257 -0
  22. package/src/pages/play/race/marble-material.ts +20 -0
  23. package/src/pages/play/race/marble-race-engine.ts +2652 -0
  24. package/src/pages/play/race/path-pattern-layout.ts +142 -0
  25. package/src/pages/play/race/peg-obstacle-visual.ts +171 -0
  26. package/src/pages/play/race/physics-debug.ts +1 -0
  27. package/src/pages/play/race/physics-dry-run.ts +90 -0
  28. package/src/pages/play/race/portal-derived-elevator-skins.ts +729 -0
  29. package/src/pages/play/race/portal-pair-color.ts +20 -0
  30. package/src/pages/play/race/portal-proportions.ts +25 -0
  31. package/src/pages/play/race/portal-visual.ts +1108 -0
  32. package/src/pages/play/race/race-camera-director.ts +586 -0
  33. package/src/pages/play/race/race-camera-obstruction.ts +37 -0
  34. package/src/pages/play/race/race-camera-tour-planner.ts +274 -0
  35. package/src/pages/play/race/race-camera.ts +206 -0
  36. package/src/pages/play/race/race-completion.ts +5 -0
  37. package/src/pages/play/race/race-configuration.ts +57 -0
  38. package/src/pages/play/race/race-marble-focus-renderer.ts +134 -0
  39. package/src/pages/play/race/race-physics-profile.ts +7 -0
  40. package/src/pages/play/race/race-physics.ts +16 -0
  41. package/src/pages/play/race/race-playback.ts +41 -0
  42. package/src/pages/play/race/race-rolling-audio.ts +616 -0
  43. package/src/pages/play/race/race-simulation-renderer.ts +221 -0
  44. package/src/pages/play/race/race-terminal-checker-strip.ts +226 -0
  45. package/src/pages/play/race/race-transform-interpolation.ts +50 -0
  46. package/src/pages/play/race/race-types.ts +12 -0
  47. package/src/pages/play/race/rebound-visual.ts +70 -0
  48. package/src/pages/play/race/seeded-random.ts +23 -0
  49. package/src/pages/play/race/space-station-portal-frame.ts +275 -0
  50. package/src/pages/play/race/track-appearance-canopy.ts +946 -0
  51. package/src/pages/play/race/track-appearance-floor-runner.ts +206 -0
  52. package/src/pages/play/race/track-appearance-jungle-flower-hedge.ts +483 -0
  53. package/src/pages/play/race/track-appearance-rope-wall.ts +443 -0
  54. package/src/pages/play/race/track-appearance-sakura-bridge-fence.ts +305 -0
  55. package/src/pages/play/race/track-appearance-sakura-castle-wall.ts +1031 -0
  56. package/src/pages/play/race/track-appearance-space-station-wall.ts +497 -0
  57. package/src/pages/play/race/track-appearance-stone-block-shell.ts +517 -0
  58. package/src/pages/play/race/track-appearance-support.ts +983 -0
  59. package/src/pages/play/race/track-appearance-vampire-carved-wall.ts +545 -0
  60. package/src/pages/play/race/track-appearance-wall-terminal.ts +167 -0
  61. package/src/pages/play/race/track-course.ts +271 -0
  62. package/src/pages/play/race/track-definition.ts +443 -0
  63. package/src/pages/play/race/track-fence-architecture.ts +33 -0
  64. package/src/pages/play/race/track-floor-material-rules.ts +51 -0
  65. package/src/pages/play/race/track-mechanisms.ts +1350 -0
  66. package/src/pages/play/race/track-physics-surface.ts +6 -0
  67. package/src/pages/play/race/track-route-network.ts +9 -0
  68. package/src/pages/play/race/track-shadow-batching.ts +760 -0
  69. package/src/pages/play/race/track-surface-basis.ts +1 -0
  70. package/src/pages/play/race/track-surface-topology.ts +326 -0
  71. package/src/pages/play/race/track-world.ts +10181 -0
  72. package/src/pages/play/race/under-track-support-architecture.ts +122 -0
  73. package/src/pages/play/race/vortex-profile.ts +5 -0
  74. package/src/pages/play/race/vortex-water-effect.ts +863 -0
  75. package/src/pages/play/race/wild-west-mine-lift.ts +281 -0
  76. package/src/pages/play/race/wild-west-vortex-housing.ts +572 -0
  77. package/src/pages/track-lab/atlas-vortex-layout.ts +1 -0
  78. package/src/pages/track-lab/cone-field-layout.ts +1 -0
  79. package/src/pages/track-lab/conveyor-layout.ts +1 -0
  80. package/src/pages/track-lab/engine/canonical-track-assembly.ts +64 -0
  81. package/src/pages/track-lab/engine/editor-object-geometry.ts +170 -0
  82. package/src/pages/track-lab/engine/track-lab-connection-state.ts +123 -0
  83. package/src/pages/track-lab/engine/track-piece-visual.ts +1420 -0
  84. package/src/pages/track-lab/flipper-bank-layout.ts +1 -0
  85. package/src/pages/track-lab/flipper-component.ts +127 -0
  86. package/src/pages/track-lab/rising-wall-layout.ts +1 -0
  87. package/src/pages/track-lab/simple-obstacle-layout.ts +1 -0
  88. package/src/pages/track-lab/track-piece-layout.ts +28 -0
  89. package/src/pages/track-lab/track-runtime-adapter.ts +1152 -0
  90. package/src/three/geometry-attribute-aliases.ts +24 -0
  91. package/src/three/geometry-detail.ts +36 -0
  92. package/src/three/homepage-marble-geometry.ts +15 -0
  93. package/src/three/japanese-sakura-appearance.ts +252 -0
  94. package/src/three/jungle-flower-hedge-appearance.ts +7 -0
  95. package/src/three/jungle-temple-appearance.ts +5 -0
  96. package/src/three/low-quality-scene-renderer.ts +132 -0
  97. package/src/three/marble-sphere-geometry.ts +13 -0
  98. package/src/three/mobile-rendering-budget.ts +11 -0
  99. package/src/three/painted-valley-appearance.ts +270 -0
  100. package/src/three/railroad-appearance.ts +71 -0
  101. package/src/three/renderer-resize.ts +32 -0
  102. package/src/three/rope-wall-appearance.ts +91 -0
  103. package/src/three/rugged-track-appearance.ts +2 -0
  104. package/src/three/scene-lighting.ts +183 -0
  105. package/src/three/scene-shader-preparation.ts +64 -0
  106. package/src/three/scene-theme-controller.ts +461 -0
  107. package/src/three/shadow-shader-preparation.ts +162 -0
  108. package/src/three/shared-obstacle-metal.ts +44 -0
  109. package/src/three/soft-additive-particles.ts +57 -0
  110. package/src/three/space-station-appearance.ts +213 -0
  111. package/src/three/static-track-batched-mesh.ts +132 -0
  112. package/src/three/stone-track-shell-appearance.ts +12 -0
  113. package/src/three/theme-ambience-controller.ts +226 -0
  114. package/src/three/theme-asset-cache.ts +120 -0
  115. package/src/three/theme-audio-preference.ts +43 -0
  116. package/src/three/theme-catalog.ts +1457 -0
  117. package/src/three/theme-material-assets.ts +258 -0
  118. package/src/three/theme-material-ktx2-manifest.ts +190 -0
  119. package/src/three/theme-material-registry.ts +1952 -0
  120. package/src/three/theme-world-factory.ts +590 -0
  121. package/src/three/track-connector-batch.ts +125 -0
  122. package/src/three/track-material-continuity.ts +442 -0
  123. package/src/three/track-theme.ts +535 -0
  124. package/src/three/vampire-castle-appearance.ts +258 -0
  125. package/src/three/visual-frame-pacing.ts +19 -0
  126. package/src/three/visual-geometry.ts +120 -0
  127. package/src/three/visual-quality.ts +83 -0
  128. package/src/three/water-appearance.ts +29 -0
  129. package/src/three/wild-west-sand-appearance.ts +2 -0
@@ -0,0 +1 @@
1
+ export * from '@marble.fun/physics-engine/flipper-bank-layout'
@@ -0,0 +1,127 @@
1
+ import * as THREE from 'three'
2
+
3
+ import { VisualCylinderGeometry, VisualExtrudeGeometry } from '../../three/visual-geometry'
4
+ import {
5
+ CANONICAL_FLIPPER_DIMENSIONS,
6
+ flipperCapOffset,
7
+ type FlipperComponentDimensions,
8
+ } from '@marble.fun/physics-engine/browser'
9
+
10
+ export {
11
+ CANONICAL_FLIPPER_DIMENSIONS,
12
+ CANONICAL_FLIPPER_SWEEP_RADIANS,
13
+ FLIPPER_COMPONENT_FRICTION,
14
+ FLIPPER_COMPONENT_RESTITUTION,
15
+ FLIPPER_MINIMUM_ONE_WAY_SWEEP_SECONDS,
16
+ flipperBarLength,
17
+ flipperCapOffset,
18
+ flipperStrikeArcTipSpeed,
19
+ flipperStrikeProgress,
20
+ type FlipperComponentDimensions,
21
+ } from '@marble.fun/physics-engine/browser'
22
+
23
+ /**
24
+ * The one visual/physical silhouette used by every flipper-shaped mechanism.
25
+ * Timing belongs to the owning mechanism; the component only owns shape.
26
+ */
27
+ export const FLIPPER_COMPONENT_RADIAL_SEGMENTS = 18
28
+
29
+ function createFlipperPaddleGeometry(dimensions: FlipperComponentDimensions): THREE.BufferGeometry {
30
+ const radius = dimensions.width / 2
31
+ const capOffset = flipperCapOffset(dimensions)
32
+ const outline = new THREE.Shape()
33
+ outline.moveTo(-capOffset, -radius)
34
+ outline.lineTo(capOffset, -radius)
35
+ outline.absarc(capOffset, 0, radius, -Math.PI / 2, Math.PI / 2, false)
36
+ outline.lineTo(-capOffset, radius)
37
+ outline.absarc(-capOffset, 0, radius, Math.PI / 2, Math.PI * 1.5, false)
38
+ outline.closePath()
39
+
40
+ const geometry = new VisualExtrudeGeometry(outline, {
41
+ bevelEnabled: false,
42
+ curveSegments: FLIPPER_COMPONENT_RADIAL_SEGMENTS / 2,
43
+ depth: dimensions.height,
44
+ steps: 1,
45
+ })
46
+ geometry.rotateX(Math.PI / 2)
47
+ geometry.translate(0, dimensions.height / 2, 0)
48
+ geometry.clearGroups()
49
+ geometry.addGroup(0, geometry.index?.count ?? geometry.getAttribute('position').count, 0)
50
+ return geometry
51
+ }
52
+
53
+ export function createFlipperPaddleVisual(
54
+ name: string,
55
+ material: THREE.Material,
56
+ dimensions: FlipperComponentDimensions = CANONICAL_FLIPPER_DIMENSIONS,
57
+ ): THREE.Group {
58
+ const paddle = new THREE.Group()
59
+ paddle.name = name
60
+ paddle.userData.mechanismComponent = 'canonical-flipper-paddle'
61
+ paddle.userData.flipperDimensions = { ...dimensions }
62
+ paddle.frustumCulled = false
63
+
64
+ const geometry = createFlipperPaddleGeometry(dimensions)
65
+ geometry.userData.mechanismComponent = 'canonical-flipper-paddle'
66
+ geometry.userData.flipperMaterialGroups = { paddle: 0 }
67
+ const surface = new THREE.Mesh(geometry, material)
68
+ surface.name = `${name}-surface`
69
+ surface.userData.flipperMaterialRoles = { paddle: 'primary' }
70
+ surface.castShadow = true
71
+ surface.receiveShadow = true
72
+ paddle.add(surface)
73
+ return paddle
74
+ }
75
+
76
+ /**
77
+ * A flipper-shaped arm whose object origin is the centre of its rounded hinge
78
+ * end. Runtime snapshots rotate this root while the child keeps the same
79
+ * half-length offset as the matching Rapier colliders.
80
+ */
81
+ export function createEndPivotedFlipperPaddleVisual(
82
+ name: string,
83
+ material: THREE.Material,
84
+ dimensions: FlipperComponentDimensions = CANONICAL_FLIPPER_DIMENSIONS,
85
+ hubMaterial: THREE.Material = material,
86
+ hubName = `${name}-hub`,
87
+ hubHeightPadding = 0.24,
88
+ ): THREE.Group {
89
+ const pivot = new THREE.Group()
90
+ pivot.name = name
91
+ pivot.userData.mechanismComponent = 'canonical-flipper-paddle'
92
+ pivot.userData.flipperDimensions = { ...dimensions }
93
+ pivot.userData.flipperPivot = 'rounded-end'
94
+ pivot.frustumCulled = false
95
+
96
+ const arm = createFlipperPaddleVisual(`${name}-arm`, material, dimensions)
97
+ arm.position.x = -dimensions.length / 2
98
+ const surface = arm.getObjectByName(`${name}-arm-surface`)
99
+ if (!(surface instanceof THREE.Mesh)) throw new Error('Canonical flipper paddle surface is missing')
100
+ surface.name = `${name}-surface`
101
+ const hub = createFlipperHubVisual(hubName, hubMaterial, dimensions, hubHeightPadding)
102
+ pivot.add(arm, hub)
103
+ return pivot
104
+ }
105
+
106
+ export function createFlipperHubVisual(
107
+ name: string,
108
+ material: THREE.Material,
109
+ dimensions: FlipperComponentDimensions = CANONICAL_FLIPPER_DIMENSIONS,
110
+ heightPadding = 0.24,
111
+ ): THREE.Mesh {
112
+ const hub = new THREE.Mesh(
113
+ new VisualCylinderGeometry(
114
+ dimensions.width * 0.72,
115
+ dimensions.width * 0.72,
116
+ dimensions.height + heightPadding,
117
+ FLIPPER_COMPONENT_RADIAL_SEGMENTS,
118
+ ),
119
+ material,
120
+ )
121
+ hub.name = name
122
+ hub.userData.mechanismComponent = 'canonical-flipper-hub'
123
+ hub.userData.flipperDimensions = { ...dimensions }
124
+ hub.castShadow = true
125
+ hub.receiveShadow = true
126
+ return hub
127
+ }
@@ -0,0 +1 @@
1
+ export * from '@marble.fun/physics-engine/rising-wall-layout'
@@ -0,0 +1 @@
1
+ export * from '@marble.fun/physics-engine/simple-obstacle-layout'
@@ -0,0 +1,28 @@
1
+ import {
2
+ createIntersectionRailDefinitions as createCoreIntersectionRailDefinitions,
3
+ createRoutingMergeDeck as createCoreRoutingMergeDeck,
4
+ createRoutingSplitterDeck as createCoreRoutingSplitterDeck,
5
+ } from '@marble.fun/physics-engine/track-piece-layout'
6
+
7
+ export * from '@marble.fun/physics-engine/track-piece-layout'
8
+
9
+ export function createRoutingSplitterDeck(...args: Parameters<typeof createCoreRoutingSplitterDeck>) {
10
+ const definition = createCoreRoutingSplitterDeck(...args)
11
+ return {
12
+ ...definition,
13
+ railroadProfile: 'routing-split' as const,
14
+ centerDivider: definition.centerDivider
15
+ ? { ...definition.centerDivider, visualRole: 'obstacle' as const }
16
+ : undefined,
17
+ }
18
+ }
19
+
20
+ export function createRoutingMergeDeck(...args: Parameters<typeof createCoreRoutingMergeDeck>) {
21
+ return { ...createCoreRoutingMergeDeck(...args), railroadProfile: 'routing-merge' as const }
22
+ }
23
+
24
+ export function createIntersectionRailDefinitions(...args: Parameters<typeof createCoreIntersectionRailDefinitions>) {
25
+ const definitions = createCoreIntersectionRailDefinitions(...args)
26
+ if (args[2].length <= 1) return definitions
27
+ return definitions.map(definition => ({ ...definition, railroadProfile: 'intersection-merge' as const }))
28
+ }