Skip to main content

Python bindings for SlamDunk

Project description


SlamDunk is a powerful and user-friendly C++/Python library for making live 3D and 2D visualizations for prototyping, data exploration, and algorithm development.

It is very lightweight, built using OpenGL and ImGui.

The project is in very early development with many improvements coming in the near future.

Examples

Hello world

Here is a simple "hello world" program for a SlamDunk visualization.

#python
import slamd

if __name__ == "__main__":
    vis = slamd.Visualizer("Hello world")

    scene = slamd.Scene()

    scene.set_object("/origin", slamd.geom.Triad())

    vis.add_scene("scene", scene)

    vis.hang_forever()
// C++
#include <slamd/slamd.hpp>

int main() {
    auto vis = slamd::visualizer("hello_world");

    auto scene = slamd::scene();

    scene->set_object("/origin", slamd::geom::triad());

    vis->add_scene("scene", scene);

    vis->hang_forever();
}

This example highlights the main components of SlamDunk.

  1. The Visualizer object maintains the state of the visualization. It starts a TCP server, and spawns a viewer process that reads from it and displays the visualizations.
  2. A Scene object represents and contains a tree of 3D objects.
  3. Geometry objects can be added to Scenes with a path in the tree.
  4. To display a scene, we must add it to the visualizer - this creates a view of the scene.

Running this program results in the following interactive visualization:

Multiple scenes

We use ImGui to allow multiple sub-windows with floating and docking support inside the SlamDunk viewer. The following example illustrates creating two windows, each showing its own scene.

# python
import slamd
import numpy as np

if __name__ == "__main__":
    vis = slamd.Visualizer("two windows")

    scene1 = slamd.Scene()
    scene2 = slamd.Scene()

    vis.add_scene("scene 1", scene1)
    scene1.set_object("/box", slamd.geom.Box())

    vis.add_scene("scene 2", scene2)
    scene2.set_object("/origin", slamd.geom.Triad())

    scene2.set_object("/ball", slamd.geom.Sphere(2.0))

    sphere_transform = np.identity(4, dtype=np.float32)
    sphere_transform[:, 3] = np.array([5.0, 1.0, 2.0, 1.0])

    scene2.set_transform("/ball", sphere_transform)

    vis.hang_forever()
// C++
#include <glm/glm.hpp>
#include <slamd/slamd.hpp>

int main() {
    auto vis = slamd::visualizer("two windows");

    auto scene1 = slamd::scene();
    auto scene2 = slamd::scene();

    vis->add_scene("scene 1", scene1);
    scene1->set_object("/box", slamd::geom::box());

    vis->add_scene("scene 2", scene2);
    scene2->set_object("/origin", slamd::geom::triad());
    scene2->set_object("/ball", slamd::geom::sphere(2.0f));

    glm::mat4 sphere_transform(1.0);
    sphere_transform[3] += glm::vec4(5.0, 1.0, 2.0, 1.0);

    scene2->set_transform("/ball", sphere_transform);

    vis->hang_forever();
}

The resulting window looks like this:

The windows are fully controllable - you can drag then around, make tabs, use them in floating mode, dock them to the sides like you see in the screenshot. All of this is supported by ImGui.

Further reading

The examples in the /examples folder showcase some more features of SlamDunk, like

  • Canvases for 2D visualizations
  • Multiple views of the same scene
  • Moving objects around.
  • Taking control of the render loop to create fully-fletced GUIs around SlamDunk using the power of ImGui.

Installation

Python

The python binding wheels are available on PyPi, so you can simply

pip install slamd

C++

With FetchContent

You can use CMake's FetchContent. Add this to your CMakeLists.txt:

include(FetchContent)

FetchContent_Declare(
  slamd
  GIT_REPOSITORY https://github.com/Robertleoj/slam_dunk.git
  GIT_TAG main
  SOURCE_SUBDIR slamd
)

FetchContent_MakeAvailable(slamd)

Linking to it then looks like:

target_link_libraries(
    your_target PRIVATE

    slamd::slamd
)

With git submodules

If you add the repo as a submodule in your project, you can add it as a subdirectory with

add_subdirectory(path/to/slam_dunk/slamd)

Just make sure to

git submodule update --init --recursive

inside the submodule, as all necessary dependencies are vendored.

