@rosetears/aili-pi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/extensions/index.ts +6 -0
- package/install.sh +5 -0
- package/manifests/adapter-evidence.json +45 -0
- package/manifests/capabilities.json +124 -0
- package/manifests/live-verification.json +26 -0
- package/manifests/provenance.json +71 -0
- package/manifests/roles.json +474 -0
- package/manifests/sbom.json +7797 -0
- package/manifests/skill-compatibility.json +8100 -0
- package/manifests/subagent-provenance.json +37 -0
- package/package.json +91 -0
- package/prompts/build.md +8 -0
- package/prompts/define.md +8 -0
- package/prompts/ideate.md +8 -0
- package/prompts/local-review.md +8 -0
- package/prompts/ship.md +8 -0
- package/roles/agent-evaluator.md +47 -0
- package/roles/ai-regression-scout.md +47 -0
- package/roles/browser-qa-runner.md +47 -0
- package/roles/code-reviewer.md +47 -0
- package/roles/code-scout.md +47 -0
- package/roles/convergence-reviewer.md +55 -0
- package/roles/doc-researcher.md +47 -0
- package/roles/e2e-artifact-runner.md +47 -0
- package/roles/implementer.md +47 -0
- package/roles/opensource-sanitizer.md +47 -0
- package/roles/plan-auditor.md +47 -0
- package/roles/pr-test-analyzer.md +47 -0
- package/roles/security-auditor.md +47 -0
- package/roles/silent-failure-reviewer.md +47 -0
- package/roles/spec-miner.md +47 -0
- package/roles/test-coverage-reviewer.md +47 -0
- package/roles/test-engineer.md +48 -0
- package/roles/web-performance-auditor.md +47 -0
- package/roles/web-researcher.md +47 -0
- package/scripts/apply-adapter-evidence.ts +73 -0
- package/scripts/bootstrap.sh +180 -0
- package/scripts/generate-provenance.ts +143 -0
- package/scripts/local-package-e2e.ts +51 -0
- package/scripts/sync-roles.ts +213 -0
- package/scripts/sync-skills.ts +356 -0
- package/scripts/validate-runtime.ts +11 -0
- package/skills/academic-paper-review/SKILL.md +81 -0
- package/skills/agents-md-initialization/SKILL.md +121 -0
- package/skills/agents-md-initialization/references/agents-template.md +83 -0
- package/skills/agents-md-initialization/references/agents_md.py +215 -0
- package/skills/ai-regression-scout/SKILL.md +24 -0
- package/skills/aili-delivery-flow/SKILL.md +125 -0
- package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
- package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
- package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
- package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
- package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
- package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
- package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
- package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
- package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
- package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
- package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
- package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
- package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
- package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
- package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
- package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
- package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
- package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
- package/skills/android-native-dev/SKILL.md +722 -0
- package/skills/android-native-dev/references/accessibility.md +209 -0
- package/skills/android-native-dev/references/adaptive-screens.md +231 -0
- package/skills/android-native-dev/references/design-style-guide.md +365 -0
- package/skills/android-native-dev/references/functional-requirements.md +229 -0
- package/skills/android-native-dev/references/motion-system.md +203 -0
- package/skills/android-native-dev/references/performance-stability.md +223 -0
- package/skills/android-native-dev/references/privacy-security.md +244 -0
- package/skills/android-native-dev/references/testing.md +554 -0
- package/skills/android-native-dev/references/visual-design.md +246 -0
- package/skills/api-and-interface-design/SKILL.md +318 -0
- package/skills/browser-qa/SKILL.md +32 -0
- package/skills/browser-testing-with-devtools/SKILL.md +323 -0
- package/skills/build-failure-repair/SKILL.md +49 -0
- package/skills/chart-visualization/SKILL.md +73 -0
- package/skills/ci-cd-and-automation/SKILL.md +353 -0
- package/skills/code-review-and-quality/SKILL.md +375 -0
- package/skills/code-review-quality-gates/SKILL.md +132 -0
- package/skills/code-simplification/SKILL.md +371 -0
- package/skills/comment-accuracy-review/SKILL.md +37 -0
- package/skills/consulting-analysis/SKILL.md +69 -0
- package/skills/context-engineering/SKILL.md +375 -0
- package/skills/coverage-review/SKILL.md +24 -0
- package/skills/data-analysis/SKILL.md +74 -0
- package/skills/deprecation-and-migration/SKILL.md +222 -0
- package/skills/documentation-and-adrs/SKILL.md +330 -0
- package/skills/e2e-artifact-handling/SKILL.md +30 -0
- package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
- package/skills/explain-by-allegory/SKILL.md +99 -0
- package/skills/flutter-dev/SKILL.md +162 -0
- package/skills/flutter-dev/references/animations.md +497 -0
- package/skills/flutter-dev/references/bloc-state.md +281 -0
- package/skills/flutter-dev/references/forms.md +656 -0
- package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
- package/skills/flutter-dev/references/localization.md +510 -0
- package/skills/flutter-dev/references/networking.md +566 -0
- package/skills/flutter-dev/references/performance.md +305 -0
- package/skills/flutter-dev/references/platform-specific.md +417 -0
- package/skills/flutter-dev/references/project-structure.md +273 -0
- package/skills/flutter-dev/references/riverpod-state.md +232 -0
- package/skills/flutter-dev/references/testing.md +364 -0
- package/skills/flutter-dev/references/widget-patterns.md +233 -0
- package/skills/frontend-dev/SKILL.md +468 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
- package/skills/frontend-dev/references/env-setup.md +33 -0
- package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
- package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
- package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
- package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
- package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
- package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
- package/skills/frontend-dev/references/motion-recipes.md +407 -0
- package/skills/frontend-dev/references/troubleshooting.md +85 -0
- package/skills/frontend-dev/scripts/minimax_image.py +137 -0
- package/skills/frontend-dev/scripts/minimax_music.py +157 -0
- package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
- package/skills/frontend-dev/scripts/minimax_video.py +187 -0
- package/skills/frontend-dev/templates/generator_template.js +223 -0
- package/skills/frontend-dev/templates/viewer.html +599 -0
- package/skills/frontend-ui-engineering/SKILL.md +367 -0
- package/skills/fullstack-dev/SKILL.md +819 -0
- package/skills/fullstack-dev/references/api-design.md +444 -0
- package/skills/fullstack-dev/references/auth-flow.md +165 -0
- package/skills/fullstack-dev/references/db-schema.md +706 -0
- package/skills/fullstack-dev/references/django-best-practices.md +466 -0
- package/skills/fullstack-dev/references/environment-management.md +78 -0
- package/skills/fullstack-dev/references/release-checklist.md +278 -0
- package/skills/fullstack-dev/references/technology-selection.md +254 -0
- package/skills/fullstack-dev/references/testing-strategy.md +404 -0
- package/skills/git-workflow-and-versioning/SKILL.md +446 -0
- package/skills/github-evidence-triage/SKILL.md +115 -0
- package/skills/harness-evolution/SKILL.md +59 -0
- package/skills/harness-evolution/references/activation-matrix.md +13 -0
- package/skills/harness-evolution/references/approval-policy.md +20 -0
- package/skills/harness-evolution/references/change-report-template.md +33 -0
- package/skills/harness-evolution/references/component-taxonomy.md +19 -0
- package/skills/harness-evolution/references/verdict-policy.md +13 -0
- package/skills/harness-issue-triage/SKILL.md +72 -0
- package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
- package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
- package/skills/harness-optimization-audit/SKILL.md +125 -0
- package/skills/idea-refine/SKILL.md +191 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
- package/skills/incremental-implementation/SKILL.md +252 -0
- package/skills/ios-application-dev/SKILL.md +212 -0
- package/skills/ios-application-dev/references/accessibility.md +259 -0
- package/skills/ios-application-dev/references/graphics-animation.md +350 -0
- package/skills/ios-application-dev/references/layout-system.md +199 -0
- package/skills/ios-application-dev/references/metal-shader.md +178 -0
- package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
- package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
- package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
- package/skills/ios-application-dev/references/system-integration.md +401 -0
- package/skills/ios-application-dev/references/uikit-components.md +297 -0
- package/skills/local-review-gate/SKILL.md +207 -0
- package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
- package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
- package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
- package/skills/local-review-gate/references/graphify-local-review.md +33 -0
- package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
- package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
- package/skills/local-review-gate/references/upstream-provenance.md +61 -0
- package/skills/mature-project-pattern-research/SKILL.md +155 -0
- package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
- package/skills/minimax-docx/LICENSE +21 -0
- package/skills/minimax-docx/SKILL.md +273 -0
- package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/skills/minimax-docx/references/comments_guide.md +191 -0
- package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/skills/minimax-docx/references/design_principles.md +819 -0
- package/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/skills/minimax-docx/references/openxml_units.md +72 -0
- package/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/skills/minimax-docx/references/typography_guide.md +294 -0
- package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/skills/minimax-docx/scripts/setup.sh +504 -0
- package/skills/minimax-pdf/README.md +222 -0
- package/skills/minimax-pdf/SKILL.md +218 -0
- package/skills/minimax-pdf/design/design.md +381 -0
- package/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/skills/minimax-pdf/scripts/make.sh +491 -0
- package/skills/minimax-pdf/scripts/merge.py +112 -0
- package/skills/minimax-pdf/scripts/palette.py +521 -0
- package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/skills/minimax-pdf/scripts/render_body.py +1052 -0
- package/skills/minimax-pdf/scripts/render_cover.js +111 -0
- package/skills/minimax-xlsx/SKILL.md +156 -0
- package/skills/minimax-xlsx/references/create.md +691 -0
- package/skills/minimax-xlsx/references/edit.md +684 -0
- package/skills/minimax-xlsx/references/fix.md +37 -0
- package/skills/minimax-xlsx/references/format.md +768 -0
- package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/skills/minimax-xlsx/references/validate.md +772 -0
- package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/skills/newsletter-generation/SKILL.md +71 -0
- package/skills/oss-release-readiness/SKILL.md +47 -0
- package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
- package/skills/performance-optimization/SKILL.md +364 -0
- package/skills/planning-and-task-breakdown/SKILL.md +290 -0
- package/skills/pptx-generator/SKILL.md +275 -0
- package/skills/pptx-generator/references/design-system.md +392 -0
- package/skills/pptx-generator/references/editing.md +162 -0
- package/skills/pptx-generator/references/pitfalls.md +112 -0
- package/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/skills/pptx-generator/references/slide-types.md +413 -0
- package/skills/pr-test-analysis/SKILL.md +24 -0
- package/skills/react-native-dev/SKILL.md +180 -0
- package/skills/react-native-dev/references/animations.md +254 -0
- package/skills/react-native-dev/references/components.md +124 -0
- package/skills/react-native-dev/references/engineering.md +527 -0
- package/skills/react-native-dev/references/forms.md +300 -0
- package/skills/react-native-dev/references/native-capabilities.md +163 -0
- package/skills/react-native-dev/references/navigation.md +271 -0
- package/skills/react-native-dev/references/networking.md +346 -0
- package/skills/react-native-dev/references/performance.md +215 -0
- package/skills/react-native-dev/references/state-management.md +230 -0
- package/skills/react-native-dev/references/styling.md +117 -0
- package/skills/react-native-dev/references/testing.md +341 -0
- package/skills/requirements-grilling/SKILL.md +447 -0
- package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
- package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
- package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
- package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
- package/skills/review-pipeline/SKILL.md +38 -0
- package/skills/rose-memory/SKILL.md +210 -0
- package/skills/rose-memory/references/README.md +48 -0
- package/skills/rose-memory/references/memory_cli.py +2384 -0
- package/skills/rose-memory/references/schema.sql +315 -0
- package/skills/security-and-hardening/SKILL.md +369 -0
- package/skills/session-handoff/SKILL.md +88 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
- package/skills/session-handoff/scripts/session_handoff.py +764 -0
- package/skills/shader-dev/SKILL.md +316 -0
- package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
- package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
- package/skills/shader-dev/reference/anti-aliasing.md +71 -0
- package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
- package/skills/shader-dev/reference/camera-effects.md +80 -0
- package/skills/shader-dev/reference/cellular-automata.md +635 -0
- package/skills/shader-dev/reference/color-palette.md +481 -0
- package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
- package/skills/shader-dev/reference/domain-repetition.md +436 -0
- package/skills/shader-dev/reference/domain-warping.md +419 -0
- package/skills/shader-dev/reference/fluid-simulation.md +425 -0
- package/skills/shader-dev/reference/fractal-rendering.md +525 -0
- package/skills/shader-dev/reference/lighting-model.md +639 -0
- package/skills/shader-dev/reference/matrix-transform.md +535 -0
- package/skills/shader-dev/reference/multipass-buffer.md +571 -0
- package/skills/shader-dev/reference/normal-estimation.md +418 -0
- package/skills/shader-dev/reference/particle-system.md +589 -0
- package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
- package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
- package/skills/shader-dev/reference/post-processing.md +375 -0
- package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
- package/skills/shader-dev/reference/procedural-noise.md +551 -0
- package/skills/shader-dev/reference/ray-marching.md +396 -0
- package/skills/shader-dev/reference/sdf-2d.md +724 -0
- package/skills/shader-dev/reference/sdf-3d.md +805 -0
- package/skills/shader-dev/reference/sdf-tricks.md +63 -0
- package/skills/shader-dev/reference/shadow-techniques.md +476 -0
- package/skills/shader-dev/reference/simulation-physics.md +644 -0
- package/skills/shader-dev/reference/sound-synthesis.md +578 -0
- package/skills/shader-dev/reference/terrain-rendering.md +839 -0
- package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
- package/skills/shader-dev/reference/texture-sampling.md +553 -0
- package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
- package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
- package/skills/shader-dev/reference/voxel-rendering.md +701 -0
- package/skills/shader-dev/reference/water-ocean.md +445 -0
- package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
- package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
- package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
- package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
- package/skills/shader-dev/techniques/camera-effects.md +115 -0
- package/skills/shader-dev/techniques/cellular-automata.md +531 -0
- package/skills/shader-dev/techniques/color-palette.md +380 -0
- package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
- package/skills/shader-dev/techniques/domain-repetition.md +333 -0
- package/skills/shader-dev/techniques/domain-warping.md +414 -0
- package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
- package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
- package/skills/shader-dev/techniques/lighting-model.md +527 -0
- package/skills/shader-dev/techniques/matrix-transform.md +455 -0
- package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
- package/skills/shader-dev/techniques/normal-estimation.md +318 -0
- package/skills/shader-dev/techniques/particle-system.md +1203 -0
- package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
- package/skills/shader-dev/techniques/post-processing.md +788 -0
- package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
- package/skills/shader-dev/techniques/procedural-noise.md +554 -0
- package/skills/shader-dev/techniques/ray-marching.md +467 -0
- package/skills/shader-dev/techniques/sdf-2d.md +631 -0
- package/skills/shader-dev/techniques/sdf-3d.md +589 -0
- package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
- package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
- package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
- package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
- package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
- package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
- package/skills/shader-dev/techniques/texture-sampling.md +382 -0
- package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
- package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
- package/skills/shader-dev/techniques/water-ocean.md +490 -0
- package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
- package/skills/shipping-and-launch/SKILL.md +334 -0
- package/skills/silent-failure-hunting/SKILL.md +24 -0
- package/skills/source-driven-development/SKILL.md +223 -0
- package/skills/spec-driven-development/SKILL.md +235 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
- package/skills/strategy-stress-test/SKILL.md +185 -0
- package/skills/systematic-literature-review/SKILL.md +77 -0
- package/skills/test-document-generator/SKILL.md +152 -0
- package/skills/test-document-generator/references/test-document-template.md +45 -0
- package/skills/test-driven-development/SKILL.md +399 -0
- package/skills/write-skills/GLOSSARY.md +113 -0
- package/skills/write-skills/SKILL.md +133 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
- package/src/runtime/child-guard.ts +70 -0
- package/src/runtime/conflicts.ts +25 -0
- package/src/runtime/contracts.ts +9 -0
- package/src/runtime/doctor.ts +134 -0
- package/src/runtime/global-resources.ts +152 -0
- package/src/runtime/index.ts +23 -0
- package/src/runtime/lifecycle.ts +19 -0
- package/src/runtime/native-integrations.ts +44 -0
- package/src/runtime/path-boundaries.ts +69 -0
- package/src/runtime/registry.ts +213 -0
- package/src/runtime/roles.ts +64 -0
- package/src/runtime/rose-context.ts +24 -0
- package/src/runtime/subagents.ts +426 -0
- package/templates/APPEND_SYSTEM.md +12 -0
- package/upstream/aili-workflows.lock.json +3226 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
# Atmospheric & Subsurface Scattering
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
- Sky rendering (sunrise/sunset/noon/night)
|
|
5
|
+
- Aerial perspective
|
|
6
|
+
- Sun halo (Mie scattering haze)
|
|
7
|
+
- Planetary atmosphere rim glow
|
|
8
|
+
- Translucent material SSS (candles, skin, jelly)
|
|
9
|
+
- Volumetric light (God rays)
|
|
10
|
+
|
|
11
|
+
## Core Principles
|
|
12
|
+
|
|
13
|
+
Three physical mechanisms:
|
|
14
|
+
|
|
15
|
+
**Rayleigh scattering** — molecular-scale particles, β_R(λ) ∝ 1/λ⁴, shorter wavelengths scatter more strongly (blue sky / red sunset).
|
|
16
|
+
Sea-level values: `vec3(5.5e-6, 13.0e-6, 22.4e-6)` m⁻¹.
|
|
17
|
+
Phase function: `P_R(θ) = 3/(16π) × (1 + cos²θ)`, symmetric forward-backward.
|
|
18
|
+
|
|
19
|
+
**Mie scattering** — aerosol particles, wavelength-independent, strong forward scattering (sun halo).
|
|
20
|
+
Sea-level value: `vec3(21e-6)` m⁻¹.
|
|
21
|
+
Phase function: Henyey-Greenstein, `g ≈ 0.76~0.88`.
|
|
22
|
+
|
|
23
|
+
**Beer-Lambert attenuation** — `T(A→B) = exp(-∫ σ_e(s) ds)`, exponential decay of light through a medium.
|
|
24
|
+
|
|
25
|
+
**Algorithm flow**: ray march along the view ray; at each sample point: compute density → compute optical depth toward the sun → Beer-Lambert attenuation → phase function weighting → accumulate.
|
|
26
|
+
|
|
27
|
+
## Implementation Steps
|
|
28
|
+
|
|
29
|
+
### Step 1: Ray-Sphere Intersection
|
|
30
|
+
|
|
31
|
+
```glsl
|
|
32
|
+
// Returns (t_near, t_far); no intersection when t_near > t_far
|
|
33
|
+
vec2 raySphereIntersect(vec3 p, vec3 dir, float r) {
|
|
34
|
+
float b = dot(p, dir);
|
|
35
|
+
float c = dot(p, p) - r * r;
|
|
36
|
+
float d = b * b - c;
|
|
37
|
+
if (d < 0.0) return vec2(1e5, -1e5);
|
|
38
|
+
d = sqrt(d);
|
|
39
|
+
return vec2(-b - d, -b + d);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Step 2: Atmospheric Physical Constants
|
|
44
|
+
|
|
45
|
+
```glsl
|
|
46
|
+
#define PLANET_RADIUS 6371e3
|
|
47
|
+
#define ATMOS_RADIUS 6471e3
|
|
48
|
+
#define PLANET_CENTER vec3(0.0)
|
|
49
|
+
|
|
50
|
+
#define BETA_RAY vec3(5.5e-6, 13.0e-6, 22.4e-6) // Rayleigh scattering coefficients
|
|
51
|
+
#define BETA_MIE vec3(21e-6) // Mie scattering coefficients
|
|
52
|
+
#define BETA_OZONE vec3(2.04e-5, 4.97e-5, 1.95e-6) // Ozone absorption
|
|
53
|
+
|
|
54
|
+
#define MIE_G 0.76 // Anisotropy parameter 0.76~0.88
|
|
55
|
+
#define MIE_EXTINCTION 1.1 // Extinction/scattering ratio
|
|
56
|
+
|
|
57
|
+
#define H_RAY 8000.0 // Rayleigh scale height
|
|
58
|
+
#define H_MIE 1200.0 // Mie scale height
|
|
59
|
+
#define H_OZONE 30e3 // Ozone peak altitude
|
|
60
|
+
#define OZONE_FALLOFF 4e3 // Ozone decay width
|
|
61
|
+
|
|
62
|
+
#define PRIMARY_STEPS 32 // Primary ray steps 8(mobile)~64(high quality)
|
|
63
|
+
#define LIGHT_STEPS 8 // Light direction steps 4~16
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Step 3: Phase Functions
|
|
67
|
+
|
|
68
|
+
```glsl
|
|
69
|
+
float phaseRayleigh(float cosTheta) {
|
|
70
|
+
return 3.0 / (16.0 * 3.14159265) * (1.0 + cosTheta * cosTheta);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Henyey-Greenstein phase function
|
|
74
|
+
float phaseMie(float cosTheta, float g) {
|
|
75
|
+
float gg = g * g;
|
|
76
|
+
float num = (1.0 - gg) * (1.0 + cosTheta * cosTheta);
|
|
77
|
+
float denom = (2.0 + gg) * pow(1.0 + gg - 2.0 * g * cosTheta, 1.5);
|
|
78
|
+
return 3.0 / (8.0 * 3.14159265) * num / denom;
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Step 4: Atmospheric Density Sampling
|
|
83
|
+
|
|
84
|
+
```glsl
|
|
85
|
+
// Returns vec3(rayleigh, mie, ozone) density
|
|
86
|
+
vec3 atmosphereDensity(vec3 pos, float planetRadius) {
|
|
87
|
+
float height = length(pos) - planetRadius;
|
|
88
|
+
float densityRay = exp(-height / H_RAY);
|
|
89
|
+
float densityMie = exp(-height / H_MIE);
|
|
90
|
+
float denom = (H_OZONE - height) / OZONE_FALLOFF;
|
|
91
|
+
float densityOzone = (1.0 / (denom * denom + 1.0)) * densityRay;
|
|
92
|
+
return vec3(densityRay, densityMie, densityOzone);
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Step 5: Light Direction Optical Depth
|
|
97
|
+
|
|
98
|
+
```glsl
|
|
99
|
+
vec3 lightOpticalDepth(vec3 pos, vec3 sunDir) {
|
|
100
|
+
float atmoDist = raySphereIntersect(pos - PLANET_CENTER, sunDir, ATMOS_RADIUS).y;
|
|
101
|
+
float stepSize = atmoDist / float(LIGHT_STEPS);
|
|
102
|
+
float rayPos = stepSize * 0.5;
|
|
103
|
+
vec3 optDepth = vec3(0.0);
|
|
104
|
+
for (int i = 0; i < LIGHT_STEPS; i++) {
|
|
105
|
+
vec3 samplePos = pos + sunDir * rayPos;
|
|
106
|
+
float height = length(samplePos - PLANET_CENTER) - PLANET_RADIUS;
|
|
107
|
+
if (height < 0.0) return vec3(1e10); // Occluded by planet
|
|
108
|
+
optDepth += atmosphereDensity(samplePos, PLANET_RADIUS) * stepSize;
|
|
109
|
+
rayPos += stepSize;
|
|
110
|
+
}
|
|
111
|
+
return optDepth;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 6: Primary Scattering Integration
|
|
116
|
+
|
|
117
|
+
```glsl
|
|
118
|
+
vec3 calculateScattering(
|
|
119
|
+
vec3 rayOrigin, vec3 rayDir, float maxDist,
|
|
120
|
+
vec3 sunDir, vec3 sunIntensity
|
|
121
|
+
) {
|
|
122
|
+
vec2 atmoHit = raySphereIntersect(rayOrigin - PLANET_CENTER, rayDir, ATMOS_RADIUS);
|
|
123
|
+
if (atmoHit.x > atmoHit.y) return vec3(0.0);
|
|
124
|
+
|
|
125
|
+
vec2 planetHit = raySphereIntersect(rayOrigin - PLANET_CENTER, rayDir, PLANET_RADIUS);
|
|
126
|
+
|
|
127
|
+
float tStart = max(atmoHit.x, 0.0);
|
|
128
|
+
float tEnd = atmoHit.y;
|
|
129
|
+
if (planetHit.x > 0.0) tEnd = min(tEnd, planetHit.x);
|
|
130
|
+
tEnd = min(tEnd, maxDist);
|
|
131
|
+
|
|
132
|
+
float stepSize = (tEnd - tStart) / float(PRIMARY_STEPS);
|
|
133
|
+
float cosTheta = dot(rayDir, sunDir);
|
|
134
|
+
float phaseR = phaseRayleigh(cosTheta);
|
|
135
|
+
float phaseM = phaseMie(cosTheta, MIE_G);
|
|
136
|
+
|
|
137
|
+
vec3 totalRay = vec3(0.0), totalMie = vec3(0.0), optDepthI = vec3(0.0);
|
|
138
|
+
float rayPos = tStart + stepSize * 0.5;
|
|
139
|
+
|
|
140
|
+
for (int i = 0; i < PRIMARY_STEPS; i++) {
|
|
141
|
+
vec3 samplePos = rayOrigin + rayDir * rayPos;
|
|
142
|
+
vec3 density = atmosphereDensity(samplePos, PLANET_RADIUS) * stepSize;
|
|
143
|
+
optDepthI += density;
|
|
144
|
+
|
|
145
|
+
vec3 optDepthL = lightOpticalDepth(samplePos, sunDir);
|
|
146
|
+
vec3 tau = BETA_RAY * (optDepthI.x + optDepthL.x)
|
|
147
|
+
+ BETA_MIE * 1.1 * (optDepthI.y + optDepthL.y)
|
|
148
|
+
+ BETA_OZONE * (optDepthI.z + optDepthL.z);
|
|
149
|
+
vec3 attenuation = exp(-tau);
|
|
150
|
+
|
|
151
|
+
totalRay += density.x * attenuation;
|
|
152
|
+
totalMie += density.y * attenuation;
|
|
153
|
+
rayPos += stepSize;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return sunIntensity * (totalRay * BETA_RAY * phaseR + totalMie * BETA_MIE * phaseM);
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Step 7: Tone Mapping
|
|
161
|
+
|
|
162
|
+
```glsl
|
|
163
|
+
vec3 tonemapExposure(vec3 color) { return 1.0 - exp(-color); }
|
|
164
|
+
|
|
165
|
+
vec3 tonemapReinhard(vec3 color) {
|
|
166
|
+
float l = dot(color, vec3(0.2126, 0.7152, 0.0722));
|
|
167
|
+
vec3 tc = color / (color + 1.0);
|
|
168
|
+
return mix(color / (l + 1.0), tc, tc);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
vec3 gammaCorrect(vec3 color) { return pow(color, vec3(1.0 / 2.2)); }
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Complete Code Template
|
|
175
|
+
|
|
176
|
+
Fully runnable Rayleigh + Mie atmospheric scattering for ShaderToy:
|
|
177
|
+
|
|
178
|
+
```glsl
|
|
179
|
+
#define PI 3.14159265359
|
|
180
|
+
|
|
181
|
+
#define PLANET_RADIUS 6371e3
|
|
182
|
+
#define ATMOS_RADIUS 6471e3
|
|
183
|
+
#define PLANET_CENTER vec3(0.0)
|
|
184
|
+
|
|
185
|
+
#define BETA_RAY vec3(5.5e-6, 13.0e-6, 22.4e-6)
|
|
186
|
+
#define BETA_MIE vec3(21e-6)
|
|
187
|
+
#define BETA_OZONE vec3(2.04e-5, 4.97e-5, 1.95e-6)
|
|
188
|
+
|
|
189
|
+
#define MIE_G 0.76
|
|
190
|
+
#define MIE_EXTINCTION 1.1
|
|
191
|
+
|
|
192
|
+
#define H_RAY 8e3
|
|
193
|
+
#define H_MIE 1.2e3
|
|
194
|
+
#define H_OZONE 30e3
|
|
195
|
+
#define OZONE_FALLOFF 4e3
|
|
196
|
+
|
|
197
|
+
#define PRIMARY_STEPS 32
|
|
198
|
+
#define LIGHT_STEPS 8
|
|
199
|
+
|
|
200
|
+
#define SUN_INTENSITY vec3(40.0)
|
|
201
|
+
|
|
202
|
+
vec2 raySphereIntersect(vec3 p, vec3 dir, float r) {
|
|
203
|
+
float b = dot(p, dir);
|
|
204
|
+
float c = dot(p, p) - r * r;
|
|
205
|
+
float d = b * b - c;
|
|
206
|
+
if (d < 0.0) return vec2(1e5, -1e5);
|
|
207
|
+
d = sqrt(d);
|
|
208
|
+
return vec2(-b - d, -b + d);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
float phaseRayleigh(float cosTheta) {
|
|
212
|
+
return 3.0 / (16.0 * PI) * (1.0 + cosTheta * cosTheta);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
float phaseMie(float cosTheta, float g) {
|
|
216
|
+
float gg = g * g;
|
|
217
|
+
float num = (1.0 - gg) * (1.0 + cosTheta * cosTheta);
|
|
218
|
+
float denom = (2.0 + gg) * pow(1.0 + gg - 2.0 * g * cosTheta, 1.5);
|
|
219
|
+
return 3.0 / (8.0 * PI) * num / denom;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
vec3 atmosphereDensity(vec3 pos) {
|
|
223
|
+
float height = length(pos - PLANET_CENTER) - PLANET_RADIUS;
|
|
224
|
+
float dRay = exp(-height / H_RAY);
|
|
225
|
+
float dMie = exp(-height / H_MIE);
|
|
226
|
+
float dOzone = (1.0 / (pow((H_OZONE - height) / OZONE_FALLOFF, 2.0) + 1.0)) * dRay;
|
|
227
|
+
return vec3(dRay, dMie, dOzone);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
vec3 calculateScattering(
|
|
231
|
+
vec3 start, vec3 dir, float maxDist,
|
|
232
|
+
vec3 sceneColor, vec3 sunDir, vec3 sunIntensity
|
|
233
|
+
) {
|
|
234
|
+
start -= PLANET_CENTER;
|
|
235
|
+
|
|
236
|
+
float a = dot(dir, dir);
|
|
237
|
+
float b = 2.0 * dot(dir, start);
|
|
238
|
+
float c = dot(start, start) - ATMOS_RADIUS * ATMOS_RADIUS;
|
|
239
|
+
float d = b * b - 4.0 * a * c;
|
|
240
|
+
if (d < 0.0) return sceneColor;
|
|
241
|
+
|
|
242
|
+
vec2 rayLen = vec2(
|
|
243
|
+
max((-b - sqrt(d)) / (2.0 * a), 0.0),
|
|
244
|
+
min((-b + sqrt(d)) / (2.0 * a), maxDist)
|
|
245
|
+
);
|
|
246
|
+
if (rayLen.x > rayLen.y) return sceneColor;
|
|
247
|
+
|
|
248
|
+
bool allowMie = maxDist > rayLen.y;
|
|
249
|
+
rayLen.y = min(rayLen.y, maxDist);
|
|
250
|
+
rayLen.x = max(rayLen.x, 0.0);
|
|
251
|
+
|
|
252
|
+
float stepSize = (rayLen.y - rayLen.x) / float(PRIMARY_STEPS);
|
|
253
|
+
float rayPos = rayLen.x + stepSize * 0.5;
|
|
254
|
+
|
|
255
|
+
vec3 totalRay = vec3(0.0);
|
|
256
|
+
vec3 totalMie = vec3(0.0);
|
|
257
|
+
vec3 optI = vec3(0.0);
|
|
258
|
+
|
|
259
|
+
float mu = dot(dir, sunDir);
|
|
260
|
+
float phaseR = phaseRayleigh(mu);
|
|
261
|
+
float phaseM = allowMie ? phaseMie(mu, MIE_G) : 0.0;
|
|
262
|
+
|
|
263
|
+
for (int i = 0; i < PRIMARY_STEPS; i++) {
|
|
264
|
+
vec3 pos = start + dir * rayPos;
|
|
265
|
+
float height = length(pos) - PLANET_RADIUS;
|
|
266
|
+
|
|
267
|
+
vec3 density = vec3(exp(-height / H_RAY), exp(-height / H_MIE), 0.0);
|
|
268
|
+
float dOzone = (H_OZONE - height) / OZONE_FALLOFF;
|
|
269
|
+
density.z = (1.0 / (dOzone * dOzone + 1.0)) * density.x;
|
|
270
|
+
density *= stepSize;
|
|
271
|
+
optI += density;
|
|
272
|
+
|
|
273
|
+
float la = dot(sunDir, sunDir);
|
|
274
|
+
float lb = 2.0 * dot(sunDir, pos);
|
|
275
|
+
float lc = dot(pos, pos) - ATMOS_RADIUS * ATMOS_RADIUS;
|
|
276
|
+
float ld = lb * lb - 4.0 * la * lc;
|
|
277
|
+
float lightStepSize = (-lb + sqrt(ld)) / (2.0 * la * float(LIGHT_STEPS));
|
|
278
|
+
float lightPos = lightStepSize * 0.5;
|
|
279
|
+
vec3 optL = vec3(0.0);
|
|
280
|
+
|
|
281
|
+
for (int j = 0; j < LIGHT_STEPS; j++) {
|
|
282
|
+
vec3 posL = pos + sunDir * lightPos;
|
|
283
|
+
float heightL = length(posL) - PLANET_RADIUS;
|
|
284
|
+
vec3 densityL = vec3(exp(-heightL / H_RAY), exp(-heightL / H_MIE), 0.0);
|
|
285
|
+
float dOzoneL = (H_OZONE - heightL) / OZONE_FALLOFF;
|
|
286
|
+
densityL.z = (1.0 / (dOzoneL * dOzoneL + 1.0)) * densityL.x;
|
|
287
|
+
densityL *= lightStepSize;
|
|
288
|
+
optL += densityL;
|
|
289
|
+
lightPos += lightStepSize;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
vec3 attn = exp(
|
|
293
|
+
-BETA_RAY * (optI.x + optL.x)
|
|
294
|
+
- BETA_MIE * MIE_EXTINCTION * (optI.y + optL.y)
|
|
295
|
+
- BETA_OZONE * (optI.z + optL.z)
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
totalRay += density.x * attn;
|
|
299
|
+
totalMie += density.y * attn;
|
|
300
|
+
|
|
301
|
+
rayPos += stepSize;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
vec3 opacity = exp(-(BETA_MIE * optI.y + BETA_RAY * optI.x + BETA_OZONE * optI.z));
|
|
305
|
+
|
|
306
|
+
return (
|
|
307
|
+
phaseR * BETA_RAY * totalRay +
|
|
308
|
+
phaseM * BETA_MIE * totalMie
|
|
309
|
+
) * sunIntensity + sceneColor * opacity;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
vec3 getCameraVector(vec3 resolution, vec2 coord) {
|
|
313
|
+
vec2 uv = coord.xy / resolution.xy - vec2(0.5);
|
|
314
|
+
uv.x *= resolution.x / resolution.y;
|
|
315
|
+
return normalize(vec3(uv.x, uv.y, -1.0));
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
319
|
+
vec3 rayDir = getCameraVector(iResolution, fragCoord);
|
|
320
|
+
vec3 cameraPos = vec3(0.0, PLANET_RADIUS + 100.0, 0.0);
|
|
321
|
+
vec3 sunDir = normalize(vec3(0.0, cos(-iTime / 8.0), sin(-iTime / 8.0)));
|
|
322
|
+
|
|
323
|
+
vec4 scene = vec4(0.0, 0.0, 0.0, 1e12);
|
|
324
|
+
vec3 sunDisk = vec3(dot(rayDir, sunDir) > 0.9998 ? 3.0 : 0.0);
|
|
325
|
+
scene.xyz = sunDisk;
|
|
326
|
+
|
|
327
|
+
vec2 groundHit = raySphereIntersect(cameraPos - PLANET_CENTER, rayDir, PLANET_RADIUS);
|
|
328
|
+
if (groundHit.x > 0.0) {
|
|
329
|
+
scene.w = groundHit.x;
|
|
330
|
+
vec3 hitPos = cameraPos + rayDir * groundHit.x - PLANET_CENTER;
|
|
331
|
+
vec3 normal = normalize(hitPos);
|
|
332
|
+
float shadow = max(0.0, dot(normal, sunDir));
|
|
333
|
+
scene.xyz = vec3(0.1, 0.15, 0.08) * shadow;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
vec3 col = calculateScattering(
|
|
337
|
+
cameraPos, rayDir, scene.w,
|
|
338
|
+
scene.xyz, sunDir, SUN_INTENSITY
|
|
339
|
+
);
|
|
340
|
+
|
|
341
|
+
col = 1.0 - exp(-col);
|
|
342
|
+
col = pow(col, vec3(1.0 / 2.2));
|
|
343
|
+
|
|
344
|
+
fragColor = vec4(col, 1.0);
|
|
345
|
+
}
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Advanced Fog Models
|
|
349
|
+
|
|
350
|
+
Three progressive fog techniques, from simple to physically motivated. These can be used standalone or combined with the full atmospheric scattering above.
|
|
351
|
+
|
|
352
|
+
### Level 1: Basic Exponential Fog
|
|
353
|
+
```glsl
|
|
354
|
+
vec3 applyFog(vec3 col, float t) {
|
|
355
|
+
float fogAmount = 1.0 - exp(-t * density);
|
|
356
|
+
vec3 fogColor = vec3(0.5, 0.6, 0.7);
|
|
357
|
+
return mix(col, fogColor, fogAmount);
|
|
358
|
+
}
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### Level 2: Sun-Aware Fog (Scattering Tint)
|
|
362
|
+
Fog color shifts warm when looking toward the sun — creates a very natural light dispersion effect:
|
|
363
|
+
```glsl
|
|
364
|
+
vec3 applyFogSun(vec3 col, float t, vec3 rd, vec3 sunDir) {
|
|
365
|
+
float fogAmount = 1.0 - exp(-t * density);
|
|
366
|
+
float sunAmount = max(dot(rd, sunDir), 0.0);
|
|
367
|
+
vec3 fogColor = mix(
|
|
368
|
+
vec3(0.5, 0.6, 0.7), // base fog (blue-grey)
|
|
369
|
+
vec3(1.0, 0.9, 0.7), // sun-facing fog (warm gold)
|
|
370
|
+
pow(sunAmount, 8.0)
|
|
371
|
+
);
|
|
372
|
+
return mix(col, fogColor, fogAmount);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### Level 3: Height-Based Fog (Analytical Integration)
|
|
377
|
+
Density decreases exponentially with altitude: `d(y) = a * exp(-b * y)`. The formula is an exact analytical integral along the ray, not an approximation — fog pools in valleys and clears at altitude:
|
|
378
|
+
```glsl
|
|
379
|
+
vec3 applyFogHeight(vec3 col, float t, vec3 ro, vec3 rd) {
|
|
380
|
+
float a = 0.5; // density multiplier
|
|
381
|
+
float b = 0.3; // density falloff with height
|
|
382
|
+
float fogAmount = (a / b) * exp(-ro.y * b) * (1.0 - exp(-t * rd.y * b)) / rd.y;
|
|
383
|
+
fogAmount = clamp(fogAmount, 0.0, 1.0);
|
|
384
|
+
vec3 fogColor = vec3(0.5, 0.6, 0.7);
|
|
385
|
+
return mix(col, fogColor, fogAmount);
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Level 4: Extinction + Inscattering Separation
|
|
390
|
+
Independent RGB coefficients for absorption and scattering — allows chromatic fog effects where different wavelengths scatter differently:
|
|
391
|
+
```glsl
|
|
392
|
+
vec3 applyFogPhysical(vec3 col, float t, vec3 fogCol) {
|
|
393
|
+
vec3 be = vec3(0.02, 0.025, 0.03); // extinction coefficients (RGB)
|
|
394
|
+
vec3 bi = vec3(0.015, 0.02, 0.025); // inscattering coefficients (RGB)
|
|
395
|
+
vec3 extinction = exp(-t * be);
|
|
396
|
+
vec3 inscatter = (1.0 - exp(-t * bi));
|
|
397
|
+
return col * extinction + fogCol * inscatter;
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Common Variants
|
|
402
|
+
|
|
403
|
+
### Variant 1: Non-Physical Analytic Approximation (No Ray March)
|
|
404
|
+
|
|
405
|
+
Extremely low-cost analytic sky, suitable for mobile / backgrounds.
|
|
406
|
+
|
|
407
|
+
```glsl
|
|
408
|
+
#define zenithDensity(x) 0.7 / pow(max(x - 0.1, 0.0035), 0.75)
|
|
409
|
+
|
|
410
|
+
vec3 getSkyAbsorption(vec3 skyColor, float zenith) {
|
|
411
|
+
return exp2(skyColor * -zenith) * 2.0;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
float getMie(vec2 p, vec2 lp) {
|
|
415
|
+
float disk = clamp(1.0 - pow(distance(p, lp), 0.1), 0.0, 1.0);
|
|
416
|
+
return disk * disk * (3.0 - 2.0 * disk) * 2.0 * 3.14159;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
vec3 getAtmosphericScattering(vec2 screenPos, vec2 lightPos) {
|
|
420
|
+
vec3 skyColor = vec3(0.39, 0.57, 1.0);
|
|
421
|
+
float zenith = zenithDensity(screenPos.y);
|
|
422
|
+
float rayleighMult = 1.0 + pow(1.0 - clamp(distance(screenPos, lightPos), 0.0, 1.0), 2.0) * 1.57;
|
|
423
|
+
vec3 absorption = getSkyAbsorption(skyColor, zenith);
|
|
424
|
+
vec3 sunAbsorption = getSkyAbsorption(skyColor, zenithDensity(lightPos.y + 0.1));
|
|
425
|
+
vec3 sky = skyColor * zenith * rayleighMult;
|
|
426
|
+
vec3 mie = getMie(screenPos, lightPos) * sunAbsorption;
|
|
427
|
+
float sunDist = clamp(length(max(lightPos.y + 0.1, 0.0)), 0.0, 1.0);
|
|
428
|
+
vec3 totalSky = mix(sky * absorption, sky / (sky + 0.5), sunDist);
|
|
429
|
+
totalSky += mie;
|
|
430
|
+
totalSky *= sunAbsorption * 0.5 + 0.5 * length(sunAbsorption);
|
|
431
|
+
return totalSky;
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Variant 2: Ozone Absorption Layer
|
|
436
|
+
|
|
437
|
+
Already integrated in the complete template. Set `BETA_OZONE` to a non-zero value to enable, producing a deeper blue zenith and purple tones at sunset.
|
|
438
|
+
|
|
439
|
+
### Variant 3: Subsurface Scattering (SSS)
|
|
440
|
+
|
|
441
|
+
For translucent materials (candles/skin/jelly), using SDF-estimated thickness to control light transmission.
|
|
442
|
+
|
|
443
|
+
```glsl
|
|
444
|
+
float subsurface(vec3 p, vec3 viewDir, vec3 normal) {
|
|
445
|
+
vec3 scatterDir = refract(viewDir, normal, 1.0 / 1.5); // IOR 1.3~2.0
|
|
446
|
+
vec3 samplePos = p;
|
|
447
|
+
float accumThickness = 0.0;
|
|
448
|
+
float MAX_SCATTER = 2.5;
|
|
449
|
+
for (float i = 0.1; i < MAX_SCATTER; i += 0.2) {
|
|
450
|
+
samplePos += scatterDir * i;
|
|
451
|
+
accumThickness += map(samplePos); // SDF function
|
|
452
|
+
}
|
|
453
|
+
float thickness = max(0.0, -accumThickness);
|
|
454
|
+
float SCATTER_STRENGTH = 16.0;
|
|
455
|
+
return SCATTER_STRENGTH * pow(MAX_SCATTER * 0.5, 3.0) / thickness;
|
|
456
|
+
}
|
|
457
|
+
// Usage: float ss = max(0.0, subsurface(hitPos, viewDir, normal));
|
|
458
|
+
// vec3 sssColor = albedo * smoothstep(0.0, 2.0, pow(ss, 0.6));
|
|
459
|
+
// finalColor = mix(lambertian, sssColor, 0.7) + specular;
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Variant 4: LUT Precomputation Pipeline (Production Grade)
|
|
463
|
+
|
|
464
|
+
Precompute Transmittance/Multiple Scattering/Sky-View into LUTs, only table lookups at runtime.
|
|
465
|
+
|
|
466
|
+
```glsl
|
|
467
|
+
// Transmittance LUT query (Hillaire 2020)
|
|
468
|
+
vec3 getValFromTLUT(sampler2D tex, vec2 bufferRes, vec3 pos, vec3 sunDir) {
|
|
469
|
+
float height = length(pos);
|
|
470
|
+
vec3 up = pos / height;
|
|
471
|
+
float sunCosZenithAngle = dot(sunDir, up);
|
|
472
|
+
vec2 uv = vec2(
|
|
473
|
+
256.0 * clamp(0.5 + 0.5 * sunCosZenithAngle, 0.0, 1.0),
|
|
474
|
+
64.0 * max(0.0, min(1.0, (height - groundRadiusMM) / (atmosphereRadiusMM - groundRadiusMM)))
|
|
475
|
+
);
|
|
476
|
+
uv /= bufferRes;
|
|
477
|
+
return texture(tex, uv).rgb;
|
|
478
|
+
}
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Variant 5: Analytic Fast Atmosphere (with Aerial Perspective)
|
|
482
|
+
|
|
483
|
+
Analytic exponential approximation replacing ray march, with distance attenuation support.
|
|
484
|
+
|
|
485
|
+
```glsl
|
|
486
|
+
void getRayleighMie(float opticalDepth, float densityR, float densityM, out vec3 R, out vec3 M) {
|
|
487
|
+
vec3 C_RAYLEIGH = vec3(5.802, 13.558, 33.100) * 1e-6;
|
|
488
|
+
vec3 C_MIE = vec3(3.996e-6);
|
|
489
|
+
R = (1.0 - exp(-opticalDepth * densityR * C_RAYLEIGH / 2.5)) * 2.5;
|
|
490
|
+
M = (1.0 - exp(-opticalDepth * densityM * C_MIE / 0.5)) * 0.5;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
vec3 getLightTransmittance(vec3 lightDir) {
|
|
494
|
+
vec3 C_RAYLEIGH = vec3(5.802, 13.558, 33.100) * 1e-6;
|
|
495
|
+
vec3 C_MIE = vec3(3.996e-6);
|
|
496
|
+
vec3 C_OZONE = vec3(0.650, 1.881, 0.085) * 1e-6;
|
|
497
|
+
float extinction = exp(-clamp(lightDir.y + 0.05, 0.0, 1.0) * 40.0)
|
|
498
|
+
+ exp(-clamp(lightDir.y + 0.5, 0.0, 1.0) * 5.0) * 0.4
|
|
499
|
+
+ pow(clamp(1.0 - lightDir.y, 0.0, 1.0), 2.0) * 0.02
|
|
500
|
+
+ 0.002;
|
|
501
|
+
return exp(-(C_RAYLEIGH + C_MIE + C_OZONE) * extinction * 1e6);
|
|
502
|
+
}
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
## Performance & Composition
|
|
506
|
+
|
|
507
|
+
### Performance Tips
|
|
508
|
+
- **Nested ray march (O(N*M))**: reduce step counts (mobile: PRIMARY=12, LIGHT=4), use analytic approximation instead of light march, precompute Transmittance LUT
|
|
509
|
+
- **Dense exp()/pow()**: Schlick approximation replacing HG phase function — `k = 1.55*g - 0.55*g³; phase = (1-k²) / (4π*(1+k*cosθ)²)`
|
|
510
|
+
- **Full-screen per-pixel**: Sky-View LUT (200x200) table lookup, half-resolution rendering + bilinear upsampling
|
|
511
|
+
- **Banding dithering**: non-uniform step offset of 0.3, temporal blue noise dithering
|
|
512
|
+
|
|
513
|
+
### Composition Tips
|
|
514
|
+
- **+ Volumetric clouds**: atmospheric transmittance determines sun color reaching the cloud layer, set `maxDist` to cloud distance
|
|
515
|
+
- **+ SDF scene**: SDF hit distance → `maxDist`, scene color → `sceneColor`, automatic aerial perspective
|
|
516
|
+
- **+ God Rays**: add occlusion to scattering integration (shadow map or additional ray march)
|
|
517
|
+
- **+ Terrain**: `finalColor = terrainColor * transmittance + inscattering`
|
|
518
|
+
- **+ PBR/SSS**: `diffuse = mix(lambert, sss, 0.7); final = ambient + albedo*diffuse + specular + fresnel*env`
|
|
519
|
+
|
|
520
|
+
## Further Reading
|
|
521
|
+
|
|
522
|
+
For full step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/atmospheric-scattering.md)
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Camera & Lens Effects
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
- Adding cinematic depth of field (bokeh blur)
|
|
5
|
+
- Motion blur for dynamic scenes
|
|
6
|
+
- Lens distortion and chromatic aberration
|
|
7
|
+
- Film grain and photographic realism
|
|
8
|
+
|
|
9
|
+
## Techniques
|
|
10
|
+
|
|
11
|
+
### 1. Depth of Field (Thin Lens Model)
|
|
12
|
+
|
|
13
|
+
Simulate camera aperture by jittering ray origins on a virtual lens disk:
|
|
14
|
+
```glsl
|
|
15
|
+
// For each sample:
|
|
16
|
+
vec2 lens = randomDisk(seed) * apertureSize; // random point on aperture
|
|
17
|
+
vec3 focalPoint = ro + rd * focalDistance; // point on focal plane
|
|
18
|
+
vec3 newRo = ro + cameraRight * lens.x + cameraUp * lens.y; // offset origin
|
|
19
|
+
vec3 newRd = normalize(focalPoint - newRo); // new ray toward focal point
|
|
20
|
+
|
|
21
|
+
// Accumulate multiple samples (16-64) for smooth bokeh
|
|
22
|
+
// Use with AA loop or temporal accumulation
|
|
23
|
+
|
|
24
|
+
// Disk sampling helper:
|
|
25
|
+
vec2 randomDisk(float seed) {
|
|
26
|
+
float angle = hash11(seed) * 6.2831853;
|
|
27
|
+
float radius = sqrt(hash11(seed + 1.0));
|
|
28
|
+
return vec2(cos(angle), sin(angle)) * radius;
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Parameters:
|
|
33
|
+
- `apertureSize`: 0.0 = pinhole (sharp), 0.1-0.5 = visible bokeh
|
|
34
|
+
- `focalDistance`: distance to the in-focus plane
|
|
35
|
+
|
|
36
|
+
### 2. Post-Process Depth of Field (Single Pass)
|
|
37
|
+
|
|
38
|
+
Cheaper approximation using depth buffer blur:
|
|
39
|
+
```glsl
|
|
40
|
+
vec3 dofPostProcess(sampler2D colorTex, sampler2D depthTex, vec2 uv) {
|
|
41
|
+
float depth = texture(depthTex, uv).r;
|
|
42
|
+
float coc = abs(depth - focalDepth) * apertureSize; // circle of confusion
|
|
43
|
+
coc = clamp(coc, 0.0, maxBlur);
|
|
44
|
+
|
|
45
|
+
vec3 color = vec3(0.0);
|
|
46
|
+
float total = 0.0;
|
|
47
|
+
// 16-tap Poisson disk sampling
|
|
48
|
+
for (int i = 0; i < 16; i++) {
|
|
49
|
+
vec2 offset = poissonDisk[i] * coc / iResolution.xy;
|
|
50
|
+
color += texture(colorTex, uv + offset).rgb;
|
|
51
|
+
total += 1.0;
|
|
52
|
+
}
|
|
53
|
+
return color / total;
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 3. Motion Blur (Velocity-Based)
|
|
58
|
+
|
|
59
|
+
```glsl
|
|
60
|
+
// Simple radial motion blur (camera rotation)
|
|
61
|
+
vec3 motionBlur(vec2 uv, float amount) {
|
|
62
|
+
vec3 color = vec3(0.0);
|
|
63
|
+
vec2 center = vec2(0.5);
|
|
64
|
+
int samples = 8;
|
|
65
|
+
for (int i = 0; i < samples; i++) {
|
|
66
|
+
float t = float(i) / float(samples - 1) - 0.5;
|
|
67
|
+
vec2 sampleUV = mix(uv, center, t * amount);
|
|
68
|
+
color += texture(iChannel0, sampleUV).rgb;
|
|
69
|
+
}
|
|
70
|
+
return color / float(samples);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Time-based motion blur for ray marching
|
|
74
|
+
// Sample multiple time offsets within the frame:
|
|
75
|
+
// float t_shutter = iTime + (hash11(seed) - 0.5) * shutterSpeed;
|
|
76
|
+
// Use t_shutter instead of iTime for scene animation
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 4. Lens Distortion
|
|
80
|
+
|
|
81
|
+
```glsl
|
|
82
|
+
// Barrel/pincushion distortion
|
|
83
|
+
vec2 lensDistortion(vec2 uv, float k1, float k2) {
|
|
84
|
+
vec2 centered = uv - 0.5;
|
|
85
|
+
float r2 = dot(centered, centered);
|
|
86
|
+
float distortion = 1.0 + k1 * r2 + k2 * r2 * r2;
|
|
87
|
+
return centered * distortion + 0.5;
|
|
88
|
+
// k1 > 0: pincushion, k1 < 0: barrel
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 5. Film Grain
|
|
93
|
+
|
|
94
|
+
```glsl
|
|
95
|
+
vec3 filmGrain(vec3 color, vec2 uv, float time, float intensity) {
|
|
96
|
+
float grain = hash12(uv * iResolution.xy + fract(time) * 1000.0) - 0.5;
|
|
97
|
+
// Apply more grain in darker areas (realistic film response)
|
|
98
|
+
float luminance = dot(color, vec3(0.299, 0.587, 0.114));
|
|
99
|
+
float grainAmount = intensity * (1.0 - luminance * 0.5);
|
|
100
|
+
return color + grain * grainAmount;
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 6. Vignette
|
|
105
|
+
|
|
106
|
+
```glsl
|
|
107
|
+
vec3 vignette(vec3 color, vec2 uv, float intensity, float smoothness) {
|
|
108
|
+
vec2 centered = uv - 0.5;
|
|
109
|
+
float dist = length(centered);
|
|
110
|
+
float vig = smoothstep(0.5, 0.5 - smoothness, dist);
|
|
111
|
+
return color * mix(1.0 - intensity, 1.0, vig);
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
→ For deeper details, see [reference/camera-effects.md](../reference/camera-effects.md)
|