diff --git a/README.md b/README.md index 8bbb06c..906aa45 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ async function loadFile(file) { - **Error display** — parse/render/fetch errors shown in the viewer with retry support - **Debug overlay** — FPS, draw calls, lines, triangles - **Zoom level** — percentage display relative to fit-to-view -- **TAA anti-aliasing** — smooth edges after idle accumulation +- **Configurable antialiasing** — choose between MSAA (default, hardware), SMAA, FXAA, TAA, SSAA, or none - **TypeScript** — strict types, full `.d.ts` declarations ## Acknowledgements diff --git a/demo/App.vue b/demo/App.vue index 5fd4ae4..134b65e 100644 --- a/demo/App.vue +++ b/demo/App.vue @@ -89,6 +89,41 @@ +
+ Antialiasing: + +

{{ aaDescription }}

+
+ +
+

+ Overlays — click an empty cell to position, click the active (blue) cell to hide +

+
+
+ {{ row.label }} +
+
+
+
+
+

{{ isTouchDevice ? "Pinch to zoom · Drag to pan" : "Scroll to zoom · Drag to pan" }}

@@ -113,16 +148,27 @@
+ @@ -155,11 +202,13 @@ + + +``` + +## Accessibility + +- **`prefers-reduced-motion`** — when the user has enabled "reduce motion" in their OS, the TAA antialiasing mode renders a single frame without the 32-frame jitter accumulation animation. Other AA modes are unaffected. + ## Composables | Composable | Description | |------------|-------------| | `useDXFRenderer` | Main orchestrator: parsing, display, resize, layer visibility, dark theme | -| `useThreeScene` | Three.js scene/renderer init with TAA anti-aliasing | +| `useThreeScene` | Three.js scene/renderer init with configurable antialiasing (MSAA/SMAA/FXAA/TAA/SSAA/none) | | `useLayers` | Layer visibility state management | ## Re-exports diff --git a/packages/dxf-vuer/package.json b/packages/dxf-vuer/package.json index 8f4875f..8f9702b 100644 --- a/packages/dxf-vuer/package.json +++ b/packages/dxf-vuer/package.json @@ -1,6 +1,6 @@ { "name": "dxf-vuer", - "version": "2.3.1", + "version": "2.4.0", "description": "Vue 3 DXF file viewer — render AutoCAD DXF drawings in the browser with Three.js. Built-in parser, vector text rendering, TypeScript support.", "type": "module", "license": "MIT", @@ -61,7 +61,7 @@ "test": "vitest run" }, "peerDependencies": { - "dxf-render": "^1.2.0", + "dxf-render": "^1.3.0", "three": ">=0.160.0", "vue": "^3.4.0" }, diff --git a/packages/dxf-vuer/src/components/DXFViewer.vue b/packages/dxf-vuer/src/components/DXFViewer.vue index 0654538..8be05d1 100644 --- a/packages/dxf-vuer/src/components/DXFViewer.vue +++ b/packages/dxf-vuer/src/components/DXFViewer.vue @@ -83,7 +83,7 @@ (), { showDebugInfo: false, showFileName: true, showExportButton: false, + showLayerPanel: true, allowDrop: false, darkTheme: false, fontUrl: "", + antialiasing: "msaa", fileNamePosition: "top-left", toolbarPosition: "top-right", coordinatesPosition: "bottom-left", @@ -482,6 +487,29 @@ const loadDXFFromData = async (dxfData: DxfData) => { } }; +const decodeBuffer = (buffer: ArrayBuffer): string => { + const view = new Uint8Array(buffer); + // UTF-16 LE BOM (DXF files saved by AutoCAD with non-ASCII content) + if (view.length >= 2 && view[0] === 0xff && view[1] === 0xfe) { + return new TextDecoder("utf-16le").decode(buffer); + } + // UTF-16 BE BOM + if (view.length >= 2 && view[0] === 0xfe && view[1] === 0xff) { + return new TextDecoder("utf-16be").decode(buffer); + } + // UTF-8 (with or without BOM — TextDecoder strips it automatically) + return new TextDecoder("utf-8").decode(buffer); +}; + +const loadDXFFromBuffer = async (buffer: ArrayBuffer) => { + await loadDXFFromText(decodeBuffer(buffer)); +}; + +const loadDXFFromBlob = async (blob: Blob) => { + const buffer = await blob.arrayBuffer(); + await loadDXFFromBuffer(buffer); +}; + const loadDXFFromUrl = async (url: string) => { clearError(); isLoading.value = true; @@ -545,7 +573,7 @@ onMounted(() => { document.addEventListener("fullscreenchange", onFullscreenChange); nextTick(() => { if (dxfContainer.value) { - initThreeJS(dxfContainer.value, { enableControls: true }); + initThreeJS(dxfContainer.value, { enableControls: true, aaMode: props.antialiasing }); if (props.url) { loadDXFFromUrl(props.url); @@ -575,6 +603,8 @@ defineExpose({ loadDXFFromText, loadDXFFromData, loadDXFFromUrl, + loadDXFFromBuffer, + loadDXFFromBlob, resize, resetView, exportToPNG, diff --git a/packages/dxf-vuer/src/components/LayerPanel.vue b/packages/dxf-vuer/src/components/LayerPanel.vue index 0e91fa1..4df34cc 100644 --- a/packages/dxf-vuer/src/components/LayerPanel.vue +++ b/packages/dxf-vuer/src/components/LayerPanel.vue @@ -13,9 +13,27 @@ +
+ + +
+
+
No layers match "{{ filter }}"