picogkffi

MoonBit FFI binding to the PicoGK native library

geometry
voxel
cad
computational engineering
3D modeling
moon add gmlewis/picogkffi@0.2.0
Download zip
Author
Version
0.2.0
License
Apache-2.0
Last updated
last month
Downloads
20
README

#picogkffi — MoonBit FFI Bindings for PicoGK

Direct in-process FFI bindings to the PicoGK native geometry kernel. Provides the same API surface as the Go picogkffi package.

#Architecture

Unlike the picogk MCP client package (which communicates with the PicoGK server over JSON-RPC), picogkffi calls the native PicoGK C library directly via MoonBit's extern "C" FFI declarations.

This requires linking against libpicogk at build time. The library is loaded at runtime via dlopen (see picogk_loader.c).

#Package Structure

FileDescription
types.mbtCore types: Vec3, BBox3, Triangle, ColorFloat
ffi.mbtLow-level extern "C" declarations for all C API functions
runtime.mbtLibrary lifecycle: init, shutdown, version, memory stats
voxels.mbtVoxel operations: create, boolean, offset, query, slice
sdf.mbtImplicit SDF rendering: gyroid sphere, gyroid genus, superellipsoid
mesh.mbtMesh operations: create, vertices, triangles, bounding box
lattice.mbtLattice operations: beams, nodes, voxelize
polyline.mbtPolyLine for debug visualization
vdbfile.mbtOpenVDB file I/O
scalarfield.mbtScalar field operations
vectorfield.mbtVector field operations
metadata.mbtKey/value metadata for voxel fields
viewer.mbtOpenGL Viewer + ViewerEx with camera callbacks
tga.mbtScreenshot to PNG conversion utilities

#C Stubs

FileDescription
picogk_loader.cdlopen-based loader for all PicoGK C API functions
picogk_stl.cBinary STL writer
picogk_png.cPNG writer (stb_image_write) + TGA→PNG screenshot converter
picogk_sdf.cC-side SDF implementations (gyroid, superellipsoid) + implicit rendering
picogk_viewer.cViewerEx with camera callbacks (orbit, pan, zoom, autofit)

#Implicit SDF Rendering

MoonBit's native backend does not support C→MoonBit callbacks cleanly, so the SDF implementations live in C (picogk_sdf.c). This provides the same functionality as the Go FFI NewSDF callback for the specific SDFs used by the examples:

  • Voxels::render_gyroid_sphere — gyroid TPMS clipped to a sphere
  • Voxels::render_gyroid_sphere_offset — same, with x/y/z offset
  • Voxels::render_gyroid_genus — genus-2 surface intersected with gyroid
  • Voxels::render_superellipsoid — superellipsoid SDF
  • Voxels::render_gyroid — plain gyroid TPMS shell
  • Voxels::intersect_gyroid_sphere — clip voxels by gyroid sphere SDF

#ViewerEx

The ViewerEx struct provides a viewer with full camera control callbacks implemented in C (matching the Go ViewerEx / PicoPie viewer.py camera math). This enables proper 3D rendering with PBR shading.

let v = @pk.new_viewer_ex("Title", 1280, 960, 0.16, 0.16, 0.20, 1.0)
v.add_voxels(0, part)
v.set_group_material(0, @pk.ColorFloat::new(0.35, 0.6, 0.9, 1.0), 0.1, 0.5)
v.screenshot_png("/tmp/output.png", 12)
v.request_close()
v.destroy()

#API Coverage

All C API functions from picogk_ffi.h are covered, matching the Go picogkffi package. The SDF rendering uses C-side implementations instead of per-voxel callbacks (same result, different mechanism).

#Usage

import "@gmlewis/picogkffi" as pf

fn main {
pf.init_with_size(0.5).unwrap()
defer pf.shutdown()

let body = pf.new_sphere(Vec3::{ x: 0.0, y: 0.0, z: 0.0 }, 10.0)
let hole = pf.new_sphere(Vec3::{ x: 6.0, y: 0.0, z: 0.0 }, 6.0)
let part = body.sub(hole)
hole.destroy()
part.shell(1.0)

let mesh = part.to_mesh()
mesh.save_stl("/tmp/part.stl")
mesh.destroy()
part.destroy()
}

#Linking

When building, link against the PicoGK shared library. The loader (picogk_loader.c) uses dlopen to find the library at runtime, checking the PICOGK_LIB environment variable first, then falling back to a hardcoded path.

