@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.
- package/LICENSE +21 -0
- package/README.md +15 -0
- package/assets.json +346 -0
- package/package.json +32 -0
- package/release.json +135 -0
- package/src/audio/game-audio-preference.ts +9 -0
- package/src/authoritative.ts +6 -0
- package/src/catalog.ts +1 -0
- package/src/index.ts +14 -0
- package/src/legacy-stock-catalog.ts +130 -0
- package/src/pages/lobby/lobby-types.ts +140 -0
- package/src/pages/lobby/marble-factory.ts +931 -0
- package/src/pages/play/race/egypt-elevator-blender.ts +159 -0
- package/src/pages/play/race/egypt-portal-frame.ts +382 -0
- package/src/pages/play/race/finish-detection.ts +1 -0
- package/src/pages/play/race/japanese-sakura-castle-support-blender.ts +510 -0
- package/src/pages/play/race/japanese-sakura-kawara-roof.ts +201 -0
- package/src/pages/play/race/japanese-sakura-portal-frame.ts +325 -0
- package/src/pages/play/race/jungle-portal-frame.ts +308 -0
- package/src/pages/play/race/jungle-temple-lift.ts +366 -0
- package/src/pages/play/race/marble-entity.ts +257 -0
- package/src/pages/play/race/marble-material.ts +20 -0
- package/src/pages/play/race/marble-race-engine.ts +2652 -0
- package/src/pages/play/race/path-pattern-layout.ts +142 -0
- package/src/pages/play/race/peg-obstacle-visual.ts +171 -0
- package/src/pages/play/race/physics-debug.ts +1 -0
- package/src/pages/play/race/physics-dry-run.ts +90 -0
- package/src/pages/play/race/portal-derived-elevator-skins.ts +729 -0
- package/src/pages/play/race/portal-pair-color.ts +20 -0
- package/src/pages/play/race/portal-proportions.ts +25 -0
- package/src/pages/play/race/portal-visual.ts +1108 -0
- package/src/pages/play/race/race-camera-director.ts +586 -0
- package/src/pages/play/race/race-camera-obstruction.ts +37 -0
- package/src/pages/play/race/race-camera-tour-planner.ts +274 -0
- package/src/pages/play/race/race-camera.ts +206 -0
- package/src/pages/play/race/race-completion.ts +5 -0
- package/src/pages/play/race/race-configuration.ts +57 -0
- package/src/pages/play/race/race-marble-focus-renderer.ts +134 -0
- package/src/pages/play/race/race-physics-profile.ts +7 -0
- package/src/pages/play/race/race-physics.ts +16 -0
- package/src/pages/play/race/race-playback.ts +41 -0
- package/src/pages/play/race/race-rolling-audio.ts +616 -0
- package/src/pages/play/race/race-simulation-renderer.ts +221 -0
- package/src/pages/play/race/race-terminal-checker-strip.ts +226 -0
- package/src/pages/play/race/race-transform-interpolation.ts +50 -0
- package/src/pages/play/race/race-types.ts +12 -0
- package/src/pages/play/race/rebound-visual.ts +70 -0
- package/src/pages/play/race/seeded-random.ts +23 -0
- package/src/pages/play/race/space-station-portal-frame.ts +275 -0
- package/src/pages/play/race/track-appearance-canopy.ts +946 -0
- package/src/pages/play/race/track-appearance-floor-runner.ts +206 -0
- package/src/pages/play/race/track-appearance-jungle-flower-hedge.ts +483 -0
- package/src/pages/play/race/track-appearance-rope-wall.ts +443 -0
- package/src/pages/play/race/track-appearance-sakura-bridge-fence.ts +305 -0
- package/src/pages/play/race/track-appearance-sakura-castle-wall.ts +1031 -0
- package/src/pages/play/race/track-appearance-space-station-wall.ts +497 -0
- package/src/pages/play/race/track-appearance-stone-block-shell.ts +517 -0
- package/src/pages/play/race/track-appearance-support.ts +983 -0
- package/src/pages/play/race/track-appearance-vampire-carved-wall.ts +545 -0
- package/src/pages/play/race/track-appearance-wall-terminal.ts +167 -0
- package/src/pages/play/race/track-course.ts +271 -0
- package/src/pages/play/race/track-definition.ts +443 -0
- package/src/pages/play/race/track-fence-architecture.ts +33 -0
- package/src/pages/play/race/track-floor-material-rules.ts +51 -0
- package/src/pages/play/race/track-mechanisms.ts +1350 -0
- package/src/pages/play/race/track-physics-surface.ts +6 -0
- package/src/pages/play/race/track-route-network.ts +9 -0
- package/src/pages/play/race/track-shadow-batching.ts +760 -0
- package/src/pages/play/race/track-surface-basis.ts +1 -0
- package/src/pages/play/race/track-surface-topology.ts +326 -0
- package/src/pages/play/race/track-world.ts +10181 -0
- package/src/pages/play/race/under-track-support-architecture.ts +122 -0
- package/src/pages/play/race/vortex-profile.ts +5 -0
- package/src/pages/play/race/vortex-water-effect.ts +863 -0
- package/src/pages/play/race/wild-west-mine-lift.ts +281 -0
- package/src/pages/play/race/wild-west-vortex-housing.ts +572 -0
- package/src/pages/track-lab/atlas-vortex-layout.ts +1 -0
- package/src/pages/track-lab/cone-field-layout.ts +1 -0
- package/src/pages/track-lab/conveyor-layout.ts +1 -0
- package/src/pages/track-lab/engine/canonical-track-assembly.ts +64 -0
- package/src/pages/track-lab/engine/editor-object-geometry.ts +170 -0
- package/src/pages/track-lab/engine/track-lab-connection-state.ts +123 -0
- package/src/pages/track-lab/engine/track-piece-visual.ts +1420 -0
- package/src/pages/track-lab/flipper-bank-layout.ts +1 -0
- package/src/pages/track-lab/flipper-component.ts +127 -0
- package/src/pages/track-lab/rising-wall-layout.ts +1 -0
- package/src/pages/track-lab/simple-obstacle-layout.ts +1 -0
- package/src/pages/track-lab/track-piece-layout.ts +28 -0
- package/src/pages/track-lab/track-runtime-adapter.ts +1152 -0
- package/src/three/geometry-attribute-aliases.ts +24 -0
- package/src/three/geometry-detail.ts +36 -0
- package/src/three/homepage-marble-geometry.ts +15 -0
- package/src/three/japanese-sakura-appearance.ts +252 -0
- package/src/three/jungle-flower-hedge-appearance.ts +7 -0
- package/src/three/jungle-temple-appearance.ts +5 -0
- package/src/three/low-quality-scene-renderer.ts +132 -0
- package/src/three/marble-sphere-geometry.ts +13 -0
- package/src/three/mobile-rendering-budget.ts +11 -0
- package/src/three/painted-valley-appearance.ts +270 -0
- package/src/three/railroad-appearance.ts +71 -0
- package/src/three/renderer-resize.ts +32 -0
- package/src/three/rope-wall-appearance.ts +91 -0
- package/src/three/rugged-track-appearance.ts +2 -0
- package/src/three/scene-lighting.ts +183 -0
- package/src/three/scene-shader-preparation.ts +64 -0
- package/src/three/scene-theme-controller.ts +461 -0
- package/src/three/shadow-shader-preparation.ts +162 -0
- package/src/three/shared-obstacle-metal.ts +44 -0
- package/src/three/soft-additive-particles.ts +57 -0
- package/src/three/space-station-appearance.ts +213 -0
- package/src/three/static-track-batched-mesh.ts +132 -0
- package/src/three/stone-track-shell-appearance.ts +12 -0
- package/src/three/theme-ambience-controller.ts +226 -0
- package/src/three/theme-asset-cache.ts +120 -0
- package/src/three/theme-audio-preference.ts +43 -0
- package/src/three/theme-catalog.ts +1457 -0
- package/src/three/theme-material-assets.ts +258 -0
- package/src/three/theme-material-ktx2-manifest.ts +190 -0
- package/src/three/theme-material-registry.ts +1952 -0
- package/src/three/theme-world-factory.ts +590 -0
- package/src/three/track-connector-batch.ts +125 -0
- package/src/three/track-material-continuity.ts +442 -0
- package/src/three/track-theme.ts +535 -0
- package/src/three/vampire-castle-appearance.ts +258 -0
- package/src/three/visual-frame-pacing.ts +19 -0
- package/src/three/visual-geometry.ts +120 -0
- package/src/three/visual-quality.ts +83 -0
- package/src/three/water-appearance.ts +29 -0
- 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
|
+
}
|