use core::ffi::c_float;
use objc2::{
extern_class, extern_conformance, extern_methods, msg_send,
rc::{Allocated, Retained},
};
use objc2_foundation::{CopyingHelper, NSArray, NSCopying, NSObject, NSObjectProtocol, NSUInteger};
use crate::*;
extern_class!(
#[unsafe(super(MTL4AccelerationStructureDescriptor, MTLAccelerationStructureDescriptor, NSObject))]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct MTL4PrimitiveAccelerationStructureDescriptor;
);
extern_conformance!(
unsafe impl NSCopying for MTL4PrimitiveAccelerationStructureDescriptor {}
);
unsafe impl CopyingHelper for MTL4PrimitiveAccelerationStructureDescriptor {
type Result = Self;
}
extern_conformance!(
unsafe impl NSObjectProtocol for MTL4PrimitiveAccelerationStructureDescriptor {}
);
impl MTL4PrimitiveAccelerationStructureDescriptor {
extern_methods!(
#[unsafe(method(motionStartBorderMode))]
#[unsafe(method_family = none)]
pub fn motion_start_border_mode(&self) -> MTLMotionBorderMode;
#[unsafe(method(setMotionStartBorderMode:))]
#[unsafe(method_family = none)]
pub fn set_motion_start_border_mode(
&self,
motion_start_border_mode: MTLMotionBorderMode,
);
#[unsafe(method(motionEndBorderMode))]
#[unsafe(method_family = none)]
pub fn motion_end_border_mode(&self) -> MTLMotionBorderMode;
#[unsafe(method(setMotionEndBorderMode:))]
#[unsafe(method_family = none)]
pub fn set_motion_end_border_mode(
&self,
motion_end_border_mode: MTLMotionBorderMode,
);
#[unsafe(method(motionStartTime))]
#[unsafe(method_family = none)]
pub fn motion_start_time(&self) -> c_float;
#[unsafe(method(setMotionStartTime:))]
#[unsafe(method_family = none)]
pub fn set_motion_start_time(
&self,
motion_start_time: c_float,
);
#[unsafe(method(motionEndTime))]
#[unsafe(method_family = none)]
pub fn motion_end_time(&self) -> c_float;
#[unsafe(method(setMotionEndTime:))]
#[unsafe(method_family = none)]
pub fn set_motion_end_time(
&self,
motion_end_time: c_float,
);
#[unsafe(method(motionKeyframeCount))]
#[unsafe(method_family = none)]
pub fn motion_keyframe_count(&self) -> NSUInteger;
#[unsafe(method(setMotionKeyframeCount:))]
#[unsafe(method_family = none)]
pub fn set_motion_keyframe_count(
&self,
motion_keyframe_count: NSUInteger,
);
);
}
impl MTL4PrimitiveAccelerationStructureDescriptor {
extern_methods!(
#[unsafe(method(init))]
#[unsafe(method_family = init)]
pub fn init(this: Allocated<Self>) -> Retained<Self>;
#[unsafe(method(new))]
#[unsafe(method_family = new)]
pub fn new() -> Retained<Self>;
);
}
impl MTL4PrimitiveAccelerationStructureDescriptor {
pub fn geometry_descriptors(&self) -> Option<Box<[Retained<MTL4AccelerationStructureGeometryDescriptor>]>> {
let arr: Option<Retained<NSArray<MTL4AccelerationStructureGeometryDescriptor>>> =
unsafe { msg_send![self, geometryDescriptors] };
arr.map(|a| a.to_vec().into_boxed_slice())
}
pub fn set_geometry_descriptors(
&self,
geometry_descriptors: Option<&[&MTL4AccelerationStructureGeometryDescriptor]>,
) {
let ns_array = geometry_descriptors.map(NSArray::from_slice);
unsafe {
let _: () = msg_send![self, setGeometryDescriptors: ns_array.as_deref()];
}
}
}