goud_engine/sdk/components_transform2d/
builder.rs1use crate::core::math::Vec2;
4use crate::core::types::{FfiTransform2D, FfiTransform2DBuilder};
5use crate::ecs::components::Transform2D;
6
7pub struct Transform2DBuilderOps;
9
10impl Transform2DBuilderOps {
13 pub fn builder_new() -> *mut FfiTransform2DBuilder {
15 let builder = FfiTransform2DBuilder {
16 transform: Transform2D::default().into(),
17 };
18 Box::into_raw(Box::new(builder))
19 }
20
21 pub fn builder_at_position(x: f32, y: f32) -> *mut FfiTransform2DBuilder {
23 let builder = FfiTransform2DBuilder {
24 transform: Transform2D::from_position(Vec2::new(x, y)).into(),
25 };
26 Box::into_raw(Box::new(builder))
27 }
28
29 pub fn builder_with_position(
31 builder: *mut FfiTransform2DBuilder,
32 x: f32,
33 y: f32,
34 ) -> *mut FfiTransform2DBuilder {
35 if builder.is_null() {
36 return builder;
37 }
38 let t = unsafe { &mut (*builder).transform };
40 t.position_x = x;
41 t.position_y = y;
42 builder
43 }
44
45 pub fn builder_with_rotation(
47 builder: *mut FfiTransform2DBuilder,
48 rotation: f32,
49 ) -> *mut FfiTransform2DBuilder {
50 if builder.is_null() {
51 return builder;
52 }
53 unsafe { (*builder).transform.rotation = rotation };
55 builder
56 }
57
58 pub fn builder_with_rotation_degrees(
60 builder: *mut FfiTransform2DBuilder,
61 degrees: f32,
62 ) -> *mut FfiTransform2DBuilder {
63 if builder.is_null() {
64 return builder;
65 }
66 unsafe { (*builder).transform.rotation = degrees.to_radians() };
68 builder
69 }
70
71 pub fn builder_with_scale(
73 builder: *mut FfiTransform2DBuilder,
74 scale_x: f32,
75 scale_y: f32,
76 ) -> *mut FfiTransform2DBuilder {
77 if builder.is_null() {
78 return builder;
79 }
80 let t = unsafe { &mut (*builder).transform };
82 t.scale_x = scale_x;
83 t.scale_y = scale_y;
84 builder
85 }
86
87 pub fn builder_with_scale_uniform(
89 builder: *mut FfiTransform2DBuilder,
90 scale: f32,
91 ) -> *mut FfiTransform2DBuilder {
92 if builder.is_null() {
93 return builder;
94 }
95 let t = unsafe { &mut (*builder).transform };
97 t.scale_x = scale;
98 t.scale_y = scale;
99 builder
100 }
101
102 pub fn builder_looking_at(
104 builder: *mut FfiTransform2DBuilder,
105 target_x: f32,
106 target_y: f32,
107 ) -> *mut FfiTransform2DBuilder {
108 if builder.is_null() {
109 return builder;
110 }
111 let t = unsafe { &mut (*builder).transform };
113 let dx = target_x - t.position_x;
114 let dy = target_y - t.position_y;
115 t.rotation = dy.atan2(dx);
116 builder
117 }
118
119 pub fn builder_translate(
121 builder: *mut FfiTransform2DBuilder,
122 dx: f32,
123 dy: f32,
124 ) -> *mut FfiTransform2DBuilder {
125 if builder.is_null() {
126 return builder;
127 }
128 let t = unsafe { &mut (*builder).transform };
130 t.position_x += dx;
131 t.position_y += dy;
132 builder
133 }
134
135 pub fn builder_rotate(
137 builder: *mut FfiTransform2DBuilder,
138 angle: f32,
139 ) -> *mut FfiTransform2DBuilder {
140 if builder.is_null() {
141 return builder;
142 }
143 unsafe { (*builder).transform.rotation += angle };
145 builder
146 }
147
148 pub fn builder_scale_by(
150 builder: *mut FfiTransform2DBuilder,
151 factor_x: f32,
152 factor_y: f32,
153 ) -> *mut FfiTransform2DBuilder {
154 if builder.is_null() {
155 return builder;
156 }
157 let t = unsafe { &mut (*builder).transform };
159 t.scale_x *= factor_x;
160 t.scale_y *= factor_y;
161 builder
162 }
163
164 pub fn builder_build(builder: *mut FfiTransform2DBuilder) -> FfiTransform2D {
166 if builder.is_null() {
167 return Transform2D::default().into();
168 }
169 let boxed = unsafe { Box::from_raw(builder) };
171 boxed.transform
172 }
173
174 pub fn builder_free(builder: *mut FfiTransform2DBuilder) {
176 if !builder.is_null() {
177 drop(unsafe { Box::from_raw(builder) });
179 }
180 }
181}