@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 @@
|
|
|
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
|
+
}
|