moon build --target native

#
Handle

type Handle = Int64

#
BBox3

pub struct BBox3 {
min : Vec3
max : Vec3
}

#
BBox3::new

fn BBox3::new(min_v : Vec3, max_v : Vec3) -> BBox3

#
ColorFloat

pub struct ColorFloat {
r : Double
g : Double
b : Double
a : Double
}

#
ColorFloat::new

fn ColorFloat::new(r : Double, g : Double, b : Double, a : Double) -> ColorFloat

#
GpuTex

pub struct GpuTex {
h : Int64
}

#
GpuTex::mark_for_cleanup

fn GpuTex::mark_for_cleanup(self : GpuTex, viewer : Viewer) -> Unit

#
GpuTex::refresh

fn GpuTex::refresh(self : GpuTex, viewer : Viewer, name : String) -> Unit

#
Lattice

pub struct Lattice {
h : Int64
}

#
Lattice::add_beam

fn Lattice::add_beam(self : Lattice, start : Vec3, end : Vec3, radius1 : Double, radius2 : Double, round_cap : Bool) -> Unit

#
Lattice::add_sphere

fn Lattice::add_sphere(self : Lattice, center : Vec3, radius : Double) -> Unit

#
Lattice::destroy

fn Lattice::destroy(self : Lattice) -> Unit

#
Lattice::is_valid

fn Lattice::is_valid(self : Lattice) -> Bool

#
Lattice::mem_usage

fn Lattice::mem_usage(self : Lattice) -> Int64

#
Mesh

pub struct Mesh {
h : Int64
}

#
Mesh::add_triangle

fn Mesh::add_triangle(self : Mesh, a : Int, b : Int, c : Int) -> Int

#
Mesh::add_vertex

fn Mesh::add_vertex(self : Mesh, pt : Vec3) -> Int

#
Mesh::bounding_box

fn Mesh::bounding_box(self : Mesh) -> BBox3

#
Mesh::destroy

fn Mesh::destroy(self : Mesh) -> Unit

#
Mesh::get_triangle

fn Mesh::get_triangle(self : Mesh, index : Int) -> Triangle

#
Mesh::get_triangle_vertices

fn Mesh::get_triangle_vertices(self : Mesh, index : Int) -> (Vec3, Vec3, Vec3)

#
Mesh::get_vertex

fn Mesh::get_vertex(self : Mesh, index : Int) -> Vec3

#
Mesh::is_valid

fn Mesh::is_valid(self : Mesh) -> Bool

#
Mesh::mem_usage

fn Mesh::mem_usage(self : Mesh) -> Int64

#
Mesh::save_stl

fn Mesh::save_stl(self : Mesh, path : String) -> Bool

Mesh::save_stl writes the mesh to a binary STL file. Returns true on success, false on error.

#
Mesh::triangle_count

fn Mesh::triangle_count(self : Mesh) -> Int

#
Mesh::triangles

fn Mesh::triangles(self : Mesh) -> Array[Int]

#
Mesh::vertex_count

fn Mesh::vertex_count(self : Mesh) -> Int

#
Mesh::vertices

fn Mesh::vertices(self : Mesh) -> Array[Double]

#
Metadata

pub struct Metadata {
h : Int64
}

#
Metadata::count

fn Metadata::count(self : Metadata) -> Int

#
Metadata::destroy

fn Metadata::destroy(self : Metadata) -> Unit

#
Metadata::get_float

fn Metadata::get_float(self : Metadata, name : String) -> Double?

#
Metadata::get_string

fn Metadata::get_string(self : Metadata, name : String) -> String?

#
Metadata::get_vector

fn Metadata::get_vector(self : Metadata, name : String) -> Vec3?

#
Metadata::name_at

fn Metadata::name_at(self : Metadata, index : Int) -> String

#
Metadata::remove

fn Metadata::remove(self : Metadata, name : String) -> Unit

#
Metadata::set_float

fn Metadata::set_float(self : Metadata, name : String, value : Double) -> Unit

#
Metadata::set_string

fn Metadata::set_string(self : Metadata, name : String, value : String) -> Unit

#
Metadata::set_vector

fn Metadata::set_vector(self : Metadata, name : String, value : Vec3) -> Unit

#
Metadata::type_at

fn Metadata::type_at(self : Metadata, name : String) -> Int

