@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,408 @@
|
|
|
1
|
+
# Heightfield Ray Marching Terrain Rendering
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
|
|
5
|
+
- Procedural generation of natural landscapes (mountains, canyons, dunes, etc.) in ShaderToy / Fragment Shaders
|
|
6
|
+
- Complete 3D terrain flythrough scenes in a single pixel shader, without geometry
|
|
7
|
+
- Cinematic aerial perspective, soft shadows, and layered material effects
|
|
8
|
+
|
|
9
|
+
## Core Principles
|
|
10
|
+
|
|
11
|
+
Rendering pipeline: height field definition → ray marching intersection → normals & materials → lighting → atmospheric effects
|
|
12
|
+
|
|
13
|
+
- **FBM**: `f(p) = Σ (aⁿ × noise(2ⁿ × R × p))`, a=0.5, R=rotation matrix, 2ⁿ=frequency doubling
|
|
14
|
+
- **Derivative erosion**: `f(p) = Σ (aⁿ × noise(p) / (1 + dot(d,d)))`, d=accumulated gradient, suppresses detail on steep slopes
|
|
15
|
+
- **Adaptive step size**: `step = factor × (ray.y - terrain_height)`
|
|
16
|
+
|
|
17
|
+
## Implementation Steps
|
|
18
|
+
|
|
19
|
+
1. **Noise & hash** — sin-free hash + Value Noise with analytic derivatives (`noised` returns value + partial derivatives)
|
|
20
|
+
2. **FBM terrain** — derivative erosion FBM, `mat2(0.8,-0.6,0.6,0.8)` per-layer rotation to eliminate banding; LOD tiers (L=3/M=9/H=16 octaves)
|
|
21
|
+
3. **Ray marching** — upper bound clipping + adaptive step `STEP_FACTOR * h` + distance-adaptive precision `abs(h) < 0.0015*t`
|
|
22
|
+
4. **Normals** — finite differences, epsilon increases with distance to avoid distant aliasing, using high-precision `terrainH`
|
|
23
|
+
5. **Soft shadows** — march toward sun, track `min(k*h/t)` to estimate penumbra
|
|
24
|
+
6. **Materials** — blend rock/grass/snow/sand by height + slope + noise
|
|
25
|
+
7. **Lighting** — Lambert diffuse + hemisphere ambient + backlight + Fresnel rim light + Blinn-Phong specular
|
|
26
|
+
8. **Atmospheric fog** — wavelength-dependent attenuation `exp(-t*k*vec3(1,1.5,4))` + sun scatter fog color
|
|
27
|
+
9. **Sky** — zenith-to-horizon gradient + sun disk/halo
|
|
28
|
+
10. **Camera** — Look-At matrix + path-following flight, height tracks terrain
|
|
29
|
+
|
|
30
|
+
## Complete Code Template
|
|
31
|
+
|
|
32
|
+
```glsl
|
|
33
|
+
// =====================================================
|
|
34
|
+
// Heightfield Terrain Rendering - Complete Template
|
|
35
|
+
// =====================================================
|
|
36
|
+
#define TERRAIN_OCTAVES 9 // FBM octave count (3~16)
|
|
37
|
+
#define TERRAIN_SCALE 0.003 // Terrain spatial frequency
|
|
38
|
+
#define TERRAIN_HEIGHT 120.0 // Terrain elevation scale
|
|
39
|
+
#define MAX_STEPS 300 // Ray march step count (80~400)
|
|
40
|
+
#define MAX_DIST 5000.0 // Maximum render distance
|
|
41
|
+
#define STEP_FACTOR 0.4 // March conservative factor (0.3~0.8)
|
|
42
|
+
#define SHADOW_STEPS 80 // Shadow step count (32~128)
|
|
43
|
+
#define SHADOW_K 16.0 // Penumbra softness (8~64)
|
|
44
|
+
#define FOG_DENSITY 0.00025 // Fog density
|
|
45
|
+
#define SNOW_HEIGHT 80.0 // Snow line height
|
|
46
|
+
#define CAM_ALTITUDE 20.0 // Camera height above ground
|
|
47
|
+
#define SUN_DIR normalize(vec3(0.8, 0.4, -0.6))
|
|
48
|
+
#define SUN_COL vec3(8.0, 5.0, 3.0)
|
|
49
|
+
#define SKY_COL vec3(0.5, 0.7, 1.0)
|
|
50
|
+
|
|
51
|
+
// ---- Hash & Noise ----
|
|
52
|
+
float hash(vec2 p) {
|
|
53
|
+
vec3 p3 = fract(vec3(p.xyx) * 0.1031);
|
|
54
|
+
p3 += dot(p3, p3.yzx + 19.19);
|
|
55
|
+
return fract((p3.x + p3.y) * p3.z);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
vec3 noised(in vec2 p) {
|
|
59
|
+
vec2 i = floor(p);
|
|
60
|
+
vec2 f = fract(p);
|
|
61
|
+
vec2 u = f * f * (3.0 - 2.0 * f);
|
|
62
|
+
vec2 du = 6.0 * f * (1.0 - f);
|
|
63
|
+
float a = hash(i + vec2(0.0, 0.0));
|
|
64
|
+
float b = hash(i + vec2(1.0, 0.0));
|
|
65
|
+
float c = hash(i + vec2(0.0, 1.0));
|
|
66
|
+
float d = hash(i + vec2(1.0, 1.0));
|
|
67
|
+
float v = a + (b - a) * u.x + (c - a) * u.y + (a - b - c + d) * u.x * u.y;
|
|
68
|
+
vec2 g = du * (vec2(b - a, c - a) + (a - b - c + d) * u.yx);
|
|
69
|
+
return vec3(v, g);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
float noise(in vec2 p) { return noised(p).x; }
|
|
73
|
+
|
|
74
|
+
// ---- FBM Terrain (derivative erosion) + LOD ----
|
|
75
|
+
const mat2 m2 = mat2(0.8, -0.6, 0.6, 0.8);
|
|
76
|
+
|
|
77
|
+
float terrainFBM(in vec2 p, int octaves) {
|
|
78
|
+
p *= TERRAIN_SCALE;
|
|
79
|
+
float a = 0.0, b = 1.0;
|
|
80
|
+
vec2 d = vec2(0.0);
|
|
81
|
+
for (int i = 0; i < 16; i++) {
|
|
82
|
+
if (i >= octaves) break;
|
|
83
|
+
vec3 n = noised(p);
|
|
84
|
+
d += n.yz;
|
|
85
|
+
a += b * n.x / (1.0 + dot(d, d));
|
|
86
|
+
b *= 0.5;
|
|
87
|
+
p = m2 * p * 2.0;
|
|
88
|
+
}
|
|
89
|
+
return a * TERRAIN_HEIGHT;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
float terrainL(vec2 p) { return terrainFBM(p, 3); }
|
|
93
|
+
float terrainM(vec2 p) { return terrainFBM(p, TERRAIN_OCTAVES); }
|
|
94
|
+
float terrainH(vec2 p) { return terrainFBM(p, 16); }
|
|
95
|
+
|
|
96
|
+
// ---- Ray Marching ----
|
|
97
|
+
float raymarch(in vec3 ro, in vec3 rd) {
|
|
98
|
+
float t = 0.0;
|
|
99
|
+
if (ro.y > TERRAIN_HEIGHT && rd.y >= 0.0) return -1.0;
|
|
100
|
+
if (ro.y > TERRAIN_HEIGHT) t = (ro.y - TERRAIN_HEIGHT) / (-rd.y);
|
|
101
|
+
for (int i = 0; i < MAX_STEPS; i++) {
|
|
102
|
+
vec3 pos = ro + t * rd;
|
|
103
|
+
float h = pos.y - terrainM(pos.xz);
|
|
104
|
+
if (abs(h) < 0.0015 * t) break;
|
|
105
|
+
if (t > MAX_DIST) return -1.0;
|
|
106
|
+
t += STEP_FACTOR * h;
|
|
107
|
+
}
|
|
108
|
+
return t;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// ---- Normals ----
|
|
112
|
+
vec3 calcNormal(in vec3 pos, float t) {
|
|
113
|
+
float eps = 0.02 + 0.00005 * t * t;
|
|
114
|
+
float hC = terrainH(pos.xz);
|
|
115
|
+
float hR = terrainH(pos.xz + vec2(eps, 0.0));
|
|
116
|
+
float hU = terrainH(pos.xz + vec2(0.0, eps));
|
|
117
|
+
return normalize(vec3(hC - hR, eps, hC - hU));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// ---- Soft Shadows ----
|
|
121
|
+
float calcShadow(in vec3 pos, in vec3 sunDir) {
|
|
122
|
+
float res = 1.0, t = 1.0;
|
|
123
|
+
for (int i = 0; i < SHADOW_STEPS; i++) {
|
|
124
|
+
vec3 p = pos + t * sunDir;
|
|
125
|
+
float h = p.y - terrainM(p.xz);
|
|
126
|
+
if (h < 0.001) return 0.0;
|
|
127
|
+
res = min(res, SHADOW_K * h / t);
|
|
128
|
+
t += clamp(h, 2.0, 100.0);
|
|
129
|
+
}
|
|
130
|
+
return clamp(res, 0.0, 1.0);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// ---- Materials ----
|
|
134
|
+
vec3 getMaterial(in vec3 pos, in vec3 nor) {
|
|
135
|
+
float slope = nor.y, h = pos.y;
|
|
136
|
+
float nz = noise(pos.xz * 0.04) * noise(pos.xz * 0.005);
|
|
137
|
+
vec3 rock = vec3(0.10, 0.09, 0.08);
|
|
138
|
+
vec3 grass = mix(vec3(0.10, 0.08, 0.04), vec3(0.05, 0.09, 0.02), nz);
|
|
139
|
+
vec3 snow = vec3(0.62, 0.65, 0.70);
|
|
140
|
+
vec3 sand = vec3(0.50, 0.45, 0.35);
|
|
141
|
+
vec3 col = rock;
|
|
142
|
+
col = mix(col, grass, smoothstep(0.5, 0.8, slope));
|
|
143
|
+
float snowMask = smoothstep(SNOW_HEIGHT - 20.0 * nz, SNOW_HEIGHT + 10.0, h)
|
|
144
|
+
* smoothstep(0.3, 0.7, slope);
|
|
145
|
+
col = mix(col, snow, snowMask);
|
|
146
|
+
float beachMask = smoothstep(2.5, 0.0, h) * smoothstep(0.5, 0.9, slope);
|
|
147
|
+
col = mix(col, sand, beachMask);
|
|
148
|
+
return col;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ---- Lighting ----
|
|
152
|
+
vec3 calcLighting(in vec3 pos, in vec3 nor, in vec3 rd, float shadow) {
|
|
153
|
+
float dif = clamp(dot(nor, SUN_DIR), 0.0, 1.0);
|
|
154
|
+
float amb = 0.5 + 0.5 * nor.y;
|
|
155
|
+
vec3 backDir = normalize(vec3(-SUN_DIR.x, 0.0, -SUN_DIR.z));
|
|
156
|
+
float bac = clamp(0.2 + 0.8 * dot(nor, backDir), 0.0, 1.0);
|
|
157
|
+
float fre = pow(clamp(1.0 + dot(rd, nor), 0.0, 1.0), 2.0);
|
|
158
|
+
vec3 hal = normalize(SUN_DIR - rd);
|
|
159
|
+
float spe = pow(clamp(dot(nor, hal), 0.0, 1.0), 16.0)
|
|
160
|
+
* (0.04 + 0.96 * pow(1.0 + dot(hal, rd), 5.0));
|
|
161
|
+
vec3 lin = vec3(0.0);
|
|
162
|
+
lin += dif * shadow * SUN_COL * 0.1;
|
|
163
|
+
lin += amb * SKY_COL * 0.2;
|
|
164
|
+
lin += bac * vec3(0.15, 0.05, 0.04);
|
|
165
|
+
lin += fre * SKY_COL * 0.3;
|
|
166
|
+
lin += spe * shadow * SUN_COL * 0.05;
|
|
167
|
+
return lin;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ---- Atmosphere ----
|
|
171
|
+
vec3 applyFog(in vec3 col, float t, in vec3 rd) {
|
|
172
|
+
vec3 ext = exp(-t * FOG_DENSITY * vec3(1.0, 1.5, 4.0));
|
|
173
|
+
float sundot = clamp(dot(rd, SUN_DIR), 0.0, 1.0);
|
|
174
|
+
vec3 fogCol = mix(vec3(0.55, 0.55, 0.58), vec3(1.0, 0.7, 0.3), 0.3 * pow(sundot, 8.0));
|
|
175
|
+
return col * ext + fogCol * (1.0 - ext);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ---- Sky ----
|
|
179
|
+
vec3 getSky(in vec3 rd) {
|
|
180
|
+
vec3 col = vec3(0.3, 0.5, 0.85) - rd.y * vec3(0.2, 0.15, 0.0);
|
|
181
|
+
float horizon = pow(1.0 - max(rd.y, 0.0), 4.0);
|
|
182
|
+
col = mix(col, vec3(0.8, 0.75, 0.7), 0.5 * horizon);
|
|
183
|
+
float sundot = clamp(dot(rd, SUN_DIR), 0.0, 1.0);
|
|
184
|
+
col += vec3(1.0, 0.7, 0.3) * 0.3 * pow(sundot, 8.0);
|
|
185
|
+
col += vec3(1.0, 0.9, 0.7) * 0.5 * pow(sundot, 64.0);
|
|
186
|
+
col += vec3(1.0, 1.0, 0.9) * min(pow(sundot, 1150.0), 0.3);
|
|
187
|
+
return col;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ---- Camera ----
|
|
191
|
+
vec3 cameraPath(float t) {
|
|
192
|
+
return vec3(100.0 * sin(0.2 * t), 0.0, -100.0 * t);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
mat3 setCamera(in vec3 ro, in vec3 ta) {
|
|
196
|
+
vec3 cw = normalize(ta - ro);
|
|
197
|
+
vec3 cu = normalize(cross(cw, vec3(0.0, 1.0, 0.0)));
|
|
198
|
+
vec3 cv = cross(cu, cw);
|
|
199
|
+
return mat3(cu, cv, cw);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// ======== Main Function ========
|
|
203
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
204
|
+
vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
|
|
205
|
+
float time = iTime * 0.5;
|
|
206
|
+
vec3 ro = cameraPath(time);
|
|
207
|
+
ro.y = terrainL(ro.xz) + CAM_ALTITUDE;
|
|
208
|
+
vec3 ta = cameraPath(time + 2.0);
|
|
209
|
+
ta.y = terrainL(ta.xz) + CAM_ALTITUDE * 0.5;
|
|
210
|
+
mat3 cam = setCamera(ro, ta);
|
|
211
|
+
vec3 rd = cam * normalize(vec3(uv, 1.5));
|
|
212
|
+
|
|
213
|
+
float t = raymarch(ro, rd);
|
|
214
|
+
vec3 col;
|
|
215
|
+
if (t > 0.0) {
|
|
216
|
+
vec3 pos = ro + t * rd;
|
|
217
|
+
vec3 nor = calcNormal(pos, t);
|
|
218
|
+
vec3 mate = getMaterial(pos, nor);
|
|
219
|
+
float sha = calcShadow(pos + nor * 0.5, SUN_DIR);
|
|
220
|
+
vec3 lin = calcLighting(pos, nor, rd, sha);
|
|
221
|
+
col = mate * lin;
|
|
222
|
+
col = applyFog(col, t, rd);
|
|
223
|
+
} else {
|
|
224
|
+
col = getSky(rd);
|
|
225
|
+
}
|
|
226
|
+
col = 1.0 - exp(-col * 2.0);
|
|
227
|
+
col = pow(col, vec3(1.0 / 2.2));
|
|
228
|
+
fragColor = vec4(col, 1.0);
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Binary Refinement (optional, called after raymarch)
|
|
233
|
+
|
|
234
|
+
```glsl
|
|
235
|
+
float bisect(in vec3 ro, in vec3 rd, float tNear, float tFar) {
|
|
236
|
+
for (int i = 0; i < 5; i++) {
|
|
237
|
+
float tMid = 0.5 * (tNear + tFar);
|
|
238
|
+
vec3 pos = ro + tMid * rd;
|
|
239
|
+
float h = pos.y - terrainM(pos.xz);
|
|
240
|
+
if (h > 0.0) tNear = tMid; else tFar = tMid;
|
|
241
|
+
}
|
|
242
|
+
return 0.5 * (tNear + tFar);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
## Common Variants
|
|
247
|
+
|
|
248
|
+
### Relaxation Marching
|
|
249
|
+
|
|
250
|
+
Automatically increases step size at far distances, covering greater range in 90 steps.
|
|
251
|
+
|
|
252
|
+
```glsl
|
|
253
|
+
float raymarchRelax(in vec3 ro, in vec3 rd) {
|
|
254
|
+
float t = 0.0;
|
|
255
|
+
float d = (ro + rd * t).y - terrainM((ro + rd * t).xz);
|
|
256
|
+
for (int i = 0; i < 90; i++) {
|
|
257
|
+
if (abs(d) < t * 0.0001 || t > 400.0) break;
|
|
258
|
+
float rl = max(t * 0.02, 1.0);
|
|
259
|
+
t += d * rl;
|
|
260
|
+
vec3 pos = ro + t * rd;
|
|
261
|
+
d = (pos.y - terrainM(pos.xz)) * 0.7;
|
|
262
|
+
}
|
|
263
|
+
return t;
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### Sign-Alternating FBM
|
|
268
|
+
|
|
269
|
+
Amplitude flips sign each layer, producing rugged alternating ridge/valley patterns.
|
|
270
|
+
|
|
271
|
+
```glsl
|
|
272
|
+
float terrainSignFlip(in vec2 p) {
|
|
273
|
+
p *= TERRAIN_SCALE;
|
|
274
|
+
float a = 0.0, w = 1.0;
|
|
275
|
+
for (int i = 0; i < TERRAIN_OCTAVES; i++) {
|
|
276
|
+
a += w * noise(p);
|
|
277
|
+
w = -w * 0.4;
|
|
278
|
+
p = m2 * p * 2.0;
|
|
279
|
+
}
|
|
280
|
+
return a * TERRAIN_HEIGHT;
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Canyon Style (Texture-Driven + 3D Displacement)
|
|
285
|
+
|
|
286
|
+
Texture sampling + 3D FBM displacement, supporting cliffs/caves and other non-heightfield formations.
|
|
287
|
+
|
|
288
|
+
```glsl
|
|
289
|
+
float noise3D(in vec3 x) {
|
|
290
|
+
vec3 p = floor(x); vec3 f = fract(x);
|
|
291
|
+
f = f * f * (3.0 - 2.0 * f);
|
|
292
|
+
vec2 uv = (p.xy + vec2(37.0, 17.0) * p.z) + f.xy;
|
|
293
|
+
vec2 rg = textureLod(iChannel0, (uv + 0.5) / 256.0, 0.0).yx;
|
|
294
|
+
return mix(rg.x, rg.y, f.z);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const mat3 m3 = mat3(0.00, 0.80, 0.60, -0.80, 0.36,-0.48, -0.60,-0.48, 0.64);
|
|
298
|
+
|
|
299
|
+
float displacement(vec3 p) {
|
|
300
|
+
float f = 0.5 * noise3D(p); p = m3 * p * 2.02;
|
|
301
|
+
f += 0.25 * noise3D(p); p = m3 * p * 2.03;
|
|
302
|
+
f += 0.125 * noise3D(p); p = m3 * p * 2.01;
|
|
303
|
+
f += 0.0625 * noise3D(p);
|
|
304
|
+
return f;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
float mapCanyon(vec3 p) {
|
|
308
|
+
float h = terrainM(p.xz);
|
|
309
|
+
float dis = displacement(0.25 * p * vec3(1.0, 4.0, 1.0)) * 3.0;
|
|
310
|
+
return (dis + p.y - h) * 0.25;
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Directional Erosion Noise
|
|
315
|
+
|
|
316
|
+
Slope direction drives Gabor noise projection, producing realistic dendritic drainage patterns.
|
|
317
|
+
|
|
318
|
+
```glsl
|
|
319
|
+
#define EROSION_BRANCH 1.5
|
|
320
|
+
|
|
321
|
+
vec3 erosionNoise(vec2 p, vec2 dir) {
|
|
322
|
+
vec2 ip = floor(p); vec2 fp = fract(p) - 0.5;
|
|
323
|
+
float va = 0.0, wt = 0.0; vec2 dva = vec2(0.0);
|
|
324
|
+
for (int i = -2; i <= 1; i++)
|
|
325
|
+
for (int j = -2; j <= 1; j++) {
|
|
326
|
+
vec2 o = vec2(float(i), float(j));
|
|
327
|
+
vec2 h = hash2(ip - o) * 0.5;
|
|
328
|
+
vec2 pp = fp + o + h;
|
|
329
|
+
float d = dot(pp, pp);
|
|
330
|
+
float w = exp(-d * 2.0);
|
|
331
|
+
float mag = dot(pp, dir);
|
|
332
|
+
va += cos(mag * 6.283) * w;
|
|
333
|
+
dva += -sin(mag * 6.283) * dir * w;
|
|
334
|
+
wt += w;
|
|
335
|
+
}
|
|
336
|
+
return vec3(va, dva) / wt;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
float terrainErosion(vec2 p, vec2 baseSlope) {
|
|
340
|
+
float e = 0.0, a = 0.5;
|
|
341
|
+
vec2 dir = normalize(baseSlope + vec2(0.001));
|
|
342
|
+
for (int i = 0; i < 5; i++) {
|
|
343
|
+
vec3 n = erosionNoise(p * 4.0, dir);
|
|
344
|
+
e += a * n.x;
|
|
345
|
+
dir = normalize(dir + n.zy * vec2(1.0, -1.0) * EROSION_BRANCH);
|
|
346
|
+
a *= 0.5; p *= 2.0;
|
|
347
|
+
}
|
|
348
|
+
return e;
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Volumetric Clouds + God Rays
|
|
353
|
+
|
|
354
|
+
Front-to-back alpha compositing of cloud slabs, accumulating god ray factor.
|
|
355
|
+
|
|
356
|
+
```glsl
|
|
357
|
+
#define CLOUD_BASE 200.0
|
|
358
|
+
#define CLOUD_TOP 300.0
|
|
359
|
+
|
|
360
|
+
vec4 raymarchClouds(vec3 ro, vec3 rd) {
|
|
361
|
+
float tmin = (CLOUD_BASE - ro.y) / rd.y;
|
|
362
|
+
float tmax = (CLOUD_TOP - ro.y) / rd.y;
|
|
363
|
+
if (tmin > tmax) { float tmp = tmin; tmin = tmp; tmax = tmp; }
|
|
364
|
+
if (tmin < 0.0) tmin = 0.0;
|
|
365
|
+
float t = tmin;
|
|
366
|
+
vec4 sum = vec4(0.0); float rays = 0.0;
|
|
367
|
+
for (int i = 0; i < 64; i++) {
|
|
368
|
+
if (sum.a > 0.99 || t > tmax) break;
|
|
369
|
+
vec3 pos = ro + t * rd;
|
|
370
|
+
float hFrac = (pos.y - CLOUD_BASE) / (CLOUD_TOP - CLOUD_BASE);
|
|
371
|
+
float shape = 1.0 - 2.0 * abs(hFrac - 0.5);
|
|
372
|
+
float den = shape - 1.6 * (1.0 - noise(pos.xz * 0.01));
|
|
373
|
+
if (den > 0.0) {
|
|
374
|
+
float shadowDen = shape - 1.6 * (1.0 - noise((pos.xz + SUN_DIR.xz * 30.0) * 0.01));
|
|
375
|
+
float shadow = clamp(1.0 - shadowDen * 2.0, 0.0, 1.0);
|
|
376
|
+
vec3 cloudCol = mix(vec3(0.4, 0.4, 0.45), vec3(1.0, 0.95, 0.8), shadow);
|
|
377
|
+
float alpha = clamp(den * 0.4, 0.0, 1.0);
|
|
378
|
+
rays += 0.02 * shadow * (1.0 - sum.a);
|
|
379
|
+
cloudCol *= alpha;
|
|
380
|
+
sum += vec4(cloudCol, alpha) * (1.0 - sum.a);
|
|
381
|
+
}
|
|
382
|
+
t += max(0.5, 0.05 * t);
|
|
383
|
+
}
|
|
384
|
+
sum.rgb += pow(rays, 3.0) * 0.4 * vec3(1.0, 0.8, 0.7);
|
|
385
|
+
return sum;
|
|
386
|
+
}
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
## Performance & Composition
|
|
390
|
+
|
|
391
|
+
**Performance:**
|
|
392
|
+
- LOD tiers: low octaves for marching (3-9), high octaves for normals (16), lowest for camera (3)
|
|
393
|
+
- Upper bound clipping: intersect ray with terrain max height plane before marching
|
|
394
|
+
- Adaptive precision: hit threshold `abs(h) < k * t`, tolerates larger error at distance
|
|
395
|
+
- Texture instead of noise: `textureLod` sampling of pre-baked noise, 2-3x speed
|
|
396
|
+
- Early exit: `t > MAX_DIST`, `alpha > 0.99`, shadow `h < 0`
|
|
397
|
+
- Dithered start: `t += hash(fragCoord) * step_size` to eliminate banding artifacts
|
|
398
|
+
|
|
399
|
+
**Composition:**
|
|
400
|
+
- Terrain + water: water at a fixed y-plane, multi-frequency noise perturbing normals, Fresnel controlling reflection/refraction
|
|
401
|
+
- Terrain + volumetric clouds: render terrain first, then march cloud slab, front-to-back alpha compositing
|
|
402
|
+
- Terrain + volumetric fog: additionally sample 3D FBM density field along ray, decay with distance
|
|
403
|
+
- Terrain + SDF objects: `floor(p.xz/gridSize)` grid placement, `hash(cell)` randomization
|
|
404
|
+
- Terrain + TAA: inter-frame reprojection blending, ~10% new frame + 90% history frame
|
|
405
|
+
|
|
406
|
+
## Further Reading
|
|
407
|
+
|
|
408
|
+
For full step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/terrain-rendering.md)
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# Advanced Texture Mapping Techniques
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
- Texturing 3D surfaces without UV seams (triplanar/biplanar mapping)
|
|
5
|
+
- Eliminating visible tiling repetition on large surfaces
|
|
6
|
+
- Proper texture filtering in ray-marched scenes (mip-level selection)
|
|
7
|
+
- Combining procedural and sampled textures
|
|
8
|
+
|
|
9
|
+
## Techniques
|
|
10
|
+
|
|
11
|
+
### 1. Biplanar Mapping (Optimized Triplanar)
|
|
12
|
+
|
|
13
|
+
Uses only 2 texture fetches instead of 3, selecting the two most relevant projection axes:
|
|
14
|
+
|
|
15
|
+
```glsl
|
|
16
|
+
vec4 biplanar(sampler2D sam, vec3 p, vec3 n, float k) {
|
|
17
|
+
vec3 dpdx = dFdx(p);
|
|
18
|
+
vec3 dpdy = dFdy(p);
|
|
19
|
+
n = abs(n);
|
|
20
|
+
|
|
21
|
+
// Determine major, minor, median axes
|
|
22
|
+
ivec3 ma = (n.x > n.y && n.x > n.z) ? ivec3(0,1,2) :
|
|
23
|
+
(n.y > n.z) ? ivec3(1,2,0) : ivec3(2,0,1);
|
|
24
|
+
ivec3 mi = (n.x < n.y && n.x < n.z) ? ivec3(0,1,2) :
|
|
25
|
+
(n.y < n.z) ? ivec3(1,2,0) : ivec3(2,0,1);
|
|
26
|
+
ivec3 me = ivec3(3) - mi - ma;
|
|
27
|
+
|
|
28
|
+
// Two texture fetches (major and median projections)
|
|
29
|
+
vec4 x = textureGrad(sam, vec2(p[ma.y], p[ma.z]),
|
|
30
|
+
vec2(dpdx[ma.y], dpdx[ma.z]),
|
|
31
|
+
vec2(dpdy[ma.y], dpdy[ma.z]));
|
|
32
|
+
vec4 y = textureGrad(sam, vec2(p[me.y], p[me.z]),
|
|
33
|
+
vec2(dpdx[me.y], dpdx[me.z]),
|
|
34
|
+
vec2(dpdy[me.y], dpdy[me.z]));
|
|
35
|
+
|
|
36
|
+
// Blend weights with local support
|
|
37
|
+
vec2 w = vec2(n[ma.x], n[me.x]);
|
|
38
|
+
w = clamp((w - 0.5773) / (1.0 - 0.5773), 0.0, 1.0); // 0.5773 = 1/sqrt(3)
|
|
39
|
+
w = pow(w, vec2(k / 8.0));
|
|
40
|
+
|
|
41
|
+
return (x * w.x + y * w.y) / (w.x + w.y);
|
|
42
|
+
}
|
|
43
|
+
// Usage: vec4 col = biplanar(tex, worldPos * scale, worldNormal, 8.0);
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Why biplanar over triplanar**: Saves one texture fetch (bandwidth-bound advantage), with k=8 visually equivalent to triplanar. The `dFdx/dFdy` gradient propagation prevents mipmap seams at axis-switching boundaries.
|
|
47
|
+
|
|
48
|
+
### 2. Texture Repetition Avoidance
|
|
49
|
+
|
|
50
|
+
Three approaches to eliminate visible tiling patterns:
|
|
51
|
+
|
|
52
|
+
#### Method A: Per-Tile Random Offset (4 fetches)
|
|
53
|
+
```glsl
|
|
54
|
+
vec4 textureNoTile(sampler2D sam, vec2 uv) {
|
|
55
|
+
vec2 iuv = floor(uv);
|
|
56
|
+
vec2 fuv = fract(uv);
|
|
57
|
+
|
|
58
|
+
// Generate 4 random offsets for the 4 surrounding tiles
|
|
59
|
+
vec4 ofa = hash42(iuv + vec2(0, 0));
|
|
60
|
+
vec4 ofb = hash42(iuv + vec2(1, 0));
|
|
61
|
+
vec4 ofc = hash42(iuv + vec2(0, 1));
|
|
62
|
+
vec4 ofd = hash42(iuv + vec2(1, 1));
|
|
63
|
+
|
|
64
|
+
// Transform UVs per tile
|
|
65
|
+
vec2 uva = uv + ofa.xy;
|
|
66
|
+
vec2 uvb = uv + ofb.xy;
|
|
67
|
+
vec2 uvc = uv + ofc.xy;
|
|
68
|
+
vec2 uvd = uv + ofd.xy;
|
|
69
|
+
|
|
70
|
+
// Blend near borders with smooth weights
|
|
71
|
+
vec2 b = smoothstep(0.25, 0.75, fuv);
|
|
72
|
+
return mix(mix(texture(sam, uva), texture(sam, uvb), b.x),
|
|
73
|
+
mix(texture(sam, uvc), texture(sam, uvd), b.x), b.y);
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### Method B: Virtual Pattern (2 fetches, cheapest)
|
|
78
|
+
```glsl
|
|
79
|
+
vec4 textureNoTileCheap(sampler2D sam, vec2 uv) {
|
|
80
|
+
float k = texture(iChannel1, 0.005 * uv).x; // low-freq variation index
|
|
81
|
+
float index = k * 8.0;
|
|
82
|
+
float i = floor(index);
|
|
83
|
+
float f = fract(index);
|
|
84
|
+
|
|
85
|
+
// Two offset lookups based on index
|
|
86
|
+
vec2 offa = sin(vec2(3.0, 7.0) * (i + 0.0));
|
|
87
|
+
vec2 offb = sin(vec2(3.0, 7.0) * (i + 1.0));
|
|
88
|
+
|
|
89
|
+
return mix(texture(sam, uv + offa), texture(sam, uv + offb), smoothstep(0.2, 0.8, f));
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 3. Ray Differential Texture Filtering
|
|
94
|
+
|
|
95
|
+
For ray-marched scenes, compute proper mip levels using ray differentials:
|
|
96
|
+
```glsl
|
|
97
|
+
// After finding hit point pos with normal nor:
|
|
98
|
+
// 1. Compute neighbor pixel ray directions
|
|
99
|
+
vec3 rdx = normalize(rd + dFdx(rd)); // x-neighbor ray
|
|
100
|
+
vec3 rdy = normalize(rd + dFdy(rd)); // y-neighbor ray
|
|
101
|
+
|
|
102
|
+
// 2. Intersect neighbors with tangent plane at hit point
|
|
103
|
+
float dt_dx = -dot(pos - ro, nor) / dot(rdx, nor);
|
|
104
|
+
float dt_dy = -dot(pos - ro, nor) / dot(rdy, nor);
|
|
105
|
+
vec3 posDx = ro + rdx * dt_dx;
|
|
106
|
+
vec3 posDy = ro + rdy * dt_dy;
|
|
107
|
+
|
|
108
|
+
// 3. World-space position derivatives = pixel footprint
|
|
109
|
+
vec3 dposdx = posDx - pos;
|
|
110
|
+
vec3 dposdy = posDy - pos;
|
|
111
|
+
|
|
112
|
+
// 4. Transform to texture derivatives and use textureGrad
|
|
113
|
+
// For simple planar mapping (e.g. ground plane):
|
|
114
|
+
vec2 duvdx = dposdx.xz * textureScale;
|
|
115
|
+
vec2 duvdy = dposdy.xz * textureScale;
|
|
116
|
+
vec4 color = textureGrad(tex, pos.xz * textureScale, duvdx, duvdy);
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
This provides correct mip-level selection for procedural and sampled textures on ray-marched surfaces, eliminating shimmer and aliasing at distance.
|
|
120
|
+
|
|
121
|
+
→ For deeper details, see [reference/texture-mapping-advanced.md](../reference/texture-mapping-advanced.md)
|