You can then link it to your executable or library with

target_link_libraries(
    your_target PRIVATE

    slamd::slamd
)

Contributions

All contributions are welcome! SlamDunk is in very early development, so there is enough work to do, and multiple things to improve.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

slamd-2.1.6-cp313-cp313-manylinux_2_28_x86_64.whl (67.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64

slamd-2.1.6-cp313-cp313-macosx_11_0_arm64.whl (7.9 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

slamd-2.1.6-cp312-cp312-manylinux_2_28_x86_64.whl (67.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64

slamd-2.1.6-cp312-cp312-macosx_11_0_arm64.whl (7.9 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

slamd-2.1.6-cp311-cp311-manylinux_2_28_x86_64.whl (67.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64

slamd-2.1.6-cp311-cp311-macosx_11_0_arm64.whl (7.9 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file slamd-2.1.6-cp313-cp313-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for slamd-2.1.6-cp313-cp313-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 88cd782eb7935d093fa4e20c0e7961f1958fe88af0d9a12bd3bd188e1231c17c
MD5 1397e9a59a8c351ed4b46deecf718b9a
BLAKE2b-256 838fdab7a36bfc3652a75b8308e3e001218c7aad87861d47988768c282a4958f

See more details on using hashes here.

Provenance

The following attestation bundles were made for slamd-2.1.6-cp313-cp313-manylinux_2_28_x86_64.whl:

Publisher: pip_publish.yml on Robertleoj/slam_dunk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slamd-2.1.6-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slamd-2.1.6-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1d672427ad9db0b521f9ab229dd823847f1a772256f7178995f4ffdfac5d3dcc
MD5 d402dd9bead97c2a6134f89497a0de0c
BLAKE2b-256 d13a20d5e755aa2630b8757773259e40480dca72fb4c6f31c1ae6c547271fd53

See more details on using hashes here.

Provenance

The following attestation bundles were made for slamd-2.1.6-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: pip_publish.yml on Robertleoj/slam_dunk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slamd-2.1.6-cp312-cp312-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for slamd-2.1.6-cp312-cp312-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 6599828a7236c7302f16443f537c9b8c777a1f48d35a511fd9743fd52f175c7e
MD5 7a0c50d23d9dd07970e1395a1dd5bddb
BLAKE2b-256 150b9e9d6a7ce7b4679794267d03dad18e505fb9d45498253a878f03d39e644c

See more details on using hashes here.

Provenance

The following attestation bundles were made for slamd-2.1.6-cp312-cp312-manylinux_2_28_x86_64.whl:

Publisher: pip_publish.yml on Robertleoj/slam_dunk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slamd-2.1.6-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slamd-2.1.6-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 89819218c2dbe1ae434754094b45cf6c97438458577d457a445320d7e1c8269b
MD5 63d57ae594ea654b46735525f258bb2c
BLAKE2b-256 6821b9a66c4f5f2a08e988c1ce9907b068c6d222f7964b7eb6cf7dbaf7a68f7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for slamd-2.1.6-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: pip_publish.yml on Robertleoj/slam_dunk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slamd-2.1.6-cp311-cp311-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for slamd-2.1.6-cp311-cp311-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 046e28fb4f6cacf806d15a90f0c4812da7cb7ba130d8705bbd87b65d0988dce6
MD5 09681ca9ddc3fdf39c008b5f40fcbc9b
BLAKE2b-256 8023c3a20c0e1f5d8914fd211b13d7146464a4906f08aaad8727d0d31ea4413d

See more details on using hashes here.

Provenance

The following attestation bundles were made for slamd-2.1.6-cp311-cp311-manylinux_2_28_x86_64.whl:

Publisher: pip_publish.yml on Robertleoj/slam_dunk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slamd-2.1.6-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slamd-2.1.6-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fa607ce698b94c04e1f2af6f9aa5ea34dd6807e59f7215ffe65c7ed740d1d818
MD5 e4795b8562b40ed90c7ba8d32f06dde3
BLAKE2b-256 5b80a3b354f9f7babf28b6a6d7487257e5467683d2f2cd6590bd8b8878c0812c

See more details on using hashes here.

Provenance

The following attestation bundles were made for slamd-2.1.6-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: pip_publish.yml on Robertleoj/slam_dunk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page