@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,542 @@
|
|
|
1
|
+
# Analytic Ray Tracing
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
|
|
5
|
+
- Rendering scenes composed of geometric primitives (spheres, planes, boxes, cylinders, ellipsoids, etc.)
|
|
6
|
+
- Requiring precise surface intersection points, normals, and distance calculations (no iterative approximation)
|
|
7
|
+
- Building the underlying geometry engine for ray tracers / path tracers
|
|
8
|
+
- Scenes requiring accurate shadows, reflections, and refractions
|
|
9
|
+
|
|
10
|
+
## Core Principles
|
|
11
|
+
|
|
12
|
+
Substitute the ray equation `P(t) = O + tD` into the geometric body's implicit equation to obtain an algebraic equation in `t`, then solve it in closed form.
|
|
13
|
+
|
|
14
|
+
**Unified intersection workflow**: Build equation -> Simplify to standard form -> Discriminant test -> Take smallest positive root -> Compute gradient at intersection for normal
|
|
15
|
+
|
|
16
|
+
**Key formulas**:
|
|
17
|
+
- **Sphere** `|P-C|^2 = r^2` -> Quadratic equation
|
|
18
|
+
- **Plane** `N·P + d = 0` -> Linear equation
|
|
19
|
+
- **Box** Intersection of three pairs of parallel planes -> Slab Method
|
|
20
|
+
- **Ellipsoid** `|P/R|^2 = 1` -> Sphere intersection in scaled space
|
|
21
|
+
- **Torus** `(|P_xy| - R)^2 + P_z^2 = r^2` -> Quartic equation
|
|
22
|
+
|
|
23
|
+
## Implementation Steps
|
|
24
|
+
|
|
25
|
+
### Step 1: Ray Generation
|
|
26
|
+
|
|
27
|
+
```glsl
|
|
28
|
+
vec3 generateRay(vec2 fragCoord, vec2 resolution, vec3 ro, vec3 ta) {
|
|
29
|
+
vec2 p = (2.0 * fragCoord - resolution) / resolution.y;
|
|
30
|
+
vec3 cw = normalize(ta - ro);
|
|
31
|
+
vec3 cu = normalize(cross(cw, vec3(0, 1, 0)));
|
|
32
|
+
vec3 cv = cross(cu, cw);
|
|
33
|
+
float fov = 1.5;
|
|
34
|
+
return normalize(p.x * cu + p.y * cv + fov * cw);
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Step 2: Ray-Sphere Intersection
|
|
39
|
+
|
|
40
|
+
```glsl
|
|
41
|
+
// Optimized version with sphere center at origin
|
|
42
|
+
float iSphere(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal, float r) {
|
|
43
|
+
float b = dot(ro, rd);
|
|
44
|
+
float c = dot(ro, ro) - r * r;
|
|
45
|
+
float h = b * b - c;
|
|
46
|
+
if (h < 0.0) return MAX_DIST;
|
|
47
|
+
h = sqrt(h);
|
|
48
|
+
float d1 = -b - h;
|
|
49
|
+
float d2 = -b + h;
|
|
50
|
+
if (d1 >= distBound.x && d1 <= distBound.y) {
|
|
51
|
+
normal = normalize(ro + rd * d1);
|
|
52
|
+
return d1;
|
|
53
|
+
} else if (d2 >= distBound.x && d2 <= distBound.y) {
|
|
54
|
+
normal = normalize(ro + rd * d2);
|
|
55
|
+
return d2;
|
|
56
|
+
}
|
|
57
|
+
return MAX_DIST;
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
```glsl
|
|
62
|
+
// General version, supports arbitrary sphere center (sph = vec4(center.xyz, radius))
|
|
63
|
+
float sphIntersect(vec3 ro, vec3 rd, vec4 sph) {
|
|
64
|
+
vec3 oc = ro - sph.xyz;
|
|
65
|
+
float b = dot(oc, rd);
|
|
66
|
+
float c = dot(oc, oc) - sph.w * sph.w;
|
|
67
|
+
float h = b * b - c;
|
|
68
|
+
if (h < 0.0) return -1.0;
|
|
69
|
+
return -b - sqrt(h);
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Step 3: Ray-Plane Intersection
|
|
74
|
+
|
|
75
|
+
```glsl
|
|
76
|
+
float iPlane(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal,
|
|
77
|
+
vec3 planeNormal, float planeDist) {
|
|
78
|
+
float denom = dot(rd, planeNormal);
|
|
79
|
+
if (denom > 0.0) return MAX_DIST;
|
|
80
|
+
float d = -(dot(ro, planeNormal) + planeDist) / denom;
|
|
81
|
+
if (d < distBound.x || d > distBound.y) return MAX_DIST;
|
|
82
|
+
normal = planeNormal;
|
|
83
|
+
return d;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// fast horizontal ground plane
|
|
87
|
+
float iGroundPlane(vec3 ro, vec3 rd, float height) {
|
|
88
|
+
return -(ro.y - height) / rd.y;
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Step 4: Ray-Box Intersection (Slab Method)
|
|
93
|
+
|
|
94
|
+
```glsl
|
|
95
|
+
float iBox(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal, vec3 boxSize) {
|
|
96
|
+
vec3 m = sign(rd) / max(abs(rd), 1e-8);
|
|
97
|
+
vec3 n = m * ro;
|
|
98
|
+
vec3 k = abs(m) * boxSize;
|
|
99
|
+
vec3 t1 = -n - k;
|
|
100
|
+
vec3 t2 = -n + k;
|
|
101
|
+
float tN = max(max(t1.x, t1.y), t1.z);
|
|
102
|
+
float tF = min(min(t2.x, t2.y), t2.z);
|
|
103
|
+
if (tN > tF || tF <= 0.0) return MAX_DIST;
|
|
104
|
+
if (tN >= distBound.x && tN <= distBound.y) {
|
|
105
|
+
normal = -sign(rd) * step(t1.yzx, t1.xyz) * step(t1.zxy, t1.xyz);
|
|
106
|
+
return tN;
|
|
107
|
+
} else if (tF >= distBound.x && tF <= distBound.y) {
|
|
108
|
+
normal = -sign(rd) * step(t1.yzx, t1.xyz) * step(t1.zxy, t1.xyz);
|
|
109
|
+
return tF;
|
|
110
|
+
}
|
|
111
|
+
return MAX_DIST;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 5: Ray-Ellipsoid Intersection
|
|
116
|
+
|
|
117
|
+
```glsl
|
|
118
|
+
// Transform to unit sphere space for intersection, transform normal back to original space
|
|
119
|
+
float iEllipsoid(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal, vec3 rad) {
|
|
120
|
+
vec3 ocn = ro / rad;
|
|
121
|
+
vec3 rdn = rd / rad;
|
|
122
|
+
float a = dot(rdn, rdn);
|
|
123
|
+
float b = dot(ocn, rdn);
|
|
124
|
+
float c = dot(ocn, ocn);
|
|
125
|
+
float h = b * b - a * (c - 1.0);
|
|
126
|
+
if (h < 0.0) return MAX_DIST;
|
|
127
|
+
float d = (-b - sqrt(h)) / a;
|
|
128
|
+
if (d < distBound.x || d > distBound.y) return MAX_DIST;
|
|
129
|
+
normal = normalize((ro + d * rd) / rad);
|
|
130
|
+
return d;
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Step 6: Ray-Cylinder Intersection (With End Caps)
|
|
135
|
+
|
|
136
|
+
```glsl
|
|
137
|
+
// pa, pb: cylinder axis endpoints, ra: radius
|
|
138
|
+
float iCylinder(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal,
|
|
139
|
+
vec3 pa, vec3 pb, float ra) {
|
|
140
|
+
vec3 ca = pb - pa;
|
|
141
|
+
vec3 oc = ro - pa;
|
|
142
|
+
float caca = dot(ca, ca);
|
|
143
|
+
float card = dot(ca, rd);
|
|
144
|
+
float caoc = dot(ca, oc);
|
|
145
|
+
float a = caca - card * card;
|
|
146
|
+
float b = caca * dot(oc, rd) - caoc * card;
|
|
147
|
+
float c = caca * dot(oc, oc) - caoc * caoc - ra * ra * caca;
|
|
148
|
+
float h = b * b - a * c;
|
|
149
|
+
if (h < 0.0) return MAX_DIST;
|
|
150
|
+
h = sqrt(h);
|
|
151
|
+
float d = (-b - h) / a;
|
|
152
|
+
float y = caoc + d * card;
|
|
153
|
+
if (y > 0.0 && y < caca && d >= distBound.x && d <= distBound.y) {
|
|
154
|
+
normal = (oc + d * rd - ca * y / caca) / ra;
|
|
155
|
+
return d;
|
|
156
|
+
}
|
|
157
|
+
d = ((y < 0.0 ? 0.0 : caca) - caoc) / card;
|
|
158
|
+
if (abs(b + a * d) < h && d >= distBound.x && d <= distBound.y) {
|
|
159
|
+
normal = normalize(ca * sign(y) / caca);
|
|
160
|
+
return d;
|
|
161
|
+
}
|
|
162
|
+
return MAX_DIST;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Step 7: Scene Intersection and Shading
|
|
167
|
+
|
|
168
|
+
```glsl
|
|
169
|
+
#define MAX_DIST 1e10
|
|
170
|
+
|
|
171
|
+
vec3 worldHit(vec3 ro, vec3 rd, vec2 dist, out vec3 normal) {
|
|
172
|
+
vec3 d = vec3(dist, 0.0);
|
|
173
|
+
vec3 tmpNormal;
|
|
174
|
+
float t;
|
|
175
|
+
|
|
176
|
+
t = iPlane(ro, rd, d.xy, normal, vec3(0, 1, 0), 0.0);
|
|
177
|
+
if (t < d.y) { d.y = t; d.z = 1.0; }
|
|
178
|
+
|
|
179
|
+
t = iSphere(ro - vec3(0, 0.5, 0), rd, d.xy, tmpNormal, 0.5);
|
|
180
|
+
if (t < d.y) { d.y = t; d.z = 2.0; normal = tmpNormal; }
|
|
181
|
+
|
|
182
|
+
t = iBox(ro - vec3(2, 0.5, 0), rd, d.xy, tmpNormal, vec3(0.5));
|
|
183
|
+
if (t < d.y) { d.y = t; d.z = 3.0; normal = tmpNormal; }
|
|
184
|
+
|
|
185
|
+
return d;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
vec3 shade(vec3 pos, vec3 normal, vec3 rd, vec3 albedo) {
|
|
189
|
+
vec3 lightDir = normalize(vec3(-1.0, 0.75, 1.0));
|
|
190
|
+
float diff = max(dot(normal, lightDir), 0.0);
|
|
191
|
+
float amb = 0.5 + 0.5 * normal.y;
|
|
192
|
+
return albedo * (amb * 0.2 + diff * 0.8);
|
|
193
|
+
}
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
> **IMPORTANT: Critical pitfall**: `d.xy` must be passed as distBound, and `d.y` must be updated each time a closer intersection is found! If the deployed code passes the original `dist` directly without updating, the intersection logic will fail (all object distance tests become invalid), resulting in a completely black screen.
|
|
197
|
+
|
|
198
|
+
```glsl
|
|
199
|
+
#define MAX_BOUNCES 4
|
|
200
|
+
#define EPSILON 0.001
|
|
201
|
+
|
|
202
|
+
float schlickFresnel(float cosTheta, float F0) {
|
|
203
|
+
return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
vec3 radiance(vec3 ro, vec3 rd) {
|
|
207
|
+
vec3 color = vec3(0.0);
|
|
208
|
+
vec3 mask = vec3(1.0);
|
|
209
|
+
vec3 normal;
|
|
210
|
+
for (int i = 0; i < MAX_BOUNCES; i++) {
|
|
211
|
+
vec3 res = worldHit(ro, rd, vec2(EPSILON, MAX_DIST), normal);
|
|
212
|
+
if (res.z < 0.5) {
|
|
213
|
+
color += mask * vec3(0.6, 0.8, 1.0);
|
|
214
|
+
break;
|
|
215
|
+
}
|
|
216
|
+
vec3 hitPos = ro + rd * res.y;
|
|
217
|
+
vec3 albedo = getAlbedo(res.z);
|
|
218
|
+
float F = schlickFresnel(max(0.0, dot(normal, -rd)), 0.04);
|
|
219
|
+
color += mask * (1.0 - F) * shade(hitPos, normal, rd, albedo);
|
|
220
|
+
mask *= F * albedo;
|
|
221
|
+
rd = reflect(rd, normal);
|
|
222
|
+
ro = hitPos + EPSILON * rd;
|
|
223
|
+
}
|
|
224
|
+
return color;
|
|
225
|
+
}
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Complete Code Template
|
|
229
|
+
|
|
230
|
+
Runs directly on ShaderToy, includes sphere, plane, and box primitives with reflection and Blinn-Phong shading.
|
|
231
|
+
|
|
232
|
+
> **IMPORTANT: Must follow**: All intersection function calls must use `d.xy` as the `distBound` parameter, and update `d.y` after each closer intersection is found. Incorrect usage: `iSphere(ro, rd, dist, ...)` (always using the original dist). Correct usage: `iSphere(ro, rd, d.xy, ...)` followed by `if (t < d.y) { d.y = t; ... }` to update.
|
|
233
|
+
|
|
234
|
+
```glsl
|
|
235
|
+
// Analytic Ray Tracing - Complete ShaderToy Template
|
|
236
|
+
#define MAX_DIST 1e10
|
|
237
|
+
#define EPSILON 0.001
|
|
238
|
+
#define MAX_BOUNCES 3
|
|
239
|
+
#define FOV 1.5
|
|
240
|
+
#define GAMMA 2.2
|
|
241
|
+
#define SHADOW_ENABLED true
|
|
242
|
+
|
|
243
|
+
float iSphere(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal, float r) {
|
|
244
|
+
float b = dot(ro, rd);
|
|
245
|
+
float c = dot(ro, ro) - r * r;
|
|
246
|
+
float h = b * b - c;
|
|
247
|
+
if (h < 0.0) return MAX_DIST;
|
|
248
|
+
h = sqrt(h);
|
|
249
|
+
float d1 = -b - h, d2 = -b + h;
|
|
250
|
+
if (d1 >= distBound.x && d1 <= distBound.y) { normal = normalize(ro + rd * d1); return d1; }
|
|
251
|
+
if (d2 >= distBound.x && d2 <= distBound.y) { normal = normalize(ro + rd * d2); return d2; }
|
|
252
|
+
return MAX_DIST;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
float iPlane(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal,
|
|
256
|
+
vec3 planeNormal, float planeDist) {
|
|
257
|
+
float denom = dot(rd, planeNormal);
|
|
258
|
+
if (denom > 0.0) return MAX_DIST;
|
|
259
|
+
float d = -(dot(ro, planeNormal) + planeDist) / denom;
|
|
260
|
+
if (d < distBound.x || d > distBound.y) return MAX_DIST;
|
|
261
|
+
normal = planeNormal;
|
|
262
|
+
return d;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
float iBox(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal, vec3 boxSize) {
|
|
266
|
+
vec3 m = sign(rd) / max(abs(rd), 1e-8);
|
|
267
|
+
vec3 n = m * ro;
|
|
268
|
+
vec3 k = abs(m) * boxSize;
|
|
269
|
+
vec3 t1 = -n - k, t2 = -n + k;
|
|
270
|
+
float tN = max(max(t1.x, t1.y), t1.z);
|
|
271
|
+
float tF = min(min(t2.x, t2.y), t2.z);
|
|
272
|
+
if (tN > tF || tF <= 0.0) return MAX_DIST;
|
|
273
|
+
if (tN >= distBound.x && tN <= distBound.y) {
|
|
274
|
+
normal = -sign(rd) * step(t1.yzx, t1.xyz) * step(t1.zxy, t1.xyz); return tN;
|
|
275
|
+
}
|
|
276
|
+
if (tF >= distBound.x && tF <= distBound.y) {
|
|
277
|
+
normal = -sign(rd) * step(t1.yzx, t1.xyz) * step(t1.zxy, t1.xyz); return tF;
|
|
278
|
+
}
|
|
279
|
+
return MAX_DIST;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
struct Material { vec3 albedo; float specular; float roughness; };
|
|
283
|
+
|
|
284
|
+
Material getMaterial(float matId, vec3 pos) {
|
|
285
|
+
if (matId < 1.5) {
|
|
286
|
+
float checker = mod(floor(pos.x) + floor(pos.z), 2.0);
|
|
287
|
+
return Material(vec3(0.4 + 0.4 * checker), 0.02, 0.8);
|
|
288
|
+
} else if (matId < 2.5) { return Material(vec3(1.0, 0.2, 0.2), 0.5, 0.3); }
|
|
289
|
+
else if (matId < 3.5) { return Material(vec3(0.2, 0.4, 1.0), 0.1, 0.6); }
|
|
290
|
+
else if (matId < 4.5) { return Material(vec3(1.0, 1.0, 1.0), 0.8, 0.05); }
|
|
291
|
+
else { return Material(vec3(0.8, 0.6, 0.2), 0.3, 0.4); }
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
vec3 worldHit(vec3 ro, vec3 rd, vec2 dist, out vec3 normal) {
|
|
295
|
+
vec3 d = vec3(dist, 0.0); vec3 tmp; float t;
|
|
296
|
+
t = iPlane(ro, rd, d.xy, tmp, vec3(0, 1, 0), 0.0);
|
|
297
|
+
if (t < d.y) { d.y = t; d.z = 1.0; normal = tmp; }
|
|
298
|
+
t = iSphere(ro - vec3(-2.0, 1.0, 0.0), rd, d.xy, tmp, 1.0);
|
|
299
|
+
if (t < d.y) { d.y = t; d.z = 2.0; normal = tmp; }
|
|
300
|
+
t = iSphere(ro - vec3(0.0, 0.6, 2.0), rd, d.xy, tmp, 0.6);
|
|
301
|
+
if (t < d.y) { d.y = t; d.z = 3.0; normal = tmp; }
|
|
302
|
+
t = iSphere(ro - vec3(2.0, 0.8, -1.0), rd, d.xy, tmp, 0.8);
|
|
303
|
+
if (t < d.y) { d.y = t; d.z = 4.0; normal = tmp; }
|
|
304
|
+
t = iBox(ro - vec3(0.0, 0.5, -2.0), rd, d.xy, tmp, vec3(0.5));
|
|
305
|
+
if (t < d.y) { d.y = t; d.z = 5.0; normal = tmp; }
|
|
306
|
+
return d;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
float shadow(vec3 ro, vec3 rd, float maxDist) {
|
|
310
|
+
vec3 normal;
|
|
311
|
+
vec3 res = worldHit(ro, rd, vec2(EPSILON, maxDist), normal);
|
|
312
|
+
return res.z > 0.5 ? 0.3 : 1.0;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
float schlick(float cosTheta, float F0) {
|
|
316
|
+
return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
vec3 skyColor(vec3 rd) {
|
|
320
|
+
vec3 col = mix(vec3(1.0), vec3(0.5, 0.7, 1.0), 0.5 + 0.5 * rd.y);
|
|
321
|
+
vec3 sunDir = normalize(vec3(-0.4, 0.7, -0.6));
|
|
322
|
+
float sun = clamp(dot(sunDir, rd), 0.0, 1.0);
|
|
323
|
+
col += vec3(1.0, 0.6, 0.1) * (pow(sun, 4.0) + 10.0 * pow(sun, 32.0));
|
|
324
|
+
return col;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
vec3 render(vec3 ro, vec3 rd) {
|
|
328
|
+
vec3 color = vec3(0.0), mask = vec3(1.0), normal;
|
|
329
|
+
for (int bounce = 0; bounce < MAX_BOUNCES; bounce++) {
|
|
330
|
+
vec3 res = worldHit(ro, rd, vec2(EPSILON, 100.0), normal);
|
|
331
|
+
if (res.z < 0.5) { color += mask * skyColor(rd); break; }
|
|
332
|
+
vec3 hitPos = ro + rd * res.y;
|
|
333
|
+
Material mat = getMaterial(res.z, hitPos);
|
|
334
|
+
vec3 lightDir = normalize(vec3(-0.4, 0.7, -0.6));
|
|
335
|
+
float diff = max(dot(normal, lightDir), 0.0);
|
|
336
|
+
float amb = 0.5 + 0.5 * normal.y;
|
|
337
|
+
float sha = SHADOW_ENABLED ? shadow(hitPos + normal * EPSILON, lightDir, 50.0) : 1.0;
|
|
338
|
+
vec3 halfVec = normalize(lightDir - rd);
|
|
339
|
+
float spec = pow(max(dot(normal, halfVec), 0.0), 1.0 / max(mat.roughness, 0.001));
|
|
340
|
+
float F = schlick(max(0.0, dot(normal, -rd)), 0.04 + 0.96 * mat.specular);
|
|
341
|
+
vec3 diffCol = mat.albedo * (amb * 0.15 + diff * sha * 0.85);
|
|
342
|
+
vec3 specCol = vec3(spec * sha);
|
|
343
|
+
color += mask * mix(diffCol, specCol, F * mat.specular);
|
|
344
|
+
mask *= F * mat.albedo;
|
|
345
|
+
if (length(mask) < 0.01) break;
|
|
346
|
+
rd = reflect(rd, normal);
|
|
347
|
+
ro = hitPos + normal * EPSILON;
|
|
348
|
+
}
|
|
349
|
+
return color;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
353
|
+
vec2 p = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
|
|
354
|
+
float angle = 0.3 * iTime;
|
|
355
|
+
vec3 ro = vec3(4.0 * cos(angle), 2.5, 4.0 * sin(angle));
|
|
356
|
+
vec3 ta = vec3(0.0, 0.5, 0.0);
|
|
357
|
+
vec3 cw = normalize(ta - ro);
|
|
358
|
+
vec3 cu = normalize(cross(cw, vec3(0, 1, 0)));
|
|
359
|
+
vec3 cv = cross(cu, cw);
|
|
360
|
+
vec3 rd = normalize(p.x * cu + p.y * cv + FOV * cw);
|
|
361
|
+
vec3 col = render(ro, rd);
|
|
362
|
+
col = col / (1.0 + col);
|
|
363
|
+
col = pow(col, vec3(1.0 / GAMMA));
|
|
364
|
+
fragColor = vec4(col, 1.0);
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Common Variants
|
|
369
|
+
|
|
370
|
+
### Variant 1: Path Tracing
|
|
371
|
+
|
|
372
|
+
```glsl
|
|
373
|
+
vec3 cosWeightedRandomHemisphereDirection(vec3 n, inout uint seed) {
|
|
374
|
+
uint ri = seed * 1103515245u + 12345u;
|
|
375
|
+
seed = ri;
|
|
376
|
+
float r1 = float(ri) / float(0xFFFFFFFFu);
|
|
377
|
+
ri = seed * 1103515245u + 12345u;
|
|
378
|
+
seed = ri;
|
|
379
|
+
float r2 = float(ri) / float(0xFFFFFFFFu);
|
|
380
|
+
vec3 uu = normalize(cross(n, abs(n.y) > 0.5 ? vec3(1,0,0) : vec3(0,1,0)));
|
|
381
|
+
vec3 vv = cross(uu, n);
|
|
382
|
+
float ra = sqrt(r1);
|
|
383
|
+
float rx = ra * cos(6.2831 * r2);
|
|
384
|
+
float ry = ra * sin(6.2831 * r2);
|
|
385
|
+
float rz = sqrt(1.0 - r1);
|
|
386
|
+
return normalize(rx * uu + ry * vv + rz * n);
|
|
387
|
+
}
|
|
388
|
+
// In the bounce loop, replace reflect with:
|
|
389
|
+
// rd = cosWeightedRandomHemisphereDirection(normal, seed);
|
|
390
|
+
// ro = hitPos + EPSILON * rd;
|
|
391
|
+
// mask *= mat.albedo;
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
### Variant 2: Analytic Soft Shadow
|
|
395
|
+
|
|
396
|
+
```glsl
|
|
397
|
+
float sphSoftShadow(vec3 ro, vec3 rd, vec4 sph) {
|
|
398
|
+
vec3 oc = ro - sph.xyz;
|
|
399
|
+
float b = dot(oc, rd);
|
|
400
|
+
float c = dot(oc, oc) - sph.w * sph.w;
|
|
401
|
+
float h = b * b - c;
|
|
402
|
+
float d = sqrt(max(0.0, sph.w * sph.w - h)) - sph.w;
|
|
403
|
+
float t = -b - sqrt(max(h, 0.0));
|
|
404
|
+
return (t > 0.0) ? max(d, 0.0) / t : 1.0;
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Variant 3: Analytic Anti-Aliasing
|
|
409
|
+
|
|
410
|
+
```glsl
|
|
411
|
+
vec2 sphDistances(vec3 ro, vec3 rd, vec4 sph) {
|
|
412
|
+
vec3 oc = ro - sph.xyz;
|
|
413
|
+
float b = dot(oc, rd);
|
|
414
|
+
float c = dot(oc, oc) - sph.w * sph.w;
|
|
415
|
+
float h = b * b - c;
|
|
416
|
+
float d = sqrt(max(0.0, sph.w * sph.w - h)) - sph.w;
|
|
417
|
+
return vec2(d, -b - sqrt(max(h, 0.0)));
|
|
418
|
+
}
|
|
419
|
+
// float px = 2.0 / iResolution.y;
|
|
420
|
+
// vec2 dt = sphDistances(ro, rd, sph);
|
|
421
|
+
// float coverage = 1.0 - clamp(dt.x / (dt.y * px), 0.0, 1.0);
|
|
422
|
+
// col = mix(bgColor, sphereColor, coverage);
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Variant 4: Refraction (Snell's Law)
|
|
426
|
+
|
|
427
|
+
```glsl
|
|
428
|
+
// Requires a random number function defined first
|
|
429
|
+
float hash1(float p) {
|
|
430
|
+
return fract(sin(p) * 43758.5453);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Add refraction branch in the render loop:
|
|
434
|
+
float refrIndex = 1.5; // glass ~ 1.5, water ~ 1.33
|
|
435
|
+
bool inside = dot(rd, normal) > 0.0;
|
|
436
|
+
vec3 n = inside ? -normal : normal;
|
|
437
|
+
float eta = inside ? refrIndex : 1.0 / refrIndex;
|
|
438
|
+
vec3 refracted = refract(rd, n, eta);
|
|
439
|
+
float cosI = abs(dot(rd, n));
|
|
440
|
+
float F = schlick(cosI, pow((1.0 - eta) / (1.0 + eta), 2.0));
|
|
441
|
+
// Use bounce count as random seed
|
|
442
|
+
float randSeed = float(bounce) + 1.0;
|
|
443
|
+
if (refracted != vec3(0.0) && hash1(randSeed * 12.9898) > F) {
|
|
444
|
+
rd = refracted;
|
|
445
|
+
} else {
|
|
446
|
+
rd = reflect(rd, n);
|
|
447
|
+
}
|
|
448
|
+
ro = hitPos + rd * EPSILON;
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Variant 5: Higher-Order Algebraic Surface (Sphere4)
|
|
452
|
+
|
|
453
|
+
```glsl
|
|
454
|
+
float iSphere4(vec3 ro, vec3 rd, vec2 distBound, inout vec3 normal, float ra) {
|
|
455
|
+
float r2 = ra * ra;
|
|
456
|
+
vec3 d2 = rd*rd, d3 = d2*rd;
|
|
457
|
+
vec3 o2 = ro*ro, o3 = o2*ro;
|
|
458
|
+
float ka = 1.0 / dot(d2, d2);
|
|
459
|
+
float k0 = ka * dot(ro, d3);
|
|
460
|
+
float k1 = ka * dot(o2, d2);
|
|
461
|
+
float k2 = ka * dot(o3, rd);
|
|
462
|
+
float k3 = ka * (dot(o2, o2) - r2 * r2);
|
|
463
|
+
float c0 = k1 - k0 * k0;
|
|
464
|
+
float c1 = k2 + 2.0 * k0 * (k0 * k0 - 1.5 * k1);
|
|
465
|
+
float c2 = k3 - 3.0 * k0 * (k0 * (k0 * k0 - 2.0 * k1) + 4.0/3.0 * k2);
|
|
466
|
+
float p = c0 * c0 * 3.0 + c2;
|
|
467
|
+
float q = c0 * c0 * c0 - c0 * c2 + c1 * c1;
|
|
468
|
+
float h = q * q - p * p * p * (1.0/27.0);
|
|
469
|
+
if (h < 0.0) return MAX_DIST;
|
|
470
|
+
h = sqrt(h);
|
|
471
|
+
float s = sign(q+h) * pow(abs(q+h), 1.0/3.0);
|
|
472
|
+
float t = sign(q-h) * pow(abs(q-h), 1.0/3.0);
|
|
473
|
+
vec2 v = vec2((s+t) + c0*4.0, (s-t) * sqrt(3.0)) * 0.5;
|
|
474
|
+
float r = length(v);
|
|
475
|
+
float d = -abs(v.y) / sqrt(r + v.x) - c1/r - k0;
|
|
476
|
+
if (d >= distBound.x && d <= distBound.y) {
|
|
477
|
+
vec3 pos = ro + rd * d;
|
|
478
|
+
normal = normalize(pos * pos * pos);
|
|
479
|
+
return d;
|
|
480
|
+
}
|
|
481
|
+
return MAX_DIST;
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
## Common Errors and Safeguards
|
|
486
|
+
|
|
487
|
+
### Error 1: Distance Bound Not Updated
|
|
488
|
+
**Symptom**: Screen is completely black or shows only background
|
|
489
|
+
**Cause**: `distBound.y` not updated after each intersection
|
|
490
|
+
**Fix**:
|
|
491
|
+
```glsl
|
|
492
|
+
// WRONG:
|
|
493
|
+
t = iSphere(ro, rd, dist, tmpNormal, 1.0);
|
|
494
|
+
|
|
495
|
+
// CORRECT:
|
|
496
|
+
t = iSphere(ro, rd, d.xy, tmpNormal, 1.0);
|
|
497
|
+
if (t < d.y) { d.y = t; d.z = matId; normal = tmpNormal; }
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
### Error 2: EPSILON Too Small Causing Self-Intersection Artifacts
|
|
501
|
+
**Symptom**: Black spots or artifacts on object surfaces
|
|
502
|
+
**Cause**: `EPSILON` value too small, ray still intersects with itself
|
|
503
|
+
**Fix**: Adjust EPSILON based on scene scale; typical values 1e-3 ~ 1e-2
|
|
504
|
+
|
|
505
|
+
### Error 3: Variable Used as Loop Upper Bound
|
|
506
|
+
**Symptom**: WebGL2 compilation failure or shader crash
|
|
507
|
+
**Cause**: In GLSL ES 3.0, `for` loop upper bounds must be constants
|
|
508
|
+
**Fix**: Use `#define` for loop upper bounds, and keep bounds to 4-5 iterations max
|
|
509
|
+
|
|
510
|
+
### Error 4: Division by Zero Causing NaN
|
|
511
|
+
**Symptom**: Stripe patterns from NaN propagation across the screen
|
|
512
|
+
**Cause**: Division not protected when ray direction components are zero
|
|
513
|
+
**Fix**: Always use `max(abs(x), 1e-8)` or similar protection
|
|
514
|
+
|
|
515
|
+
### Error 5: Missing Hash Function in Refraction Variant
|
|
516
|
+
**Symptom**: Compilation error "undefined function 'hash1'"
|
|
517
|
+
**Fix**: Add the function definition when using the refraction variant:
|
|
518
|
+
```glsl
|
|
519
|
+
float hash1(float p) {
|
|
520
|
+
return fract(sin(p) * 43758.5453);
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
524
|
+
## Performance & Composition
|
|
525
|
+
|
|
526
|
+
**Performance tips**:
|
|
527
|
+
- **Distance bound clipping**: Shorten `distBound.y` after each closer intersection; subsequent objects are automatically skipped
|
|
528
|
+
- **Bounding sphere pre-test**: Pre-screen with bounding sphere for complex geometry (torus, etc.)
|
|
529
|
+
- **Shadow ray simplification**: Only need to determine occlusion, no normal calculation needed
|
|
530
|
+
- **Avoid unnecessary sqrt**: Return early when discriminant is negative; `c > 0.0 && b > 0.0` for fast rejection
|
|
531
|
+
- **Grid acceleration**: Use 3D DDA grid traversal for large numbers of similar primitives
|
|
532
|
+
|
|
533
|
+
**Composition approaches**:
|
|
534
|
+
- **+ Raymarching SDF**: Analytic primitives define major structures, SDF handles complex details
|
|
535
|
+
- **+ Volume effects**: Analytic intersection provides precise entry/exit distances for volume sampling within the range
|
|
536
|
+
- **+ PBR materials**: Precise normals plug directly into Cook-Torrance and other BRDFs
|
|
537
|
+
- **+ Spatial transforms**: Rotate/translate rays to reuse the same intersection functions
|
|
538
|
+
- **+ Analytic AA/AO/soft shadows**: Fully analytic pipeline, zero noise
|
|
539
|
+
|
|
540
|
+
## Further Reading
|
|
541
|
+
|
|
542
|
+
For complete step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/analytic-ray-tracing.md)
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Anti-Aliasing Techniques
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
- Eliminating jagged edges (staircase artifacts) in ray-marched or SDF-rendered scenes
|
|
5
|
+
- Smooth 2D SDF shape rendering
|
|
6
|
+
- Post-process edge smoothing for any shader output
|
|
7
|
+
- Temporal smoothing for noise reduction
|
|
8
|
+
|
|
9
|
+
## Core Principles
|
|
10
|
+
|
|
11
|
+
Anti-aliasing in shaders differs from rasterization pipelines. Without hardware MSAA on procedural geometry, we rely on analytical or post-process approaches.
|
|
12
|
+
|
|
13
|
+
## Techniques
|
|
14
|
+
|
|
15
|
+
### 1. Supersampling (SSAA) for Ray Marching
|
|
16
|
+
|
|
17
|
+
Render multiple sub-pixel samples and average:
|
|
18
|
+
```glsl
|
|
19
|
+
#define AA 2 // 1=off, 2=4x, 3=9x
|
|
20
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
21
|
+
vec3 totalColor = vec3(0.0);
|
|
22
|
+
for (int m = 0; m < AA; m++)
|
|
23
|
+
for (int n = 0; n < AA; n++) {
|
|
24
|
+
vec2 offset = vec2(float(m), float(n)) / float(AA) - 0.5;
|
|
25
|
+
vec2 uv = (2.0 * (fragCoord + offset) - iResolution.xy) / iResolution.y;
|
|
26
|
+
vec3 col = render(uv);
|
|
27
|
+
totalColor += col;
|
|
28
|
+
}
|
|
29
|
+
fragColor = vec4(totalColor / float(AA * AA), 1.0);
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
Cost: AA^2 × full render. Use AA=2 for quality, AA=1 for development.
|
|
33
|
+
|
|
34
|
+
### 2. SDF Analytical Anti-Aliasing
|
|
35
|
+
|
|
36
|
+
For 2D SDF shapes, use pixel width to compute smooth edges:
|
|
37
|
+
```glsl
|
|
38
|
+
float d = sdShape(uv);
|
|
39
|
+
float fw = fwidth(d); // screen-space derivative of SDF
|
|
40
|
+
float alpha = smoothstep(fw, -fw, d); // smooth edge over exactly 1 pixel
|
|
41
|
+
|
|
42
|
+
// Alternative: manual pixel width for more control
|
|
43
|
+
float pixelWidth = 2.0 / iResolution.y; // approximate pixel size in UV space
|
|
44
|
+
float alpha2 = smoothstep(pixelWidth, -pixelWidth, d);
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
For 3D SDF scenes, apply anti-aliasing at the edge of geometry:
|
|
48
|
+
```glsl
|
|
49
|
+
// After ray marching, at the surface:
|
|
50
|
+
float edgeFade = 1.0 - smoothstep(0.0, 0.01 * t, lastSdfValue);
|
|
51
|
+
// t = ray distance — scales threshold with distance for consistent edge width
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 3. Temporal Anti-Aliasing (TAA) Basics
|
|
55
|
+
|
|
56
|
+
Blend current frame with previous frame using a multipass buffer:
|
|
57
|
+
```glsl
|
|
58
|
+
// Buffer A: render with sub-pixel jitter
|
|
59
|
+
vec2 jitter = (hash22(vec2(iFrame)) - 0.5) / iResolution.xy;
|
|
60
|
+
vec2 uv = (fragCoord + jitter) / iResolution.xy;
|
|
61
|
+
vec3 currentColor = render(uv);
|
|
62
|
+
|
|
63
|
+
// Buffer A output: store current render
|
|
64
|
+
fragColor = vec4(currentColor, 1.0);
|
|
65
|
+
|
|
66
|
+
// Image shader: blend with history
|
|
67
|
+
vec3 current = texture(iChannel0, fragCoord / iResolution.xy).rgb; // this frame
|
|
68
|
+
vec3 history = texture(iChannel1, fragCoord / iResolution.xy).rgb; // previous frame
|
|
69
|
+
float blend = 0.9; // higher = smoother but more ghosting
|
|
70
|
+
fragColor = vec4(mix(current, history, blend), 1.0);
|
|
71
|
+
```
|
|
72
|
+
Note: Full TAA also needs motion vectors and neighborhood clamping to avoid ghosting.
|
|
73
|
+
|
|
74
|
+
### 4. FXAA (Fast Approximate Anti-Aliasing)
|
|
75
|
+
|
|
76
|
+
Simplified post-process edge detection and smoothing:
|
|
77
|
+
```glsl
|
|
78
|
+
vec3 fxaa(sampler2D tex, vec2 uv, vec2 texelSize) {
|
|
79
|
+
// Sample center and 4 neighbors
|
|
80
|
+
vec3 rgbM = texture(tex, uv).rgb;
|
|
81
|
+
vec3 rgbN = texture(tex, uv + vec2(0.0, texelSize.y)).rgb;
|
|
82
|
+
vec3 rgbS = texture(tex, uv - vec2(0.0, texelSize.y)).rgb;
|
|
83
|
+
vec3 rgbE = texture(tex, uv + vec2(texelSize.x, 0.0)).rgb;
|
|
84
|
+
vec3 rgbW = texture(tex, uv - vec2(texelSize.x, 0.0)).rgb;
|
|
85
|
+
|
|
86
|
+
// Luma for edge detection
|
|
87
|
+
vec3 lumaCoeff = vec3(0.299, 0.587, 0.114);
|
|
88
|
+
float lumaN = dot(rgbN, lumaCoeff);
|
|
89
|
+
float lumaS = dot(rgbS, lumaCoeff);
|
|
90
|
+
float lumaE = dot(rgbE, lumaCoeff);
|
|
91
|
+
float lumaW = dot(rgbW, lumaCoeff);
|
|
92
|
+
float lumaM = dot(rgbM, lumaCoeff);
|
|
93
|
+
|
|
94
|
+
float lumaMin = min(lumaM, min(min(lumaN, lumaS), min(lumaE, lumaW)));
|
|
95
|
+
float lumaMax = max(lumaM, max(max(lumaN, lumaS), max(lumaE, lumaW)));
|
|
96
|
+
float lumaRange = lumaMax - lumaMin;
|
|
97
|
+
|
|
98
|
+
// Skip if edge contrast is low
|
|
99
|
+
if (lumaRange < max(0.0312, lumaMax * 0.125)) return rgbM;
|
|
100
|
+
|
|
101
|
+
// Blend along edge direction
|
|
102
|
+
vec2 dir;
|
|
103
|
+
dir.x = -((lumaN + lumaS) - 2.0 * lumaM);
|
|
104
|
+
dir.y = ((lumaE + lumaW) - 2.0 * lumaM);
|
|
105
|
+
float dirReduce = max(lumaRange * 0.25, 1.0 / 128.0);
|
|
106
|
+
float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);
|
|
107
|
+
dir = clamp(dir * rcpDirMin, -8.0, 8.0) * texelSize;
|
|
108
|
+
|
|
109
|
+
vec3 rgbA = 0.5 * (texture(tex, uv + dir * (1.0/3.0 - 0.5)).rgb +
|
|
110
|
+
texture(tex, uv + dir * (2.0/3.0 - 0.5)).rgb);
|
|
111
|
+
return rgbA;
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Choosing the Right Approach
|
|
116
|
+
|
|
117
|
+
| Method | Cost | Quality | Best For |
|
|
118
|
+
|--------|------|---------|----------|
|
|
119
|
+
| SSAA 2x2 | 4× render | Excellent | Final quality renders |
|
|
120
|
+
| SDF analytical | Minimal | Great for SDF | 2D shapes, UI elements |
|
|
121
|
+
| TAA | 1× + blend | Good + temporal | Animated scenes with multipass |
|
|
122
|
+
| FXAA | 1 pass post | Good | Any scene, post-process only |
|
|
123
|
+
|
|
124
|
+
→ For deeper details, see [reference/anti-aliasing.md](../reference/anti-aliasing.md)
|