Release 3D Tools 0.2.0
Verify / verify (push) Canceled after 0s

This commit is contained in:
2026-09-02 09:56:02 +02:00
parent b20c67c890
commit f838480278
31 changed files with 1347 additions and 145 deletions
+10
View File
@@ -1,5 +1,15 @@
# Changelog
## 0.2.0 - 2026-09-02
- Moved model parsing into cancellable worker jobs and made glTF scene selection,
hierarchy matrices and mesh instancing drive preview, bounds, statistics and
export.
- Added explicit per-axis transforms, glTF metallic-roughness material
inspection, safe degenerate-triangle repair and bounded ASCII PLY export.
- Declared accurate supported model input/export and worker/WebGL capability
profiles for Toolbox handoff.
## 0.1.0 - 2026-09-01
- Added bounded OBJ, STL, PLY and glTF/GLB triangle parsers.
+3 -3
View File
@@ -1,5 +1,5 @@
==============================================================================
@add-ideas/toolbox-contract@0.2.3
@add-ideas/toolbox-contract@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
@@ -198,7 +198,7 @@ Declared licence: Apache-2.0
==============================================================================
@add-ideas/toolbox-helpers@0.1.0
@add-ideas/toolbox-helpers@0.2.0
Declared licence: GPL-3.0-or-later
==============================================================================
--- LICENSE ---
@@ -879,7 +879,7 @@ Public License instead of this License. But first, please read
==============================================================================
@add-ideas/toolbox-shell-react@0.2.3
@add-ideas/toolbox-shell-react@0.3.0
Declared licence: Apache-2.0
==============================================================================
--- LICENSE ---
+14 -5
View File
@@ -6,21 +6,30 @@ Inspect, preview, repair and export triangle meshes locally in the browser. File
- Real bounded parsers for Wavefront OBJ, binary/ASCII STL, ASCII/binary little-endian PLY and glTF 2/GLB 2.
- Inert embedded glTF buffers only; external buffers, textures, scripts and OBJ material libraries are never fetched.
- Correct selected-scene hierarchy, matrix/TRS transform and mesh-instancing
flattening, including normal matrices and mirrored winding.
- Metallic/roughness material inspection covers base colour, emissive factor,
alpha, sidedness and declared texture slots without decoding texture content.
- Worker-based parsing with progress, cancellation and stale-result suppression.
- Mesh, material, scene-node, bound, surface-area and degenerate-triangle statistics.
- Responsive drag-to-rotate WebGL preview capped independently from full-file analysis.
- Area-weighted normal repair and finite translation, rotation and uniform-scale baking.
- Deterministic normalized OBJ and binary STL exports with explicit format-loss notes.
- Area-weighted normal repair, degenerate-triangle removal and finite translation,
rotation, uniform and per-axis scale baking.
- Deterministic normalized OBJ, binary STL and bounded ASCII PLY exports with
explicit format-loss notes.
- Offline PWA and shared Toolbox system/light/dark shell.
## Supported subset and limits
Input is capped at 32 MiB, one million vertices, one million triangles, 10,000 glTF scene nodes, JSON depth 64 and 100,000 JSON nodes. OBJ polygons and PLY faces are fan-triangulated. PLY supports version-1.0 ASCII and binary little-endian scalar/list properties. glTF supports embedded buffers, FLOAT POSITION/NORMAL accessors, unsigned indices and TRIANGLES primitives. Sparse accessors, animations, skins, textures, Draco/Meshopt and external resources are not decoded in v0.1.0.
Input is capped at 32 MiB, one million vertices, one million triangles, 10,000 glTF scene nodes, JSON depth 64 and 100,000 JSON nodes. OBJ polygons and PLY faces are fan-triangulated. PLY supports version-1.0 ASCII and binary little-endian scalar/list properties. glTF supports embedded buffers, FLOAT POSITION/NORMAL accessors, unsigned indices and TRIANGLES primitives. Sparse accessors, animations, skins, textures, Draco/Meshopt and external resources are not decoded in v0.2.0.
The normalized preview/export mesh does not bake glTF node transforms or recreate source material graphs. These limitations are reported rather than silently represented as equivalent output.
The normalized preview/export mesh bakes the selected glTF scene hierarchy and
instances, but does not recreate source material graphs. These limitations are
reported rather than silently represented as equivalent output.
## Development
Run npm ci, npm run check, npm run test:browser and npm run package:release -- --force with Node.js 22+ and npm 11. The deterministic artifact is release/3d-tools-0.1.0.zip with a SHA-256 sidecar.
Run npm ci, npm run check, npm run test:browser and npm run package:release -- --force with Node.js 22+ and npm 11. The deterministic artifact is release/3d-tools-0.2.0.zip with a SHA-256 sidecar.
## Licence
+12 -2
View File
@@ -1,5 +1,15 @@
# Security policy
Report vulnerabilities privately to the repository owner. Supported version: 0.1.x.
Report vulnerabilities privately to the repository owner. Supported version: 0.2.x.
3D Tools makes no uploads, telemetry or third-party requests. JSON is parsed as inert data under text, depth, node and token-count bounds. Exporters escape Android XML and quote Swift strings. Generated source remains an input to another toolchain and must be reviewed before production use.
3D Tools makes no uploads, telemetry or third-party requests. OBJ, STL, PLY and
glTF/GLB files are treated as untrusted data under documented byte, JSON,
geometry and scene-graph bounds. Parsing runs in a disposable worker, and
revision-scoped results prevent cancelled or superseded jobs from replacing
newer state.
External glTF resources are rejected, data URIs are decoded locally, and OBJ
material-library references are never fetched. Imported text cannot become
HTML, JavaScript or shader source. WebGL receives finite numeric arrays and
fixed application-owned shaders; a preview failure does not block inspection,
repair or export.
+2 -2
View File
@@ -1,10 +1,10 @@
# Source identity
- Project: 3D Tools
- Version: 0.1.0
- Version: 0.2.0
- Repository: https://git.add-ideas.de/lotobo/3d-tools
- Licence: GPL-3.0-or-later
- Build: Node.js 22+, npm 11, `npm ci && npm run release:artifact`
- Artifact: `3d-tools-0.1.0.zip`
- Artifact: `3d-tools-0.2.0.zip`
The lockfile pins dependencies exactly. Generated release manifests repeat this source identity and releases include detected runtime licence texts under `LICENSES/`.
+5 -1
View File
@@ -1,3 +1,7 @@
# Third-party notices
3D Tools is GPL-3.0-or-later. Runtime dependencies are React, React DOM and the add·ideas Toolbox Contract, Shell and Helpers packages. Exact versions and declared licences are recorded in `package-lock.json`; detected runtime licence texts are generated into release archives at `LICENSES/npm-runtime-licenses.txt`.
3D Tools is GPL-3.0-or-later. Runtime dependencies are React and React DOM
(MIT), add·ideas Toolbox Contract and Shell React 0.3.0 (Apache-2.0), and
Toolbox Helpers 0.2.0 (GPL-3.0-or-later). Exact versions and declared licences
are recorded in `package-lock.json`; detected runtime licence texts are
generated into release archives at `LICENSES/npm-runtime-licenses.txt`.
+16 -1
View File
@@ -1,6 +1,21 @@
# Architecture
The core/model.ts module converts every supported source into one inert model containing finite position/normal arrays, triangle indices and descriptive scene metadata. Parser-specific bounds are enforced before allocation and again on normalized geometry. Normal repair, transforms, statistics and exporters consume only that model.
The core/model.ts module converts every supported source into one inert model
containing finite position/normal arrays, triangle indices and descriptive scene
metadata. Imports run in a disposable module worker with progress, cancellation
and revision-scoped results. Parser-specific bounds are enforced before
allocation and again on normalized geometry. Normal repair, transforms,
statistics and exporters consume only that model.
For glTF/GLB, the selected/default scene is traversed as a validated acyclic
hierarchy. Column-major matrices and TRS/quaternion transforms are composed,
inverse-transpose normal transforms and mirrored winding are applied, and every
mesh instance is flattened into the bounded model. Consequently preview,
bounds, surface statistics, OBJ, STL and PLY all describe the same selected scene.
Selected metallic/roughness material factors and declared texture slots remain
inert inspection metadata; texture payloads are not decoded. Per-axis transforms
use inverse-transpose normal handling, while bounded repair can discard only
geometrically degenerate faces before recalculating normals.
The preview expands at most 200,000 triangles into a dedicated WebGL buffer. It uses fixed application-owned shaders and never compiles source-file content. Full statistics and exports still use the complete bounded model. glTF data URIs are decoded locally; non-data URIs are rejected.
+1 -1
View File
@@ -1,5 +1,5 @@
const CACHE_PREFIX = "3d-tools-shell-";
const CACHE_NAME = CACHE_PREFIX + "0.1.0";
const CACHE_NAME = CACHE_PREFIX + "0.2.0";
const CORE = ["./", "./manifest.webmanifest", "./favicon.svg"];
self.addEventListener("install", (event) => {
event.waitUntil(
+18 -3
View File
@@ -3,12 +3,12 @@
"schemaVersion": 1,
"id": "de.add-ideas.3d-tools",
"name": "3D Tools",
"version": "0.1.0",
"description": "Inspect and repair 3D meshes locally.",
"version": "0.2.0",
"description": "Inspect, transform, repair and export 3D meshes locally.",
"entry": "./",
"icon": "./favicon.svg",
"categories": ["media", "developer", "design"],
"tags": ["3d", "obj", "stl", "ply", "gltf", "webgl"],
"tags": ["3d", "obj", "stl", "ply", "gltf", "pbr", "webgl"],
"integration": {
"contextVersion": 1,
"launchModes": ["navigate", "new-tab"],
@@ -21,6 +21,21 @@
"crossOriginIsolated": false,
"topLevelContext": false
},
"io": {
"accepts": [
{ "mediaType": "model/obj", "extensions": [".obj"] },
{ "mediaType": "model/stl", "extensions": [".stl"] },
{ "mediaType": "model/ply", "extensions": [".ply"] },
{ "mediaType": "model/gltf+json", "extensions": [".gltf"] },
{ "mediaType": "model/gltf-binary", "extensions": [".glb"] }
],
"produces": [
{ "mediaType": "model/obj", "extensions": [".obj"] },
{ "mediaType": "model/stl", "extensions": [".stl"] },
{ "mediaType": "model/ply", "extensions": [".ply"] }
]
},
"capabilities": { "required": [], "optional": ["workers", "webgl"] },
"privacy": {
"processing": "local",
"fileUploads": true,