#
PolyLine

pub struct PolyLine {
h : Int64
}

#
PolyLine::add_vertex

fn PolyLine::add_vertex(self : PolyLine, pt : Vec3) -> Int

#
PolyLine::bounding_box

fn PolyLine::bounding_box(self : PolyLine) -> BBox3

#
PolyLine::destroy

fn PolyLine::destroy(self : PolyLine) -> Unit

#
PolyLine::get_color

fn PolyLine::get_color(self : PolyLine) -> ColorFloat

#
PolyLine::get_vertex

fn PolyLine::get_vertex(self : PolyLine, index : Int) -> Vec3

#
PolyLine::is_valid

fn PolyLine::is_valid(self : PolyLine) -> Bool

#
PolyLine::mem_usage

fn PolyLine::mem_usage(self : PolyLine) -> Int64

#
PolyLine::vertex_count

fn PolyLine::vertex_count(self : PolyLine) -> Int

#
PolyLine::vertices

fn PolyLine::vertices(self : PolyLine) -> Array[Double]

#
Quad

pub struct Quad {
h : Int64
}

#
Quad::destroy

fn Quad::destroy(self : Quad, viewer : Viewer) -> Unit

#
Quad::set_matrix

fn Quad::set_matrix(self : Quad, viewer : Viewer, matrix : FixedArray[Byte]) -> Unit

#
ScalarField

pub struct ScalarField {
h : Int64
}

#
ScalarField::copy

fn ScalarField::copy(self : ScalarField) -> ScalarField

#
ScalarField::destroy

fn ScalarField::destroy(self : ScalarField) -> Unit

#
ScalarField::get_slice

fn ScalarField::get_slice(self : ScalarField, z : Int) -> Array[Double]

#
ScalarField::get_value

fn ScalarField::get_value(self : ScalarField, pt : Vec3) -> Double?

#
ScalarField::is_valid

fn ScalarField::is_valid(self : ScalarField) -> Bool

#
ScalarField::mem_usage

fn ScalarField::mem_usage(self : ScalarField) -> Int64

#
ScalarField::remove_value

fn ScalarField::remove_value(self : ScalarField, pt : Vec3) -> Unit

#
ScalarField::set_value

fn ScalarField::set_value(self : ScalarField, pt : Vec3, val : Double) -> Unit

#
ScalarField::voxel_dimensions

fn ScalarField::voxel_dimensions(self : ScalarField) -> (Int, Int, Int, Int, Int, Int)

pub struct SideBar {
h : Int64
}

#
SideBar::destroy

fn SideBar::destroy(self : SideBar, viewer : Viewer) -> Unit

#
Triangle

pub struct Triangle {
a : Int
b : Int
c : Int
}

#
Triangle::new

fn Triangle::new(a : Int, b : Int, c : Int) -> Triangle

#
VdbFile

pub struct VdbFile {
h : Int64
}

#
VdbFile::add_scalar_field

fn VdbFile::add_scalar_field(self : VdbFile, name : String, sf : ScalarField) -> Int

#
VdbFile::add_vector_field

fn VdbFile::add_vector_field(self : VdbFile, name : String, vf : VectorField) -> Int

#
VdbFile::add_voxels

fn VdbFile::add_voxels(self : VdbFile, name : String, vox : Voxels) -> Int

#
VdbFile::destroy

fn VdbFile::destroy(self : VdbFile) -> Unit

#
VdbFile::field_count

fn VdbFile::field_count(self : VdbFile) -> Int

#
VdbFile::field_type

fn VdbFile::field_type(self : VdbFile, index : Int) -> Int

#
VdbFile::get_field_name

fn VdbFile::get_field_name(self : VdbFile, index : Int) -> String

#
VdbFile::get_scalar_field

fn VdbFile::get_scalar_field(self : VdbFile, index : Int) -> ScalarField

#
VdbFile::get_vector_field

fn VdbFile::get_vector_field(self : VdbFile, index : Int) -> VectorField

#
VdbFile::get_voxels

fn VdbFile::get_voxels(self : VdbFile, index : Int) -> Voxels

#
VdbFile::is_valid

fn VdbFile::is_valid(self : VdbFile) -> Bool

#
VdbFile::mem_usage

fn VdbFile::mem_usage(self : VdbFile) -> Int64

#
VdbFile::save_to_file

fn VdbFile::save_to_file(self : VdbFile, path : String) -> Bool

