diff --git a/notes/MakingAnActualThing.txt b/notes/MakingAnActualThing.txt
index 79a24c7f..9b498837 100644
--- a/notes/MakingAnActualThing.txt
+++ b/notes/MakingAnActualThing.txt
@@ -31,3 +31,23 @@ So for a sprite, which is a generic texture and position/size combo
Images are similar, but instead of a "sprite" I made a computsprite because that's the only thing that uses them.
Now if I had to shove these into a component / a set of components... I could have a component of the vertex type even?
+
+
+
+===== Sep 2020 =====
+
+Lets think about this for a minute...
+
+* We have components which are purely data...
+ * But can also have structs that impl functionality
+ * The data can be contained within traits. But it has to do all IO through the trait interface. ALL
+ * Problem, for example I have primitives like textured sprites, and also complex widgets which also have additional IO they they need. Like text input or buttons. I suppose This could all be made message based. So when the text input receives a focus, and then key presses it would update. When the enter key is pressed it could create a customer event for which another component is the listener...
+ * Maybe this is the way to go... Have some generic structure that has a render(params), notify(event), update(delta) -> VEvent
+ * So if I had a textbox sprite it could notify(key events) render
+* We can split up components in order to have sharable sets of data for shared functionality. e.g rendering
+
+[[paste]]
+
+
+
+So that article more or less talked about what I was thinking with the ECS. But they didn't really go into the separation of components.
diff --git a/notes/paste.txt b/notes/paste.txt
new file mode 100644
index 00000000..53cf0d1f
--- /dev/null
+++ b/notes/paste.txt
@@ -0,0 +1,40 @@
+Content-Type: text/x-zim-wiki
+Wiki-Format: zim 0.4
+Creation-Date: 2020-09-09T22:41:18-07:00
+
+====== paste ======
+Created Wednesday 09 September 2020
+
+// If I were to have multiple systems
+/*
+
+One for rendering
+One for updating
+One for eventing
+
+Rendering is easy enough. It needs all the components necessary in order
+to generate the vertices. This includes the position, size, and vertex generator
+
+Updating can probably be multiple types, I imagine something that implemented an Updatable
+trait could then be used.
+
+So the big problem here is that I have two traits that I want to expose, BUT
+I have to put the concrete value in both containers... I don't think this is something
+that specs will like since it wants to be the only owner. No use in RefCell'ing it
+because that's just stupid
+
+What if I turn this on it's head and really embrace the systems. So for example I could have
+the User system. Ooof this is a big question actually...
+
+// Components that want to be updated
+Move
+
+// want to be drawn
+Drawable
+Geom
+
+Notifyable
+
+
+
+*/
diff --git a/notes/vkprocessor.drawio b/notes/vkprocessor.drawio
index 31bf96a4..27c28756 100644
--- a/notes/vkprocessor.drawio
+++ b/notes/vkprocessor.drawio
@@ -1 +1 @@
-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
\ No newline at end of file
+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
\ No newline at end of file
diff --git a/src/canvas/canvas_frame.rs b/src/canvas/canvas_frame.rs
index 49b4c279..63253794 100644
--- a/src/canvas/canvas_frame.rs
+++ b/src/canvas/canvas_frame.rs
@@ -6,31 +6,35 @@ use crate::canvas::managed::shader::dynamic_vertex::RuntimeVertexDef;
use crate::canvas::managed::handles::{CanvasTextureHandle, CanvasImageHandle, CanvasFontHandle, Handle};
use vulkano::pipeline::vertex::Vertex;
use std::any::Any;
-use crate::{VertexTypeContainer, Move, Geom};
+use crate::{VertexTypeContainer};
use winit::event::Event;
-use crate::util::tr_event::TrEvent;
+use crate::util::tr_event::{TrEvent, TrUIEvent};
+use crate::drawables::sprite::{Velocity, Geometry};
/// Trait which may be inherited by objects that wish to be drawn to the screen
pub trait Drawable {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+
+ // Render expects the implementer to create custom render logic based on interior data within
+ // the struct. This data as of right now, will *only* be mutatable via events & update
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec;
-}
-/// Trait which may be inherited by objects that wish to receive events
-pub trait Eventable {
- fn notify(&mut self, event: &TrEvent) -> ();
-}
+ // Update simply passes the delta time. The implementor doesn't necessarily need to use delta_time
+ // or even add anything other than a Vec::new() to the function.
+ fn update(&self, delta_time: f32) -> Vec>;
-/// Trait which may be inherited by objects that wish to be updated
-pub trait Updatable {
- fn update(&mut self, delta_time: f32) -> ();
+ // Notify is where custom events created in other parts of the system will be ingested. It
+ // might be a good idea in the future to have some of pre-function-call filtering so we
+ // don't have as many notifies that just immediately reject.
+ fn notify(&self, tr_event : Vec>, ui_events: Vec>) -> Vec>;
}
+
/// Accumulator for Vectors of VertexTypes
#[derive(Default)]
pub struct CanvasFrame {
@@ -54,8 +58,8 @@ impl CanvasFrame {
}
/// Push this drawable onto the back of the accumulator
- pub fn draw(&mut self, drawable: &dyn Drawable, mv: Move, geom: Geom) {
- for i in drawable.get(
+ pub fn draw(&mut self, drawable: &dyn Drawable, mv: Velocity, geom: Geometry) {
+ for i in drawable.render(
self.window_size,
(mv.pos_x, mv.pos_y),
geom.rotation,
diff --git a/src/canvas/compu_frame.rs b/src/canvas/compu_frame.rs
index 90a1b063..0dc16d89 100644
--- a/src/canvas/compu_frame.rs
+++ b/src/canvas/compu_frame.rs
@@ -4,7 +4,7 @@ use crate::canvas::managed::handles::{CompuKernelHandle};
use crate::drawables::compu_sprite::CompuSprite;
use crate::canvas::canvas_frame::Drawable;
use crate::util::vertex::VertexTypeContainer;
-use crate::{Move, Geom};
+use crate::drawables::sprite::{Velocity, Geometry};
#[derive(Default)]
pub struct CompuFrame {
@@ -58,10 +58,10 @@ impl CompuFrame {
buffer: Arc,
kernel: Arc,
sprite: &CompuSprite,
- mv: Move,
- geom: Geom,
+ mv: Velocity,
+ geom: Geometry,
) {
- let compu_sprites = sprite.get(
+ let compu_sprites = sprite.render(
self.window_size,
(mv.pos_x, mv.pos_y),
geom.rotation,
diff --git a/src/drawables/compu_sprite.rs b/src/drawables/compu_sprite.rs
index 414a2554..7a318313 100644
--- a/src/drawables/compu_sprite.rs
+++ b/src/drawables/compu_sprite.rs
@@ -2,6 +2,7 @@ use std::sync::Arc;
use crate::canvas::managed::handles::{CanvasImageHandle, CanvasTextureHandle};
use crate::canvas::canvas_frame::Drawable;
use crate::util::vertex::{VertexTypeContainer, ImageVertex3D};
+use crate::util::tr_event::{TrUIEvent, TrEvent};
pub struct CompuSprite {
@@ -53,13 +54,21 @@ impl CompuSprite {
}
impl Drawable for CompuSprite {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec {
vec![self.verts.clone()]
}
+
+ fn update(&self, delta_time: f32) -> Vec> {
+ Vec::new()
+ }
+
+ fn notify(&self, tr_event: Vec>, ui_events: Vec>) -> Vec> {
+ Vec::new()
+ }
}
\ No newline at end of file
diff --git a/src/drawables/polygon.rs b/src/drawables/polygon.rs
index f4979595..139eeccb 100644
--- a/src/drawables/polygon.rs
+++ b/src/drawables/polygon.rs
@@ -4,6 +4,7 @@ use crate::canvas::managed::handles::{CanvasFontHandle, CanvasImageHandle, Canva
use crate::canvas::canvas_frame::{Drawable};
use crate::util::vertex::{VertexTypeContainer, TextureVertex3D, Vertex3D, ColorVertex3D};
use crate::drawables::sprite::Sprite;
+use crate::util::tr_event::{TrUIEvent, TrEvent};
/// Convex multi verticy polygon
#[derive(Debug, Clone)]
@@ -61,16 +62,23 @@ impl Polygon {
}
}
impl Drawable for Polygon {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec {
vec![self.verts.clone()]
}
+ fn update(&self, delta_time: f32) -> Vec> {
+ Vec::new()
+ }
+
+ fn notify(&self, tr_event: Vec>, ui_events: Vec>) -> Vec> {
+ Vec::new()
+ }
}
diff --git a/src/drawables/rect.rs b/src/drawables/rect.rs
index caffb660..721111f8 100644
--- a/src/drawables/rect.rs
+++ b/src/drawables/rect.rs
@@ -1,5 +1,6 @@
use crate::canvas::canvas_frame::Drawable;
use crate::util::vertex::{VertexTypeContainer, ColorVertex3D};
+use crate::util::tr_event::{TrUIEvent, TrEvent};
///
#[derive(Debug, Clone)]
@@ -73,12 +74,12 @@ impl Rect {
}
impl Drawable for Rect {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec {
vec![
VertexTypeContainer::ColorType(
@@ -86,4 +87,12 @@ impl Drawable for Rect {
)
]
}
+
+ fn update(&self, delta_time: f32) -> Vec> {
+ Vec::new()
+ }
+
+ fn notify(&self, tr_event: Vec>, ui_events: Vec>) -> Vec> {
+ Vec::new()
+ }
}
diff --git a/src/drawables/slider.rs b/src/drawables/slider.rs
index fcb6e552..59db95c4 100644
--- a/src/drawables/slider.rs
+++ b/src/drawables/slider.rs
@@ -2,11 +2,11 @@ use std::collections::HashSet;
use winit::event::{Event, ElementState, MouseButton};
-use crate::canvas::canvas_frame::{Drawable, Eventable};
+use crate::canvas::canvas_frame::{Drawable};
use crate::drawables::rect::Rect;
use crate::drawables::sprite::Sprite;
use crate::util::vertex::VertexTypeContainer;
-use crate::util::tr_event::{TrEvent, TrWindowEvent};
+use crate::util::tr_event::{TrEvent, TrWindowEvent, TrUIEvent};
#[derive(Debug, Clone)]
pub struct Slider {
@@ -67,14 +67,14 @@ impl Slider {
}
impl Drawable for Slider {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec {
- let mut vertices = self.handle.get(
+ let mut vertices = self.handle.render(
window_size,
position,
rotation,
@@ -84,30 +84,32 @@ impl Drawable for Slider {
vertices.extend_from_slice(
self.guide.iter()
- .map(|x| x.get(window_size,
- position,
- rotation,
- size,
- depth,
+ .map(|x| x.render(window_size,
+ position,
+ rotation,
+ size,
+ depth,
)).flatten()
.collect::>()
.as_slice()
);
vertices.extend_from_slice(
- self.guide[0].get(window_size,
- position,
- rotation,
- size,
- depth,
+ self.guide[0].render(window_size,
+ position,
+ rotation,
+ size,
+ depth,
).as_slice());
vertices
}
-}
-impl Eventable for Slider {
- fn notify(&mut self, event: &TrEvent) -> () {
- match event {
+ fn update(&self, delta_time: f32) -> Vec> {
+ Vec::new()
+ }
+
+ fn notify(&self, tr_event: Vec>, ui_events: Vec>) -> Vec> {
+ match tr_event {
TrEvent::WindowEvent { event: TrWindowEvent::MouseInput { device_id, state, button, modifiers }, .. } => {
@@ -124,6 +126,6 @@ impl Eventable for Slider {
}
_ => {}
}
-
+ Vec::new()
}
}
diff --git a/src/drawables/sprite.rs b/src/drawables/sprite.rs
index f72f61fd..927b1f81 100644
--- a/src/drawables/sprite.rs
+++ b/src/drawables/sprite.rs
@@ -1,15 +1,31 @@
use std::sync::Arc;
use crate::canvas::*;
use crate::canvas::managed::handles::{CanvasFontHandle, CanvasImageHandle, CanvasTextureHandle, Handle};
-use crate::canvas::canvas_frame::{Drawable, Eventable, Updatable};
+use crate::canvas::canvas_frame::{Drawable};
use crate::util::vertex::{VertexTypeContainer, TextureVertex3D, Vertex3D};
use winit::event::{DeviceEvent, MouseButton, ElementState, Event, WindowEvent};
-use crate::util::tr_event::{TrEvent, TrWindowEvent};
+use crate::util::tr_event::{TrEvent, TrWindowEvent, TrUIEvent};
+pub struct Geometry {
+ pos_x: f32,
+ pos_y: f32,
+ size_x: f32,
+ size_y: f32,
+ rotation: f32,
+ depth: f32,
+}
+
+pub struct Velocity {
+ vel_x: f32,
+ vel_y: f32,
+ vel_r: f32,
+}
///
#[derive(Debug, Clone)]
pub struct Sprite {
texture_handle: Arc,
+ geometry: Geometry,
+ velocity: Velocity,
}
/// Container class which implements drawable.
@@ -62,18 +78,31 @@ impl Sprite {
pub fn new(texture_handle: Arc) -> Sprite {
Sprite {
texture_handle: texture_handle.clone(),
+ geometry: Geometry {
+ pos_x: 0.0,
+ pos_y: 0.0,
+ size_x: 0.0,
+ size_y: 0.0,
+ rotation: 0.0,
+ depth: 0.0
+ },
+ velocity: Velocity {
+ vel_x: 0.0,
+ vel_y: 0.0,
+ vel_r: 0.0
+ }
}
}
}
impl Drawable for Sprite {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec {
let normalized_depth = (depth / 255.0);
@@ -83,11 +112,13 @@ impl Drawable for Sprite {
self.texture_handle.clone())
]
}
-}
-impl Eventable for Sprite {
- fn notify(&mut self, event: &TrEvent) -> () {
- match event {
+ fn update(&self, delta_time: f32) -> Vec> {
+ Vec::new()
+ }
+
+ fn notify(&self, tr_event: Vec>, ui_events: Vec>) -> Vec> {
+ match tr_event {
TrEvent::WindowEvent { event: TrWindowEvent::MouseInput { device_id, state, button, modifiers }, .. } => {
match button {
MouseButton::Left => {
@@ -100,9 +131,6 @@ impl Eventable for Sprite {
}
_ => {}
}
+ Vec::new()
}
}
-
-impl Updatable for Sprite {
- fn update(&mut self, delta_time: f32) -> () {}
-}
diff --git a/src/drawables/text.rs b/src/drawables/text.rs
index fbe8bebe..fc13d523 100644
--- a/src/drawables/text.rs
+++ b/src/drawables/text.rs
@@ -1,5 +1,6 @@
use crate::canvas::canvas_frame::Drawable;
use crate::util::vertex::{VertexTypeContainer, ColorVertex3D};
+use crate::util::tr_event::{TrUIEvent, TrEvent};
///
#[derive(Debug, Clone)]
@@ -137,13 +138,21 @@ impl Text {
}
impl Drawable for Text {
- fn get(&self,
- window_size: (u32, u32),
- position: (f32, f32),
- rotation: f32,
- size: (f32, f32),
- depth: f32,
+ fn render(&self,
+ window_size: (u32, u32),
+ position: (f32, f32),
+ rotation: f32,
+ size: (f32, f32),
+ depth: f32,
) -> Vec {
vec![self.verts.clone()]
}
+
+ fn update(&self, delta_time: f32) -> Vec> {
+ Vec::new()
+ }
+
+ fn notify(&self, tr_event: Vec>, ui_events: Vec>) -> Vec> {
+ Vec::new()
+ }
}
diff --git a/src/main.rs b/src/main.rs
index 551e6e93..229a9a3b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -25,7 +25,7 @@ use winit::event_loop::{ControlFlow, EventLoop, EventLoopProxy};
use winit::platform::unix::WindowBuilderExtUnix;
use winit::window::{WindowBuilder, Window};
-use crate::canvas::canvas_frame::{CanvasFrame, Drawable, Eventable, Updatable};
+use crate::canvas::canvas_frame::{CanvasFrame, Drawable};
use crate::canvas::canvas_state::CanvasState;
use crate::canvas::managed::handles::{CanvasFontHandle, CanvasTextureHandle, Handle};
use canvas::compu_frame::CompuFrame;
@@ -46,41 +46,16 @@ pub mod vkprocessor;
pub mod drawables;
pub mod canvas;
-
extern crate specs;
use specs::prelude::*;
use vulkano::swapchain::Surface;
-
-//struct Draws(Box, Box + Sync + Send>);
-struct SSprite(Box);
-
-
-
-impl Component for SSprite {
- type Storage = VecStorage;
-}
-
-pub struct Move {
- vel_x: f32,
- vel_y: f32,
+pub struct Render {
+ render_actor: Box,
}
-impl Component for Move {
- type Storage = VecStorage;
-}
-
-pub struct Geom {
- pos_x: f32,
- pos_y: f32,
- size_x: f32,
- size_y: f32,
- rotation: f32,
- depth: f32,
-}
-
-impl Component for Geom {
+impl Component for Render {
type Storage = VecStorage;
}
@@ -93,65 +68,23 @@ struct PersistentState {
compu_frame: CompuFrame,
}
-// If I were to have multiple systems
-/*
-
-One for rendering
-One for updating
-One for eventing
-
-Rendering is easy enough. It needs all the components necessary in order
-to generate the vertices. This includes the position, size, and vertex generator
-
-Updating can probably be multiple types, I imagine something that implemented an Updatable
-trait could then be used.
-
-So the big problem here is that I have two traits that I want to expose, BUT
-I have to put the concrete value in both containers... I don't think this is something
-that specs will like since it wants to be the only owner. No use in RefCell'ing it
-because that's just stupid
-
-What if I turn this on it's head and really embrace the systems. So for example I could have
-the User system. Ooof this is a big question actually...
-
-// Components that want to be updated
-Move
-
-// want to be drawn
-Drawable
-Geom
-
-Notifyable
-
-
-
-*/
-
-
-
-
-
-
-
struct RenderSystem;
impl<'a> System<'a> for RenderSystem {
type SystemData = (
- WriteStorage<'a, Move>, // its velocity
- WriteStorage<'a, Geom>, // its size, position & rotation
- WriteStorage<'a, SSprite>, // generates the vertices
- Write<'a, PersistentState>, // delta_time, window size, etc.
- Write<'a, VkProcessor>, // Renderer
+ WriteStorage<'a, Render>, // generates the vertices
+ Write<'a, PersistentState>, // delta_time, window size, etc.
+ Write<'a, VkProcessor>, // Renderer
);
- fn run(&mut self, (mut mv, mut geom, mut draw, mut state, mut vk_processor): Self::SystemData) {
+ fn run(&mut self, (mut mv, mut draw, mut state, mut vk_processor): Self::SystemData) {
state.canvas_frame = CanvasFrame::new(state.window_size);
state.compu_frame = CompuFrame::new(state.window_size);
// compu_frame.add_with_image_swap(compute_buffer.clone(), compute_kernel.clone(), &compu_sprite1);
// compu_frame.add(compute_buffer.clone(), compute_kernel.clone());
- for (mv, geom, draw) in (&mut mv, &mut geom, &mut draw).join() {
+ for (mv, geom, draw) in (&mut mv, &mut draw).join() {
geom.pos_x += mv.vel_x * state.delta_time;
geom.pos_y += mv.vel_y * state.delta_time;
@@ -180,18 +113,18 @@ struct EventSystem;
impl<'a> System<'a> for EventSystem {
type SystemData = (
- WriteStorage<'a, SSprite>,
+ WriteStorage<'a, Render>,
Write<'a, PersistentState>,
Write<'a, VkProcessor>,
Write<'a, Vec>>
);
fn run(&mut self, (mut draw, mut state, mut vk_processor, event_stack): Self::SystemData) {
- for draw_data in (&mut draw).join() {
- for event in event_stack.iter() {
- draw_data.1.notify(event)
- }
- }
+ // for draw_data in (&mut draw).join() {
+ // for event in event_stack.iter() {
+ // draw_data.0.notify(event)
+ // }
+ // }
}
}
@@ -263,9 +196,7 @@ pub fn main() {
processor.get_texture_handle(String::from("sfml.png")).unwrap();
let mut world = World::new();
- world.register::();
- world.register::();
- world.register::();
+ world.register::();
world.insert::(processor);
world.insert::>>(Vec::new());
world.insert::(PersistentState {
@@ -281,23 +212,13 @@ pub fn main() {
// An entity may or may not contain some component.
let t = world.create_entity()
- .with(Move { vel_x: 0.0, vel_y: 0.0})
- .with(Geom { size_x: 100.0, size_y: 100.0, rotation: 0.0, depth: 1.0, pos_x: 100.0, pos_y: 400.0 })
- .with(SSprite(thing.clone(), thing.clone()))
- .build();
-
- world.create_entity()
- .with(Move { vel_x: 0.0, vel_y: 0.0 })
- .with(Geom { size_x: 100.0, size_y: 100.0, rotation: 0.0, depth: 1.0, pos_x: 100.0, pos_y: 400.0 })
- .with(SSprite(thing.clone(), thing))
+ .with(Render{ render_actor: thing })// just a drawable
.build();
let thing2 = Box::new(Slider::new((300.0, 50.0), (550.0, 100.0), 30000));
world.create_entity()
- .with(Move { vel_x: 0.0, vel_y: 0.0 })
- .with(Geom { size_x: 100.0, size_y: 100.0, rotation: 0.0, depth: 1.0, pos_x: 100.0, pos_y: 400.0 })
- .with(SSprite(thing2.clone(), thing2))
+ .with(Render{ render_actor: thing2 })// just a drawable
.build();
@@ -352,7 +273,7 @@ pub fn main() {
world.write_resource::()
.window_size = surface.window().inner_size().into();
} else {
- // println!("{}", world.write_resource::>>().len());
+ // println!("{}", world.write_resource::>>().len());
world.write_resource::>>().clear();
}
}
@@ -362,8 +283,7 @@ pub fn main() {
Event::WindowEvent { event: WindowEvent::MouseInput { device_id, state, button, modifiers }, .. } => {
match button {
MouseButton::Left => {
- if state == ElementState::Pressed {
- }
+ if state == ElementState::Pressed {}
}
_ => {}
}
diff --git a/src/util/tr_event.rs b/src/util/tr_event.rs
index cb1a6723..50fc31ce 100644
--- a/src/util/tr_event.rs
+++ b/src/util/tr_event.rs
@@ -5,6 +5,11 @@ use winit::dpi::{PhysicalPosition, PhysicalSize};
use gilrs::Event as GilEvent;
use vulkano::pipeline::shader::GeometryShaderExecutionMode::TrianglesWithAdjacency;
+#[derive(Clone)]
+pub enum TrUIEvent {
+ UIEvent(T)
+}
+
#[derive(Clone)]
pub enum TrEventExtension {