@jgengine/core 0.10.0 → 0.12.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/CHANGELOG.md +39 -2
- package/LICENSE +203 -661
- package/README.md +1 -1
- package/dist/ai/crowd.d.ts +55 -0
- package/dist/ai/crowd.js +114 -0
- package/dist/ai/flock.d.ts +5 -2
- package/dist/ai/flock.js +5 -2
- package/dist/ai/groupAssist.d.ts +1 -0
- package/dist/ai/groupAssist.js +1 -0
- package/dist/ai/heatSystem.d.ts +76 -0
- package/dist/ai/heatSystem.js +97 -0
- package/dist/ai/interestScheduler.d.ts +107 -0
- package/dist/ai/interestScheduler.js +118 -0
- package/dist/ai/jobBoard.d.ts +1 -0
- package/dist/ai/jobBoard.js +1 -0
- package/dist/ai/laneSelect.d.ts +5 -2
- package/dist/ai/laneSelect.js +5 -2
- package/dist/ai/mobBrain.d.ts +1 -0
- package/dist/ai/mobBrain.js +1 -0
- package/dist/ai/populationDirector.d.ts +103 -0
- package/dist/ai/populationDirector.js +190 -0
- package/dist/ai/pursuit.d.ts +56 -0
- package/dist/ai/pursuit.js +53 -0
- package/dist/ai/spawnDirector.d.ts +7 -2
- package/dist/ai/spawnDirector.js +18 -15
- package/dist/ai/spawnPoint.d.ts +3 -1
- package/dist/ai/spawnPoint.js +3 -1
- package/dist/ai/targetAcquisition.d.ts +84 -0
- package/dist/ai/targetAcquisition.js +92 -0
- package/dist/anim/easing.d.ts +19 -0
- package/dist/anim/easing.js +19 -0
- package/dist/anim/oscillator.d.ts +12 -0
- package/dist/anim/oscillator.js +25 -0
- package/dist/area/areaEffectField.d.ts +127 -0
- package/dist/area/areaEffectField.js +175 -0
- package/dist/area/stackPolicy.d.ts +47 -0
- package/dist/area/stackPolicy.js +99 -0
- package/dist/authoring.d.ts +2 -1
- package/dist/authoring.js +2 -1
- package/dist/board/laneBoard.d.ts +13 -0
- package/dist/board/laneBoard.js +13 -0
- package/dist/board/timelineBoard.d.ts +10 -0
- package/dist/board/timelineBoard.js +10 -0
- package/dist/combat/abilityKit.d.ts +18 -0
- package/dist/combat/abilityKit.js +24 -9
- package/dist/combat/animationState.d.ts +5 -0
- package/dist/combat/animationState.js +5 -0
- package/dist/combat/breakMeters.d.ts +10 -0
- package/dist/combat/breakMeters.js +10 -0
- package/dist/combat/castRunner.d.ts +5 -0
- package/dist/combat/castRunner.js +5 -0
- package/dist/combat/comboPoints.d.ts +5 -0
- package/dist/combat/comboPoints.js +5 -0
- package/dist/combat/comboString.d.ts +5 -0
- package/dist/combat/comboString.js +5 -0
- package/dist/combat/damageInterceptors.d.ts +192 -0
- package/dist/combat/damageInterceptors.js +251 -0
- package/dist/combat/damageMatchup.d.ts +68 -0
- package/dist/combat/damageMatchup.js +42 -0
- package/dist/combat/damageResolution.d.ts +63 -0
- package/dist/combat/damageResolution.js +50 -0
- package/dist/combat/death.d.ts +7 -1
- package/dist/combat/death.js +5 -0
- package/dist/combat/deathReason.d.ts +14 -0
- package/dist/combat/deathReason.js +1 -0
- package/dist/combat/defensiveWindow.d.ts +5 -0
- package/dist/combat/defensiveWindow.js +5 -0
- package/dist/combat/dotField.d.ts +5 -1
- package/dist/combat/dotField.js +5 -1
- package/dist/combat/downed.d.ts +5 -0
- package/dist/combat/downed.js +5 -0
- package/dist/combat/effects.d.ts +5 -0
- package/dist/combat/effects.js +5 -0
- package/dist/combat/encounterSequence.d.ts +258 -0
- package/dist/combat/encounterSequence.js +426 -0
- package/dist/combat/hitReaction.d.ts +57 -1
- package/dist/combat/hitReaction.js +45 -5
- package/dist/combat/magazine.d.ts +54 -0
- package/dist/combat/magazine.js +96 -0
- package/dist/combat/projectiles.d.ts +5 -0
- package/dist/combat/projectiles.js +32 -14
- package/dist/combat/receivedDamage.d.ts +117 -0
- package/dist/combat/receivedDamage.js +92 -0
- package/dist/combat/regenShield.d.ts +5 -1
- package/dist/combat/regenShield.js +5 -1
- package/dist/combat/renderCues.d.ts +51 -0
- package/dist/combat/renderCues.js +44 -0
- package/dist/combat/resourcePool.d.ts +5 -0
- package/dist/combat/resourcePool.js +5 -0
- package/dist/combat/rewardAllocation.d.ts +121 -0
- package/dist/combat/rewardAllocation.js +251 -0
- package/dist/combat/shotOrigin.d.ts +18 -1
- package/dist/combat/shotOrigin.js +39 -0
- package/dist/combat/statusApplication.d.ts +96 -0
- package/dist/combat/statusApplication.js +81 -0
- package/dist/combat/telegraph.d.ts +11 -2
- package/dist/combat/telegraph.js +11 -2
- package/dist/combat/thresholdCrossings.d.ts +85 -0
- package/dist/combat/thresholdCrossings.js +116 -0
- package/dist/combat.d.ts +35 -0
- package/dist/combat.js +35 -0
- package/dist/commands/commandRegistry.d.ts +11 -0
- package/dist/commands/commandRegistry.js +9 -2
- package/dist/crafting/crop.d.ts +18 -0
- package/dist/crafting/crop.js +18 -0
- package/dist/crafting/production.d.ts +5 -0
- package/dist/crafting/production.js +5 -0
- package/dist/devtools/controls.d.ts +38 -0
- package/dist/devtools/controls.js +181 -0
- package/dist/devtools/devtools.d.ts +5 -197
- package/dist/devtools/devtools.js +38 -774
- package/dist/devtools/discover.d.ts +32 -0
- package/dist/devtools/discover.js +240 -0
- package/dist/devtools/fallbackSeams.d.ts +50 -0
- package/dist/devtools/fallbackSeams.js +111 -0
- package/dist/devtools/frame.d.ts +15 -0
- package/dist/devtools/frame.js +247 -0
- package/dist/devtools/logs.d.ts +15 -0
- package/dist/devtools/logs.js +86 -0
- package/dist/devtools/overrides.d.ts +16 -0
- package/dist/devtools/overrides.js +66 -0
- package/dist/devtools/rewriteTunables.d.ts +17 -0
- package/dist/devtools/rewriteTunables.js +276 -0
- package/dist/devtools/saveEndpoint.d.ts +46 -0
- package/dist/devtools/saveEndpoint.js +48 -0
- package/dist/devtools/transformTunables.d.ts +3 -0
- package/dist/devtools/transformTunables.js +3 -0
- package/dist/devtools/tunableSchema.d.ts +31 -0
- package/dist/devtools/tunableSchema.js +31 -0
- package/dist/devtools/types.d.ts +212 -0
- package/dist/devtools/types.js +1 -0
- package/dist/economy/auctionBook.d.ts +122 -0
- package/dist/economy/auctionBook.js +213 -0
- package/dist/economy/currency.d.ts +12 -1
- package/dist/economy/currency.js +12 -1
- package/dist/economy/listingBook.d.ts +91 -0
- package/dist/economy/listingBook.js +144 -0
- package/dist/economy/priceHistory.d.ts +44 -0
- package/dist/economy/priceHistory.js +89 -0
- package/dist/economy/resourceLedger.d.ts +222 -0
- package/dist/economy/resourceLedger.js +353 -0
- package/dist/economy/sharedWallet.d.ts +14 -0
- package/dist/economy/sharedWallet.js +14 -0
- package/dist/economy/techTree.d.ts +12 -0
- package/dist/economy/techTree.js +12 -0
- package/dist/economy/unlockPoints.d.ts +92 -0
- package/dist/economy/unlockPoints.js +103 -0
- package/dist/economy/wallet.d.ts +26 -2
- package/dist/economy/wallet.js +35 -6
- package/dist/editor/commandApply.d.ts +5 -0
- package/dist/editor/commandApply.js +755 -0
- package/dist/editor/commands.d.ts +235 -7
- package/dist/editor/commands.js +82 -124
- package/dist/editor/directives.d.ts +94 -0
- package/dist/editor/directives.js +206 -0
- package/dist/editor/document.d.ts +194 -13
- package/dist/editor/document.js +1166 -19
- package/dist/editor/entityCatalog.d.ts +42 -0
- package/dist/editor/entityCatalog.js +101 -0
- package/dist/editor/environment.d.ts +74 -0
- package/dist/editor/environment.js +169 -0
- package/dist/editor/grid.d.ts +229 -0
- package/dist/editor/grid.js +366 -0
- package/dist/editor/gridAdapters.d.ts +80 -0
- package/dist/editor/gridAdapters.js +134 -0
- package/dist/editor/index.d.ts +98 -6
- package/dist/editor/index.js +13 -2
- package/dist/editor/liveSync.d.ts +127 -0
- package/dist/editor/liveSync.js +249 -0
- package/dist/editor/minimap.d.ts +31 -0
- package/dist/editor/minimap.js +73 -0
- package/dist/editor/runtimeInspector.d.ts +88 -0
- package/dist/editor/runtimeInspector.js +239 -0
- package/dist/editor/streamer.d.ts +66 -0
- package/dist/editor/streamer.js +68 -0
- package/dist/editor/types.d.ts +250 -1
- package/dist/editor/world.d.ts +136 -0
- package/dist/editor/world.js +303 -0
- package/dist/faction/reputation.d.ts +5 -0
- package/dist/faction/reputation.js +5 -0
- package/dist/format/distance.d.ts +17 -0
- package/dist/format/distance.js +18 -0
- package/dist/format/duration.d.ts +27 -0
- package/dist/format/duration.js +45 -0
- package/dist/format/speed.d.ts +17 -0
- package/dist/format/speed.js +25 -0
- package/dist/game/breeding.d.ts +161 -0
- package/dist/game/breeding.js +181 -0
- package/dist/game/cameraConfig.d.ts +451 -0
- package/dist/game/cameraConfig.js +1 -0
- package/dist/game/connectedPlayers.d.ts +6 -4
- package/dist/game/connectedPlayers.js +2 -2
- package/dist/game/cosmetics.d.ts +9 -0
- package/dist/game/cosmetics.js +16 -0
- package/dist/game/defineGame.d.ts +110 -5
- package/dist/game/defineGame.js +49 -4
- package/dist/game/defineSystem.d.ts +90 -0
- package/dist/game/defineSystem.js +47 -0
- package/dist/game/dialogue.d.ts +33 -0
- package/dist/game/dialogue.js +21 -0
- package/dist/game/events.d.ts +63 -13
- package/dist/game/events.js +5 -0
- package/dist/game/feed.d.ts +33 -0
- package/dist/game/feed.js +35 -2
- package/dist/game/gamePhase.d.ts +11 -0
- package/dist/game/gamePhase.js +16 -0
- package/dist/game/leaderboard.d.ts +5 -0
- package/dist/game/leaderboard.js +5 -0
- package/dist/game/loadout.d.ts +5 -0
- package/dist/game/loadout.js +5 -0
- package/dist/game/lootFilter.d.ts +2 -0
- package/dist/game/lootFilter.js +2 -0
- package/dist/game/lootPipeline.d.ts +164 -0
- package/dist/game/lootPipeline.js +216 -0
- package/dist/game/lootTable.d.ts +19 -2
- package/dist/game/lootTable.js +15 -5
- package/dist/game/objectives.d.ts +43 -0
- package/dist/game/objectives.js +36 -0
- package/dist/game/paramLayers.d.ts +148 -0
- package/dist/game/paramLayers.js +185 -0
- package/dist/game/ping.d.ts +5 -0
- package/dist/game/ping.js +5 -0
- package/dist/game/playableGame.d.ts +116 -432
- package/dist/game/playableGame.js +1 -1
- package/dist/game/progression.d.ts +35 -0
- package/dist/game/progression.js +19 -0
- package/dist/game/quest.d.ts +8 -0
- package/dist/game/quest.js +30 -3
- package/dist/game/race.d.ts +141 -0
- package/dist/game/race.js +169 -0
- package/dist/game/recordBook.d.ts +3 -1
- package/dist/game/recordBook.js +4 -1
- package/dist/game/ruleSelection.d.ts +75 -0
- package/dist/game/ruleSelection.js +127 -0
- package/dist/game/runDraft.d.ts +5 -0
- package/dist/game/runDraft.js +5 -0
- package/dist/game/saveStore.d.ts +111 -0
- package/dist/game/saveStore.js +312 -0
- package/dist/game/snapshotHistory.d.ts +67 -0
- package/dist/game/snapshotHistory.js +95 -0
- package/dist/game/social.d.ts +38 -1
- package/dist/game/social.js +71 -0
- package/dist/game/spawnPoints.d.ts +5 -0
- package/dist/game/spawnPoints.js +5 -0
- package/dist/game/systemRuntime.d.ts +50 -0
- package/dist/game/systemRuntime.js +157 -0
- package/dist/game/systemSchedule.d.ts +72 -0
- package/dist/game/systemSchedule.js +242 -0
- package/dist/game/toasts.d.ts +43 -0
- package/dist/game/toasts.js +44 -0
- package/dist/game/trade.d.ts +10 -0
- package/dist/game/trade.js +10 -0
- package/dist/game/tribe.d.ts +184 -0
- package/dist/game/tribe.js +432 -0
- package/dist/game/unlocks.d.ts +8 -0
- package/dist/game/unlocks.js +16 -0
- package/dist/game/vfxInstance.d.ts +138 -0
- package/dist/game/vfxInstance.js +96 -0
- package/dist/game/worldItem.d.ts +17 -4
- package/dist/game/worldItem.js +17 -4
- package/dist/gameplay.d.ts +93 -0
- package/dist/gameplay.js +93 -0
- package/dist/index.d.ts +5 -14
- package/dist/index.js +5 -14
- package/dist/input/actionBindings.d.ts +23 -6
- package/dist/input/actionBindings.js +23 -6
- package/dist/input/axisInput.d.ts +7 -2
- package/dist/input/axisInput.js +7 -2
- package/dist/input/controlGroups.d.ts +67 -0
- package/dist/input/controlGroups.js +41 -0
- package/dist/input/touchScheme.d.ts +82 -6
- package/dist/input/touchScheme.js +123 -10
- package/dist/interaction/lockpick.d.ts +61 -0
- package/dist/interaction/lockpick.js +168 -0
- package/dist/interaction/proximityPrompt.d.ts +2 -0
- package/dist/interaction/proximityPrompt.js +2 -0
- package/dist/interaction/qte.d.ts +5 -0
- package/dist/interaction/qte.js +5 -0
- package/dist/interaction/skillCheck.d.ts +5 -0
- package/dist/interaction/skillCheck.js +5 -0
- package/dist/inventory/encumbrance.d.ts +69 -0
- package/dist/inventory/encumbrance.js +68 -0
- package/dist/inventory/inventoryModel.d.ts +12 -0
- package/dist/inventory/inventoryModel.js +12 -0
- package/dist/inventory/shapedGrid.d.ts +16 -0
- package/dist/inventory/shapedGrid.js +16 -0
- package/dist/inventory/slotModel.d.ts +10 -0
- package/dist/inventory/slotModel.js +10 -0
- package/dist/item/durability.d.ts +5 -0
- package/dist/item/durability.js +6 -3
- package/dist/item/itemIdentity.d.ts +171 -0
- package/dist/item/itemIdentity.js +138 -0
- package/dist/item/itemInstanceRegistry.d.ts +32 -0
- package/dist/item/itemInstanceRegistry.js +34 -0
- package/dist/item/itemgen.d.ts +163 -0
- package/dist/item/itemgen.js +151 -0
- package/dist/item/modularItem.d.ts +5 -0
- package/dist/item/modularItem.js +5 -0
- package/dist/item/use.d.ts +5 -0
- package/dist/item/use.js +5 -0
- package/dist/item/useBehavior.d.ts +142 -0
- package/dist/item/useBehavior.js +105 -0
- package/dist/item/weapon.d.ts +5 -0
- package/dist/item/weapon.js +5 -0
- package/dist/math/scalar.d.ts +25 -0
- package/dist/math/scalar.js +47 -0
- package/dist/meta/changelog.d.ts +4 -1
- package/dist/meta/changelog.js +39 -2
- package/dist/movement/avoidance.d.ts +45 -0
- package/dist/movement/avoidance.js +123 -0
- package/dist/movement/cameraRig.d.ts +8 -0
- package/dist/movement/cameraRig.js +8 -0
- package/dist/movement/dash.d.ts +11 -0
- package/dist/movement/dash.js +11 -0
- package/dist/movement/formation.d.ts +135 -0
- package/dist/movement/formation.js +194 -0
- package/dist/movement/glideModel.d.ts +5 -0
- package/dist/movement/glideModel.js +5 -0
- package/dist/movement/grappleSwing.d.ts +5 -0
- package/dist/movement/grappleSwing.js +5 -0
- package/dist/movement/leaderTrail.d.ts +5 -0
- package/dist/movement/leaderTrail.js +5 -0
- package/dist/movement/movementModel.d.ts +50 -9
- package/dist/movement/movementModel.js +75 -29
- package/dist/movement/playerMovement.js +167 -12
- package/dist/movement/poseState.d.ts +13 -0
- package/dist/movement/poseState.js +16 -0
- package/dist/movement/steering.d.ts +8 -0
- package/dist/movement/steering.js +18 -0
- package/dist/multiplayer/combatSnapshot.d.ts +3 -0
- package/dist/multiplayer/combatSnapshot.js +16 -8
- package/dist/multiplayer/lagCompensation.d.ts +5 -0
- package/dist/multiplayer/lagCompensation.js +5 -0
- package/dist/multiplayer/presenceModel.d.ts +11 -1
- package/dist/multiplayer/presenceModel.js +17 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +3 -0
- package/dist/multiplayer/simultaneousCommit.js +3 -0
- package/dist/multiplayer.d.ts +11 -0
- package/dist/multiplayer.js +11 -0
- package/dist/nav/pathFollow.d.ts +57 -0
- package/dist/nav/pathFollow.js +109 -0
- package/dist/orders/orderKinds.d.ts +156 -0
- package/dist/orders/orderKinds.js +197 -0
- package/dist/orders/orderQueue.d.ts +208 -0
- package/dist/orders/orderQueue.js +211 -0
- package/dist/physics/drivableVehicle.d.ts +31 -0
- package/dist/physics/drivableVehicle.js +16 -0
- package/dist/physics/flightDynamics.d.ts +82 -0
- package/dist/physics/flightDynamics.js +165 -0
- package/dist/physics/gravityField.d.ts +25 -0
- package/dist/physics/gravityField.js +41 -0
- package/dist/physics/kinematicVehicle.d.ts +108 -1
- package/dist/physics/kinematicVehicle.js +212 -15
- package/dist/physics/physicsWorld.d.ts +50 -12
- package/dist/physics/physicsWorld.js +120 -122
- package/dist/physics/radialImpulse.d.ts +25 -0
- package/dist/physics/radialImpulse.js +27 -0
- package/dist/physics/vehicleObstacles.d.ts +44 -0
- package/dist/physics/vehicleObstacles.js +115 -0
- package/dist/procedural.d.ts +3 -0
- package/dist/procedural.js +3 -0
- package/dist/progression/statGraph.d.ts +116 -0
- package/dist/progression/statGraph.js +318 -0
- package/dist/puzzle/cellGrid.d.ts +9 -0
- package/dist/puzzle/cellGrid.js +9 -0
- package/dist/puzzle/fallingPiece.d.ts +9 -0
- package/dist/puzzle/fallingPiece.js +9 -0
- package/dist/puzzle/nonogram.d.ts +39 -0
- package/dist/puzzle/nonogram.js +136 -0
- package/dist/random/nameGen.d.ts +5 -0
- package/dist/random/nameGen.js +5 -0
- package/dist/random/pick.d.ts +8 -0
- package/dist/random/pick.js +31 -0
- package/dist/random/rng.d.ts +26 -1
- package/dist/random/rng.js +32 -9
- package/dist/random/seedLink.d.ts +4 -0
- package/dist/random/seedLink.js +4 -0
- package/dist/relation/keyedValues.d.ts +54 -0
- package/dist/relation/keyedValues.js +115 -0
- package/dist/relation/thresholds.d.ts +62 -0
- package/dist/relation/thresholds.js +62 -0
- package/dist/render/color.d.ts +12 -0
- package/dist/render/color.js +26 -0
- package/dist/render/lookPreset.d.ts +41 -0
- package/dist/render/lookPreset.js +29 -0
- package/dist/render/postProcessing.d.ts +20 -0
- package/dist/render/postProcessing.js +21 -1
- package/dist/rules/predicate.d.ts +53 -0
- package/dist/rules/predicate.js +64 -0
- package/dist/rules/ruleEffects.d.ts +38 -0
- package/dist/rules/ruleEffects.js +37 -0
- package/dist/rules/triggeredRules.d.ts +160 -0
- package/dist/rules/triggeredRules.js +241 -0
- package/dist/runtime/adapter.d.ts +55 -3
- package/dist/runtime/adapter.js +57 -1
- package/dist/runtime/cameraDirector.d.ts +1 -0
- package/dist/runtime/cameraDirector.js +1 -0
- package/dist/runtime/commandRunner.d.ts +1 -0
- package/dist/runtime/commandRunner.js +1 -0
- package/dist/runtime/context/combat.d.ts +51 -0
- package/dist/runtime/context/combat.js +130 -0
- package/dist/runtime/context/combatFx.d.ts +23 -0
- package/dist/runtime/context/combatFx.js +161 -0
- package/dist/runtime/context/deathLoot.d.ts +30 -0
- package/dist/runtime/context/deathLoot.js +39 -0
- package/dist/runtime/context/player.d.ts +48 -0
- package/dist/runtime/context/player.js +125 -0
- package/dist/runtime/context/registries.d.ts +13 -0
- package/dist/runtime/context/registries.js +84 -0
- package/dist/runtime/context/scene.d.ts +59 -0
- package/dist/runtime/context/scene.js +291 -0
- package/dist/runtime/context/snapshotCodecs.d.ts +12 -0
- package/dist/runtime/context/snapshotCodecs.js +26 -0
- package/dist/runtime/context/worldItems.d.ts +21 -0
- package/dist/runtime/context/worldItems.js +37 -0
- package/dist/runtime/descriptors/baseline.d.ts +48 -0
- package/dist/runtime/descriptors/baseline.js +157 -0
- package/dist/runtime/descriptors/features.d.ts +79 -0
- package/dist/runtime/descriptors/features.js +299 -0
- package/dist/runtime/gameContext.d.ts +2 -327
- package/dist/runtime/gameContext.js +273 -778
- package/dist/runtime/gameContextTypes.d.ts +467 -0
- package/dist/runtime/gameContextTypes.js +1 -0
- package/dist/runtime/gameRuntime.d.ts +1 -0
- package/dist/runtime/gameRuntime.js +1 -0
- package/dist/runtime/headlessRunner.d.ts +62 -0
- package/dist/runtime/headlessRunner.js +45 -0
- package/dist/runtime/hostPersistence.d.ts +12 -0
- package/dist/runtime/hostPersistence.js +12 -0
- package/dist/runtime/hostPolicy.d.ts +51 -0
- package/dist/runtime/hostPolicy.js +68 -0
- package/dist/runtime/hostedGameRunner.d.ts +11 -4
- package/dist/runtime/hostedGameRunner.js +27 -3
- package/dist/runtime/hostedWorldSession.d.ts +15 -5
- package/dist/runtime/hostedWorldSession.js +12 -4
- package/dist/runtime/inputSnapshot.d.ts +8 -3
- package/dist/runtime/inputSnapshot.js +6 -2
- package/dist/runtime/motionIntents.d.ts +11 -2
- package/dist/runtime/motionIntents.js +16 -2
- package/dist/runtime/perContext.d.ts +15 -0
- package/dist/runtime/perContext.js +21 -0
- package/dist/runtime/runtimeSave.d.ts +79 -0
- package/dist/runtime/runtimeSave.js +105 -0
- package/dist/runtime/save.d.ts +4 -0
- package/dist/runtime/save.js +4 -0
- package/dist/runtime/snapshot.d.ts +7 -0
- package/dist/runtime/snapshot.js +7 -0
- package/dist/runtime/visibility.d.ts +2 -1
- package/dist/runtime/visibility.js +2 -1
- package/dist/runtime/worldChannel.d.ts +7 -3
- package/dist/runtime/worldChannel.js +51 -6
- package/dist/runtime/worldMirror.d.ts +14 -2
- package/dist/runtime/worldMirror.js +15 -2
- package/dist/runtime/worldProjection.d.ts +47 -0
- package/dist/runtime/worldProjection.js +52 -0
- package/dist/runtime/worldReplication.d.ts +30 -7
- package/dist/runtime/worldReplication.js +41 -9
- package/dist/runtime/worldSnapshot.d.ts +42 -3
- package/dist/runtime/worldSnapshot.js +34 -7
- package/dist/scene/assetCatalog.d.ts +26 -0
- package/dist/scene/assetCatalog.js +4 -0
- package/dist/scene/assetDiagnostics.d.ts +69 -0
- package/dist/scene/assetDiagnostics.js +110 -0
- package/dist/scene/assetGenerator.d.ts +65 -0
- package/dist/scene/assetGenerator.js +64 -0
- package/dist/scene/assetSpace.d.ts +137 -0
- package/dist/scene/assetSpace.js +257 -0
- package/dist/scene/authoredTriggers.d.ts +219 -0
- package/dist/scene/authoredTriggers.js +454 -0
- package/dist/scene/behaviorRuntime.d.ts +75 -0
- package/dist/scene/behaviorRuntime.js +217 -0
- package/dist/scene/behaviors.d.ts +14 -2
- package/dist/scene/behaviors.js +7 -2
- package/dist/scene/bodyBind.d.ts +60 -0
- package/dist/scene/bodyBind.js +51 -0
- package/dist/scene/builtinSceneKinds.d.ts +5 -0
- package/dist/scene/builtinSceneKinds.js +67 -0
- package/dist/scene/colliders.d.ts +71 -1
- package/dist/scene/colliders.js +145 -1
- package/dist/scene/collisionMesh.d.ts +94 -0
- package/dist/scene/collisionMesh.js +699 -0
- package/dist/scene/companion.d.ts +147 -0
- package/dist/scene/companion.js +193 -0
- package/dist/scene/entityStats.d.ts +18 -11
- package/dist/scene/entityStats.js +21 -16
- package/dist/scene/entityStore.d.ts +12 -1
- package/dist/scene/entityStore.js +15 -0
- package/dist/scene/facing.d.ts +18 -0
- package/dist/scene/facing.js +26 -0
- package/dist/scene/modelSockets.d.ts +33 -0
- package/dist/scene/modelSockets.js +29 -0
- package/dist/scene/objectQuery.d.ts +2 -0
- package/dist/scene/objectQuery.js +2 -0
- package/dist/scene/objectStore.d.ts +4 -0
- package/dist/scene/objectStore.js +6 -0
- package/dist/scene/possession.d.ts +8 -0
- package/dist/scene/possession.js +14 -0
- package/dist/scene/roster.d.ts +3 -0
- package/dist/scene/roster.js +12 -0
- package/dist/scene/sceneKinds.d.ts +256 -0
- package/dist/scene/sceneKinds.js +218 -0
- package/dist/scene/sceneOwnership.d.ts +169 -0
- package/dist/scene/sceneOwnership.js +179 -0
- package/dist/scene/sceneRaycast.js +15 -0
- package/dist/scene/selectionBookmarks.d.ts +93 -0
- package/dist/scene/selectionBookmarks.js +122 -0
- package/dist/scene/vehicleSeat.d.ts +68 -0
- package/dist/scene/vehicleSeat.js +59 -0
- package/dist/sensor/concealment.d.ts +3 -0
- package/dist/sensor/concealment.js +3 -0
- package/dist/sensor/freezeMonitor.d.ts +1 -0
- package/dist/sensor/freezeMonitor.js +1 -0
- package/dist/sensor/frustumSensor.d.ts +7 -3
- package/dist/sensor/frustumSensor.js +7 -3
- package/dist/sensor/hiddenStateProbe.d.ts +5 -2
- package/dist/sensor/hiddenStateProbe.js +5 -2
- package/dist/sensor/recordingBuffer.d.ts +2 -1
- package/dist/sensor/recordingBuffer.js +2 -1
- package/dist/sensor/replayLoop.d.ts +6 -2
- package/dist/sensor/replayLoop.js +6 -2
- package/dist/sensor/revealQuery.d.ts +2 -1
- package/dist/sensor/revealQuery.js +2 -1
- package/dist/sensor/visionCone.d.ts +10 -3
- package/dist/sensor/visionCone.js +10 -3
- package/dist/session/contestedChannel.d.ts +1 -0
- package/dist/session/contestedChannel.js +1 -0
- package/dist/session/extraction.d.ts +1 -0
- package/dist/session/extraction.js +1 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +6 -0
- package/dist/session/roundState.d.ts +8 -0
- package/dist/session/roundState.js +2 -0
- package/dist/settings/settingsModel.d.ts +1 -0
- package/dist/settings/settingsModel.js +1 -0
- package/dist/stats/accumulatorMeter.d.ts +6 -0
- package/dist/stats/accumulatorMeter.js +6 -0
- package/dist/stats/eventMeter.d.ts +5 -0
- package/dist/stats/eventMeter.js +5 -0
- package/dist/stats/rollCheck.d.ts +5 -0
- package/dist/stats/rollCheck.js +5 -0
- package/dist/stats/spawnLevelStats.d.ts +110 -0
- package/dist/stats/spawnLevelStats.js +140 -0
- package/dist/stats/statModifiers.d.ts +5 -0
- package/dist/stats/statModifiers.js +5 -0
- package/dist/stats/statPool.d.ts +70 -0
- package/dist/stats/statPool.js +59 -0
- package/dist/store/changeSignal.d.ts +3 -0
- package/dist/store/changeSignal.js +2 -0
- package/dist/store/defineKeyedStore.d.ts +38 -0
- package/dist/store/defineKeyedStore.js +42 -0
- package/dist/store/defineStore.d.ts +33 -0
- package/dist/store/defineStore.js +35 -0
- package/dist/store/observableKeyedStore.d.ts +7 -0
- package/dist/store/observableKeyedStore.js +35 -2
- package/dist/survival/decayMeter.d.ts +55 -0
- package/dist/survival/decayMeter.js +130 -57
- package/dist/survival/moodle.d.ts +2 -0
- package/dist/survival/regionHealth.d.ts +6 -0
- package/dist/survival/regionHealth.js +6 -3
- package/dist/tactics/fallingGrid.d.ts +4 -2
- package/dist/tactics/fallingGrid.js +4 -2
- package/dist/tactics/predictiveQuery.d.ts +3 -0
- package/dist/tactics/predictiveQuery.js +3 -0
- package/dist/tactics/snapshot.d.ts +2 -0
- package/dist/tactics/snapshot.js +2 -0
- package/dist/tactics/surface.d.ts +1 -0
- package/dist/tactics/surface.js +1 -0
- package/dist/tactics/tacticalGrid.d.ts +1 -0
- package/dist/tactics/tacticalGrid.js +1 -0
- package/dist/time/beatClock.d.ts +14 -4
- package/dist/time/beatClock.js +14 -4
- package/dist/time/calendarClock.d.ts +3 -0
- package/dist/time/calendarClock.js +3 -0
- package/dist/time/idleProgress.d.ts +4 -0
- package/dist/time/idleProgress.js +4 -0
- package/dist/time/simClock.d.ts +2 -0
- package/dist/time/simClock.js +20 -5
- package/dist/ui/actionModel.d.ts +110 -0
- package/dist/ui/actionModel.js +159 -0
- package/dist/ui/gameLayout.d.ts +30 -11
- package/dist/ui/gameLayout.js +30 -11
- package/dist/ui/hudDocument.d.ts +114 -0
- package/dist/ui/hudDocument.js +220 -0
- package/dist/ui/hudLayout.d.ts +38 -1
- package/dist/ui/hudLayout.js +220 -17
- package/dist/ui/selectionModel.d.ts +92 -0
- package/dist/ui/selectionModel.js +88 -0
- package/dist/ui/tooltipModel.d.ts +63 -0
- package/dist/ui/tooltipModel.js +82 -0
- package/dist/ui.d.ts +15 -0
- package/dist/ui.js +15 -0
- package/dist/visibility/bounds.d.ts +8 -1
- package/dist/visibility/bounds.js +8 -1
- package/dist/visibility/frustum.d.ts +12 -3
- package/dist/visibility/frustum.js +12 -3
- package/dist/work/jobQueue.d.ts +201 -0
- package/dist/work/jobQueue.js +253 -0
- package/dist/work/unitTraining.d.ts +58 -0
- package/dist/work/unitTraining.js +52 -0
- package/dist/world/authoredEntities.d.ts +29 -0
- package/dist/world/authoredEntities.js +29 -0
- package/dist/world/authoredObjects.d.ts +72 -0
- package/dist/world/authoredObjects.js +81 -0
- package/dist/world/authoredSpawn.d.ts +39 -0
- package/dist/world/authoredSpawn.js +37 -0
- package/dist/world/buildSockets.d.ts +152 -0
- package/dist/world/buildSockets.js +188 -0
- package/dist/world/buildingGenerator.d.ts +18 -0
- package/dist/world/buildingGenerator.js +62 -0
- package/dist/world/buildings.d.ts +5 -0
- package/dist/world/buildings.js +5 -0
- package/dist/world/catenary.d.ts +22 -0
- package/dist/world/catenary.js +69 -0
- package/dist/world/cityBlocks.d.ts +152 -0
- package/dist/world/cityBlocks.js +670 -0
- package/dist/world/cityContent.d.ts +77 -0
- package/dist/world/cityContent.js +261 -0
- package/dist/world/cityGeometry.d.ts +114 -0
- package/dist/world/cityGeometry.js +573 -0
- package/dist/world/cityKind.d.ts +314 -0
- package/dist/world/cityKind.js +1578 -0
- package/dist/world/features.d.ts +133 -10
- package/dist/world/features.js +66 -6
- package/dist/world/footprintGrid.d.ts +59 -0
- package/dist/world/footprintGrid.js +141 -0
- package/dist/world/geometry.d.ts +64 -0
- package/dist/world/geometry.js +94 -0
- package/dist/world/grassKind.d.ts +51 -0
- package/dist/world/grassKind.js +101 -0
- package/dist/world/markers.d.ts +50 -4
- package/dist/world/markers.js +49 -0
- package/dist/world/massing.js +1 -1
- package/dist/world/minimapBake.d.ts +78 -0
- package/dist/world/minimapBake.js +208 -0
- package/dist/world/minimapTrack.d.ts +17 -0
- package/dist/world/minimapTrack.js +22 -0
- package/dist/world/pathInstances.d.ts +27 -0
- package/dist/world/pathInstances.js +27 -0
- package/dist/world/pathNetwork.d.ts +159 -0
- package/dist/world/pathNetwork.js +684 -0
- package/dist/world/pathTerrain.d.ts +80 -0
- package/dist/world/pathTerrain.js +142 -0
- package/dist/world/place.d.ts +166 -0
- package/dist/world/place.js +96 -0
- package/dist/world/placeAsset.d.ts +81 -0
- package/dist/world/placeAsset.js +79 -0
- package/dist/world/placement.d.ts +4 -0
- package/dist/world/placement.js +4 -0
- package/dist/world/placementController.d.ts +6 -0
- package/dist/world/placementController.js +6 -0
- package/dist/world/poleLineKind.d.ts +40 -0
- package/dist/world/poleLineKind.js +97 -0
- package/dist/world/polyline.d.ts +34 -0
- package/dist/world/polyline.js +88 -0
- package/dist/world/resourceNode.d.ts +109 -0
- package/dist/world/resourceNode.js +140 -0
- package/dist/world/roads.d.ts +8 -0
- package/dist/world/roads.js +38 -0
- package/dist/world/scatter.js +2 -20
- package/dist/world/scatterRegion.d.ts +164 -0
- package/dist/world/scatterRegion.js +409 -0
- package/dist/world/sceneShapes.d.ts +43 -0
- package/dist/world/sceneShapes.js +1 -0
- package/dist/world/segment.d.ts +27 -0
- package/dist/world/segment.js +43 -0
- package/dist/world/soilKind.d.ts +48 -0
- package/dist/world/soilKind.js +92 -0
- package/dist/world/spatialSample.d.ts +241 -0
- package/dist/world/spatialSample.js +465 -0
- package/dist/world/streets.d.ts +29 -0
- package/dist/world/streets.js +55 -0
- package/dist/world/terraform.d.ts +213 -1
- package/dist/world/terraform.js +627 -22
- package/dist/world/terrain.d.ts +164 -20
- package/dist/world/terrain.js +325 -41
- package/dist/world/terrainGuides.d.ts +182 -0
- package/dist/world/terrainGuides.js +343 -0
- package/dist/world/vec2.d.ts +81 -0
- package/dist/world/vec2.js +128 -0
- package/dist/world/vec3.d.ts +49 -0
- package/dist/world/vec3.js +76 -0
- package/dist/world/vegetation.d.ts +71 -0
- package/dist/world/vegetation.js +151 -0
- package/dist/world/visibilityField.d.ts +154 -0
- package/dist/world/visibilityField.js +271 -0
- package/dist/world/volumetricClouds.d.ts +52 -0
- package/dist/world/volumetricClouds.js +43 -0
- package/dist/world/walls.d.ts +9 -0
- package/dist/world/walls.js +9 -0
- package/dist/world/waterKind.d.ts +55 -0
- package/dist/world/waterKind.js +99 -0
- package/dist/world.d.ts +141 -0
- package/dist/world.js +141 -0
- package/package.json +32 -8
- package/skills/game-design/SKILL.md +28 -0
- package/skills/game-design/agents/openai.yaml +4 -0
- package/skills/game-design/references/application-playbook.md +170 -0
- package/skills/game-design/references/field-guide.md +288 -0
- package/skills/jgengine/SKILL.md +54 -0
- package/skills/jgengine/api.md +527 -0
- package/skills/jgengine/capabilities.md +131 -0
- package/skills/jgengine/recipes/minimal-game.md +88 -0
- package/skills/jgengine-combat/SKILL.md +38 -0
- package/skills/jgengine-combat/api.md +585 -0
- package/skills/jgengine-combat/capabilities.md +213 -0
- package/skills/jgengine-combat/recipes/portable-stat-pools.md +122 -0
- package/skills/jgengine-combat/reference.md +108 -0
- package/skills/jgengine-gameplay/SKILL.md +39 -0
- package/skills/jgengine-gameplay/api.md +1920 -0
- package/skills/jgengine-gameplay/capabilities.md +454 -0
- package/skills/jgengine-gameplay/reference-systems.md +56 -0
- package/skills/jgengine-world/SKILL.md +51 -0
- package/skills/jgengine-world/api.md +3056 -0
- package/skills/jgengine-world/capabilities.md +476 -0
- package/skills/jgengine-world/recipes/commanding-entities.md +128 -0
- package/skills/jgengine-world/reference.md +261 -0
- package/dist/cartridge/runtime.d.ts +0 -15
- package/dist/cartridge/runtime.js +0 -556
- package/dist/cartridge/spec.d.ts +0 -188
- package/dist/cartridge/spec.js +0 -19
- package/dist/cartridge/validate.d.ts +0 -2
- package/dist/cartridge/validate.js +0 -78
- package/dist/store/engineStore.d.ts +0 -22
- package/dist/store/engineStore.js +0 -50
- package/dist/store/features.d.ts +0 -10
- package/dist/store/features.js +0 -23
- package/llms.txt +0 -5389
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import type { TerrainField } from "./terrain.js";
|
|
2
|
+
/** A world-space point on the ground plane as an `[x, z]` pair. */
|
|
3
|
+
export type GroundPoint = readonly [number, number];
|
|
4
|
+
/** A height sampler over the ground: world elevation at any `x`/`z`. */
|
|
5
|
+
export type HeightSampler = (x: number, z: number) => number;
|
|
6
|
+
/** An axis-aligned XZ rectangle to generate terrain-readability guides within. */
|
|
7
|
+
export interface GuideRegion {
|
|
8
|
+
minX: number;
|
|
9
|
+
minZ: number;
|
|
10
|
+
maxX: number;
|
|
11
|
+
maxZ: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A sampled height grid over a region — the shared substrate contour extraction and elevation
|
|
15
|
+
* summaries both read, so a caller can sample once and derive several guides from it.
|
|
16
|
+
* @internal — an intermediate; games call {@link extractContours} / {@link summarizeElevation} directly.
|
|
17
|
+
*/
|
|
18
|
+
export interface HeightGrid {
|
|
19
|
+
region: GuideRegion;
|
|
20
|
+
/** Sample columns and rows (each is `resolution + 1` points across its axis). */
|
|
21
|
+
cols: number;
|
|
22
|
+
rows: number;
|
|
23
|
+
/** Row-major heights, length `cols * rows` (row `r`, column `c` at index `r * cols + c`). */
|
|
24
|
+
heights: Float64Array;
|
|
25
|
+
min: number;
|
|
26
|
+
max: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Samples `sampleHeight` on a `(resolution + 1)²` grid across `region`, capturing the min/max seen —
|
|
30
|
+
* the bounded, budget-capped scan every guide derives from. `resolution` is clamped to `[1, maxSamples]`.
|
|
31
|
+
* @internal — building block behind the public guide generators.
|
|
32
|
+
*/
|
|
33
|
+
export declare function sampleHeightGrid(sampleHeight: HeightSampler, region: GuideRegion, resolution?: number, maxSamples?: number): HeightGrid;
|
|
34
|
+
/** A single iso-elevation contour traced across a region as a flat list of XZ line segments. */
|
|
35
|
+
export interface ContourLine {
|
|
36
|
+
/** The world elevation (`y`) this contour follows. */
|
|
37
|
+
level: number;
|
|
38
|
+
/** Whether this is a major (emphasised) contour rather than a minor one. */
|
|
39
|
+
major: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Flat segment endpoints `[x0, z0, x1, z1, ...]` — every four numbers is one XZ segment. Draw each
|
|
42
|
+
* at `y = level` to drape it on the surface; the contour is exact iso-height so it hugs terrain.
|
|
43
|
+
*/
|
|
44
|
+
segments: readonly number[];
|
|
45
|
+
}
|
|
46
|
+
/** Shaping for {@link extractContours}: region, vertical spacing, emphasis cadence, and sample budget. */
|
|
47
|
+
export interface ContourOptions {
|
|
48
|
+
region: GuideRegion;
|
|
49
|
+
/** Vertical spacing between adjacent contour lines, in world units. Must be `> 0`. */
|
|
50
|
+
interval: number;
|
|
51
|
+
/** Every Nth line (counting from `y = 0`) is a major contour. Default `5`; `<= 1` makes all major. */
|
|
52
|
+
majorEvery?: number;
|
|
53
|
+
/** Samples per axis for the marching-squares grid. Default `128`, clamped to `[1, maxSamples]`. */
|
|
54
|
+
resolution?: number;
|
|
55
|
+
/** Hard per-axis sample cap so extraction stays within an explicit budget. Default `256`. */
|
|
56
|
+
maxSamples?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Traces surface-following contour lines from a height field via marching squares: samples a bounded
|
|
60
|
+
* grid over the region, then for every multiple of `interval` strictly inside the sampled height range
|
|
61
|
+
* emits the iso-line as XZ segments (saddle cells disambiguated by the cell-center average). Because a
|
|
62
|
+
* contour is exact constant elevation, drawing each segment at `y = level` makes it hug the terrain —
|
|
63
|
+
* the readable, scale-bearing overlay a flat ground grid cannot give. Pure math, renderer-agnostic.
|
|
64
|
+
* @capability terrain-contours iso-elevation contour lines that drape on sculpted terrain
|
|
65
|
+
* @consumer editor terrain-readability overlay; any map/minimap wanting elevation contours
|
|
66
|
+
*/
|
|
67
|
+
export declare function extractContours(sampleHeight: HeightSampler, options: ContourOptions): ContourLine[];
|
|
68
|
+
/**
|
|
69
|
+
* Picks a human-friendly contour interval — a `1/2/2.5/5 × 10ⁿ` step — so an elevation `range` splits
|
|
70
|
+
* into roughly `targetLines` bands. Drives adaptive contour density: a tall terrain gets a coarse
|
|
71
|
+
* interval, a shallow one a fine interval, without the author choosing a number. Returns `0` when the
|
|
72
|
+
* range is non-positive (nothing to contour).
|
|
73
|
+
* @capability contour-interval readable auto-spacing for elevation contours
|
|
74
|
+
* @consumer editor terrain-readability overlay density control
|
|
75
|
+
*/
|
|
76
|
+
export declare function chooseContourInterval(range: number, targetLines?: number): number;
|
|
77
|
+
/** Measurable elevation readout at a single world point — the cursor/hover feedback value. */
|
|
78
|
+
export interface ElevationReadout {
|
|
79
|
+
x: number;
|
|
80
|
+
z: number;
|
|
81
|
+
/** Ground elevation at the point. */
|
|
82
|
+
height: number;
|
|
83
|
+
/** `height - reference` — signed distance above (+) or below (−) the reference plane. */
|
|
84
|
+
delta: number;
|
|
85
|
+
/** The reference-plane height the delta was measured against. */
|
|
86
|
+
reference: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Reads the ground elevation under a world point and its signed delta from a reference plane — the
|
|
90
|
+
* measurable cursor/hover feedback ("+3.4 above the pad") an author needs to judge sculpted height.
|
|
91
|
+
* @capability elevation-readout cursor height and delta-from-reference feedback
|
|
92
|
+
* @consumer editor terrain-readability HUD readout
|
|
93
|
+
*/
|
|
94
|
+
export declare function sampleElevation(sampleHeight: HeightSampler, x: number, z: number, reference?: number): ElevationReadout;
|
|
95
|
+
/** Aggregate elevation statistics over a region — the selection min/max/mean and legend range. */
|
|
96
|
+
export interface ElevationSummary {
|
|
97
|
+
min: number;
|
|
98
|
+
max: number;
|
|
99
|
+
mean: number;
|
|
100
|
+
/** `max - min` — the vertical relief across the region. */
|
|
101
|
+
range: number;
|
|
102
|
+
/** World point where the lowest sample was found. */
|
|
103
|
+
minAt: GroundPoint;
|
|
104
|
+
/** World point where the highest sample was found. */
|
|
105
|
+
maxAt: GroundPoint;
|
|
106
|
+
/** Number of grid samples taken. */
|
|
107
|
+
samples: number;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Summarises elevation across a region on a bounded sample grid: min, max, mean, relief range, and the
|
|
111
|
+
* world points of the extremes — the selection min/max and legend feedback the readability overlay
|
|
112
|
+
* reports, and the input to {@link chooseContourInterval}. Pure math, renderer-agnostic.
|
|
113
|
+
* @capability elevation-summary selection min/max/mean and relief over a region
|
|
114
|
+
* @consumer editor terrain-readability legend and selection stats
|
|
115
|
+
*/
|
|
116
|
+
export declare function summarizeElevation(sampleHeight: HeightSampler, region: GuideRegion, resolution?: number, maxSamples?: number): ElevationSummary;
|
|
117
|
+
/** Shaping for surface draping: subdivision spacing and a lift to keep the line off the ground. */
|
|
118
|
+
export interface DrapeOptions {
|
|
119
|
+
/** Max world spacing between draped vertices; longer spans are subdivided so the line hugs the surface. Default `1`. */
|
|
120
|
+
spacing?: number;
|
|
121
|
+
/** Lift each draped vertex this far above the sampled surface, to avoid z-fighting. Default `0`. */
|
|
122
|
+
offset?: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Drapes an XZ polyline onto the surface: subdivides each span to at most `spacing` and lifts every
|
|
126
|
+
* vertex to `sampleHeight + offset`, returning flat `[x, y, z, ...]` world triples. The reusable seam
|
|
127
|
+
* behind surface-following placement guides and grid lines — a straight guide bends to follow terrain.
|
|
128
|
+
* @capability surface-drape lift an XZ polyline onto sculpted terrain
|
|
129
|
+
* @consumer editor placement guides and surface grid overlay
|
|
130
|
+
*/
|
|
131
|
+
export declare function drapePolyline(sampleHeight: HeightSampler, points: readonly GroundPoint[], options?: DrapeOptions): number[];
|
|
132
|
+
/**
|
|
133
|
+
* A closed circle draped on the surface — the surface-following placement guide ring under a cursor or
|
|
134
|
+
* a selected object. Returns flat `[x, y, z, ...]` world triples forming a loop (last vertex repeats
|
|
135
|
+
* the first). `segments` sets the smoothness of the ring.
|
|
136
|
+
* @capability surface-ring surface-following placement guide ring
|
|
137
|
+
* @consumer editor cursor/placement guide
|
|
138
|
+
*/
|
|
139
|
+
export declare function surfaceRing(sampleHeight: HeightSampler, center: GroundPoint, radius: number, segments?: number, options?: DrapeOptions): number[];
|
|
140
|
+
/** One draped grid line from {@link surfaceGridLines}: its axis, emphasis, and draped vertices. */
|
|
141
|
+
export interface SurfaceGridLine {
|
|
142
|
+
/** Which axis the line runs constant along: an `"x"` line holds `x` fixed and spans `z`, and vice versa. */
|
|
143
|
+
axis: "x" | "z";
|
|
144
|
+
/** The constant coordinate value the line holds. */
|
|
145
|
+
at: number;
|
|
146
|
+
/** Whether this is a major (emphasised) grid line. */
|
|
147
|
+
major: boolean;
|
|
148
|
+
/** Flat `[x, y, z, ...]` world triples draped on the surface. */
|
|
149
|
+
points: readonly number[];
|
|
150
|
+
}
|
|
151
|
+
/** Shaping for {@link surfaceGridLines}: region, spacing, emphasis cadence, and draping. */
|
|
152
|
+
export interface SurfaceGridOptions {
|
|
153
|
+
region: GuideRegion;
|
|
154
|
+
/** World distance between adjacent grid lines. Must be `> 0`. */
|
|
155
|
+
spacing: number;
|
|
156
|
+
/** Every Nth line (counting from origin) is a major line. Default `5`; `<= 1` makes all major. */
|
|
157
|
+
majorEvery?: number;
|
|
158
|
+
/** Draping options for each line. */
|
|
159
|
+
drape?: DrapeOptions;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Builds a surface-following major/minor grid over a region: constant-`x` and constant-`z` lines at
|
|
163
|
+
* `spacing`, each draped onto the terrain so the reference grid climbs sculpted surfaces instead of
|
|
164
|
+
* being occluded by them (the flat `y = 0` grid's core failure). Draping subdivides to
|
|
165
|
+
* `drape.spacing`. Pure math, renderer-agnostic.
|
|
166
|
+
* @capability surface-grid terrain-following reference grid that is not occluded by relief
|
|
167
|
+
* @consumer editor terrain-readability grid overlay
|
|
168
|
+
*/
|
|
169
|
+
export declare function surfaceGridLines(sampleHeight: HeightSampler, options: SurfaceGridOptions): SurfaceGridLine[];
|
|
170
|
+
/**
|
|
171
|
+
* Convenience over {@link extractContours} that auto-picks the interval from the field's own relief:
|
|
172
|
+
* summarises the region, chooses a readable interval for `targetLines` bands, and traces the contours —
|
|
173
|
+
* the one call the editor overlay makes to turn a `TerrainField` into ready-to-draw guides. Returns an
|
|
174
|
+
* empty list for flat ground.
|
|
175
|
+
* @capability terrain-guides one-call adaptive contours for a terrain field
|
|
176
|
+
* @consumer editor terrain-readability overlay
|
|
177
|
+
*/
|
|
178
|
+
export declare function terrainContourGuides(field: Pick<TerrainField, "sampleHeight">, region: GuideRegion, targetLines?: number, resolution?: number): {
|
|
179
|
+
interval: number;
|
|
180
|
+
summary: ElevationSummary;
|
|
181
|
+
contours: ContourLine[];
|
|
182
|
+
};
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
function assertRegion(region) {
|
|
2
|
+
if (!(region.maxX > region.minX) || !(region.maxZ > region.minZ)) {
|
|
3
|
+
throw new Error("terrainGuides: region must have maxX > minX and maxZ > minZ");
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
function clampInt(value, min, max) {
|
|
7
|
+
const v = Math.round(value);
|
|
8
|
+
return v < min ? min : v > max ? max : v;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Samples `sampleHeight` on a `(resolution + 1)²` grid across `region`, capturing the min/max seen —
|
|
12
|
+
* the bounded, budget-capped scan every guide derives from. `resolution` is clamped to `[1, maxSamples]`.
|
|
13
|
+
* @internal — building block behind the public guide generators.
|
|
14
|
+
*/
|
|
15
|
+
export function sampleHeightGrid(sampleHeight, region, resolution = 128, maxSamples = 256) {
|
|
16
|
+
assertRegion(region);
|
|
17
|
+
const res = clampInt(resolution, 1, Math.max(1, Math.round(maxSamples)));
|
|
18
|
+
const cols = res + 1;
|
|
19
|
+
const rows = res + 1;
|
|
20
|
+
const heights = new Float64Array(cols * rows);
|
|
21
|
+
const spanX = region.maxX - region.minX;
|
|
22
|
+
const spanZ = region.maxZ - region.minZ;
|
|
23
|
+
let min = Infinity;
|
|
24
|
+
let max = -Infinity;
|
|
25
|
+
for (let r = 0; r < rows; r += 1) {
|
|
26
|
+
const z = region.minZ + (r / res) * spanZ;
|
|
27
|
+
for (let c = 0; c < cols; c += 1) {
|
|
28
|
+
const x = region.minX + (c / res) * spanX;
|
|
29
|
+
const h = sampleHeight(x, z);
|
|
30
|
+
heights[r * cols + c] = h;
|
|
31
|
+
if (h < min)
|
|
32
|
+
min = h;
|
|
33
|
+
if (h > max)
|
|
34
|
+
max = h;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { region, cols, rows, heights, min, max };
|
|
38
|
+
}
|
|
39
|
+
function lerpPoint(ax, az, av, bx, bz, bv, level) {
|
|
40
|
+
const denom = bv - av;
|
|
41
|
+
const t = denom === 0 ? 0.5 : (level - av) / denom;
|
|
42
|
+
const clamped = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
43
|
+
return [ax + (bx - ax) * clamped, az + (bz - az) * clamped];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Traces surface-following contour lines from a height field via marching squares: samples a bounded
|
|
47
|
+
* grid over the region, then for every multiple of `interval` strictly inside the sampled height range
|
|
48
|
+
* emits the iso-line as XZ segments (saddle cells disambiguated by the cell-center average). Because a
|
|
49
|
+
* contour is exact constant elevation, drawing each segment at `y = level` makes it hug the terrain —
|
|
50
|
+
* the readable, scale-bearing overlay a flat ground grid cannot give. Pure math, renderer-agnostic.
|
|
51
|
+
* @capability terrain-contours iso-elevation contour lines that drape on sculpted terrain
|
|
52
|
+
* @consumer editor terrain-readability overlay; any map/minimap wanting elevation contours
|
|
53
|
+
*/
|
|
54
|
+
export function extractContours(sampleHeight, options) {
|
|
55
|
+
const { interval } = options;
|
|
56
|
+
if (!(interval > 0))
|
|
57
|
+
throw new Error("extractContours: interval must be > 0");
|
|
58
|
+
const majorEvery = Math.max(1, Math.floor(options.majorEvery ?? 5));
|
|
59
|
+
const grid = sampleHeightGrid(sampleHeight, options.region, options.resolution ?? 128, options.maxSamples ?? 256);
|
|
60
|
+
const { cols, heights, region } = grid;
|
|
61
|
+
const res = cols - 1;
|
|
62
|
+
const spanX = region.maxX - region.minX;
|
|
63
|
+
const spanZ = region.maxZ - region.minZ;
|
|
64
|
+
const worldX = (c) => region.minX + (c / res) * spanX;
|
|
65
|
+
const worldZ = (r) => region.minZ + (r / res) * spanZ;
|
|
66
|
+
const lines = [];
|
|
67
|
+
if (grid.max - grid.min < 1e-9)
|
|
68
|
+
return lines;
|
|
69
|
+
const firstStep = Math.ceil(grid.min / interval + 1e-9);
|
|
70
|
+
const lastStep = Math.floor(grid.max / interval - 1e-9);
|
|
71
|
+
for (let step = firstStep; step <= lastStep; step += 1) {
|
|
72
|
+
const level = step * interval;
|
|
73
|
+
const segments = [];
|
|
74
|
+
for (let r = 0; r < res; r += 1) {
|
|
75
|
+
for (let c = 0; c < res; c += 1) {
|
|
76
|
+
const blv = heights[r * cols + c];
|
|
77
|
+
const brv = heights[r * cols + c + 1];
|
|
78
|
+
const trv = heights[(r + 1) * cols + c + 1];
|
|
79
|
+
const tlv = heights[(r + 1) * cols + c];
|
|
80
|
+
let code = 0;
|
|
81
|
+
if (blv > level)
|
|
82
|
+
code |= 1;
|
|
83
|
+
if (brv > level)
|
|
84
|
+
code |= 2;
|
|
85
|
+
if (trv > level)
|
|
86
|
+
code |= 4;
|
|
87
|
+
if (tlv > level)
|
|
88
|
+
code |= 8;
|
|
89
|
+
if (code === 0 || code === 15)
|
|
90
|
+
continue;
|
|
91
|
+
const x0 = worldX(c);
|
|
92
|
+
const x1 = worldX(c + 1);
|
|
93
|
+
const z0 = worldZ(r);
|
|
94
|
+
const z1 = worldZ(r + 1);
|
|
95
|
+
const eBottom = () => lerpPoint(x0, z0, blv, x1, z0, brv, level);
|
|
96
|
+
const eRight = () => lerpPoint(x1, z0, brv, x1, z1, trv, level);
|
|
97
|
+
const eTop = () => lerpPoint(x1, z1, trv, x0, z1, tlv, level);
|
|
98
|
+
const eLeft = () => lerpPoint(x0, z1, tlv, x0, z0, blv, level);
|
|
99
|
+
const push = (a, b) => {
|
|
100
|
+
segments.push(a[0], a[1], b[0], b[1]);
|
|
101
|
+
};
|
|
102
|
+
switch (code) {
|
|
103
|
+
case 1:
|
|
104
|
+
case 14:
|
|
105
|
+
push(eLeft(), eBottom());
|
|
106
|
+
break;
|
|
107
|
+
case 2:
|
|
108
|
+
case 13:
|
|
109
|
+
push(eBottom(), eRight());
|
|
110
|
+
break;
|
|
111
|
+
case 3:
|
|
112
|
+
case 12:
|
|
113
|
+
push(eLeft(), eRight());
|
|
114
|
+
break;
|
|
115
|
+
case 4:
|
|
116
|
+
case 11:
|
|
117
|
+
push(eRight(), eTop());
|
|
118
|
+
break;
|
|
119
|
+
case 6:
|
|
120
|
+
case 9:
|
|
121
|
+
push(eBottom(), eTop());
|
|
122
|
+
break;
|
|
123
|
+
case 7:
|
|
124
|
+
case 8:
|
|
125
|
+
push(eLeft(), eTop());
|
|
126
|
+
break;
|
|
127
|
+
case 5: {
|
|
128
|
+
const center = (blv + brv + trv + tlv) / 4;
|
|
129
|
+
if (center > level) {
|
|
130
|
+
push(eLeft(), eTop());
|
|
131
|
+
push(eBottom(), eRight());
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
push(eLeft(), eBottom());
|
|
135
|
+
push(eRight(), eTop());
|
|
136
|
+
}
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
case 10: {
|
|
140
|
+
const center = (blv + brv + trv + tlv) / 4;
|
|
141
|
+
if (center > level) {
|
|
142
|
+
push(eLeft(), eBottom());
|
|
143
|
+
push(eRight(), eTop());
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
push(eLeft(), eTop());
|
|
147
|
+
push(eBottom(), eRight());
|
|
148
|
+
}
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
default:
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (segments.length > 0) {
|
|
157
|
+
lines.push({ level, major: step % majorEvery === 0, segments });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return lines;
|
|
161
|
+
}
|
|
162
|
+
const NICE_STEPS = [1, 2, 2.5, 5];
|
|
163
|
+
/**
|
|
164
|
+
* Picks a human-friendly contour interval — a `1/2/2.5/5 × 10ⁿ` step — so an elevation `range` splits
|
|
165
|
+
* into roughly `targetLines` bands. Drives adaptive contour density: a tall terrain gets a coarse
|
|
166
|
+
* interval, a shallow one a fine interval, without the author choosing a number. Returns `0` when the
|
|
167
|
+
* range is non-positive (nothing to contour).
|
|
168
|
+
* @capability contour-interval readable auto-spacing for elevation contours
|
|
169
|
+
* @consumer editor terrain-readability overlay density control
|
|
170
|
+
*/
|
|
171
|
+
export function chooseContourInterval(range, targetLines = 12) {
|
|
172
|
+
if (!(range > 0) || !(targetLines > 0))
|
|
173
|
+
return 0;
|
|
174
|
+
const rough = range / targetLines;
|
|
175
|
+
const magnitude = 10 ** Math.floor(Math.log10(rough));
|
|
176
|
+
let best = NICE_STEPS[0] * magnitude;
|
|
177
|
+
let bestErr = Infinity;
|
|
178
|
+
for (const stepBase of NICE_STEPS) {
|
|
179
|
+
for (const scale of [magnitude, magnitude * 10]) {
|
|
180
|
+
const candidate = stepBase * scale;
|
|
181
|
+
const err = Math.abs(range / candidate - targetLines);
|
|
182
|
+
if (err < bestErr) {
|
|
183
|
+
bestErr = err;
|
|
184
|
+
best = candidate;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return best;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Reads the ground elevation under a world point and its signed delta from a reference plane — the
|
|
192
|
+
* measurable cursor/hover feedback ("+3.4 above the pad") an author needs to judge sculpted height.
|
|
193
|
+
* @capability elevation-readout cursor height and delta-from-reference feedback
|
|
194
|
+
* @consumer editor terrain-readability HUD readout
|
|
195
|
+
*/
|
|
196
|
+
export function sampleElevation(sampleHeight, x, z, reference = 0) {
|
|
197
|
+
const height = sampleHeight(x, z);
|
|
198
|
+
return { x, z, height, delta: height - reference, reference };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Summarises elevation across a region on a bounded sample grid: min, max, mean, relief range, and the
|
|
202
|
+
* world points of the extremes — the selection min/max and legend feedback the readability overlay
|
|
203
|
+
* reports, and the input to {@link chooseContourInterval}. Pure math, renderer-agnostic.
|
|
204
|
+
* @capability elevation-summary selection min/max/mean and relief over a region
|
|
205
|
+
* @consumer editor terrain-readability legend and selection stats
|
|
206
|
+
*/
|
|
207
|
+
export function summarizeElevation(sampleHeight, region, resolution = 64, maxSamples = 256) {
|
|
208
|
+
const grid = sampleHeightGrid(sampleHeight, region, resolution, maxSamples);
|
|
209
|
+
const { cols, rows, heights } = grid;
|
|
210
|
+
const res = cols - 1;
|
|
211
|
+
const spanX = region.maxX - region.minX;
|
|
212
|
+
const spanZ = region.maxZ - region.minZ;
|
|
213
|
+
let sum = 0;
|
|
214
|
+
let minAt = [region.minX, region.minZ];
|
|
215
|
+
let maxAt = [region.minX, region.minZ];
|
|
216
|
+
for (let r = 0; r < rows; r += 1) {
|
|
217
|
+
for (let c = 0; c < cols; c += 1) {
|
|
218
|
+
const h = heights[r * cols + c];
|
|
219
|
+
sum += h;
|
|
220
|
+
if (h === grid.min)
|
|
221
|
+
minAt = [region.minX + (c / res) * spanX, region.minZ + (r / res) * spanZ];
|
|
222
|
+
if (h === grid.max)
|
|
223
|
+
maxAt = [region.minX + (c / res) * spanX, region.minZ + (r / res) * spanZ];
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const samples = cols * rows;
|
|
227
|
+
return {
|
|
228
|
+
min: grid.min,
|
|
229
|
+
max: grid.max,
|
|
230
|
+
mean: sum / samples,
|
|
231
|
+
range: grid.max - grid.min,
|
|
232
|
+
minAt,
|
|
233
|
+
maxAt,
|
|
234
|
+
samples,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Drapes an XZ polyline onto the surface: subdivides each span to at most `spacing` and lifts every
|
|
239
|
+
* vertex to `sampleHeight + offset`, returning flat `[x, y, z, ...]` world triples. The reusable seam
|
|
240
|
+
* behind surface-following placement guides and grid lines — a straight guide bends to follow terrain.
|
|
241
|
+
* @capability surface-drape lift an XZ polyline onto sculpted terrain
|
|
242
|
+
* @consumer editor placement guides and surface grid overlay
|
|
243
|
+
*/
|
|
244
|
+
export function drapePolyline(sampleHeight, points, options = {}) {
|
|
245
|
+
const spacing = options.spacing !== undefined && options.spacing > 0 ? options.spacing : 1;
|
|
246
|
+
const offset = options.offset ?? 0;
|
|
247
|
+
const out = [];
|
|
248
|
+
if (points.length === 0)
|
|
249
|
+
return out;
|
|
250
|
+
const push = (x, z) => {
|
|
251
|
+
out.push(x, sampleHeight(x, z) + offset, z);
|
|
252
|
+
};
|
|
253
|
+
if (points.length === 1) {
|
|
254
|
+
push(points[0][0], points[0][1]);
|
|
255
|
+
return out;
|
|
256
|
+
}
|
|
257
|
+
push(points[0][0], points[0][1]);
|
|
258
|
+
for (let i = 1; i < points.length; i += 1) {
|
|
259
|
+
const [ax, az] = points[i - 1];
|
|
260
|
+
const [bx, bz] = points[i];
|
|
261
|
+
const dist = Math.hypot(bx - ax, bz - az);
|
|
262
|
+
const steps = Math.max(1, Math.ceil(dist / spacing));
|
|
263
|
+
for (let s = 1; s <= steps; s += 1) {
|
|
264
|
+
const t = s / steps;
|
|
265
|
+
push(ax + (bx - ax) * t, az + (bz - az) * t);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return out;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* A closed circle draped on the surface — the surface-following placement guide ring under a cursor or
|
|
272
|
+
* a selected object. Returns flat `[x, y, z, ...]` world triples forming a loop (last vertex repeats
|
|
273
|
+
* the first). `segments` sets the smoothness of the ring.
|
|
274
|
+
* @capability surface-ring surface-following placement guide ring
|
|
275
|
+
* @consumer editor cursor/placement guide
|
|
276
|
+
*/
|
|
277
|
+
export function surfaceRing(sampleHeight, center, radius, segments = 48, options = {}) {
|
|
278
|
+
const n = Math.max(3, Math.floor(segments));
|
|
279
|
+
const points = [];
|
|
280
|
+
for (let i = 0; i <= n; i += 1) {
|
|
281
|
+
const angle = (i / n) * Math.PI * 2;
|
|
282
|
+
points.push([center[0] + Math.cos(angle) * radius, center[1] + Math.sin(angle) * radius]);
|
|
283
|
+
}
|
|
284
|
+
return drapePolyline(sampleHeight, points, options);
|
|
285
|
+
}
|
|
286
|
+
function gridStops(min, max, spacing) {
|
|
287
|
+
const stops = [];
|
|
288
|
+
const first = Math.ceil(min / spacing - 1e-9);
|
|
289
|
+
const last = Math.floor(max / spacing + 1e-9);
|
|
290
|
+
for (let step = first; step <= last; step += 1)
|
|
291
|
+
stops.push(step);
|
|
292
|
+
return stops;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Builds a surface-following major/minor grid over a region: constant-`x` and constant-`z` lines at
|
|
296
|
+
* `spacing`, each draped onto the terrain so the reference grid climbs sculpted surfaces instead of
|
|
297
|
+
* being occluded by them (the flat `y = 0` grid's core failure). Draping subdivides to
|
|
298
|
+
* `drape.spacing`. Pure math, renderer-agnostic.
|
|
299
|
+
* @capability surface-grid terrain-following reference grid that is not occluded by relief
|
|
300
|
+
* @consumer editor terrain-readability grid overlay
|
|
301
|
+
*/
|
|
302
|
+
export function surfaceGridLines(sampleHeight, options) {
|
|
303
|
+
const { region, spacing } = options;
|
|
304
|
+
assertRegion(region);
|
|
305
|
+
if (!(spacing > 0))
|
|
306
|
+
throw new Error("surfaceGridLines: spacing must be > 0");
|
|
307
|
+
const majorEvery = Math.max(1, Math.floor(options.majorEvery ?? 5));
|
|
308
|
+
const drape = options.drape ?? {};
|
|
309
|
+
const lines = [];
|
|
310
|
+
for (const step of gridStops(region.minX, region.maxX, spacing)) {
|
|
311
|
+
const x = step * spacing;
|
|
312
|
+
lines.push({
|
|
313
|
+
axis: "x",
|
|
314
|
+
at: x,
|
|
315
|
+
major: step % majorEvery === 0,
|
|
316
|
+
points: drapePolyline(sampleHeight, [[x, region.minZ], [x, region.maxZ]], drape),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
for (const step of gridStops(region.minZ, region.maxZ, spacing)) {
|
|
320
|
+
const z = step * spacing;
|
|
321
|
+
lines.push({
|
|
322
|
+
axis: "z",
|
|
323
|
+
at: z,
|
|
324
|
+
major: step % majorEvery === 0,
|
|
325
|
+
points: drapePolyline(sampleHeight, [[region.minX, z], [region.maxX, z]], drape),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
return lines;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Convenience over {@link extractContours} that auto-picks the interval from the field's own relief:
|
|
332
|
+
* summarises the region, chooses a readable interval for `targetLines` bands, and traces the contours —
|
|
333
|
+
* the one call the editor overlay makes to turn a `TerrainField` into ready-to-draw guides. Returns an
|
|
334
|
+
* empty list for flat ground.
|
|
335
|
+
* @capability terrain-guides one-call adaptive contours for a terrain field
|
|
336
|
+
* @consumer editor terrain-readability overlay
|
|
337
|
+
*/
|
|
338
|
+
export function terrainContourGuides(field, region, targetLines = 12, resolution = 128) {
|
|
339
|
+
const summary = summarizeElevation(field.sampleHeight, region, Math.min(resolution, 96));
|
|
340
|
+
const interval = chooseContourInterval(summary.range, targetLines);
|
|
341
|
+
const contours = interval > 0 ? extractContours(field.sampleHeight, { region, interval, resolution }) : [];
|
|
342
|
+
return { interval, summary, contours };
|
|
343
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Vec2 } from "./geometry.js";
|
|
2
|
+
/** Sum of two 2D vectors.
|
|
3
|
+
* @internal
|
|
4
|
+
*/
|
|
5
|
+
export declare function add(a: Vec2, b: Vec2): Vec2;
|
|
6
|
+
/** Difference `a - b` of two 2D vectors.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
export declare function sub(a: Vec2, b: Vec2): Vec2;
|
|
10
|
+
/** Scale a 2D vector by a scalar.
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export declare function scale(a: Vec2, s: number): Vec2;
|
|
14
|
+
/** Negate a 2D vector.
|
|
15
|
+
* @internal
|
|
16
|
+
*/
|
|
17
|
+
export declare function negate(a: Vec2): Vec2;
|
|
18
|
+
/** Dot product of two 2D vectors.
|
|
19
|
+
* @internal
|
|
20
|
+
*/
|
|
21
|
+
export declare function dot(a: Vec2, b: Vec2): number;
|
|
22
|
+
/** 2D cross product (scalar z of the 3D cross), positive when `b` is counter-clockwise from `a`.
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export declare function cross(a: Vec2, b: Vec2): number;
|
|
26
|
+
/** Euclidean length of a 2D vector.
|
|
27
|
+
* @internal
|
|
28
|
+
*/
|
|
29
|
+
export declare function length(a: Vec2): number;
|
|
30
|
+
/** Squared length of a 2D vector; cheaper than `length` when only comparing magnitudes.
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
export declare function lengthSquared(a: Vec2): number;
|
|
34
|
+
/** Unit vector in the direction of `a`; returns the zero vector when `a` has no length.
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
export declare function normalize(a: Vec2): Vec2;
|
|
38
|
+
/** Distance between two points.
|
|
39
|
+
* @internal
|
|
40
|
+
*/
|
|
41
|
+
export declare function distance(a: Vec2, b: Vec2): number;
|
|
42
|
+
/** Squared distance between two points; cheaper than `distance` for radius comparisons.
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
export declare function distanceSquared(a: Vec2, b: Vec2): number;
|
|
46
|
+
/** Linearly interpolate between points `a` and `b` by fraction `t`.
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
export declare function lerp(a: Vec2, b: Vec2, t: number): Vec2;
|
|
50
|
+
/** Left-hand perpendicular of `a` (rotated 90° counter-clockwise).
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export declare function perp(a: Vec2): Vec2;
|
|
54
|
+
/** Rotate a 2D vector by `radians` about the origin.
|
|
55
|
+
* @internal
|
|
56
|
+
*/
|
|
57
|
+
export declare function rotate(a: Vec2, radians: number): Vec2;
|
|
58
|
+
/**
|
|
59
|
+
* Reflect a velocity off a surface with unit `normal`, losing energy by `restitution` (0..1). At
|
|
60
|
+
* `restitution` 1 the normal component mirrors elastically (`v − 2(v·n)n`); at 0 it is removed so the
|
|
61
|
+
* vector slides along the surface. Only the normal component is scaled — tangential motion is kept — so
|
|
62
|
+
* this is the wall/paddle/boundary bounce every arcade ball game hand-rolls.
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
65
|
+
export declare function reflect(v: Vec2, normal: Vec2, restitution?: number): Vec2;
|
|
66
|
+
/** Unit vector for a heading measured clockwise from +Y (the engine's XZ-plane convention).
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export declare function fromHeading(headingRad: number): Vec2;
|
|
70
|
+
/** Heading in radians of a vector, measured clockwise from +Y to match `fromHeading`.
|
|
71
|
+
* @internal
|
|
72
|
+
*/
|
|
73
|
+
export declare function heading(a: Vec2): number;
|
|
74
|
+
/** Wrap an angle in radians into `[0, 2π)`.
|
|
75
|
+
* @internal
|
|
76
|
+
*/
|
|
77
|
+
export declare function normalizeAngle(angleRad: number): number;
|
|
78
|
+
/** Wrap an angle in degrees into `[0, 360)`.
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
export declare function normalizeAngleDeg(angleDeg: number): number;
|