@call-me-sensei/toonlab 0.3.1 → 0.4.20
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/NPM-LIBRARY.md +225 -0
- package/README.md +588 -184
- package/agents/PROMPTS.md +87 -0
- package/agents/README.md +54 -0
- package/agents/claude/CLAUDE.md +8 -0
- package/agents/codex/AGENTS.md +159 -0
- package/agents/cursor/toonlab.mdc +37 -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/mcp-asset-discovery.md +104 -0
- package/agents/references/runtime-entry-points.md +175 -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/post-processing/SKILL.md +44 -0
- package/agents/skills/claude/rock-ground-shaders/SKILL.md +134 -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/post-processing/SKILL.md +44 -0
- package/agents/skills/codex/rock-ground-shaders/SKILL.md +134 -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 +53 -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/fal-patina.mjs +131 -0
- package/database/generation-service.mjs +415 -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/migrations/0007_creation_revisions.sql +80 -0
- package/database/migrations/0008_creation_revision_hardening.sql +98 -0
- package/database/migrations/0009_creation_revision_delete_integrity.sql +11 -0
- package/database/migrations/0010_external_catalog_assets.sql +28 -0
- package/database/providers.mjs +644 -0
- package/database/repository.mjs +1073 -0
- package/database/seeds/catalog/0001_empty_official_catalog.sql +4 -0
- package/database/seeds/catalog/0002_2026-08.sql +19454 -0
- package/database/seeds/catalog/0003_2026-08-open-assets.sql +159086 -0
- package/database/seeds/catalog/0004_2026-08-c7-rocks.sql +39405 -0
- package/mcp/lab-management.mjs +629 -0
- package/mcp/public-catalog.mjs +168 -0
- package/mcp/server.mjs +1044 -63
- package/mcp/vite-plugin.mjs +519 -26
- package/mcp/workspace.mjs +26 -1
- package/package.json +334 -46
- package/scripts/generate-catalog-seed.mjs +324 -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 +102 -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/loadImported.js +15 -1
- 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 +324 -0
- package/src/catalog/officialCatalogLod.js +183 -0
- package/src/catalog/officialCatalogPlacement.js +243 -0
- package/src/catalog/officialCatalogProvider.js +334 -0
- package/src/character/animationRetarget.js +1084 -0
- package/src/character/characterRig.js +6 -1
- package/src/character/characterRuntime.js +544 -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 +144 -6
- package/src/environment/environmentPresets.js +486 -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 +399 -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 +462 -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 +2976 -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 +200 -6
- 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 +16 -0
- package/src/renderer/rendererConfiguration.js +250 -0
- package/src/renderer/styleComparison.js +985 -0
- package/src/rock-shader/index.js +8 -0
- package/src/rock-shader/rockGeometryDetail.js +701 -0
- package/src/rock-shader/rockMaterial.js +2586 -0
- package/src/rock-shader/rockRegionRuntime.js +185 -0
- package/src/rock-shader/rockSemanticMaterialRuntime.js +337 -0
- package/src/rock-shader/rockShaderRuntime.js +781 -0
- package/src/rock-shader/rockShaderSettings.js +1099 -0
- package/src/rock-shader/rockTangentIntegrity.js +136 -0
- package/src/rock-shader/rockTextureIntegrity.js +115 -0
- package/src/rockgen/export/glbExport.js +104 -14
- package/src/rockgen/index.js +5 -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 +376 -9
- package/src/rockgen/rockgenPresets.js +114 -13
- package/src/rockgen/rockgenSettings.js +62 -11
- package/src/rockgen/surface/c7GeologySurface.js +372 -0
- 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 +51 -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 +379 -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 +1447 -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 +157 -0
- package/src/styles/manufacturedStyleLabeling.js +204 -0
- package/src/styles/neutralStylePresets.js +712 -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 +923 -0
- package/src/styles/styleAdapters.js +177 -0
- package/src/styles/styleApplication.js +369 -0
- package/src/styles/styleBundle.js +445 -92
- 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/evaluateTexture.js +30 -3
- package/src/texgen/textureGenerators.js +83 -35
- package/src/texgen/textureSettings.js +25 -8
- package/src/toon/toonSettings.js +100 -2
- package/src/vegetation/branchTree.js +587 -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 +17 -1
- package/src/vegetation/legacyTreePresets.js +120 -0
- package/src/vegetation/scatter.js +688 -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 +676 -54
- package/src/vegetation/stylizedTreeFoliage.js +1111 -38
- package/src/vegetation/stylizedUnderstory.js +230 -0
- package/src/vegetation/treeExport.js +262 -47
- package/src/vegetation/treeSurfaceTextures.js +665 -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 +250 -50
- 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 +7 -0
- package/types/asset-policy/index.d.ts +20 -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 +56 -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 +63 -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 +87 -0
- package/types/character/characterRuntime.d.ts +5 -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 +44 -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 +153 -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 +1591 -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 +440 -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 +1785 -0
- package/types/renderer/index.d.ts +2 -0
- package/types/renderer/rendererConfiguration.d.ts +8 -0
- package/types/renderer/styleComparison.d.ts +409 -0
- package/types/rock-shader/index.d.ts +8 -0
- package/types/rock-shader/rockGeometryDetail.d.ts +300 -0
- package/types/rock-shader/rockMaterial.d.ts +21 -0
- package/types/rock-shader/rockRegionRuntime.d.ts +86 -0
- package/types/rock-shader/rockSemanticMaterialRuntime.d.ts +29 -0
- package/types/rock-shader/rockShaderRuntime.d.ts +10 -0
- package/types/rock-shader/rockShaderSettings.d.ts +184 -0
- package/types/rock-shader/rockTangentIntegrity.d.ts +51 -0
- package/types/rock-shader/rockTextureIntegrity.d.ts +61 -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 +12 -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 +243 -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/rockgen/surface/c7GeologySurface.d.ts +8 -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 +69 -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 +18 -0
- package/types/styles/manufacturedStyleLabeling.d.ts +119 -0
- package/types/styles/neutralStylePresets.d.ts +944 -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 +1802 -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 +14 -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 +225 -0
- package/types/vegetation/legacyTreePresets.d.ts +22 -0
- package/types/vegetation/scatter.d.ts +13 -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 +20 -0
- package/types/vegetation/stylizedTreeFoliage.d.ts +19 -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 -752
- 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
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
// Ground-field pass for the node backends (WebGPU / forced WebGL2) — the
|
|
2
|
+
// runtime's stand-in for landscape runtime-virtual-texturing.
|
|
3
|
+
//
|
|
4
|
+
// Renders the scene's GROUND WRITERS (meshes tagged
|
|
5
|
+
// `userData.groundFieldWrite = true`: terrain, path ribbons, plazas) from a
|
|
6
|
+
// top-down orthographic camera into three targets — visible ground color, surface
|
|
7
|
+
// properties, and encoded world height — and publishes them through the
|
|
8
|
+
// shared uniforms in
|
|
9
|
+
// src/shaders-tsl/chunks/environment-ground-field.js. Grass, rock bases, and
|
|
10
|
+
// trunk bases sample those to adopt the ground's color and melt into it.
|
|
11
|
+
//
|
|
12
|
+
// Terrain is static, so the pass renders once and re-renders only when its
|
|
13
|
+
// signature changes (writer set / transforms / resolution); callers with
|
|
14
|
+
// mutating ground (path edits) call invalidate(). Classic WebGL path: no-op,
|
|
15
|
+
// `ready` stays false and every consumer blends by zero coverage.
|
|
16
|
+
|
|
17
|
+
import * as THREE from 'three';
|
|
18
|
+
import { positionWorld, uniform, vec3, vec4 } from 'three/tsl';
|
|
19
|
+
|
|
20
|
+
import { applyShadowClipAdjust, PassBasicNodeMaterial } from '../shaders-tsl/chunks/pass-depth-color.js';
|
|
21
|
+
import {
|
|
22
|
+
environmentGroundField,
|
|
23
|
+
groundFieldColorMapNode,
|
|
24
|
+
groundFieldFilteredColorMapNode,
|
|
25
|
+
groundFieldHeightMapNode,
|
|
26
|
+
groundFieldSurfaceMapNode,
|
|
27
|
+
} from '../shaders-tsl/chunks/environment-ground-field.js';
|
|
28
|
+
|
|
29
|
+
const BOUNDS_PAD = 1.02;
|
|
30
|
+
|
|
31
|
+
export function createEnvironmentGroundFieldPass({ renderer, scene, resolution = 2048 } = {}) {
|
|
32
|
+
if (!renderer || !scene) {
|
|
33
|
+
throw new Error('createEnvironmentGroundFieldPass requires { renderer, scene }.');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const isNodeBackend = Boolean(renderer.isWebGPURenderer);
|
|
37
|
+
let colorTarget = null;
|
|
38
|
+
let filteredColorTarget = null;
|
|
39
|
+
let surfaceTarget = null;
|
|
40
|
+
let heightTarget = null;
|
|
41
|
+
const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 10);
|
|
42
|
+
camera.up.set(0, 0, -1);
|
|
43
|
+
const fieldMatrix = new THREE.Matrix4();
|
|
44
|
+
const bounds = new THREE.Box3();
|
|
45
|
+
const boundsSize = new THREE.Vector3();
|
|
46
|
+
const boundsCenter = new THREE.Vector3();
|
|
47
|
+
|
|
48
|
+
// Height swap material: encodes worldY into [0, 1] against the writer
|
|
49
|
+
// bounds. Local uniforms (not the published chunk values) so the swap
|
|
50
|
+
// render never depends on chunk state.
|
|
51
|
+
const heightMin = uniform(0);
|
|
52
|
+
const heightSpanInv = uniform(1);
|
|
53
|
+
const heightMaterial = new PassBasicNodeMaterial({ side: THREE.DoubleSide });
|
|
54
|
+
heightMaterial.isShadowPassMaterial = true;
|
|
55
|
+
heightMaterial.colorNode = vec4(
|
|
56
|
+
vec3(positionWorld.y.sub(heightMin).mul(heightSpanInv)),
|
|
57
|
+
1.0,
|
|
58
|
+
);
|
|
59
|
+
|
|
60
|
+
// Color swap materials, keyed by source material. Ground writers provide
|
|
61
|
+
// their visible sun/sky/shared-shadow color through
|
|
62
|
+
// userData.createGroundColorVariant; anything else gets a best-effort
|
|
63
|
+
// approximation from its base map/color.
|
|
64
|
+
const colorMaterialCache = new WeakMap();
|
|
65
|
+
const surfaceMaterialCache = new WeakMap();
|
|
66
|
+
|
|
67
|
+
function colorMaterialFor(material) {
|
|
68
|
+
let swapped = colorMaterialCache.get(material);
|
|
69
|
+
if (!swapped) {
|
|
70
|
+
if (typeof material?.userData?.createGroundColorVariant === 'function') {
|
|
71
|
+
swapped = material.userData.createGroundColorVariant();
|
|
72
|
+
} else {
|
|
73
|
+
swapped = new PassBasicNodeMaterial({ side: THREE.DoubleSide });
|
|
74
|
+
const map = material?.uniforms?.baseMap?.value ?? material?.uniforms?.base?.value ??
|
|
75
|
+
material?.map ?? null;
|
|
76
|
+
if (map) swapped.map = map;
|
|
77
|
+
const color = material?.uniforms?.baseColor?.value ?? material?.color ?? null;
|
|
78
|
+
if (color?.isColor) swapped.color = color.clone();
|
|
79
|
+
swapped.vertexColors = Boolean(material?.vertexColors);
|
|
80
|
+
}
|
|
81
|
+
swapped.isShadowPassMaterial = true;
|
|
82
|
+
colorMaterialCache.set(material, swapped);
|
|
83
|
+
}
|
|
84
|
+
return swapped;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function surfaceMaterialFor(material) {
|
|
88
|
+
let swapped = surfaceMaterialCache.get(material);
|
|
89
|
+
if (!swapped) {
|
|
90
|
+
if (typeof material?.userData?.createGroundSurfaceVariant === 'function') {
|
|
91
|
+
swapped = material.userData.createGroundSurfaceVariant();
|
|
92
|
+
} else {
|
|
93
|
+
swapped = new PassBasicNodeMaterial({ side: THREE.DoubleSide });
|
|
94
|
+
swapped.colorNode = vec3(
|
|
95
|
+
material?.roughnessNode ?? material?.roughness ?? 0.5,
|
|
96
|
+
material?.specularIntensityNode ?? 0.5,
|
|
97
|
+
material?.metalnessNode ?? material?.metalness ?? 0,
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
swapped.isShadowPassMaterial = true;
|
|
101
|
+
surfaceMaterialCache.set(material, swapped);
|
|
102
|
+
}
|
|
103
|
+
return swapped;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const writers = [];
|
|
107
|
+
const materialRestores = [];
|
|
108
|
+
const visibilityRestores = [];
|
|
109
|
+
let lastRenderSignature = '';
|
|
110
|
+
let lastColorSignature = '';
|
|
111
|
+
let invalidateCounter = 0;
|
|
112
|
+
let colorInvalidateCounter = 0;
|
|
113
|
+
|
|
114
|
+
function collectWriters() {
|
|
115
|
+
writers.length = 0;
|
|
116
|
+
scene.traverse((obj) => {
|
|
117
|
+
if (obj.isMesh && obj.visible && obj.userData?.groundFieldWrite) writers.push(obj);
|
|
118
|
+
});
|
|
119
|
+
return writers;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
function renderSignature() {
|
|
123
|
+
let signature = `${resolution}:${invalidateCounter}`;
|
|
124
|
+
for (const mesh of writers) {
|
|
125
|
+
signature += `|${mesh.uuid}:${mesh.matrixWorld.elements.join(',')}`;
|
|
126
|
+
}
|
|
127
|
+
return signature;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function frameCamera() {
|
|
131
|
+
bounds.makeEmpty();
|
|
132
|
+
for (const mesh of writers) bounds.expandByObject(mesh);
|
|
133
|
+
if (bounds.isEmpty()) return false;
|
|
134
|
+
bounds.getSize(boundsSize);
|
|
135
|
+
bounds.getCenter(boundsCenter);
|
|
136
|
+
const halfX = Math.max(boundsSize.x * BOUNDS_PAD, 1) / 2;
|
|
137
|
+
const halfZ = Math.max(boundsSize.z * BOUNDS_PAD, 1) / 2;
|
|
138
|
+
camera.left = -halfX;
|
|
139
|
+
camera.right = halfX;
|
|
140
|
+
camera.top = halfZ;
|
|
141
|
+
camera.bottom = -halfZ;
|
|
142
|
+
camera.near = 0.1;
|
|
143
|
+
camera.far = Math.max(boundsSize.y, 1) + 20;
|
|
144
|
+
camera.position.set(boundsCenter.x, bounds.max.y + 10, boundsCenter.z);
|
|
145
|
+
camera.lookAt(boundsCenter.x, bounds.min.y, boundsCenter.z);
|
|
146
|
+
camera.coordinateSystem = renderer.coordinateSystem;
|
|
147
|
+
camera.updateProjectionMatrix();
|
|
148
|
+
camera.updateMatrixWorld(true);
|
|
149
|
+
fieldMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse);
|
|
150
|
+
applyShadowClipAdjust(fieldMatrix, renderer);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function ensureTargets() {
|
|
155
|
+
if (colorTarget && colorTarget.width === resolution) return;
|
|
156
|
+
colorTarget?.dispose();
|
|
157
|
+
filteredColorTarget?.dispose();
|
|
158
|
+
surfaceTarget?.dispose();
|
|
159
|
+
heightTarget?.dispose();
|
|
160
|
+
colorTarget = new THREE.WebGLRenderTarget(resolution, resolution, {
|
|
161
|
+
depthBuffer: true,
|
|
162
|
+
stencilBuffer: false,
|
|
163
|
+
});
|
|
164
|
+
colorTarget.texture.name = 'EnvironmentGroundField.Color';
|
|
165
|
+
// Keep the exact target single-level. Authored RVT mip requests are
|
|
166
|
+
// fulfilled by filteredColorTarget below because WebGPU render-target
|
|
167
|
+
// mip generation is not reliable across the supported backends.
|
|
168
|
+
colorTarget.texture.generateMipmaps = false;
|
|
169
|
+
colorTarget.texture.minFilter = THREE.LinearFilter;
|
|
170
|
+
colorTarget.texture.magFilter = THREE.LinearFilter;
|
|
171
|
+
const authoredMipLevel = Math.max(
|
|
172
|
+
0,
|
|
173
|
+
Math.round(Number(environmentGroundField.colorMipLevel.value) || 0),
|
|
174
|
+
);
|
|
175
|
+
const filteredResolution = Math.max(1, Math.round(resolution / (2 ** authoredMipLevel)));
|
|
176
|
+
filteredColorTarget = new THREE.WebGLRenderTarget(
|
|
177
|
+
filteredResolution,
|
|
178
|
+
filteredResolution,
|
|
179
|
+
{
|
|
180
|
+
depthBuffer: true,
|
|
181
|
+
stencilBuffer: false,
|
|
182
|
+
},
|
|
183
|
+
);
|
|
184
|
+
filteredColorTarget.texture.name =
|
|
185
|
+
`EnvironmentGroundField.ColorMip${authoredMipLevel}`;
|
|
186
|
+
filteredColorTarget.texture.generateMipmaps = false;
|
|
187
|
+
filteredColorTarget.texture.minFilter = THREE.LinearFilter;
|
|
188
|
+
filteredColorTarget.texture.magFilter = THREE.LinearFilter;
|
|
189
|
+
surfaceTarget = new THREE.WebGLRenderTarget(resolution, resolution, {
|
|
190
|
+
depthBuffer: true,
|
|
191
|
+
stencilBuffer: false,
|
|
192
|
+
});
|
|
193
|
+
surfaceTarget.texture.name = 'EnvironmentGroundField.Surface';
|
|
194
|
+
surfaceTarget.texture.generateMipmaps = false;
|
|
195
|
+
surfaceTarget.texture.minFilter = THREE.LinearFilter;
|
|
196
|
+
surfaceTarget.texture.magFilter = THREE.LinearFilter;
|
|
197
|
+
heightTarget = new THREE.WebGLRenderTarget(resolution, resolution, {
|
|
198
|
+
depthBuffer: true,
|
|
199
|
+
stencilBuffer: false,
|
|
200
|
+
});
|
|
201
|
+
heightTarget.texture.name = 'EnvironmentGroundField.Height';
|
|
202
|
+
heightTarget.texture.type = THREE.HalfFloatType;
|
|
203
|
+
heightTarget.texture.minFilter = THREE.LinearFilter;
|
|
204
|
+
heightTarget.texture.magFilter = THREE.LinearFilter;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function renderInto(target, swapMaterialFor) {
|
|
208
|
+
materialRestores.length = 0;
|
|
209
|
+
visibilityRestores.length = 0;
|
|
210
|
+
scene.traverse((obj) => {
|
|
211
|
+
if (!obj.visible) return;
|
|
212
|
+
const isWriter = obj.isMesh && obj.userData?.groundFieldWrite;
|
|
213
|
+
if (!isWriter) {
|
|
214
|
+
// Hide leaf renderables only — hiding a group would also hide any
|
|
215
|
+
// writer nested beneath it.
|
|
216
|
+
if (obj.isMesh || obj.isPoints || obj.isLine || obj.isSprite) {
|
|
217
|
+
obj.visible = false;
|
|
218
|
+
visibilityRestores.push(obj);
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
materialRestores.push({ material: obj.material, mesh: obj });
|
|
223
|
+
obj.material = Array.isArray(obj.material)
|
|
224
|
+
? obj.material.map((mat) => swapMaterialFor(mat))
|
|
225
|
+
: swapMaterialFor(obj.material);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
const previousTarget = renderer.getRenderTarget();
|
|
229
|
+
const previousBackground = scene.background;
|
|
230
|
+
const previousShadowEnabled = renderer.shadowMap.enabled;
|
|
231
|
+
renderer.shadowMap.enabled = false;
|
|
232
|
+
scene.background = null;
|
|
233
|
+
renderer.setRenderTarget(target);
|
|
234
|
+
renderer.setClearColor(0x000000, 0);
|
|
235
|
+
renderer.clear();
|
|
236
|
+
renderer.render(scene, camera);
|
|
237
|
+
renderer.setRenderTarget(previousTarget);
|
|
238
|
+
renderer.shadowMap.enabled = previousShadowEnabled;
|
|
239
|
+
scene.background = previousBackground;
|
|
240
|
+
|
|
241
|
+
for (const { material, mesh } of materialRestores) mesh.material = material;
|
|
242
|
+
for (const obj of visibilityRestores) obj.visible = true;
|
|
243
|
+
materialRestores.length = 0;
|
|
244
|
+
visibilityRestores.length = 0;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function update() {
|
|
248
|
+
if (!isNodeBackend) return;
|
|
249
|
+
|
|
250
|
+
scene.updateMatrixWorld(true);
|
|
251
|
+
collectWriters();
|
|
252
|
+
if (writers.length === 0) {
|
|
253
|
+
environmentGroundField.ready.value = false;
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const signature = renderSignature();
|
|
258
|
+
const colorSignature = `${signature}:visible-color:${colorInvalidateCounter}`;
|
|
259
|
+
const fullRenderRequired = signature !== lastRenderSignature
|
|
260
|
+
|| !environmentGroundField.ready.value;
|
|
261
|
+
const colorRenderRequired = fullRenderRequired || colorSignature !== lastColorSignature;
|
|
262
|
+
if (!fullRenderRequired && !colorRenderRequired) return;
|
|
263
|
+
|
|
264
|
+
if (!frameCamera()) {
|
|
265
|
+
environmentGroundField.ready.value = false;
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
ensureTargets();
|
|
269
|
+
|
|
270
|
+
const minY = bounds.min.y;
|
|
271
|
+
const spanY = Math.max(boundsSize.y, 0.001);
|
|
272
|
+
heightMin.value = minY;
|
|
273
|
+
heightSpanInv.value = 1 / spanY;
|
|
274
|
+
|
|
275
|
+
// The swap render must never observe a "ready" field (a writer material
|
|
276
|
+
// reading its own output would feed back); flip off for the duration.
|
|
277
|
+
environmentGroundField.ready.value = false;
|
|
278
|
+
if (colorRenderRequired) {
|
|
279
|
+
renderInto(colorTarget, colorMaterialFor);
|
|
280
|
+
renderInto(filteredColorTarget, colorMaterialFor);
|
|
281
|
+
}
|
|
282
|
+
if (fullRenderRequired) {
|
|
283
|
+
renderInto(surfaceTarget, surfaceMaterialFor);
|
|
284
|
+
renderInto(heightTarget, () => heightMaterial);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
environmentGroundField.matrix.value.copy(fieldMatrix);
|
|
288
|
+
environmentGroundField.heightMin.value = minY;
|
|
289
|
+
environmentGroundField.heightSpan.value = spanY;
|
|
290
|
+
groundFieldColorMapNode().value = colorTarget.texture;
|
|
291
|
+
groundFieldFilteredColorMapNode().value = filteredColorTarget.texture;
|
|
292
|
+
groundFieldSurfaceMapNode().value = surfaceTarget.texture;
|
|
293
|
+
groundFieldHeightMapNode().value = heightTarget.texture;
|
|
294
|
+
environmentGroundField.ready.value = true;
|
|
295
|
+
lastRenderSignature = signature;
|
|
296
|
+
lastColorSignature = colorSignature;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// The signature tracks writer identity and transforms — repainting a
|
|
300
|
+
// writer's texture or vertex colors changes pixels without changing it.
|
|
301
|
+
function invalidate() {
|
|
302
|
+
invalidateCounter += 1;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Lighting and the shared shadow map can change while ground geometry,
|
|
306
|
+
// height, and surface properties remain static. Refresh only the two color
|
|
307
|
+
// targets in that case instead of paying for all four field passes.
|
|
308
|
+
function invalidateColor() {
|
|
309
|
+
colorInvalidateCounter += 1;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function dispose() {
|
|
313
|
+
colorTarget?.dispose();
|
|
314
|
+
filteredColorTarget?.dispose();
|
|
315
|
+
surfaceTarget?.dispose();
|
|
316
|
+
heightTarget?.dispose();
|
|
317
|
+
colorTarget = null;
|
|
318
|
+
filteredColorTarget = null;
|
|
319
|
+
surfaceTarget = null;
|
|
320
|
+
heightTarget = null;
|
|
321
|
+
environmentGroundField.ready.value = false;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return {
|
|
325
|
+
get colorSemantics() {
|
|
326
|
+
return 'visible-ground-color';
|
|
327
|
+
},
|
|
328
|
+
get ready() {
|
|
329
|
+
return Boolean(environmentGroundField.ready.value);
|
|
330
|
+
},
|
|
331
|
+
get writerCount() {
|
|
332
|
+
return writers.length;
|
|
333
|
+
},
|
|
334
|
+
get colorTexture() {
|
|
335
|
+
return colorTarget?.texture ?? null;
|
|
336
|
+
},
|
|
337
|
+
get heightTexture() {
|
|
338
|
+
return heightTarget?.texture ?? null;
|
|
339
|
+
},
|
|
340
|
+
get filteredColorTexture() {
|
|
341
|
+
return filteredColorTarget?.texture ?? null;
|
|
342
|
+
},
|
|
343
|
+
get surfaceTexture() {
|
|
344
|
+
return surfaceTarget?.texture ?? null;
|
|
345
|
+
},
|
|
346
|
+
get bounds() {
|
|
347
|
+
return bounds;
|
|
348
|
+
},
|
|
349
|
+
dispose,
|
|
350
|
+
invalidate,
|
|
351
|
+
invalidateColor,
|
|
352
|
+
update,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
@@ -3,6 +3,14 @@ import {
|
|
|
3
3
|
classifyEnvironmentMaterialRole,
|
|
4
4
|
toMaterialArray,
|
|
5
5
|
} from './environmentMaterialClassifier.js';
|
|
6
|
+
import {
|
|
7
|
+
MANUFACTURED_OBJECT_CLASSES,
|
|
8
|
+
applyManufacturedMaterialManifest,
|
|
9
|
+
classifyManufacturedMaterial,
|
|
10
|
+
createManufacturedMaterialLook,
|
|
11
|
+
inferManufacturedObjectClass,
|
|
12
|
+
resolveManufacturedMaterialLook,
|
|
13
|
+
} from './manufacturedMaterialContract.js';
|
|
6
14
|
|
|
7
15
|
// Environment node materials read scene lights from the shared toon light
|
|
8
16
|
// uniforms (shaders-tsl/chunks/character-scene-lights.js) instead of three's
|
|
@@ -24,6 +32,8 @@ import {
|
|
|
24
32
|
createEnvironmentShadowMaterial,
|
|
25
33
|
setEnvironmentDebugOutput,
|
|
26
34
|
} from './environmentShaderMaterials.js';
|
|
35
|
+
import { resolveEnvironmentPreset } from './environmentPresets.js';
|
|
36
|
+
import { installToonLabSurfaceLighting } from './toonLabSurfaceLighting.js';
|
|
27
37
|
import {
|
|
28
38
|
resolveEnvironmentTextureSet,
|
|
29
39
|
} from './environmentTextureResolver.js';
|
|
@@ -65,6 +75,27 @@ export {
|
|
|
65
75
|
usesAlphaCutout,
|
|
66
76
|
} from './environmentMaterialClassifier.js';
|
|
67
77
|
|
|
78
|
+
export {
|
|
79
|
+
MANUFACTURED_CONTENT_FLAGS,
|
|
80
|
+
MANUFACTURED_MATERIAL_BASES,
|
|
81
|
+
MANUFACTURED_MATERIAL_FINISHES,
|
|
82
|
+
MANUFACTURED_MATERIAL_LOOK_VERSION,
|
|
83
|
+
MANUFACTURED_MATERIAL_MANIFEST_TYPE,
|
|
84
|
+
MANUFACTURED_MATERIAL_MANIFEST_VERSION,
|
|
85
|
+
MANUFACTURED_OBJECT_CLASSES,
|
|
86
|
+
MANUFACTURED_RENDER_MODES,
|
|
87
|
+
MANUFACTURED_STRUCTURAL_ROLES,
|
|
88
|
+
analyzeManufacturedAsset,
|
|
89
|
+
applyManufacturedMaterialManifest,
|
|
90
|
+
classifyManufacturedMaterial,
|
|
91
|
+
createManufacturedMaterialClassification,
|
|
92
|
+
createManufacturedMaterialLook,
|
|
93
|
+
inferManufacturedObjectClass,
|
|
94
|
+
resolveManufacturedMaterialLook,
|
|
95
|
+
validateManufacturedMaterialLook,
|
|
96
|
+
validateManufacturedMaterialManifest,
|
|
97
|
+
} from './manufacturedMaterialContract.js';
|
|
98
|
+
|
|
68
99
|
export {
|
|
69
100
|
DEFAULT_ENVIRONMENT_FEATURES,
|
|
70
101
|
DEFAULT_ENVIRONMENT_PARAMETERS,
|
|
@@ -151,33 +182,102 @@ function createConvertedEnvironmentMaterial(mat, options) {
|
|
|
151
182
|
// normal rendering; setEnvironmentDebugOutput can enable them later).
|
|
152
183
|
// - scanStylize: 'auto' | true | false — photoscan stylization pass
|
|
153
184
|
// (albedo simplify + detail-map compression, see scanAssetStylize.js).
|
|
154
|
-
// 'auto' applies it only to materials that detect as
|
|
185
|
+
// 'auto' applies it only to materials that detect as photoscan/Fab scans;
|
|
155
186
|
// material.userData.envScanStylize overrides detection per material.
|
|
156
187
|
// - scanStylizeParams: overrides merged over DEFAULT_SCAN_STYLIZE_PARAMS.
|
|
188
|
+
// - materialLook: sparse IP-owned profiles resolved over the global catch-all
|
|
189
|
+
// by base material, finish, render mode, structural role, content flags,
|
|
190
|
+
// object class, then stable asset id.
|
|
191
|
+
// - materialManifest: optional sidecar manifest for formats that cannot
|
|
192
|
+
// reliably preserve glTF extras (also useful for third-party GLBs).
|
|
193
|
+
// - assetId/objectClass: stable profile selectors; explicit values override
|
|
194
|
+
// root metadata and manifest values.
|
|
157
195
|
//
|
|
158
196
|
// Returns conversion counts plus a classification report:
|
|
159
|
-
// [{ object, material, role, source }] for
|
|
197
|
+
// [{ object, material, role, source, manufactured, appliedProfiles }] for
|
|
198
|
+
// every converted material.
|
|
160
199
|
export async function applyEnvironmentShader(root, {
|
|
200
|
+
assetId = '',
|
|
161
201
|
bakeVertexAo = 'auto',
|
|
162
202
|
debugOutputMode = 'off',
|
|
163
203
|
environmentBox = null,
|
|
164
204
|
features = {},
|
|
165
205
|
hasSun = false,
|
|
206
|
+
materialLook = undefined,
|
|
207
|
+
materialManifest = null,
|
|
208
|
+
objectClass = '',
|
|
166
209
|
parameters = {},
|
|
210
|
+
preset = undefined,
|
|
167
211
|
roleOverrides = null,
|
|
168
212
|
scanStylize = 'auto',
|
|
169
213
|
scanStylizeParams = {},
|
|
214
|
+
scenario = undefined,
|
|
170
215
|
settings = {},
|
|
171
216
|
shaderMode = 'anime',
|
|
217
|
+
// Surface-lighting model options (D19-150). A material this adapter converts
|
|
218
|
+
// now JOINS the ToonLab surface-lighting model instead of being left outside
|
|
219
|
+
// it. Before this, `applyEnvironmentShader` reported a material as converted
|
|
220
|
+
// while never setting `userData.toonLabSurfaceLighting` — the exact flag every
|
|
221
|
+
// scene guards on when adopting its own shadow fill:
|
|
222
|
+
//
|
|
223
|
+
// if (!material?.userData?.toonLabSurfaceLighting) continue; // missed it
|
|
224
|
+
//
|
|
225
|
+
// so a scene's shadow fill silently reached every first-party surface and
|
|
226
|
+
// skipped every dropped-in asset. Nothing warned; the adoption loop simply
|
|
227
|
+
// reported a lower count. The divergence grows with how much fill the scene
|
|
228
|
+
// adopts, which is what made it severe rather than cosmetic.
|
|
229
|
+
//
|
|
230
|
+
// Defaults are the installer's own defaults (shadowFill 0), so installing
|
|
231
|
+
// here changes no existing capture — it only makes the material present in
|
|
232
|
+
// the model, which is what lets a scene's adoption loop find it afterwards.
|
|
233
|
+
surfaceLighting = {},
|
|
172
234
|
openWindows = false,
|
|
173
235
|
vertexAoOptions = {},
|
|
174
236
|
} = {}) {
|
|
175
|
-
const
|
|
237
|
+
const presetSettings = preset !== undefined || scenario !== undefined
|
|
238
|
+
? resolveEnvironmentPreset(preset ?? 'default', scenario)
|
|
239
|
+
: null;
|
|
240
|
+
const sourceSettings = settings && typeof settings === 'object' ? settings : {};
|
|
241
|
+
const composedSettings = presetSettings ? {
|
|
242
|
+
...sourceSettings,
|
|
243
|
+
features: {
|
|
244
|
+
...presetSettings.features,
|
|
245
|
+
...(sourceSettings.features ?? {}),
|
|
246
|
+
},
|
|
247
|
+
materialLook: sourceSettings.materialLook ?? presetSettings.materialLook,
|
|
248
|
+
parameters: {
|
|
249
|
+
...presetSettings.parameters,
|
|
250
|
+
...(sourceSettings.parameters ?? {}),
|
|
251
|
+
},
|
|
252
|
+
} : sourceSettings;
|
|
253
|
+
const manifestResult = materialManifest
|
|
254
|
+
? applyManufacturedMaterialManifest(root, materialManifest)
|
|
255
|
+
: null;
|
|
256
|
+
const environmentSettings = resolveEnvironmentSettings({
|
|
257
|
+
features,
|
|
258
|
+
parameters,
|
|
259
|
+
settings: composedSettings,
|
|
260
|
+
});
|
|
261
|
+
const resolvedMaterialLook = createManufacturedMaterialLook(
|
|
262
|
+
materialLook ?? composedSettings.materialLook ?? {},
|
|
263
|
+
);
|
|
264
|
+
const resolvedAssetId = String(
|
|
265
|
+
assetId
|
|
266
|
+
|| manifestResult?.assetId
|
|
267
|
+
|| root?.userData?.toonlabAssetId
|
|
268
|
+
|| '',
|
|
269
|
+
);
|
|
270
|
+
const requestedObjectClass = objectClass || manifestResult?.objectClass;
|
|
271
|
+
const resolvedObjectClass = MANUFACTURED_OBJECT_CLASSES.includes(requestedObjectClass)
|
|
272
|
+
? requestedObjectClass
|
|
273
|
+
: inferManufacturedObjectClass(root);
|
|
176
274
|
const normalizedShaderMode = ['anime', 'basic', 'standard'].includes(shaderMode)
|
|
177
275
|
? shaderMode
|
|
178
276
|
: 'anime';
|
|
179
277
|
const resolvedDebugMode = normalizeEnvironmentDebugMode(debugOutputMode);
|
|
180
278
|
let convertedMeshCount = 0;
|
|
279
|
+
// D19-150: how many converted materials actually joined the lighting model.
|
|
280
|
+
let surfaceLightingMaterialCount = 0;
|
|
181
281
|
let aoOverlayMeshCount = 0;
|
|
182
282
|
let windowCutoutMaterialCount = 0;
|
|
183
283
|
let shadowMeshCount = 0;
|
|
@@ -255,13 +355,21 @@ export async function applyEnvironmentShader(root, {
|
|
|
255
355
|
const originalMaterials = toMaterialArray(obj.material);
|
|
256
356
|
const roleInfos = originalMaterials.map((mat) => {
|
|
257
357
|
const info = classifyEnvironmentMaterialRole(obj, mat, { roleOverrides });
|
|
358
|
+
const manufactured = classifyManufacturedMaterial(obj, mat);
|
|
359
|
+
const materialProfile = resolveManufacturedMaterialLook(resolvedMaterialLook, {
|
|
360
|
+
assetId: resolvedAssetId,
|
|
361
|
+
classification: manufactured,
|
|
362
|
+
objectClass: resolvedObjectClass,
|
|
363
|
+
});
|
|
258
364
|
classification.push({
|
|
365
|
+
appliedProfiles: materialProfile.appliedProfiles,
|
|
259
366
|
material: mat?.name ?? '',
|
|
367
|
+
manufactured,
|
|
260
368
|
object: obj.name ?? '',
|
|
261
369
|
role: info.role,
|
|
262
370
|
source: info.source,
|
|
263
371
|
});
|
|
264
|
-
return info;
|
|
372
|
+
return { ...info, manufactured, materialProfile };
|
|
265
373
|
});
|
|
266
374
|
const shadowMesh = environmentSettings.features.shadowMesh
|
|
267
375
|
&& roleInfos.some((info) => info.role === 'shadowMesh');
|
|
@@ -272,17 +380,32 @@ export async function applyEnvironmentShader(root, {
|
|
|
272
380
|
const hasUv2 = ensureUv2Attribute(obj.geometry);
|
|
273
381
|
|
|
274
382
|
const convertMaterial = (mat, index) => {
|
|
383
|
+
const roleInfo = roleInfos[index];
|
|
384
|
+
const perMaterialSettings = createEnvironmentSettings({
|
|
385
|
+
features: {
|
|
386
|
+
...environmentSettings.features,
|
|
387
|
+
...roleInfo?.materialProfile?.features,
|
|
388
|
+
},
|
|
389
|
+
parameters: {
|
|
390
|
+
...environmentSettings.parameters,
|
|
391
|
+
...roleInfo?.materialProfile?.parameters,
|
|
392
|
+
},
|
|
393
|
+
});
|
|
275
394
|
const converted = createConvertedEnvironmentMaterial(mat, {
|
|
395
|
+
assetId: resolvedAssetId,
|
|
276
396
|
debugOutputMode: resolvedDebugMode,
|
|
277
397
|
environmentBox,
|
|
278
|
-
environmentSettings,
|
|
398
|
+
environmentSettings: perMaterialSettings,
|
|
279
399
|
hasSun,
|
|
280
400
|
hasUv2,
|
|
281
401
|
hasVertexAo,
|
|
282
402
|
hasVertexColors,
|
|
403
|
+
manufacturedClassification: roleInfo?.manufactured,
|
|
404
|
+
manufacturedObjectClass: resolvedObjectClass,
|
|
405
|
+
materialProfile: roleInfo?.materialProfile,
|
|
283
406
|
normalizedShaderMode,
|
|
284
407
|
openWindows,
|
|
285
|
-
role:
|
|
408
|
+
role: roleInfo?.role ?? null,
|
|
286
409
|
textureSet: materialTextureSets.get(mat),
|
|
287
410
|
});
|
|
288
411
|
if (scanMaterials.has(mat)) {
|
|
@@ -306,6 +429,15 @@ export async function applyEnvironmentShader(root, {
|
|
|
306
429
|
|
|
307
430
|
for (const mat of toMaterialArray(obj.material)) {
|
|
308
431
|
if (mat?.userData?.windowCutout) windowCutoutMaterialCount += 1;
|
|
432
|
+
// D19-150: enrol every converted environment material in the surface
|
|
433
|
+
// lighting model. `installToonLabSurfaceLighting` is a no-op on anything
|
|
434
|
+
// that is not a NodeMaterial and preserves prior options when re-run, so
|
|
435
|
+
// this is safe both for materials that already carry it and for the
|
|
436
|
+
// scene-side adoption pass that re-installs with an authored shadowFill.
|
|
437
|
+
if (mat?.isNodeMaterial && mat.userData?.environmentMaterial) {
|
|
438
|
+
installToonLabSurfaceLighting(mat, surfaceLighting);
|
|
439
|
+
if (mat.userData?.toonLabSurfaceLighting) surfaceLightingMaterialCount += 1;
|
|
440
|
+
}
|
|
309
441
|
}
|
|
310
442
|
if (toMaterialArray(obj.material).some((mat) => mat?.userData?.environmentMaterial)) {
|
|
311
443
|
obj.onBeforeRender = environmentNodeLightSync;
|
|
@@ -327,7 +459,13 @@ export async function applyEnvironmentShader(root, {
|
|
|
327
459
|
aoOverlayMeshCount,
|
|
328
460
|
classification,
|
|
329
461
|
convertedMeshCount,
|
|
462
|
+
surfaceLightingMaterialCount,
|
|
463
|
+
manifestWarnings: manifestResult?.warnings ?? [],
|
|
464
|
+
manufacturedAssetId: resolvedAssetId,
|
|
465
|
+
manufacturedObjectClass: resolvedObjectClass,
|
|
466
|
+
preset: presetSettings ? String(preset ?? 'default') : null,
|
|
330
467
|
scanStylizedMaterialCount,
|
|
468
|
+
scenario: presetSettings && scenario !== undefined ? String(scenario) : null,
|
|
331
469
|
shaderMode: normalizedShaderMode,
|
|
332
470
|
shadowMeshCount,
|
|
333
471
|
vertexAoMeshCount,
|