# Doğrudan Modelleme — Gerçek-Zaman Performans & Feature Yol Haritası

> Vizyon: Plasticity-tarzı (ve fazlası) doğrudan modelleme; **BREP topology** formatında,
> milyon-yüzlü modellerde **60 FPS canlı önizleme**, darboğazsız. Renkler asla kaybolmaz.

## Temel Mimari İlke: İki Fazlı İşlem
Tüm ticari çözümlerin (Fusion/SolidWorks/Plasticity) ortak paydası:
**sürüklerken gerçek BREP boolean ASLA çalışmaz.** Ekranda görünen geçici grafik önizlemedir;
kesin geometri yalnızca fare bırakılınca (mouse-up), async worker'da üretilir.

- **Faz A (sürükleme):** 0 OCCT çağrısı, 0 tahsis. Sadece GPU uniform + var olan buffer çizimi.
- **Faz B (bırakma):** Yerel OCCT işlemi (global boolean değil), async worker (`OSD::SetSignal` zorunlu).

## Performans Yol Haritası (öncelik sıralı)
| # | İş | OCCT/GPU aracı | Durum |
|---|-----|----------------|-------|
| 1 | İki-fazlı ayrım (sürükle=GPU / bırak=OCCT) | mimari | Kısmen (CPU wireframe preview var) |
| 2 | GPU vertex-shader deform + rubber-band mesh | Vulkan uniform/pushConstant | **KALAN** |
| 3 | Yerel işlem: push/pull=`BRepFeat_MakePrism`, cep=`BRepFeat_MakeDPrism`, kabuk=`BRepOffsetAPI_MakeThickSolid` | OCCT local ops | Düz yüz ✓ / silindir global boolean (yerel'e taşınacak) |
| 4 | **Ordinal↔shape O(1)** cache (TopExp sırasıyla, `vector<TopoDS_Shape>`) | brep_ic.hpp Icerik | **YAPILDI ✓** (yuzOrd/kenarOrd/vertexOrd lazy; ordinalBulC) |
| 5 | Kısmi incremental mesh (sadece Modified/Generated yüz) | `BRepMesh_IncrementalMesh` | **ANALİZ EDİLDİ** ⚠️ InParallel=false BİLEREK (boolean sonrası nested pool→deadlock, brep.cpp:347). Gerçek yol: değişmeyen yüz Poly_Triangulation'ı yeni shape'e taşı→BRepMesh atlar. Ayrıca GPU: yüz-bazlı sub-buffer upload (tüm mesh re-upload yerine). Kullanıcı testi gerekli, riskli |
| 6 | History-tabanlı renk remap (`Modified`/`Generated`/`IsRemoved`) | `BRepTools_History` | Düz yüz ✓ + silindir boolean ✓ (renkPropagasyonu); geometrik fallback yedek |
| 7 | GPU-driven meshlet + indirect + occlusion culling | Vulkan mesh shader | KALAN (görsel tavan) |
| 8 | Debounce + iptal-edilebilir predictive worker | `@debounce`, OSD_ThreadPool | KALAN |

### Kritik uyarılar (forum + doğrulanmış)
- **`OSD::SetSignal()` her worker thread başında ZORUNLU** — yoksa OCCT boolean/fillet sessizce çöker (thread-local, try-catch yakalamaz).
- `BRepFeat_MakePrism` **UpToFace eğri ise** hatalı olabilir (FreeCAD #5558) → eğri sınırda global boolean fallback.
- Renk remap **snapshot'tan ÖNCE ve işlem DIŞINDA** yapılmalı, yoksa undo bozulur.
- Bağımsız yüz remesh → paylaşılan kenar non-watertight olur; değişen yüz + komşularını birlikte remesh grubu yap.

## Silindirik/Radyal Push/Pull (YAPILDI — 07-11)
- `yuzBilgi` silindir dalı ([brep.cpp](../../motor/geometri/src/brep.cpp)): merkez=yüzey-üstü UV nokta, normal=dış radyal (orientation dahil).
- `yuzItCek` silindir dalı ([brep_feature.cpp](../../motor/geometri/src/brep_feature.cpp) `silindirRadyalOfset`): annulus boolean; mesafe>0 fuse, <0 cut.
- **Canlı önizleme radyal** ([push_pull.hpp](push_pull.hpp)): her kontur noktası kendi radyal yönünde yeni yarıçapa ölçeklenir; R<0 → sivrilir (eksene toplanır). Delik/mil `pp.delik` ile ayrılır, commit'teki orientation ile tutarlı.

## Feature Envanteri (Plasticity paritesi + fazlası)

### Çekirdek felsefe (motor geneli — önce bunlar yerleşmeli)
1. **Seçim = komut**: yüz seç→Push Face otomatik başlar, kenar seç→Fillet otomatik. Butonsuz.
2. **Sarı nokta tutamacı**: hemen her mesafe/kalınlık tek sürüklenebilir sarı noktayla. Yön işareti belirler (ileri=fillet, geri=chamfer; ileri=dışa offset, geri=içe).
3. **Tek-harf klavye modifiye** (sürüklerken): `D`=mesafe, `A`=açı, `V`=varyasyon/pivot, `X/Y/Z`=eksen kilidi, `Shift+X/Y/Z`=düzlem.
4. **Command Dialog canlı sayısal**: sürüklerken klavyeden değer yaz, gizmo takip eder (çift yönlü).
5. **Onay=sağ tık, iptal=Esc** (her komutta aynı).
6. **Anlık geri bildirim = gölgeli GERÇEK BREP katı** (wireframe değil), başarısızsa geometri kaybolur→kullanıcı görür.

### Merkezi gizmo servisi (Move/Rotate/Scale ortak) — Faz 1
- Move `G` (3 ok+3 düzlem+küre), Rotate `R` (3 halka), Scale `S` (3 kol+küp). Eksen `X/Y/Z`, düzlem `Shift+X/Y/Z`, serbest `F`, pivot `V`/`Alt+V`, oryantasyon `W` (Normal→Pivot→CPlane→World).
- **Move Circular Edge**: dairesel kenarı analitik geometriyi bozmadan öteler (OCCT'de kenar yeniden-inşa gerekir, dikkat).
- Gizmo yeni nesnede otomatik yüzey normaline hizalanır.

### İşlem komutları
| Komut | Tetik | Etkileşim | Kısayollar | OCCT |
|-------|-------|-----------|------------|------|
| Push/Pull Face | yüz seç (oto) | sarı nokta sürükle | `D` mesafe, `A` açı, `Tab` Grow(Moving/Fixed/None), **Dependant Offset** (hedef yüze kadar) | `BRepFeat_MakePrism` |
| Fillet/Chamfer | kenar seç (oto) / `B` | işaretli sürükle: **poz=fillet, neg=chamfer** | `V` variable radius, `L` partial limit, `A` chamfer açı, `Ctrl+click` kenar ekle, `T` sadece seçili | `BRepFilletAPI_MakeFillet/_MakeChamfer` |
| Fillet Shape | — | Conic/Chordal/**G2**/**Full**(3-yüz teğet) + Tension | panel | — |
| Draft Face | ref düzlem+`Shift` yüzler | beyaz daire=açı | `A` açı, Isocline/Curve/Surface/Offset/Normal, Grow | `BRepOffsetAPI_DraftAngle` |
| Offset Face | yüz | sarı nokta | dışa/içe işaret | `BRepOffsetAPI_MakeOffsetShape` |
| Extrude | `E` | sarı nokta + gömülü Boolean | `D`,`A`draft,`Shift+T`,`I` individual,`F`,`S` | `BRepFeat/MakePrism` |
| Revolve | palette | 2-tık eksen | `A` açı, gömülü Boolean | `BRepPrimAPI_MakeRevol` |
| Sweep | `Shift+P` | profil→yol→guide | `D` twist, Ctrl 5° snap, Parallel/Normal | `BRepOffsetAPI_MakePipe(Shell)` |
| Loft | `L` | 2+ profil | `Tab` süreklilik(G0/G1/G2 siyah daire), `D` tension, `L` limit | `BRepOffsetAPI_ThruSections` |
| Hollow/Shell | palette | yüz=açık/katı=kapalı | `D` kalınlık | `BRepOffsetAPI_MakeThickSolid` |
| Thicken | palette | sheet→iki yön | `S`,`D` | — |
| Boolean | `Q` | target→tool, komut-içi `G/R/S` hizalama | `Q`union `W`diff `Shift+E`intersect `Shift+Q`slice, `T` Keep Tools | `BRepAlgoAPI_*` |

### "Kapama" (Cap/Patch/Heal) — Faz 2
- **Patch**: kapalı eğri/delik kenarı→yüzey. Per-kenar süreklilik Planar/G0/G1/G2 (siyah dairelere tıkla). Guide curve. → `BRepOffsetAPI_MakeFilling`
- **Find Boundary Edges**: açık/bağlanmamış kenarları otomatik seç (heal teşhisi). → `ShapeAnalysis_FreeBounds`
- **Bridge Surface**: iki yüzey arası köprü (Width/Tension/G2, Trim walls). → filling/loft
- Sew/heal → `BRepBuilderAPI_Sewing`

### Seçim sistemi (Plasticity paritesi) — Faz 1
- Mod: `1`=nokta `2`=kenar `3`=yüz `4`=katı `Tab/5`=hepsi; toggle `Shift+1..4`.
- Renk: yüz koyu mavi→açık mavi, kenar siyah→sarı, vertex mor→beyaz.
- Kutu: **sağdan-sola yeşil=değen(crossing), soldan-sağa mor=içeren(window)**.
- Akıllı: `Alt+click` edge loop / coplanar / tangent yüz; `Ctrl+Alt+click` edge ring / paralel yüz / paralel silindirik.
- Hover disambiguation: `Ctrl+Shift+click` veya `sol tık+tekerlek` üst üste geometride döngü. (mevcut Selection Stack/peek lens ile örtüşür)
- Dönüştürme `Ctrl+1..5`; `Alt+A` ters; `Ctrl+T` son işlemin kaynaklarını seç (DAG geçmişi).

## Sketch-on-Surface (eğri yüzeye sarma/projeksiyon + emboss) — YENİ İSTEK
Motorda ZATEN VAR: `motor/sketch/` (entity+kısıt+LM solver+drag), `brep_feature.cpp` (egriKonturWire:1008, egriYuzDelikli:1131, BRepFeat_MakePrism:414), `sketch_ui.cpp`. Sadece "hedef yüz" adımı eklenecek.
- **İki mod** (SolidWorks/Plasticity ayrımı): **WRAP**(deform, mesafe korunur — sketch 2D→hedef yüz UV): `BRep_Tool::Surface`→sketchToUV→`Geom2d_Line/Circle/BSpline`→`BRepBuilderAPI_MakeEdge(c2d,srf)`→**`BRepLib::BuildCurves3d`(ŞART)**→MakeWire→ShapeFix_Wire. **PROJECT**(izdüşüm): `BRepOffsetAPI_NormalProjection`(normal, pcurve'lü, tercih) veya `BRepProj_Projection`(yön/perspektif).
- **Emboss/Engrave**: `BRepFeat_MakeDPrism`(Fuse=1 kabart/Cut=0 oy, normal boyunca+draft); kırılırsa offset-solid+ThruSections+Boolean yedek. **OSD::SetSignal zorunlu**.
- Dalgalar: (1)`sketchYuzeSar` çekirdek WRAP (2)PROJECT dalları (3)`kabartma` DPrism+yedek (4)UX: sketch araç "Sar/Projekte"+sahneden hedef yüz seç+canlı ghost (5)AyarSistemi+ağaç associative recompute.
- GOTCHA: silindir seam(0/2π) wire kapanmaz→ShapeFix+periyodik pcurve; MakeFace pcurve'süz yanlış yüz; BRepProj yüz-üstü wire'da patlar→NormalProjection önceliği.

## Silindir push/pull = ÇAP-offset (koni DEĞİL) — not
Silindir push/pull yarıçapı değiştirir, silindir kalır (CATIA/Fusion böyle). Kullanıcı "sivrilene kadar küçülsün" (koni) isterse AYRI feature: draft (BRepOffsetAPI_DraftAngle) veya iki-uç-farklı-yarıçap (bir uç sabit). Önizleme şu an commit ile hizalı (çap-offset, min R=0.05). Koni istenirse yeni feature ekle.

## CATIA Thickness / Tanjant Uzatma (YENİ İSTEK)
- **Thickness**: seçili yüz(ler)e kalınlık ekle/çıkar (normal offset). OCCT: `BRepOffsetAPI_MakeThickSolid` (kaldırılan yüz listesi + kalınlık + join) veya tek-yüz `BRepOffsetAPI_MakeOffsetShape`.
- **Tanjant uzatma (tangent propagation)**: hedef yüze **G1-teğet (normal-sürekli) komşu yüzleri** otomatik dahil et → push/pull/thickness hepsini birlikte öteler (CATIA/Plasticity "Grow: Moving"). Uygulama: yüz seçilince kenarKomsuYuzler→komşu yüz normali hedef yüz normaliyle ~paralel/teğet mi (kenar boyunca G1) → teğet kümesi topla. Öteleme: çoklu yüz → BRepFeat tek-yüz yetmez, `MakeThickSolid` veya boolean.
- push_pull.hpp'de: teğet komşuları highlight + "T" kısayoluyla tangent-set toggle. Küme yuzItCek'e çoklu-yüz olarak geçer (yeni imza).

### En çok övülen kolaylıklar (öncelik)
1. Seç→oto komut  2. Tek tutamaç işaretli çift-işlev  3. Fillet variable+partial+shape  4. Boolean tool komut-içi hizalama  5. Alt/Ctrl+Alt loop-ring-coplanar  6. `Ctrl+T` kaynak geçmişi  7. Yönlü renkli kutu  8. Sol tık+tekerlek gezinme

## Futuristik Arayüz + Yeni Özellikler (araştırma ajanı raporu) — YENİ İSTEK
> İlke: futuristik = derin koyu zemin + TEK doygun accent (cyan) + hafif cam/blur + anlamlı mikro-animasyon. Viewport kral, krom minimum. HER efekt AyarSistemi'nde kapatılabilir (60 FPS + erişilebilirlik).

### Görsel (Bölüm A)
- **A.1 Merkezi palet** (yüksek/düşük efor): Dark "Graphite+Cyan" — bg-0 `#0E1116`, panel `#161B22`@85%, accent cyan `#3DD6D0`, warn `#FFB454`, danger `#FF5C6C`, ok `#5EE6A0`. Eksen X`#FF5A5A`/Y`#7CD25A`/Z`#5A9CFF` (DEĞİŞTİRME). Light: bg `#F4F6F9`, accent koyulaştır `#12A8A2`. `ayar_kayitlari.cpp` tema token, `TemaUygula()`.
- **A.2 Cam/blur panel**: önce ucuz (yarı-saydam+1px iç-çizgi+gölge), sonra gerçek Dual Kawase blur (sadece panel dikdörtgeni + dirty-cache).
- **A.3 Glow** (yüksek/düşük): ImDrawList 3-halka ring (shader yok) + seçili yüzde fresnel rim `pow(1-dot(N,V),3)`×accent.
- **A.4 Mikro-anim**: `AnimYaklas(now,hedef,hiz,dt)=now+(hedef-now)*(1-exp(-hiz*dt))` üstel, ImGuiStorage per-widget. easeOutCubic panel, easeOutBack radial. Idle-skip redraw.
- **A.5 Gizmo dili**: koni+silindir ok, hover +%25+glow+canlı değer floating-input(mono); non-hover %60 alfa; ekran-sabit boyut.
- **A.6 ViewCube** (tıkla=ortho snap/sürükle=orbit, pahlı, glow) + eksen tripod + billboard ölçüm pill. Foreground drawlist.
- **A.7 Font**: UI Inter/IBM Plex Sans, ölçü MONOSPACE (JetBrains/Plex Mono), ikon Lucide/Tabler ince-çizgi (icon-font merge, mevcut FreeType atlas).

### Özellikler (Bölüm B) — etki/efor sıralı
- **Dalga 1 (hızlı kazanım)**: B1 **Command Palette** ✓ VAR (Ctrl+Space `ort.komutPalet`+universalArama), B2 **Quick-Measure** (M-hover pasif ölçüm, mevcut ölçüm alt yapısı), B3 **Isolation** (Alt+H, görünürlük cache), B4 **pre-highlight** (hover tip-badge), B5 **View Bookmarks** (Ctrl+Shift+1-6 kamera). Seçim kipi 1/2/3/4 ✓ VAR.
- **Dalga 2**: B6 **Radial menü** (sağ-tık-tut gesture, bağlam-filtreli, özelleştirilebilir), B7 mirror/pattern (ghost önizleme+simetri tespiti), B8 birleşik snap/magnet (BREP adayları+ikon).
- **Dalga 3**: B9 section canlı (profil çizgisi CPU tamamla—stencil kapak var), B10 appearance/malzeme hızlı (renk kapları+PBR preset, ordinal-remap DİKKAT), B13 klavye-değer (floating input+ifade parser).
- **Dalga 4**: B11 undo timeline scrubber (thumbnail+ghost), B12 gesture, B14 selection HUD (peek lens), B15 repeat-last/MRU.
> Çoğu mevcut altyapı üstüne 1-2 gün: dinamik_komut registry, ölçüm sistemi, seçim+görünürlük cache, feature ghost hazır.

## Ayarlar Tam Kapsama (YENİ İSTEK — arada/düşük öncelik)
Kullanıcı: ayarlarda olmayan HER ŞEY ayarlar uygulamasına taşınsın. İlke zaten var ([[fikatia-ayar-ilkesi]]: her özellik AyarSistemi'ne kayıt, sihirli sayı gömme yok). Boşlukta:
- Kod tabanını tara → AyarSistemi'nde OLMAYAN ayarlanabilir sabitleri bul (gizmo boyutları, renkler, hız/hassasiyet, animasyon süreleri, toler,  kalite, kısayollar).
- `ayar_kayitlari.cpp`'ye ekle + ayarlar penceresi UI. Örn şimdiden: push/pull ok boyutu (0.09), glow alfa, radyal önizleme, fillet hassasiyet, silindir R-min.
- Kategorize: Görünüm/Tema, Gizmo, Seçim, Performans, Kısayol, Geometri-kalite.

## OCCT TÜM YETENEKLER — bu workbench'e entegre (YENİ İSTEK)
Kullanıcı: OCCT'nin tüm meyvelerini/özelliklerini mümkün olduğunca kullan. Araştırma ajanı envanteri gelince doldurulacak. Ön-liste (Modeling Algorithms):
- **Local features** (BRepFeat): MakePrism/DPrism/MakeRevol/MakePipe/MakeLinearForm/MakeRevolutionForm/Gluer/SplitShape
- **Fillet/Chamfer**: BRepFilletAPI_MakeFillet (variable radius, evolved), _MakeChamfer, ChFi3d shape (Conic/G2/Full)
- **Offset/Shell**: BRepOffsetAPI_MakeThickSolid/MakeOffsetShape/MakeOffset(2D)/DraftAngle
- **Sweep/Loft**: MakePipe/MakePipeShell(kılavuz+kesit evrimi)/ThruSections(ruled+smooth)/MakeEvolved
- **Projection**: NormalProjection/BRepProj_Projection
- **Surface**: GeomPlate/BRepOffsetAPI_MakeFilling(patch G0/G1/G2)/BRepFill(ruled)
- **Boolean+**: Fuse/Cut/Common/Section/Splitter/Defeaturing(BRepAlgoAPI_Defeaturing=yüz/fillet kaldır)
- **Healing/Upgrade**: ShapeFix_*/ShapeUpgrade_*(UnifySameDomain=yüz birleştir!)/ShapeCustom/BRepBuilderAPI_Sewing
- **Analiz**: BRepGProp(kütle/atalet)/BRepExtrema_DistShapeShape/BRepClass3d/interference
- **Transform**: mirror/array(BRepBuilderAPI_Transform)/GTransform(scale nonuniform)
- **Sub-shape edit**: BRepTools_Modifier/ReShape (doğrudan yüzey/vertex tweak — Plasticity "move face" özü)

### ⭐ OCCT envanteri kritik bulgular (ajan raporu)
- **`ShapeUpgrade_UnifySameDomain` = "uzatılan yüzey ayrı duruyor" GEOMETRİK KÖK ÇÖZÜM**: her push/pull/boolean sonrası koplanar komşu yüz/kenarları TEK yüze birleştirir → temiz tek yüz. Çoğu open-source CAD atlar → fark yaratır. GOTCHA: ordinal kaydırır → `History()` (BRepTools_History) ile renk remap ŞART, snapshot ÖNCESİ. **SIRADAKI KRİTİK İŞ** (renkPropagasyonu'nu BRepTools_History alacak şekilde genişlet, sonra pushPullUygula'da uygula).
- **Standart pipeline** (her feature): jest→uygun BRep* seç→`OSD::SetSignal()`→Build()+IsDone()+try-catch→`BRepCheck_Analyzer.IsValid()`→ShapeFix(hafif)→`UnifySameDomain`→History renk remap→sahne+canlı BRepGProp.
- **Gizli-güçlü (rekabet avantajı)**: Fuzzy Boolean(`SetFuzzyValue`, kusurlu STEP kurtarır), `BRepFeat_SplitShape`+NormalProjection(yüz bölgesi imprint→bölgesel push/pull), MakeFilling G2 patch(Class-A kapama), `BRepAlgoAPI_Defeaturing`(yüz sil+oto kapat), BRepTools_Modifier(gerçek move-face), değişken fillet `Law_Function`, `SetNonDestructive(true)`+BOP History(undo+renk), PipeShell çoklu-kesit morph.
- **Move Face** pratik yol: çoğu zaman BRepFeat_MakePrism(UpToFace) veya yarım-uzay Cut+Fuse, gerçek unbounded uzatma için Modifier+BRepLib::SameParameter.

## Kaynaklar
OCCT: BRepFeat_MakePrism/MakeDPrism, BRepOffsetAPI_MakeThickSolid/NormalProjection, BRepProj_Projection, BRepMesh_IncrementalMesh (InParallel),
TopExp::MapShapes, BRepTools_History, OCAF TNaming. GPU: nvpro gl_vk_meshlet_cadscene, vkguide GPU-driven, vulkanizer occlusion.
