feat(map): elevated 3D smoke plume trajectory ribbons in WebGL #139
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/smoke-plumes-layer"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements Issue 82: elevated 3D atmospheric smoke plume trajectory ribbons (
smoke-plumes-layer.tsx) floating at 500m to 1,400m altitude (nominal 800m) above the terrain mesh with smooth 60fps pulsation along calculated dispersion trajectories.Principles applied
principle-model-the-domain: Modeled atmospheric plume advection with mathematical altitude ascent and distance-decaying opacity profiles.principle-boundary-discipline: Validated wind vector coordinates and ensured clean animation cleanup on unmount with SSR guards.principle-subtract-before-you-add: Reused native MapLibrefill-extrusion3D capabilities with base and height offsets instead of heavy external 3D engine wrappers.principle-test-behavior-not-implementation: Tested observable quadrilateral ribbon geometries, altitude ascents, opacity decays, and layer lifecycle actions with literal assertions.principle-prove-it-works: Verified clean vp check, 60 passed test files (395 passed tests), and production Next.js build.Playbook
skill://poteto-mode/playbooks/feature.mdImpact
Closes #82
6-Axis Review: PR #139 (
feat/smoke-plumes-layer)Executed Playbook:
skill://poteto-mode/playbooks/shipping.mdPrinciples Applied:
principle-model-the-domain: Modeled atmospheric plume trajectory geometry and altitude profiles (calculatePlumeAltitudefrom 500m combustion base ascending to 800m–1400m boundary layer) with distance-decaying opacity (calculateSegmentOpacity).principle-boundary-discipline: Subscribed cleanly to animation loops viarequestAnimationFramewith propercancelAnimationFrameunmount teardown, SSR window guards, and safe MapLibre layer presence checks.principle-subtract-before-you-add: Leveraged native MapLibrefill-extrusion3D layer primitives (fill-extrusion-base,fill-extrusion-height) instead of embedding massive Three.js / Deck.gl bundle wrappers.principle-test-behavior-not-implementation: Tested mathematical altitude ascent and opacity degradation curves, 3D closed polygon geometry generation, high-danger cluster filtering, and MapLibre layer lifecycle/animation loops.principle-prove-it-works: Verified execution against Forgejo Actions CI run 228 (green in 2m18s),vp checkclean across 341 files,tsc --noEmitclean, and all 60 test files passing (395 tests).Gate 1: Mechanical Verification Gate (
node scripts/verify-pr.mjs 139)feat(map): elevated 3D smoke plume trajectory ribbons in WebGL(passes Conventional Commits and branch rules).b3301f680a369878dd6db5078adb6879b8876c65.vp checkreports 0 warnings/errors across 172 files, 341 files formatted cleanly.tsc --noEmitexited 0 with 0 errors.Gate 2: Ponytail Audit (
skill://ponytail-review,skill://ponytail-audit)smoke-plumes-layer.tsx,smoke-plumes-layer.test.ts,layer-toggles.tsx, andmap-view.tsx.fill-extrusionrendering with pure geodesic mathematics from existingsmoke-cone.ts.Gate 3: Doubt-Driven Analysis (
skill://doubt-driven-development)setPaintPropertyon fill-extrusion opacity modulating a sine factor without rebuilding GeoJSON polygons every frame.totalScore >= 50, preventing visual noise from low-risk background clusters while emphasizing critical smoke plumes.stopPlumesAnimation()is invoked on unmount and whenever the layer toggle is disabled.Gate 4: Security & Hardening (
skill://security-and-hardening)eval) or raw HTML rendering (dangerouslySetInnerHTML).Gate 5: Code Quality & Simplification (
skill://code-review-and-quality,skill://code-simplification)LayerToggles("Trajektori Asap 3D").Gate 6: Poteto Shipping Protocol (
skill://poteto-mode/playbooks/shipping.md)mainata0d1b59.main.Verdict: APPROVE