#
Vec3

pub struct Vec3 {
x : Double
y : Double
z : Double
}

#
Vec3::new

fn Vec3::new(x : Double, y : Double, z : Double) -> Vec3

#
VectorField

pub struct VectorField {
h : Int64
}

#
VectorField::copy

fn VectorField::copy(self : VectorField) -> VectorField

#
VectorField::destroy

fn VectorField::destroy(self : VectorField) -> Unit

#
VectorField::get_value

fn VectorField::get_value(self : VectorField, pt : Vec3) -> Vec3?

#
VectorField::is_valid

fn VectorField::is_valid(self : VectorField) -> Bool

#
VectorField::mem_usage

fn VectorField::mem_usage(self : VectorField) -> Int64

#
VectorField::remove_value

fn VectorField::remove_value(self : VectorField, pt : Vec3) -> Unit

#
VectorField::set_value

fn VectorField::set_value(self : VectorField, pt : Vec3, val : Vec3) -> Unit

#
Viewer

pub struct Viewer {
h : Int64
}

#
Viewer::add_mesh

fn Viewer::add_mesh(self : Viewer, group : Int, mesh : Mesh) -> Unit

Add a mesh to the viewer at the given group.

#
Viewer::add_poly_line

fn Viewer::add_poly_line(self : Viewer, group : Int, pl : PolyLine) -> Unit

Add a polyline to the viewer at the given group.

#
Viewer::add_voxels

fn Viewer::add_voxels(self : Viewer, group : Int, vox : Voxels) -> Unit

Add voxels to the viewer at the given group.

#
Viewer::bounding_box

fn Viewer::bounding_box(self : Viewer) -> BBox3

Get the scene bounding box.

#
Viewer::destroy

fn Viewer::destroy(self : Viewer) -> Unit

Destroy the viewer.

#
Viewer::disable_group_warn_overhang

fn Viewer::disable_group_warn_overhang(self : Viewer, group : Int) -> Unit

Disable overhang warnings for a group.

#
Viewer::enable_experimental

fn Viewer::enable_experimental(self : Viewer, enable : Bool) -> Unit

Enable or disable experimental features.

#
Viewer::enable_group_warn_overhang

fn Viewer::enable_group_warn_overhang(self : Viewer, group : Int, max_angle : Double, min_length : Double) -> Unit

Enable overhang warnings for a group.

#
Viewer::is_valid

fn Viewer::is_valid(self : Viewer) -> Bool

Returns true if the viewer is still valid.

#
Viewer::load_light_setup

fn Viewer::load_light_setup(self : Viewer, diffuse : FixedArray[Byte], specular : FixedArray[Byte]) -> Bool

Load IBL lighting from DDS data.

#
Viewer::poll

fn Viewer::poll(self : Viewer) -> Bool

Process one frame. Returns false if the viewer was closed.

#
Viewer::remove_all_objects

fn Viewer::remove_all_objects(self : Viewer) -> Unit

Remove all objects from the viewer.

#
Viewer::remove_mesh

fn Viewer::remove_mesh(self : Viewer, mesh : Mesh) -> Unit

Remove a mesh from the viewer.

#
Viewer::remove_poly_line

fn Viewer::remove_poly_line(self : Viewer, pl : PolyLine) -> Unit

Remove a polyline from the viewer.

#
Viewer::remove_voxels

fn Viewer::remove_voxels(self : Viewer, vox : Voxels) -> Unit

Remove voxels from the viewer.

#
Viewer::request_close

fn Viewer::request_close(self : Viewer) -> Unit

Request the viewer to close.

#
Viewer::request_screen_shot

fn Viewer::request_screen_shot(self : Viewer, path : String) -> Unit

Request a screenshot to the given file path.

#
Viewer::request_update

fn Viewer::request_update(self : Viewer) -> Unit

Request a redraw.

#
Viewer::run

fn Viewer::run(self : Viewer) -> Unit

Run the viewer event loop until closed.

#
Viewer::screenshot

fn Viewer::screenshot(self : Viewer, path : String, frames : Int) -> Unit

Take a screenshot by polling frames.

#
Viewer::screenshot_png

fn Viewer::screenshot_png(self : Viewer, path : String, frames : Int) -> Bool

Viewer::screenshot_png takes a screenshot and converts it to PNG. The native viewer writes TGA internally; this method handles the conversion to PNG and cleans up the TGA file, all in C. Returns true on success, false on error.

