modelio-rs
Safe Rust bindings for Apple's ModelIO framework on macOS. The published Cargo package is modelio-rs; the Rust library target is modelio.
Status: v0.2.2 brings the SDK audit to 117/117 top-level ModelIO symbols (100%) and adds material graphs/samplers, stereoscopic cameras, area/photometric lights, object containers, matrix arrays, voxel extras, SDK constants, and USDZ conversion helpers.
Highlights
Assetfor loading, exporting, and walking ModelIO assetsMeshfor procedural primitives, vertex buffer reads, submesh inspection, and vertex descriptor accessMaterial,MaterialProperty,TextureFilter,TextureSampler, and material-graph wrappers for physically plausible materials, standalone properties, and sampler/graph authoringLight,AreaLight,PhotometricLight,PhysicallyPlausibleLight,Camera, andStereoscopicCamerafor scene-lighting and camera control surfacesObjectandObjectContainerfor hierarchy creation, child traversal, path lookup, and transform-component attachmentTransform,TransformStack, and typed transform ops for explicit transform authoringMeshBufferData,MeshBufferDataAllocator, and related wrappers for buffer-authoring workflowsAssetResolverplus path, bundle, and relative resolvers for asset lookup controlVoxelArrayfor sparse voxel grids, asset/mesh voxelization, boolean ops, and coarse/smooth mesh generationTexturefor URL-backed textures, checkerboards, procedural gradients/noise/sky cubes, metadata, writes, and texel extractionLightProbeandLightProbeIrradianceDataSourcefor probe generation and placement helpersSkeleton,Matrix4x4Array,PackedJointAnimation,AnimationBindComponent, and animated value wrappers for rigging and animation workflowsVertexDescriptor,VertexAttribute,VertexBufferLayout, runtime SDK constant accessors, andUtilityfor vertex layout inspection and auxiliary SDK helpers
Quick start
use *;
Surface overview
Assets + objects
Asset::new,from_url,export_to_url,place_light_probesAsset::count,object_at,object_at_path,mesh_at,meshesAsset::frame_interval,start_time,end_time,up_axisObject::new,name,path,hidden,add_child,child_at,at_path,transform_component,children_containerObjectContainer::new,count,object_at,add_objectPathAssetResolver,BundleAssetResolver,RelativeAssetResolver, andAssetResolver::resolve_asset_named
Meshes + submeshes + vertex data
Mesh::new_box,new_plane,new_ellipsoid,new_sphere,new_cylinder,new_icosahedronMesh::vertex_count,vertex_buffers,submeshes,bounding_box,vertex_descriptorMeshBuffer::map,fill_data,allocator,zone,as_data_bufferMeshBufferData,MeshBufferDataAllocator,MeshBufferZoneDefault, andMeshBufferMapVertexAttributeData::info,bytesSubmesh::index_count,index_type,geometry_type,index_buffer,material,set_material,topologySubmeshTopology::new, crease/index buffer accessors, and face-count mutationVertexDescriptor::info,attributes,attribute_named,copy,layoutsVertexAttribute::new,info,set_initialization_valueVertexBufferLayout::new,stride,set_stride
Materials + textures
Material::new,info,material_face,property_with_semantic,property_named,load_textures_using_resolverMaterialProperty::new,info,set_float,set_color,set_string,set_url,texture,texture_samplerTextureFilter::new, wrap/filter setters, andinfoTextureSampler::new, texture/filter/transform setters, andinfoMaterialPropertyConnection,MaterialPropertyNode, andMaterialPropertyGraphfor graph construction/evaluationTexture::from_url,new_checkerboard,new_color_temperature_gradient,new_color_gradient,new_vector_noise,new_scalar_noise,new_cellular_noise,new_normal_map,new_sky_cubeTexture::info,write_to_url,update_sky_cube,texel_data_top_left,texel_data_bottom_left
Lights + cameras
Light::new,info,set_light_type,set_color_space,irradiance_at_pointAreaLight::newandPhotometricLight::new/new_with_ies_profileplus info accessorsLightProbe::new,reflective_texture,irradiance_texture,generate_spherical_harmonics_from_irradianceLightProbeIrradianceDataSource::new,bounding_box,spherical_harmonics_levelPhysicallyPlausibleLight::new,info,set_color_temperature,set_lumens, cone-angle and attenuation settersCamera::new,info,set_projection,set_field_of_view,look_at,look_at_from,ray_to,frame_bounding_boxStereoscopicCamera::new,info, and optical separation accessors
Transforms + animation
Transform::new,from_component,from_matrix,translation,rotation,scale, and timed settersTransformComponent::matrix,key_times,local_transform_at_time,global_transform_with_objectTransformStack::add_translate_op,add_rotate_*_op,add_scale_op,add_matrix_op,add_orient_op,transform_opsTransformOpplus typed op wrappers with animated-value accessors
Voxels + animation
VoxelArray::new,from_asset,info,set_voxel,voxel_exists,voxel_indices,voxels_within_extentVoxelArray::set_voxels_for_mesh,union_with,intersect_with,difference_with,coarse_mesh,mesh, allocator-aware mesh extractionSkeleton::new,info,joint_bind_transforms,joint_rest_transforms,joint_*_transform_arrayMatrix4x4Array::new,info,set_float_matrices,float_matrices,clearPackedJointAnimation::new,info,translations,rotations,scalesAnimationBindComponent::new,info,set_skeleton,set_packed_joint_animation,set_joint_pathsAnimatedScalar,AnimatedVector2/3/4,AnimatedQuaternion,AnimatedMatrix4x4AnimatedScalarArray,AnimatedVector3Array,AnimatedQuaternionArray
SDK helpers
ut_type::*andvertex_attribute_name::*expose ModelIO SDK NSString constants at runtimeUtility::convert_to_usdzwrapsMDLUtility's USDZ conversion helper
Examples
The crate ships numbered examples covering every logical area:
01_primitive_smoke02_asset_basics03_material_properties04_light_defaults05_physically_plausible_light06_camera_controls07_object_hierarchy08_voxel_array_boolean09_texture_checkerboard10_animation_bind_component11_animated_value_types12_submesh_material13_vertex_attribute_descriptor14_skeleton_basics15_transform_stack_basics16_mesh_buffer_allocator17_asset_resolver_light_probe
Run one with:
Run them all with:
for; do ; done
Tests
Integration smoke tests live under tests/ with one file per logical area plus tests/api_coverage.rs, which validates the Swift bridge against the active macOS SDK headers.
License
Licensed under either of Apache-2.0 or MIT at your option.