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