@call-me-sensei/toonlab 0.3.0 → 0.4.19
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/README.md +549 -184
- package/agents/README.md +59 -0
- package/agents/references/anime-art-direction.md +24 -0
- package/agents/references/asset-sourcing-policy.md +23 -0
- package/agents/references/custom-gap-report.md +16 -0
- package/agents/references/geology-playbook.md +118 -0
- package/agents/references/mcp-asset-discovery.md +104 -0
- package/agents/references/runtime-entry-points.md +174 -0
- package/agents/references/style-bundles.md +71 -0
- package/agents/skills/claude/asset-sourcing/SKILL.md +275 -0
- package/agents/skills/claude/environment/SKILL.md +59 -0
- package/agents/skills/claude/game-dev/SKILL.md +100 -0
- package/agents/skills/claude/karst-cliff-construction/SKILL.md +258 -0
- package/agents/skills/claude/outdoor-world/SKILL.md +492 -0
- package/agents/skills/claude/outdoor-world/references/coastal-landform-formation.md +100 -0
- package/agents/skills/claude/post-processing/SKILL.md +44 -0
- package/agents/skills/claude/rock-ground-shaders/SKILL.md +118 -0
- package/agents/skills/claude/rockgen/SKILL.md +30 -0
- package/agents/skills/claude/scene-style-application/SKILL.md +74 -0
- package/agents/skills/claude/style-presets/SKILL.md +101 -0
- package/agents/skills/claude/toon-shading/SKILL.md +44 -0
- package/agents/skills/claude/vegetation-sky/SKILL.md +167 -0
- package/agents/skills/claude/visual-verification/SKILL.md +136 -0
- package/agents/skills/claude/water/SKILL.md +105 -0
- package/agents/skills/codex/asset-sourcing/SKILL.md +275 -0
- package/agents/skills/codex/environment/SKILL.md +59 -0
- package/agents/skills/codex/game-dev/SKILL.md +100 -0
- package/agents/skills/codex/karst-cliff-construction/SKILL.md +258 -0
- package/agents/skills/codex/outdoor-world/SKILL.md +492 -0
- package/agents/skills/codex/outdoor-world/references/coastal-landform-formation.md +100 -0
- package/agents/skills/codex/post-processing/SKILL.md +44 -0
- package/agents/skills/codex/rock-ground-shaders/SKILL.md +118 -0
- package/agents/skills/codex/rockgen/SKILL.md +30 -0
- package/agents/skills/codex/scene-style-application/SKILL.md +74 -0
- package/agents/skills/codex/style-presets/SKILL.md +101 -0
- package/agents/skills/codex/toon-shading/SKILL.md +44 -0
- package/agents/skills/codex/vegetation-sky/SKILL.md +167 -0
- package/agents/skills/codex/visual-verification/SKILL.md +136 -0
- package/agents/skills/codex/water/SKILL.md +105 -0
- package/cli/toonlab.mjs +52 -0
- package/compose.yaml +20 -0
- package/database/apply-sql.mjs +141 -0
- package/database/client.mjs +39 -0
- package/database/creation-tags.mjs +23 -0
- package/database/env.mjs +16 -0
- package/database/generation-service.mjs +314 -0
- package/database/migrations/0001_local_workspace.sql +120 -0
- package/database/migrations/0002_file_ownership.sql +11 -0
- package/database/migrations/0003_remove_autosaves_from_library.sql +7 -0
- package/database/migrations/0004_catalog_asset_packs.sql +39 -0
- package/database/migrations/0005_creation_tag_discovery.sql +1 -0
- package/database/migrations/0006_normalize_creation_tags.sql +28 -0
- package/database/providers.mjs +465 -0
- package/database/repository.mjs +625 -0
- package/database/seeds/catalog/0001_empty_official_catalog.sql +4 -0
- package/database/seeds/catalog/0002_2026-08.sql +19454 -0
- package/mcp/lab-management.mjs +629 -0
- package/mcp/public-catalog.mjs +168 -0
- package/mcp/server.mjs +1026 -63
- package/mcp/vite-plugin.mjs +443 -26
- package/mcp/workspace.mjs +26 -1
- package/package.json +312 -45
- package/scripts/generate-catalog-seed.mjs +297 -0
- package/scripts/setup-local.mjs +128 -0
- package/src/agents/index.js +7 -0
- package/src/agents/sceneStyleOperations.js +169 -0
- package/src/asset-policy/catalogLicenses.js +44 -0
- package/src/asset-policy/index.js +315 -0
- package/src/assetlib/assetRef.js +1 -1
- package/src/assetlib/galleryMaterialFamily.js +165 -0
- package/src/assetlib/index.js +6 -2
- package/src/assetlib/plateau.js +188 -0
- package/src/assetlib/plateauLandmarks.js +144 -0
- package/src/assetlib/plateauViewer.js +348 -0
- package/src/assetlib/sources.js +16 -2
- package/src/catalog/manifest.js +11 -1
- package/src/catalog/officialCatalog.js +4 -0
- package/src/catalog/officialCatalogAssetRuntime.js +313 -0
- package/src/catalog/officialCatalogLod.js +150 -0
- package/src/catalog/officialCatalogPlacement.js +228 -0
- package/src/catalog/officialCatalogProvider.js +334 -0
- package/src/character/animationRetarget.js +1082 -0
- package/src/character/characterRuntime.js +376 -0
- package/src/character/groundStabilizer.js +137 -0
- package/src/character/index.js +8 -0
- package/src/character/locomotionActions.js +74 -0
- package/src/character/locomotionStateMachine.js +241 -0
- package/src/character/mannequinAsset.js +15 -0
- package/src/character/mannequinAssetUrl.browser.js +4 -0
- package/src/character/mannequinAssetUrl.node.js +3 -0
- package/src/character/modelLoader.js +92 -12
- package/src/character/walkableCharacterRuntime.js +284 -0
- package/src/character/waterInteractionController.js +217 -0
- package/src/cloud/ambientSkyBaker.js +248 -0
- package/src/cloud/cloudLighting.js +1114 -0
- package/src/cloud/cloudParams.js +819 -0
- package/src/cloud/cloudReprojection.js +563 -0
- package/src/cloud/cloudStyle.js +780 -0
- package/src/cloud/cloudStyleSnapshots.js +387 -0
- package/src/cloud/cloudVolume.js +1903 -0
- package/src/cloud/heroCloudRecipe.js +404 -0
- package/src/cloud/index.js +42 -0
- package/src/cloud/noise/baseShapeVolume.js +331 -0
- package/src/cloud/noise/cirrusMap.js +131 -0
- package/src/cloud/noise/curlNoise.js +289 -0
- package/src/cloud/noise/erosionVolume.js +188 -0
- package/src/cloud/noise/noiseVolume.js +202 -0
- package/src/cloud/noise/periodicNoise3.js +295 -0
- package/src/cloud/noise/weatherMap.js +470 -0
- package/src/cloud/paramSchema.js +458 -0
- package/src/collisionMetadata.js +320 -0
- package/src/core/systemStylePolicy.js +32 -0
- package/src/environment/dayCurves.js +146 -0
- package/src/environment/environmentGroundFieldPass.js +354 -0
- package/src/environment/environmentMaterialAdapter.js +114 -6
- package/src/environment/environmentPresets.js +396 -90
- package/src/environment/environmentRigs.js +17 -2
- package/src/environment/environmentSettings.js +37 -1
- package/src/environment/environmentShaderMaterials.js +37 -6
- package/src/environment/environmentState.js +133 -0
- package/src/environment/environmentSunShadowPass.js +357 -6
- package/src/environment/environmentTextureResolver.js +7 -0
- package/src/environment/index.js +51 -0
- package/src/environment/manufacturedMaterialContract.js +837 -0
- package/src/environment/manufacturedReflectionProvider.js +114 -0
- package/src/environment/scanAssetStylize.js +4 -4
- package/src/environment/surfaceMaterialModes.js +71 -0
- package/src/environment/toonLabEnvironmentMaterials.js +353 -0
- package/src/environment/toonLabMaterialPassCoupling.js +347 -0
- package/src/environment/toonLabNormalIntegration.js +171 -0
- package/src/environment/toonLabRockMaterialResolver.js +592 -0
- package/src/environment/toonLabSourceDefaultLit.js +444 -0
- package/src/environment/toonLabSourceLibrary.js +762 -0
- package/src/environment/toonLabSourceMaterials.js +3718 -0
- package/src/environment/toonLabSourceSubsurfaceLighting.js +415 -0
- package/src/environment/toonLabSourceTemporal.js +717 -0
- package/src/environment/toonLabSurfaceLighting.js +364 -0
- package/src/environment/toonLabTextureReadiness.js +105 -0
- package/src/environment/toonLabTreeMaterials.js +450 -0
- package/src/environment/transparentMaterialProfile.js +87 -0
- package/src/environment/urbanPropMaterial.js +2874 -0
- package/src/ground-shader/groundPrintLayer.js +375 -0
- package/src/ground-shader/groundShaderMaterial.js +851 -0
- package/src/ground-shader/groundShaderSettings.js +468 -0
- package/src/ground-shader/index.js +3 -0
- package/src/index.js +52 -22
- package/src/lighting/callMeSenseiLightingContract.js +163 -0
- package/src/lighting/index.js +14 -7
- package/src/lighting/lightingCapabilities.js +2 -2
- package/src/lighting/lightingPresets.js +6 -3
- package/src/lighting/lightingStyle.js +41 -6
- package/src/lighting/lightingSystem.js +140 -1
- package/src/lighting/{unrealExport.js → toonLabExport.js} +40 -41
- package/src/post/postProcessing.js +71 -12
- package/src/react/index.js +66 -0
- package/src/renderer/index.js +9 -0
- package/src/renderer/rendererConfiguration.js +250 -0
- package/src/rock-shader/index.js +3 -0
- package/src/rock-shader/rockMaterial.js +1843 -0
- package/src/rock-shader/rockShaderRuntime.js +494 -0
- package/src/rock-shader/rockShaderSettings.js +869 -0
- package/src/rockgen/export/glbExport.js +104 -14
- package/src/rockgen/index.js +4 -3
- package/src/rockgen/lod/index.js +6 -0
- package/src/rockgen/lod/rockLodMetrics.js +168 -0
- package/src/rockgen/lod/rockLodPlanner.js +372 -0
- package/src/rockgen/lod/rockLodPolicy.js +235 -0
- package/src/rockgen/lod/rockLodRuntime.js +124 -0
- package/src/rockgen/lod/rockLodSimplifier.js +173 -0
- package/src/rockgen/lod/rockLodValidation.js +113 -0
- package/src/rockgen/mesh/meshAttributes.js +17 -0
- package/src/rockgen/mesh/meshDocument.js +6 -0
- package/src/rockgen/rockDocument.js +352 -9
- package/src/rockgen/rockgenPresets.js +114 -13
- package/src/rockgen/rockgenSettings.js +62 -11
- package/src/runtime/index.js +14 -0
- package/src/runtime/sceneCollisionRuntime.js +317 -0
- package/src/runtime/sceneSurfaceRuntime.js +451 -0
- package/src/runtime/sceneUpdateScheduler.js +203 -0
- package/src/shaders-tsl/anime.js +9 -2
- package/src/shaders-tsl/chunks/environment-ground-field.js +174 -0
- package/src/shaders-tsl/chunks/environment-state.js +79 -0
- package/src/shaders-tsl/chunks/environment-sun-shadow.js +99 -32
- package/src/shaders-tsl/chunks/normalized-hue.js +41 -0
- package/src/shaders-tsl/chunks/pass-depth-color.js +4 -2
- package/src/shaders-tsl/chunks/scene-depth-color-pass.js +273 -0
- package/src/shaders-tsl/chunks/vegetation-style.js +116 -8
- package/src/shaders-tsl/chunks/water-color.js +19 -5
- package/src/shaders-tsl/chunks/water-shore-state.js +8 -1
- package/src/shaders-tsl/chunks/world-noise.js +30 -0
- package/src/shaders-tsl/environment.js +123 -17
- package/src/shaders-tsl/flower.js +51 -8
- package/src/shaders-tsl/grass.js +194 -29
- package/src/shaders-tsl/post-composite.js +83 -2
- package/src/shaders-tsl/tree-leaf.js +107 -16
- package/src/shaders-tsl/water-breaker.js +18 -4
- package/src/shaders-tsl/water.js +43 -3
- package/src/shaders-tsl/woody-surface.js +59 -7
- package/src/sky/atmosphereDome.js +193 -0
- package/src/sky/atmosphereParams.js +396 -0
- package/src/sky/atmosphereScattering.js +593 -0
- package/src/sky/atmosphereSky.js +371 -0
- package/src/sky/cloudShadow.js +355 -0
- package/src/sky/godRays.js +257 -0
- package/src/sky/index.js +55 -1
- package/src/sky/nightSky.js +1190 -0
- package/src/sky/renderLayers.js +120 -0
- package/src/sky/skyColor.js +582 -0
- package/src/sky/skyDayCycle.js +244 -0
- package/src/sky/skyParams.js +661 -0
- package/src/sky/skyPresets.js +772 -0
- package/src/sky/skyQualityTiers.js +383 -0
- package/src/sky/skyShaderSettings.js +699 -0
- package/src/sky/skyStyleSnapshots.js +211 -0
- package/src/sky/skySystem.js +1438 -0
- package/src/sky/skyTimeKeyframes.js +361 -0
- package/src/sky/stylizedSky.js +405 -116
- package/src/sky/sunDriver.js +499 -0
- package/src/sky/timeOfDay.js +335 -0
- package/src/styles/animeGameProfile.js +44 -0
- package/src/styles/index.js +134 -0
- package/src/styles/manufacturedStyleLabeling.js +204 -0
- package/src/styles/sceneLayerDocuments.js +185 -0
- package/src/styles/sceneLookComposition.js +156 -0
- package/src/styles/sceneQualityApplication.js +152 -0
- package/src/styles/sceneQualityProfiles.js +268 -0
- package/src/styles/sceneStyleAudit.js +512 -0
- package/src/styles/sceneStyleRuntime.js +876 -0
- package/src/styles/styleAdapters.js +166 -0
- package/src/styles/styleApplication.js +369 -0
- package/src/styles/styleBundle.js +444 -91
- package/src/styles/styleBundleProvider.js +83 -0
- package/src/styles/styleDomains.js +21 -0
- package/src/styles/styleInspector.js +262 -0
- package/src/styles/styleMaterialContract.js +375 -0
- package/src/styles/styleMetadata.js +73 -0
- package/src/styles/styleTargetDiscovery.js +162 -0
- package/src/styles/styleTargetLabels.js +206 -0
- package/src/styles/styleTargetMaterialCoverage.js +137 -0
- package/src/styles/styleTransaction.js +272 -0
- package/src/texgen/textureGenerators.js +21 -5
- package/src/toon/toonSettings.js +4 -0
- package/src/vegetation/branchTree.js +302 -0
- package/src/vegetation/callMeSenseiGrass.js +183 -0
- package/src/vegetation/compiledTree.js +506 -0
- package/src/vegetation/contactShadowField.js +107 -0
- package/src/vegetation/flowerSpecies.js +10 -2
- package/src/vegetation/grass.js +13 -0
- package/src/vegetation/grassClump.js +1179 -0
- package/src/vegetation/importedVegetationMaterial.js +183 -0
- package/src/vegetation/index.js +15 -1
- package/src/vegetation/legacyTreePresets.js +120 -0
- package/src/vegetation/scatter.js +322 -3
- package/src/vegetation/stylizedBush.js +14 -0
- package/src/vegetation/stylizedFlower.js +31 -0
- package/src/vegetation/stylizedFlowers.js +59 -7
- package/src/vegetation/stylizedForest.js +455 -147
- package/src/vegetation/stylizedGrass.js +188 -24
- package/src/vegetation/stylizedTree.js +378 -46
- package/src/vegetation/stylizedTreeFoliage.js +889 -38
- package/src/vegetation/stylizedUnderstory.js +230 -0
- package/src/vegetation/treeExport.js +262 -47
- package/src/vegetation/treeSurfaceTextures.js +337 -0
- package/src/vegetation/vegetationShaders.js +617 -28
- package/src/version.js +3 -0
- package/src/water/water.js +2 -0
- package/src/water/waterBreakerSystem.js +2 -0
- package/src/water/waterCurrentField.js +1 -0
- package/src/water/waterMaterial.js +3 -0
- package/src/water/waterRain.js +2 -0
- package/src/water/waterScenePasses.js +170 -7
- package/src/water/waterSettings.js +235 -43
- package/src/water/waterShoreMaterial.js +16 -2
- package/src/water/waterShoreStateField.js +1 -1
- package/src/water/waterSplashSystem.js +2 -0
- package/src/water/waterStageSettings.js +60 -0
- package/src/water/waterSurface.js +144 -4
- package/src/water/waterUnderwaterAtmosphere.js +288 -0
- package/src/water/waterVegetation.js +20 -4
- package/src/worldCollision.js +64 -9
- package/types/agents/index.d.ts +1 -0
- package/types/agents/sceneStyleOperations.d.ts +484 -0
- package/types/asset-policy/catalogLicenses.d.ts +5 -0
- package/types/asset-policy/index.d.ts +18 -0
- package/types/assetlib/ambientcg.d.ts +81 -0
- package/types/assetlib/assetRef.d.ts +26 -0
- package/types/assetlib/galleryMaterialFamily.d.ts +13 -0
- package/types/assetlib/importedEntry.d.ts +18 -0
- package/types/assetlib/index.d.ts +16 -0
- package/types/assetlib/kaykit.d.ts +112 -0
- package/types/assetlib/kaykitStaticIndex.d.ts +38 -0
- package/types/assetlib/loadImported.d.ts +54 -0
- package/types/assetlib/opensource3d.d.ts +55 -0
- package/types/assetlib/plateau.d.ts +67 -0
- package/types/assetlib/plateauLandmarks.d.ts +238 -0
- package/types/assetlib/plateauViewer.d.ts +3 -0
- package/types/assetlib/polyhaven.d.ts +90 -0
- package/types/assetlib/polypizza.d.ts +10 -0
- package/types/assetlib/smithsonian.d.ts +9 -0
- package/types/assetlib/sources.d.ts +22 -0
- package/types/assetlib/zip.d.ts +8 -0
- package/types/catalog/manifest.d.ts +26 -0
- package/types/catalog/officialCatalog.d.ts +4 -0
- package/types/catalog/officialCatalogAssetRuntime.d.ts +2 -0
- package/types/catalog/officialCatalogLod.d.ts +5 -0
- package/types/catalog/officialCatalogPlacement.d.ts +49 -0
- package/types/catalog/officialCatalogProvider.d.ts +7 -0
- package/types/character/animationRetarget.d.ts +20 -0
- package/types/character/characterRig.d.ts +28 -0
- package/types/character/characterRuntime.d.ts +4 -0
- package/types/character/freestyleSwimClip.d.ts +5 -0
- package/types/character/groundStabilizer.d.ts +55 -0
- package/types/character/index.d.ts +10 -0
- package/types/character/locomotionActions.d.ts +4 -0
- package/types/character/locomotionStateMachine.d.ts +62 -0
- package/types/character/mannequinAsset.d.ts +12 -0
- package/types/character/mannequinAssetUrl.node.d.ts +1 -0
- package/types/character/modelLoader.d.ts +7 -0
- package/types/character/walkableCharacterRuntime.d.ts +343 -0
- package/types/character/waterInteractionController.d.ts +114 -0
- package/types/cloud/ambientSkyBaker.d.ts +18 -0
- package/types/cloud/cloudLighting.d.ts +38 -0
- package/types/cloud/cloudParams.d.ts +18 -0
- package/types/cloud/cloudReprojection.d.ts +15 -0
- package/types/cloud/cloudStyle.d.ts +1380 -0
- package/types/cloud/cloudStyleSnapshots.d.ts +10 -0
- package/types/cloud/cloudVolume.d.ts +43 -0
- package/types/cloud/heroCloudRecipe.d.ts +167 -0
- package/types/cloud/index.d.ts +12 -0
- package/types/cloud/noise/baseShapeVolume.d.ts +86 -0
- package/types/cloud/noise/cirrusMap.d.ts +24 -0
- package/types/cloud/noise/curlNoise.d.ts +106 -0
- package/types/cloud/noise/erosionVolume.d.ts +58 -0
- package/types/cloud/noise/noiseVolume.d.ts +63 -0
- package/types/cloud/noise/periodicNoise3.d.ts +75 -0
- package/types/cloud/noise/weatherMap.d.ts +227 -0
- package/types/cloud/paramSchema.d.ts +142 -0
- package/types/collisionMetadata.d.ts +11 -0
- package/types/core/generation.d.ts +95 -0
- package/types/core/materialRoles.d.ts +102 -0
- package/types/core/presetDocuments.d.ts +25 -0
- package/types/core/systemStylePolicy.d.ts +4 -0
- package/types/environment/dayCurves.d.ts +47 -0
- package/types/environment/environmentAmbientProbe.d.ts +2 -0
- package/types/environment/environmentGroundFieldPass.d.ts +2 -0
- package/types/environment/environmentMaterialAdapter.d.ts +42 -0
- package/types/environment/environmentMaterialClassifier.d.ts +26 -0
- package/types/environment/environmentPlanarReflection.d.ts +3 -0
- package/types/environment/environmentPresets.d.ts +171 -0
- package/types/environment/environmentRigs.d.ts +13 -0
- package/types/environment/environmentSettings.d.ts +161 -0
- package/types/environment/environmentShaderMaterials.d.ts +14 -0
- package/types/environment/environmentState.d.ts +6 -0
- package/types/environment/environmentSunShadowPass.d.ts +2 -0
- package/types/environment/environmentTextureResolver.d.ts +30 -0
- package/types/environment/environmentTimeOfDay.d.ts +25 -0
- package/types/environment/environmentVertexAo.d.ts +18 -0
- package/types/environment/index.d.ts +27 -0
- package/types/environment/manufacturedMaterialContract.d.ts +129 -0
- package/types/environment/manufacturedReflectionProvider.d.ts +3 -0
- package/types/environment/scanAssetStylize.d.ts +43 -0
- package/types/environment/surfaceMaterialModes.d.ts +14 -0
- package/types/environment/toonLabEnvironmentMaterials.d.ts +139 -0
- package/types/environment/toonLabMaterialPassCoupling.d.ts +7 -0
- package/types/environment/toonLabNormalIntegration.d.ts +29 -0
- package/types/environment/toonLabRockMaterialResolver.d.ts +270 -0
- package/types/environment/toonLabSourceDefaultLit.d.ts +136 -0
- package/types/environment/toonLabSourceLibrary.d.ts +19 -0
- package/types/environment/toonLabSourceMaterials.d.ts +14 -0
- package/types/environment/toonLabSourceSubsurfaceLighting.d.ts +85 -0
- package/types/environment/toonLabSourceTemporal.d.ts +20 -0
- package/types/environment/toonLabSurfaceLighting.d.ts +136 -0
- package/types/environment/toonLabTextureReadiness.d.ts +8 -0
- package/types/environment/toonLabTreeMaterials.d.ts +7 -0
- package/types/environment/transparentMaterialProfile.d.ts +76 -0
- package/types/environment/urbanPropMaterial.d.ts +25 -0
- package/types/ground-shader/groundPrintLayer.d.ts +4 -0
- package/types/ground-shader/groundShaderMaterial.d.ts +11 -0
- package/types/ground-shader/groundShaderSettings.d.ts +90 -0
- package/types/ground-shader/index.d.ts +3 -0
- package/types/index.d.ts +1502 -0
- package/types/lighting/callMeSenseiLightingContract.d.ts +14 -0
- package/types/lighting/colorIntensity.d.ts +44 -0
- package/types/lighting/index.d.ts +12 -0
- package/types/lighting/lightDescriptors.d.ts +803 -0
- package/types/lighting/lightingCapabilities.d.ts +85 -0
- package/types/lighting/lightingDocuments.d.ts +140 -0
- package/types/lighting/lightingFixtures.d.ts +171 -0
- package/types/lighting/lightingGenerator.d.ts +403 -0
- package/types/lighting/lightingPresets.d.ts +264 -0
- package/types/lighting/lightingRuntime.d.ts +401 -0
- package/types/lighting/lightingStyle.d.ts +156 -0
- package/types/lighting/lightingSystem.d.ts +433 -0
- package/types/lighting/toonLabExport.d.ts +46 -0
- package/types/lighting/utils.d.ts +18 -0
- package/types/loaders/index.d.ts +1 -0
- package/types/post/index.d.ts +2 -0
- package/types/post/postGenerator.d.ts +282 -0
- package/types/post/postProcessing.d.ts +16 -0
- package/types/react/index.d.ts +1765 -0
- package/types/renderer/index.d.ts +1 -0
- package/types/renderer/rendererConfiguration.d.ts +8 -0
- package/types/rock-shader/index.d.ts +3 -0
- package/types/rock-shader/rockMaterial.d.ts +18 -0
- package/types/rock-shader/rockShaderRuntime.d.ts +8 -0
- package/types/rock-shader/rockShaderSettings.d.ts +170 -0
- package/types/rockgen/export/glbExport.d.ts +58 -0
- package/types/rockgen/heightfield/heightfieldErosion.d.ts +10 -0
- package/types/rockgen/heightfield/heightfieldPatch.d.ts +15 -0
- package/types/rockgen/heightfield/stylizedErosionSim.d.ts +41 -0
- package/types/rockgen/index.d.ts +11 -0
- package/types/rockgen/lod/index.d.ts +6 -0
- package/types/rockgen/lod/rockLodMetrics.d.ts +62 -0
- package/types/rockgen/lod/rockLodPlanner.d.ts +86 -0
- package/types/rockgen/lod/rockLodPolicy.d.ts +76 -0
- package/types/rockgen/lod/rockLodRuntime.d.ts +95 -0
- package/types/rockgen/lod/rockLodSimplifier.d.ts +15 -0
- package/types/rockgen/lod/rockLodValidation.d.ts +16 -0
- package/types/rockgen/mesh/meshAttributes.d.ts +32 -0
- package/types/rockgen/mesh/meshDocument.d.ts +40 -0
- package/types/rockgen/mesh/surfaceNets.d.ts +42 -0
- package/types/rockgen/noise/cellularNoise3.d.ts +24 -0
- package/types/rockgen/noise/prng.d.ts +16 -0
- package/types/rockgen/noise/simplexNoise3.d.ts +2 -0
- package/types/rockgen/noise/valueNoise3.d.ts +12 -0
- package/types/rockgen/rockDocument.d.ts +215 -0
- package/types/rockgen/rockHelpers.d.ts +2 -0
- package/types/rockgen/rockgenPresets.d.ts +10 -0
- package/types/rockgen/rockgenSettings.d.ts +531 -0
- package/types/rockgen/sdf/fieldCompiler.d.ts +20 -0
- package/types/rockgen/sdf/sculptEdits.d.ts +30 -0
- package/types/rockgen/sdf/sdfModifiers.d.ts +19 -0
- package/types/rockgen/sdf/sdfOps.d.ts +8 -0
- package/types/rockgen/sdf/sdfPrimitives.d.ts +22 -0
- package/types/runtime/index.d.ts +3 -0
- package/types/runtime/sceneCollisionRuntime.d.ts +94 -0
- package/types/runtime/sceneSurfaceRuntime.d.ts +90 -0
- package/types/runtime/sceneUpdateScheduler.d.ts +28 -0
- package/types/shaders-tsl/anime.d.ts +9 -0
- package/types/shaders-tsl/chunks/character-color.d.ts +6 -0
- package/types/shaders-tsl/chunks/character-highlights.d.ts +12 -0
- package/types/shaders-tsl/chunks/character-lighting.d.ts +20 -0
- package/types/shaders-tsl/chunks/character-material-maps.d.ts +18 -0
- package/types/shaders-tsl/chunks/character-roles.d.ts +21 -0
- package/types/shaders-tsl/chunks/character-scene-lights.d.ts +48 -0
- package/types/shaders-tsl/chunks/character-shadow-color.d.ts +5 -0
- package/types/shaders-tsl/chunks/character-skinning.d.ts +23 -0
- package/types/shaders-tsl/chunks/environment-color.d.ts +9 -0
- package/types/shaders-tsl/chunks/environment-debug.d.ts +24 -0
- package/types/shaders-tsl/chunks/environment-ground-field.d.ts +40 -0
- package/types/shaders-tsl/chunks/environment-lighting.d.ts +22 -0
- package/types/shaders-tsl/chunks/environment-state.d.ts +42 -0
- package/types/shaders-tsl/chunks/environment-sun-shadow.d.ts +19 -0
- package/types/shaders-tsl/chunks/foliage-fog.d.ts +21 -0
- package/types/shaders-tsl/chunks/normalized-hue.d.ts +1 -0
- package/types/shaders-tsl/chunks/pass-depth-color.d.ts +20 -0
- package/types/shaders-tsl/chunks/projected-water-caustics.d.ts +24 -0
- package/types/shaders-tsl/chunks/scene-depth-color-pass.d.ts +39 -0
- package/types/shaders-tsl/chunks/stylized-cloud-shadow.d.ts +9 -0
- package/types/shaders-tsl/chunks/vegetation-style.d.ts +60 -0
- package/types/shaders-tsl/chunks/water-color.d.ts +15 -0
- package/types/shaders-tsl/chunks/water-common.d.ts +9 -0
- package/types/shaders-tsl/chunks/water-foam.d.ts +8 -0
- package/types/shaders-tsl/chunks/water-lighting.d.ts +9 -0
- package/types/shaders-tsl/chunks/water-ripple.d.ts +8 -0
- package/types/shaders-tsl/chunks/water-shore-state.d.ts +7 -0
- package/types/shaders-tsl/chunks/water-waves.d.ts +18 -0
- package/types/shaders-tsl/chunks/world-noise.d.ts +4 -0
- package/types/shaders-tsl/environment-ao-overlay.d.ts +5 -0
- package/types/shaders-tsl/environment.d.ts +34 -0
- package/types/shaders-tsl/flower.d.ts +6 -0
- package/types/shaders-tsl/grass.d.ts +4 -0
- package/types/shaders-tsl/post-composite.d.ts +25 -0
- package/types/shaders-tsl/sky.d.ts +4 -0
- package/types/shaders-tsl/tree-leaf.d.ts +2 -0
- package/types/shaders-tsl/water-breaker.d.ts +15 -0
- package/types/shaders-tsl/water-kelp.d.ts +5 -0
- package/types/shaders-tsl/water-rain.d.ts +10 -0
- package/types/shaders-tsl/water-shore-state-simulation.d.ts +12 -0
- package/types/shaders-tsl/water-simulation.d.ts +5 -0
- package/types/shaders-tsl/water-splash.d.ts +12 -0
- package/types/shaders-tsl/water.d.ts +22 -0
- package/types/shaders-tsl/woody-surface.d.ts +3 -0
- package/types/sky/atmosphereDome.d.ts +2 -0
- package/types/sky/atmosphereParams.d.ts +185 -0
- package/types/sky/atmosphereScattering.d.ts +11 -0
- package/types/sky/atmosphereSky.d.ts +2 -0
- package/types/sky/cloudShadow.d.ts +68 -0
- package/types/sky/godRays.d.ts +5 -0
- package/types/sky/index.d.ts +18 -0
- package/types/sky/nightSky.d.ts +22 -0
- package/types/sky/renderLayers.d.ts +59 -0
- package/types/sky/sceneOverrideLayers.d.ts +10 -0
- package/types/sky/skyColor.d.ts +704 -0
- package/types/sky/skyDayCycle.d.ts +86 -0
- package/types/sky/skyParams.d.ts +3407 -0
- package/types/sky/skyPresets.d.ts +160 -0
- package/types/sky/skyQuality.d.ts +21 -0
- package/types/sky/skyQualityTiers.d.ts +223 -0
- package/types/sky/skyShaderSettings.d.ts +152 -0
- package/types/sky/skyStyleSnapshots.d.ts +11 -0
- package/types/sky/skySystem.d.ts +3 -0
- package/types/sky/skyTimeKeyframes.d.ts +230 -0
- package/types/sky/stylizedSky.d.ts +341 -0
- package/types/sky/sunDriver.d.ts +15 -0
- package/types/sky/timeOfDay.d.ts +145 -0
- package/types/styles/animeGameProfile.d.ts +27 -0
- package/types/styles/index.d.ts +17 -0
- package/types/styles/manufacturedStyleLabeling.d.ts +119 -0
- package/types/styles/sceneLayerDocuments.d.ts +145 -0
- package/types/styles/sceneLookComposition.d.ts +53 -0
- package/types/styles/sceneQualityApplication.d.ts +34 -0
- package/types/styles/sceneQualityProfiles.d.ts +13 -0
- package/types/styles/sceneStyleAudit.d.ts +80 -0
- package/types/styles/sceneStyleRuntime.d.ts +1782 -0
- package/types/styles/styleAdapters.d.ts +14 -0
- package/types/styles/styleApplication.d.ts +47 -0
- package/types/styles/styleBundle.d.ts +19 -0
- package/types/styles/styleBundleProvider.d.ts +44 -0
- package/types/styles/styleDomains.d.ts +18 -0
- package/types/styles/styleInspector.d.ts +59 -0
- package/types/styles/styleMaterialContract.d.ts +46 -0
- package/types/styles/styleMetadata.d.ts +11 -0
- package/types/styles/styleTargetDiscovery.d.ts +48 -0
- package/types/styles/styleTargetLabels.d.ts +32 -0
- package/types/styles/styleTargetMaterialCoverage.d.ts +20 -0
- package/types/styles/styleTransaction.d.ts +10 -0
- package/types/styles/styleTypes.d.ts +66 -0
- package/types/texgen/evaluateTexture.d.ts +40 -0
- package/types/texgen/index.d.ts +7 -0
- package/types/texgen/noise2.d.ts +46 -0
- package/types/texgen/textureAi.d.ts +6 -0
- package/types/texgen/textureGenerators.d.ts +261 -0
- package/types/texgen/texturePresets.d.ts +45 -0
- package/types/texgen/textureSettings.d.ts +121 -0
- package/types/texgen/textureThree.d.ts +13 -0
- package/types/toon/characterRenderPasses.d.ts +3 -0
- package/types/toon/index.d.ts +3 -0
- package/types/toon/settings/alphaSettings.d.ts +125 -0
- package/types/toon/settings/averageShadowSettings.d.ts +39 -0
- package/types/toon/settings/baseTextureSettings.d.ts +39 -0
- package/types/toon/settings/celShadeSettings.d.ts +37 -0
- package/types/toon/settings/contactShadowSettings.d.ts +30 -0
- package/types/toon/settings/eyeHighlightSettings.d.ts +55 -0
- package/types/toon/settings/faceLightingSettings.d.ts +32 -0
- package/types/toon/settings/furSettings.d.ts +23 -0
- package/types/toon/settings/glitterSettings.d.ts +43 -0
- package/types/toon/settings/hairHighlightSettings.d.ts +89 -0
- package/types/toon/settings/indirectLightSettings.d.ts +43 -0
- package/types/toon/settings/localLightSettings.d.ts +46 -0
- package/types/toon/settings/materialMapSettings.d.ts +86 -0
- package/types/toon/settings/outlineSettings.d.ts +125 -0
- package/types/toon/settings/perspectiveRemovalSettings.d.ts +14 -0
- package/types/toon/settings/rimLightSettings.d.ts +79 -0
- package/types/toon/settings/sceneShadowSettings.d.ts +32 -0
- package/types/toon/settings/selfShadowSettings.d.ts +44 -0
- package/types/toon/settings/shadowColorSettings.d.ts +77 -0
- package/types/toon/settings/skinToneSettings.d.ts +30 -0
- package/types/toon/settings/specularSettings.d.ts +96 -0
- package/types/toon/settings/stickerSettings.d.ts +40 -0
- package/types/toon/toonMaterialAdapter.d.ts +883 -0
- package/types/toon/toonSettings.d.ts +1182 -0
- package/types/vegetation/branchTree.d.ts +10 -0
- package/types/vegetation/callMeSenseiGrass.d.ts +8 -0
- package/types/vegetation/compiledTree.d.ts +75 -0
- package/types/vegetation/contactShadowField.d.ts +26 -0
- package/types/vegetation/flowerSpecies.d.ts +107 -0
- package/types/vegetation/grass.d.ts +4 -0
- package/types/vegetation/grassClump.d.ts +7 -0
- package/types/vegetation/grassPalettes.d.ts +29 -0
- package/types/vegetation/importedVegetationMaterial.d.ts +13 -0
- package/types/vegetation/index.d.ts +216 -0
- package/types/vegetation/legacyTreePresets.d.ts +22 -0
- package/types/vegetation/scatter.d.ts +12 -0
- package/types/vegetation/stylizedBush.d.ts +2 -0
- package/types/vegetation/stylizedFlower.d.ts +2 -0
- package/types/vegetation/stylizedFlowers.d.ts +8 -0
- package/types/vegetation/stylizedForest.d.ts +3 -0
- package/types/vegetation/stylizedGrass.d.ts +21 -0
- package/types/vegetation/stylizedTree.d.ts +19 -0
- package/types/vegetation/stylizedTreeFoliage.d.ts +18 -0
- package/types/vegetation/stylizedUnderstory.d.ts +50 -0
- package/types/vegetation/treeExport.d.ts +6 -0
- package/types/vegetation/treeSurfaceTextures.d.ts +72 -0
- package/types/vegetation/vegetationShaders.d.ts +74 -0
- package/types/version.d.ts +1 -0
- package/types/water/index.d.ts +1 -0
- package/types/water/sceneOverrideLayers.d.ts +16 -0
- package/types/water/water.d.ts +17 -0
- package/types/water/waterBreakerSystem.d.ts +46 -0
- package/types/water/waterCurrentField.d.ts +115 -0
- package/types/water/waterInteraction.d.ts +21 -0
- package/types/water/waterMaterial.d.ts +60 -0
- package/types/water/waterNearshorePhase.d.ts +5 -0
- package/types/water/waterRain.d.ts +17 -0
- package/types/water/waterRippleSimulation.d.ts +52 -0
- package/types/water/waterScenePasses.d.ts +70 -0
- package/types/water/waterSettings.d.ts +648 -0
- package/types/water/waterShoreMaterial.d.ts +3 -0
- package/types/water/waterShoreStateField.d.ts +2 -0
- package/types/water/waterSplashSystem.d.ts +2 -0
- package/types/water/waterStageSettings.d.ts +9 -0
- package/types/water/waterSurface.d.ts +2 -0
- package/types/water/waterUnderwaterAtmosphere.d.ts +103 -0
- package/types/water/waterVegetation.d.ts +16 -0
- package/types/worldCollision.d.ts +22 -0
- package/AGENTS.md +0 -254
- package/ATTRIBUTION.md +0 -78
- package/docs/characters.md +0 -144
- package/docs/debug-panel.md +0 -126
- package/docs/docs.css +0 -589
- package/docs/environment.md +0 -186
- package/docs/getting-started.md +0 -180
- package/docs/index.html +0 -14
- package/docs/lab-architecture.md +0 -100
- package/docs/lighting.md +0 -825
- package/docs/main.jsx +0 -739
- package/docs/mcp.md +0 -97
- package/docs/post-processing.md +0 -98
- package/docs/settings-reference.md +0 -1878
- package/docs/shader-constants.md +0 -77
- package/docs/sky.md +0 -182
- package/docs/style-labs.md +0 -309
- package/docs/texture-lab.md +0 -135
- package/docs/toon-shading.md +0 -183
- package/docs/tsl-conventions.md +0 -167
- package/docs/vegetation-sky.md +0 -275
- package/docs/water.md +0 -430
- package/docs/weather.md +0 -200
- package/docs/world-scale.md +0 -111
- package/mcp/style-lab-tools.mjs +0 -371
- package/src/ambientfx/INTEGRATION.md +0 -164
- package/src/ambientfx/ambientFxPresets.js +0 -83
- package/src/ambientfx/ambientFxSettings.js +0 -368
- package/src/ambientfx/emitters.js +0 -169
- package/src/ambientfx/index.js +0 -5
- package/src/ambientfx/particleBackbone.js +0 -493
- package/src/ambientfx/stylizedAmbientFx.js +0 -450
- package/src/biome/biomeGenerator.js +0 -385
- package/src/biome/biomeRuntime.js +0 -299
- package/src/biome/index.js +0 -2
- package/src/buildinggen/buildingAsset.js +0 -44
- package/src/buildinggen/buildingGrammar.js +0 -311
- package/src/buildinggen/buildingMesh.js +0 -451
- package/src/buildinggen/buildingPresets.js +0 -46
- package/src/buildinggen/buildingRecipe.js +0 -100
- package/src/buildinggen/buildingSettings.js +0 -238
- package/src/buildinggen/index.js +0 -6
- package/src/camera/cameraDirector.js +0 -157
- package/src/camera/cameraGenerator.js +0 -367
- package/src/camera/cameraRig.js +0 -570
- package/src/camera/cameraSettings.js +0 -236
- package/src/camera/index.js +0 -7
- package/src/catalog/builtinEntries.js +0 -245
- package/src/catalog/catalog.js +0 -210
- package/src/catalog/index.js +0 -3
- package/src/core/shaderBackend.js +0 -24
- package/src/debrisgen/debrisFields.js +0 -544
- package/src/debrisgen/debrisGenerator.js +0 -1929
- package/src/debrisgen/debrisPalettes.js +0 -71
- package/src/debrisgen/debrisPhysics.js +0 -198
- package/src/debrisgen/debrisPresets.js +0 -162
- package/src/debrisgen/debrisSettings.js +0 -333
- package/src/debrisgen/debrisTextures.js +0 -380
- package/src/debrisgen/index.js +0 -5
- package/src/debug/fieldValues.js +0 -95
- package/src/debug/index.js +0 -7
- package/src/debug/settingsPanel.js +0 -170
- package/src/fauna/INTEGRATION.md +0 -174
- package/src/fauna/boids.js +0 -861
- package/src/fauna/faunaBodies.js +0 -492
- package/src/fauna/faunaPresets.js +0 -52
- package/src/fauna/faunaSettings.js +0 -525
- package/src/fauna/index.js +0 -5
- package/src/fauna/stylizedFauna.js +0 -395
- package/src/game-feel/gameFeelGenerator.js +0 -402
- package/src/game-feel/gameFeelRuntime.js +0 -549
- package/src/game-feel/index.js +0 -2
- package/src/motion/index.js +0 -5
- package/src/motion/motionClip.js +0 -441
- package/src/motion/motionController.js +0 -628
- package/src/motion/motionDocuments.js +0 -225
- package/src/motion/motionGraph.js +0 -307
- package/src/motion/motionSettings.js +0 -222
- package/src/pathgen/index.js +0 -7
- package/src/pathgen/pathBridge.js +0 -232
- package/src/pathgen/pathPresets.js +0 -35
- package/src/pathgen/pathRibbon.js +0 -410
- package/src/pathgen/pathRouter.js +0 -380
- package/src/pathgen/pathSettings.js +0 -335
- package/src/pathgen/pathTextures.js +0 -123
- package/src/pathgen/stylizedPaths.js +0 -453
- package/src/propgen/generatorsWave1.js +0 -379
- package/src/propgen/generatorsWave2.js +0 -462
- package/src/propgen/index.js +0 -5
- package/src/propgen/propAsset.js +0 -323
- package/src/propgen/propParts.js +0 -170
- package/src/propgen/propPlacement.js +0 -459
- package/src/propgen/propPresets.js +0 -82
- package/src/propgen/propSettings.js +0 -395
- package/src/soundscape/index.js +0 -4
- package/src/soundscape/soundscapeGenerator.js +0 -179
- package/src/soundscape/soundscapeRuntime.js +0 -806
- package/src/soundscape/soundscapeSettings.js +0 -292
- package/src/stylizedTerrain.js +0 -631
- package/src/stylizedWorld.js +0 -903
- package/src/vegetation/treeRecipe.js +0 -647
- package/src/vfxgen/INTEGRATION.md +0 -145
- package/src/vfxgen/core/burstBackbone.js +0 -380
- package/src/vfxgen/core/projectileCore.js +0 -92
- package/src/vfxgen/core/spriteShapes.js +0 -98
- package/src/vfxgen/core/trailRibbon.js +0 -272
- package/src/vfxgen/core/vfxRandom.js +0 -29
- package/src/vfxgen/effects/emitHelpers.js +0 -37
- package/src/vfxgen/effects/magicEffects.js +0 -162
- package/src/vfxgen/effects/movementEffects.js +0 -87
- package/src/vfxgen/effects/weaponEffects.js +0 -118
- package/src/vfxgen/index.js +0 -18
- package/src/vfxgen/moves/moveController.js +0 -146
- package/src/vfxgen/moves/moveLibrary.js +0 -335
- package/src/vfxgen/vfxPresets.js +0 -98
- package/src/vfxgen/vfxSettings.js +0 -384
- package/src/vfxgen/vfxSystem.js +0 -449
- package/src/vfxgen/weapons/stylizedWeapons.js +0 -137
- package/src/villagegen/index.js +0 -4
- package/src/villagegen/stylizedVillage.js +0 -490
- package/src/villagegen/villageArchetypes.js +0 -160
- package/src/villagegen/villageNames.js +0 -40
- package/src/villagegen/villageSites.js +0 -105
- package/src/weather/index.js +0 -6
- package/src/weather/weatherPrecipitation.js +0 -221
- package/src/weather/weatherPresets.js +0 -258
- package/src/weather/weatherSettings.js +0 -269
- package/src/weather/weatherSystem.js +0 -871
- package/src/worldMinimap.js +0 -214
- package/src/worldPresets.js +0 -125
|
@@ -1,493 +0,0 @@
|
|
|
1
|
-
// The ONE shared GPU particle system behind every ambient effect. Same
|
|
2
|
-
// architecture as StylizedGrassField: an InstancedBufferGeometry over a unit
|
|
3
|
-
// quad, per-instance attributes filled once per (rare) window re-emission,
|
|
4
|
-
// and ALL motion computed in the TSL vertex shader as a pure function of
|
|
5
|
-
// time — zero per-frame CPU work per particle, works on WebGPU and the
|
|
6
|
-
// WebGL2 fallback alike.
|
|
7
|
-
//
|
|
8
|
-
// Draw calls: the five effects share THREE meshes, grouped by blend state —
|
|
9
|
-
// that is the real GPU boundary, not the effect:
|
|
10
|
-
// cutout — petals + leaves (alpha-test, depth-writing, double-sided)
|
|
11
|
-
// glow — fireflies + pollen (additive, no depth write, emissive/unlit)
|
|
12
|
-
// soft — mist (alpha blend, no depth write)
|
|
13
|
-
// Within a group the per-instance `kind` attribute selects the motion
|
|
14
|
-
// program (flutter-fall / tumble-fall / hover-blink / curl-drift / scroll),
|
|
15
|
-
// so adding an effect never adds a draw. A single backbone draw for all five
|
|
16
|
-
// was rejected: cutout needs depth writes that would occlude through the
|
|
17
|
-
// additive glows, and mist's alpha blend cannot share either state.
|
|
18
|
-
//
|
|
19
|
-
// Budget: ≤ 20k instances of 2 triangles with trig-only vertex work and
|
|
20
|
-
// mostly-discard flat fragments — far under the 0.5 ms cluster budget.
|
|
21
|
-
|
|
22
|
-
import * as THREE from 'three';
|
|
23
|
-
import { NodeMaterial } from 'three/webgpu';
|
|
24
|
-
import {
|
|
25
|
-
abs, attribute, cameraPosition, cameraProjectionMatrix, cameraViewMatrix, clamp, cos, Discard,
|
|
26
|
-
distance, exp, float, Fn, fract, length, max, mix, modelWorldMatrix, normalize, positionLocal,
|
|
27
|
-
pow, rotate, sin, smoothstep, step, uniform, uv, varying, vec2, vec3, vec4,
|
|
28
|
-
} from 'three/tsl';
|
|
29
|
-
|
|
30
|
-
// --- deterministic randomness (shared with emitters + verify script) --------
|
|
31
|
-
|
|
32
|
-
/** Chris Wellons' lowbias32: uint32 -> well-mixed uint32. */
|
|
33
|
-
export function lowbias32(x) {
|
|
34
|
-
let h = x >>> 0;
|
|
35
|
-
h = Math.imul(h ^ (h >>> 16), 0x7feb352d) >>> 0;
|
|
36
|
-
h = Math.imul(h ^ (h >>> 15), 0x846ca68b) >>> 0;
|
|
37
|
-
return (h ^ (h >>> 16)) >>> 0;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Mixes two uint32 seeds into one (order-sensitive). */
|
|
41
|
-
export function hashCombine(a, b) {
|
|
42
|
-
return lowbias32((a >>> 0) ^ (Math.imul(b >>> 0, 0x9e3779b9) >>> 0));
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** mulberry32 PRNG: uint32 seed -> () => [0, 1). No Math.random anywhere. */
|
|
46
|
-
export function mulberry32(seed) {
|
|
47
|
-
let state = (Math.trunc(seed) || 1) >>> 0;
|
|
48
|
-
return () => {
|
|
49
|
-
state = (state + 0x6d2b79f5) >>> 0;
|
|
50
|
-
let t = state;
|
|
51
|
-
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
52
|
-
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
53
|
-
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// --- effect/window constants -------------------------------------------------
|
|
58
|
-
|
|
59
|
-
/** Backbone kind ids — the per-instance `iData.w` attribute. */
|
|
60
|
-
export const EFFECT_KIND = Object.freeze({ petals: 0, leaves: 1, fireflies: 2, pollen: 3, mist: 4 });
|
|
61
|
-
|
|
62
|
-
/** Which blend-group mesh each kind renders in. */
|
|
63
|
-
export const GROUP_FOR_KIND = Object.freeze({
|
|
64
|
-
petals: 'cutout', leaves: 'cutout', fireflies: 'glow', pollen: 'glow', mist: 'soft',
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
// Follow-window geometry. Emission fills the full windowRadius disk; the
|
|
68
|
-
// visual fade ends before (radius − recenter·radius), so by the time the
|
|
69
|
-
// window re-centers, every cell that appears or drops is already past the
|
|
70
|
-
// fade — mathematically no pop is possible (see stylizedAmbientFx).
|
|
71
|
-
export const FADE_START_FRACTION = 0.55;
|
|
72
|
-
export const FADE_END_FRACTION = 0.8;
|
|
73
|
-
export const RECENTER_FRACTION = 0.18;
|
|
74
|
-
|
|
75
|
-
/** CPU mirror of the shader's wind drift heading (for hosts and verify). */
|
|
76
|
-
export function windDriftVector(windDirection) {
|
|
77
|
-
const x = Number(windDirection?.[0]) || 0;
|
|
78
|
-
const z = Number(windDirection?.[1]) || 0;
|
|
79
|
-
const len = Math.hypot(x, z) || 1;
|
|
80
|
-
return [x / len, z / len];
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// --- geometry helpers --------------------------------------------------------
|
|
84
|
-
|
|
85
|
-
const FLOATS_PER_INSTANCE = { iSpawn: 3, iData: 4, iColor: 3, iAux: 4 };
|
|
86
|
-
|
|
87
|
-
function createGroupGeometry(capacity) {
|
|
88
|
-
const quad = new THREE.PlaneGeometry(1, 1);
|
|
89
|
-
const geometry = new THREE.InstancedBufferGeometry();
|
|
90
|
-
geometry.index = quad.index;
|
|
91
|
-
geometry.setAttribute('position', quad.attributes.position);
|
|
92
|
-
geometry.setAttribute('uv', quad.attributes.uv);
|
|
93
|
-
for (const [name, itemSize] of Object.entries(FLOATS_PER_INSTANCE)) {
|
|
94
|
-
geometry.setAttribute(name, new THREE.InstancedBufferAttribute(
|
|
95
|
-
new Float32Array(Math.max(capacity, 1) * itemSize), itemSize));
|
|
96
|
-
}
|
|
97
|
-
geometry.instanceCount = 0;
|
|
98
|
-
// Instances span the whole follow window wherever it goes.
|
|
99
|
-
geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), 1e5);
|
|
100
|
-
return geometry;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Creates the three blend-group meshes plus their shared uniforms.
|
|
105
|
-
* `settings` is a createAmbientFxSettings() result — only uniform-backed
|
|
106
|
-
* values are read here; emission is the caller's job (see emitters.js).
|
|
107
|
-
*
|
|
108
|
-
* Returned groups expose `setInstances(records)` where each record is
|
|
109
|
-
* `{ x, y, z, seed, phase, size, kind, r, g, b, range, rate, gateJitter,
|
|
110
|
-
* windResponse }` — the emitters produce exactly this shape.
|
|
111
|
-
*/
|
|
112
|
-
export function createParticleBackbone(settings) {
|
|
113
|
-
const shared = settings.shared;
|
|
114
|
-
const u = {
|
|
115
|
-
uCamRight: uniform(new THREE.Vector3(1, 0, 0)),
|
|
116
|
-
uCamUp: uniform(new THREE.Vector3(0, 1, 0)),
|
|
117
|
-
uCenter: uniform(new THREE.Vector2(0, 0)),
|
|
118
|
-
uFireflyIntensity: uniform(settings.fireflies.intensity),
|
|
119
|
-
uFogColor: uniform(new THREE.Color(0.66, 0.8, 0.94)),
|
|
120
|
-
uFogDensity: uniform(0),
|
|
121
|
-
uFogFalloff: uniform(400),
|
|
122
|
-
uFogFloorY: uniform(0),
|
|
123
|
-
uGateFireflies: uniform(1),
|
|
124
|
-
uGateLeaves: uniform(1),
|
|
125
|
-
uGateMist: uniform(1),
|
|
126
|
-
uGatePetals: uniform(1),
|
|
127
|
-
uGatePollen: uniform(1),
|
|
128
|
-
uMistOpacity: uniform(settings.mist.opacity),
|
|
129
|
-
uPollenBacklit: uniform(settings.pollen.backlitStrength),
|
|
130
|
-
uSunDirection: uniform(new THREE.Vector3(...shared.sunDirection).normalize()),
|
|
131
|
-
uTime: uniform(0),
|
|
132
|
-
uWindDir: uniform(new THREE.Vector2(shared.windDirection[0], shared.windDirection[1])),
|
|
133
|
-
uWindSpeed: uniform(shared.windSpeed),
|
|
134
|
-
uWindStrength: uniform(shared.windStrength),
|
|
135
|
-
uWindowRadius: uniform(shared.windowRadius),
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
// Mirror of the environment shader's world-height fog (same formula as the
|
|
139
|
-
// forest impostors' _fogUniforms): dense near the world floor, thinning
|
|
140
|
-
// with altitude, exponential in view distance. Density 0 disables.
|
|
141
|
-
const heightFogFactor = (worldPos) => {
|
|
142
|
-
const heightFalloff = exp(
|
|
143
|
-
max(worldPos.y.sub(u.uFogFloorY), 0.0).div(max(u.uFogFalloff, 0.001)).negate());
|
|
144
|
-
const depthTerm = exp(distance(worldPos, cameraPosition).mul(u.uFogDensity).negate()).oneMinus();
|
|
145
|
-
return clamp(depthTerm.mul(heightFalloff), 0.0, 1.0);
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
// Shared per-instance plumbing: window edge fade around the live follow
|
|
149
|
-
// center + staggered time-gate fade (each particle owns a threshold, so a
|
|
150
|
-
// gate ramping 0→1 pops particles in one by one instead of all at once).
|
|
151
|
-
const windowFade = (worldSpawnXZ) => {
|
|
152
|
-
const dist = length(worldSpawnXZ.sub(u.uCenter));
|
|
153
|
-
return smoothstep(
|
|
154
|
-
u.uWindowRadius.mul(FADE_START_FRACTION),
|
|
155
|
-
u.uWindowRadius.mul(FADE_END_FRACTION),
|
|
156
|
-
dist,
|
|
157
|
-
).oneMinus();
|
|
158
|
-
};
|
|
159
|
-
const gateFade = (weight, jitter) =>
|
|
160
|
-
clamp(weight.mul(1.15).sub(jitter.mul(0.96)).div(0.12), 0.0, 1.0);
|
|
161
|
-
|
|
162
|
-
const buildMaterial = (name, build) => {
|
|
163
|
-
const material = new NodeMaterial();
|
|
164
|
-
material.name = name;
|
|
165
|
-
build(material);
|
|
166
|
-
material.uniforms = u; // GLSL-style named access, matching the grass idiom
|
|
167
|
-
return material;
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
// ---- cutout group: petals (flutter-fall) + leaves (tumble-fall) ----------
|
|
171
|
-
const cutoutMaterial = buildMaterial('AmbientFxCutout', (material) => {
|
|
172
|
-
material.side = THREE.DoubleSide;
|
|
173
|
-
material.fog = true; // scene.fog linear layer; height fog added below
|
|
174
|
-
|
|
175
|
-
const vUv = uv();
|
|
176
|
-
const vColor = varying(vec3(), 'vFxColor');
|
|
177
|
-
const vSeed = varying(float(), 'vFxSeed');
|
|
178
|
-
const vKind = varying(float(), 'vFxKind');
|
|
179
|
-
const vWorldPos = varying(vec3(), 'vFxWorldPos');
|
|
180
|
-
|
|
181
|
-
material.vertexNode = Fn(() => {
|
|
182
|
-
const iSpawn = attribute('iSpawn', 'vec3');
|
|
183
|
-
const iData = attribute('iData', 'vec4');
|
|
184
|
-
const iAux = attribute('iAux', 'vec4');
|
|
185
|
-
const seed = iData.x;
|
|
186
|
-
const isLeaf = step(0.5, iData.w).toVar();
|
|
187
|
-
vSeed.assign(seed);
|
|
188
|
-
vKind.assign(iData.w);
|
|
189
|
-
vColor.assign(attribute('iColor', 'vec3'));
|
|
190
|
-
|
|
191
|
-
const t = u.uTime;
|
|
192
|
-
const windDir = normalize(u.uWindDir.add(vec2(1e-4, 0.0))).toVar();
|
|
193
|
-
const windAmp = u.uWindStrength.mul(iAux.w).toVar();
|
|
194
|
-
|
|
195
|
-
// Looping fall: each particle forever re-falls its own span (spawn
|
|
196
|
-
// height → ground, precomputed by the emitter). The loop ends collapse
|
|
197
|
-
// the quad so respawns at the top are invisible, never a pop.
|
|
198
|
-
const fallSpan = max(iAux.x, 0.5);
|
|
199
|
-
const fallSpeed = mix(0.5, 1.0, fract(seed.mul(19.7))).mul(mix(1.0, 1.4, isLeaf));
|
|
200
|
-
const progress = fract(iData.y.add(t.mul(fallSpeed).div(fallSpan))).toVar();
|
|
201
|
-
const drop = progress.mul(fallSpan).toVar();
|
|
202
|
-
|
|
203
|
-
// Side-to-side flutter (petals rock, leaves slide) + downwind advection
|
|
204
|
-
// that accumulates over the fall + a traveling gust kick for leaves.
|
|
205
|
-
const ph = t.mul(mix(1.4, 2.3, fract(seed.mul(7.7)))).add(seed.mul(41.0)).toVar();
|
|
206
|
-
const amp = iAux.y.mul(mix(0.32, 0.5, fract(seed.mul(3.3)))).toVar();
|
|
207
|
-
const perp = vec2(windDir.y.negate(), windDir.x);
|
|
208
|
-
const sway = perp.mul(sin(ph).mul(amp))
|
|
209
|
-
.add(windDir.mul(sin(ph.mul(0.77).add(1.3)).mul(amp).mul(0.6)))
|
|
210
|
-
.toVar();
|
|
211
|
-
const gust = sin(iSpawn.xz.dot(windDir).mul(0.15).sub(t.mul(u.uWindSpeed).mul(1.5)))
|
|
212
|
-
.mul(0.5).add(0.5);
|
|
213
|
-
const advect = windDir.mul(
|
|
214
|
-
windAmp.mul(drop).mul(1.6).add(gust.mul(windAmp).mul(isLeaf).mul(1.4)),
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
// Orientation: petals rock around a lazy yaw; leaves tumble end over
|
|
218
|
-
// end — this rotation is what makes tiny quads read as leaves/petals.
|
|
219
|
-
const yaw = seed.mul(6.2831).add(t.mul(iAux.y).mul(mix(0.6, 1.1, isLeaf)));
|
|
220
|
-
const pitch = mix(
|
|
221
|
-
sin(ph.mul(1.13)).mul(0.8).mul(iAux.y).add(1.1),
|
|
222
|
-
t.mul(iAux.y).mul(2.4).add(seed.mul(6.2831)),
|
|
223
|
-
isLeaf,
|
|
224
|
-
);
|
|
225
|
-
const roll = sin(ph.mul(0.71).add(seed.mul(9.0))).mul(0.6);
|
|
226
|
-
|
|
227
|
-
// Fades multiply into the quad SIZE: a degenerate quad rasterizes
|
|
228
|
-
// nothing, so gated/out-of-window particles cost zero fragments.
|
|
229
|
-
const worldSpawn = modelWorldMatrix.mul(vec4(iSpawn, 1.0)).xyz.toVar();
|
|
230
|
-
const endFade = smoothstep(0.0, 0.06, progress)
|
|
231
|
-
.mul(smoothstep(0.92, 1.0, progress).oneMinus());
|
|
232
|
-
const gateW = mix(u.uGatePetals, u.uGateLeaves, isLeaf);
|
|
233
|
-
const scale = iData.z
|
|
234
|
-
.mul(endFade)
|
|
235
|
-
.mul(windowFade(worldSpawn.xz))
|
|
236
|
-
.mul(gateFade(gateW, iAux.z))
|
|
237
|
-
.toVar();
|
|
238
|
-
|
|
239
|
-
// PlaneGeometry corners live in local XY; rotate the scaled quad.
|
|
240
|
-
const offset = rotate(positionLocal.mul(scale), vec3(pitch, yaw, roll));
|
|
241
|
-
const position = vec3(
|
|
242
|
-
iSpawn.x.add(sway.x).add(advect.x),
|
|
243
|
-
iSpawn.y.sub(drop),
|
|
244
|
-
iSpawn.z.add(sway.y).add(advect.y),
|
|
245
|
-
).add(offset);
|
|
246
|
-
const worldPosition = modelWorldMatrix.mul(vec4(position, 1.0));
|
|
247
|
-
vWorldPos.assign(worldPosition.xyz);
|
|
248
|
-
return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
|
|
249
|
-
})();
|
|
250
|
-
|
|
251
|
-
material.fragmentNode = Fn(() => {
|
|
252
|
-
const isLeaf = step(0.5, vKind);
|
|
253
|
-
const p = vUv.mul(2.0).sub(1.0).toVar();
|
|
254
|
-
// Petal: ellipse with a notch at the outer edge (the classic sakura
|
|
255
|
-
// dimple). Leaf: narrower pointed ellipse with a midrib.
|
|
256
|
-
const petalMask = length(p.mul(vec2(1.0, 1.12)))
|
|
257
|
-
.add(smoothstep(0.35, 0.0, abs(p.x)).mul(max(p.y, 0.0)).mul(0.45));
|
|
258
|
-
const leafMask = length(p.mul(vec2(1.5, 1.0)));
|
|
259
|
-
Discard(mix(petalMask, leafMask, isLeaf).greaterThan(1.0));
|
|
260
|
-
|
|
261
|
-
const color = vColor.mul(fract(vSeed.mul(5.1)).mul(0.16).add(0.92)).toVar();
|
|
262
|
-
color.mulAssign(smoothstep(0.12, 0.0, abs(p.x)).mul(isLeaf).mul(0.16).oneMinus());
|
|
263
|
-
// Backlit translucency toward the sun — same trick as the grass tips.
|
|
264
|
-
const viewDirection = normalize(cameraPosition.sub(vWorldPos));
|
|
265
|
-
const backlit = pow(clamp(viewDirection.dot(normalize(u.uSunDirection).negate()), 0.0, 1.0), 3.0);
|
|
266
|
-
color.addAssign(color.mul(backlit).mul(0.3));
|
|
267
|
-
|
|
268
|
-
const fogged = mix(color, u.uFogColor, heightFogFactor(vWorldPos));
|
|
269
|
-
return vec4(fogged, 1.0);
|
|
270
|
-
})();
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
// ---- glow group: fireflies (hover-blink) + pollen (curl drift) ----------
|
|
274
|
-
// Emissive/unlit by design (fireflies ARE light sources) and additive, so
|
|
275
|
-
// scene fog must not tint them toward the fog color — a fog-colored glow
|
|
276
|
-
// quad ADDS fog-colored light. Instead both fog layers only DIM the glow.
|
|
277
|
-
const glowMaterial = buildMaterial('AmbientFxGlow', (material) => {
|
|
278
|
-
material.transparent = true;
|
|
279
|
-
material.blending = THREE.AdditiveBlending;
|
|
280
|
-
material.depthWrite = false;
|
|
281
|
-
material.fog = false;
|
|
282
|
-
|
|
283
|
-
const vUv = uv();
|
|
284
|
-
const vColor = varying(vec3(), 'vFxColor');
|
|
285
|
-
const vSeed = varying(float(), 'vFxSeed');
|
|
286
|
-
const vKind = varying(float(), 'vFxKind');
|
|
287
|
-
const vRate = varying(float(), 'vFxRate');
|
|
288
|
-
const vFade = varying(float(), 'vFxFade');
|
|
289
|
-
const vWorldPos = varying(vec3(), 'vFxWorldPos');
|
|
290
|
-
|
|
291
|
-
material.vertexNode = Fn(() => {
|
|
292
|
-
const iSpawn = attribute('iSpawn', 'vec3');
|
|
293
|
-
const iData = attribute('iData', 'vec4');
|
|
294
|
-
const iAux = attribute('iAux', 'vec4');
|
|
295
|
-
const seed = iData.x;
|
|
296
|
-
const isPollen = step(2.5, iData.w).toVar();
|
|
297
|
-
vSeed.assign(seed);
|
|
298
|
-
vKind.assign(iData.w);
|
|
299
|
-
vRate.assign(iAux.y);
|
|
300
|
-
vColor.assign(attribute('iColor', 'vec3'));
|
|
301
|
-
|
|
302
|
-
const t = u.uTime;
|
|
303
|
-
// Layered-sine wander: fireflies patrol a small pocket of air, pollen
|
|
304
|
-
// swirls in a lazier, larger orbit keyed to its position (reads as a
|
|
305
|
-
// shared drift field without paying for real curl noise).
|
|
306
|
-
const a = mix(0.7, 1.3, fract(seed.mul(3.1)));
|
|
307
|
-
const b = mix(0.7, 1.3, fract(seed.mul(5.7)));
|
|
308
|
-
const c = mix(0.7, 1.3, fract(seed.mul(9.3)));
|
|
309
|
-
const speed = mix(0.5, 0.24, isPollen);
|
|
310
|
-
const wander = vec3(
|
|
311
|
-
sin(t.mul(speed).mul(a).add(seed.mul(40.0)).add(iSpawn.z.mul(isPollen).mul(0.4))),
|
|
312
|
-
sin(t.mul(speed).mul(0.8).mul(b).add(seed.mul(71.0))).mul(0.55),
|
|
313
|
-
cos(t.mul(speed).mul(0.9).mul(c).add(seed.mul(23.0)).add(iSpawn.x.mul(isPollen).mul(0.35))),
|
|
314
|
-
).mul(iAux.x).toVar();
|
|
315
|
-
// Bounded, oscillating downwind slide — never walks off the window.
|
|
316
|
-
const windDir = normalize(u.uWindDir.add(vec2(1e-4, 0.0)));
|
|
317
|
-
const slide = sin(t.mul(0.22).add(iData.y.mul(6.2831))).mul(0.5).add(0.5)
|
|
318
|
-
.mul(u.uWindStrength).mul(iAux.w).mul(6.0);
|
|
319
|
-
wander.x.addAssign(windDir.x.mul(slide));
|
|
320
|
-
wander.z.addAssign(windDir.y.mul(slide));
|
|
321
|
-
|
|
322
|
-
const anchor = iSpawn.add(wander).toVar();
|
|
323
|
-
const worldSpawn = modelWorldMatrix.mul(vec4(iSpawn, 1.0)).xyz;
|
|
324
|
-
const gateW = mix(u.uGateFireflies, u.uGatePollen, isPollen);
|
|
325
|
-
const fade = windowFade(worldSpawn.xz).mul(gateFade(gateW, iAux.z)).toVar();
|
|
326
|
-
vFade.assign(fade);
|
|
327
|
-
|
|
328
|
-
// Camera-facing billboard from CPU-fed basis vectors (backend-safe).
|
|
329
|
-
const scale = iData.z.mul(step(0.001, fade)).mul(fade.mul(0.35).add(0.65));
|
|
330
|
-
const position = anchor
|
|
331
|
-
.add(u.uCamRight.mul(positionLocal.x).mul(scale))
|
|
332
|
-
.add(u.uCamUp.mul(positionLocal.y).mul(scale));
|
|
333
|
-
const worldPosition = modelWorldMatrix.mul(vec4(position, 1.0));
|
|
334
|
-
vWorldPos.assign(worldPosition.xyz);
|
|
335
|
-
return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
|
|
336
|
-
})();
|
|
337
|
-
|
|
338
|
-
material.fragmentNode = Fn(() => {
|
|
339
|
-
const isPollen = step(2.5, vKind);
|
|
340
|
-
const t = u.uTime;
|
|
341
|
-
const d = length(vUv.mul(2.0).sub(1.0)).toVar();
|
|
342
|
-
const halo = pow(clamp(d.oneMinus(), 0.0, 1.0), 1.8).toVar();
|
|
343
|
-
const core = pow(clamp(d.oneMinus(), 0.0, 1.0), 6.0).toVar();
|
|
344
|
-
|
|
345
|
-
// Blink: the product of two incommensurate sines thresholded gives the
|
|
346
|
-
// irregular firefly pulse; a small floor keeps a faint ember between
|
|
347
|
-
// blinks so motes never teleport visually.
|
|
348
|
-
const blinkT = sin(t.mul(vRate).mul(1.1).add(vSeed.mul(251.0))).mul(0.5).add(0.5)
|
|
349
|
-
.mul(sin(t.mul(vRate).mul(0.37).add(vSeed.mul(97.0))).mul(0.5).add(0.5));
|
|
350
|
-
const blink = smoothstep(0.22, 0.55, blinkT).mul(0.94).add(0.06);
|
|
351
|
-
|
|
352
|
-
// Pollen: steady soft twinkle + strong boost looking toward the sun.
|
|
353
|
-
const viewDirection = normalize(cameraPosition.sub(vWorldPos));
|
|
354
|
-
const backlit = pow(clamp(viewDirection.dot(normalize(u.uSunDirection).negate()), 0.0, 1.0), 2.5);
|
|
355
|
-
const twinkle = sin(t.mul(vRate).add(vSeed.mul(151.0))).mul(0.18).add(0.82);
|
|
356
|
-
// Base bright enough to sparkle over sunlit grass; backlit doubles it.
|
|
357
|
-
const pollenBrightness = twinkle.mul(backlit.mul(u.uPollenBacklit).mul(2.2).add(0.85));
|
|
358
|
-
|
|
359
|
-
const brightness = mix(blink.mul(u.uFireflyIntensity).mul(2.0), pollenBrightness, isPollen);
|
|
360
|
-
const rgb = vColor.mul(halo).add(vec3(1.0).mul(core).mul(mix(0.8, 0.25, isPollen)))
|
|
361
|
-
.mul(brightness)
|
|
362
|
-
.mul(vFade)
|
|
363
|
-
.mul(heightFogFactor(vWorldPos).oneMinus());
|
|
364
|
-
return vec4(rgb, halo);
|
|
365
|
-
})();
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
// ---- soft group: mist wisps (horizontal scroll) ---------------------------
|
|
369
|
-
const softMaterial = buildMaterial('AmbientFxSoft', (material) => {
|
|
370
|
-
material.transparent = true;
|
|
371
|
-
material.depthWrite = false;
|
|
372
|
-
material.fog = true;
|
|
373
|
-
|
|
374
|
-
const vUv = uv();
|
|
375
|
-
const vColor = varying(vec3(), 'vFxColor');
|
|
376
|
-
const vSeed = varying(float(), 'vFxSeed');
|
|
377
|
-
const vFade = varying(float(), 'vFxFade');
|
|
378
|
-
const vWorldPos = varying(vec3(), 'vFxWorldPos');
|
|
379
|
-
|
|
380
|
-
material.vertexNode = Fn(() => {
|
|
381
|
-
const iSpawn = attribute('iSpawn', 'vec3');
|
|
382
|
-
const iData = attribute('iData', 'vec4');
|
|
383
|
-
const iAux = attribute('iAux', 'vec4');
|
|
384
|
-
const seed = iData.x;
|
|
385
|
-
vSeed.assign(seed);
|
|
386
|
-
vColor.assign(attribute('iColor', 'vec3'));
|
|
387
|
-
|
|
388
|
-
const t = u.uTime;
|
|
389
|
-
const windDir = normalize(u.uWindDir.add(vec2(1e-4, 0.0)));
|
|
390
|
-
// Scroll a wisp downwind across its span, wrap, fade at both ends.
|
|
391
|
-
const s = fract(iData.y.add(t.mul(u.uWindSpeed).mul(iAux.w).mul(0.02))).toVar();
|
|
392
|
-
const travel = s.sub(0.5).mul(iAux.x);
|
|
393
|
-
const bob = sin(t.mul(iAux.y).add(seed.mul(37.0))).mul(0.22);
|
|
394
|
-
const anchor = vec3(
|
|
395
|
-
iSpawn.x.add(windDir.x.mul(travel)),
|
|
396
|
-
iSpawn.y.add(bob),
|
|
397
|
-
iSpawn.z.add(windDir.y.mul(travel)),
|
|
398
|
-
).toVar();
|
|
399
|
-
|
|
400
|
-
const worldSpawn = modelWorldMatrix.mul(vec4(iSpawn, 1.0)).xyz;
|
|
401
|
-
const endFade = smoothstep(0.0, 0.18, s).mul(smoothstep(0.82, 1.0, s).oneMinus());
|
|
402
|
-
const fade = windowFade(worldSpawn.xz)
|
|
403
|
-
.mul(gateFade(u.uGateMist, iAux.z))
|
|
404
|
-
.mul(endFade)
|
|
405
|
-
.toVar();
|
|
406
|
-
vFade.assign(fade);
|
|
407
|
-
|
|
408
|
-
// Y-axis billboard: wisps stay upright and face the camera in plan
|
|
409
|
-
// only, so they read as layers of ground haze from any walk-height view.
|
|
410
|
-
const toCam = cameraPosition.sub(anchor);
|
|
411
|
-
const right = normalize(vec3(toCam.z, 0.0, toCam.x.negate()).add(vec3(1e-4, 0.0, 0.0)));
|
|
412
|
-
const width = iData.z.mul(fract(seed.mul(2.7)).mul(2.6).add(4.0));
|
|
413
|
-
const grow = step(0.001, fade);
|
|
414
|
-
const position = anchor
|
|
415
|
-
.add(right.mul(positionLocal.x).mul(width).mul(grow))
|
|
416
|
-
.add(vec3(0.0, 1.0, 0.0).mul(positionLocal.y.add(0.35)).mul(iData.z).mul(grow));
|
|
417
|
-
const worldPosition = modelWorldMatrix.mul(vec4(position, 1.0));
|
|
418
|
-
vWorldPos.assign(worldPosition.xyz);
|
|
419
|
-
return cameraProjectionMatrix.mul(cameraViewMatrix).mul(worldPosition);
|
|
420
|
-
})();
|
|
421
|
-
|
|
422
|
-
material.fragmentNode = Fn(() => {
|
|
423
|
-
const t = u.uTime;
|
|
424
|
-
const p = vUv.mul(2.0).sub(1.0);
|
|
425
|
-
const body = pow(clamp(length(p.mul(vec2(1.0, 1.2))).oneMinus(), 0.0, 1.0), 1.5);
|
|
426
|
-
// Two drifting ripples across the quad break the "airbrushed ellipse"
|
|
427
|
-
// read into something wispy without a noise texture.
|
|
428
|
-
const ripple = sin(vUv.x.mul(9.0).add(t.mul(0.4)).add(vSeed.mul(63.0))).mul(0.5).add(0.5)
|
|
429
|
-
.mul(sin(vUv.x.mul(4.0).sub(t.mul(0.23)).add(vSeed.mul(29.0))).mul(0.5).add(0.5));
|
|
430
|
-
const alpha = body
|
|
431
|
-
.mul(ripple.mul(0.5).add(0.62))
|
|
432
|
-
.mul(u.uMistOpacity)
|
|
433
|
-
.mul(fract(vSeed.mul(9.3)).mul(0.3).add(0.7))
|
|
434
|
-
.mul(vFade);
|
|
435
|
-
|
|
436
|
-
const lit = mix(vColor.mul(0.94), vColor.mul(1.08), vUv.y);
|
|
437
|
-
const fogged = mix(lit, u.uFogColor, heightFogFactor(vWorldPos));
|
|
438
|
-
return vec4(fogged, alpha);
|
|
439
|
-
})();
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
const buildGroup = (id, material, capacity, renderOrder) => {
|
|
443
|
-
const mesh = new THREE.Mesh(createGroupGeometry(capacity), material);
|
|
444
|
-
mesh.name = `AmbientFx${id[0].toUpperCase()}${id.slice(1)}`;
|
|
445
|
-
mesh.frustumCulled = false;
|
|
446
|
-
mesh.renderOrder = renderOrder;
|
|
447
|
-
const group = {
|
|
448
|
-
capacity: Math.max(capacity, 1),
|
|
449
|
-
count: 0,
|
|
450
|
-
id,
|
|
451
|
-
mesh,
|
|
452
|
-
setInstances(records) {
|
|
453
|
-
if (records.length > group.capacity) {
|
|
454
|
-
group.capacity = Math.ceil(records.length * 1.3);
|
|
455
|
-
for (const [name, itemSize] of Object.entries(FLOATS_PER_INSTANCE)) {
|
|
456
|
-
mesh.geometry.setAttribute(name, new THREE.InstancedBufferAttribute(
|
|
457
|
-
new Float32Array(group.capacity * itemSize), itemSize));
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
const spawn = mesh.geometry.attributes.iSpawn;
|
|
461
|
-
const data = mesh.geometry.attributes.iData;
|
|
462
|
-
const color = mesh.geometry.attributes.iColor;
|
|
463
|
-
const aux = mesh.geometry.attributes.iAux;
|
|
464
|
-
records.forEach((r, i) => {
|
|
465
|
-
spawn.array[i * 3] = r.x; spawn.array[i * 3 + 1] = r.y; spawn.array[i * 3 + 2] = r.z;
|
|
466
|
-
data.array[i * 4] = r.seed; data.array[i * 4 + 1] = r.phase;
|
|
467
|
-
data.array[i * 4 + 2] = r.size; data.array[i * 4 + 3] = r.kind;
|
|
468
|
-
color.array[i * 3] = r.r; color.array[i * 3 + 1] = r.g; color.array[i * 3 + 2] = r.b;
|
|
469
|
-
aux.array[i * 4] = r.range; aux.array[i * 4 + 1] = r.rate;
|
|
470
|
-
aux.array[i * 4 + 2] = r.gateJitter; aux.array[i * 4 + 3] = r.windResponse;
|
|
471
|
-
});
|
|
472
|
-
spawn.needsUpdate = data.needsUpdate = color.needsUpdate = aux.needsUpdate = true;
|
|
473
|
-
mesh.geometry.instanceCount = records.length;
|
|
474
|
-
group.count = records.length;
|
|
475
|
-
},
|
|
476
|
-
dispose() {
|
|
477
|
-
mesh.geometry.dispose();
|
|
478
|
-
material.dispose();
|
|
479
|
-
},
|
|
480
|
-
};
|
|
481
|
-
return group;
|
|
482
|
-
};
|
|
483
|
-
|
|
484
|
-
return {
|
|
485
|
-
groups: {
|
|
486
|
-
cutout: buildGroup('cutout', cutoutMaterial, 2048, 1),
|
|
487
|
-
// Mist under the glows so fireflies shine THROUGH the haze layer.
|
|
488
|
-
soft: buildGroup('soft', softMaterial, 64, 2),
|
|
489
|
-
glow: buildGroup('glow', glowMaterial, 1024, 3),
|
|
490
|
-
},
|
|
491
|
-
uniforms: u,
|
|
492
|
-
};
|
|
493
|
-
}
|