Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
23 changes: 18 additions & 5 deletions .github/workflows/generate-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,27 @@ jobs:

- name: Build WebAssembly assets
run: |
docker compose -f wasm-examples/extras/docker-compose.yml \
docker compose -f docs/wasm-examples/extras/docker-compose.yml \
up --build --abort-on-container-exit --exit-code-from web-example

- name: Tear down docker compose
if: always()
run: |
docker compose -f wasm-examples/extras/docker-compose.yml down \
docker compose -f docs/wasm-examples/extras/docker-compose.yml down \
--volumes --remove-orphans

- name: Upload artifacts
- name: Upload WASM artifacts
uses: actions/upload-artifact@v4
with:
name: wasm-build
path: wasm-examples/build/dist
path: docs/wasm-examples/build/dist
retention-days: 7

- name: Upload TypeScript SDK artifacts
uses: actions/upload-artifact@v4
with:
name: ts-sdk-build
path: typescript/dist
retention-days: 7

build:
Expand All @@ -43,7 +50,13 @@ jobs:
uses: actions/download-artifact@v4
with:
name: wasm-build
path: wasm-examples/build/dist
path: docs/wasm-examples/build/dist

- name: Download TypeScript SDK artifacts
uses: actions/download-artifact@v4
with:
name: ts-sdk-build
path: typescript/dist

- name: Install pnpm
uses: pnpm/action-setup@v4
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,6 @@ __pycache__/

# Generated
include/trueform/version.hpp
typescript/LICENSE
typescript/LICENSE.noncommercial
typescript/package-lock.json
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ endif()
# ==============================================================================
# Project Configuration
# ==============================================================================
project(trueform VERSION 0.6.0 LANGUAGES CXX)
project(trueform VERSION 0.7.0 LANGUAGES CXX)

configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.hpp.in
Expand Down
18 changes: 16 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
[![Docs](https://github.com/polydera/trueform/actions/workflows/generate-docs.yml/badge.svg)](https://github.com/polydera/trueform/actions/workflows/generate-docs.yml)
[![Build](https://github.com/polydera/trueform/actions/workflows/build-python.yml/badge.svg)](https://github.com/polydera/trueform/actions/workflows/build-python.yml)
[![PyPI](https://img.shields.io/pypi/v/trueform)](https://pypi.org/project/trueform/)
[![npm](https://img.shields.io/npm/v/@polydera/trueform)](https://www.npmjs.com/package/@polydera/trueform)

Real-time geometric processing. Easy to use, robust on real-world data.

Mesh booleans, registration, remeshing and queries — at interactive speed on million-polygon meshes. Robust to non-manifold flaps, inconsistent winding, and pipeline artifacts. Header-only C++17; works directly on your data with zero-copy views.
Mesh booleans, registration, remeshing and queries — at interactive speed on million-polygon meshes. Robust to non-manifold flaps, inconsistent winding, and pipeline artifacts. One engine across C++, Python, and TypeScript.

**[▶ Try it live](https://trueform.polydera.com/live-examples/boolean)** — Interactive mesh booleans, collisions, isobands and more. No install needed.

Expand Down Expand Up @@ -40,10 +41,22 @@ cmake -B build -Dtrueform_ROOT=$(python -m trueform.cmake)

For manual installation without pip (FetchContent, system install, conan from repo), see the [full installation guide](https://trueform.polydera.com/cpp/getting-started/installation).

**Python** — the same pip package includes Python bindings:
```python
import trueform as tf
mesh = tf.read_stl("model.stl")
```

**TypeScript** — browser and Node.js:
```bash
npm install @polydera/trueform
```

## Integrations

- **[VTK](https://trueform.polydera.com/cpp/vtk)** — Filters and functions that integrate with VTK pipelines
- **[Python](https://trueform.polydera.com/py/getting-started)** — NumPy in, NumPy out
- **[TypeScript](https://trueform.polydera.com/ts/getting-started)** — NDArrays in, NDArrays out. Browser and Node.js.
- **[VTK](https://trueform.polydera.com/cpp/vtk)** — Filters and functions that integrate with VTK pipelines
- **[Blender](https://trueform.polydera.com/py/blender)** — Cached meshes with automatic updates for live preview

## Quick Tour
Expand Down Expand Up @@ -205,6 +218,7 @@ Apple M4 Max, 16 threads, Clang `-O3 -march=native`. Full methodology, interacti
- [Benchmarks](https://trueform.polydera.com/cpp/benchmarks) — Performance comparisons
- [Examples](https://trueform.polydera.com/cpp/examples) — Workflows and library comparisons
- [Python Bindings](https://trueform.polydera.com/py/getting-started) — Full API for Python
- [TypeScript SDK](https://trueform.polydera.com/ts/getting-started) — WASM-powered, browser and Node.js
- [Research](https://trueform.polydera.com/cpp/about/research) — Theory, publications, and citation

## License
Expand Down
12 changes: 7 additions & 5 deletions docs/app/components/LibPicker.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,29 @@ const route = useRoute();

const items = [
{
label: "C++",
icon: "i-vscode-icons:file-type-cpp",
value: "cpp",
},
{
label: "Python",
icon: "i-vscode-icons:file-type-python",
value: "py",
},
{
icon: "i-vscode-icons:file-type-typescript",
value: "ts",
},
];

const router = useRouter();
const handleChange = async (value: string | number) => {
const newLibrary = value as "cpp" | "py";
const newCollection = newLibrary === "cpp" ? "docsCpp" : "docsPy";
const newLibrary = value as "cpp" | "py" | "ts";
const newCollection = newLibrary === "cpp" ? "docsCpp" : newLibrary === "py" ? "docsPy" : "docsTs";

// If we're on a library-specific path, try to find the equivalent page
const currentPath = route.path;
const pathParts = currentPath.split("/");

if (pathParts[1] === "cpp" || pathParts[1] === "py") {
if (pathParts[1] === "cpp" || pathParts[1] === "py" || pathParts[1] === "ts") {
// Replace the library prefix
const newPath = `/${newLibrary}${currentPath.slice(pathParts[1].length + 1)}`;

Expand Down
Loading