Files
hcie-rust-v3.05/.kilo/plans/1782738463281-meadow-brush-color-variant.md
T

105 lines
7.5 KiB
Markdown
Raw Normal View History

2026-07-09 02:59:53 +03:00
# Plan: Meadow Brush Geometry + Color Variant
## Context
HCIE-Rust v4 brush engineinde `BrushStyle::Meadow` mevcut implementasyonu sadece 3 dikey nokta/dab çiziyor; hedefteki gibi kıvrımlı, farklı açılı, farklı uzunlukta çimen yaprağı demetlerine benzemiyor. Ayrıca kullanıcı, seçilen ana renkin yakınında benzer ama farklı renklerle çizim yapan bir **Color Variant** parametresi istiyor.
## Decisions
| # | Decision | Rationale |
|---|----------|-----------|
| 1 | `color_variant: bool` ve `variant_amount: f32` alanları `BrushTip` içinde **genel** olarak eklenecek. | İleride Leaf, Tree gibi doğal brushlara kolayca açılabilir; UI başta sadece Meadow için gösterilecek. |
| 2 | Renk varyasyonu **HSL tabanlı** olacak. | Ana renk ailesi korunur: yeşil → farklı yeşiller, mor → farklı morlar. RGB ofsetle kirlenme/gri kayma olmaz. |
| 3 | `variant_amount ∈ [0, 1]`. `amount = 0` hiç varyasyon yok; `amount = 1` için maksimum **±60° hue**, **±40% lightness** sapma. Ara değerler lineer. | Kullanıcıya sezgisel, sınırsız renk ailesi içinde kontrol sunar. |
| 4 | Meadow her stamp (dab) için 712 adet kıvrımlı çimen yaprağı çizecek. | Hedef görseldeki doğal, değişken çimen demetini yakalar. |
| 5 | Her yaprağın başlangıç açısı yukarı (90°) etrafında ±45° rastgele sapacak; uzunluk `0.3 .. 1.1 * effective_size`; kalınlık kökte ~0.15×size, uçta ~0.03×size; quadratic bezier ile 23 segment. | Farklı açı, uzunluk ve eğri her stamp’ı benzersiz kılar. |
| 6 | Her yaprağın opasitesi ve rengi ayrı ayrı varyasyonlu olacak. | Tek tip “matbaa” hissi önlenir. |
| 7 | GUIde Color Variant kontrolleri sadece **Meadow brush aktifken** gösterilecek. | Risk azaltılır, diğer brushlara sonradan genişletilebilir. |
| 8 | `meadow_grass` preseti `color_variant: true`, `variant_amount: 0.5` ile güncellenecek. | Kullanıcı varsayılan olarak hedef görsele yakın sonuç alır. |
## Affected Files
1. `hcie-protocol/src/lib.rs``BrushTip` struct: `color_variant`, `variant_amount` alanları + `Default`.
2. `hcie-protocol/src/tools.rs` — opsiyonel; değişiklik yok (alanlar zaten `BrushTip` içinde).
3. `hcie-brush-engine/src/lib.rs``BrushTip` mirror struct; `draw_meadow_brush` yeniden yazımı; HSL varyasyon helper; `Default` güncellemesi.
4. `hcie-brush-engine/src/presets.rs``meadow_grass()` defaultları.
5. `hcie-engine-api/src/dynamic_loader.rs``hcie_protocol::BrushTip``hcie_brush_engine::BrushTip` dönüşümü.
6. `hcie-engine-api/src/lib.rs` — yeni alanların default/senkronizasyonu (gerekirse).
7. `hcie-egui-app/crates/hcie-gui-egui/src/app/panels.rs` — UI: Meadow aktifken “Color Variant” checkbox + “Variant Amount” slider.
8. `hcie-egui-app/crates/hcie-gui-egui/src/canvas/mod.rs` — brush tip senkronizasyonuna yeni alanları ekle.
9. `hcie-egui-app/crates/hcie-gui-egui/src/app/brushes_panel.rs` — previewa varyasyon yansıması isteğe bağlı.
## Implementation Tasks
1. **Protocol layer:** `hcie-protocol/src/lib.rs` `BrushTip` içine ekle:
```rust
pub color_variant: bool,
pub variant_amount: f32,
```
Default: `false`, `0.0`. Serde `default` desteği eski kayıtlı presetlerle uyumluluğu korur.
2. **Brush engine struct:** `hcie-brush-engine/src/lib.rs` `BrushTip` mirror struct’ına aynı alanları ekle ve `Default` güncelle.
3. **Meadow brush renderer:** `draw_meadow_brush` fonksiyonunu yeniden yaz:
- `effective_size = size * pressure`
- `blade_count = 7..12` rastgele
- Her yaprak için:
- base angle = −π/2 + rng.gen_range(−π/4 .. π/4)
- length = effective_size * rng.gen_range(0.3 .. 1.1)
- bend = rng.gen_range(0.3 .. 0.3) * length
- thickness root = effective_size * 0.15, tip = effective_size * 0.03
- quadratic bezier: `base → control → tip`, 35 segmentle draw_dab zinciri
- op = particle_opacity * rng.gen_range(0.6 .. 1.0)
- renk: eğer `color_variant` true ise `variant_amount`a göre HSL varyasyon; yoksa `color`
4. **HSL varyasyon helper:** RGB → HSL → hue/lightness rastgele sap → HSL → RGB. Basit bir implementasyon yeterli (doğrusal interpolasyonlu basit HSL). Helper: `vary_color(color: [u8;4], amount: f32, rng: &mut R) -> [u8;4]`.
5. **Dynamic loader dönüşümü:** `hcie-engine-api/src/dynamic_loader.rs` `draw_brush_stroke` içinde `color_variant` ve `variant_amount` alanlarını kopyala.
6. **Preset:** `hcie-brush-engine/src/presets.rs` `meadow_grass()`:
- `tip.color_variant = true`
- `tip.variant_amount = 0.5`
7. **GUI Properties panel:** `hcie-egui-app/crates/hcie-gui-egui/src/app/panels.rs` `Tool::Brush` bloğunda, `state.tool_configs.brush.style == Meadow` iken:
- Checkbox: `Color Variant` → `state.tool_configs.brush.color_variant`
- Slider: `Variant Amount` → `state.tool_configs.brush.variant_amount`, 0.0..=1.0 (sadece checkbox true ise)
8. **GUI brush config sync:** `ToolConfigs` → `BrushConfig` içine `color_variant` ve `variant_amount` ekle (zaten `BrushTip` içinde tutuluyordu; brush confige de kullanıcı tarafından ayarlanabilir olması için ekle). Sonra `canvas/mod.rs`te brush tip oluştururken bu alanları aktar.
9. **Serialization/backward compatibility:** `BrushConfig` ve `BrushTip` Serde `Default` annotationları kontrol et; eksik alanlar 0/default olarak deserialze edilsin.
10. **Build/test:**
- `cargo test -p hcie-brush-engine --test stamp`
- `cargo test -p hcie-engine-api --test visual_regression`
- `cargo test -p hcie-engine-api --test performance_stroke_4k -- --nocapture`
- `cargo build -p hcie-gui-egui`
11. **Visual validation:**
- GUI açılışında Meadow brush seç.
- Birkaç farklı stroke çiz; benzersiz demetler ve renk varyasyonu görülmeli.
- F12 screenshot al (`target/screenshots/toolbox_*.png`).
## Risks & Mitigations
| Risk | Mitigation |
|------|------------|
| `BrushTip` serialization format değişikliği eski kaydedilmiş custom presetleri bozar. | Serde `default` attribute ile eksik alanlar `false`/`0.0` olarak doldurulur. |
| GUI testlerinde veya canvas syncte unutulan yeni alanlar compile hatası/varsayılan davranış yaratır. | Tüm `BrushTip` literal init yerlerini (brushes_panel, canvas, script, import) tarayıp yeni alanları ekle. |
| Meadow her dab daha fazla işlem yapar, 4K performans testini geçemez. | Önce testi çalıştır; eğer regresyon varsa yaprak sayısını ve segment sayısını sınırla veya small-region optimizasyonu koru. |
| HSL helper’ı eklenen yeni crate bağımlılığı gerektirir. | Sadece basit HSL ↔ RGB kodu yaz; dış bağımlılık ekleme. |
## Open Questions / Out of Scope
- Preview panelinde Meadow brush’ın color variant etkisini göstermek isteğe bağlıdır; ilk iterasyonda zorunlu değil.
- Renk varyasyonu ileride Leaf, Tree, Rock gibi brushlara genişletilebilir; bu plan sadece Meadow UI gösterimini açar.
- Varyasyon algoritması hue/lightness dışında saturation varyasyonunu da içerebilir; şimdilik hue + lightness yeterli.
## Validation Criteria
- [ ] `cargo test -p hcie-brush-engine --test stamp` geçer.
- [ ] `cargo test -p hcie-engine-api --test visual_regression` geçer.
- [ ] `cargo test -p hcie-engine-api --test performance_stroke_4k -- --nocapture` performans regresyonu göstermez.
- [ ] GUIde Meadow brush ile çizilen her stroke farklı yaprak demeti görünür.
- [ ] Color Variant aktifken aynı ana renk etrafında farklı tonlar/açıklıklar görünür.
- [ ] F12 screenshotta doğal çimen benzeri sonuç gözlemlenir.