modelio/
asset_resolver.rs1use std::ptr;
2
3use crate::asset::Asset;
4use crate::error::Result;
5use crate::ffi;
6use crate::handle::ObjectHandle;
7use crate::util::{c_string, required_handle, take_string};
8
9#[derive(Debug, Clone)]
10pub struct AssetResolver {
11 handle: ObjectHandle,
12}
13
14impl AssetResolver {
15 pub(crate) fn from_handle(handle: ObjectHandle) -> Self {
16 Self { handle }
17 }
18
19 pub(crate) fn as_ptr(&self) -> *mut core::ffi::c_void {
20 self.handle.as_ptr()
21 }
22
23 pub fn can_resolve_asset_named(&self, name: &str) -> Result<bool> {
24 let name = c_string(name)?;
25 Ok(unsafe { ffi::mdl_asset_resolver_can_resolve_named(self.as_ptr(), name.as_ptr()) != 0 })
26 }
27
28 pub fn resolve_asset_named(&self, name: &str) -> Result<Option<String>> {
29 let name = c_string(name)?;
30 Ok(take_string(unsafe {
31 ffi::mdl_asset_resolver_resolve_named(self.as_ptr(), name.as_ptr())
32 }))
33 }
34}
35
36#[derive(Debug, Clone)]
37pub struct PathAssetResolver {
38 handle: ObjectHandle,
39}
40
41impl PathAssetResolver {
42 pub(crate) fn from_handle(handle: ObjectHandle) -> Self {
43 Self { handle }
44 }
45
46 pub fn new(path: &str) -> Result<Self> {
47 let path = c_string(path)?;
48 let mut out_resolver = ptr::null_mut();
49 let mut out_error = ptr::null_mut();
50 let status = unsafe {
51 ffi::mdl_path_asset_resolver_new(path.as_ptr(), &mut out_resolver, &mut out_error)
52 };
53 crate::util::status_result(status, out_error)?;
54 Ok(Self::from_handle(required_handle(
55 out_resolver,
56 "MDLPathAssetResolver",
57 )?))
58 }
59
60 #[must_use]
61 pub fn path(&self) -> Option<String> {
62 take_string(unsafe { ffi::mdl_path_asset_resolver_path(self.handle.as_ptr()) })
63 }
64
65 pub fn set_path(&self, path: &str) -> Result<()> {
66 let path = c_string(path)?;
67 unsafe { ffi::mdl_path_asset_resolver_set_path(self.handle.as_ptr(), path.as_ptr()) };
68 Ok(())
69 }
70
71 #[must_use]
72 pub fn as_asset_resolver(&self) -> AssetResolver {
73 AssetResolver::from_handle(self.handle.clone())
74 }
75}
76
77#[derive(Debug, Clone)]
78pub struct BundleAssetResolver {
79 handle: ObjectHandle,
80}
81
82impl BundleAssetResolver {
83 pub(crate) fn from_handle(handle: ObjectHandle) -> Self {
84 Self { handle }
85 }
86
87 pub fn new(path: &str) -> Result<Self> {
88 let path = c_string(path)?;
89 let mut out_resolver = ptr::null_mut();
90 let mut out_error = ptr::null_mut();
91 let status = unsafe {
92 ffi::mdl_bundle_asset_resolver_new(path.as_ptr(), &mut out_resolver, &mut out_error)
93 };
94 crate::util::status_result(status, out_error)?;
95 Ok(Self::from_handle(required_handle(
96 out_resolver,
97 "MDLBundleAssetResolver",
98 )?))
99 }
100
101 #[must_use]
102 pub fn path(&self) -> Option<String> {
103 take_string(unsafe { ffi::mdl_bundle_asset_resolver_path(self.handle.as_ptr()) })
104 }
105
106 pub fn set_path(&self, path: &str) -> Result<()> {
107 let path = c_string(path)?;
108 unsafe { ffi::mdl_bundle_asset_resolver_set_path(self.handle.as_ptr(), path.as_ptr()) };
109 Ok(())
110 }
111
112 #[must_use]
113 pub fn as_asset_resolver(&self) -> AssetResolver {
114 AssetResolver::from_handle(self.handle.clone())
115 }
116}
117
118#[derive(Debug, Clone)]
119pub struct RelativeAssetResolver {
120 handle: ObjectHandle,
121}
122
123impl RelativeAssetResolver {
124 pub(crate) fn from_handle(handle: ObjectHandle) -> Self {
125 Self { handle }
126 }
127
128 pub fn new(asset: &Asset) -> Result<Self> {
129 let mut out_resolver = ptr::null_mut();
130 let mut out_error = ptr::null_mut();
131 let status = unsafe {
132 ffi::mdl_relative_asset_resolver_new(asset.as_ptr(), &mut out_resolver, &mut out_error)
133 };
134 crate::util::status_result(status, out_error)?;
135 Ok(Self::from_handle(required_handle(
136 out_resolver,
137 "MDLRelativeAssetResolver",
138 )?))
139 }
140
141 #[must_use]
142 pub fn asset(&self) -> Option<Asset> {
143 let ptr = unsafe { ffi::mdl_relative_asset_resolver_asset(self.handle.as_ptr()) };
144 unsafe { ObjectHandle::from_retained_ptr(ptr) }.map(Asset::from_handle)
145 }
146
147 pub fn set_asset(&self, asset: Option<&Asset>) {
148 unsafe {
149 ffi::mdl_relative_asset_resolver_set_asset(
150 self.handle.as_ptr(),
151 asset.map_or(ptr::null_mut(), Asset::as_ptr),
152 );
153 }
154 }
155
156 #[must_use]
157 pub fn as_asset_resolver(&self) -> AssetResolver {
158 AssetResolver::from_handle(self.handle.clone())
159 }
160}