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.3.0 keeps the SDK audit at 117/117 top-level ModelIO symbols (100%) and adds callback-backed protocol wrappers for asset resolvers, mesh-buffer allocators, transform components/ops, plus first-class scattering-function wrappers.
Highlights
Assetfor loading, exporting, and walking ModelIO assetsMeshfor procedural primitives, vertex buffer reads, submesh inspection, and vertex descriptor accessMaterial,ScatteringFunction,PhysicallyPlausibleScatteringFunction,MaterialProperty,TextureFilter,TextureSampler, and material-graph wrappers for physically plausible materials, scattering models, 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, callback-backedTransformComponent/TransformOp,TransformStack, and typed transform ops for explicit transform authoringMeshBufferData, callback-backedMeshBufferAllocator,MeshBufferDataAllocator, and related wrappers for buffer-authoring workflowsAssetResolverplus path, bundle, relative, and callback-backed custom 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.