unity_native_plugin/
graphics.rs1use crate::interface::UnityInterface;
2use std::os::raw::c_int;
3use unity_native_plugin_sys::*;
4
5pub type RenderBuffer = unity_native_plugin_sys::UnityRenderBuffer;
6pub type TextureID = unity_native_plugin_sys::UnityTextureID;
7pub type RenderingEvent = unity_native_plugin_sys::UnityRenderingEvent;
8pub type RenderingEventAndData = unity_native_plugin_sys::UnityRenderingEventAndData;
9
10#[repr(u32)]
11#[derive(Copy, Clone, PartialEq, Eq, Debug)]
12pub enum GfxRenderer {
13 D3D11 = UnityGfxRenderer_kUnityGfxRendererD3D11,
14 Null = UnityGfxRenderer_kUnityGfxRendererNull,
15 OpenGLES20 = 8, OpenGLES30 = UnityGfxRenderer_kUnityGfxRendererOpenGLES30,
17 PS4 = UnityGfxRenderer_kUnityGfxRendererPS4,
18 XboxOne = UnityGfxRenderer_kUnityGfxRendererXboxOne,
19 Metal = UnityGfxRenderer_kUnityGfxRendererMetal,
20 OpenGLCore = UnityGfxRenderer_kUnityGfxRendererOpenGLCore,
21 D3D12 = UnityGfxRenderer_kUnityGfxRendererD3D12,
22 Vulkan = UnityGfxRenderer_kUnityGfxRendererVulkan,
23 Nvn = UnityGfxRenderer_kUnityGfxRendererNvn,
24 XboxOneD3D12 = UnityGfxRenderer_kUnityGfxRendererXboxOneD3D12,
25 GameCoreXboxOne = UnityGfxRenderer_kUnityGfxRendererGameCoreXboxOne,
26 GameCoreXboxSeries = UnityGfxRenderer_kUnityGfxRendererGameCoreXboxSeries,
27 PS5 = UnityGfxRenderer_kUnityGfxRendererPS5,
28 PS5NGGC = UnityGfxRenderer_kUnityGfxRendererPS5NGGC,
29 Nvn2 = UnityGfxRenderer_kUnityGfxRendererNvn2,
30}
31
32#[repr(u32)]
33#[derive(Copy, Clone, PartialEq, Eq, Debug)]
34pub enum GfxDeviceEventType {
35 Initialize = UnityGfxDeviceEventType_kUnityGfxDeviceEventInitialize,
36 Shutdown = UnityGfxDeviceEventType_kUnityGfxDeviceEventShutdown,
37 BeforeReset = UnityGfxDeviceEventType_kUnityGfxDeviceEventBeforeReset,
38 AfterReset = UnityGfxDeviceEventType_kUnityGfxDeviceEventAfterReset,
39}
40
41define_unity_interface!(
42 UnityGraphics,
43 unity_native_plugin_sys::IUnityGraphics,
44 0x7CBA0A9CA4DDB544_u64,
45 0x8C5AD4926EB17B11_u64
46);
47
48pub type GraphicsDeviceEventCallback = extern "system" fn(event_type: GfxDeviceEventType);
49
50pub trait UnityGraphicsInterface {
51 fn renderer(&self) -> GfxRenderer;
52 fn register_device_event_callback(&self, callback: Option<GraphicsDeviceEventCallback>);
53 fn unregister_device_event_callback(&self, callback: Option<GraphicsDeviceEventCallback>);
54 fn reserve_event_id_range(&self, count: c_int) -> c_int;
55}
56
57pub use UnityGraphicsInterface as IUnityGraphics;
58
59impl UnityGraphicsInterface for UnityGraphics {
60 fn renderer(&self) -> GfxRenderer {
61 unsafe {
62 match self.interface().GetRenderer {
63 Some(intf) => std::mem::transmute::<UnityGfxRenderer, GfxRenderer>(intf()),
64 None => GfxRenderer::Null,
65 }
66 }
67 }
68
69 fn register_device_event_callback(&self, callback: Option<GraphicsDeviceEventCallback>) {
70 unsafe {
71 if let Some(intf) = self.interface().RegisterDeviceEventCallback {
72 intf(std::mem::transmute::<
73 Option<GraphicsDeviceEventCallback>,
74 IUnityGraphicsDeviceEventCallback,
75 >(callback));
76 }
77 }
78 }
79
80 fn unregister_device_event_callback(&self, callback: Option<GraphicsDeviceEventCallback>) {
81 unsafe {
82 if let Some(intf) = self.interface().UnregisterDeviceEventCallback {
83 intf(std::mem::transmute::<
84 Option<GraphicsDeviceEventCallback>,
85 IUnityGraphicsDeviceEventCallback,
86 >(callback));
87 }
88 }
89 }
90
91 fn reserve_event_id_range(&self, count: c_int) -> c_int {
92 unsafe {
93 self.interface()
94 .ReserveEventIDRange
95 .expect("ReserveEventIDRange is missing")(count)
96 }
97 }
98}