#
Viewer::set_group_material

fn Viewer::set_group_material(self : Viewer, group : Int, color : ColorFloat, metallic : Double, roughness : Double) -> Unit

Set PBR material for a group.

#
Viewer::set_group_matrix

fn Viewer::set_group_matrix(self : Viewer, group : Int, matrix : FixedArray[Byte]) -> Unit

Set transform matrix for a group.

#
Viewer::set_group_visible

fn Viewer::set_group_visible(self : Viewer, group : Int, visible : Bool) -> Unit

Set visibility of a group.

#
Viewer::set_mesh_matrix

fn Viewer::set_mesh_matrix(self : Viewer, mesh : Mesh, matrix : FixedArray[Byte]) -> Unit

Set the transform matrix for a mesh.

#
Viewer::set_poly_line_matrix

fn Viewer::set_poly_line_matrix(self : Viewer, pl : PolyLine, matrix : FixedArray[Byte]) -> Unit

Set the transform matrix for a polyline.

#
Viewer::set_voxels_matrix

fn Viewer::set_voxels_matrix(self : Viewer, vox : Voxels, matrix : FixedArray[Byte]) -> Unit

Set the transform matrix for voxels.

#
ViewerEx

pub struct ViewerEx {
h : Int64
}

ViewerEx is a viewer with full camera control callbacks (C-side). This provides the same rendering quality as the Go ViewerEx / PicoPie viewer.

#
ViewerEx::add_mesh

fn ViewerEx::add_mesh(self : ViewerEx, group : Int, mesh : Mesh) -> Unit

Add a mesh to the viewer at the given group.

#
ViewerEx::add_voxels

fn ViewerEx::add_voxels(self : ViewerEx, group : Int, vox : Voxels) -> Unit

Add voxels to the viewer at the given group.

#
ViewerEx::bounding_box

fn ViewerEx::bounding_box(self : ViewerEx) -> BBox3

Get the scene bounding box.

#
ViewerEx::destroy

fn ViewerEx::destroy(self : ViewerEx) -> Unit

Destroy the viewer.

#
ViewerEx::is_valid

fn ViewerEx::is_valid(self : ViewerEx) -> Bool

Returns true if the viewer is still valid.

#
ViewerEx::poll

fn ViewerEx::poll(self : ViewerEx) -> Bool

Process one frame. Returns false if the viewer was closed.

#
ViewerEx::remove_all_objects

fn ViewerEx::remove_all_objects(self : ViewerEx) -> Unit

Remove all objects from the viewer.

#
ViewerEx::request_close

fn ViewerEx::request_close(self : ViewerEx) -> Unit

Request the viewer to close.

#
ViewerEx::request_update

fn ViewerEx::request_update(self : ViewerEx) -> Unit

Request a redraw.

#
ViewerEx::run

fn ViewerEx::run(self : ViewerEx) -> Unit

Run the viewer event loop until closed.

#
ViewerEx::screenshot_png

fn ViewerEx::screenshot_png(self : ViewerEx, path : String, frames : Int) -> Bool

Take a screenshot to PNG. Does autofit + warm-up frames + screenshot. Returns true on success.

#
ViewerEx::screenshot_png_keep_tga

fn ViewerEx::screenshot_png_keep_tga(self : ViewerEx, path : String, frames : Int, keep_tga : Bool) -> Bool

Take a screenshot to PNG, optionally keeping the raw TGA file. Returns true on success.

#
ViewerEx::set_group_material

fn ViewerEx::set_group_material(self : ViewerEx, group : Int, color : ColorFloat, metallic : Double, roughness : Double) -> Unit

Set PBR material for a group.

#
ViewerEx::set_group_visible

fn ViewerEx::set_group_visible(self : ViewerEx, group : Int, visible : Bool) -> Unit

Set visibility of a group.

#
Voxels

pub struct Voxels {
h : Int64
}

#
Voxels::add

fn Voxels::add(self : Voxels, other : Voxels) -> Voxels

#
Voxels::bool_add

fn Voxels::bool_add(self : Voxels, other : Voxels) -> Unit

#
Voxels::bool_intersect

fn Voxels::bool_intersect(self : Voxels, other : Voxels) -> Unit

#
Voxels::bool_subtract

fn Voxels::bool_subtract(self : Voxels, other : Voxels) -> Unit

