Metadata-Version: 2.5
Name: kulisse
Version: 1.0.1
Summary: device and scene models for arkitekt: self-contained binary glTF with a joint table, authored from URDF and checked before upload
Project-URL: Repository, https://github.com/arkitektio/kulisse
Project-URL: Specification, https://github.com/arkitektio/kulisse/blob/main/KULISSE.md
Author-email: jhnnsrs <jhnnsrs@gmail.com>
License-Expression: MIT
License-File: LICENSE
Requires-Python: >=3.11
Provides-Extra: complete
Requires-Dist: numpy>=1.26; extra == 'complete'
Requires-Dist: pycollada>=0.8; extra == 'complete'
Requires-Dist: trimesh>=4; extra == 'complete'
Requires-Dist: xacro>=2; extra == 'complete'
Provides-Extra: urdf
Requires-Dist: numpy>=1.26; extra == 'urdf'
Requires-Dist: pycollada>=0.8; extra == 'urdf'
Requires-Dist: trimesh>=4; extra == 'urdf'
Requires-Dist: xacro>=2; extra == 'urdf'
Description-Content-Type: text/markdown

# kulisse

Device and scene models for arkitekt. A model is one **self-contained binary glTF** (GLB) with
an optional joint table: what a viewer draws as a `<Model>` or drives as a `<Robot>`, what an
app registers as an asset, and what a server keeps in a `KulisseStore`.

kulisse is strictly the authoring side, like fabriks for meshes: no network code, no storage
opinions. The **format** is the contract ([`KULISSE.md`](KULISSE.md)), and the server reads it
with its own implementation (`arkitekt_datalayer.kulisse`), never by importing this package.

```bash
pip install kulisse            # check, reference, snippet: standard library only
pip install "kulisse[urdf]"    # import URDF / Xacro (numpy, trimesh, pycollada, xacro)

kulisse import robot.urdf.xacro --out robot.glb --package my_robot=./share/my_robot
kulisse check robot.glb
kulisse joints robot.glb joints.json --out robot.glb
kulisse snippet robot.glb --name robot
```

```python
import kulisse

report = kulisse.check("robot.glb")      # ModelReport, or ModelRefused(code, message)
kulisse.reference("robot.glb")           # "sha256:…", what a blok names as for_model
kulisse.snippet("robot.glb")             # '<Robot src="@self.assets.robot" … />'
```
