@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.
Files changed (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/THIRD_PARTY_NOTICES.md +64 -0
  4. package/extensions/index.ts +6 -0
  5. package/install.sh +5 -0
  6. package/manifests/adapter-evidence.json +45 -0
  7. package/manifests/capabilities.json +124 -0
  8. package/manifests/live-verification.json +26 -0
  9. package/manifests/provenance.json +71 -0
  10. package/manifests/roles.json +474 -0
  11. package/manifests/sbom.json +7797 -0
  12. package/manifests/skill-compatibility.json +8100 -0
  13. package/manifests/subagent-provenance.json +37 -0
  14. package/package.json +91 -0
  15. package/prompts/build.md +8 -0
  16. package/prompts/define.md +8 -0
  17. package/prompts/ideate.md +8 -0
  18. package/prompts/local-review.md +8 -0
  19. package/prompts/ship.md +8 -0
  20. package/roles/agent-evaluator.md +47 -0
  21. package/roles/ai-regression-scout.md +47 -0
  22. package/roles/browser-qa-runner.md +47 -0
  23. package/roles/code-reviewer.md +47 -0
  24. package/roles/code-scout.md +47 -0
  25. package/roles/convergence-reviewer.md +55 -0
  26. package/roles/doc-researcher.md +47 -0
  27. package/roles/e2e-artifact-runner.md +47 -0
  28. package/roles/implementer.md +47 -0
  29. package/roles/opensource-sanitizer.md +47 -0
  30. package/roles/plan-auditor.md +47 -0
  31. package/roles/pr-test-analyzer.md +47 -0
  32. package/roles/security-auditor.md +47 -0
  33. package/roles/silent-failure-reviewer.md +47 -0
  34. package/roles/spec-miner.md +47 -0
  35. package/roles/test-coverage-reviewer.md +47 -0
  36. package/roles/test-engineer.md +48 -0
  37. package/roles/web-performance-auditor.md +47 -0
  38. package/roles/web-researcher.md +47 -0
  39. package/scripts/apply-adapter-evidence.ts +73 -0
  40. package/scripts/bootstrap.sh +180 -0
  41. package/scripts/generate-provenance.ts +143 -0
  42. package/scripts/local-package-e2e.ts +51 -0
  43. package/scripts/sync-roles.ts +213 -0
  44. package/scripts/sync-skills.ts +356 -0
  45. package/scripts/validate-runtime.ts +11 -0
  46. package/skills/academic-paper-review/SKILL.md +81 -0
  47. package/skills/agents-md-initialization/SKILL.md +121 -0
  48. package/skills/agents-md-initialization/references/agents-template.md +83 -0
  49. package/skills/agents-md-initialization/references/agents_md.py +215 -0
  50. package/skills/ai-regression-scout/SKILL.md +24 -0
  51. package/skills/aili-delivery-flow/SKILL.md +125 -0
  52. package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
  53. package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
  54. package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
  55. package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
  56. package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
  57. package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
  58. package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
  59. package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
  60. package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
  61. package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
  62. package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
  63. package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
  64. package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
  65. package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
  66. package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
  67. package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
  68. package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
  69. package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
  70. package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
  71. package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
  72. package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
  73. package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
  74. package/skills/android-native-dev/SKILL.md +722 -0
  75. package/skills/android-native-dev/references/accessibility.md +209 -0
  76. package/skills/android-native-dev/references/adaptive-screens.md +231 -0
  77. package/skills/android-native-dev/references/design-style-guide.md +365 -0
  78. package/skills/android-native-dev/references/functional-requirements.md +229 -0
  79. package/skills/android-native-dev/references/motion-system.md +203 -0
  80. package/skills/android-native-dev/references/performance-stability.md +223 -0
  81. package/skills/android-native-dev/references/privacy-security.md +244 -0
  82. package/skills/android-native-dev/references/testing.md +554 -0
  83. package/skills/android-native-dev/references/visual-design.md +246 -0
  84. package/skills/api-and-interface-design/SKILL.md +318 -0
  85. package/skills/browser-qa/SKILL.md +32 -0
  86. package/skills/browser-testing-with-devtools/SKILL.md +323 -0
  87. package/skills/build-failure-repair/SKILL.md +49 -0
  88. package/skills/chart-visualization/SKILL.md +73 -0
  89. package/skills/ci-cd-and-automation/SKILL.md +353 -0
  90. package/skills/code-review-and-quality/SKILL.md +375 -0
  91. package/skills/code-review-quality-gates/SKILL.md +132 -0
  92. package/skills/code-simplification/SKILL.md +371 -0
  93. package/skills/comment-accuracy-review/SKILL.md +37 -0
  94. package/skills/consulting-analysis/SKILL.md +69 -0
  95. package/skills/context-engineering/SKILL.md +375 -0
  96. package/skills/coverage-review/SKILL.md +24 -0
  97. package/skills/data-analysis/SKILL.md +74 -0
  98. package/skills/deprecation-and-migration/SKILL.md +222 -0
  99. package/skills/documentation-and-adrs/SKILL.md +330 -0
  100. package/skills/e2e-artifact-handling/SKILL.md +30 -0
  101. package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
  102. package/skills/explain-by-allegory/SKILL.md +99 -0
  103. package/skills/flutter-dev/SKILL.md +162 -0
  104. package/skills/flutter-dev/references/animations.md +497 -0
  105. package/skills/flutter-dev/references/bloc-state.md +281 -0
  106. package/skills/flutter-dev/references/forms.md +656 -0
  107. package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
  108. package/skills/flutter-dev/references/localization.md +510 -0
  109. package/skills/flutter-dev/references/networking.md +566 -0
  110. package/skills/flutter-dev/references/performance.md +305 -0
  111. package/skills/flutter-dev/references/platform-specific.md +417 -0
  112. package/skills/flutter-dev/references/project-structure.md +273 -0
  113. package/skills/flutter-dev/references/riverpod-state.md +232 -0
  114. package/skills/flutter-dev/references/testing.md +364 -0
  115. package/skills/flutter-dev/references/widget-patterns.md +233 -0
  116. package/skills/frontend-dev/SKILL.md +468 -0
  117. package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  118. package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  119. package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  120. package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
  121. package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  122. package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
  123. package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
  124. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  125. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  126. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  127. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  128. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  129. package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  130. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  131. package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
  132. package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
  133. package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
  134. package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
  135. package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
  136. package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
  137. package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
  138. package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
  139. package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
  140. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  141. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  142. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  143. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  144. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  145. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  146. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  147. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  148. package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  149. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  150. package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  151. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  152. package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  153. package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  154. package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
  155. package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
  156. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  157. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  158. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  159. package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
  160. package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
  161. package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
  162. package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  163. package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  164. package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
  165. package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  166. package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
  167. package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
  168. package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
  169. package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
  170. package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
  171. package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
  172. package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  173. package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  174. package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
  175. package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
  176. package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
  177. package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  178. package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
  179. package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
  180. package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  181. package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  182. package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
  183. package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  184. package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
  185. package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  186. package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  187. package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
  188. package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
  189. package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
  190. package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
  191. package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
  192. package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  193. package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
  194. package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
  195. package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
  196. package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
  197. package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  198. package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
  199. package/skills/frontend-dev/references/env-setup.md +33 -0
  200. package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
  201. package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
  202. package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
  203. package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
  204. package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
  205. package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
  206. package/skills/frontend-dev/references/motion-recipes.md +407 -0
  207. package/skills/frontend-dev/references/troubleshooting.md +85 -0
  208. package/skills/frontend-dev/scripts/minimax_image.py +137 -0
  209. package/skills/frontend-dev/scripts/minimax_music.py +157 -0
  210. package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
  211. package/skills/frontend-dev/scripts/minimax_video.py +187 -0
  212. package/skills/frontend-dev/templates/generator_template.js +223 -0
  213. package/skills/frontend-dev/templates/viewer.html +599 -0
  214. package/skills/frontend-ui-engineering/SKILL.md +367 -0
  215. package/skills/fullstack-dev/SKILL.md +819 -0
  216. package/skills/fullstack-dev/references/api-design.md +444 -0
  217. package/skills/fullstack-dev/references/auth-flow.md +165 -0
  218. package/skills/fullstack-dev/references/db-schema.md +706 -0
  219. package/skills/fullstack-dev/references/django-best-practices.md +466 -0
  220. package/skills/fullstack-dev/references/environment-management.md +78 -0
  221. package/skills/fullstack-dev/references/release-checklist.md +278 -0
  222. package/skills/fullstack-dev/references/technology-selection.md +254 -0
  223. package/skills/fullstack-dev/references/testing-strategy.md +404 -0
  224. package/skills/git-workflow-and-versioning/SKILL.md +446 -0
  225. package/skills/github-evidence-triage/SKILL.md +115 -0
  226. package/skills/harness-evolution/SKILL.md +59 -0
  227. package/skills/harness-evolution/references/activation-matrix.md +13 -0
  228. package/skills/harness-evolution/references/approval-policy.md +20 -0
  229. package/skills/harness-evolution/references/change-report-template.md +33 -0
  230. package/skills/harness-evolution/references/component-taxonomy.md +19 -0
  231. package/skills/harness-evolution/references/verdict-policy.md +13 -0
  232. package/skills/harness-issue-triage/SKILL.md +72 -0
  233. package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
  234. package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
  235. package/skills/harness-optimization-audit/SKILL.md +125 -0
  236. package/skills/idea-refine/SKILL.md +191 -0
  237. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  238. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  239. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
  240. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
  241. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
  242. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
  243. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
  244. package/skills/incremental-implementation/SKILL.md +252 -0
  245. package/skills/ios-application-dev/SKILL.md +212 -0
  246. package/skills/ios-application-dev/references/accessibility.md +259 -0
  247. package/skills/ios-application-dev/references/graphics-animation.md +350 -0
  248. package/skills/ios-application-dev/references/layout-system.md +199 -0
  249. package/skills/ios-application-dev/references/metal-shader.md +178 -0
  250. package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
  251. package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
  252. package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
  253. package/skills/ios-application-dev/references/system-integration.md +401 -0
  254. package/skills/ios-application-dev/references/uikit-components.md +297 -0
  255. package/skills/local-review-gate/SKILL.md +207 -0
  256. package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
  257. package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
  258. package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
  259. package/skills/local-review-gate/references/graphify-local-review.md +33 -0
  260. package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
  261. package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
  262. package/skills/local-review-gate/references/upstream-provenance.md +61 -0
  263. package/skills/mature-project-pattern-research/SKILL.md +155 -0
  264. package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
  265. package/skills/minimax-docx/LICENSE +21 -0
  266. package/skills/minimax-docx/SKILL.md +273 -0
  267. package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
  268. package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
  269. package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
  270. package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
  271. package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
  272. package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
  273. package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
  274. package/skills/minimax-docx/references/cjk_typography.md +357 -0
  275. package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
  276. package/skills/minimax-docx/references/comments_guide.md +191 -0
  277. package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
  278. package/skills/minimax-docx/references/design_principles.md +819 -0
  279. package/skills/minimax-docx/references/openxml_element_order.md +308 -0
  280. package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
  281. package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
  282. package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
  283. package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
  284. package/skills/minimax-docx/references/openxml_units.md +72 -0
  285. package/skills/minimax-docx/references/scenario_a_create.md +284 -0
  286. package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
  287. package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
  288. package/skills/minimax-docx/references/track_changes_guide.md +200 -0
  289. package/skills/minimax-docx/references/troubleshooting.md +506 -0
  290. package/skills/minimax-docx/references/typography_guide.md +294 -0
  291. package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
  292. package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
  293. package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
  294. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
  295. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
  296. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
  297. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
  298. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
  299. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
  300. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
  301. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
  302. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
  303. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
  304. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
  305. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
  306. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
  307. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
  308. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
  309. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
  310. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
  311. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
  312. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
  313. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
  314. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
  315. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
  316. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
  317. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
  318. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
  319. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
  320. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
  321. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
  322. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
  323. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
  324. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
  325. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
  326. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
  327. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
  328. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
  329. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
  330. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
  331. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
  332. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
  333. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
  334. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
  335. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
  336. package/skills/minimax-docx/scripts/env_check.sh +196 -0
  337. package/skills/minimax-docx/scripts/setup.ps1 +274 -0
  338. package/skills/minimax-docx/scripts/setup.sh +504 -0
  339. package/skills/minimax-pdf/README.md +222 -0
  340. package/skills/minimax-pdf/SKILL.md +218 -0
  341. package/skills/minimax-pdf/design/design.md +381 -0
  342. package/skills/minimax-pdf/scripts/cover.py +1579 -0
  343. package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
  344. package/skills/minimax-pdf/scripts/fill_write.py +242 -0
  345. package/skills/minimax-pdf/scripts/make.sh +491 -0
  346. package/skills/minimax-pdf/scripts/merge.py +112 -0
  347. package/skills/minimax-pdf/scripts/palette.py +521 -0
  348. package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
  349. package/skills/minimax-pdf/scripts/render_body.py +1052 -0
  350. package/skills/minimax-pdf/scripts/render_cover.js +111 -0
  351. package/skills/minimax-xlsx/SKILL.md +156 -0
  352. package/skills/minimax-xlsx/references/create.md +691 -0
  353. package/skills/minimax-xlsx/references/edit.md +684 -0
  354. package/skills/minimax-xlsx/references/fix.md +37 -0
  355. package/skills/minimax-xlsx/references/format.md +768 -0
  356. package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
  357. package/skills/minimax-xlsx/references/read-analyze.md +97 -0
  358. package/skills/minimax-xlsx/references/validate.md +772 -0
  359. package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
  360. package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
  361. package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
  362. package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
  363. package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
  364. package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
  365. package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
  366. package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
  367. package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
  368. package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
  369. package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
  370. package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
  371. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
  372. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
  373. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
  374. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
  375. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
  376. package/skills/newsletter-generation/SKILL.md +71 -0
  377. package/skills/oss-release-readiness/SKILL.md +47 -0
  378. package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
  379. package/skills/performance-optimization/SKILL.md +364 -0
  380. package/skills/planning-and-task-breakdown/SKILL.md +290 -0
  381. package/skills/pptx-generator/SKILL.md +275 -0
  382. package/skills/pptx-generator/references/design-system.md +392 -0
  383. package/skills/pptx-generator/references/editing.md +162 -0
  384. package/skills/pptx-generator/references/pitfalls.md +112 -0
  385. package/skills/pptx-generator/references/pptxgenjs.md +420 -0
  386. package/skills/pptx-generator/references/slide-types.md +413 -0
  387. package/skills/pr-test-analysis/SKILL.md +24 -0
  388. package/skills/react-native-dev/SKILL.md +180 -0
  389. package/skills/react-native-dev/references/animations.md +254 -0
  390. package/skills/react-native-dev/references/components.md +124 -0
  391. package/skills/react-native-dev/references/engineering.md +527 -0
  392. package/skills/react-native-dev/references/forms.md +300 -0
  393. package/skills/react-native-dev/references/native-capabilities.md +163 -0
  394. package/skills/react-native-dev/references/navigation.md +271 -0
  395. package/skills/react-native-dev/references/networking.md +346 -0
  396. package/skills/react-native-dev/references/performance.md +215 -0
  397. package/skills/react-native-dev/references/state-management.md +230 -0
  398. package/skills/react-native-dev/references/styling.md +117 -0
  399. package/skills/react-native-dev/references/testing.md +341 -0
  400. package/skills/requirements-grilling/SKILL.md +447 -0
  401. package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
  402. package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
  403. package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
  404. package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
  405. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  406. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  407. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
  408. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
  409. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
  410. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
  411. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
  412. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
  413. package/skills/review-pipeline/SKILL.md +38 -0
  414. package/skills/rose-memory/SKILL.md +210 -0
  415. package/skills/rose-memory/references/README.md +48 -0
  416. package/skills/rose-memory/references/memory_cli.py +2384 -0
  417. package/skills/rose-memory/references/schema.sql +315 -0
  418. package/skills/security-and-hardening/SKILL.md +369 -0
  419. package/skills/session-handoff/SKILL.md +88 -0
  420. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
  421. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
  422. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
  423. package/skills/session-handoff/scripts/session_handoff.py +764 -0
  424. package/skills/shader-dev/SKILL.md +316 -0
  425. package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
  426. package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
  427. package/skills/shader-dev/reference/anti-aliasing.md +71 -0
  428. package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
  429. package/skills/shader-dev/reference/camera-effects.md +80 -0
  430. package/skills/shader-dev/reference/cellular-automata.md +635 -0
  431. package/skills/shader-dev/reference/color-palette.md +481 -0
  432. package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
  433. package/skills/shader-dev/reference/domain-repetition.md +436 -0
  434. package/skills/shader-dev/reference/domain-warping.md +419 -0
  435. package/skills/shader-dev/reference/fluid-simulation.md +425 -0
  436. package/skills/shader-dev/reference/fractal-rendering.md +525 -0
  437. package/skills/shader-dev/reference/lighting-model.md +639 -0
  438. package/skills/shader-dev/reference/matrix-transform.md +535 -0
  439. package/skills/shader-dev/reference/multipass-buffer.md +571 -0
  440. package/skills/shader-dev/reference/normal-estimation.md +418 -0
  441. package/skills/shader-dev/reference/particle-system.md +589 -0
  442. package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
  443. package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
  444. package/skills/shader-dev/reference/post-processing.md +375 -0
  445. package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
  446. package/skills/shader-dev/reference/procedural-noise.md +551 -0
  447. package/skills/shader-dev/reference/ray-marching.md +396 -0
  448. package/skills/shader-dev/reference/sdf-2d.md +724 -0
  449. package/skills/shader-dev/reference/sdf-3d.md +805 -0
  450. package/skills/shader-dev/reference/sdf-tricks.md +63 -0
  451. package/skills/shader-dev/reference/shadow-techniques.md +476 -0
  452. package/skills/shader-dev/reference/simulation-physics.md +644 -0
  453. package/skills/shader-dev/reference/sound-synthesis.md +578 -0
  454. package/skills/shader-dev/reference/terrain-rendering.md +839 -0
  455. package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
  456. package/skills/shader-dev/reference/texture-sampling.md +553 -0
  457. package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
  458. package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
  459. package/skills/shader-dev/reference/voxel-rendering.md +701 -0
  460. package/skills/shader-dev/reference/water-ocean.md +445 -0
  461. package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
  462. package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
  463. package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
  464. package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
  465. package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
  466. package/skills/shader-dev/techniques/camera-effects.md +115 -0
  467. package/skills/shader-dev/techniques/cellular-automata.md +531 -0
  468. package/skills/shader-dev/techniques/color-palette.md +380 -0
  469. package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
  470. package/skills/shader-dev/techniques/domain-repetition.md +333 -0
  471. package/skills/shader-dev/techniques/domain-warping.md +414 -0
  472. package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
  473. package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
  474. package/skills/shader-dev/techniques/lighting-model.md +527 -0
  475. package/skills/shader-dev/techniques/matrix-transform.md +455 -0
  476. package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
  477. package/skills/shader-dev/techniques/normal-estimation.md +318 -0
  478. package/skills/shader-dev/techniques/particle-system.md +1203 -0
  479. package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
  480. package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
  481. package/skills/shader-dev/techniques/post-processing.md +788 -0
  482. package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
  483. package/skills/shader-dev/techniques/procedural-noise.md +554 -0
  484. package/skills/shader-dev/techniques/ray-marching.md +467 -0
  485. package/skills/shader-dev/techniques/sdf-2d.md +631 -0
  486. package/skills/shader-dev/techniques/sdf-3d.md +589 -0
  487. package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
  488. package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
  489. package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
  490. package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
  491. package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
  492. package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
  493. package/skills/shader-dev/techniques/texture-sampling.md +382 -0
  494. package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
  495. package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
  496. package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
  497. package/skills/shader-dev/techniques/water-ocean.md +490 -0
  498. package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
  499. package/skills/shipping-and-launch/SKILL.md +334 -0
  500. package/skills/silent-failure-hunting/SKILL.md +24 -0
  501. package/skills/source-driven-development/SKILL.md +223 -0
  502. package/skills/spec-driven-development/SKILL.md +235 -0
  503. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  504. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  505. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
  506. package/skills/strategy-stress-test/SKILL.md +185 -0
  507. package/skills/systematic-literature-review/SKILL.md +77 -0
  508. package/skills/test-document-generator/SKILL.md +152 -0
  509. package/skills/test-document-generator/references/test-document-template.md +45 -0
  510. package/skills/test-driven-development/SKILL.md +399 -0
  511. package/skills/write-skills/GLOSSARY.md +113 -0
  512. package/skills/write-skills/SKILL.md +133 -0
  513. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
  514. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
  515. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
  516. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
  517. package/src/runtime/child-guard.ts +70 -0
  518. package/src/runtime/conflicts.ts +25 -0
  519. package/src/runtime/contracts.ts +9 -0
  520. package/src/runtime/doctor.ts +134 -0
  521. package/src/runtime/global-resources.ts +152 -0
  522. package/src/runtime/index.ts +23 -0
  523. package/src/runtime/lifecycle.ts +19 -0
  524. package/src/runtime/native-integrations.ts +44 -0
  525. package/src/runtime/path-boundaries.ts +69 -0
  526. package/src/runtime/registry.ts +213 -0
  527. package/src/runtime/roles.ts +64 -0
  528. package/src/runtime/rose-context.ts +24 -0
  529. package/src/runtime/subagents.ts +426 -0
  530. package/templates/APPEND_SYSTEM.md +12 -0
  531. 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.