#
Voxels::bounding_box

fn Voxels::bounding_box(self : Voxels) -> BBox3

#
Voxels::closest_point

fn Voxels::closest_point(self : Voxels, pt : Vec3) -> Vec3?

#
Voxels::copy

fn Voxels::copy(self : Voxels) -> Voxels

#
Voxels::destroy

fn Voxels::destroy(self : Voxels) -> Unit

#
Voxels::diagnose

fn Voxels::diagnose(self : Voxels) -> String

#
Voxels::double_offset

fn Voxels::double_offset(self : Voxels, d1 : Double, d2 : Double) -> Unit

#
Voxels::get_interpolated_z_slice

fn Voxels::get_interpolated_z_slice(self : Voxels, z : Double) -> Array[Double]

#
Voxels::get_x_slice

fn Voxels::get_x_slice(self : Voxels, x : Int) -> Array[Double]

#
Voxels::get_y_slice

fn Voxels::get_y_slice(self : Voxels, y : Int) -> Array[Double]

#
Voxels::get_z_slice

fn Voxels::get_z_slice(self : Voxels, z : Int) -> Array[Double]

#
Voxels::intersect

fn Voxels::intersect(self : Voxels, other : Voxels) -> Voxels

#
Voxels::intersect_gyroid_sphere

fn Voxels::intersect_gyroid_sphere(self : Voxels, radius : Double, wall : Double, k : Double) -> Unit

Intersect the voxel field with a gyroid sphere SDF (in-place).

#
Voxels::is_empty

fn Voxels::is_empty(self : Voxels) -> Bool

#
Voxels::is_equal

fn Voxels::is_equal(self : Voxels, other : Voxels) -> Bool

#
Voxels::is_inside

fn Voxels::is_inside(self : Voxels, pt : Vec3) -> Bool

#
Voxels::is_valid

fn Voxels::is_valid(self : Voxels) -> Bool

#
Voxels::mem_usage

fn Voxels::mem_usage(self : Voxels) -> Int64

#
Voxels::offset

fn Voxels::offset(self : Voxels, dist : Double) -> Unit

#
Voxels::project_z_slice

fn Voxels::project_z_slice(self : Voxels, start_z : Double, end_z : Double) -> Unit

#
Voxels::ray_cast

fn Voxels::ray_cast(self : Voxels, origin : Vec3, dir : Vec3) -> Vec3?

#
Voxels::render_gyroid

fn Voxels::render_gyroid(self : Voxels, bbox : BBox3, wall : Double, k : Double) -> Unit

Render a plain gyroid (TPMS shell) into the voxel field.

#
Voxels::render_gyroid_genus

fn Voxels::render_gyroid_genus(self : Voxels, bbox : BBox3, scale : Double, gap : Double, k : Double) -> Unit

Render a gyroid genus (genus-2 surface intersected with gyroid) into the voxel field.

#
Voxels::render_gyroid_sphere

fn Voxels::render_gyroid_sphere(self : Voxels, bbox : BBox3, radius : Double, wall : Double, k : Double) -> Unit

Render a gyroid sphere (gyroid TPMS clipped to a sphere) into the voxel field. Uses max(abs(gyroid) - wall, sphere_sdf) composed SDF — same approach as PicoPie.

#
Voxels::render_gyroid_sphere_offset

fn Voxels::render_gyroid_sphere_offset(self : Voxels, bbox : BBox3, radius : Double, wall : Double, k : Double, ox : Double, oy : Double, oz : Double) -> Unit

Render a gyroid sphere with x/y/z offset (for positioning in a scene).

#
Voxels::render_lattice

fn Voxels::render_lattice(self : Voxels, lat : Lattice) -> Unit

#
Voxels::render_mesh

fn Voxels::render_mesh(self : Voxels, mesh : Mesh) -> Unit

#
Voxels::render_superellipsoid

fn Voxels::render_superellipsoid(self : Voxels, bbox : BBox3, a : Double, b : Double, c : Double, e1 : Double, e2 : Double) -> Unit

Render a superellipsoid into the voxel field.

#
Voxels::shell

fn Voxels::shell(self : Voxels, thickness : Double) -> Unit

#
Voxels::sub

fn Voxels::sub(self : Voxels, other : Voxels) -> Voxels

#
Voxels::surface_normal

fn Voxels::surface_normal(self : Voxels, pt : Vec3) -> Vec3

