Sign in

    picogkffi

    MoonBit FFI binding to the PicoGK native library

    geometry
    voxel
    cad
    computational engineering
    3D modeling
    Download zip
    Author
    Version
    0.2.1
    License
    Apache-2.0
    Last updated
    yesterday
    Downloads
    49

    #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.