@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,281 @@
1
+ import * as THREE from 'three'
2
+
3
+ import { VisualSphereGeometry, VisualCylinderGeometry, VisualTorusGeometry } from '../../../three/visual-geometry'
4
+
5
+ export const WILD_WEST_THEME_ID = 'rocky-mountain-wild-west'
6
+
7
+ export interface MineLiftVisualMaterials {
8
+ timber: THREE.Material
9
+ iron: THREE.Material
10
+ signal: THREE.Material
11
+ }
12
+
13
+ interface MineLiftFrameOptions {
14
+ id: string
15
+ bottom: THREE.Vector3
16
+ rotation: THREE.Quaternion
17
+ width: number
18
+ height: number
19
+ depth: number
20
+ releaseHeight: number
21
+ materials: MineLiftVisualMaterials
22
+ }
23
+
24
+ function addMesh(
25
+ group: THREE.Group,
26
+ name: string,
27
+ geometry: THREE.BufferGeometry,
28
+ material: THREE.Material,
29
+ position: THREE.Vector3,
30
+ rotation = new THREE.Quaternion(),
31
+ ): THREE.Mesh {
32
+ const mesh = new THREE.Mesh(geometry, material)
33
+ mesh.name = name
34
+ mesh.position.copy(position)
35
+ mesh.quaternion.copy(rotation)
36
+ mesh.castShadow = true
37
+ mesh.receiveShadow = true
38
+ mesh.userData.decorative = true
39
+ group.add(mesh)
40
+ return mesh
41
+ }
42
+
43
+ function addBeam(
44
+ group: THREE.Group,
45
+ name: string,
46
+ start: THREE.Vector3,
47
+ end: THREE.Vector3,
48
+ thickness: number,
49
+ material: THREE.Material,
50
+ ): THREE.Mesh {
51
+ const direction = end.clone().sub(start)
52
+ const length = direction.length()
53
+ const rotation = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), direction.normalize())
54
+ return addMesh(
55
+ group,
56
+ name,
57
+ new THREE.BoxGeometry(thickness, length, thickness),
58
+ material,
59
+ start.clone().lerp(end, 0.5),
60
+ rotation,
61
+ )
62
+ }
63
+
64
+ export function addWildWestMineLiftFrame(root: THREE.Group, options: MineLiftFrameOptions): THREE.Group {
65
+ const { id, bottom, rotation, width, height, depth, releaseHeight, materials } = options
66
+ const group = new THREE.Group()
67
+ group.name = `${id}-wild-west-mine-lift`
68
+ group.position.copy(bottom)
69
+ group.quaternion.copy(rotation)
70
+ group.userData.themeOnly = WILD_WEST_THEME_ID
71
+ group.userData.decorative = true
72
+
73
+ const sideX = width / 2 + 0.42
74
+ const frontZ = depth / 2 + 0.3
75
+ const backZ = -depth / 2 - 0.3
76
+ const timber = materials.timber
77
+ const iron = materials.iron
78
+ const postSize = 0.34
79
+
80
+ const rearPanelZ = -depth / 2 - 0.05
81
+ const exitOpeningBottom = THREE.MathUtils.clamp(releaseHeight - 0.34, 0.9, height - 1.5)
82
+ const exitOpeningTop = Math.min(height + 0.42, releaseHeight + 1.48)
83
+ const rearPanelBottom = -0.12
84
+ const rearPanelTop = height + 0.68
85
+ const lowerPanelHeight = exitOpeningBottom - rearPanelBottom
86
+ const upperPanelHeight = Math.max(0.24, rearPanelTop - exitOpeningTop)
87
+
88
+ addMesh(
89
+ group,
90
+ `${id}-mine-rear-lower-enclosure`,
91
+ new THREE.BoxGeometry(width - 0.34, lowerPanelHeight, 0.18),
92
+ timber,
93
+ new THREE.Vector3(0, (rearPanelBottom + exitOpeningBottom) / 2, rearPanelZ),
94
+ )
95
+ addMesh(
96
+ group,
97
+ `${id}-mine-rear-upper-enclosure`,
98
+ new THREE.BoxGeometry(width - 0.34, upperPanelHeight, 0.18),
99
+ timber,
100
+ new THREE.Vector3(0, (exitOpeningTop + rearPanelTop) / 2, rearPanelZ),
101
+ )
102
+
103
+ for (const y of [0.14, exitOpeningBottom - 0.16, exitOpeningTop + 0.16, height + 0.46]) {
104
+ addMesh(
105
+ group,
106
+ `${id}-mine-rear-iron-strap-${y}`,
107
+ new THREE.BoxGeometry(width - 0.12, 0.075, 0.055),
108
+ iron,
109
+ new THREE.Vector3(0, y, rearPanelZ - 0.12),
110
+ )
111
+ }
112
+
113
+ addMesh(
114
+ group,
115
+ `${id}-mine-base-plinth`,
116
+ new THREE.BoxGeometry(width + 0.72, 0.46, depth + 0.76),
117
+ timber,
118
+ new THREE.Vector3(0, -0.35, 0),
119
+ )
120
+ for (const z of [-depth / 2 - 0.4, depth / 2 + 0.4]) {
121
+ addMesh(
122
+ group,
123
+ `${id}-mine-base-iron-sill-${z}`,
124
+ new THREE.BoxGeometry(width + 0.86, 0.18, 0.16),
125
+ iron,
126
+ new THREE.Vector3(0, -0.14, z),
127
+ )
128
+ }
129
+
130
+ for (const x of [-sideX, sideX]) {
131
+ for (const z of [backZ, frontZ]) {
132
+ addMesh(
133
+ group,
134
+ `${id}-mine-upright-${x}-${z}`,
135
+ new THREE.BoxGeometry(postSize, height + 1.15, postSize),
136
+ timber,
137
+ new THREE.Vector3(x, height / 2 + 0.25, z),
138
+ )
139
+ addMesh(
140
+ group,
141
+ `${id}-mine-foot-${x}-${z}`,
142
+ new THREE.BoxGeometry(0.62, 0.18, 0.62),
143
+ iron,
144
+ new THREE.Vector3(x, 0.04, z),
145
+ )
146
+ }
147
+ }
148
+
149
+ const bayCount = Math.max(2, Math.round(height / 3.2))
150
+ for (const x of [-sideX, sideX]) {
151
+ for (let bay = 0; bay < bayCount; bay += 1) {
152
+ const low = 0.35 + (bay / bayCount) * height
153
+ const high = 0.35 + ((bay + 1) / bayCount) * height
154
+ addBeam(
155
+ group,
156
+ `${id}-mine-brace-a-${x}-${bay}`,
157
+ new THREE.Vector3(x, low, backZ),
158
+ new THREE.Vector3(x, high, frontZ),
159
+ 0.16,
160
+ timber,
161
+ )
162
+ addBeam(
163
+ group,
164
+ `${id}-mine-brace-b-${x}-${bay}`,
165
+ new THREE.Vector3(x, low, frontZ),
166
+ new THREE.Vector3(x, high, backZ),
167
+ 0.16,
168
+ timber,
169
+ )
170
+ }
171
+ }
172
+
173
+ for (const z of [backZ, frontZ]) {
174
+ addBeam(
175
+ group,
176
+ `${id}-mine-top-header-${z}`,
177
+ new THREE.Vector3(-sideX - 0.25, height + 0.55, z),
178
+ new THREE.Vector3(sideX + 0.25, height + 0.55, z),
179
+ 0.3,
180
+ timber,
181
+ )
182
+ addBeam(
183
+ group,
184
+ `${id}-mine-roof-left-${z}`,
185
+ new THREE.Vector3(-sideX, height + 0.55, z),
186
+ new THREE.Vector3(0, height + 1.65, z),
187
+ 0.24,
188
+ timber,
189
+ )
190
+ addBeam(
191
+ group,
192
+ `${id}-mine-roof-right-${z}`,
193
+ new THREE.Vector3(sideX, height + 0.55, z),
194
+ new THREE.Vector3(0, height + 1.65, z),
195
+ 0.24,
196
+ timber,
197
+ )
198
+ }
199
+ addBeam(
200
+ group,
201
+ `${id}-mine-roof-ridge`,
202
+ new THREE.Vector3(0, height + 1.65, backZ - 0.2),
203
+ new THREE.Vector3(0, height + 1.65, frontZ + 0.2),
204
+ 0.28,
205
+ timber,
206
+ )
207
+
208
+ const wheelPosition = new THREE.Vector3(0, height + 1.16, frontZ + 0.04)
209
+ addMesh(
210
+ group,
211
+ `${id}-mine-hoist-wheel`,
212
+ new VisualTorusGeometry(0.72, 0.105, 10, 28),
213
+ iron,
214
+ wheelPosition,
215
+ )
216
+ addMesh(
217
+ group,
218
+ `${id}-mine-hoist-hub`,
219
+ new VisualCylinderGeometry(0.18, 0.18, 0.48, 14),
220
+ iron,
221
+ wheelPosition,
222
+ new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(1, 0, 0), Math.PI / 2),
223
+ )
224
+ addMesh(
225
+ group,
226
+ `${id}-mine-hoist-cable`,
227
+ new VisualCylinderGeometry(0.028, 0.028, height + 0.5, 8),
228
+ iron,
229
+ new THREE.Vector3(0, height / 2 + 0.4, frontZ + 0.04),
230
+ )
231
+
232
+ for (const x of [-sideX, sideX]) {
233
+ addMesh(
234
+ group,
235
+ `${id}-mine-lantern-${x}`,
236
+ new VisualSphereGeometry(0.12, 12, 8),
237
+ materials.signal,
238
+ new THREE.Vector3(x * 0.84, height + 0.4, frontZ + 0.16),
239
+ )
240
+ }
241
+
242
+ root.add(group)
243
+ return group
244
+ }
245
+
246
+ export function decorateWildWestMineLiftShelf(
247
+ shelf: THREE.Mesh,
248
+ id: string,
249
+ width: number,
250
+ depth: number,
251
+ materials: MineLiftVisualMaterials,
252
+ ): void {
253
+ const decoration = new THREE.Group()
254
+ decoration.name = `${id}-wild-west-mine-platform`
255
+ decoration.userData.themeOnly = WILD_WEST_THEME_ID
256
+ decoration.userData.decorative = true
257
+ addMesh(
258
+ decoration,
259
+ `${id}-mine-platform-timber`,
260
+ new THREE.BoxGeometry(width, 0.09, depth),
261
+ materials.timber,
262
+ new THREE.Vector3(0, 0.11, 0),
263
+ )
264
+ for (const x of [-width * 0.34, 0, width * 0.34]) {
265
+ addMesh(
266
+ decoration,
267
+ `${id}-mine-platform-strap-${x}`,
268
+ new THREE.BoxGeometry(0.055, 0.035, depth * 0.96),
269
+ materials.iron,
270
+ new THREE.Vector3(x, 0.18, 0),
271
+ )
272
+ }
273
+ addMesh(
274
+ decoration,
275
+ `${id}-mine-platform-lip`,
276
+ new THREE.BoxGeometry(width, 0.22, 0.08),
277
+ materials.iron,
278
+ new THREE.Vector3(0, 0.2, depth / 2 - 0.05),
279
+ )
280
+ shelf.add(decoration)
281
+ }