Skip to main content

unity_native_plugin/
graphics.rs

1use 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, // OpenGL ES 2.0, removed
16    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}