@rosetears/aili-pi 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/THIRD_PARTY_NOTICES.md +64 -0
- package/extensions/index.ts +6 -0
- package/install.sh +5 -0
- package/manifests/adapter-evidence.json +45 -0
- package/manifests/capabilities.json +124 -0
- package/manifests/live-verification.json +26 -0
- package/manifests/provenance.json +71 -0
- package/manifests/roles.json +474 -0
- package/manifests/sbom.json +7797 -0
- package/manifests/skill-compatibility.json +8100 -0
- package/manifests/subagent-provenance.json +37 -0
- package/package.json +91 -0
- package/prompts/build.md +8 -0
- package/prompts/define.md +8 -0
- package/prompts/ideate.md +8 -0
- package/prompts/local-review.md +8 -0
- package/prompts/ship.md +8 -0
- package/roles/agent-evaluator.md +47 -0
- package/roles/ai-regression-scout.md +47 -0
- package/roles/browser-qa-runner.md +47 -0
- package/roles/code-reviewer.md +47 -0
- package/roles/code-scout.md +47 -0
- package/roles/convergence-reviewer.md +55 -0
- package/roles/doc-researcher.md +47 -0
- package/roles/e2e-artifact-runner.md +47 -0
- package/roles/implementer.md +47 -0
- package/roles/opensource-sanitizer.md +47 -0
- package/roles/plan-auditor.md +47 -0
- package/roles/pr-test-analyzer.md +47 -0
- package/roles/security-auditor.md +47 -0
- package/roles/silent-failure-reviewer.md +47 -0
- package/roles/spec-miner.md +47 -0
- package/roles/test-coverage-reviewer.md +47 -0
- package/roles/test-engineer.md +48 -0
- package/roles/web-performance-auditor.md +47 -0
- package/roles/web-researcher.md +47 -0
- package/scripts/apply-adapter-evidence.ts +73 -0
- package/scripts/bootstrap.sh +180 -0
- package/scripts/generate-provenance.ts +143 -0
- package/scripts/local-package-e2e.ts +51 -0
- package/scripts/sync-roles.ts +213 -0
- package/scripts/sync-skills.ts +356 -0
- package/scripts/validate-runtime.ts +11 -0
- package/skills/academic-paper-review/SKILL.md +81 -0
- package/skills/agents-md-initialization/SKILL.md +121 -0
- package/skills/agents-md-initialization/references/agents-template.md +83 -0
- package/skills/agents-md-initialization/references/agents_md.py +215 -0
- package/skills/ai-regression-scout/SKILL.md +24 -0
- package/skills/aili-delivery-flow/SKILL.md +125 -0
- package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
- package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
- package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
- package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
- package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
- package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
- package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
- package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
- package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
- package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
- package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
- package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
- package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
- package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
- package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
- package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
- package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
- package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
- package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
- package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
- package/skills/android-native-dev/SKILL.md +722 -0
- package/skills/android-native-dev/references/accessibility.md +209 -0
- package/skills/android-native-dev/references/adaptive-screens.md +231 -0
- package/skills/android-native-dev/references/design-style-guide.md +365 -0
- package/skills/android-native-dev/references/functional-requirements.md +229 -0
- package/skills/android-native-dev/references/motion-system.md +203 -0
- package/skills/android-native-dev/references/performance-stability.md +223 -0
- package/skills/android-native-dev/references/privacy-security.md +244 -0
- package/skills/android-native-dev/references/testing.md +554 -0
- package/skills/android-native-dev/references/visual-design.md +246 -0
- package/skills/api-and-interface-design/SKILL.md +318 -0
- package/skills/browser-qa/SKILL.md +32 -0
- package/skills/browser-testing-with-devtools/SKILL.md +323 -0
- package/skills/build-failure-repair/SKILL.md +49 -0
- package/skills/chart-visualization/SKILL.md +73 -0
- package/skills/ci-cd-and-automation/SKILL.md +353 -0
- package/skills/code-review-and-quality/SKILL.md +375 -0
- package/skills/code-review-quality-gates/SKILL.md +132 -0
- package/skills/code-simplification/SKILL.md +371 -0
- package/skills/comment-accuracy-review/SKILL.md +37 -0
- package/skills/consulting-analysis/SKILL.md +69 -0
- package/skills/context-engineering/SKILL.md +375 -0
- package/skills/coverage-review/SKILL.md +24 -0
- package/skills/data-analysis/SKILL.md +74 -0
- package/skills/deprecation-and-migration/SKILL.md +222 -0
- package/skills/documentation-and-adrs/SKILL.md +330 -0
- package/skills/e2e-artifact-handling/SKILL.md +30 -0
- package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
- package/skills/explain-by-allegory/SKILL.md +99 -0
- package/skills/flutter-dev/SKILL.md +162 -0
- package/skills/flutter-dev/references/animations.md +497 -0
- package/skills/flutter-dev/references/bloc-state.md +281 -0
- package/skills/flutter-dev/references/forms.md +656 -0
- package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
- package/skills/flutter-dev/references/localization.md +510 -0
- package/skills/flutter-dev/references/networking.md +566 -0
- package/skills/flutter-dev/references/performance.md +305 -0
- package/skills/flutter-dev/references/platform-specific.md +417 -0
- package/skills/flutter-dev/references/project-structure.md +273 -0
- package/skills/flutter-dev/references/riverpod-state.md +232 -0
- package/skills/flutter-dev/references/testing.md +364 -0
- package/skills/flutter-dev/references/widget-patterns.md +233 -0
- package/skills/frontend-dev/SKILL.md +468 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
- package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
- package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
- package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
- package/skills/frontend-dev/references/env-setup.md +33 -0
- package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
- package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
- package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
- package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
- package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
- package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
- package/skills/frontend-dev/references/motion-recipes.md +407 -0
- package/skills/frontend-dev/references/troubleshooting.md +85 -0
- package/skills/frontend-dev/scripts/minimax_image.py +137 -0
- package/skills/frontend-dev/scripts/minimax_music.py +157 -0
- package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
- package/skills/frontend-dev/scripts/minimax_video.py +187 -0
- package/skills/frontend-dev/templates/generator_template.js +223 -0
- package/skills/frontend-dev/templates/viewer.html +599 -0
- package/skills/frontend-ui-engineering/SKILL.md +367 -0
- package/skills/fullstack-dev/SKILL.md +819 -0
- package/skills/fullstack-dev/references/api-design.md +444 -0
- package/skills/fullstack-dev/references/auth-flow.md +165 -0
- package/skills/fullstack-dev/references/db-schema.md +706 -0
- package/skills/fullstack-dev/references/django-best-practices.md +466 -0
- package/skills/fullstack-dev/references/environment-management.md +78 -0
- package/skills/fullstack-dev/references/release-checklist.md +278 -0
- package/skills/fullstack-dev/references/technology-selection.md +254 -0
- package/skills/fullstack-dev/references/testing-strategy.md +404 -0
- package/skills/git-workflow-and-versioning/SKILL.md +446 -0
- package/skills/github-evidence-triage/SKILL.md +115 -0
- package/skills/harness-evolution/SKILL.md +59 -0
- package/skills/harness-evolution/references/activation-matrix.md +13 -0
- package/skills/harness-evolution/references/approval-policy.md +20 -0
- package/skills/harness-evolution/references/change-report-template.md +33 -0
- package/skills/harness-evolution/references/component-taxonomy.md +19 -0
- package/skills/harness-evolution/references/verdict-policy.md +13 -0
- package/skills/harness-issue-triage/SKILL.md +72 -0
- package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
- package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
- package/skills/harness-optimization-audit/SKILL.md +125 -0
- package/skills/idea-refine/SKILL.md +191 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
- package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
- package/skills/incremental-implementation/SKILL.md +252 -0
- package/skills/ios-application-dev/SKILL.md +212 -0
- package/skills/ios-application-dev/references/accessibility.md +259 -0
- package/skills/ios-application-dev/references/graphics-animation.md +350 -0
- package/skills/ios-application-dev/references/layout-system.md +199 -0
- package/skills/ios-application-dev/references/metal-shader.md +178 -0
- package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
- package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
- package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
- package/skills/ios-application-dev/references/system-integration.md +401 -0
- package/skills/ios-application-dev/references/uikit-components.md +297 -0
- package/skills/local-review-gate/SKILL.md +207 -0
- package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
- package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
- package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
- package/skills/local-review-gate/references/graphify-local-review.md +33 -0
- package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
- package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
- package/skills/local-review-gate/references/upstream-provenance.md +61 -0
- package/skills/mature-project-pattern-research/SKILL.md +155 -0
- package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
- package/skills/minimax-docx/LICENSE +21 -0
- package/skills/minimax-docx/SKILL.md +273 -0
- package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
- package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
- package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
- package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
- package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
- package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
- package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
- package/skills/minimax-docx/references/cjk_typography.md +357 -0
- package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
- package/skills/minimax-docx/references/comments_guide.md +191 -0
- package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
- package/skills/minimax-docx/references/design_principles.md +819 -0
- package/skills/minimax-docx/references/openxml_element_order.md +308 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
- package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
- package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
- package/skills/minimax-docx/references/openxml_units.md +72 -0
- package/skills/minimax-docx/references/scenario_a_create.md +284 -0
- package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
- package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
- package/skills/minimax-docx/references/track_changes_guide.md +200 -0
- package/skills/minimax-docx/references/troubleshooting.md +506 -0
- package/skills/minimax-docx/references/typography_guide.md +294 -0
- package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
- package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
- package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
- package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
- package/skills/minimax-docx/scripts/env_check.sh +196 -0
- package/skills/minimax-docx/scripts/setup.ps1 +274 -0
- package/skills/minimax-docx/scripts/setup.sh +504 -0
- package/skills/minimax-pdf/README.md +222 -0
- package/skills/minimax-pdf/SKILL.md +218 -0
- package/skills/minimax-pdf/design/design.md +381 -0
- package/skills/minimax-pdf/scripts/cover.py +1579 -0
- package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
- package/skills/minimax-pdf/scripts/fill_write.py +242 -0
- package/skills/minimax-pdf/scripts/make.sh +491 -0
- package/skills/minimax-pdf/scripts/merge.py +112 -0
- package/skills/minimax-pdf/scripts/palette.py +521 -0
- package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
- package/skills/minimax-pdf/scripts/render_body.py +1052 -0
- package/skills/minimax-pdf/scripts/render_cover.js +111 -0
- package/skills/minimax-xlsx/SKILL.md +156 -0
- package/skills/minimax-xlsx/references/create.md +691 -0
- package/skills/minimax-xlsx/references/edit.md +684 -0
- package/skills/minimax-xlsx/references/fix.md +37 -0
- package/skills/minimax-xlsx/references/format.md +768 -0
- package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
- package/skills/minimax-xlsx/references/read-analyze.md +97 -0
- package/skills/minimax-xlsx/references/validate.md +772 -0
- package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
- package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
- package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
- package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
- package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
- package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
- package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
- package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
- package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
- package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
- package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
- package/skills/newsletter-generation/SKILL.md +71 -0
- package/skills/oss-release-readiness/SKILL.md +47 -0
- package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
- package/skills/performance-optimization/SKILL.md +364 -0
- package/skills/planning-and-task-breakdown/SKILL.md +290 -0
- package/skills/pptx-generator/SKILL.md +275 -0
- package/skills/pptx-generator/references/design-system.md +392 -0
- package/skills/pptx-generator/references/editing.md +162 -0
- package/skills/pptx-generator/references/pitfalls.md +112 -0
- package/skills/pptx-generator/references/pptxgenjs.md +420 -0
- package/skills/pptx-generator/references/slide-types.md +413 -0
- package/skills/pr-test-analysis/SKILL.md +24 -0
- package/skills/react-native-dev/SKILL.md +180 -0
- package/skills/react-native-dev/references/animations.md +254 -0
- package/skills/react-native-dev/references/components.md +124 -0
- package/skills/react-native-dev/references/engineering.md +527 -0
- package/skills/react-native-dev/references/forms.md +300 -0
- package/skills/react-native-dev/references/native-capabilities.md +163 -0
- package/skills/react-native-dev/references/navigation.md +271 -0
- package/skills/react-native-dev/references/networking.md +346 -0
- package/skills/react-native-dev/references/performance.md +215 -0
- package/skills/react-native-dev/references/state-management.md +230 -0
- package/skills/react-native-dev/references/styling.md +117 -0
- package/skills/react-native-dev/references/testing.md +341 -0
- package/skills/requirements-grilling/SKILL.md +447 -0
- package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
- package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
- package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
- package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
- package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
- package/skills/review-pipeline/SKILL.md +38 -0
- package/skills/rose-memory/SKILL.md +210 -0
- package/skills/rose-memory/references/README.md +48 -0
- package/skills/rose-memory/references/memory_cli.py +2384 -0
- package/skills/rose-memory/references/schema.sql +315 -0
- package/skills/security-and-hardening/SKILL.md +369 -0
- package/skills/session-handoff/SKILL.md +88 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
- package/skills/session-handoff/scripts/session_handoff.py +764 -0
- package/skills/shader-dev/SKILL.md +316 -0
- package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
- package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
- package/skills/shader-dev/reference/anti-aliasing.md +71 -0
- package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
- package/skills/shader-dev/reference/camera-effects.md +80 -0
- package/skills/shader-dev/reference/cellular-automata.md +635 -0
- package/skills/shader-dev/reference/color-palette.md +481 -0
- package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
- package/skills/shader-dev/reference/domain-repetition.md +436 -0
- package/skills/shader-dev/reference/domain-warping.md +419 -0
- package/skills/shader-dev/reference/fluid-simulation.md +425 -0
- package/skills/shader-dev/reference/fractal-rendering.md +525 -0
- package/skills/shader-dev/reference/lighting-model.md +639 -0
- package/skills/shader-dev/reference/matrix-transform.md +535 -0
- package/skills/shader-dev/reference/multipass-buffer.md +571 -0
- package/skills/shader-dev/reference/normal-estimation.md +418 -0
- package/skills/shader-dev/reference/particle-system.md +589 -0
- package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
- package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
- package/skills/shader-dev/reference/post-processing.md +375 -0
- package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
- package/skills/shader-dev/reference/procedural-noise.md +551 -0
- package/skills/shader-dev/reference/ray-marching.md +396 -0
- package/skills/shader-dev/reference/sdf-2d.md +724 -0
- package/skills/shader-dev/reference/sdf-3d.md +805 -0
- package/skills/shader-dev/reference/sdf-tricks.md +63 -0
- package/skills/shader-dev/reference/shadow-techniques.md +476 -0
- package/skills/shader-dev/reference/simulation-physics.md +644 -0
- package/skills/shader-dev/reference/sound-synthesis.md +578 -0
- package/skills/shader-dev/reference/terrain-rendering.md +839 -0
- package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
- package/skills/shader-dev/reference/texture-sampling.md +553 -0
- package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
- package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
- package/skills/shader-dev/reference/voxel-rendering.md +701 -0
- package/skills/shader-dev/reference/water-ocean.md +445 -0
- package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
- package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
- package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
- package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
- package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
- package/skills/shader-dev/techniques/camera-effects.md +115 -0
- package/skills/shader-dev/techniques/cellular-automata.md +531 -0
- package/skills/shader-dev/techniques/color-palette.md +380 -0
- package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
- package/skills/shader-dev/techniques/domain-repetition.md +333 -0
- package/skills/shader-dev/techniques/domain-warping.md +414 -0
- package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
- package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
- package/skills/shader-dev/techniques/lighting-model.md +527 -0
- package/skills/shader-dev/techniques/matrix-transform.md +455 -0
- package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
- package/skills/shader-dev/techniques/normal-estimation.md +318 -0
- package/skills/shader-dev/techniques/particle-system.md +1203 -0
- package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
- package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
- package/skills/shader-dev/techniques/post-processing.md +788 -0
- package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
- package/skills/shader-dev/techniques/procedural-noise.md +554 -0
- package/skills/shader-dev/techniques/ray-marching.md +467 -0
- package/skills/shader-dev/techniques/sdf-2d.md +631 -0
- package/skills/shader-dev/techniques/sdf-3d.md +589 -0
- package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
- package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
- package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
- package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
- package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
- package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
- package/skills/shader-dev/techniques/texture-sampling.md +382 -0
- package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
- package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
- package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
- package/skills/shader-dev/techniques/water-ocean.md +490 -0
- package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
- package/skills/shipping-and-launch/SKILL.md +334 -0
- package/skills/silent-failure-hunting/SKILL.md +24 -0
- package/skills/source-driven-development/SKILL.md +223 -0
- package/skills/spec-driven-development/SKILL.md +235 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
- package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
- package/skills/strategy-stress-test/SKILL.md +185 -0
- package/skills/systematic-literature-review/SKILL.md +77 -0
- package/skills/test-document-generator/SKILL.md +152 -0
- package/skills/test-document-generator/references/test-document-template.md +45 -0
- package/skills/test-driven-development/SKILL.md +399 -0
- package/skills/write-skills/GLOSSARY.md +113 -0
- package/skills/write-skills/SKILL.md +133 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
- package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
- package/src/runtime/child-guard.ts +70 -0
- package/src/runtime/conflicts.ts +25 -0
- package/src/runtime/contracts.ts +9 -0
- package/src/runtime/doctor.ts +134 -0
- package/src/runtime/global-resources.ts +152 -0
- package/src/runtime/index.ts +23 -0
- package/src/runtime/lifecycle.ts +19 -0
- package/src/runtime/native-integrations.ts +44 -0
- package/src/runtime/path-boundaries.ts +69 -0
- package/src/runtime/registry.ts +213 -0
- package/src/runtime/roles.ts +64 -0
- package/src/runtime/rose-context.ts +24 -0
- package/src/runtime/subagents.ts +426 -0
- package/templates/APPEND_SYSTEM.md +12 -0
- package/upstream/aili-workflows.lock.json +3226 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
## WebGL2 Adaptation Requirements
|
|
2
|
+
|
|
3
|
+
The code templates in this document use ShaderToy GLSL style. When generating standalone HTML pages, you must adapt for WebGL2:
|
|
4
|
+
|
|
5
|
+
- Use `canvas.getContext("webgl2")`
|
|
6
|
+
- First line of shaders: `#version 300 es`, add `precision highp float;` in fragment shaders
|
|
7
|
+
- Vertex shader: `attribute` -> `in`, `varying` -> `out`
|
|
8
|
+
- Fragment shader: `varying` -> `in`, `gl_FragColor` -> custom output variable (must be declared before `void main()`, e.g. `out vec4 outColor;`), `texture2D()` -> `texture()`
|
|
9
|
+
- ShaderToy's `void mainImage(out vec4 fragColor, in vec2 fragCoord)` must be adapted to the standard `void main()` entry point
|
|
10
|
+
|
|
11
|
+
# CSG Boolean Operations
|
|
12
|
+
|
|
13
|
+
## Core Principles
|
|
14
|
+
|
|
15
|
+
CSG boolean operations are per-point value operations on two distance fields:
|
|
16
|
+
|
|
17
|
+
| Operation | Expression | Meaning |
|
|
18
|
+
|-----------|-----------|---------|
|
|
19
|
+
| Union | `min(d1, d2)` | Take nearest surface, keeping both shapes |
|
|
20
|
+
| Intersection | `max(d1, d2)` | Take farthest surface, keeping only the overlap |
|
|
21
|
+
| Subtraction | `max(d1, -d2)` | Cut d1 using the interior of d2 |
|
|
22
|
+
|
|
23
|
+
**Smooth booleans** (smooth min/max) introduce a blending band in the transition region. The parameter `k` controls the blend band width (larger = rounder, `k=0` degenerates to hard boolean). Multiple variants exist with different mathematical properties.
|
|
24
|
+
|
|
25
|
+
## Implementation Steps
|
|
26
|
+
|
|
27
|
+
### Step 1: Hard Boolean Operations
|
|
28
|
+
|
|
29
|
+
```glsl
|
|
30
|
+
float opUnion(float d1, float d2) { return min(d1, d2); }
|
|
31
|
+
float opIntersection(float d1, float d2) { return max(d1, d2); }
|
|
32
|
+
float opSubtraction(float d1, float d2) { return max(d1, -d2); }
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Step 2: Smooth Union (Polynomial Version)
|
|
36
|
+
|
|
37
|
+
```glsl
|
|
38
|
+
// k: blend radius, typical values 0.05~0.5
|
|
39
|
+
float opSmoothUnion(float d1, float d2, float k) {
|
|
40
|
+
float h = clamp(0.5 + 0.5 * (d2 - d1) / k, 0.0, 1.0);
|
|
41
|
+
return mix(d2, d1, h) - k * h * (1.0 - h);
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Step 3: Smooth Subtraction and Intersection (Polynomial Version)
|
|
46
|
+
|
|
47
|
+
```glsl
|
|
48
|
+
float opSmoothSubtraction(float d1, float d2, float k) {
|
|
49
|
+
float h = clamp(0.5 - 0.5 * (d2 + d1) / k, 0.0, 1.0);
|
|
50
|
+
return mix(d2, -d1, h) + k * h * (1.0 - h);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
float opSmoothIntersection(float d1, float d2, float k) {
|
|
54
|
+
float h = clamp(0.5 - 0.5 * (d2 - d1) / k, 0.0, 1.0);
|
|
55
|
+
return mix(d2, d1, h) + k * h * (1.0 - h);
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Step 4: Quadratic Optimized Version (Recommended as Default)
|
|
60
|
+
|
|
61
|
+
```glsl
|
|
62
|
+
float smin(float a, float b, float k) {
|
|
63
|
+
float h = max(k - abs(a - b), 0.0);
|
|
64
|
+
return min(a, b) - h * h * 0.25 / k;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
float smax(float a, float b, float k) {
|
|
68
|
+
float h = max(k - abs(a - b), 0.0);
|
|
69
|
+
return max(a, b) + h * h * 0.25 / k;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Subtraction via smax
|
|
73
|
+
float sSub(float d1, float d2, float k) {
|
|
74
|
+
return smax(d1, -d2, k);
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Step 4b: Smooth Minimum Variant Library
|
|
79
|
+
|
|
80
|
+
Different smin implementations have different mathematical properties. Choose based on your needs:
|
|
81
|
+
|
|
82
|
+
| Variant | Rigid | Associative | Best For |
|
|
83
|
+
|---------|-------|-------------|----------|
|
|
84
|
+
| Quadratic (default above) | Yes | No | General use, fastest |
|
|
85
|
+
| Cubic | Yes | No | Smoother C2 transitions |
|
|
86
|
+
| Quartic | Yes | No | Highest quality blending |
|
|
87
|
+
| Exponential | No | Yes | Multi-body blending (order-independent) |
|
|
88
|
+
| Circular Geometric | Yes | Yes | Strict local blending |
|
|
89
|
+
|
|
90
|
+
**Rigid**: preserves original SDF shape outside the blend region (no under-estimation).
|
|
91
|
+
**Associative**: `smin(a, smin(b, c))` == `smin(smin(a, b), c)` — important when blending many objects where evaluation order varies.
|
|
92
|
+
|
|
93
|
+
```glsl
|
|
94
|
+
// --- Cubic Polynomial smin (C2 continuous, smoother transitions) ---
|
|
95
|
+
float sminCubic(float a, float b, float k) {
|
|
96
|
+
k *= 6.0;
|
|
97
|
+
float h = max(k - abs(a - b), 0.0) / k;
|
|
98
|
+
return min(a, b) - h * h * h * k * (1.0 / 6.0);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// --- Quartic Polynomial smin (C3 continuous, highest quality) ---
|
|
102
|
+
float sminQuartic(float a, float b, float k) {
|
|
103
|
+
k *= 16.0 / 3.0;
|
|
104
|
+
float h = max(k - abs(a - b), 0.0) / k;
|
|
105
|
+
return min(a, b) - h * h * h * (4.0 - h) * k * (1.0 / 16.0);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// --- Exponential smin (associative — order independent for multi-body blending) ---
|
|
109
|
+
float sminExp(float a, float b, float k) {
|
|
110
|
+
float r = exp2(-a / k) + exp2(-b / k);
|
|
111
|
+
return -k * log2(r);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// --- Circular Geometric smin (rigid + local + associative) ---
|
|
115
|
+
float sminCircle(float a, float b, float k) {
|
|
116
|
+
k *= 1.0 / (1.0 - sqrt(0.5));
|
|
117
|
+
return max(k, min(a, b)) - length(max(k - vec2(a, b), 0.0));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// --- Gradient-aware smin (carries material/color through blending) ---
|
|
121
|
+
// x = distance, yzw = material properties or color components
|
|
122
|
+
vec4 sminColor(vec4 a, vec4 b, float k) {
|
|
123
|
+
k *= 4.0;
|
|
124
|
+
float h = max(k - abs(a.x - b.x), 0.0) / (2.0 * k);
|
|
125
|
+
return vec4(
|
|
126
|
+
min(a.x, b.x) - h * h * k,
|
|
127
|
+
mix(a.yzw, b.yzw, (a.x < b.x) ? h : 1.0 - h)
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// --- Smooth maximum from any smin variant ---
|
|
132
|
+
// smax(a, b, k) = -smin(-a, -b, k)
|
|
133
|
+
// Smooth subtraction: smax(d1, -d2, k)
|
|
134
|
+
// Smooth intersection: smax(d1, d2, k)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Step 5: Basic SDF Primitives
|
|
138
|
+
|
|
139
|
+
```glsl
|
|
140
|
+
float sdSphere(vec3 p, float r) {
|
|
141
|
+
return length(p) - r;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
float sdBox(vec3 p, vec3 b) {
|
|
145
|
+
vec3 d = abs(p) - b;
|
|
146
|
+
return length(max(d, 0.0)) + min(max(d.x, max(d.y, d.z)), 0.0);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
float sdCylinder(vec3 p, float h, float r) {
|
|
150
|
+
vec2 d = abs(vec2(length(p.xz), p.y)) - vec2(r, h);
|
|
151
|
+
return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Step 6: CSG Composition for Scene Building
|
|
156
|
+
|
|
157
|
+
```glsl
|
|
158
|
+
float mapScene(vec3 p) {
|
|
159
|
+
float cube = sdBox(p, vec3(1.0));
|
|
160
|
+
float sphere = sdSphere(p, 1.2);
|
|
161
|
+
float cylX = sdCylinder(p.yzx, 2.0, 0.4);
|
|
162
|
+
float cylY = sdCylinder(p.xyz, 2.0, 0.4);
|
|
163
|
+
float cylZ = sdCylinder(p.zxy, 2.0, 0.4);
|
|
164
|
+
|
|
165
|
+
// (cube intersect sphere) - three cylinders = nut
|
|
166
|
+
float shape = opIntersection(cube, sphere);
|
|
167
|
+
float holes = opUnion(cylX, opUnion(cylY, cylZ));
|
|
168
|
+
return opSubtraction(shape, holes);
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Step 7: Smooth CSG Modeling for Organic Forms
|
|
173
|
+
|
|
174
|
+
```glsl
|
|
175
|
+
// Use different k values for different body parts: large k for major joints, small k for fine details
|
|
176
|
+
float mapCreature(vec3 p) {
|
|
177
|
+
float body = sdSphere(p, 0.5);
|
|
178
|
+
float head = sdSphere(p - vec3(0.0, 0.6, 0.3), 0.25);
|
|
179
|
+
float d = smin(body, head, 0.15); // large blend
|
|
180
|
+
|
|
181
|
+
float leg = sdCylinder(p - vec3(0.2, -0.5, 0.0), 0.3, 0.08);
|
|
182
|
+
d = smin(d, leg, 0.08); // medium blend
|
|
183
|
+
|
|
184
|
+
float eye = sdSphere(p - vec3(0.05, 0.75, 0.4), 0.05);
|
|
185
|
+
d = smax(d, -eye, 0.02); // small blend for subtraction
|
|
186
|
+
return d;
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Step 8: Ray Marching Main Loop
|
|
191
|
+
|
|
192
|
+
```glsl
|
|
193
|
+
float rayMarch(vec3 ro, vec3 rd, float maxDist) {
|
|
194
|
+
float t = 0.0;
|
|
195
|
+
for (int i = 0; i < MAX_STEPS; i++) {
|
|
196
|
+
vec3 p = ro + rd * t;
|
|
197
|
+
float d = mapScene(p);
|
|
198
|
+
if (d < SURF_DIST) return t;
|
|
199
|
+
t += d;
|
|
200
|
+
if (t > maxDist) break;
|
|
201
|
+
}
|
|
202
|
+
return -1.0;
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Step 9: Normal Calculation (Tetrahedral Sampling, 4 Samples More Efficient Than 6 with Central Differences)
|
|
207
|
+
|
|
208
|
+
```glsl
|
|
209
|
+
vec3 calcNormal(vec3 pos) {
|
|
210
|
+
vec2 e = vec2(0.001, -0.001);
|
|
211
|
+
return normalize(
|
|
212
|
+
e.xyy * mapScene(pos + e.xyy) +
|
|
213
|
+
e.yyx * mapScene(pos + e.yyx) +
|
|
214
|
+
e.yxy * mapScene(pos + e.yxy) +
|
|
215
|
+
e.xxx * mapScene(pos + e.xxx)
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Full Code Template
|
|
221
|
+
|
|
222
|
+
```glsl
|
|
223
|
+
// === CSG Boolean Operations - WebGL2 Full Template ===
|
|
224
|
+
// Note: When generating HTML with this template, pass iTime, iResolution, etc. via uniforms
|
|
225
|
+
|
|
226
|
+
#define MAX_STEPS 128
|
|
227
|
+
#define MAX_DIST 50.0
|
|
228
|
+
#define SURF_DIST 0.001
|
|
229
|
+
#define SMOOTH_K 0.1
|
|
230
|
+
|
|
231
|
+
// === Hard Boolean Operations ===
|
|
232
|
+
float opUnion(float d1, float d2) { return min(d1, d2); }
|
|
233
|
+
float opIntersection(float d1, float d2) { return max(d1, d2); }
|
|
234
|
+
float opSubtraction(float d1, float d2) { return max(d1, -d2); }
|
|
235
|
+
|
|
236
|
+
// === Smooth Boolean Operations (Quadratic Optimized) ===
|
|
237
|
+
float smin(float a, float b, float k) {
|
|
238
|
+
float h = max(k - abs(a - b), 0.0);
|
|
239
|
+
return min(a, b) - h * h * 0.25 / k;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
float smax(float a, float b, float k) {
|
|
243
|
+
float h = max(k - abs(a - b), 0.0);
|
|
244
|
+
return max(a, b) + h * h * 0.25 / k;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// === SDF Primitives ===
|
|
248
|
+
float sdSphere(vec3 p, float r) {
|
|
249
|
+
return length(p) - r;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
float sdBox(vec3 p, vec3 b) {
|
|
253
|
+
vec3 d = abs(p) - b;
|
|
254
|
+
return length(max(d, 0.0)) + min(max(d.x, max(d.y, d.z)), 0.0);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
float sdCylinder(vec3 p, float h, float r) {
|
|
258
|
+
vec2 d = abs(vec2(length(p.xz), p.y)) - vec2(r, h);
|
|
259
|
+
return min(max(d.x, d.y), 0.0) + length(max(d, 0.0));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
float sdEllipsoid(vec3 p, vec3 r) {
|
|
263
|
+
float k0 = length(p / r);
|
|
264
|
+
float k1 = length(p / (r * r));
|
|
265
|
+
return k0 * (k0 - 1.0) / k1;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
float sdCapsule(vec3 p, vec3 a, vec3 b, float r) {
|
|
269
|
+
vec3 pa = p - a, ba = b - a;
|
|
270
|
+
float h = clamp(dot(pa, ba) / dot(ba, ba), 0.0, 1.0);
|
|
271
|
+
return length(pa - ba * h) - r;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// === Scene Definition ===
|
|
275
|
+
float mapScene(vec3 p) {
|
|
276
|
+
// Rotation animation
|
|
277
|
+
float angle = iTime * 0.3;
|
|
278
|
+
float c = cos(angle), s = sin(angle);
|
|
279
|
+
p.xz = mat2(c, -s, s, c) * p.xz;
|
|
280
|
+
|
|
281
|
+
// Primitives
|
|
282
|
+
float cube = sdBox(p, vec3(1.0));
|
|
283
|
+
float sphere = sdSphere(p, 1.25);
|
|
284
|
+
float cylR = 0.45;
|
|
285
|
+
float cylX = sdCylinder(p.yzx, 2.0, cylR);
|
|
286
|
+
float cylY = sdCylinder(p.xyz, 2.0, cylR);
|
|
287
|
+
float cylZ = sdCylinder(p.zxy, 2.0, cylR);
|
|
288
|
+
|
|
289
|
+
// Hard boolean combination: nut = (cube intersect sphere) - three cylinders
|
|
290
|
+
float nut = opSubtraction(
|
|
291
|
+
opIntersection(cube, sphere),
|
|
292
|
+
opUnion(cylX, opUnion(cylY, cylZ))
|
|
293
|
+
);
|
|
294
|
+
|
|
295
|
+
// Organic spheres -- smooth union blending
|
|
296
|
+
float blob1 = sdSphere(p - vec3(1.8, 0.0, 0.0), 0.4);
|
|
297
|
+
float blob2 = sdSphere(p - vec3(-1.8, 0.0, 0.0), 0.4);
|
|
298
|
+
float blob3 = sdSphere(p - vec3(0.0, 1.8, 0.0), 0.4);
|
|
299
|
+
float blobs = smin(blob1, smin(blob2, blob3, 0.3), 0.3);
|
|
300
|
+
|
|
301
|
+
return smin(nut, blobs, 0.15);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// === Normal Calculation (Tetrahedral Sampling) ===
|
|
305
|
+
vec3 calcNormal(vec3 pos) {
|
|
306
|
+
vec2 e = vec2(0.001, -0.001);
|
|
307
|
+
return normalize(
|
|
308
|
+
e.xyy * mapScene(pos + e.xyy) +
|
|
309
|
+
e.yyx * mapScene(pos + e.yyx) +
|
|
310
|
+
e.yxy * mapScene(pos + e.yxy) +
|
|
311
|
+
e.xxx * mapScene(pos + e.xxx)
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// === Ray Marching ===
|
|
316
|
+
float rayMarch(vec3 ro, vec3 rd) {
|
|
317
|
+
float t = 0.0;
|
|
318
|
+
for (int i = 0; i < MAX_STEPS; i++) {
|
|
319
|
+
vec3 p = ro + rd * t;
|
|
320
|
+
float d = mapScene(p);
|
|
321
|
+
if (d < SURF_DIST) return t;
|
|
322
|
+
t += d;
|
|
323
|
+
if (t > MAX_DIST) break;
|
|
324
|
+
}
|
|
325
|
+
return -1.0;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// === Soft Shadows ===
|
|
329
|
+
float calcSoftShadow(vec3 ro, vec3 rd, float k) {
|
|
330
|
+
float res = 1.0;
|
|
331
|
+
float t = 0.02;
|
|
332
|
+
for (int i = 0; i < 64; i++) {
|
|
333
|
+
float h = mapScene(ro + rd * t);
|
|
334
|
+
res = min(res, k * h / t);
|
|
335
|
+
t += clamp(h, 0.01, 0.2);
|
|
336
|
+
if (res < 0.001 || t > 20.0) break;
|
|
337
|
+
}
|
|
338
|
+
return clamp(res, 0.0, 1.0);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// === AO (Ambient Occlusion) ===
|
|
342
|
+
float calcAO(vec3 pos, vec3 nor) {
|
|
343
|
+
float occ = 0.0;
|
|
344
|
+
float sca = 1.0;
|
|
345
|
+
for (int i = 0; i < 5; i++) {
|
|
346
|
+
float h = 0.01 + 0.12 * float(i);
|
|
347
|
+
float d = mapScene(pos + h * nor);
|
|
348
|
+
occ += (h - d) * sca;
|
|
349
|
+
sca *= 0.95;
|
|
350
|
+
}
|
|
351
|
+
return clamp(1.0 - 3.0 * occ, 0.0, 1.0);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// === Main Function (WebGL2 Adapted) ===
|
|
355
|
+
out vec4 outColor;
|
|
356
|
+
void main() {
|
|
357
|
+
vec2 uv = (gl_FragCoord.xy - 0.5 * iResolution.xy) / iResolution.y;
|
|
358
|
+
|
|
359
|
+
// Camera
|
|
360
|
+
float camDist = 4.0;
|
|
361
|
+
float camAngle = 0.3;
|
|
362
|
+
vec3 ro = vec3(
|
|
363
|
+
camDist * cos(iTime * 0.2),
|
|
364
|
+
camDist * sin(camAngle),
|
|
365
|
+
camDist * sin(iTime * 0.2)
|
|
366
|
+
);
|
|
367
|
+
vec3 ta = vec3(0.0, 0.0, 0.0);
|
|
368
|
+
|
|
369
|
+
// Camera matrix
|
|
370
|
+
vec3 ww = normalize(ta - ro);
|
|
371
|
+
vec3 uu = normalize(cross(ww, vec3(0.0, 1.0, 0.0)));
|
|
372
|
+
vec3 vv = cross(uu, ww);
|
|
373
|
+
vec3 rd = normalize(uv.x * uu + uv.y * vv + 2.0 * ww);
|
|
374
|
+
|
|
375
|
+
// Background color
|
|
376
|
+
vec3 col = vec3(0.4, 0.5, 0.6) - 0.3 * rd.y;
|
|
377
|
+
|
|
378
|
+
// Ray marching
|
|
379
|
+
float t = rayMarch(ro, rd);
|
|
380
|
+
if (t > 0.0) {
|
|
381
|
+
vec3 pos = ro + rd * t;
|
|
382
|
+
vec3 nor = calcNormal(pos);
|
|
383
|
+
|
|
384
|
+
vec3 lightDir = normalize(vec3(0.8, 0.6, -0.3));
|
|
385
|
+
float dif = clamp(dot(nor, lightDir), 0.0, 1.0);
|
|
386
|
+
float sha = calcSoftShadow(pos + nor * 0.01, lightDir, 16.0);
|
|
387
|
+
float ao = calcAO(pos, nor);
|
|
388
|
+
float amb = 0.5 + 0.5 * nor.y;
|
|
389
|
+
|
|
390
|
+
vec3 mate = vec3(0.2, 0.3, 0.4);
|
|
391
|
+
col = vec3(0.0);
|
|
392
|
+
col += mate * 2.0 * dif * sha;
|
|
393
|
+
col += mate * 0.3 * amb * ao;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
col = pow(col, vec3(0.4545));
|
|
397
|
+
outColor = vec4(col, 1.0);
|
|
398
|
+
}
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
## Common Variants
|
|
402
|
+
|
|
403
|
+
### Variant 1: Exponential Smooth Union
|
|
404
|
+
|
|
405
|
+
```glsl
|
|
406
|
+
float sminExp(float a, float b, float k) {
|
|
407
|
+
float res = exp(-k * a) + exp(-k * b);
|
|
408
|
+
return -log(res) / k;
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
### Variant 2: Smooth Operations with Color Blending
|
|
413
|
+
|
|
414
|
+
```glsl
|
|
415
|
+
// Returns blend factor for the caller to blend colors
|
|
416
|
+
float sminWithFactor(float a, float b, float k, out float blend) {
|
|
417
|
+
float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0);
|
|
418
|
+
blend = h;
|
|
419
|
+
return mix(b, a, h) - k * h * (1.0 - h);
|
|
420
|
+
}
|
|
421
|
+
// float blend;
|
|
422
|
+
// float d = sminWithFactor(d1, d2, 0.1, blend);
|
|
423
|
+
// vec3 color = mix(color2, color1, blend);
|
|
424
|
+
|
|
425
|
+
// vec3 overload of smax
|
|
426
|
+
vec3 smax(vec3 a, vec3 b, float k) {
|
|
427
|
+
vec3 h = max(k - abs(a - b), 0.0);
|
|
428
|
+
return max(a, b) + h * h * 0.25 / k;
|
|
429
|
+
}
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
### Variant 3: Stepwise CSG Modeling (Architectural/Industrial)
|
|
433
|
+
|
|
434
|
+
```glsl
|
|
435
|
+
float sdBuilding(vec3 p) {
|
|
436
|
+
float walls = sdBox(p, vec3(1.0, 0.8, 1.0));
|
|
437
|
+
vec3 roofP = p;
|
|
438
|
+
roofP.y -= 0.8;
|
|
439
|
+
float roof = sdBox(roofP, vec3(1.2, 0.3, 1.2));
|
|
440
|
+
float d = opUnion(walls, roof);
|
|
441
|
+
|
|
442
|
+
// Cut windows (exploiting symmetry)
|
|
443
|
+
vec3 winP = abs(p);
|
|
444
|
+
winP -= vec3(1.01, 0.3, 0.4);
|
|
445
|
+
float window = sdBox(winP, vec3(0.1, 0.15, 0.12));
|
|
446
|
+
d = opSubtraction(d, window);
|
|
447
|
+
|
|
448
|
+
// Hollow out interior
|
|
449
|
+
float hollow = sdBox(p, vec3(0.95, 0.75, 0.95));
|
|
450
|
+
d = opSubtraction(d, hollow);
|
|
451
|
+
return d;
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
### Variant 4: Large-Scale Organic Character Modeling
|
|
456
|
+
|
|
457
|
+
```glsl
|
|
458
|
+
float mapCharacter(vec3 p) {
|
|
459
|
+
float body = sdEllipsoid(p, vec3(0.5, 0.4, 0.6));
|
|
460
|
+
float head = sdEllipsoid(p - vec3(0.0, 0.5, 0.5), vec3(0.25));
|
|
461
|
+
float d = smin(body, head, 0.2); // large k: wide blend
|
|
462
|
+
|
|
463
|
+
float ear = sdEllipsoid(p - vec3(0.3, 0.6, 0.3), vec3(0.15, 0.2, 0.05));
|
|
464
|
+
d = smin(d, ear, 0.08); // medium blend
|
|
465
|
+
|
|
466
|
+
float nostril = sdSphere(p - vec3(0.0, 0.4, 0.7), 0.03);
|
|
467
|
+
d = smax(d, -nostril, 0.02); // small k: fine sculpting
|
|
468
|
+
return d;
|
|
469
|
+
}
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
## Performance & Composition Tips
|
|
473
|
+
|
|
474
|
+
**Performance:**
|
|
475
|
+
- Bounding volume acceleration: use AABB/bounding spheres to skip distant sub-scenes, reducing `mapScene()` calls
|
|
476
|
+
- Tetrahedral sampling normals (4 samples) outperform central differences (6 samples)
|
|
477
|
+
- Step scaling `t += d * 0.9` can reduce overshoot penetration
|
|
478
|
+
- Prefer quadratic optimized smin/smax (fastest); use exponential version when extreme smoothness is needed
|
|
479
|
+
- `k` must not be zero (division by zero error); fall back to hard boolean when near zero
|
|
480
|
+
- For symmetric shapes, use `abs()` to fold coordinates and define only one side
|
|
481
|
+
|
|
482
|
+
**Composition techniques:**
|
|
483
|
+
- **+ Domain Repetition**: `mod()`/`fract()` for infinite repetition of CSG shapes (mechanical arrays, railings)
|
|
484
|
+
- **+ Procedural Displacement**: overlay noise displacement on SDF for surface detail
|
|
485
|
+
- **+ Procedural Texturing**: use smin blend factor to simultaneously blend material ID / color
|
|
486
|
+
- **+ 2D SDF**: equally applicable to 2D scenes (clouds, UI shape compositing)
|
|
487
|
+
- **+ Animation**: bind k values, positions, and radii to `iTime` for dynamic deformation
|
|
488
|
+
|
|
489
|
+
## Further Reading
|
|
490
|
+
|
|
491
|
+
Full step-by-step tutorials, mathematical derivations, and advanced usage in [reference](../reference/csg-boolean-operations.md)
|