#
Voxels::to_mesh

fn Voxels::to_mesh(self : Voxels) -> Mesh

#
Voxels::triple_offset

fn Voxels::triple_offset(self : Voxels, dist : Double) -> Unit

#
Voxels::volume

fn Voxels::volume(self : Voxels) -> Double

#
Voxels::voxel_dimensions

fn Voxels::voxel_dimensions(self : Voxels) -> (Int, Int, Int, Int, Int, Int)

#
Voxels::voxel_size

fn Voxels::voxel_size(self : Voxels) -> Double

#
FIELD_TYPE_SCALAR

let FIELD_TYPE_SCALAR : Int

#
FIELD_TYPE_UNKNOWN

let FIELD_TYPE_UNKNOWN : Int

#
FIELD_TYPE_VECTOR

let FIELD_TYPE_VECTOR : Int

#
FIELD_TYPE_VOXELS

let FIELD_TYPE_VOXELS : Int

#
META_TYPE_FLOAT

let META_TYPE_FLOAT : Int

#
META_TYPE_STRING

let META_TYPE_STRING : Int

#
META_TYPE_UNKNOWN

let META_TYPE_UNKNOWN : Int

#
META_TYPE_VECTOR

let META_TYPE_VECTOR : Int

#
build_info

fn build_info() -> String

#
default_azimuth

let default_azimuth : Double

Default camera azimuth matching PicoPie / Go DefaultCameraState.

#
default_elevation

let default_elevation : Double

Default camera elevation matching PicoPie / Go DefaultCameraState.

#
from_lattice

fn from_lattice(lat : Lattice) -> Voxels

#
from_mesh

fn from_mesh(mesh : Mesh) -> Voxels

#
get_instance

fn get_instance() -> Int64

#
init_library

fn init_library(vs : Double) -> Result[Unit, String]

#
init_with_size

fn init_with_size(vs : Double) -> Result[Unit, String]

#
is_initialized

fn is_initialized() -> Bool

#
lattices_allocated

fn lattices_allocated() -> Int64

#
lattices_mem_usage

fn lattices_mem_usage() -> Int64

#
mesh_from_arrays

fn mesh_from_arrays(vertices : Array[Double], triangles : Array[Int]) -> Mesh

#
mesh_from_voxels

fn mesh_from_voxels(v : Voxels) -> Mesh

#
meshes_allocated

fn meshes_allocated() -> Int64

#
meshes_mem_usage

fn meshes_mem_usage() -> Int64

#
metadata_from_scalar_field

fn metadata_from_scalar_field(sf : ScalarField) -> Metadata

#
metadata_from_vector_field

fn metadata_from_vector_field(vf : VectorField) -> Metadata

#
metadata_from_voxels

fn metadata_from_voxels(v : Voxels) -> Metadata

#
mm_to_voxels

fn mm_to_voxels(pt : Vec3) -> Vec3

#
name

fn name() -> String

#
new_box

fn new_box(min_x : Double, min_y : Double, min_z : Double, max_x : Double, max_y : Double, max_z : Double) -> Voxels

new_box creates a box voxel object from min/max corners.

#
new_capsule

fn new_capsule(start : Vec3, end : Vec3, radius1 : Double, radius2 : Double) -> Voxels

#
new_cylinder

fn new_cylinder(x : Double, y : Double, z : Double, radius : Double, height : Double, dir_x : Double?, dir_y : Double?, dir_z : Double?) -> Voxels

new_cylinder creates a cylinder voxel object. By default the cylinder runs along +Z from (x, y, z) to (x, y, z + height). Pass dir_x/dir_y/dir_z to orient the axis differently.

#
new_gpu_tex

fn new_gpu_tex(viewer : Viewer, width : Int, height : Int, name : String) -> GpuTex

#
new_lattice

fn new_lattice() -> Lattice

#
new_mesh

fn new_mesh() -> Mesh

#
new_mesh_shell

fn new_mesh_shell(mesh : Mesh, radius : Double) -> Voxels

#
new_polyline

fn new_polyline(color : ColorFloat) -> PolyLine

#
new_quad

fn new_quad(viewer : Viewer, tex : GpuTex, color : ColorFloat, size : Double, matrix : FixedArray[Byte], screen_space : Bool, centered : Bool, flip_y : Bool) -> Quad

#
new_scalar_field

