105 lines
7.5 KiB
Markdown
105 lines
7.5 KiB
Markdown
|
|
# Plan: Meadow Brush Geometry + Color Variant
|
|||
|
|
|
|||
|
|
## Context
|
|||
|
|
|
|||
|
|
HCIE-Rust v4 brush engine’inde `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 brush’lara 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 7–12 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 2–3 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 | GUI’de Color Variant kontrolleri sadece **Meadow brush aktifken** gösterilecek. | Risk azaltılır, diğer brush’lara sonradan genişletilebilir. |
|
|||
|
|
| 8 | `meadow_grass` preset’i `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()` default’ları.
|
|||
|
|
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` — preview’a 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`, 3–5 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 config’e 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` annotation’ları 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 sync’te 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 brush’lara 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.
|
|||
|
|
- [ ] GUI’de 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 screenshot’ta doğal çimen benzeri sonuç gözlemlenir.
|