7.5 KiB
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
hcie-protocol/src/lib.rs—BrushTipstruct:color_variant,variant_amountalanları +Default.hcie-protocol/src/tools.rs— opsiyonel; değişiklik yok (alanlar zatenBrushTipiçinde).hcie-brush-engine/src/lib.rs—BrushTipmirror struct;draw_meadow_brushyeniden yazımı; HSL varyasyon helper;Defaultgüncellemesi.hcie-brush-engine/src/presets.rs—meadow_grass()default’ları.hcie-engine-api/src/dynamic_loader.rs—hcie_protocol::BrushTip↔hcie_brush_engine::BrushTipdönüşümü.hcie-engine-api/src/lib.rs— yeni alanların default/senkronizasyonu (gerekirse).hcie-egui-app/crates/hcie-gui-egui/src/app/panels.rs— UI: Meadow aktifken “Color Variant” checkbox + “Variant Amount” slider.hcie-egui-app/crates/hcie-gui-egui/src/canvas/mod.rs— brush tip senkronizasyonuna yeni alanları ekle.hcie-egui-app/crates/hcie-gui-egui/src/app/brushes_panel.rs— preview’a varyasyon yansıması isteğe bağlı.
Implementation Tasks
-
Protocol layer:
hcie-protocol/src/lib.rsBrushTipiçine ekle:pub color_variant: bool, pub variant_amount: f32,Default:
false,0.0. Serdedefaultdesteği eski kayıtlı presetlerle uyumluluğu korur. -
Brush engine struct:
hcie-brush-engine/src/lib.rsBrushTipmirror struct’ına aynı alanları ekle veDefaultgüncelle. -
Meadow brush renderer:
draw_meadow_brushfonksiyonunu yeniden yaz:effective_size = size * pressureblade_count = 7..12rastgele- 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_varianttrue isevariant_amount’a göre HSL varyasyon; yoksacolor
-
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]. -
Dynamic loader dönüşümü:
hcie-engine-api/src/dynamic_loader.rsdraw_brush_strokeiçindecolor_variantvevariant_amountalanlarını kopyala. -
Preset:
hcie-brush-engine/src/presets.rsmeadow_grass():tip.color_variant = truetip.variant_amount = 0.5
-
GUI Properties panel:
hcie-egui-app/crates/hcie-gui-egui/src/app/panels.rsTool::Brushbloğunda,state.tool_configs.brush.style == Meadowiken:- 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)
- Checkbox:
-
GUI brush config sync:
ToolConfigs→BrushConfigiçinecolor_variantvevariant_amountekle (zatenBrushTipiçinde tutuluyordu; brush config’e de kullanıcı tarafından ayarlanabilir olması için ekle). Sonracanvas/mod.rs’te brush tip oluştururken bu alanları aktar. -
Serialization/backward compatibility:
BrushConfigveBrushTipSerdeDefaultannotation’ları kontrol et; eksik alanlar 0/default olarak deserialze edilsin. -
Build/test:
cargo test -p hcie-brush-engine --test stampcargo test -p hcie-engine-api --test visual_regressioncargo test -p hcie-engine-api --test performance_stroke_4k -- --nocapturecargo build -p hcie-gui-egui
-
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 stampgeçer.cargo test -p hcie-engine-api --test visual_regressiongeçer.cargo test -p hcie-engine-api --test performance_stroke_4k -- --nocaptureperformans 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.