@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,490 @@
|
|
|
1
|
+
# Water & Ocean Rendering Skill
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
- Rendering water body surfaces such as oceans, lakes, and rivers
|
|
5
|
+
- Water surface reflection/refraction, Fresnel effects
|
|
6
|
+
- Underwater caustics lighting effects
|
|
7
|
+
- Waves, foam, and water flow animation
|
|
8
|
+
|
|
9
|
+
## Core Principles
|
|
10
|
+
|
|
11
|
+
Water rendering solves three problems: **water surface shape generation**, **light-water surface interaction**, and **water body color compositing**.
|
|
12
|
+
|
|
13
|
+
### Wave Generation: Exponential Sine Stacking + Derivative Domain Warping
|
|
14
|
+
|
|
15
|
+
`wave(x) = exp(sin(x) - 1)` — sharp wave crests (`exp(0)=1`), broad flat troughs (`exp(-2)≈0.135`), similar to a trochoidal profile but at much lower computational cost than Gerstner waves.
|
|
16
|
+
|
|
17
|
+
When stacking multiple waves, use **derivative domain warping (Drag)**:
|
|
18
|
+
```
|
|
19
|
+
position += direction * derivative * weight * DRAG_MULT
|
|
20
|
+
```
|
|
21
|
+
Small ripples cluster on the crests of large waves, simulating capillary waves riding on gravity waves.
|
|
22
|
+
|
|
23
|
+
### Lighting: Schlick Fresnel + Subsurface Scattering
|
|
24
|
+
|
|
25
|
+
- **Schlick Fresnel**: `F = F0 + (1-F0) * (1-dot(N,V))^5`, water F0 ≈ 0.04
|
|
26
|
+
- **SSS approximation**: thicker water layer at troughs → stronger blue-green scattering; thinner layer at crests → weaker scattering
|
|
27
|
+
|
|
28
|
+
### Water Surface Intersection: Bounded Height Field Marching
|
|
29
|
+
|
|
30
|
+
The water surface is constrained within a `[0, -WATER_DEPTH]` bounding box, with adaptive step size: `step = ray_y - wave_height`.
|
|
31
|
+
|
|
32
|
+
## Implementation Steps
|
|
33
|
+
|
|
34
|
+
### Step 1: Exponential Sine Wave Function
|
|
35
|
+
```glsl
|
|
36
|
+
// Single wave: exp(sin(x)-1) produces sharp peaks and broad troughs, returns (value, negative derivative)
|
|
37
|
+
vec2 wavedx(vec2 position, vec2 direction, float frequency, float timeshift) {
|
|
38
|
+
float x = dot(direction, position) * frequency + timeshift;
|
|
39
|
+
float wave = exp(sin(x) - 1.0);
|
|
40
|
+
float dx = wave * cos(x);
|
|
41
|
+
return vec2(wave, -dx);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Step 2: Multi-Octave Wave Stacking with Domain Warping
|
|
46
|
+
```glsl
|
|
47
|
+
#define DRAG_MULT 0.38 // Domain warp strength, 0=none, 0.5=strong clustering
|
|
48
|
+
|
|
49
|
+
float getwaves(vec2 position, int iterations) {
|
|
50
|
+
float wavePhaseShift = length(position) * 0.1;
|
|
51
|
+
float iter = 0.0;
|
|
52
|
+
float frequency = 1.0;
|
|
53
|
+
float timeMultiplier = 2.0;
|
|
54
|
+
float weight = 1.0;
|
|
55
|
+
float sumOfValues = 0.0;
|
|
56
|
+
float sumOfWeights = 0.0;
|
|
57
|
+
for (int i = 0; i < iterations; i++) {
|
|
58
|
+
vec2 p = vec2(sin(iter), cos(iter)); // Pseudo-random wave direction
|
|
59
|
+
vec2 res = wavedx(position, p, frequency, iTime * timeMultiplier + wavePhaseShift);
|
|
60
|
+
position += p * res.y * weight * DRAG_MULT; // Derivative domain warp
|
|
61
|
+
sumOfValues += res.x * weight;
|
|
62
|
+
sumOfWeights += weight;
|
|
63
|
+
weight = mix(weight, 0.0, 0.2); // Weight decay
|
|
64
|
+
frequency *= 1.18; // Frequency growth rate
|
|
65
|
+
timeMultiplier *= 1.07; // Dispersion
|
|
66
|
+
iter += 1232.399963; // Uniform direction distribution
|
|
67
|
+
}
|
|
68
|
+
return sumOfValues / sumOfWeights;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Step 3: Bounded Bounding Box Ray Marching
|
|
73
|
+
```glsl
|
|
74
|
+
#define WATER_DEPTH 1.0
|
|
75
|
+
|
|
76
|
+
float intersectPlane(vec3 origin, vec3 direction, vec3 point, vec3 normal) {
|
|
77
|
+
return clamp(dot(point - origin, normal) / dot(direction, normal), -1.0, 9991999.0);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
float raymarchwater(vec3 camera, vec3 start, vec3 end, float depth) {
|
|
81
|
+
vec3 pos = start;
|
|
82
|
+
vec3 dir = normalize(end - start);
|
|
83
|
+
for (int i = 0; i < 64; i++) {
|
|
84
|
+
float height = getwaves(pos.xz, ITERATIONS_RAYMARCH) * depth - depth;
|
|
85
|
+
if (height + 0.01 > pos.y) {
|
|
86
|
+
return distance(pos, camera);
|
|
87
|
+
}
|
|
88
|
+
pos += dir * (pos.y - height); // Adaptive step size
|
|
89
|
+
}
|
|
90
|
+
return distance(start, camera);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Step 4: Normal Calculation and Distance Smoothing
|
|
95
|
+
```glsl
|
|
96
|
+
#define ITERATIONS_RAYMARCH 12 // For marching (fewer = faster)
|
|
97
|
+
#define ITERATIONS_NORMAL 36 // For normals (more = finer detail)
|
|
98
|
+
|
|
99
|
+
vec3 calcNormal(vec2 pos, float e, float depth) {
|
|
100
|
+
vec2 ex = vec2(e, 0);
|
|
101
|
+
float H = getwaves(pos.xy, ITERATIONS_NORMAL) * depth;
|
|
102
|
+
vec3 a = vec3(pos.x, H, pos.y);
|
|
103
|
+
return normalize(
|
|
104
|
+
cross(
|
|
105
|
+
a - vec3(pos.x - e, getwaves(pos.xy - ex.xy, ITERATIONS_NORMAL) * depth, pos.y),
|
|
106
|
+
a - vec3(pos.x, getwaves(pos.xy + ex.yx, ITERATIONS_NORMAL) * depth, pos.y + e)
|
|
107
|
+
)
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Distance smoothing: normals approach (0,1,0) at far distances
|
|
112
|
+
// N = mix(N, vec3(0.0, 1.0, 0.0), 0.8 * min(1.0, sqrt(dist * 0.01) * 1.1));
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Step 5: Fresnel Reflection and Subsurface Scattering
|
|
116
|
+
```glsl
|
|
117
|
+
float fresnel = 0.04 + 0.96 * pow(1.0 - max(0.0, dot(-N, ray)), 5.0);
|
|
118
|
+
|
|
119
|
+
vec3 R = normalize(reflect(ray, N));
|
|
120
|
+
R.y = abs(R.y); // Force upward to avoid self-intersection
|
|
121
|
+
|
|
122
|
+
vec3 reflection = getAtmosphere(R) + getSun(R);
|
|
123
|
+
|
|
124
|
+
vec3 scattering = vec3(0.0293, 0.0698, 0.1717) * 0.1
|
|
125
|
+
* (0.2 + (waterHitPos.y + WATER_DEPTH) / WATER_DEPTH);
|
|
126
|
+
|
|
127
|
+
vec3 C = fresnel * reflection + scattering;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Step 6: Atmosphere and Tone Mapping
|
|
131
|
+
```glsl
|
|
132
|
+
vec3 extra_cheap_atmosphere(vec3 raydir, vec3 sundir) {
|
|
133
|
+
float special_trick = 1.0 / (raydir.y * 1.0 + 0.1);
|
|
134
|
+
float special_trick2 = 1.0 / (sundir.y * 11.0 + 1.0);
|
|
135
|
+
float raysundt = pow(abs(dot(sundir, raydir)), 2.0);
|
|
136
|
+
float sundt = pow(max(0.0, dot(sundir, raydir)), 8.0);
|
|
137
|
+
float mymie = sundt * special_trick * 0.2;
|
|
138
|
+
vec3 suncolor = mix(vec3(1.0), max(vec3(0.0), vec3(1.0) - vec3(5.5, 13.0, 22.4) / 22.4),
|
|
139
|
+
special_trick2);
|
|
140
|
+
vec3 bluesky = vec3(5.5, 13.0, 22.4) / 22.4 * suncolor;
|
|
141
|
+
vec3 bluesky2 = max(vec3(0.0), bluesky - vec3(5.5, 13.0, 22.4) * 0.002
|
|
142
|
+
* (special_trick + -6.0 * sundir.y * sundir.y));
|
|
143
|
+
bluesky2 *= special_trick * (0.24 + raysundt * 0.24);
|
|
144
|
+
return bluesky2 * (1.0 + 1.0 * pow(1.0 - raydir.y, 3.0));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
vec3 aces_tonemap(vec3 color) {
|
|
148
|
+
mat3 m1 = mat3(
|
|
149
|
+
0.59719, 0.07600, 0.02840,
|
|
150
|
+
0.35458, 0.90834, 0.13383,
|
|
151
|
+
0.04823, 0.01566, 0.83777);
|
|
152
|
+
mat3 m2 = mat3(
|
|
153
|
+
1.60475, -0.10208, -0.00327,
|
|
154
|
+
-0.53108, 1.10813, -0.07276,
|
|
155
|
+
-0.07367, -0.00605, 1.07602);
|
|
156
|
+
vec3 v = m1 * color;
|
|
157
|
+
vec3 a = v * (v + 0.0245786) - 0.000090537;
|
|
158
|
+
vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;
|
|
159
|
+
return pow(clamp(m2 * (a / b), 0.0, 1.0), vec3(1.0 / 2.2));
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Complete Code Template
|
|
164
|
+
|
|
165
|
+
Can be pasted directly into ShaderToy to run. Distilled from `afl_ext`'s "Very fast procedural ocean".
|
|
166
|
+
|
|
167
|
+
```glsl
|
|
168
|
+
// Water & Ocean Rendering — ShaderToy Template
|
|
169
|
+
// exp(sin) wave model + derivative domain warp + Schlick Fresnel + SSS
|
|
170
|
+
|
|
171
|
+
// ==================== Tunable Parameters ====================
|
|
172
|
+
#define DRAG_MULT 0.38
|
|
173
|
+
#define WATER_DEPTH 1.0
|
|
174
|
+
#define CAMERA_HEIGHT 1.5
|
|
175
|
+
#define ITERATIONS_RAYMARCH 12
|
|
176
|
+
#define ITERATIONS_NORMAL 36
|
|
177
|
+
#define RAYMARCH_STEPS 64
|
|
178
|
+
#define NORMAL_EPSILON 0.01
|
|
179
|
+
#define FRESNEL_F0 0.04
|
|
180
|
+
#define SSS_COLOR vec3(0.0293, 0.0698, 0.1717)
|
|
181
|
+
#define SSS_INTENSITY 0.1
|
|
182
|
+
#define SUN_POWER 720.0
|
|
183
|
+
#define SUN_BRIGHTNESS 210.0
|
|
184
|
+
#define EXPOSURE 2.0
|
|
185
|
+
|
|
186
|
+
// ==================== Wave Functions ====================
|
|
187
|
+
vec2 wavedx(vec2 position, vec2 direction, float frequency, float timeshift) {
|
|
188
|
+
float x = dot(direction, position) * frequency + timeshift;
|
|
189
|
+
float wave = exp(sin(x) - 1.0);
|
|
190
|
+
float dx = wave * cos(x);
|
|
191
|
+
return vec2(wave, -dx);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
float getwaves(vec2 position, int iterations) {
|
|
195
|
+
float wavePhaseShift = length(position) * 0.1;
|
|
196
|
+
float iter = 0.0;
|
|
197
|
+
float frequency = 1.0;
|
|
198
|
+
float timeMultiplier = 2.0;
|
|
199
|
+
float weight = 1.0;
|
|
200
|
+
float sumOfValues = 0.0;
|
|
201
|
+
float sumOfWeights = 0.0;
|
|
202
|
+
for (int i = 0; i < iterations; i++) {
|
|
203
|
+
vec2 p = vec2(sin(iter), cos(iter));
|
|
204
|
+
vec2 res = wavedx(position, p, frequency, iTime * timeMultiplier + wavePhaseShift);
|
|
205
|
+
position += p * res.y * weight * DRAG_MULT;
|
|
206
|
+
sumOfValues += res.x * weight;
|
|
207
|
+
sumOfWeights += weight;
|
|
208
|
+
weight = mix(weight, 0.0, 0.2);
|
|
209
|
+
frequency *= 1.18;
|
|
210
|
+
timeMultiplier *= 1.07;
|
|
211
|
+
iter += 1232.399963;
|
|
212
|
+
}
|
|
213
|
+
return sumOfValues / sumOfWeights;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// ==================== Ray Marching ====================
|
|
217
|
+
float intersectPlane(vec3 origin, vec3 direction, vec3 point, vec3 normal) {
|
|
218
|
+
return clamp(dot(point - origin, normal) / dot(direction, normal), -1.0, 9991999.0);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
float raymarchwater(vec3 camera, vec3 start, vec3 end, float depth) {
|
|
222
|
+
vec3 pos = start;
|
|
223
|
+
vec3 dir = normalize(end - start);
|
|
224
|
+
for (int i = 0; i < RAYMARCH_STEPS; i++) {
|
|
225
|
+
float height = getwaves(pos.xz, ITERATIONS_RAYMARCH) * depth - depth;
|
|
226
|
+
if (height + 0.01 > pos.y) {
|
|
227
|
+
return distance(pos, camera);
|
|
228
|
+
}
|
|
229
|
+
pos += dir * (pos.y - height);
|
|
230
|
+
}
|
|
231
|
+
return distance(start, camera);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ==================== Normals ====================
|
|
235
|
+
vec3 calcNormal(vec2 pos, float e, float depth) {
|
|
236
|
+
vec2 ex = vec2(e, 0);
|
|
237
|
+
float H = getwaves(pos.xy, ITERATIONS_NORMAL) * depth;
|
|
238
|
+
vec3 a = vec3(pos.x, H, pos.y);
|
|
239
|
+
return normalize(
|
|
240
|
+
cross(
|
|
241
|
+
a - vec3(pos.x - e, getwaves(pos.xy - ex.xy, ITERATIONS_NORMAL) * depth, pos.y),
|
|
242
|
+
a - vec3(pos.x, getwaves(pos.xy + ex.yx, ITERATIONS_NORMAL) * depth, pos.y + e)
|
|
243
|
+
)
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// ==================== Camera ====================
|
|
248
|
+
#define NormalizedMouse (iMouse.xy / iResolution.xy)
|
|
249
|
+
|
|
250
|
+
mat3 createRotationMatrixAxisAngle(vec3 axis, float angle) {
|
|
251
|
+
float s = sin(angle);
|
|
252
|
+
float c = cos(angle);
|
|
253
|
+
float oc = 1.0 - c;
|
|
254
|
+
return mat3(
|
|
255
|
+
oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s,
|
|
256
|
+
oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s,
|
|
257
|
+
oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
vec3 getRay(vec2 fragCoord) {
|
|
262
|
+
vec2 uv = ((fragCoord.xy / iResolution.xy) * 2.0 - 1.0) * vec2(iResolution.x / iResolution.y, 1.0);
|
|
263
|
+
vec3 proj = normalize(vec3(uv.x, uv.y, 1.5));
|
|
264
|
+
if (iResolution.x < 600.0) return proj;
|
|
265
|
+
return createRotationMatrixAxisAngle(vec3(0.0, -1.0, 0.0), 3.0 * ((NormalizedMouse.x + 0.5) * 2.0 - 1.0))
|
|
266
|
+
* createRotationMatrixAxisAngle(vec3(1.0, 0.0, 0.0), 0.5 + 1.5 * (((NormalizedMouse.y == 0.0 ? 0.27 : NormalizedMouse.y)) * 2.0 - 1.0))
|
|
267
|
+
* proj;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ==================== Atmosphere ====================
|
|
271
|
+
vec3 getSunDirection() {
|
|
272
|
+
return normalize(vec3(-0.0773502691896258, 0.5 + sin(iTime * 0.2 + 2.6) * 0.45, 0.5773502691896258));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
vec3 extra_cheap_atmosphere(vec3 raydir, vec3 sundir) {
|
|
276
|
+
float special_trick = 1.0 / (raydir.y * 1.0 + 0.1);
|
|
277
|
+
float special_trick2 = 1.0 / (sundir.y * 11.0 + 1.0);
|
|
278
|
+
float raysundt = pow(abs(dot(sundir, raydir)), 2.0);
|
|
279
|
+
float sundt = pow(max(0.0, dot(sundir, raydir)), 8.0);
|
|
280
|
+
float mymie = sundt * special_trick * 0.2;
|
|
281
|
+
vec3 suncolor = mix(vec3(1.0), max(vec3(0.0), vec3(1.0) - vec3(5.5, 13.0, 22.4) / 22.4), special_trick2);
|
|
282
|
+
vec3 bluesky = vec3(5.5, 13.0, 22.4) / 22.4 * suncolor;
|
|
283
|
+
vec3 bluesky2 = max(vec3(0.0), bluesky - vec3(5.5, 13.0, 22.4) * 0.002 * (special_trick + -6.0 * sundir.y * sundir.y));
|
|
284
|
+
bluesky2 *= special_trick * (0.24 + raysundt * 0.24);
|
|
285
|
+
return bluesky2 * (1.0 + 1.0 * pow(1.0 - raydir.y, 3.0));
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
vec3 getAtmosphere(vec3 dir) {
|
|
289
|
+
return extra_cheap_atmosphere(dir, getSunDirection()) * 0.5;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
float getSun(vec3 dir) {
|
|
293
|
+
return pow(max(0.0, dot(dir, getSunDirection())), SUN_POWER) * SUN_BRIGHTNESS;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
// ==================== Tone Mapping ====================
|
|
297
|
+
vec3 aces_tonemap(vec3 color) {
|
|
298
|
+
mat3 m1 = mat3(
|
|
299
|
+
0.59719, 0.07600, 0.02840,
|
|
300
|
+
0.35458, 0.90834, 0.13383,
|
|
301
|
+
0.04823, 0.01566, 0.83777);
|
|
302
|
+
mat3 m2 = mat3(
|
|
303
|
+
1.60475, -0.10208, -0.00327,
|
|
304
|
+
-0.53108, 1.10813, -0.07276,
|
|
305
|
+
-0.07367, -0.00605, 1.07602);
|
|
306
|
+
vec3 v = m1 * color;
|
|
307
|
+
vec3 a = v * (v + 0.0245786) - 0.000090537;
|
|
308
|
+
vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;
|
|
309
|
+
return pow(clamp(m2 * (a / b), 0.0, 1.0), vec3(1.0 / 2.2));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
// ==================== Main Function ====================
|
|
313
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
314
|
+
vec3 ray = getRay(fragCoord);
|
|
315
|
+
if (ray.y >= 0.0) {
|
|
316
|
+
vec3 C = getAtmosphere(ray) + getSun(ray);
|
|
317
|
+
fragColor = vec4(aces_tonemap(C * EXPOSURE), 1.0);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
vec3 waterPlaneHigh = vec3(0.0, 0.0, 0.0);
|
|
322
|
+
vec3 waterPlaneLow = vec3(0.0, -WATER_DEPTH, 0.0);
|
|
323
|
+
vec3 origin = vec3(iTime * 0.2, CAMERA_HEIGHT, 1.0);
|
|
324
|
+
|
|
325
|
+
float highPlaneHit = intersectPlane(origin, ray, waterPlaneHigh, vec3(0.0, 1.0, 0.0));
|
|
326
|
+
float lowPlaneHit = intersectPlane(origin, ray, waterPlaneLow, vec3(0.0, 1.0, 0.0));
|
|
327
|
+
vec3 highHitPos = origin + ray * highPlaneHit;
|
|
328
|
+
vec3 lowHitPos = origin + ray * lowPlaneHit;
|
|
329
|
+
|
|
330
|
+
float dist = raymarchwater(origin, highHitPos, lowHitPos, WATER_DEPTH);
|
|
331
|
+
vec3 waterHitPos = origin + ray * dist;
|
|
332
|
+
|
|
333
|
+
vec3 N = calcNormal(waterHitPos.xz, NORMAL_EPSILON, WATER_DEPTH);
|
|
334
|
+
N = mix(N, vec3(0.0, 1.0, 0.0), 0.8 * min(1.0, sqrt(dist * 0.01) * 1.1));
|
|
335
|
+
|
|
336
|
+
float fresnel = FRESNEL_F0 + (1.0 - FRESNEL_F0) * pow(1.0 - max(0.0, dot(-N, ray)), 5.0);
|
|
337
|
+
|
|
338
|
+
vec3 R = normalize(reflect(ray, N));
|
|
339
|
+
R.y = abs(R.y);
|
|
340
|
+
vec3 reflection = getAtmosphere(R) + getSun(R);
|
|
341
|
+
|
|
342
|
+
vec3 scattering = SSS_COLOR * SSS_INTENSITY
|
|
343
|
+
* (0.2 + (waterHitPos.y + WATER_DEPTH) / WATER_DEPTH);
|
|
344
|
+
|
|
345
|
+
vec3 C = fresnel * reflection + scattering;
|
|
346
|
+
fragColor = vec4(aces_tonemap(C * EXPOSURE), 1.0);
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## Common Variants
|
|
351
|
+
|
|
352
|
+
### Variant 1: 2D Underwater Caustic Texture
|
|
353
|
+
```glsl
|
|
354
|
+
#define TAU 6.28318530718
|
|
355
|
+
#define MAX_ITER 5
|
|
356
|
+
|
|
357
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
358
|
+
float time = iTime * 0.5 + 23.0;
|
|
359
|
+
vec2 uv = fragCoord.xy / iResolution.xy;
|
|
360
|
+
vec2 p = mod(uv * TAU, TAU) - 250.0;
|
|
361
|
+
vec2 i = vec2(p);
|
|
362
|
+
float c = 1.0;
|
|
363
|
+
float inten = 0.005;
|
|
364
|
+
|
|
365
|
+
for (int n = 0; n < MAX_ITER; n++) {
|
|
366
|
+
float t = time * (1.0 - (3.5 / float(n + 1)));
|
|
367
|
+
i = p + vec2(cos(t - i.x) + sin(t + i.y), sin(t - i.y) + cos(t + i.x));
|
|
368
|
+
c += 1.0 / length(vec2(p.x / (sin(i.x + t) / inten), p.y / (cos(i.y + t) / inten)));
|
|
369
|
+
}
|
|
370
|
+
c /= float(MAX_ITER);
|
|
371
|
+
c = 1.17 - pow(c, 1.4);
|
|
372
|
+
vec3 colour = vec3(pow(abs(c), 8.0));
|
|
373
|
+
colour = clamp(colour + vec3(0.0, 0.35, 0.5), 0.0, 1.0);
|
|
374
|
+
fragColor = vec4(colour, 1.0);
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### Variant 2: FBM Bump-Mapped Lake Surface
|
|
379
|
+
```glsl
|
|
380
|
+
float waterMap(vec2 pos) {
|
|
381
|
+
mat2 m2 = mat2(0.60, -0.80, 0.80, 0.60);
|
|
382
|
+
vec2 posm = pos * m2;
|
|
383
|
+
return abs(fbm(vec3(8.0 * posm, iTime)) - 0.5) * 0.1;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// Analytic plane intersection instead of ray marching
|
|
387
|
+
float t = -ro.y / rd.y;
|
|
388
|
+
vec3 hitPos = ro + rd * t;
|
|
389
|
+
|
|
390
|
+
// Finite difference normals (central differencing)
|
|
391
|
+
float eps = 0.1;
|
|
392
|
+
vec3 normal = vec3(0.0, 1.0, 0.0);
|
|
393
|
+
normal.x = -bumpfactor * (waterMap(hitPos.xz + vec2(eps, 0.0)) - waterMap(hitPos.xz - vec2(eps, 0.0))) / (2.0 * eps);
|
|
394
|
+
normal.z = -bumpfactor * (waterMap(hitPos.xz + vec2(0.0, eps)) - waterMap(hitPos.xz - vec2(0.0, eps))) / (2.0 * eps);
|
|
395
|
+
normal = normalize(normal);
|
|
396
|
+
|
|
397
|
+
float bumpfactor = 0.1 * (1.0 - smoothstep(0.0, 60.0, distance(ro, hitPos)));
|
|
398
|
+
vec3 refracted = refract(rd, normal, 1.0 / 1.333);
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Variant 3: Ridge Noise Coastal Waves
|
|
402
|
+
```glsl
|
|
403
|
+
float sea(vec2 p) {
|
|
404
|
+
float f = 1.0;
|
|
405
|
+
float r = 0.0;
|
|
406
|
+
float time = -iTime;
|
|
407
|
+
for (int i = 0; i < 8; i++) {
|
|
408
|
+
r += (1.0 - abs(noise(p * f + 0.9 * time))) / f;
|
|
409
|
+
f *= 2.0;
|
|
410
|
+
p -= vec2(-0.01, 0.04) * (r - 0.2 * time / (0.1 - f));
|
|
411
|
+
}
|
|
412
|
+
return r / 4.0 + 0.5;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// Shoreline foam
|
|
416
|
+
float dh = seaDist - rockDist;
|
|
417
|
+
float foam = 0.0;
|
|
418
|
+
if (dh < 0.0 && dh > -0.02) {
|
|
419
|
+
foam = 0.5 * exp(20.0 * dh);
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Variant 4: Flow Map Water Animation
|
|
424
|
+
```glsl
|
|
425
|
+
vec3 FBM_DXY(vec2 p, vec2 flow, float persistence, float domainWarp) {
|
|
426
|
+
vec3 f = vec3(0.0);
|
|
427
|
+
float tot = 0.0;
|
|
428
|
+
float a = 1.0;
|
|
429
|
+
for (int i = 0; i < 4; i++) {
|
|
430
|
+
p += flow;
|
|
431
|
+
flow *= -0.75;
|
|
432
|
+
vec3 v = SmoothNoise_DXY(p);
|
|
433
|
+
f += v * a;
|
|
434
|
+
p += v.xy * domainWarp;
|
|
435
|
+
p *= 2.0;
|
|
436
|
+
tot += a;
|
|
437
|
+
a *= persistence;
|
|
438
|
+
}
|
|
439
|
+
return f / tot;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
// Two-phase flow cycle (eliminates stretching)
|
|
443
|
+
float t0 = fract(time);
|
|
444
|
+
float t1 = fract(time + 0.5);
|
|
445
|
+
vec4 sample0 = SampleWaterNormal(uv + Hash2(floor(time)), flowRate * (t0 - 0.5));
|
|
446
|
+
vec4 sample1 = SampleWaterNormal(uv + Hash2(floor(time+0.5)), flowRate * (t1 - 0.5));
|
|
447
|
+
float weight = abs(t0 - 0.5) * 2.0;
|
|
448
|
+
vec4 result = mix(sample0, sample1, weight);
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### Variant 5: Beer's Law Water Absorption
|
|
452
|
+
```glsl
|
|
453
|
+
vec3 GetWaterExtinction(float dist) {
|
|
454
|
+
float fOpticalDepth = dist * 6.0;
|
|
455
|
+
vec3 vExtinctCol = vec3(0.5, 0.6, 0.9);
|
|
456
|
+
return exp2(-fOpticalDepth * vExtinctCol);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
vec3 vInscatter = vSurfaceDiffuse * (1.0 - exp(-refractDist * 0.1))
|
|
460
|
+
* (1.0 + dot(sunDir, viewDir));
|
|
461
|
+
|
|
462
|
+
vec3 underwaterColor = terrainColor * GetWaterExtinction(waterDepth) + vInscatter;
|
|
463
|
+
vec3 finalColor = mix(underwaterColor, reflectionColor, fresnel);
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
## Performance & Composition
|
|
467
|
+
|
|
468
|
+
### Performance Tips
|
|
469
|
+
- **Dual iteration count strategy**: 12 iterations for marching, 36 for normals — halves render time with virtually no visual loss
|
|
470
|
+
- **Distance-adaptive normal smoothing**: `N = mix(N, up, 0.8 * min(1.0, sqrt(dist*0.01)*1.1))`, eliminates distant flickering
|
|
471
|
+
- **Bounding box clipping**: pre-compute upper/lower plane intersections, early-out for sky directions
|
|
472
|
+
- **Adaptive step size**: `pos += dir * (pos.y - height)`, 3-5x faster than fixed steps
|
|
473
|
+
- **Filter-width-aware decay**: `dFdx/dFdy` driven normal LOD
|
|
474
|
+
- **LOD conditional detail**: only compute high-frequency displacement at close range
|
|
475
|
+
|
|
476
|
+
### Composition Tips
|
|
477
|
+
- **Volumetric clouds**: ray march clouds along reflection direction `R`, blend into reflection term
|
|
478
|
+
- **Terrain coastline**: `dh = waterSDF - terrainSDF`, render foam when `dh ≈ 0`
|
|
479
|
+
- **Caustics overlay**: project Variant 1 onto underwater terrain, `caustic * exp(-depth * absorption)` depth attenuation
|
|
480
|
+
- **Fog/atmosphere**: independent extinction + in-scatter, per-channel RGB decay:
|
|
481
|
+
```glsl
|
|
482
|
+
vec3 fogExtinction = exp2(fogExtCoeffs * -distance);
|
|
483
|
+
vec3 fogInscatter = fogColor * (1.0 - exp2(fogInCoeffs * -distance));
|
|
484
|
+
finalColor = finalColor * fogExtinction + fogInscatter;
|
|
485
|
+
```
|
|
486
|
+
- **Post-processing**: Bloom (Fibonacci spiral blur), ACES tone mapping, depth of field (DOF)
|
|
487
|
+
|
|
488
|
+
## Further Reading
|
|
489
|
+
|
|
490
|
+
For full step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/water-ocean.md)
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# WebGL2 Pitfalls & Common Errors
|
|
2
|
+
|
|
3
|
+
## Use Cases
|
|
4
|
+
|
|
5
|
+
- Avoiding common GLSL compilation errors when generating standalone WebGL2 shader pages
|
|
6
|
+
- Debugging shader compilation failures
|
|
7
|
+
- Ensuring shader templates from ShaderToy work correctly in WebGL2
|
|
8
|
+
|
|
9
|
+
## Critical WebGL2 Rules
|
|
10
|
+
|
|
11
|
+
### 1. Fragment Coordinate — Use `gl_FragCoord.xy`
|
|
12
|
+
|
|
13
|
+
**ERROR**: `'fragCoord' : undeclared identifier`
|
|
14
|
+
|
|
15
|
+
In WebGL2 fragment shaders, `fragCoord` is not a built-in variable. Use `gl_FragCoord.xy` instead.
|
|
16
|
+
|
|
17
|
+
```glsl
|
|
18
|
+
// WRONG
|
|
19
|
+
void main() {
|
|
20
|
+
vec2 uv = (2.0 * fragCoord - iResolution.xy) / iResolution.y;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// CORRECT
|
|
24
|
+
void main() {
|
|
25
|
+
vec2 uv = (2.0 * gl_FragCoord.xy - iResolution.xy) / iResolution.y;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 2. Shadertoy mainImage — Must Wrap in `main()`
|
|
30
|
+
|
|
31
|
+
**ERROR**: `'' : Missing main()`
|
|
32
|
+
|
|
33
|
+
If your fragment shader uses `void mainImage(out vec4, in vec2)`, you must provide a `main()` wrapper.
|
|
34
|
+
|
|
35
|
+
```glsl
|
|
36
|
+
// WRONG — only defines mainImage but no main()
|
|
37
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
38
|
+
// shader code...
|
|
39
|
+
fragColor = vec4(col, 1.0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// CORRECT
|
|
43
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
|
44
|
+
// shader code...
|
|
45
|
+
fragColor = vec4(col, 1.0);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void main() {
|
|
49
|
+
mainImage(fragColor, gl_FragCoord.xy);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 3. Function Declaration Order — Declare Before Use
|
|
54
|
+
|
|
55
|
+
**ERROR**: `'functionName' : no matching overloaded function found`
|
|
56
|
+
|
|
57
|
+
GLSL requires functions to be declared before they are used. Forward declarations or reordering is needed.
|
|
58
|
+
|
|
59
|
+
```glsl
|
|
60
|
+
// WRONG — getAtmosphere() calls getSunDirection() which is defined after
|
|
61
|
+
vec3 getAtmosphere(vec3 dir) {
|
|
62
|
+
return extra_cheap_atmosphere(dir, getSunDirection()) * 0.5; // Error!
|
|
63
|
+
}
|
|
64
|
+
vec3 getSunDirection() {
|
|
65
|
+
return normalize(vec3(-0.5, 0.8, -0.6));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// CORRECT — reorder functions
|
|
69
|
+
vec3 getSunDirection() { // Define first
|
|
70
|
+
return normalize(vec3(-0.5, 0.8, -0.6));
|
|
71
|
+
}
|
|
72
|
+
vec3 getAtmosphere(vec3 dir) { // Now can call getSunDirection()
|
|
73
|
+
return extra_cheap_atmosphere(dir, getSunDirection()) * 0.5;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 4. Macro Limitations — `#define` Cannot Use Functions
|
|
78
|
+
|
|
79
|
+
**ERROR**: Various compilation errors with `#define` macros
|
|
80
|
+
|
|
81
|
+
Macros are text substitution and cannot call functions or use parentheses in the same way as C++.
|
|
82
|
+
|
|
83
|
+
```glsl
|
|
84
|
+
// WRONG
|
|
85
|
+
#define SUN_DIR normalize(vec3(0.8, 0.4, -0.6))
|
|
86
|
+
#define WORLD_TIME (iTime * speed())
|
|
87
|
+
|
|
88
|
+
// CORRECT — use const
|
|
89
|
+
const vec3 SUN_DIR = vec3(0.756, 0.378, -0.567); // Pre-computed normalized value
|
|
90
|
+
const float WORLD_TIME = 1.0;
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### 5. Vector Component Access — Terrain Functions
|
|
94
|
+
|
|
95
|
+
**ERROR**: `'terrainM' : no matching overloaded function found`
|
|
96
|
+
|
|
97
|
+
When passing positions to terrain functions that expect `vec2`, extract the XZ components properly.
|
|
98
|
+
|
|
99
|
+
```glsl
|
|
100
|
+
// WRONG — terrainM expects vec2, but passing vec3
|
|
101
|
+
float calcAO(vec3 pos, vec3 nor) {
|
|
102
|
+
float d = terrainM(pos + h * nor); // Error: pos + h*nor is vec3
|
|
103
|
+
...
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// CORRECT — extract xz components
|
|
107
|
+
float calcAO(vec3 pos, vec3 nor) {
|
|
108
|
+
float d = terrainM(pos.xz + h * nor.xz);
|
|
109
|
+
...
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 6. Loop Index — Use Runtime Constants
|
|
114
|
+
|
|
115
|
+
**ERROR**: Loop index must be a runtime expression
|
|
116
|
+
|
|
117
|
+
GLSL ES requires loop indices to be determinable at runtime, not compile-time constants in some contexts.
|
|
118
|
+
|
|
119
|
+
```glsl
|
|
120
|
+
// WRONG — AA is a #define constant
|
|
121
|
+
for (int i = 0; i < AA; i++) { ... }
|
|
122
|
+
|
|
123
|
+
// CORRECT — use a runtime-safe approach
|
|
124
|
+
for (int i = 0; i < 4; i++) { ... } // Or pass as uniform
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 7. Uniform Usage — Avoid Unused Uniforms
|
|
128
|
+
|
|
129
|
+
**ERROR**: Uniform optimized away causes `gl.getUniformLocation()` to return `null`
|
|
130
|
+
|
|
131
|
+
If a uniform is declared but not used, the compiler may optimize it out.
|
|
132
|
+
|
|
133
|
+
```glsl
|
|
134
|
+
// WRONG — iTime declared but used in a conditional that might be false
|
|
135
|
+
uniform float iTime;
|
|
136
|
+
if (false) { x = iTime; } // iTime optimized away
|
|
137
|
+
|
|
138
|
+
// CORRECT — always use the uniform in a way the compiler can't optimize out
|
|
139
|
+
uniform float iTime;
|
|
140
|
+
float t = iTime * 0.0; // Always use iTime somehow
|
|
141
|
+
if (someCondition) { x = t; }
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
## Complete WebGL2 Adaptation Checklist
|
|
145
|
+
|
|
146
|
+
When generating standalone HTML pages:
|
|
147
|
+
|
|
148
|
+
1. **Shader Version**: `#version 300 es` must be the very first line
|
|
149
|
+
2. **Fragment Output**: Declare `out vec4 fragColor;`
|
|
150
|
+
3. **Entry Point**: Wrap `mainImage()` in `void main()` that calls `mainImage(fragColor, gl_FragCoord.xy)`
|
|
151
|
+
4. **Fragment Coord**: Use `gl_FragCoord.xy` not `fragCoord`
|
|
152
|
+
5. **Preprocessor**: Don't use functions in `#define` macros
|
|
153
|
+
6. **Function Order**: Declare functions before they are used, or use forward declarations
|
|
154
|
+
7. **Texture**: Use `texture()` not `texture2D()`
|
|
155
|
+
8. **Attributes**: `attribute` → `in`, `varying` → `in`/`out`
|
|
156
|
+
|
|
157
|
+
## Common Error Messages Reference
|
|
158
|
+
|
|
159
|
+
| Error Message | Likely Cause | Solution |
|
|
160
|
+
|---|---|---|
|
|
161
|
+
| `'fragCoord' : undeclared identifier` | Using `fragCoord` instead of `gl_FragCoord.xy` | Replace with `gl_FragCoord.xy` |
|
|
162
|
+
| `'' : Missing main()` | No `main()` function defined | Add wrapper `void main() { mainImage(...); }` |
|
|
163
|
+
| `'function' : no matching overloaded function` | Wrong argument types or function order | Check parameter types, reorder functions |
|
|
164
|
+
| `return' : function return is not matching` | Return type mismatch | Verify return expression matches declared return type |
|
|
165
|
+
| `#version` must be first | Leading whitespace in shader source | Use `.trim()` when extracting from script tags |
|
|
166
|
+
| Uniform `null` from `getUniformLocation` | Uniform optimized away | Ensure uniform is actually used in shader code |
|
|
167
|
+
|
|
168
|
+
## Further Reading
|
|
169
|
+
|
|
170
|
+
See [reference/webgl-pitfalls.md](../reference/webgl-pitfalls.md) for additional debugging techniques.
|