MoonBit bindings for meshoptimizer
///|
test {
let indices : FixedArray[UInt] = [0U, 1U, 2U, 2U, 1U, 3U]
let encoded = try! @meshopt_mbt.encode_index_buffer(indices, 4)
let decoded = try! @meshopt_mbt.decode_index_buffer(
encoded.data,
indices.length(),
)
assert_true(decoded == indices)
}///|
test {
let vertices = Bytes::makei(4, i => {
match i {
0 => b'\x01'
1 => b'\x02'
2 => b'\x01'
_ => b'\x03'
}
})
let (remap, unique_count) = try! @meshopt_mbt.generate_vertex_remap_unindexed(
vertices, 4, 1,
)
assert_eq(unique_count, 3)
assert_true(remap == [0U, 1U, 0U, 2U])
let compacted = try! @meshopt_mbt.remap_vertex_buffer(
vertices, 4, 1, unique_count, remap,
)
assert_eq(compacted.length(), 3)
}///|
test {
let indices : FixedArray[UInt] = [0U, 1U, 2U, 2U, 1U, 3U]
let optimized = try! @meshopt_mbt.optimize_vertex_cache(indices, 4)
assert_eq(optimized.length(), indices.length())
let stats = try! @meshopt_mbt.analyze_vertex_cache(optimized, 4)
assert_true(stats.vertices_transformed >= 4U)
assert_true(stats.acmr > 0.0F)
}///|
test {
let indices : FixedArray[UInt] = [0U, 1U, 2U, 2U, 1U, 3U]
let positions : FixedArray[Float] = [
0.0F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F, 0.0F, 1.0F, 0.0F, 1.0F, 1.0F, 0.0F,
]
let meshlets = try! @meshopt_mbt.build_meshlets(
indices, positions, 4, 12, 64, 64,
)
assert_true(meshlets.meshlet_count > 0)
let bounds = try! @meshopt_mbt.compute_cluster_bounds(
indices, positions, 4, 12,
)
assert_true(bounds.radius >= 0.0F)
}moon fmt --check
moon check --target native --warn-list +73
moon test --target native
moon info
moon fmtscripts/asan-smoke.shpub struct Bounds {
center_x : Float
center_y : Float
center_z : Float
radius : Float
cone_apex_x : Float
cone_apex_y : Float
cone_apex_z : Float
cone_axis_x : Float
cone_axis_y : Float
cone_axis_z : Float
cone_cutoff : Float
cone_axis_s8_x : Int
cone_axis_s8_y : Int
cone_axis_s8_z : Int
cone_cutoff_s8 : Int
} derive(Eq, Debug)fn PackedStreams::new(source : Bytes, offsets : FixedArray[Int], sizes : FixedArray[Int], strides : FixedArray[Int], stream_count : Int) -> PackedStreamsfn SimplifyOptions::new(lock_border? : Bool, sparse? : Bool, error_absolute? : Bool, prune? : Bool, regularize? : Bool, permissive? : Bool, regularize_light? : Bool) -> SimplifyOptionsfn analyze_coverage(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> CoverageStatistics raise MeshoptErrorfn analyze_overdraw(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> OverdrawStatistics raise MeshoptErrorfn analyze_vertex_cache(indices : FixedArray[UInt], vertex_count : Int, cache_size? : UInt, warp_size? : UInt, primgroup_size? : UInt) -> VertexCacheStatistics raise MeshoptErrorfn analyze_vertex_fetch(indices : FixedArray[UInt], vertex_count : Int, vertex_size : Int) -> VertexFetchStatistics raise MeshoptErrorfn build_meshlets(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, max_vertices : Int, max_triangles : Int, cone_weight? : Float) -> MeshletBuild raise MeshoptErrorfn build_meshlets_bound(index_count : Int, max_vertices : Int, max_triangles : Int) -> Int raise MeshoptErrorfn build_meshlets_flex(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, max_vertices : Int, min_triangles : Int, max_triangles : Int, cone_weight? : Float, split_factor? : Float) -> MeshletBuild raise MeshoptErrorfn build_meshlets_scan(indices : FixedArray[UInt], vertex_count : Int, max_vertices : Int, max_triangles : Int) -> MeshletBuild raise MeshoptErrorfn build_meshlets_spatial(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, max_vertices : Int, min_triangles : Int, max_triangles : Int, fill_weight? : Float) -> MeshletBuild raise MeshoptErrorfn compute_cluster_bounds(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> Bounds raise MeshoptErrorfn compute_meshlet_bounds(meshlet_vertices : FixedArray[UInt], meshlet_triangles : Bytes, triangle_count : Int, positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> Bounds raise MeshoptErrorfn compute_position_exponent(minv : FixedArray[Float], maxv : FixedArray[Float], min_exp : Int, max_bits : Int) -> Int raise MeshoptErrorfn compute_sphere_bounds(positions : FixedArray[Float], count : Int, positions_stride : Int, radii? : FixedArray[Float], radii_stride? : Int) -> Bounds raise MeshoptErrorfn decode_index_buffer_bytes(encoded : Bytes, index_count : Int, index_size : Int) -> Bytes raise MeshoptErrorfn decode_index_sequence_bytes(encoded : Bytes, index_count : Int, index_size : Int) -> Bytes raise MeshoptErrorfn decode_meshlet(encoded : Bytes, vertex_count : Int, vertex_size : Int, triangle_count : Int, triangle_size : Int) -> MeshletDecode raise MeshoptErrorfn decode_meshlet_raw(encoded : Bytes, vertex_count : Int, triangle_count : Int) -> MeshletDecodeRaw raise MeshoptErrorfn decode_vertex_buffer(encoded : Bytes, vertex_count : Int, vertex_size : Int) -> Bytes raise MeshoptErrorfn encode_filter_color(data : FixedArray[Float], count : Int, stride : Int, bits : Int) -> Bytes raise MeshoptErrorfn encode_filter_exp(data : FixedArray[Float], count : Int, stride : Int, bits : Int, mode? : EncodeExpMode) -> Bytes raise MeshoptErrorfn encode_filter_oct(data : FixedArray[Float], count : Int, stride : Int, bits : Int) -> Bytes raise MeshoptErrorfn encode_filter_quat(data : FixedArray[Float], count : Int, stride : Int, bits : Int) -> Bytes raise MeshoptErrorfn encode_index_buffer(indices : FixedArray[UInt], vertex_count : Int) -> MeshoptData raise MeshoptErrorfn encode_index_sequence(indices : FixedArray[UInt], vertex_count : Int) -> MeshoptData raise MeshoptErrorfn encode_meshlet(vertices : FixedArray[UInt], vertex_count : Int, triangles : Bytes, triangle_count : Int) -> MeshoptData raise MeshoptErrorfn encode_vertex_buffer(vertices : Bytes, vertex_count : Int, vertex_size : Int) -> MeshoptData raise MeshoptErrorfn encode_vertex_buffer_level(vertices : Bytes, vertex_count : Int, vertex_size : Int, level : Int, version : Int) -> MeshoptData raise MeshoptErrorfn extract_meshlet_indices(indices : FixedArray[UInt]) -> (FixedArray[UInt], Bytes, Int) raise MeshoptErrorfn generate_adjacency_index_buffer(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> FixedArray[UInt] raise MeshoptErrorfn generate_position_remap(positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> FixedArray[UInt] raise MeshoptErrorfn generate_provoking_index_buffer(indices : FixedArray[UInt], vertex_count : Int) -> ProvokingIndexBuffer raise MeshoptErrorfn generate_shadow_index_buffer(indices : FixedArray[UInt], vertices : Bytes, vertex_count : Int, vertex_size : Int, vertex_stride : Int) -> FixedArray[UInt] raise MeshoptErrorfn generate_shadow_index_buffer_multi(indices : FixedArray[UInt], streams : PackedStreams, vertex_count : Int) -> FixedArray[UInt] raise MeshoptErrorfn generate_tangents(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, normals : FixedArray[Float], normals_stride : Int, uvs : FixedArray[Float], uvs_stride : Int, options? : TangentOptions) -> FixedArray[Float] raise MeshoptErrorfn generate_tessellation_index_buffer(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> FixedArray[UInt] raise MeshoptErrorfn generate_vertex_remap_custom(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, callback : (UInt, UInt) -> Bool) -> (FixedArray[UInt], Int) raise MeshoptErrorfn generate_vertex_remap_custom_no_callback(positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn generate_vertex_remap_indexed(indices : FixedArray[UInt], vertices : Bytes, vertex_count : Int, vertex_size : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn generate_vertex_remap_multi_indexed(indices : FixedArray[UInt], streams : PackedStreams, vertex_count : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn generate_vertex_remap_multi_unindexed(streams : PackedStreams, vertex_count : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn generate_vertex_remap_unindexed(vertices : Bytes, vertex_count : Int, vertex_size : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn opacity_map_compact(data : Bytes, levels : Bytes, offsets : FixedArray[UInt], omm_count : Int, omm_indices : FixedArray[Int], triangle_count : Int, states : Int) -> Int raise MeshoptErrorfn opacity_map_measure(indices : FixedArray[UInt], uvs : FixedArray[Float], vertex_count : Int, uvs_stride : Int, texture_width : Int, texture_height : Int, max_level : Int, target_edge : Float) -> OpacityMapMeasure raise MeshoptErrorfn opacity_map_rasterize(level : Int, states : Int, uv0 : FixedArray[Float], uv1 : FixedArray[Float], uv2 : FixedArray[Float], texture_data : Bytes, texture_stride : Int, texture_pitch : Int, texture_width : Int, texture_height : Int) -> Bytes raise MeshoptErrorfn optimize_meshlet(meshlet_vertices : FixedArray[UInt], meshlet_triangles : Bytes, triangle_count : Int, vertex_count : Int) -> Unit raise MeshoptErrorfn optimize_meshlet_level(meshlet_vertices : FixedArray[UInt], meshlet_triangles : Bytes, triangle_count : Int, vertex_count : Int, level : Int) -> Unit raise MeshoptErrorfn optimize_overdraw(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, threshold? : Float) -> FixedArray[UInt] raise MeshoptErrorfn optimize_vertex_cache(indices : FixedArray[UInt], vertex_count : Int) -> FixedArray[UInt] raise MeshoptErrorfn optimize_vertex_cache_fifo(indices : FixedArray[UInt], vertex_count : Int, cache_size? : UInt) -> FixedArray[UInt] raise MeshoptErrorfn optimize_vertex_cache_strip(indices : FixedArray[UInt], vertex_count : Int) -> FixedArray[UInt] raise MeshoptErrorfn optimize_vertex_fetch(indices : FixedArray[UInt], vertices : Bytes, vertex_count : Int, vertex_size : Int) -> VertexFetchOptimization raise MeshoptErrorfn optimize_vertex_fetch_remap(indices : FixedArray[UInt], vertex_count : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn partition_clusters(cluster_indices : FixedArray[UInt], cluster_index_counts : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, target_partition_size : Int) -> (FixedArray[UInt], Int) raise MeshoptErrorfn remap_index_buffer_indexed(indices : FixedArray[UInt], remap : FixedArray[UInt]) -> FixedArray[UInt] raise MeshoptErrorfn remap_index_buffer_unindexed(index_count : Int, remap : FixedArray[UInt]) -> FixedArray[UInt] raise MeshoptErrorfn remap_vertex_buffer(vertices : Bytes, vertex_count : Int, vertex_size : Int, unique_vertex_count : Int, remap : FixedArray[UInt]) -> Bytes raise MeshoptErrorfn simplify(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, target_index_count : Int, target_error : Float, options? : SimplifyOptions) -> SimplifyResult raise MeshoptErrorfn simplify_points(positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, target_vertex_count : Int, colors? : FixedArray[Float], colors_stride? : Int, color_weight? : Float) -> (FixedArray[UInt], Int) raise MeshoptErrorfn simplify_prune(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, target_error : Float) -> (FixedArray[UInt], Int) raise MeshoptErrorfn simplify_scale(positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> Float raise MeshoptErrorfn simplify_sloppy(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, vertex_lock? : Bytes, target_index_count : Int, target_error : Float) -> SimplifyResult raise MeshoptErrorfn simplify_with_attributes(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, attributes : FixedArray[Float], attributes_stride : Int, weights : FixedArray[Float], attribute_count : Int, vertex_lock? : Bytes, target_index_count : Int, target_error : Float, options? : SimplifyOptions) -> SimplifyResult raise MeshoptErrorfn simplify_with_update(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, attributes? : FixedArray[Float], attributes_stride? : Int, weights? : FixedArray[Float], attribute_count? : Int, vertex_lock? : Bytes, target_index_count : Int, target_error : Float, options? : SimplifyOptions) -> (Int, Float) raise MeshoptErrorfn spatial_cluster_points(positions : FixedArray[Float], vertex_count : Int, positions_stride : Int, cluster_size : Int) -> FixedArray[UInt] raise MeshoptErrorfn spatial_sort_remap(positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> FixedArray[UInt] raise MeshoptErrorfn spatial_sort_triangles(indices : FixedArray[UInt], positions : FixedArray[Float], vertex_count : Int, positions_stride : Int) -> FixedArray[UInt] raise MeshoptErrorfn stripify_indices(indices : FixedArray[UInt], vertex_count : Int, restart_index? : UInt) -> (FixedArray[UInt], Int) raise MeshoptErrorfn unstripify_indices(indices : FixedArray[UInt], restart_index? : UInt) -> (FixedArray[UInt], Int) raise MeshoptErrorMoonBit bindings for meshoptimizer