fn new_scalar_field() -> ScalarField

#
new_sidebar

fn new_sidebar(viewer : Viewer, right : Bool, width : Int, height : Int, font_size : Int, bg_color : ColorFloat, fg_color : ColorFloat) -> SideBar

#
new_sphere

fn new_sphere(center : Vec3, radius : Double) -> Voxels

#
new_vdb_file

fn new_vdb_file() -> VdbFile

#
new_vector_field

fn new_vector_field() -> VectorField

#
new_viewer

fn new_viewer(title : String, width : Int, height : Int) -> Viewer

Create a new viewer with title and window size. Requires a display + OpenGL context.

#
new_viewer_ex

fn new_viewer_ex(title : String, width : Int, height : Int, bg_r : Double, bg_g : Double, bg_b : Double, bg_a : Double) -> ViewerEx

Create a new ViewerEx with default camera state. Requires a display + OpenGL context.

#
new_voxels

fn new_voxels() -> Voxels

#
open_url

fn open_url(url : String) -> Bool

open_url opens a URL in the default browser. Returns true on success, false on error.

#
picogk_write_png

fn picogk_write_png(path : FixedArray[Byte], width : Int, height : Int, pixels : Bytes, stride : Int, bytes_per_pixel : Int, top_origin : Int) -> Int

#
polyline_from_vertices

fn polyline_from_vertices(vertices : Array[Double], color : ColorFloat) -> PolyLine

#
polylines_allocated

fn polylines_allocated() -> Int64

#
polylines_mem_usage

fn polylines_mem_usage() -> Int64

#
scalar_field_build_from_voxels

fn scalar_field_build_from_voxels(v : Voxels, min_val : Double, max_val : Double) -> ScalarField

#
scalar_field_from_voxels

fn scalar_field_from_voxels(v : Voxels) -> ScalarField

#
scalar_field_traverse_active

fn scalar_field_traverse_active(h_this : Int64, h_sf : Int64, p_cb : FixedArray[Byte]) -> Unit

#
scalar_fields_allocated

fn scalar_fields_allocated() -> Int64

#
scalar_fields_mem_usage

fn scalar_fields_mem_usage() -> Int64

#
shutdown

fn shutdown() -> Unit

#
total_memory_usage

fn total_memory_usage() -> Int64

#
vdb_file_from_path

fn vdb_file_from_path(path : String) -> VdbFile

#
vdb_files_allocated

fn vdb_files_allocated() -> Int64

#
vdb_files_mem_usage

fn vdb_files_mem_usage() -> Int64

#
vdb_metas_allocated

fn vdb_metas_allocated() -> Int64

#
vdb_metas_mem_usage

fn vdb_metas_mem_usage() -> Int64

#
vector_field_build_from_voxels

fn vector_field_build_from_voxels(v : Voxels, ref_vec : Vec3, scale : Double) -> VectorField

#
vector_field_from_voxels

fn vector_field_from_voxels(v : Voxels) -> VectorField

#
vector_field_traverse_active

fn vector_field_traverse_active(h_this : Int64, h_vf : Int64, p_cb : FixedArray[Byte]) -> Unit

#
vector_fields_allocated

fn vector_fields_allocated() -> Int64

#
vector_fields_mem_usage

fn vector_fields_mem_usage() -> Int64

#
version

fn version() -> String

#
voxel_size

fn voxel_size() -> Double

#
voxels_allocated

fn voxels_allocated() -> Int64

#
voxels_intersect_implicit

fn voxels_intersect_implicit(h_this : Int64, h_vox : Int64, p_sdf : FixedArray[Byte]) -> Unit

#
voxels_mem_usage

fn voxels_mem_usage() -> Int64

#
voxels_render_implicit

fn voxels_render_implicit(h_this : Int64, h_vox : Int64, p_bbox : FixedArray[Byte], p_sdf : FixedArray[Byte]) -> Unit

#
voxels_to_mm

fn voxels_to_mm(pt : Vec3) -> Vec3

#
write_file

fn write_file(path : String, data : String) -> Bool

write_file writes raw bytes to a file. Returns true on success, false on error.

#
write_slice_png

fn write_slice_png(path : String, sdf : Array[Double], width : Int, height : Int) -> Bool

Write a Z-slice SDF array to a grayscale PNG file. SDF values <= 0 are inside (solid) -> dark; > 0 are outside -> light. Returns true on success, false on error.