@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,122 @@
1
+ import * as THREE from 'three'
2
+
3
+ /**
4
+ * One architecture contract for every visual under-track support.
5
+ *
6
+ * Track pieces provide only their canonical path. Styles may change member
7
+ * profiles and materials, but they may not redefine depth, fade, or bay rhythm.
8
+ */
9
+ export const UNDER_TRACK_SUPPORT_DEPTH = 4.8
10
+ export const UNDER_TRACK_SUPPORT_FADE_START_DEPTH = 3.2
11
+ export const UNDER_TRACK_SUPPORT_FADE_DEPTH = 1.6
12
+ export const UNDER_TRACK_SUPPORT_BAY_LENGTH = 2.5
13
+
14
+ /** Reduces the old monument-scale footprints and member sections uniformly. */
15
+ export const UNDER_TRACK_SUPPORT_FOOTPRINT_SCALE = 0.55
16
+ export const UNDER_TRACK_SUPPORT_MEMBER_SCALE = 0.45
17
+
18
+ /** Decorative support runs join only when both connected pieces select the same style. */
19
+ export function underTrackSupportStylesConnect(
20
+ sourceSupportId: string | undefined,
21
+ targetSupportId: string | undefined,
22
+ ): boolean {
23
+ return sourceSupportId !== undefined && sourceSupportId === targetSupportId
24
+ }
25
+
26
+ /** Shared placement of vertical load-bearing members beneath a lane. */
27
+ export function underTrackSupportHalfSpan(trackWidth: number): number {
28
+ return Math.max(0.65, trackWidth * 0.25)
29
+ }
30
+
31
+ export interface UnderTrackSupportBaySchedule {
32
+ count: number
33
+ bayLength: number
34
+ centers: number[]
35
+ }
36
+
37
+ export interface UnderTrackSupportOwnedBay {
38
+ start: number
39
+ end: number
40
+ }
41
+
42
+ export interface UnderTrackSupportLayout extends UnderTrackSupportBaySchedule {
43
+ /** Complete global-grid bays whose midpoint is owned by this route interval. */
44
+ ownedBays: UnderTrackSupportOwnedBay[]
45
+ }
46
+
47
+ /**
48
+ * Places support bents on one absolute 2.5-unit metric grid.
49
+ *
50
+ * `connectionPhase` is the cumulative path length at this piece's input. The
51
+ * half-open interval deliberately gives a connector-aligned bent to the
52
+ * downstream piece, so adjacent pieces cannot render the same bent twice.
53
+ */
54
+ export function createUnderTrackSupportBaySchedule(
55
+ length: number,
56
+ connectionPhase = 0,
57
+ ): UnderTrackSupportBaySchedule {
58
+ if (!Number.isFinite(length) || length <= 0.000_001) {
59
+ return { count: 0, bayLength: 0, centers: [] }
60
+ }
61
+ const pitch = UNDER_TRACK_SUPPORT_BAY_LENGTH
62
+ const phase = ((connectionPhase % pitch) + pitch) % pitch
63
+ let center = ((pitch * 0.5 - phase) % pitch + pitch) % pitch
64
+ if (Math.abs(center - pitch) < 0.000_001) center = 0
65
+ const centers: number[] = []
66
+ while (center < length - 0.000_001) {
67
+ centers.push(center)
68
+ center += pitch
69
+ }
70
+ return {
71
+ count: centers.length,
72
+ bayLength: pitch,
73
+ centers,
74
+ }
75
+ }
76
+
77
+ /**
78
+ * One topology-safe layout for every support style.
79
+ *
80
+ * Stations are owned by the half-open piece interval. Bays are independently
81
+ * owned by their midpoint, allowing one piece to draw a complete bay across a
82
+ * connector (or across a short piece with no local station) without its
83
+ * neighbour drawing the same span.
84
+ */
85
+ export function createUnderTrackSupportLayout(
86
+ length: number,
87
+ connectionPhase = 0,
88
+ connectedStart = false,
89
+ connectedEnd = false,
90
+ ): UnderTrackSupportLayout {
91
+ const schedule = createUnderTrackSupportBaySchedule(length, connectionPhase)
92
+ if (!Number.isFinite(length) || length <= 0.000_001) return { ...schedule, ownedBays: [] }
93
+ const pitch = UNDER_TRACK_SUPPORT_BAY_LENGTH
94
+ const firstGlobalStation = pitch * 0.5
95
+ const firstIndex = Math.floor((connectionPhase - firstGlobalStation) / pitch) - 2
96
+ const lastIndex = Math.ceil((connectionPhase + length - firstGlobalStation) / pitch) + 2
97
+ const ownedBays: UnderTrackSupportOwnedBay[] = []
98
+ for (let index = firstIndex; index <= lastIndex; index += 1) {
99
+ const globalStart = firstGlobalStation + index * pitch
100
+ const globalEnd = globalStart + pitch
101
+ const start = globalStart - connectionPhase
102
+ const end = globalEnd - connectionPhase
103
+ const midpoint = (start + end) / 2
104
+ // Spans use (start, end] ownership: the route ending at a connector owns
105
+ // the complete crossing bay; the following route cannot duplicate it.
106
+ if (midpoint <= 0.000_001 || midpoint > length + 0.000_001) continue
107
+ if (start < -0.000_001 && !connectedStart) continue
108
+ if (end > length + 0.000_001 && !connectedEnd) continue
109
+ ownedBays.push({ start, end })
110
+ }
111
+ return { ...schedule, bayLength: pitch, ownedBays }
112
+ }
113
+
114
+ /** Shared clearance used when several routes occupy one junction volume. */
115
+ export function underTrackSupportStationClearance(trackWidth: number): number {
116
+ return Math.max(UNDER_TRACK_SUPPORT_BAY_LENGTH * 0.9, underTrackSupportHalfSpan(trackWidth) * 1.25)
117
+ }
118
+
119
+ /** Continuous local-depth fade shared by procedural and authored supports. */
120
+ export function underTrackSupportFadeAtDepth(depth: number): number {
121
+ return 1 - THREE.MathUtils.smoothstep(depth, UNDER_TRACK_SUPPORT_FADE_START_DEPTH, UNDER_TRACK_SUPPORT_DEPTH)
122
+ }
@@ -0,0 +1,5 @@
1
+ export {
2
+ vortexExitProfilePoint,
3
+ type VortexExitProfileOptions,
4
+ type VortexExitProfilePoint,
5
+ } from '@marble.fun/physics-engine'