From deb9f23667ee53ec69404950aad129119258b8d2 Mon Sep 17 00:00:00 2001 From: TehPers Date: Wed, 14 Apr 2021 22:20:25 +0000 Subject: [PATCH] Implement Byteable and RenderResource for [T; N] (#1872) Implements `Byteable` and `RenderResource` for any array containing `Byteable` elements. This allows `RenderResources` to be implemented on structs with arbitrarily-sized arrays, among other things: ```rust #[derive(RenderResources, TypeUuid)] #[uuid = "2733ff34-8f95-459f-bf04-3274e686ac5f"] struct Foo { buffer: [i32; 256], } ``` --- crates/bevy_core/src/bytes.rs | 12 +++++++---- .../render_resource/render_resource.rs | 21 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/crates/bevy_core/src/bytes.rs b/crates/bevy_core/src/bytes.rs index 109c523eb4..f5846c67bc 100644 --- a/crates/bevy_core/src/bytes.rs +++ b/crates/bevy_core/src/bytes.rs @@ -83,10 +83,8 @@ where T: Byteable, { } -unsafe impl Byteable for [T; 2] where T: Byteable {} -unsafe impl Byteable for [T; 3] where T: Byteable {} -unsafe impl Byteable for [T; 4] where T: Byteable {} -unsafe impl Byteable for [T; 16] where T: Byteable {} + +unsafe impl Byteable for [T; N] where T: Byteable {} unsafe impl Byteable for u8 {} unsafe impl Byteable for u16 {} @@ -233,4 +231,10 @@ mod tests { fn test_mat4_round_trip() { test_round_trip(Mat4::IDENTITY); } + + #[test] + fn test_array_round_trip() { + test_round_trip([-10i32; 200]); + test_round_trip([Vec2::ZERO, Vec2::ONE, Vec2::Y, Vec2::X]); + } } diff --git a/crates/bevy_render/src/renderer/render_resource/render_resource.rs b/crates/bevy_render/src/renderer/render_resource/render_resource.rs index c7bdf5905e..e6acfdd98f 100644 --- a/crates/bevy_render/src/renderer/render_resource/render_resource.rs +++ b/crates/bevy_render/src/renderer/render_resource/render_resource.rs @@ -187,6 +187,27 @@ where } } +impl RenderResource for [T; N] +where + T: Sized + Byteable, +{ + fn resource_type(&self) -> Option { + Some(RenderResourceType::Buffer) + } + + fn write_buffer_bytes(&self, buffer: &mut [u8]) { + self.write_bytes(buffer); + } + + fn buffer_byte_len(&self) -> Option { + Some(self.byte_len()) + } + + fn texture(&self) -> Option<&Handle> { + None + } +} + impl RenderResource for GlobalTransform { fn resource_type(&self) -> Option { Some(RenderResourceType::Buffer)