@3driseai/3drise-viewer 0.1.42 → 0.1.43
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/dist/animationsV2/ClipsRuntime.d.ts +16 -1
- package/dist/animationsV2/ClipsRuntime.d.ts.map +1 -1
- package/dist/animationsV2/ClipsRuntime.js +144 -25
- package/dist/animationsV2/appliers.d.ts +9 -0
- package/dist/animationsV2/appliers.d.ts.map +1 -1
- package/dist/animationsV2/appliers.js +62 -2
- package/dist/animationsV2/clipUtils.d.ts +30 -0
- package/dist/animationsV2/clipUtils.d.ts.map +1 -1
- package/dist/animationsV2/clipUtils.js +163 -17
- package/dist/animationsV2/elementSettings.d.ts +5 -0
- package/dist/animationsV2/elementSettings.d.ts.map +1 -1
- package/dist/animationsV2/elementSettings.js +6 -3
- package/dist/animationsV2/sequenceUtils.js +4 -4
- package/dist/animationsV2/types.d.ts +23 -0
- package/dist/animationsV2/types.d.ts.map +1 -1
- package/dist/api/sceneHandle.js +2 -2
- package/dist/components/CreatedObject.d.ts +3 -0
- package/dist/components/CreatedObject.d.ts.map +1 -1
- package/dist/components/CreatedObject.js +6 -2
- package/dist/components/CustomPrimitive.d.ts.map +1 -1
- package/dist/components/CustomPrimitive.js +1 -10
- package/dist/components/EnvironmentManager.d.ts.map +1 -1
- package/dist/components/EnvironmentManager.js +11 -5
- package/dist/components/GeometryShape.d.ts +5 -2
- package/dist/components/GeometryShape.d.ts.map +1 -1
- package/dist/components/GeometryShape.js +71 -10
- package/dist/components/LandObject.d.ts.map +1 -1
- package/dist/components/LandObject.js +1 -1
- package/dist/components/LayoutInstances.d.ts +2 -1
- package/dist/components/LayoutInstances.d.ts.map +1 -1
- package/dist/components/LayoutInstances.js +39 -6
- package/dist/components/LightObject.d.ts.map +1 -1
- package/dist/components/LightObject.js +3 -0
- package/dist/components/ObjectNode.d.ts.map +1 -1
- package/dist/components/ObjectNode.js +62 -13
- package/dist/components/OceanBuilder.d.ts +2 -0
- package/dist/components/OceanBuilder.d.ts.map +1 -1
- package/dist/components/OceanBuilder.js +2 -1
- package/dist/components/RenderEffects.d.ts +8 -0
- package/dist/components/RenderEffects.d.ts.map +1 -0
- package/dist/components/RenderEffects.js +120 -0
- package/dist/components/SceneBuilder.d.ts.map +1 -1
- package/dist/components/SceneBuilder.js +18 -9
- package/dist/components/SportsObject.d.ts +9 -0
- package/dist/components/SportsObject.d.ts.map +1 -0
- package/dist/components/SportsObject.js +20 -0
- package/dist/components/UrbanObject.d.ts +9 -0
- package/dist/components/UrbanObject.d.ts.map +1 -0
- package/dist/components/UrbanObject.js +28 -0
- package/dist/components/VegetationObject.d.ts +9 -0
- package/dist/components/VegetationObject.d.ts.map +1 -0
- package/dist/components/VegetationObject.js +26 -0
- package/dist/components/WaterObject.d.ts +15 -0
- package/dist/components/WaterObject.d.ts.map +1 -0
- package/dist/components/WaterObject.js +29 -0
- package/dist/components/index.d.ts +7 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +6 -1
- package/dist/components/land/LandPatch.d.ts +3 -1
- package/dist/components/land/LandPatch.d.ts.map +1 -1
- package/dist/components/land/LandPatch.js +80 -7
- package/dist/components/layout/InstancedLayout.d.ts +19 -0
- package/dist/components/layout/InstancedLayout.d.ts.map +1 -0
- package/dist/components/layout/InstancedLayout.js +154 -0
- package/dist/components/layout/LayoutGrounds.d.ts +19 -0
- package/dist/components/layout/LayoutGrounds.d.ts.map +1 -0
- package/dist/components/layout/LayoutGrounds.js +104 -0
- package/dist/components/layout/LinkProxies.d.ts +5 -0
- package/dist/components/layout/LinkProxies.d.ts.map +1 -0
- package/dist/components/layout/LinkProxies.js +51 -0
- package/dist/components/layout/LinkedSource.d.ts +14 -0
- package/dist/components/layout/LinkedSource.d.ts.map +1 -0
- package/dist/components/layout/LinkedSource.js +129 -0
- package/dist/components/projector/Projector.d.ts +14 -0
- package/dist/components/projector/Projector.d.ts.map +1 -0
- package/dist/components/projector/Projector.js +44 -0
- package/dist/components/projector/index.d.ts +4 -0
- package/dist/components/projector/index.d.ts.map +1 -0
- package/dist/components/projector/index.js +2 -0
- package/dist/components/projector/projectorCore.d.ts +19 -0
- package/dist/components/projector/projectorCore.d.ts.map +1 -0
- package/dist/components/projector/projectorCore.js +545 -0
- package/dist/components/sports/SportsBall.d.ts +9 -0
- package/dist/components/sports/SportsBall.d.ts.map +1 -0
- package/dist/components/sports/SportsBall.js +23 -0
- package/dist/components/sports/SportsCourt.d.ts +9 -0
- package/dist/components/sports/SportsCourt.d.ts.map +1 -0
- package/dist/components/sports/SportsCourt.js +23 -0
- package/dist/components/sports/SportsEquipment.d.ts +9 -0
- package/dist/components/sports/SportsEquipment.d.ts.map +1 -0
- package/dist/components/sports/SportsEquipment.js +23 -0
- package/dist/components/sports/SportsGoal.d.ts +9 -0
- package/dist/components/sports/SportsGoal.d.ts.map +1 -0
- package/dist/components/sports/SportsGoal.js +23 -0
- package/dist/components/sports/core/ball.d.ts +166 -0
- package/dist/components/sports/core/ball.d.ts.map +1 -0
- package/dist/components/sports/core/ball.js +402 -0
- package/dist/components/sports/core/court.d.ts +442 -0
- package/dist/components/sports/core/court.d.ts.map +1 -0
- package/dist/components/sports/core/court.js +658 -0
- package/dist/components/sports/core/equipment.d.ts +103 -0
- package/dist/components/sports/core/equipment.d.ts.map +1 -0
- package/dist/components/sports/core/equipment.js +403 -0
- package/dist/components/sports/core/goal.d.ts +98 -0
- package/dist/components/sports/core/goal.d.ts.map +1 -0
- package/dist/components/sports/core/goal.js +44 -0
- package/dist/components/sports/index.d.ts +11 -0
- package/dist/components/sports/index.d.ts.map +1 -0
- package/dist/components/sports/index.js +8 -0
- package/dist/components/sports/sportsCore.d.ts +195 -0
- package/dist/components/sports/sportsCore.d.ts.map +1 -0
- package/dist/components/sports/sportsCore.js +758 -0
- package/dist/components/sports/useSportsInstance.d.ts +35 -0
- package/dist/components/sports/useSportsInstance.d.ts.map +1 -0
- package/dist/components/sports/useSportsInstance.js +47 -0
- package/dist/components/terrain/TerrainSurface.d.ts.map +1 -1
- package/dist/components/terrain/TerrainSurface.js +14 -0
- package/dist/components/urban/UrbanBlock.d.ts +9 -0
- package/dist/components/urban/UrbanBlock.d.ts.map +1 -0
- package/dist/components/urban/UrbanBlock.js +23 -0
- package/dist/components/urban/UrbanBuilding.d.ts +9 -0
- package/dist/components/urban/UrbanBuilding.d.ts.map +1 -0
- package/dist/components/urban/UrbanBuilding.js +23 -0
- package/dist/components/urban/UrbanJunction.d.ts +9 -0
- package/dist/components/urban/UrbanJunction.d.ts.map +1 -0
- package/dist/components/urban/UrbanJunction.js +23 -0
- package/dist/components/urban/UrbanPark.d.ts +9 -0
- package/dist/components/urban/UrbanPark.d.ts.map +1 -0
- package/dist/components/urban/UrbanPark.js +23 -0
- package/dist/components/urban/UrbanParkingLot.d.ts +9 -0
- package/dist/components/urban/UrbanParkingLot.d.ts.map +1 -0
- package/dist/components/urban/UrbanParkingLot.js +23 -0
- package/dist/components/urban/UrbanPlaza.d.ts +9 -0
- package/dist/components/urban/UrbanPlaza.d.ts.map +1 -0
- package/dist/components/urban/UrbanPlaza.js +23 -0
- package/dist/components/urban/UrbanRoad.d.ts +9 -0
- package/dist/components/urban/UrbanRoad.d.ts.map +1 -0
- package/dist/components/urban/UrbanRoad.js +23 -0
- package/dist/components/urban/UrbanSignage.d.ts +9 -0
- package/dist/components/urban/UrbanSignage.d.ts.map +1 -0
- package/dist/components/urban/UrbanSignage.js +23 -0
- package/dist/components/urban/UrbanSkyline.d.ts +9 -0
- package/dist/components/urban/UrbanSkyline.d.ts.map +1 -0
- package/dist/components/urban/UrbanSkyline.js +23 -0
- package/dist/components/urban/UrbanStreetFurniture.d.ts +9 -0
- package/dist/components/urban/UrbanStreetFurniture.d.ts.map +1 -0
- package/dist/components/urban/UrbanStreetFurniture.js +23 -0
- package/dist/components/urban/UrbanStreetGrid.d.ts +9 -0
- package/dist/components/urban/UrbanStreetGrid.d.ts.map +1 -0
- package/dist/components/urban/UrbanStreetGrid.js +34 -0
- package/dist/components/urban/UrbanTraffic.d.ts +9 -0
- package/dist/components/urban/UrbanTraffic.d.ts.map +1 -0
- package/dist/components/urban/UrbanTraffic.js +23 -0
- package/dist/components/urban/core/block.d.ts +119 -0
- package/dist/components/urban/core/block.d.ts.map +1 -0
- package/dist/components/urban/core/block.js +266 -0
- package/dist/components/urban/core/building.d.ts +128 -0
- package/dist/components/urban/core/building.d.ts.map +1 -0
- package/dist/components/urban/core/building.js +741 -0
- package/dist/components/urban/core/junction.d.ts +152 -0
- package/dist/components/urban/core/junction.d.ts.map +1 -0
- package/dist/components/urban/core/junction.js +617 -0
- package/dist/components/urban/core/park.d.ts +67 -0
- package/dist/components/urban/core/park.d.ts.map +1 -0
- package/dist/components/urban/core/park.js +176 -0
- package/dist/components/urban/core/parkingLot.d.ts +82 -0
- package/dist/components/urban/core/parkingLot.d.ts.map +1 -0
- package/dist/components/urban/core/parkingLot.js +284 -0
- package/dist/components/urban/core/plaza.d.ts +24 -0
- package/dist/components/urban/core/plaza.d.ts.map +1 -0
- package/dist/components/urban/core/plaza.js +243 -0
- package/dist/components/urban/core/road.d.ts +113 -0
- package/dist/components/urban/core/road.d.ts.map +1 -0
- package/dist/components/urban/core/road.js +347 -0
- package/dist/components/urban/core/signage.d.ts +83 -0
- package/dist/components/urban/core/signage.d.ts.map +1 -0
- package/dist/components/urban/core/signage.js +209 -0
- package/dist/components/urban/core/skyline.d.ts +100 -0
- package/dist/components/urban/core/skyline.d.ts.map +1 -0
- package/dist/components/urban/core/skyline.js +89 -0
- package/dist/components/urban/core/streetFurniture.d.ts +75 -0
- package/dist/components/urban/core/streetFurniture.d.ts.map +1 -0
- package/dist/components/urban/core/streetFurniture.js +193 -0
- package/dist/components/urban/core/streetGrid.d.ts +134 -0
- package/dist/components/urban/core/streetGrid.d.ts.map +1 -0
- package/dist/components/urban/core/streetGrid.js +422 -0
- package/dist/components/urban/core/traffic.d.ts +125 -0
- package/dist/components/urban/core/traffic.d.ts.map +1 -0
- package/dist/components/urban/core/traffic.js +305 -0
- package/dist/components/urban/index.d.ts +29 -0
- package/dist/components/urban/index.d.ts.map +1 -0
- package/dist/components/urban/index.js +16 -0
- package/dist/components/urban/textureSetResolver.d.ts +8 -0
- package/dist/components/urban/textureSetResolver.d.ts.map +1 -0
- package/dist/components/urban/textureSetResolver.js +16 -0
- package/dist/components/urban/urbanCore.d.ts +262 -0
- package/dist/components/urban/urbanCore.d.ts.map +1 -0
- package/dist/components/urban/urbanCore.js +928 -0
- package/dist/components/urban/useUrbanInstance.d.ts +53 -0
- package/dist/components/urban/useUrbanInstance.d.ts.map +1 -0
- package/dist/components/urban/useUrbanInstance.js +100 -0
- package/dist/components/vegetation/VegetationBush.d.ts +9 -0
- package/dist/components/vegetation/VegetationBush.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationBush.js +23 -0
- package/dist/components/vegetation/VegetationCrops.d.ts +9 -0
- package/dist/components/vegetation/VegetationCrops.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationCrops.js +23 -0
- package/dist/components/vegetation/VegetationFlowers.d.ts +9 -0
- package/dist/components/vegetation/VegetationFlowers.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationFlowers.js +23 -0
- package/dist/components/vegetation/VegetationForest.d.ts +9 -0
- package/dist/components/vegetation/VegetationForest.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationForest.js +23 -0
- package/dist/components/vegetation/VegetationFruit.d.ts +9 -0
- package/dist/components/vegetation/VegetationFruit.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationFruit.js +23 -0
- package/dist/components/vegetation/VegetationGrass.d.ts +9 -0
- package/dist/components/vegetation/VegetationGrass.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationGrass.js +23 -0
- package/dist/components/vegetation/VegetationHedge.d.ts +9 -0
- package/dist/components/vegetation/VegetationHedge.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationHedge.js +23 -0
- package/dist/components/vegetation/VegetationIvy.d.ts +9 -0
- package/dist/components/vegetation/VegetationIvy.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationIvy.js +23 -0
- package/dist/components/vegetation/VegetationTree.d.ts +9 -0
- package/dist/components/vegetation/VegetationTree.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationTree.js +23 -0
- package/dist/components/vegetation/VegetationVegetable.d.ts +9 -0
- package/dist/components/vegetation/VegetationVegetable.d.ts.map +1 -0
- package/dist/components/vegetation/VegetationVegetable.js +23 -0
- package/dist/components/vegetation/core/bush.d.ts +1256 -0
- package/dist/components/vegetation/core/bush.d.ts.map +1 -0
- package/dist/components/vegetation/core/bush.js +376 -0
- package/dist/components/vegetation/core/crops.d.ts +1033 -0
- package/dist/components/vegetation/core/crops.d.ts.map +1 -0
- package/dist/components/vegetation/core/crops.js +378 -0
- package/dist/components/vegetation/core/flowers.d.ts +648 -0
- package/dist/components/vegetation/core/flowers.d.ts.map +1 -0
- package/dist/components/vegetation/core/flowers.js +225 -0
- package/dist/components/vegetation/core/forest.d.ts +138 -0
- package/dist/components/vegetation/core/forest.d.ts.map +1 -0
- package/dist/components/vegetation/core/forest.js +310 -0
- package/dist/components/vegetation/core/fruit.d.ts +99 -0
- package/dist/components/vegetation/core/fruit.d.ts.map +1 -0
- package/dist/components/vegetation/core/fruit.js +77 -0
- package/dist/components/vegetation/core/grass.d.ts +103 -0
- package/dist/components/vegetation/core/grass.d.ts.map +1 -0
- package/dist/components/vegetation/core/grass.js +102 -0
- package/dist/components/vegetation/core/hedge.d.ts +193 -0
- package/dist/components/vegetation/core/hedge.d.ts.map +1 -0
- package/dist/components/vegetation/core/hedge.js +243 -0
- package/dist/components/vegetation/core/ivy.d.ts +213 -0
- package/dist/components/vegetation/core/ivy.d.ts.map +1 -0
- package/dist/components/vegetation/core/ivy.js +173 -0
- package/dist/components/vegetation/core/tree.d.ts +1117 -0
- package/dist/components/vegetation/core/tree.d.ts.map +1 -0
- package/dist/components/vegetation/core/tree.js +408 -0
- package/dist/components/vegetation/core/vegetable.d.ts +99 -0
- package/dist/components/vegetation/core/vegetable.d.ts.map +1 -0
- package/dist/components/vegetation/core/vegetable.js +76 -0
- package/dist/components/vegetation/index.d.ts +23 -0
- package/dist/components/vegetation/index.d.ts.map +1 -0
- package/dist/components/vegetation/index.js +14 -0
- package/dist/components/vegetation/produceCore.d.ts +929 -0
- package/dist/components/vegetation/produceCore.d.ts.map +1 -0
- package/dist/components/vegetation/produceCore.js +723 -0
- package/dist/components/vegetation/useVegetationInstance.d.ts +39 -0
- package/dist/components/vegetation/useVegetationInstance.d.ts.map +1 -0
- package/dist/components/vegetation/useVegetationInstance.js +45 -0
- package/dist/components/vegetation/vegetationCore.d.ts +412 -0
- package/dist/components/vegetation/vegetationCore.d.ts.map +1 -0
- package/dist/components/vegetation/vegetationCore.js +1728 -0
- package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts +5 -0
- package/dist/components/volumetricClouds/VolumetricCloudsPass.d.ts.map +1 -1
- package/dist/components/volumetricClouds/VolumetricCloudsPass.js +39 -13
- package/dist/components/water/OceanSurface.d.ts.map +1 -1
- package/dist/components/water/OceanSurface.js +3 -2
- package/dist/components/water/WaterBody.d.ts.map +1 -1
- package/dist/components/water/WaterBody.js +31 -10
- package/dist/components/water/WaterFountain.d.ts +9 -0
- package/dist/components/water/WaterFountain.d.ts.map +1 -0
- package/dist/components/water/WaterFountain.js +24 -0
- package/dist/components/water/WaterStream.d.ts +9 -0
- package/dist/components/water/WaterStream.d.ts.map +1 -0
- package/dist/components/water/WaterStream.js +24 -0
- package/dist/components/water/WaterWaterfall.d.ts +9 -0
- package/dist/components/water/WaterWaterfall.d.ts.map +1 -0
- package/dist/components/water/WaterWaterfall.js +24 -0
- package/dist/components/water/core/fountain.d.ts +70 -0
- package/dist/components/water/core/fountain.d.ts.map +1 -0
- package/dist/components/water/core/fountain.js +619 -0
- package/dist/components/water/core/stream.d.ts +72 -0
- package/dist/components/water/core/stream.d.ts.map +1 -0
- package/dist/components/water/core/stream.js +167 -0
- package/dist/components/water/core/waterfall.d.ts +78 -0
- package/dist/components/water/core/waterfall.d.ts.map +1 -0
- package/dist/components/water/core/waterfall.js +325 -0
- package/dist/components/water/index.d.ts +8 -0
- package/dist/components/water/index.d.ts.map +1 -1
- package/dist/components/water/index.js +7 -0
- package/dist/components/water/types.d.ts +3 -0
- package/dist/components/water/types.d.ts.map +1 -1
- package/dist/components/water/useWaterInstance.d.ts +43 -0
- package/dist/components/water/useWaterInstance.d.ts.map +1 -0
- package/dist/components/water/useWaterInstance.js +89 -0
- package/dist/components/water/waterCore.d.ts +179 -0
- package/dist/components/water/waterCore.d.ts.map +1 -0
- package/dist/components/water/waterCore.js +516 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +9 -1
- package/dist/hooks/index.d.ts +7 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +5 -2
- package/dist/hooks/useActionPatch.d.ts +23 -0
- package/dist/hooks/useActionPatch.d.ts.map +1 -0
- package/dist/hooks/useActionPatch.js +38 -0
- package/dist/hooks/useCloudSun.d.ts.map +1 -1
- package/dist/hooks/useCloudSun.js +3 -2
- package/dist/hooks/useCommittedInstance.d.ts +6 -0
- package/dist/hooks/useCommittedInstance.d.ts.map +1 -0
- package/dist/hooks/useCommittedInstance.js +42 -0
- package/dist/hooks/useConfigLive.d.ts +1 -1
- package/dist/hooks/useConfigLive.d.ts.map +1 -1
- package/dist/hooks/useContinuousEffects.d.ts.map +1 -1
- package/dist/hooks/useContinuousEffects.js +36 -20
- package/dist/hooks/useGridLayout.d.ts +7 -0
- package/dist/hooks/useGridLayout.d.ts.map +1 -0
- package/dist/hooks/useGridLayout.js +10 -0
- package/dist/hooks/useInteractionEffects.d.ts.map +1 -1
- package/dist/hooks/useInteractionEffects.js +48 -9
- package/dist/hooks/useLightLive.d.ts.map +1 -1
- package/dist/hooks/useLightLive.js +2 -0
- package/dist/hooks/useLinkStatus.d.ts +7 -0
- package/dist/hooks/useLinkStatus.d.ts.map +1 -0
- package/dist/hooks/useLinkStatus.js +20 -0
- package/dist/hooks/useMaterialApplication.d.ts +6 -1
- package/dist/hooks/useMaterialApplication.d.ts.map +1 -1
- package/dist/hooks/useMaterialApplication.js +7 -2
- package/dist/hooks/useOceanMaterial.d.ts +11 -1
- package/dist/hooks/useOceanMaterial.d.ts.map +1 -1
- package/dist/hooks/useOceanMaterial.js +185 -27
- package/dist/hooks/usePathAnimation.d.ts +8 -0
- package/dist/hooks/usePathAnimation.d.ts.map +1 -1
- package/dist/hooks/usePathAnimation.js +140 -59
- package/dist/hooks/useResolvedLayout.d.ts +10 -0
- package/dist/hooks/useResolvedLayout.d.ts.map +1 -0
- package/dist/hooks/useResolvedLayout.js +17 -0
- package/dist/hooks/useTimeLighting.d.ts +36 -0
- package/dist/hooks/useTimeLighting.d.ts.map +1 -0
- package/dist/hooks/useTimeLighting.js +67 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/operations/catalogue/shaderLayers.d.ts.map +1 -1
- package/dist/operations/catalogue/shaderLayers.js +26 -3
- package/dist/render/renderLive.d.ts +11 -0
- package/dist/render/renderLive.d.ts.map +1 -0
- package/dist/render/renderLive.js +57 -0
- package/dist/shaders/glsl/oceanCore.glsl.d.ts +2 -2
- package/dist/shaders/glsl/oceanCore.glsl.d.ts.map +1 -1
- package/dist/shaders/glsl/oceanCore.glsl.js +35 -5
- package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts +12 -0
- package/dist/shaders/ocean/OceanSurfaceMaterial.d.ts.map +1 -1
- package/dist/shaders/ocean/OceanSurfaceMaterial.js +55 -7
- package/dist/shaders/terrain/TerrainMaterial.d.ts.map +1 -1
- package/dist/shaders/terrain/TerrainMaterial.js +28 -0
- package/dist/triggers/kinds/change.js +1 -1
- package/dist/utils/composerHostedPass.d.ts +74 -0
- package/dist/utils/composerHostedPass.d.ts.map +1 -0
- package/dist/utils/composerHostedPass.js +63 -0
- package/dist/utils/geometryScript.d.ts +17 -0
- package/dist/utils/geometryScript.d.ts.map +1 -0
- package/dist/utils/geometryScript.js +92 -0
- package/dist/utils/geometryScript.worker.d.ts +2 -0
- package/dist/utils/geometryScript.worker.d.ts.map +1 -0
- package/dist/utils/geometryScript.worker.js +42 -0
- package/dist/utils/groundRegistry.d.ts +11 -0
- package/dist/utils/groundRegistry.d.ts.map +1 -0
- package/dist/utils/groundRegistry.js +39 -0
- package/dist/utils/instancingSupport.d.ts +9 -0
- package/dist/utils/instancingSupport.d.ts.map +1 -0
- package/dist/utils/instancingSupport.js +13 -0
- package/dist/utils/landPatch.d.ts +26 -5
- package/dist/utils/landPatch.d.ts.map +1 -1
- package/dist/utils/landPatch.js +124 -9
- package/dist/utils/layoutPlacement.d.ts +30 -0
- package/dist/utils/layoutPlacement.d.ts.map +1 -0
- package/dist/utils/layoutPlacement.js +113 -0
- package/dist/utils/linkRegistry.d.ts +15 -0
- package/dist/utils/linkRegistry.d.ts.map +1 -0
- package/dist/utils/linkRegistry.js +11 -0
- package/dist/utils/shapes.d.ts +28 -2
- package/dist/utils/shapes.d.ts.map +1 -1
- package/dist/utils/shapes.js +32 -3
- package/dist/utils/sharedParts.d.ts +61 -0
- package/dist/utils/sharedParts.d.ts.map +1 -0
- package/dist/utils/sharedParts.js +268 -0
- package/dist/utils/svgAsset.d.ts +6 -0
- package/dist/utils/svgAsset.d.ts.map +1 -0
- package/dist/utils/svgAsset.js +46 -0
- package/dist/utils/waterLight.d.ts +29 -0
- package/dist/utils/waterLight.d.ts.map +1 -0
- package/dist/utils/waterLight.js +67 -0
- package/dist/utils/waterReflection.d.ts +185 -0
- package/dist/utils/waterReflection.d.ts.map +1 -0
- package/dist/utils/waterReflection.js +616 -0
- package/package.json +4 -3
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type RefObject } from 'react';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
import type { AnimationOptions, MouseMoveDomain } from '@3driseai/3drise-core';
|
|
4
|
+
import { type CloudSunState } from '../../hooks/useCloudSun';
|
|
5
|
+
import type { ObjectReadyProps } from '../../types/objectReady';
|
|
6
|
+
import { type SunModel } from './waterCore';
|
|
7
|
+
export interface WaterInstance {
|
|
8
|
+
object: THREE.Object3D;
|
|
9
|
+
apply(cfg: Record<string, unknown>): void;
|
|
10
|
+
update(dt: number, camera: THREE.Camera): void;
|
|
11
|
+
dispose(): void;
|
|
12
|
+
}
|
|
13
|
+
export interface WaterVariantProps extends ObjectReadyProps {
|
|
14
|
+
config: {
|
|
15
|
+
type: string;
|
|
16
|
+
};
|
|
17
|
+
/** Scene object id: the live-edit handle is found by it. */
|
|
18
|
+
id?: string;
|
|
19
|
+
/** Keyframes on the config knobs (animations.water.animations). */
|
|
20
|
+
keyframes?: AnimationOptions[];
|
|
21
|
+
/** Pointer bindings on the config knobs (mouseMove.water). */
|
|
22
|
+
mouseMove?: MouseMoveDomain;
|
|
23
|
+
}
|
|
24
|
+
export interface WaterCore {
|
|
25
|
+
DEFAULTS: Record<string, unknown>;
|
|
26
|
+
STRUCTURAL: readonly string[];
|
|
27
|
+
ANIMATABLE: ReadonlySet<string>;
|
|
28
|
+
createUniforms(): Record<string, any>;
|
|
29
|
+
applyConfig(u: Record<string, any>, cfg: Record<string, unknown>): void;
|
|
30
|
+
build(u: Record<string, any>, cfg: Record<string, unknown>): WaterInstance;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The scene sun → the lab's sun model, in place. The zenith and the 20° band are the sky
|
|
34
|
+
* actually drawn (skyRadianceAt, what SkyMesh and the terrain use), scaled by the dome's own
|
|
35
|
+
* brightness curve (skyBrightnessForSunElevation) so the water goes dark at night instead of
|
|
36
|
+
* reflecting a daytime sky.
|
|
37
|
+
*/
|
|
38
|
+
export declare function sceneSunToWater(sun: CloudSunState, out: SunModel): void;
|
|
39
|
+
export declare function useWaterInstance(core: WaterCore, props: WaterVariantProps): {
|
|
40
|
+
rootRef: RefObject<THREE.Group | null>;
|
|
41
|
+
instance: WaterInstance;
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=useWaterInstance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useWaterInstance.d.ts","sourceRoot":"","sources":["../../../src/components/water/useWaterInstance.ts"],"names":[],"mappings":"AAkBA,OAAO,EAA4D,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjG,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK/E,OAAO,EAAe,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,WAAW,aAAa;IAC1B,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC;IACvB,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IAC/C,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,4DAA4D;IAC5D,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mEAAmE;IACnE,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC/B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,cAAc,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACtC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACxE,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,aAAa,CAAC;CAC9E;AAYD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,CAoBvE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,GAAG;IAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAA;CAAE,CA6B/I"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// =============================================================================
|
|
2
|
+
// useWaterInstance — the React side every moving-water component shares
|
|
3
|
+
// =============================================================================
|
|
4
|
+
//
|
|
5
|
+
// A variant's core (water/core/<key>.ts, emitted from the lab module) is plain three.js:
|
|
6
|
+
// createUniforms(), applyConfig(u, cfg), build(u, cfg) -> { object, apply, update(dt, camera),
|
|
7
|
+
// dispose }. This hook wires it into the config pattern:
|
|
8
|
+
//
|
|
9
|
+
// - base config over the type's defaults (withConfigDefaults);
|
|
10
|
+
// - built once; a change of a STRUCTURAL knob rebuilds (dispose + build, the uniforms outlive
|
|
11
|
+
// it); every other committed change and every per-frame override goes through
|
|
12
|
+
// instance.apply (the one door: live drag, keyframes, pointer bindings, timeline clips —
|
|
13
|
+
// useConfigDriver);
|
|
14
|
+
// - the scene sun and sky, read-only, into the core's sun uniforms every frame (useCloudSun →
|
|
15
|
+
// the lab's sun model: direction, sun colour, sky / ground ambient, zenith and horizon
|
|
16
|
+
// radiance, night), so the water follows the Environment clock like the water bodies do;
|
|
17
|
+
// - readiness (useObjectReady) and disposal.
|
|
18
|
+
//
|
|
19
|
+
import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
|
|
20
|
+
import * as THREE from 'three';
|
|
21
|
+
import { useFrame } from '@react-three/fiber';
|
|
22
|
+
import { skyBrightnessForSunElevation } from '@3driseai/3drise-core';
|
|
23
|
+
import { withConfigDefaults } from '../../utils/configAnimations.js';
|
|
24
|
+
import { useObjectReady } from '../../hooks/useObjectReady.js';
|
|
25
|
+
import { useConfigDriver } from '../../hooks/useConfigDriver.js';
|
|
26
|
+
import { useCloudSun } from '../../hooks/useCloudSun.js';
|
|
27
|
+
import { skyRadianceAt } from '../../utils/terrainUniforms.js';
|
|
28
|
+
import { applySun } from './waterCore.js';
|
|
29
|
+
/** Sun elevation (deg) over which direct sunlight fades out — the window SunLight and the water bodies use. */
|
|
30
|
+
const SUN_FADE_START = -1, SUN_FADE_END = 4;
|
|
31
|
+
const smooth01 = (e0, e1, x) => { const t = Math.max(0, Math.min(1, (x - e0) / (e1 - e0))); return t * t * (3 - 2 * t); };
|
|
32
|
+
/** The lab's sun colour magnitude at noon; the scene's transmission colour (≤ 1) is scaled to it. */
|
|
33
|
+
const SUN_STRENGTH = 1.6;
|
|
34
|
+
const _up = new THREE.Vector3(0, 1, 0);
|
|
35
|
+
const _rd = new THREE.Vector3();
|
|
36
|
+
const _c = new THREE.Color();
|
|
37
|
+
/**
|
|
38
|
+
* The scene sun → the lab's sun model, in place. The zenith and the 20° band are the sky
|
|
39
|
+
* actually drawn (skyRadianceAt, what SkyMesh and the terrain use), scaled by the dome's own
|
|
40
|
+
* brightness curve (skyBrightnessForSunElevation) so the water goes dark at night instead of
|
|
41
|
+
* reflecting a daytime sky.
|
|
42
|
+
*/
|
|
43
|
+
export function sceneSunToWater(sun, out) {
|
|
44
|
+
const el = THREE.MathUtils.radToDeg(Math.asin(THREE.MathUtils.clamp(sun.direction.y, -1, 1)));
|
|
45
|
+
const bright = skyBrightnessForSunElevation(el);
|
|
46
|
+
const sunUp = smooth01(SUN_FADE_START, SUN_FADE_END, el);
|
|
47
|
+
out.direction.copy(sun.direction);
|
|
48
|
+
out.color.copy(sun.color).multiplyScalar(SUN_STRENGTH * sunUp);
|
|
49
|
+
skyRadianceAt(_up, sun, out.skyTop).multiplyScalar(bright);
|
|
50
|
+
// four samples around the compass at 20°, averaged (the aureole at a quarter weight)
|
|
51
|
+
const hx = sun.direction.x, hz = sun.direction.z, hl = Math.hypot(hx, hz) || 1;
|
|
52
|
+
const ux = hx / hl, uz = hz / hl, c = 0.94, y = 0.342;
|
|
53
|
+
out.skyHorizon.setRGB(0, 0, 0);
|
|
54
|
+
for (const [dx, dz] of [[ux, uz], [-ux, -uz], [-uz, ux], [uz, -ux]]) {
|
|
55
|
+
skyRadianceAt(_rd.set(dx * c, y, dz * c), sun, _c);
|
|
56
|
+
out.skyHorizon.add(_c);
|
|
57
|
+
}
|
|
58
|
+
out.skyHorizon.multiplyScalar(0.25 * bright);
|
|
59
|
+
out.skyAmbient.copy(out.skyTop).multiplyScalar(0.45).add(_c.copy(out.skyHorizon).multiplyScalar(0.55));
|
|
60
|
+
const lit = Math.max(sun.direction.y, 0);
|
|
61
|
+
out.groundAmbient.copy(out.skyAmbient).multiplyScalar(0.45).add(_c.copy(sun.color).multiplyScalar(lit * 0.35));
|
|
62
|
+
out.night = 1 - smooth01(-6, 4, el);
|
|
63
|
+
}
|
|
64
|
+
export function useWaterInstance(core, props) {
|
|
65
|
+
const { config, id, keyframes, mouseMove, onObjectReady, onObjectDispose } = props;
|
|
66
|
+
const rootRef = useRef(null);
|
|
67
|
+
useObjectReady(rootRef, config, onObjectReady, onObjectDispose);
|
|
68
|
+
const cfg = useMemo(() => withConfigDefaults(core.DEFAULTS, config), [config]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
69
|
+
// uniforms outlive rebuilds
|
|
70
|
+
const uniforms = useMemo(() => core.createUniforms(), []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
71
|
+
const structuralKey = JSON.stringify(core.STRUCTURAL.map((k) => cfg[k]));
|
|
72
|
+
const instance = useMemo(() => core.build(uniforms, cfg), [uniforms, structuralKey]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
73
|
+
useEffect(() => () => instance.dispose(), [instance]);
|
|
74
|
+
useLayoutEffect(() => { core.applyConfig(uniforms, cfg); instance.apply(cfg); }, [instance, uniforms, cfg]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
75
|
+
const push = useCallback((merged) => { core.applyConfig(uniforms, merged); instance.apply(merged); }, [instance, uniforms]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
76
|
+
useConfigDriver({ rootRef, id, family: 'water', base: cfg, structural: core.STRUCTURAL, allowed: core.ANIMATABLE, keyframes, mouseMove, push });
|
|
77
|
+
// the scene sun, read-only (follows the Environment clock and the rendered sky)
|
|
78
|
+
const { update: updateSun } = useCloudSun();
|
|
79
|
+
const sunModel = useMemo(() => ({
|
|
80
|
+
direction: new THREE.Vector3(), color: new THREE.Color(), skyAmbient: new THREE.Color(), groundAmbient: new THREE.Color(),
|
|
81
|
+
skyTop: new THREE.Color(), skyHorizon: new THREE.Color(), night: 0,
|
|
82
|
+
}), []);
|
|
83
|
+
useFrame((state, delta) => {
|
|
84
|
+
sceneSunToWater(updateSun(), sunModel);
|
|
85
|
+
applySun(uniforms, sunModel);
|
|
86
|
+
instance.update(Math.min(delta, 0.1), state.camera);
|
|
87
|
+
});
|
|
88
|
+
return { rootRef, instance };
|
|
89
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
export declare const MAX_RINGS = 24;
|
|
3
|
+
export declare const MAX_CHURN = 24;
|
|
4
|
+
export declare function mulberry32(a: any): () => number;
|
|
5
|
+
export declare const clamp01: (x: any) => number;
|
|
6
|
+
export declare function createSunUniforms(): {
|
|
7
|
+
uSunDir: {
|
|
8
|
+
value: THREE.Vector3;
|
|
9
|
+
};
|
|
10
|
+
uSunColor: {
|
|
11
|
+
value: THREE.Color;
|
|
12
|
+
};
|
|
13
|
+
uSkyAmbient: {
|
|
14
|
+
value: THREE.Color;
|
|
15
|
+
};
|
|
16
|
+
uGroundAmbient: {
|
|
17
|
+
value: THREE.Color;
|
|
18
|
+
};
|
|
19
|
+
uSkyTop: {
|
|
20
|
+
value: THREE.Color;
|
|
21
|
+
};
|
|
22
|
+
uSkyHorizon: {
|
|
23
|
+
value: THREE.Color;
|
|
24
|
+
};
|
|
25
|
+
uNight: {
|
|
26
|
+
value: number;
|
|
27
|
+
};
|
|
28
|
+
uTime: {
|
|
29
|
+
value: number;
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export declare function applySun(u: any, sun: any): void;
|
|
33
|
+
export declare const GLSL_COMMON = "\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n";
|
|
34
|
+
export declare function createDisturbanceUniforms(): {
|
|
35
|
+
uRings: {
|
|
36
|
+
value: THREE.Vector4[];
|
|
37
|
+
};
|
|
38
|
+
uRingSize: {
|
|
39
|
+
value: THREE.Vector3;
|
|
40
|
+
};
|
|
41
|
+
uChurn: {
|
|
42
|
+
value: THREE.Vector4[];
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
/** A small ring pool: spawn(x, z, amp) writes the oldest slot. */
|
|
46
|
+
export declare function ringSpawner(u: any): (x: any, z: any, amp: any, now: any) => void;
|
|
47
|
+
export declare const GLSL_DISTURB = "\nuniform vec4 uRings[24];\nuniform vec3 uRingSize;\nuniform vec4 uChurn[24];\n\n/** Height + gradient of every live ring at xz (world/local metres). Each ring is a\n * damped wave packet expanding at uRingSize.x m/s, dying over uRingSize.y s. */\nvec3 ringField(vec2 p) {\n vec3 acc = vec3(0.0);\n for (int i = 0; i < 24; i++) {\n vec4 r = uRings[i];\n float age = uTime - r.z;\n if (age < 0.0 || age > uRingSize.y) continue;\n vec2 d = p - r.xy; float dist = length(d);\n float front = age * uRingSize.x;\n float x = (dist - front) * uRingSize.z; // phase across the packet\n float env = exp(-x * x * 0.35) * (1.0 - age / uRingSize.y) * r.w / (1.0 + front * 1.5);\n float h = env * sin(x * 2.2);\n float dh = env * (2.2 * cos(x * 2.2) - 0.7 * x * sin(x * 2.2)) * uRingSize.z;\n acc += vec3(h, dh * d / max(dist, 1e-3));\n }\n return acc;\n}\n/** Churn zones: boiling noise inside a radius \u2014 foam amount and a wobbling normal. */\nvec2 churnField(vec2 p, float t) {\n float foam = 0.0; float bump = 0.0;\n for (int i = 0; i < 24; i++) {\n vec4 c = uChurn[i];\n if (c.w <= 0.0) continue;\n float d = length(p - c.xy) / max(c.z, 1e-3);\n float w = (1.0 - smoothstep(0.55, 1.0, d)) * c.w;\n if (w <= 0.0) continue;\n float n = fbm21(p * 2.4 + vec2(t * 0.9, -t * 1.3)) * 0.6 + fbm21(p * 5.0 - vec2(t * 2.1, t * 1.7)) * 0.4;\n foam += w * smoothstep(0.35, 0.75, n + 0.25 * (1.0 - d));\n bump += w * n;\n }\n return vec2(foam, bump);\n}\n";
|
|
48
|
+
export declare function createBasinUniforms(): {
|
|
49
|
+
uWaves: {
|
|
50
|
+
value: THREE.Vector4[];
|
|
51
|
+
};
|
|
52
|
+
uWaveSpeed: {
|
|
53
|
+
value: number[];
|
|
54
|
+
};
|
|
55
|
+
uDeepColor: {
|
|
56
|
+
value: THREE.Color;
|
|
57
|
+
};
|
|
58
|
+
uShallowColor: {
|
|
59
|
+
value: THREE.Color;
|
|
60
|
+
};
|
|
61
|
+
uFoamColor: {
|
|
62
|
+
value: THREE.Color;
|
|
63
|
+
};
|
|
64
|
+
uRough: {
|
|
65
|
+
value: number;
|
|
66
|
+
};
|
|
67
|
+
uSpecular: {
|
|
68
|
+
value: number;
|
|
69
|
+
};
|
|
70
|
+
uDetail: {
|
|
71
|
+
value: number;
|
|
72
|
+
};
|
|
73
|
+
uDetailSize: {
|
|
74
|
+
value: number;
|
|
75
|
+
};
|
|
76
|
+
uHalf: {
|
|
77
|
+
value: THREE.Vector2;
|
|
78
|
+
};
|
|
79
|
+
uEdgeFade: {
|
|
80
|
+
value: number;
|
|
81
|
+
};
|
|
82
|
+
uRound: {
|
|
83
|
+
value: number;
|
|
84
|
+
};
|
|
85
|
+
uFloor: {
|
|
86
|
+
value: number;
|
|
87
|
+
};
|
|
88
|
+
uFloorDepth: {
|
|
89
|
+
value: number;
|
|
90
|
+
};
|
|
91
|
+
uAbsorb: {
|
|
92
|
+
value: THREE.Vector3;
|
|
93
|
+
};
|
|
94
|
+
uFloorA: {
|
|
95
|
+
value: THREE.Color;
|
|
96
|
+
};
|
|
97
|
+
uFloorB: {
|
|
98
|
+
value: THREE.Color;
|
|
99
|
+
};
|
|
100
|
+
uFloorTile: {
|
|
101
|
+
value: number;
|
|
102
|
+
};
|
|
103
|
+
uCamPos: {
|
|
104
|
+
value: THREE.Vector3;
|
|
105
|
+
};
|
|
106
|
+
uRings: {
|
|
107
|
+
value: THREE.Vector4[];
|
|
108
|
+
};
|
|
109
|
+
uRingSize: {
|
|
110
|
+
value: THREE.Vector3;
|
|
111
|
+
};
|
|
112
|
+
uChurn: {
|
|
113
|
+
value: THREE.Vector4[];
|
|
114
|
+
};
|
|
115
|
+
uSunDir: {
|
|
116
|
+
value: THREE.Vector3;
|
|
117
|
+
};
|
|
118
|
+
uSunColor: {
|
|
119
|
+
value: THREE.Color;
|
|
120
|
+
};
|
|
121
|
+
uSkyAmbient: {
|
|
122
|
+
value: THREE.Color;
|
|
123
|
+
};
|
|
124
|
+
uGroundAmbient: {
|
|
125
|
+
value: THREE.Color;
|
|
126
|
+
};
|
|
127
|
+
uSkyTop: {
|
|
128
|
+
value: THREE.Color;
|
|
129
|
+
};
|
|
130
|
+
uSkyHorizon: {
|
|
131
|
+
value: THREE.Color;
|
|
132
|
+
};
|
|
133
|
+
uNight: {
|
|
134
|
+
value: number;
|
|
135
|
+
};
|
|
136
|
+
uTime: {
|
|
137
|
+
value: number;
|
|
138
|
+
};
|
|
139
|
+
};
|
|
140
|
+
/** Wind -> a small wave table (lab stand-in for the ocean's spectrum). */
|
|
141
|
+
export declare function applyBasinWind(u: any, windSpeed: any, bearingDeg: any, fetchM: any, spread?: number): void;
|
|
142
|
+
export declare const BASIN_VERT = "\n\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n\n\nuniform vec4 uRings[24];\nuniform vec3 uRingSize;\nuniform vec4 uChurn[24];\n\n/** Height + gradient of every live ring at xz (world/local metres). Each ring is a\n * damped wave packet expanding at uRingSize.x m/s, dying over uRingSize.y s. */\nvec3 ringField(vec2 p) {\n vec3 acc = vec3(0.0);\n for (int i = 0; i < 24; i++) {\n vec4 r = uRings[i];\n float age = uTime - r.z;\n if (age < 0.0 || age > uRingSize.y) continue;\n vec2 d = p - r.xy; float dist = length(d);\n float front = age * uRingSize.x;\n float x = (dist - front) * uRingSize.z; // phase across the packet\n float env = exp(-x * x * 0.35) * (1.0 - age / uRingSize.y) * r.w / (1.0 + front * 1.5);\n float h = env * sin(x * 2.2);\n float dh = env * (2.2 * cos(x * 2.2) - 0.7 * x * sin(x * 2.2)) * uRingSize.z;\n acc += vec3(h, dh * d / max(dist, 1e-3));\n }\n return acc;\n}\n/** Churn zones: boiling noise inside a radius \u2014 foam amount and a wobbling normal. */\nvec2 churnField(vec2 p, float t) {\n float foam = 0.0; float bump = 0.0;\n for (int i = 0; i < 24; i++) {\n vec4 c = uChurn[i];\n if (c.w <= 0.0) continue;\n float d = length(p - c.xy) / max(c.z, 1e-3);\n float w = (1.0 - smoothstep(0.55, 1.0, d)) * c.w;\n if (w <= 0.0) continue;\n float n = fbm21(p * 2.4 + vec2(t * 0.9, -t * 1.3)) * 0.6 + fbm21(p * 5.0 - vec2(t * 2.1, t * 1.7)) * 0.4;\n foam += w * smoothstep(0.35, 0.75, n + 0.25 * (1.0 - d));\n bump += w * n;\n }\n return vec2(foam, bump);\n}\n\nuniform vec4 uWaves[6];\nuniform float uWaveSpeed[6];\nuniform vec2 uHalf;\nuniform float uEdgeFade;\nuniform float uRound;\nvarying vec3 vP;\nvarying vec3 vN;\nvarying vec2 vLocal;\nvarying float vFoam;\nvarying float vEdge;\nvoid main() {\n vec2 p = position.xz;\n float ext = uRound > 0.5 ? length(p / uHalf) : max(abs(p.x) / uHalf.x, abs(p.y) / uHalf.y);\n float edge = 1.0 - smoothstep(1.0 - uEdgeFade, 1.0, ext);\n float h = 0.0; vec2 g = vec2(0.0);\n for (int i = 0; i < 6; i++) {\n vec4 w = uWaves[i];\n float ph = dot(w.xy, p) * w.w - uWaveSpeed[i] * uTime;\n h += w.z * sin(ph);\n g += w.z * w.w * cos(ph) * w.xy;\n }\n vec3 rf = ringField(p);\n vec2 ch = churnField(p, uTime);\n h += rf.x + ch.y * 0.04;\n g += rf.yz;\n h *= edge; g *= edge;\n vP = (modelMatrix * vec4(p.x, h, p.y, 1.0)).xyz;\n vN = normalize(mat3(modelMatrix) * normalize(vec3(-g.x, 1.0, -g.y)));\n vLocal = p; vFoam = ch.x; vEdge = edge;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(p.x, h, p.y, 1.0);\n}\n";
|
|
143
|
+
export declare const BASIN_FRAG = "\n\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n\n\nuniform vec4 uRings[24];\nuniform vec3 uRingSize;\nuniform vec4 uChurn[24];\n\n/** Height + gradient of every live ring at xz (world/local metres). Each ring is a\n * damped wave packet expanding at uRingSize.x m/s, dying over uRingSize.y s. */\nvec3 ringField(vec2 p) {\n vec3 acc = vec3(0.0);\n for (int i = 0; i < 24; i++) {\n vec4 r = uRings[i];\n float age = uTime - r.z;\n if (age < 0.0 || age > uRingSize.y) continue;\n vec2 d = p - r.xy; float dist = length(d);\n float front = age * uRingSize.x;\n float x = (dist - front) * uRingSize.z; // phase across the packet\n float env = exp(-x * x * 0.35) * (1.0 - age / uRingSize.y) * r.w / (1.0 + front * 1.5);\n float h = env * sin(x * 2.2);\n float dh = env * (2.2 * cos(x * 2.2) - 0.7 * x * sin(x * 2.2)) * uRingSize.z;\n acc += vec3(h, dh * d / max(dist, 1e-3));\n }\n return acc;\n}\n/** Churn zones: boiling noise inside a radius \u2014 foam amount and a wobbling normal. */\nvec2 churnField(vec2 p, float t) {\n float foam = 0.0; float bump = 0.0;\n for (int i = 0; i < 24; i++) {\n vec4 c = uChurn[i];\n if (c.w <= 0.0) continue;\n float d = length(p - c.xy) / max(c.z, 1e-3);\n float w = (1.0 - smoothstep(0.55, 1.0, d)) * c.w;\n if (w <= 0.0) continue;\n float n = fbm21(p * 2.4 + vec2(t * 0.9, -t * 1.3)) * 0.6 + fbm21(p * 5.0 - vec2(t * 2.1, t * 1.7)) * 0.4;\n foam += w * smoothstep(0.35, 0.75, n + 0.25 * (1.0 - d));\n bump += w * n;\n }\n return vec2(foam, bump);\n}\n\nuniform vec3 uDeepColor, uShallowColor, uFoamColor;\nuniform float uRough, uSpecular, uDetail, uDetailSize;\nuniform vec3 uCamPos;\nuniform float uFloor, uFloorDepth, uFloorTile;\nuniform vec3 uAbsorb, uFloorA, uFloorB;\n/** The basin floor seen through the surface: refracted lookup, tiles or pebbles, caustic light,\n * Beer-Lambert absorption over the depth so the floor is tinted by the water. */\nvec3 floorThrough(vec2 p, vec3 N, vec3 V, vec3 fallback) {\n // refraction: the view ray bends toward the normal; offset the floor lookup by the normal's tilt\n vec2 off = -N.xz * uFloorDepth * 1.6 - V.xz / max(V.y, 0.2) * uFloorDepth * 0.35;\n vec2 fp = p + off;\n vec3 fc;\n if (uFloorTile > 0.0) {\n vec2 g = fract(fp / uFloorTile); vec2 id = floor(fp / uFloorTile);\n float grout = smoothstep(0.0, 0.06, g.x) * smoothstep(1.0, 0.94, g.x) * smoothstep(0.0, 0.06, g.y) * smoothstep(1.0, 0.94, g.y);\n fc = mix(uFloorA, uFloorB, hash21(id) * 0.6 + vnoise21(fp * 3.0) * 0.4) * (0.55 + 0.45 * grout);\n } else {\n vec2 cl = cells21(fp * 2.5);\n fc = mix(uFloorA, uFloorB, cl.y) * (0.6 + 0.4 * smoothstep(0.45, 0.1, cl.x)) * (0.8 + 0.4 * vnoise21(fp * 9.0));\n }\n // caustics: bright web from the surface ripples\n float ca = pow(vnoise21(fp * 4.0 + uTime * 0.6) * vnoise21(fp * 4.0 - uTime * 0.5 + 3.0), 1.5) * 2.5;\n vec3 L = normalize(uSunDir);\n fc *= uSkyAmbient * 0.6 + uSunColor * (0.35 + 0.5 * ca) * max(L.y, 0.0);\n vec3 T = exp(-uAbsorb * uFloorDepth * 2.0);\n return mix(fallback, fc * T + uDeepColor * (1.0 - T) * 0.6, uFloor);\n}\nvarying vec3 vP; varying vec3 vN; varying vec2 vLocal; varying float vFoam; varying float vEdge;\nvoid main() {\n vec3 N = normalize(vN);\n // sub-mesh ripple detail, advected by a slow drift\n vec3 n1 = noised21(vLocal / uDetailSize + vec2(uTime * 0.35, uTime * 0.2), 0.05);\n vec3 n2 = noised21(vLocal / (uDetailSize * 0.45) - vec2(uTime * 0.5, -uTime * 0.3), 0.05);\n vec2 dn = (n1.yz + n2.yz * 0.5) * uDetail * 2.5;\n N = normalize(N + vec3(-dn.x, 0.0, -dn.y) * vEdge);\n // churn roughens the surface too\n vec2 ch = churnField(vLocal, uTime);\n float rough = uRough + ch.x * 0.3;\n vec3 body = mix(uDeepColor, uShallowColor, 0.15);\n vec3 V = normalize(uCamPos - vP);\n body = floorThrough(vLocal, N, V, body);\n vec3 col = shadeWater(vP, N, uCamPos, body, uFoamColor, ch.x, rough, uSpecular);\n gl_FragColor = vec4(col, 1.0);\n #include <colorspace_fragment>\n}\n";
|
|
144
|
+
export declare function createBasinMaterial(u: any): THREE.ShaderMaterial;
|
|
145
|
+
/** A basin mesh: w x d metres in XZ, segments per side. */
|
|
146
|
+
export declare function createBasin(u: any, w: any, d: any, segs?: number, round?: boolean): THREE.Mesh<THREE.PlaneGeometry | THREE.CircleGeometry, THREE.ShaderMaterial, THREE.Object3DEventMap>;
|
|
147
|
+
/** N camera-facing quads with per-instance aSeed (4 floats). The vertex shader decides
|
|
148
|
+
* everything else from the seed and time, so there is no per-frame upload. */
|
|
149
|
+
export declare function instancedQuads(n: any, seedFn: any): THREE.InstancedBufferGeometry;
|
|
150
|
+
/** Billboard helper for the vertex stage: world position of the quad centre + size (m) -> clip. */
|
|
151
|
+
export declare const GLSL_BILLBOARD = "\nvec4 billboard(vec3 worldCentre, vec2 corner, float size, float stretchY, vec3 stretchDir) {\n vec4 mv = viewMatrix * vec4(worldCentre, 1.0);\n vec3 dirV = normalize((viewMatrix * vec4(stretchDir, 0.0)).xyz);\n vec3 up = stretchY > 0.0 ? dirV : vec3(0.0, 1.0, 0.0);\n vec3 right = vec3(up.y, -up.x, 0.0);\n if (length(right) < 1e-4) right = vec3(1.0, 0.0, 0.0);\n right = normalize(right);\n mv.xyz += right * corner.x * size + up * corner.y * size * (1.0 + stretchY);\n return projectionMatrix * mv;\n}\n";
|
|
152
|
+
export declare function samplePath(points: any, curve?: number, closed?: boolean, step?: number): {
|
|
153
|
+
samples: any[];
|
|
154
|
+
length: number;
|
|
155
|
+
};
|
|
156
|
+
export declare function jfbm(x: any, y: any, z: any, oct?: number): number;
|
|
157
|
+
/** Displace a geometry along its normals by fbm (in the geometry's own space) and recompute smooth normals. */
|
|
158
|
+
export declare function displaceRock(geo: any, amount: any, scale?: number, seed?: number): any;
|
|
159
|
+
export declare const ROCK_VERT = "\n\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n\nvarying vec3 vP; varying vec3 vN;\nvoid main() {\n vP = (modelMatrix * vec4(position, 1.0)).xyz;\n vN = normalize(mat3(modelMatrix) * normal);\n gl_Position = projectionMatrix * viewMatrix * vec4(vP, 1.0);\n}\n";
|
|
160
|
+
export declare const ROCK_FRAG = "\n\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n\nuniform vec3 uRockA, uRockB, uMoss;\nuniform float uWet; // 0..1 darkens + glosses the rock near water\nuniform float uWetHeight; // world y under which the rock is wet\nvarying vec3 vP; varying vec3 vN;\nvoid main() {\n vec3 N = normalize(vN);\n // triplanar-ish detail: strata + grain\n float strata = smoothstep(0.3, 0.7, fbm31(vec3(vP.x * 0.5, vP.y * 2.5, vP.z * 0.5)));\n float grain = fbm31(vP * 5.0);\n float crack = 1.0 - smoothstep(0.0, 0.02, abs(fbm31(vP * 1.6) - 0.5));\n // bump: a small tilt from fine noise derivatives\n float e = 0.08;\n float b0 = fbm31(vP * 7.0), bx = fbm31(vP * 7.0 + vec3(e, 0.0, 0.0)), by = fbm31(vP * 7.0 + vec3(0.0, e, 0.0)), bz = fbm31(vP * 7.0 + vec3(0.0, 0.0, e));\n N = normalize(N - vec3(bx - b0, by - b0, bz - b0) * 1.6);\n vec3 col = mix(uRockA, uRockB, strata * 0.55 + grain * 0.45) * (1.0 - 0.18 * crack);\n float moss = smoothstep(0.2, 0.8, N.y) * smoothstep(0.45, 0.7, fbm31(vP * 1.3 + 5.0));\n col = mix(col, uMoss, moss * 0.8);\n float wet = uWet * smoothstep(uWetHeight + 1.5, uWetHeight - 0.5, vP.y);\n col *= 1.0 - 0.45 * wet;\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 amb = mix(uGroundAmbient, uSkyAmbient, N.y * 0.5 + 0.5);\n vec3 lit = col * (amb * 0.9 + uSunColor * NdotL * 0.9);\n vec3 V = normalize(cameraPosition - vP);\n lit += uSunColor * ggx(N, L, V, 0.35 - 0.2 * wet) * (0.02 + 0.3 * wet) * fresnelWater(N, V);\n gl_FragColor = vec4(lit, 1.0);\n #include <colorspace_fragment>\n}\n";
|
|
161
|
+
export declare function createRockMaterial(sunU: any, options?: any): THREE.ShaderMaterial;
|
|
162
|
+
/** box: { center: Vector3, size: Vector3 } in the object's local space. */
|
|
163
|
+
export declare const MIST_VERT = "\n\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n\nattribute float aSlice; // 0 (far) .. 1 (near)\nuniform vec3 uBoxCenter, uBoxSize;\nuniform float uSlices;\nvarying vec3 vWorld; varying float vSlice;\nvoid main() {\n vSlice = aSlice;\n vec3 c = (modelMatrix * vec4(uBoxCenter, 1.0)).xyz;\n vec3 viewDir = normalize(cameraPosition - c);\n float radius = length(uBoxSize) * 0.5;\n vec3 centre = c - viewDir * radius * (1.0 - 2.0 * aSlice) * 0.95;\n vec3 right = normalize(cross(vec3(0.0, 1.0, 0.0), viewDir));\n vec3 up = cross(viewDir, right);\n vec3 wp = centre + right * position.x * radius * 2.0 + up * position.y * radius * 2.0;\n vWorld = wp;\n gl_Position = projectionMatrix * viewMatrix * vec4(wp, 1.0);\n}\n";
|
|
164
|
+
export declare const MIST_FRAG = "\n\nuniform vec3 uSunDir;\nuniform vec3 uSunColor;\nuniform vec3 uSkyAmbient;\nuniform vec3 uGroundAmbient;\nuniform vec3 uSkyTop;\nuniform vec3 uSkyHorizon;\nuniform float uNight;\nuniform float uTime;\n\nfloat hash11(float p) { p = fract(p * 0.1031); p *= p + 33.33; p *= p + p; return fract(p); }\nfloat hash21(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * 0.1031); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.x + p3.y) * p3.z); }\nvec2 hash22(vec2 p) { vec3 p3 = fract(vec3(p.xyx) * vec3(0.1031, 0.1030, 0.0973)); p3 += dot(p3, p3.yzx + 33.33); return fract((p3.xx + p3.yz) * p3.zy); }\nfloat vnoise21(vec2 p) { vec2 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f); return mix(mix(hash21(i), hash21(i + vec2(1.0, 0.0)), f.x), mix(hash21(i + vec2(0.0, 1.0)), hash21(i + vec2(1.0, 1.0)), f.x), f.y); }\nfloat fbm21(vec2 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise21(p); p = p * 2.03 + 17.1; a *= 0.5; } return s; }\n// Gradient-ish noise with derivative, for normals: central differences on vnoise are fine at this scale.\nvec3 noised21(vec2 p, float e) { float c = vnoise21(p); return vec3(c, vnoise21(p + vec2(e, 0.0)) - c, vnoise21(p + vec2(0.0, e)) - c); }\nfloat hash31(vec3 p) { p = fract(p * 0.1031); p += dot(p, p.zyx + 31.32); return fract((p.x + p.y) * p.z); }\nfloat vnoise31(vec3 p) {\n vec3 i = floor(p), f = fract(p); f = f * f * (3.0 - 2.0 * f);\n float a = mix(mix(hash31(i), hash31(i + vec3(1,0,0)), f.x), mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y);\n float b = mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x), mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y);\n return mix(a, b, f.z);\n}\nfloat fbm31(vec3 p) { float a = 0.5, s = 0.0; for (int i = 0; i < 4; i++) { s += a * vnoise31(p); p = p * 2.07 + 11.3; a *= 0.5; } return s; }\n/** Worley-ish cell distance in 2D (pebbles). Returns (F1, cell id hash). */\nvec2 cells21(vec2 p) {\n vec2 i = floor(p), f = fract(p); float d = 8.0; float id = 0.0;\n for (int y = -1; y <= 1; y++) for (int x = -1; x <= 1; x++) {\n vec2 g = vec2(float(x), float(y)); vec2 o = hash22(i + g); vec2 r = g + o - f; float dd = dot(r, r);\n if (dd < d) { d = dd; id = hash21(i + g); }\n }\n return vec2(sqrt(d), id);\n}\n\n/** The lab sky by direction: a gradient between the horizon and zenith colours set by the hour. */\nvec3 skyColor(vec3 d) { float t = clamp(d.y, 0.0, 1.0); return mix(uSkyHorizon, uSkyTop, pow(t, 0.55)); }\n\nfloat fresnelWater(vec3 N, vec3 V) { return 0.02 + 0.98 * pow(1.0 - clamp(dot(N, V), 0.0, 1.0), 5.0); }\n\n/** GGX lobe for the sun glitter on a water normal. */\nfloat ggx(vec3 N, vec3 L, vec3 V, float rough) {\n vec3 H = normalize(L + V); float a = max(rough * rough, 2e-4); float ndh = max(dot(N, H), 0.0);\n float d = ndh * ndh * (a * a - 1.0) + 1.0; return (a * a) / (3.14159 * d * d);\n}\n\n/** Water shading shared by every surface in the lab: body colour under sky fill + sun,\n * reflected sky through Fresnel, a glitter path. foam (0..1) switches to a rough white. */\nvec3 shadeWater(vec3 P, vec3 N, vec3 camPos, vec3 body, vec3 foamColor, float foam, float rough, float specular) {\n vec3 V = normalize(camPos - P);\n vec3 L = normalize(uSunDir);\n float NdotL = max(dot(N, L), 0.0);\n vec3 sun = uSunColor;\n vec3 R = reflect(-V, N); R.y = max(R.y, 0.02);\n vec3 sky = skyColor(R);\n float f = fresnelWater(N, V);\n vec3 bodyLit = body * (uSkyAmbient * 0.5 + sun * (0.2 + 0.5 * NdotL));\n vec3 col = mix(bodyLit, sky, f) + sun * ggx(N, L, V, rough) * specular * f;\n vec3 foamLit = foamColor * (uSkyAmbient * 0.6 + sun * (0.3 + 0.7 * NdotL));\n return mix(col, foamLit, clamp(foam, 0.0, 1.0));\n}\n\nuniform vec3 uBoxCenter, uBoxSize;\nuniform float uSlices, uDensity, uRise;\nuniform vec3 uMistColor;\nuniform mat4 uInvModel;\nvarying vec3 vWorld; varying float vSlice;\nvoid main() {\n vec3 lp = (uInvModel * vec4(vWorld, 1.0)).xyz - uBoxCenter;\n vec3 q = lp / (uBoxSize * 0.5);\n float r2 = dot(q, q);\n if (r2 > 1.0) discard;\n // density: dense at the foot, thinning upward and outward; drifting + rising noise\n vec3 np = lp * 0.9 + vec3(uTime * 0.25, -uTime * uRise, uTime * 0.1);\n float n = fbm31(np) * 0.7 + fbm31(np * 2.3 + 9.0) * 0.3;\n float shape = (1.0 - r2) * (1.0 - smoothstep(-0.2, 1.0, q.y) * 0.85);\n float d = max(n - 0.42, 0.0) * 2.2 * shape * uDensity;\n float thickness = length(uBoxSize) / uSlices;\n float a = 1.0 - exp(-d * thickness);\n if (a < 0.003) discard;\n // lit by the sky with a little forward-scattered sun\n vec3 V = normalize(cameraPosition - vWorld);\n float fwd = pow(max(dot(-V, normalize(uSunDir)), 0.0), 3.0);\n vec3 lit = uMistColor * (uSkyAmbient * 0.75 + uSunColor * (0.18 + 0.35 * fwd));\n gl_FragColor = vec4(lit * a, a);\n #include <colorspace_fragment>\n}\n";
|
|
165
|
+
export declare function createMistVolume(sunU: any, center: any, size: any, slices?: number, density?: number, color?: string): {
|
|
166
|
+
mesh: THREE.Mesh<THREE.InstancedBufferGeometry, THREE.ShaderMaterial, THREE.Object3DEventMap>;
|
|
167
|
+
u: any;
|
|
168
|
+
};
|
|
169
|
+
/** The sun model the water cores read (applySun): filled from the scene by useWaterInstance. */
|
|
170
|
+
export type SunModel = {
|
|
171
|
+
direction: THREE.Vector3;
|
|
172
|
+
color: THREE.Color;
|
|
173
|
+
skyAmbient: THREE.Color;
|
|
174
|
+
groundAmbient: THREE.Color;
|
|
175
|
+
skyTop: THREE.Color;
|
|
176
|
+
skyHorizon: THREE.Color;
|
|
177
|
+
night: number;
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=waterCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waterCore.d.ts","sourceRoot":"","sources":["../../../src/components/water/waterCore.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,eAAO,MAAM,SAAS,KAAK,CAAC;AAC5B,eAAO,MAAM,SAAS,KAAK,CAAC;AAE5B,wBAAgB,UAAU,CAAC,CAAC,KAAA,gBAO3B;AACD,eAAO,MAAM,OAAO,GAAI,MAAC,WAAgC,CAAC;AAG1D,wBAAgB,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;EAWhC;AACD,wBAAgB,QAAQ,CAAC,CAAC,KAAA,EAAE,GAAG,KAAA,QAQ9B;AAGD,eAAO,MAAM,WAAW,mrHA6DvB,CAAC;AAGF,wBAAgB,yBAAyB;;;;;;;;;;EAMxC;AACD,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,CAAC,KAAA,IAEjB,MAAC,EAAE,MAAC,EAAE,QAAG,EAAE,QAAG,UACzB;AAED,eAAO,MAAM,YAAY,+jDAsCxB,CAAC;AAGF,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBlC;AAED,0EAA0E;AAC1E,wBAAgB,cAAc,CAAC,CAAC,KAAA,EAAE,SAAS,KAAA,EAAE,UAAU,KAAA,EAAE,MAAM,KAAA,EAAE,MAAM,SAAK,QAe3E;AAED,eAAO,MAAM,UAAU,myMAkCtB,CAAC;AACF,eAAO,MAAM,UAAU,0tPAgDtB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,CAAC,KAAA,wBAEpC;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA,EAAE,CAAC,KAAA,EAAE,IAAI,SAAK,EAAE,KAAK,UAAQ,wGAiB5D;AAGD;+EAC+E;AAC/E,wBAAgB,cAAc,CAAC,CAAC,KAAA,EAAE,MAAM,KAAA,iCAUvC;AAED,mGAAmG;AACnG,eAAO,MAAM,cAAc,whBAW1B,CAAC;AAGF,wBAAgB,UAAU,CAAC,MAAM,KAAA,EAAE,KAAK,SAAM,EAAE,MAAM,UAAQ,EAAE,IAAI,SAAM;;;EAiBzE;AAaD,wBAAgB,IAAI,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA,EAAE,CAAC,KAAA,EAAE,GAAG,SAAI,UAAgK;AACrM,+GAA+G;AAC/G,wBAAgB,YAAY,CAAC,GAAG,KAAA,EAAE,MAAM,KAAA,EAAE,KAAK,SAAO,EAAE,IAAI,SAAI,OAU/D;AAED,eAAO,MAAM,SAAS,k5HAQrB,CAAC;AACF,eAAO,MAAM,SAAS,ysKA8BrB,CAAC;AACF,wBAAgB,kBAAkB,CAAC,IAAI,KAAA,EAAE,OAAO,MAAY,wBAM3D;AAGD,2EAA2E;AAC3E,eAAO,MAAM,SAAS,k3IAkBrB,CAAC;AACF,eAAO,MAAM,SAAS,m0JA2BrB,CAAC;AACF,wBAAgB,gBAAgB,CAAC,IAAI,KAAA,EAAE,MAAM,KAAA,EAAE,IAAI,KAAA,EAAE,MAAM,SAAK,EAAE,OAAO,SAAI,EAAE,KAAK,SAAY;;;EAY/F;AAED,gGAAgG;AAChG,MAAM,MAAM,QAAQ,GAAG;IACnB,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC;IAAC,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC;IAClG,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAC/D,CAAC"}
|