Skip to main content

modelio/
asset_resolver.rs

1use 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}