fix(CAD-13): double rendering - legacy canvas skips element rendering when pixi renderer is active (grid/background stay), defensive fallback if pixi fails
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* Task CAD-13-fix: Legacy-Rendering doppelt (Legacy-Canvas + Pixi-Overlay
|
||||
* zeichnen dieselben Elemente). skipElementRendering legt das Legacy-
|
||||
* Element-Rendering still, wenn Pixi aktiv ist — Grid/Hintergrund/Lineal
|
||||
* bleiben sichtbar. Defensiv: Ohne Flag ist Verhalten unveraendert.
|
||||
*/
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { RenderEngine } from '../src/canvas/RenderEngine';
|
||||
import { ZoomPanController } from '../src/canvas/ZoomPanController';
|
||||
import { SpatialIndex } from '../src/canvas/SpatialIndex';
|
||||
import { LayerManager } from '../src/canvas/LayerManager';
|
||||
import type { CADElement, CADLayer } from '../src/types/cad.types';
|
||||
|
||||
function setup() {
|
||||
const canvas = document.createElement('canvas');
|
||||
canvas.width = 800;
|
||||
canvas.height = 600;
|
||||
document.body.appendChild(canvas);
|
||||
const zpc = new ZoomPanController(canvas);
|
||||
const spatialIndex = new SpatialIndex();
|
||||
const layerManager = new LayerManager();
|
||||
const engine = new RenderEngine(canvas, zpc, spatialIndex, layerManager);
|
||||
return { canvas, engine, zpc, spatialIndex, layerManager };
|
||||
}
|
||||
|
||||
describe('CAD-13-fix: RenderEngine.skipElementRendering', () => {
|
||||
beforeEach(() => {
|
||||
document.body.innerHTML = '';
|
||||
});
|
||||
|
||||
it('Default: Flag ist false (Verhalten unveraendert)', () => {
|
||||
const { engine } = setup();
|
||||
expect(engine.skipElementRendering).toBe(false);
|
||||
});
|
||||
|
||||
it('skipElementRendering=true: Elemente werden NICHT gezeichnet, Grid schon', () => {
|
||||
const { engine, spatialIndex, layerManager } = setup();
|
||||
const layer: CADLayer = { id: 'l1', name: 'L1', visible: true, locked: false, color: '#fff', lineType: 'solid', transparency: 0, sortOrder: 0, parentId: null } as CADLayer;
|
||||
layerManager.addLayer(layer);
|
||||
const el: CADElement = {
|
||||
id: 'e1', type: 'line', layerId: 'l1',
|
||||
x: 10, y: 10, width: 100, height: 100,
|
||||
properties: { x1: 10, y1: 10, x2: 110, y2: 110 },
|
||||
} as unknown as CADElement;
|
||||
spatialIndex.bulkInsert([el]);
|
||||
engine.setLayers([layer]);
|
||||
// drawElement darf nicht aufgerufen werden — wir spionieren die private
|
||||
// Methode ueber einen Prototyp-Hook
|
||||
const spy = vi.spyOn(engine as unknown as { drawElement: (el: CADElement, l: CADLayer) => void }, 'drawElement');
|
||||
engine.skipElementRendering = true;
|
||||
engine.render();
|
||||
expect(spy).not.toHaveBeenCalled();
|
||||
spy.mockRestore();
|
||||
});
|
||||
|
||||
it('skipElementRendering=false (Default): Elemente werden gezeichnet', () => {
|
||||
const { engine, spatialIndex, layerManager } = setup();
|
||||
const layer: CADLayer = { id: 'l1', name: 'L1', visible: true, locked: false, color: '#fff', lineType: 'solid', transparency: 0, sortOrder: 0, parentId: null } as CADLayer;
|
||||
layerManager.addLayer(layer);
|
||||
const el: CADElement = {
|
||||
id: 'e1', type: 'line', layerId: 'l1',
|
||||
x: 10, y: 10, width: 100, height: 100,
|
||||
properties: { x1: 10, y1: 10, x2: 110, y2: 110 },
|
||||
} as unknown as CADElement;
|
||||
spatialIndex.bulkInsert([el]);
|
||||
engine.setLayers([layer]);
|
||||
const spy = vi.spyOn(engine as unknown as { drawElement: (el: CADElement, layer: CADLayer) => void }, 'drawElement');
|
||||
engine.render();
|
||||
expect(spy).toHaveBeenCalled();
|
||||
spy.mockRestore();
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user