task(CAD-14): phase 1 - tool exclusivity, V2 dispatcher exclusive for V2 tools (was: both engines had same tool = multi elements per click), selection handles now render in pixi mode via overlay pass, E2E proof test added

This commit is contained in:
Agent Zero
2026-09-16 18:03:08 +02:00
parent 4e6edb51ed
commit 02ed6a5ff0
4 changed files with 103 additions and 20 deletions
+32 -11
View File
@@ -57,6 +57,12 @@ export class RenderEngine {
private dpr = 1;
/** CAD-13-fix: true = Legacy-Canvas zeichnet KEINE Elemente (Pixi-Overlay zeichnet sie). Grid/Hintergrund bleiben. */
skipElementRendering = false;
/** CAD-14: Elemente-Spiegel fuer Auswahl-Griffe im Pixi-Modus (RenderEngine zeichnet Elemente nicht, aber die Griffe). */
private overlayElements: CADElement[] = [];
/** CAD-14: Setzt die Elemente, deren Auswahl-Griffe im Overlay gezeichnet werden. */
setOverlayElements(els: CADElement[]): void {
this.overlayElements = els;
}
constructor(
canvas: HTMLCanvasElement,
@@ -164,19 +170,19 @@ export class RenderEngine {
if (this.options.backgroundSrc) this.drawBackground();
this.drawRuler(w, h);
// CAD-13-fix: Wenn Pixi-Renderer aktiv ist (skipElementRendering=true),
// zeichnet das Legacy-Canvas KEINE Elemente mehr (sonst doppelt) —
// nur Grid/Hintergrund/Lineal bleiben hier.
if (this.skipElementRendering) {
this.ctx.restore();
return;
}
// CAD-14: skipElementRendering = Pixi rendert die Elemente. Das Legacy-
// Canvas zeichnet KEINE Elemente mehr — ABER weiterhin alle Overlays
// (Vorschau, Auswahl-Griffe, Auswahl-Rechteck, Snap-Punkte, Ortho),
// sonst waere Auswahl im Pixi-Modus unsichtbar.
const skipElements = this.skipElementRendering;
const viewport = this.zoomPan.getViewport();
const visibleElements = this.spatialIndex.search({
minX: viewport.minX, minY: viewport.minY,
maxX: viewport.maxX, maxY: viewport.maxY,
});
const visibleElements = skipElements
? []
: this.spatialIndex.search({
minX: viewport.minX, minY: viewport.minY,
maxX: viewport.maxX, maxY: viewport.maxY,
});
const layers = this.layerManager.getLayers();
for (const layer of layers) {
@@ -187,6 +193,21 @@ export class RenderEngine {
}
}
// CAD-14: Auswahl-Griffe auch fuer Pixi-gerenderte Elemente weiterhin
// auf dem Overlay-Canvas zeigen (Elemente selbst kommen von Pixi).
if (skipElements && this.selection.selectedIds.size > 0) {
const hs = this.zoomPan.getScale();
const hox = this.zoomPan.getTransform().e;
const hoy = this.zoomPan.getTransform().f;
const hsx = (val: number) => val * hs + hox;
const hsy = (val: number) => val * hs + hoy;
for (const el of this.overlayElements) {
if (this.selection.selectedIds.has(el.id)) {
this.drawSelectionHandles(el, hsx, hsy, hs);
}
}
}
// Draw preview element with dashed style
if (this.previewElement) {
this.ctx.save();