@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,776 @@
|
|
|
1
|
+
# SDF Soft Shadow Techniques
|
|
2
|
+
|
|
3
|
+
## Core Principles
|
|
4
|
+
|
|
5
|
+
March from the surface point toward the light source, using the **ratio of nearest distance to marching distance** to estimate penumbra width.
|
|
6
|
+
|
|
7
|
+
### Key Formulas
|
|
8
|
+
|
|
9
|
+
Classic formula: `shadow = min(shadow, k * h / t)`
|
|
10
|
+
- `h` = SDF value at current position, `t` = distance traveled, `k` = penumbra hardness
|
|
11
|
+
|
|
12
|
+
Improved formula (geometric triangulation) — eliminates sharp edge banding artifacts:
|
|
13
|
+
```
|
|
14
|
+
y = h² / (2 * ph) // ph = SDF value from previous step
|
|
15
|
+
d = sqrt(h² - y²) // true closest distance perpendicular to the ray
|
|
16
|
+
shadow = min(shadow, d / (w * max(0, t - y)))
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Negative extension — allows `res` to drop to -1, remapped with a C1 continuous function to eliminate hard creases:
|
|
20
|
+
```
|
|
21
|
+
res = max(res, -1.0)
|
|
22
|
+
shadow = 0.25 * (1 + res)² * (2 - res)
|
|
23
|
+
```
|
|
24
|
+
This is equivalent to `smoothstep` over [-1, 1] instead of [0, 1]. The step size is clamped with `clamp(h, 0.005, 0.50)` to ensure the ray penetrates slightly into geometry, capturing both outer and inner penumbra. This produces results close to ground truth for varying light sizes.
|
|
25
|
+
|
|
26
|
+
## Implementation Steps
|
|
27
|
+
|
|
28
|
+
### Step 1: Scene SDF
|
|
29
|
+
|
|
30
|
+
```glsl
|
|
31
|
+
float sdSphere(vec3 p, float r) { return length(p) - r; }
|
|
32
|
+
float sdPlane(vec3 p) { return p.y; }
|
|
33
|
+
float sdRoundBox(vec3 p, vec3 b, float r) {
|
|
34
|
+
vec3 q = abs(p) - b;
|
|
35
|
+
return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - r;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
float map(vec3 p) {
|
|
39
|
+
float d = sdPlane(p);
|
|
40
|
+
d = min(d, sdSphere(p - vec3(0.0, 0.5, 0.0), 0.5));
|
|
41
|
+
d = min(d, sdRoundBox(p - vec3(-1.2, 0.3, 0.5), vec3(0.3), 0.05));
|
|
42
|
+
return d;
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Step 2: Classic Soft Shadow
|
|
47
|
+
|
|
48
|
+
```glsl
|
|
49
|
+
// Classic SDF soft shadow
|
|
50
|
+
float calcSoftShadow(vec3 ro, vec3 rd, float mint, float tmax) {
|
|
51
|
+
float res = 1.0;
|
|
52
|
+
float t = mint;
|
|
53
|
+
for (int i = 0; i < MAX_SHADOW_STEPS; i++) {
|
|
54
|
+
float h = map(ro + rd * t);
|
|
55
|
+
float s = clamp(SHADOW_K * h / t, 0.0, 1.0);
|
|
56
|
+
res = min(res, s);
|
|
57
|
+
t += clamp(h, MIN_STEP, MAX_STEP);
|
|
58
|
+
if (res < 0.004 || t > tmax) break;
|
|
59
|
+
}
|
|
60
|
+
res = clamp(res, 0.0, 1.0);
|
|
61
|
+
return res * res * (3.0 - 2.0 * res); // smoothstep smoothing
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Step 3: Improved Soft Shadow (Geometric Triangulation)
|
|
66
|
+
|
|
67
|
+
```glsl
|
|
68
|
+
// Improved version - geometric triangulation using adjacent SDF values
|
|
69
|
+
float calcSoftShadowImproved(vec3 ro, vec3 rd, float mint, float tmax, float w) {
|
|
70
|
+
float res = 1.0;
|
|
71
|
+
float t = mint;
|
|
72
|
+
float ph = 1e10;
|
|
73
|
+
for (int i = 0; i < MAX_SHADOW_STEPS; i++) {
|
|
74
|
+
float h = map(ro + rd * t);
|
|
75
|
+
float y = h * h / (2.0 * ph);
|
|
76
|
+
float d = sqrt(h * h - y * y);
|
|
77
|
+
res = min(res, d / (w * max(0.0, t - y)));
|
|
78
|
+
ph = h;
|
|
79
|
+
t += h;
|
|
80
|
+
if (res < 0.0001 || t > tmax) break;
|
|
81
|
+
}
|
|
82
|
+
res = clamp(res, 0.0, 1.0);
|
|
83
|
+
return res * res * (3.0 - 2.0 * res);
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Step 4: Negative Extension (Smoothest Penumbra)
|
|
88
|
+
|
|
89
|
+
```glsl
|
|
90
|
+
// Negative extension - allows res to go negative for C1 continuous penumbra
|
|
91
|
+
float calcSoftShadowSmooth(vec3 ro, vec3 rd, float mint, float tmax, float w) {
|
|
92
|
+
float res = 1.0;
|
|
93
|
+
float t = mint;
|
|
94
|
+
for (int i = 0; i < MAX_SHADOW_STEPS; i++) {
|
|
95
|
+
float h = map(ro + rd * t);
|
|
96
|
+
res = min(res, h / (w * t));
|
|
97
|
+
t += clamp(h, MIN_STEP, MAX_STEP);
|
|
98
|
+
if (res < -1.0 || t > tmax) break;
|
|
99
|
+
}
|
|
100
|
+
res = max(res, -1.0);
|
|
101
|
+
return 0.25 * (1.0 + res) * (1.0 + res) * (2.0 - res);
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Step 5: Bounding Volume Optimization
|
|
106
|
+
|
|
107
|
+
```glsl
|
|
108
|
+
// plane clipping -- clip the ray to the scene's upper bound
|
|
109
|
+
float tp = (SCENE_Y_MAX - ro.y) / rd.y;
|
|
110
|
+
if (tp > 0.0) tmax = min(tmax, tp);
|
|
111
|
+
|
|
112
|
+
// AABB bounding box clipping
|
|
113
|
+
vec2 iBox(vec3 ro, vec3 rd, vec3 rad) {
|
|
114
|
+
vec3 m = 1.0 / rd;
|
|
115
|
+
vec3 n = m * ro;
|
|
116
|
+
vec3 k = abs(m) * rad;
|
|
117
|
+
vec3 t1 = -n - k;
|
|
118
|
+
vec3 t2 = -n + k;
|
|
119
|
+
float tN = max(max(t1.x, t1.y), t1.z);
|
|
120
|
+
float tF = min(min(t2.x, t2.y), t2.z);
|
|
121
|
+
if (tN > tF || tF < 0.0) return vec2(-1.0);
|
|
122
|
+
return vec2(tN, tF);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// usage: return 1.0 immediately if the ray misses the bounding box entirely
|
|
126
|
+
vec2 dis = iBox(ro, rd, BOUND_SIZE);
|
|
127
|
+
if (dis.y < 0.0) return 1.0;
|
|
128
|
+
tmin = max(tmin, dis.x);
|
|
129
|
+
tmax = min(tmax, dis.y);
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Step 6: Shadow Color Rendering
|
|
133
|
+
|
|
134
|
+
```glsl
|
|
135
|
+
// Classic colored shadow
|
|
136
|
+
vec3 shadowColor = vec3(sha, sha * sha * 0.5 + 0.5 * sha, sha * sha);
|
|
137
|
+
|
|
138
|
+
// per-channel power (penumbra region shifts warm)
|
|
139
|
+
vec3 shadowColor = pow(vec3(sha), vec3(1.0, 1.2, 1.5));
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
### Step 7: Integration with Lighting Model
|
|
143
|
+
|
|
144
|
+
```glsl
|
|
145
|
+
vec3 sunDir = normalize(vec3(-0.5, 0.4, -0.6));
|
|
146
|
+
vec3 hal = normalize(sunDir - rd);
|
|
147
|
+
|
|
148
|
+
float dif = clamp(dot(nor, sunDir), 0.0, 1.0);
|
|
149
|
+
if (dif > 0.0001)
|
|
150
|
+
dif *= calcSoftShadow(pos + nor * 0.01, sunDir, 0.02, 8.0);
|
|
151
|
+
|
|
152
|
+
float spe = pow(clamp(dot(nor, hal), 0.0, 1.0), 16.0);
|
|
153
|
+
spe *= dif;
|
|
154
|
+
|
|
155
|
+
vec3 col = vec3(0.0);
|
|
156
|
+
col += albedo * 2.0 * dif * vec3(1.0, 0.9, 0.8);
|
|
157
|
+
col += 5.0 * spe * vec3(1.0, 0.9, 0.8);
|
|
158
|
+
col += albedo * 0.5 * clamp(0.5 + 0.5 * nor.y, 0.0, 1.0) * vec3(0.4, 0.6, 1.0);
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Complete Code Template
|
|
162
|
+
|
|
163
|
+
Runs directly in ShaderToy, with A/B comparison of three soft shadow techniques.
|
|
164
|
+
|
|
165
|
+
```glsl
|
|
166
|
+
#define ZERO (min(iFrame, 0))
|
|
167
|
+
|
|
168
|
+
// ---- Adjustable Parameters ----
|
|
169
|
+
#define MAX_MARCH_STEPS 128
|
|
170
|
+
#define MAX_SHADOW_STEPS 64 // 16~128
|
|
171
|
+
#define SHADOW_K 8.0 // 4~64, higher = harder
|
|
172
|
+
#define SHADOW_MINT 0.02 // 0.01~0.05
|
|
173
|
+
#define SHADOW_TMAX 8.0
|
|
174
|
+
#define SHADOW_MIN_STEP 0.01
|
|
175
|
+
#define SHADOW_MAX_STEP 0.20
|
|
176
|
+
#define SHADOW_W 0.10 // improved version penumbra width
|
|
177
|
+
|
|
178
|
+
// 0=classic, 1=improved(Aaltonen), 2=negative extension
|
|
179
|
+
#define SHADOW_TECHNIQUE 0
|
|
180
|
+
|
|
181
|
+
// ---- SDF Primitives ----
|
|
182
|
+
float sdSphere(vec3 p, float r) { return length(p) - r; }
|
|
183
|
+
float sdPlane(vec3 p) { return p.y; }
|
|
184
|
+
float sdRoundBox(vec3 p, vec3 b, float r) {
|
|
185
|
+
vec3 q = abs(p) - b;
|
|
186
|
+
return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - r;
|
|
187
|
+
}
|
|
188
|
+
float sdTorus(vec3 p, vec2 t) {
|
|
189
|
+
vec2 q = vec2(length(p.xz) - t.x, p.y);
|
|
190
|
+
return length(q) - t.y;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ---- Scene SDF ----
|
|
194
|
+
float map(vec3 p) {
|
|
195
|
+
float d = sdPlane(p);
|
|
196
|
+
d = min(d, sdSphere(p - vec3(0.0, 0.5, 0.0), 0.5));
|
|
197
|
+
d = min(d, sdRoundBox(p - vec3(-1.2, 0.30, 0.5), vec3(0.25), 0.05));
|
|
198
|
+
d = min(d, sdTorus(p - vec3(1.2, 0.25, -0.3), vec2(0.40, 0.08)));
|
|
199
|
+
return d;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ---- Normal ----
|
|
203
|
+
vec3 calcNormal(vec3 p) {
|
|
204
|
+
vec2 e = vec2(0.0005, 0.0);
|
|
205
|
+
return normalize(vec3(
|
|
206
|
+
map(p + e.xyy) - map(p - e.xyy),
|
|
207
|
+
map(p + e.yxy) - map(p - e.yxy),
|
|
208
|
+
map(p + e.yyx) - map(p - e.yyx)));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ---- Raymarching ----
|
|
212
|
+
float castRay(vec3 ro, vec3 rd) {
|
|
213
|
+
float t = 0.0;
|
|
214
|
+
for (int i = ZERO; i < MAX_MARCH_STEPS; i++) {
|
|
215
|
+
float h = map(ro + rd * t);
|
|
216
|
+
if (h < 0.0002) return t;
|
|
217
|
+
t += h;
|
|
218
|
+
if (t > 20.0) break;
|
|
219
|
+
}
|
|
220
|
+
return -1.0;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// ---- Bounding Volume Clipping ----
|
|
224
|
+
float clipTmax(vec3 ro, vec3 rd, float tmax, float yMax) {
|
|
225
|
+
float tp = (yMax - ro.y) / rd.y;
|
|
226
|
+
if (tp > 0.0) tmax = min(tmax, tp);
|
|
227
|
+
return tmax;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// ---- Shadow: Classic ----
|
|
231
|
+
float softShadowClassic(vec3 ro, vec3 rd, float mint, float tmax) {
|
|
232
|
+
tmax = clipTmax(ro, rd, tmax, 1.5);
|
|
233
|
+
float res = 1.0, t = mint;
|
|
234
|
+
for (int i = ZERO; i < MAX_SHADOW_STEPS; i++) {
|
|
235
|
+
float h = map(ro + rd * t);
|
|
236
|
+
float s = clamp(SHADOW_K * h / t, 0.0, 1.0);
|
|
237
|
+
res = min(res, s);
|
|
238
|
+
t += clamp(h, SHADOW_MIN_STEP, SHADOW_MAX_STEP);
|
|
239
|
+
if (res < 0.004 || t > tmax) break;
|
|
240
|
+
}
|
|
241
|
+
res = clamp(res, 0.0, 1.0);
|
|
242
|
+
return res * res * (3.0 - 2.0 * res);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// ---- Shadow: Improved ----
|
|
246
|
+
float softShadowImproved(vec3 ro, vec3 rd, float mint, float tmax, float w) {
|
|
247
|
+
tmax = clipTmax(ro, rd, tmax, 1.5);
|
|
248
|
+
float res = 1.0, t = mint, ph = 1e10;
|
|
249
|
+
for (int i = ZERO; i < MAX_SHADOW_STEPS; i++) {
|
|
250
|
+
float h = map(ro + rd * t);
|
|
251
|
+
float y = h * h / (2.0 * ph);
|
|
252
|
+
float d = sqrt(h * h - y * y);
|
|
253
|
+
res = min(res, d / (w * max(0.0, t - y)));
|
|
254
|
+
ph = h;
|
|
255
|
+
t += h;
|
|
256
|
+
if (res < 0.0001 || t > tmax) break;
|
|
257
|
+
}
|
|
258
|
+
res = clamp(res, 0.0, 1.0);
|
|
259
|
+
return res * res * (3.0 - 2.0 * res);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// ---- Shadow: Negative Extension ----
|
|
263
|
+
float softShadowSmooth(vec3 ro, vec3 rd, float mint, float tmax, float w) {
|
|
264
|
+
tmax = clipTmax(ro, rd, tmax, 1.5);
|
|
265
|
+
float res = 1.0, t = mint;
|
|
266
|
+
for (int i = ZERO; i < MAX_SHADOW_STEPS; i++) {
|
|
267
|
+
float h = map(ro + rd * t);
|
|
268
|
+
res = min(res, h / (w * t));
|
|
269
|
+
t += clamp(h, SHADOW_MIN_STEP, SHADOW_MAX_STEP);
|
|
270
|
+
if (res < -1.0 || t > tmax) break;
|
|
271
|
+
}
|
|
272
|
+
res = max(res, -1.0);
|
|
273
|
+
return 0.25 * (1.0 + res) * (1.0 + res) * (2.0 - res);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// ---- Unified Interface ----
|
|
277
|
+
float calcSoftShadow(vec3 ro, vec3 rd, float mint, float tmax) {
|
|
278
|
+
#if SHADOW_TECHNIQUE == 0
|
|
279
|
+
return softShadowClassic(ro, rd, mint, tmax);
|
|
280
|
+
#elif SHADOW_TECHNIQUE == 1
|
|
281
|
+
return softShadowImproved(ro, rd, mint, tmax, SHADOW_W);
|
|
282
|
+
#else
|
|
283
|
+
return softShadowSmooth(ro, rd, mint, tmax, SHADOW_W);
|
|
284
|
+
#endif
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ---- AO ----
|
|
288
|
+
float calcAO(vec3 p, vec3 n) {
|
|
289
|
+
float occ = 0.0, sca = 1.0;
|
|
290
|
+
for (int i = ZERO; i < 5; i++) {
|
|
291
|
+
float h = 0.01 + 0.12 * float(i) / 4.0;
|
|
292
|
+
float d = map(p + h * n);
|
|
293
|
+
occ += (h - d) * sca;
|
|
294
|
+
sca *= 0.95;
|
|
295
|
+
}
|
|
296
|
+
return clamp(1.0 - 3.0 * occ, 0.0, 1.0);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// ---- Checkerboard ----
|
|
300
|
+
float checkerboard(vec2 p) {
|
|
301
|
+
vec2 q = floor(p);
|
|
302
|
+
return mix(0.3, 1.0, mod(q.x + q.y, 2.0));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// ---- Render ----
|
|
306
|
+
vec3 render(vec3 ro, vec3 rd) {
|
|
307
|
+
vec3 col = vec3(0.7, 0.75, 0.85) - 0.3 * rd.y;
|
|
308
|
+
float t = castRay(ro, rd);
|
|
309
|
+
if (t < 0.0) return col;
|
|
310
|
+
|
|
311
|
+
vec3 pos = ro + rd * t;
|
|
312
|
+
vec3 nor = calcNormal(pos);
|
|
313
|
+
vec3 albedo = vec3(0.18);
|
|
314
|
+
if (pos.y < 0.001)
|
|
315
|
+
albedo = vec3(0.08 + 0.15 * checkerboard(pos.xz * 2.0));
|
|
316
|
+
|
|
317
|
+
vec3 sunDir = normalize(vec3(-0.5, 0.4, -0.6));
|
|
318
|
+
vec3 hal = normalize(sunDir - rd);
|
|
319
|
+
|
|
320
|
+
float dif = clamp(dot(nor, sunDir), 0.0, 1.0);
|
|
321
|
+
if (dif > 0.0001)
|
|
322
|
+
dif *= calcSoftShadow(pos + nor * 0.001, sunDir, SHADOW_MINT, SHADOW_TMAX);
|
|
323
|
+
|
|
324
|
+
float spe = pow(clamp(dot(nor, hal), 0.0, 1.0), 16.0);
|
|
325
|
+
spe *= dif;
|
|
326
|
+
float fre = pow(clamp(1.0 + dot(nor, rd), 0.0, 1.0), 5.0);
|
|
327
|
+
spe *= 0.04 + 0.96 * fre;
|
|
328
|
+
|
|
329
|
+
float sky = clamp(0.5 + 0.5 * nor.y, 0.0, 1.0);
|
|
330
|
+
float occ = calcAO(pos, nor);
|
|
331
|
+
|
|
332
|
+
vec3 lin = vec3(0.0);
|
|
333
|
+
lin += 2.5 * dif * vec3(1.30, 1.00, 0.70);
|
|
334
|
+
lin += 8.0 * spe * vec3(1.30, 1.00, 0.70);
|
|
335
|
+
lin += 0.5 * sky * vec3(0.40, 0.60, 1.00) * occ;
|
|
336
|
+
lin += 0.25 * occ * vec3(0.40, 0.50, 0.60);
|
|
337
|
+
|
|
338
|
+
col = albedo * lin;
|
|
339
|
+
col = pow(col, vec3(0.4545));
|
|
340
|
+
return col;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// ---- Camera ----
|
|
344
|
+
mat3 setCamera(vec3 ro, vec3 ta) {
|
|
345
|
+
vec3 cw = normalize(ta - ro);
|
|
346
|
+
vec3 cu = normalize(cross(cw, vec3(0.0, 1.0, 0.0)));
|
|
347
|
+
vec3 cv = cross(cu, cw);
|
|
348
|
+
return mat3(cu, cv, cw);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
352
|
+
vec2 p = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
|
|
353
|
+
float an = 0.3 * iTime;
|
|
354
|
+
vec3 ro = vec3(3.5 * sin(an), 1.8, 3.5 * cos(an));
|
|
355
|
+
vec3 ta = vec3(0.0, 0.3, 0.0);
|
|
356
|
+
mat3 ca = setCamera(ro, ta);
|
|
357
|
+
vec3 rd = ca * normalize(vec3(p, 1.8));
|
|
358
|
+
vec3 col = render(ro, rd);
|
|
359
|
+
fragColor = vec4(col, 1.0);
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Standalone HTML + WebGL2 Template
|
|
364
|
+
|
|
365
|
+
When generating standalone HTML files, use the following complete template. Key points:
|
|
366
|
+
- Must use `canvas.getContext('webgl2')`
|
|
367
|
+
- Shaders use `#version 300 es`
|
|
368
|
+
- Entry function is `void main()`, not `void mainImage()`
|
|
369
|
+
- Use `gl_FragCoord.xy` to get pixel coordinates (available in WebGL2)
|
|
370
|
+
|
|
371
|
+
```html
|
|
372
|
+
<!DOCTYPE html>
|
|
373
|
+
<html>
|
|
374
|
+
<head>
|
|
375
|
+
<meta charset="utf-8">
|
|
376
|
+
<title>Soft Shadows - SDF Raymarching</title>
|
|
377
|
+
<style>
|
|
378
|
+
body { margin: 0; overflow: hidden; background: #000; }
|
|
379
|
+
canvas { display: block; width: 100vw; height: 100vh; }
|
|
380
|
+
</style>
|
|
381
|
+
</head>
|
|
382
|
+
<body>
|
|
383
|
+
<canvas id="canvas"></canvas>
|
|
384
|
+
<script>
|
|
385
|
+
const canvas = document.getElementById('canvas');
|
|
386
|
+
const gl = canvas.getContext('webgl2');
|
|
387
|
+
|
|
388
|
+
if (!gl) {
|
|
389
|
+
document.body.innerHTML = '<p style="color:#fff;">WebGL2 not supported</p>';
|
|
390
|
+
throw new Error('WebGL2 not supported');
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Vertex shader: fullscreen quad
|
|
394
|
+
const vsSource = `#version 300 es
|
|
395
|
+
in vec4 aPosition;
|
|
396
|
+
void main() {
|
|
397
|
+
gl_Position = aPosition;
|
|
398
|
+
}
|
|
399
|
+
`;
|
|
400
|
+
|
|
401
|
+
// Fragment shader: SDF soft shadows
|
|
402
|
+
const fsSource = `#version 300 es
|
|
403
|
+
precision highp float;
|
|
404
|
+
|
|
405
|
+
uniform float iTime;
|
|
406
|
+
uniform vec2 iResolution;
|
|
407
|
+
uniform vec4 iMouse;
|
|
408
|
+
|
|
409
|
+
out vec4 fragColor;
|
|
410
|
+
|
|
411
|
+
#define ZERO (min(int(iTime), 0))
|
|
412
|
+
#define MAX_MARCH_STEPS 128
|
|
413
|
+
#define MAX_SHADOW_STEPS 64
|
|
414
|
+
#define SHADOW_MINT 0.02
|
|
415
|
+
#define SHADOW_TMAX 10.0
|
|
416
|
+
#define SHADOW_MIN_STEP 0.01
|
|
417
|
+
#define SHADOW_MAX_STEP 0.25
|
|
418
|
+
#define SHADOW_W 0.08
|
|
419
|
+
#define SHADOW_K 16.0
|
|
420
|
+
|
|
421
|
+
// SDF primitives
|
|
422
|
+
float sdSphere(vec3 p, float r) { return length(p) - r; }
|
|
423
|
+
float sdPlane(vec3 p) { return p.y; }
|
|
424
|
+
float sdRoundBox(vec3 p, vec3 b, float r) {
|
|
425
|
+
vec3 q = abs(p) - b;
|
|
426
|
+
return length(max(q, 0.0)) + min(max(q.x, max(q.y, q.z)), 0.0) - r;
|
|
427
|
+
}
|
|
428
|
+
float sdTorus(vec3 p, vec2 t) {
|
|
429
|
+
vec2 q = vec2(length(p.xz) - t.x, p.y);
|
|
430
|
+
return length(q) - t.y;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Scene SDF
|
|
434
|
+
float map(vec3 p) {
|
|
435
|
+
float d = sdPlane(p);
|
|
436
|
+
d = min(d, sdSphere(p - vec3(0.0, 0.6, 0.0), 0.6));
|
|
437
|
+
d = min(d, sdRoundBox(p - vec3(-1.5, 0.4, 0.8), vec3(0.35), 0.08));
|
|
438
|
+
d = min(d, sdTorus(p - vec3(1.6, 0.35, -0.5), vec2(0.45, 0.12)));
|
|
439
|
+
return d;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Normal
|
|
443
|
+
vec3 calcNormal(vec3 p) {
|
|
444
|
+
vec2 e = vec2(0.0005, 0.0);
|
|
445
|
+
return normalize(vec3(
|
|
446
|
+
map(p + e.xyy) - map(p - e.xyy),
|
|
447
|
+
map(p + e.yxy) - map(p - e.yxy),
|
|
448
|
+
map(p + e.yyx) - map(p - e.yyx)));
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
// Raymarching
|
|
452
|
+
float castRay(vec3 ro, vec3 rd) {
|
|
453
|
+
float t = 0.0;
|
|
454
|
+
for (int i = ZERO; i < MAX_MARCH_STEPS; i++) {
|
|
455
|
+
float h = map(ro + rd * t);
|
|
456
|
+
if (h < 0.0002) return t;
|
|
457
|
+
t += h;
|
|
458
|
+
if (t > 25.0) break;
|
|
459
|
+
}
|
|
460
|
+
return -1.0;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// Plane clipping
|
|
464
|
+
float clipTmax(vec3 ro, vec3 rd, float tmax, float yMax) {
|
|
465
|
+
float tp = (yMax - ro.y) / rd.y;
|
|
466
|
+
if (tp > 0.0) tmax = min(tmax, tp);
|
|
467
|
+
return tmax;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
// Soft shadow (negative extension)
|
|
471
|
+
float softShadow(vec3 ro, vec3 rd, float mint, float tmax, float w) {
|
|
472
|
+
tmax = clipTmax(ro, rd, tmax, 2.0);
|
|
473
|
+
float res = 1.0;
|
|
474
|
+
float t = mint;
|
|
475
|
+
for (int i = ZERO; i < MAX_SHADOW_STEPS; i++) {
|
|
476
|
+
float h = map(ro + rd * t);
|
|
477
|
+
res = min(res, h / (w * t));
|
|
478
|
+
t += clamp(h, SHADOW_MIN_STEP, SHADOW_MAX_STEP);
|
|
479
|
+
if (res < -1.0 || t > tmax) break;
|
|
480
|
+
}
|
|
481
|
+
res = max(res, -1.0);
|
|
482
|
+
return 0.25 * (1.0 + res) * (1.0 + res) * (2.0 - res);
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Soft shadow call
|
|
486
|
+
float calcSoftShadow(vec3 ro, vec3 rd) {
|
|
487
|
+
return softShadow(ro, rd, SHADOW_MINT, SHADOW_TMAX, SHADOW_W);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// AO
|
|
491
|
+
float calcAO(vec3 p, vec3 n) {
|
|
492
|
+
float occ = 0.0, sca = 1.0;
|
|
493
|
+
for (int i = ZERO; i < 5; i++) {
|
|
494
|
+
float h = 0.01 + 0.12 * float(i) / 4.0;
|
|
495
|
+
float d = map(p + h * n);
|
|
496
|
+
occ += (h - d) * sca;
|
|
497
|
+
sca *= 0.95;
|
|
498
|
+
}
|
|
499
|
+
return clamp(1.0 - 3.0 * occ, 0.0, 1.0);
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// Checkerboard
|
|
503
|
+
float checkerboard(vec2 p) {
|
|
504
|
+
vec2 q = floor(p);
|
|
505
|
+
return mix(0.25, 0.35, mod(q.x + q.y, 2.0));
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Render
|
|
509
|
+
vec3 render(vec3 ro, vec3 rd) {
|
|
510
|
+
// sky
|
|
511
|
+
vec3 col = vec3(0.65, 0.72, 0.85) - 0.4 * rd.y;
|
|
512
|
+
col = mix(col, vec3(0.3, 0.35, 0.45), exp(-0.8 * max(rd.y, 0.0)));
|
|
513
|
+
|
|
514
|
+
float t = castRay(ro, rd);
|
|
515
|
+
if (t < 0.0) return col;
|
|
516
|
+
|
|
517
|
+
vec3 pos = ro + rd * t;
|
|
518
|
+
vec3 nor = calcNormal(pos);
|
|
519
|
+
|
|
520
|
+
// material color
|
|
521
|
+
vec3 albedo = vec3(0.18);
|
|
522
|
+
if (pos.y < 0.01) {
|
|
523
|
+
albedo = vec3(0.12 + 0.12 * checkerboard(pos.xz * 1.5));
|
|
524
|
+
} else if (pos.y > 0.5 && length(pos.xz) < 0.7) {
|
|
525
|
+
albedo = vec3(0.85, 0.25, 0.2);
|
|
526
|
+
} else if (pos.x < -1.0) {
|
|
527
|
+
albedo = vec3(0.2, 0.4, 0.85);
|
|
528
|
+
} else if (pos.x > 1.0) {
|
|
529
|
+
albedo = vec3(0.25, 0.75, 0.35);
|
|
530
|
+
} else {
|
|
531
|
+
albedo = vec3(0.9, 0.6, 0.2);
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// lighting
|
|
535
|
+
vec3 sunDir = normalize(vec3(-0.6, 0.45, -0.65));
|
|
536
|
+
vec3 hal = normalize(sunDir - rd);
|
|
537
|
+
|
|
538
|
+
float dif = clamp(dot(nor, sunDir), 0.0, 1.0);
|
|
539
|
+
if (dif > 0.0001) {
|
|
540
|
+
dif *= calcSoftShadow(pos + nor * 0.01, sunDir);
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
float spe = pow(clamp(dot(nor, hal), 0.0, 1.0), 32.0);
|
|
544
|
+
spe *= dif;
|
|
545
|
+
|
|
546
|
+
float fre = pow(clamp(1.0 + dot(nor, rd), 0.0, 1.0), 5.0);
|
|
547
|
+
spe *= 0.04 + 0.96 * fre;
|
|
548
|
+
|
|
549
|
+
float sky = clamp(0.5 + 0.5 * nor.y, 0.0, 1.0);
|
|
550
|
+
float occ = calcAO(pos, nor);
|
|
551
|
+
|
|
552
|
+
vec3 lin = vec3(0.0);
|
|
553
|
+
lin += 2.2 * dif * vec3(1.35, 1.05, 0.75);
|
|
554
|
+
lin += 6.0 * spe * vec3(1.35, 1.05, 0.75);
|
|
555
|
+
lin += 0.4 * sky * vec3(0.45, 0.6, 0.9) * occ;
|
|
556
|
+
lin += 0.25 * occ * vec3(0.5, 0.55, 0.6);
|
|
557
|
+
|
|
558
|
+
col = albedo * lin;
|
|
559
|
+
col = pow(col, vec3(0.4545));
|
|
560
|
+
|
|
561
|
+
// vignette
|
|
562
|
+
vec2 uv = gl_FragCoord.xy / iResolution.xy;
|
|
563
|
+
col *= 0.5 + 0.5 * pow(16.0 * uv.x * uv.y * (1.0 - uv.x) * (1.0 - uv.y), 0.2);
|
|
564
|
+
|
|
565
|
+
return col;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
// Camera
|
|
569
|
+
mat3 setCamera(vec3 ro, vec3 ta) {
|
|
570
|
+
vec3 cw = normalize(ta - ro);
|
|
571
|
+
vec3 cu = normalize(cross(cw, vec3(0.0, 1.0, 0.0)));
|
|
572
|
+
vec3 cv = cross(cu, cw);
|
|
573
|
+
return mat3(cu, cv, cw);
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
void main() {
|
|
577
|
+
vec2 fragCoord = gl_FragCoord.xy;
|
|
578
|
+
vec2 p = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
|
|
579
|
+
|
|
580
|
+
// slowly rotating camera
|
|
581
|
+
float an = 0.15 * iTime;
|
|
582
|
+
float dist = 5.5;
|
|
583
|
+
vec3 ro = vec3(dist * sin(an), 2.2, dist * cos(an));
|
|
584
|
+
vec3 ta = vec3(0.0, 0.3, 0.0);
|
|
585
|
+
|
|
586
|
+
mat3 ca = setCamera(ro, ta);
|
|
587
|
+
vec3 rd = ca * normalize(vec3(p, 2.0));
|
|
588
|
+
|
|
589
|
+
vec3 col = render(ro, rd);
|
|
590
|
+
fragColor = vec4(col, 1.0);
|
|
591
|
+
}
|
|
592
|
+
`;
|
|
593
|
+
|
|
594
|
+
// Compile shader
|
|
595
|
+
function createShader(gl, type, source) {
|
|
596
|
+
const shader = gl.createShader(type);
|
|
597
|
+
gl.shaderSource(shader, source);
|
|
598
|
+
gl.compileShader(shader);
|
|
599
|
+
if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
|
|
600
|
+
console.error('Shader compile error:', gl.getShaderInfoLog(shader));
|
|
601
|
+
gl.deleteShader(shader);
|
|
602
|
+
return null;
|
|
603
|
+
}
|
|
604
|
+
return shader;
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// Create program
|
|
608
|
+
function createProgram(gl, vs, fs) {
|
|
609
|
+
const program = gl.createProgram();
|
|
610
|
+
gl.attachShader(program, vs);
|
|
611
|
+
gl.attachShader(program, fs);
|
|
612
|
+
gl.linkProgram(program);
|
|
613
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
614
|
+
console.error('Program link error:', gl.getProgramInfoLog(program));
|
|
615
|
+
return null;
|
|
616
|
+
}
|
|
617
|
+
return program;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
const vs = createShader(gl, gl.VERTEX_SHADER, vsSource);
|
|
621
|
+
const fs = createShader(gl, gl.FRAGMENT_SHADER, fsSource);
|
|
622
|
+
const program = createProgram(gl, vs, fs);
|
|
623
|
+
|
|
624
|
+
// Fullscreen quad
|
|
625
|
+
const positions = new Float32Array([
|
|
626
|
+
-1, -1, 1, -1, -1, 1, 1, 1
|
|
627
|
+
]);
|
|
628
|
+
|
|
629
|
+
const posBuffer = gl.createBuffer();
|
|
630
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, posBuffer);
|
|
631
|
+
gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
|
|
632
|
+
|
|
633
|
+
const posLoc = gl.getAttribLocation(program, 'aPosition');
|
|
634
|
+
gl.enableVertexAttribArray(posLoc);
|
|
635
|
+
gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
|
|
636
|
+
|
|
637
|
+
// Uniforms
|
|
638
|
+
const uTime = gl.getUniformLocation(program, 'iTime');
|
|
639
|
+
const uResolution = gl.getUniformLocation(program, 'iResolution');
|
|
640
|
+
const uMouse = gl.getUniformLocation(program, 'iMouse');
|
|
641
|
+
|
|
642
|
+
// Mouse tracking
|
|
643
|
+
let mouseX = 0, mouseY = 0;
|
|
644
|
+
canvas.addEventListener('mousemove', (e) => {
|
|
645
|
+
mouseX = e.clientX;
|
|
646
|
+
mouseY = canvas.height - e.clientY;
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
// Window resize
|
|
650
|
+
function resize() {
|
|
651
|
+
const dpr = Math.min(window.devicePixelRatio, 2);
|
|
652
|
+
canvas.width = window.innerWidth * dpr;
|
|
653
|
+
canvas.height = window.innerHeight * dpr;
|
|
654
|
+
gl.viewport(0, 0, canvas.width, canvas.height);
|
|
655
|
+
}
|
|
656
|
+
window.addEventListener('resize', resize);
|
|
657
|
+
resize();
|
|
658
|
+
|
|
659
|
+
// Render loop
|
|
660
|
+
function render(time) {
|
|
661
|
+
time *= 0.001;
|
|
662
|
+
gl.useProgram(program);
|
|
663
|
+
gl.uniform1f(uTime, time);
|
|
664
|
+
gl.uniform2f(uResolution, canvas.width, canvas.height);
|
|
665
|
+
gl.uniform4f(uMouse, mouseX, mouseY, mouseX, mouseY);
|
|
666
|
+
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
|
|
667
|
+
requestAnimationFrame(render);
|
|
668
|
+
}
|
|
669
|
+
requestAnimationFrame(render);
|
|
670
|
+
</script>
|
|
671
|
+
</body>
|
|
672
|
+
</html>
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
## Common Variants
|
|
676
|
+
|
|
677
|
+
### Analytic Sphere Shadow
|
|
678
|
+
|
|
679
|
+
```glsl
|
|
680
|
+
vec2 sphDistances(vec3 ro, vec3 rd, vec4 sph) {
|
|
681
|
+
vec3 oc = ro - sph.xyz;
|
|
682
|
+
float b = dot(oc, rd);
|
|
683
|
+
float c = dot(oc, oc) - sph.w * sph.w;
|
|
684
|
+
float h = b * b - c;
|
|
685
|
+
float d = sqrt(max(0.0, sph.w * sph.w - h)) - sph.w;
|
|
686
|
+
return vec2(d, -b - sqrt(max(h, 0.0)));
|
|
687
|
+
}
|
|
688
|
+
float sphSoftShadow(vec3 ro, vec3 rd, vec4 sph, float k) {
|
|
689
|
+
vec2 r = sphDistances(ro, rd, sph);
|
|
690
|
+
if (r.y > 0.0)
|
|
691
|
+
return clamp(k * max(r.x, 0.0) / r.y, 0.0, 1.0);
|
|
692
|
+
return 1.0;
|
|
693
|
+
}
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
### Terrain Heightfield Shadow
|
|
697
|
+
|
|
698
|
+
```glsl
|
|
699
|
+
float terrainShadow(vec3 ro, vec3 rd, float dis) {
|
|
700
|
+
float minStep = clamp(dis * 0.01, 0.5, 50.0);
|
|
701
|
+
float res = 1.0, t = 0.01;
|
|
702
|
+
for (int i = 0; i < 80; i++) {
|
|
703
|
+
vec3 p = ro + t * rd;
|
|
704
|
+
float h = p.y - terrainMap(p.xz);
|
|
705
|
+
res = min(res, 16.0 * h / t);
|
|
706
|
+
t += max(minStep, h);
|
|
707
|
+
if (res < 0.001 || p.y > MAX_TERRAIN_HEIGHT) break;
|
|
708
|
+
}
|
|
709
|
+
return clamp(res, 0.0, 1.0);
|
|
710
|
+
}
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
### Per-Material Soft/Hard Blending
|
|
714
|
+
|
|
715
|
+
```glsl
|
|
716
|
+
float hsha = 1.0; // global variable, set per material in map()
|
|
717
|
+
float mapWithShadowHardness(vec3 p) {
|
|
718
|
+
float d = sdPlane(p); hsha = 1.0;
|
|
719
|
+
float dChar = sdCharacter(p);
|
|
720
|
+
if (dChar < d) { d = dChar; hsha = 0.0; }
|
|
721
|
+
return d;
|
|
722
|
+
}
|
|
723
|
+
// in shadow loop: res = min(res, mix(1.0, SHADOW_K * h / t, hsha));
|
|
724
|
+
```
|
|
725
|
+
|
|
726
|
+
### Multi-Layer Shadow Compositing
|
|
727
|
+
|
|
728
|
+
```glsl
|
|
729
|
+
float sha_terrain = terrainShadow(pos, sunDir, 0.02);
|
|
730
|
+
float sha_trees = treesShadow(pos, sunDir);
|
|
731
|
+
float sha_clouds = cloudShadow(pos, sunDir);
|
|
732
|
+
float sha = sha_terrain * sha_trees;
|
|
733
|
+
sha *= smoothstep(-0.3, -0.1, sha_clouds);
|
|
734
|
+
dif *= sha;
|
|
735
|
+
```
|
|
736
|
+
|
|
737
|
+
### Volumetric Light / God Rays
|
|
738
|
+
|
|
739
|
+
```glsl
|
|
740
|
+
float godRays(vec3 ro, vec3 rd, float tmax, vec3 sunDir) {
|
|
741
|
+
float v = 0.0, dt = 0.15;
|
|
742
|
+
float t = dt * fract(texelFetch(iChannel0, ivec2(fragCoord) & 255, 0).x);
|
|
743
|
+
for (int i = 0; i < 32; i++) {
|
|
744
|
+
if (t > tmax) break;
|
|
745
|
+
vec3 p = ro + rd * t;
|
|
746
|
+
float sha = calcSoftShadow(p, sunDir, 0.02, 8.0);
|
|
747
|
+
v += sha * exp(-0.2 * t);
|
|
748
|
+
t += dt;
|
|
749
|
+
}
|
|
750
|
+
v /= 32.0;
|
|
751
|
+
return v * v;
|
|
752
|
+
}
|
|
753
|
+
// col += intensity * godRays(...) * vec3(1.0, 0.75, 0.4);
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
## Performance & Composition
|
|
757
|
+
|
|
758
|
+
**Performance optimization:**
|
|
759
|
+
- Bounding volume clipping (plane/AABB) can reduce 30-70% of wasted iterations
|
|
760
|
+
- Step clamping `clamp(h, minStep, maxStep)` prevents stalling / skipping thin objects
|
|
761
|
+
- Early exit: `res < 0.004` (classic) or `res < -1.0` (negative extension)
|
|
762
|
+
- Simplified `map()` omitting material calculations, returning distance only
|
|
763
|
+
- Only compute shadow when `dif > 0.0001`; skip for backlit faces
|
|
764
|
+
- Iteration count: simple scenes 16~32, complex FBM 64~128, terrain ~80
|
|
765
|
+
- `#define ZERO (min(iFrame,0))` prevents compiler loop unrolling
|
|
766
|
+
|
|
767
|
+
**Composition tips:**
|
|
768
|
+
- AO: shadows control direct light, AO controls indirect light, `col = diffuse * sha + ambient * ao`
|
|
769
|
+
- SSS: `sss *= 0.25 + 0.75 * sha` -- SSS weakens but does not vanish in shadow
|
|
770
|
+
- Fog: complete lit+shadowed shading first, then `mix(col, fogColor, 1.0 - exp(-0.001*t*t))`
|
|
771
|
+
- Normal mapping: perturbed normals for lighting, geometric normals for shadow determination
|
|
772
|
+
- Reflection: `refSha = calcSoftShadow(pos + nor*0.01, reflect(rd, nor), 0.02, 8.0)`
|
|
773
|
+
|
|
774
|
+
## Further Reading
|
|
775
|
+
|
|
776
|
+
For complete step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/shadow-techniques.md)
|