Skip to content

Commit 43be24f

Browse files
authored
Merge pull request #1437 from AThousandShips/vec_elem_scalar
Add scalar versions of `Vector*` `min/max/clamp/snap(ped)`
2 parents 54fe2f9 + b659708 commit 43be24f

15 files changed

+191
-19
lines changed

include/godot_cpp/variant/aabb.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ struct _NO_DISCARD_ AABB {
103103
_FORCE_INLINE_ void expand_to(const Vector3 &p_vector); /** expand to contain a point if necessary */
104104

105105
_FORCE_INLINE_ AABB abs() const {
106-
return AABB(Vector3(position.x + MIN(size.x, (real_t)0), position.y + MIN(size.y, (real_t)0), position.z + MIN(size.z, (real_t)0)), size.abs());
106+
return AABB(position + size.minf(0), size.abs());
107107
}
108108

109109
Variant intersects_segment_bind(const Vector3 &p_from, const Vector3 &p_to) const;

include/godot_cpp/variant/rect2.hpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,12 @@ struct _NO_DISCARD_ Rect2 {
154154
return Rect2();
155155
}
156156

157-
new_rect.position.x = Math::max(p_rect.position.x, position.x);
158-
new_rect.position.y = Math::max(p_rect.position.y, position.y);
157+
new_rect.position = p_rect.position.max(position);
159158

160159
Point2 p_rect_end = p_rect.position + p_rect.size;
161160
Point2 end = position + size;
162161

163-
new_rect.size.x = Math::min(p_rect_end.x, end.x) - new_rect.position.x;
164-
new_rect.size.y = Math::min(p_rect_end.y, end.y) - new_rect.position.y;
162+
new_rect.size = p_rect_end.min(end) - new_rect.position;
165163

166164
return new_rect;
167165
}
@@ -174,11 +172,9 @@ struct _NO_DISCARD_ Rect2 {
174172
#endif
175173
Rect2 new_rect;
176174

177-
new_rect.position.x = Math::min(p_rect.position.x, position.x);
178-
new_rect.position.y = Math::min(p_rect.position.y, position.y);
175+
new_rect.position = p_rect.position.min(position);
179176

180-
new_rect.size.x = Math::max(p_rect.position.x + p_rect.size.x, position.x + size.x);
181-
new_rect.size.y = Math::max(p_rect.position.y + p_rect.size.y, position.y + size.y);
177+
new_rect.size = (p_rect.position + p_rect.size).max(position + size);
182178

183179
new_rect.size = new_rect.size - new_rect.position; // Make relative again.
184180

@@ -284,7 +280,7 @@ struct _NO_DISCARD_ Rect2 {
284280
}
285281

286282
_FORCE_INLINE_ Rect2 abs() const {
287-
return Rect2(Point2(position.x + Math::min(size.x, (real_t)0), position.y + Math::min(size.y, (real_t)0)), size.abs());
283+
return Rect2(position + size.minf(0), size.abs());
288284
}
289285

290286
Vector2 get_support(const Vector2 &p_normal) const {

include/godot_cpp/variant/rect2i.hpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,12 @@ struct _NO_DISCARD_ Rect2i {
9797
return Rect2i();
9898
}
9999

100-
new_rect.position.x = Math::max(p_rect.position.x, position.x);
101-
new_rect.position.y = Math::max(p_rect.position.y, position.y);
100+
new_rect.position = p_rect.position.max(position);
102101

103102
Point2i p_rect_end = p_rect.position + p_rect.size;
104103
Point2i end = position + size;
105104

106-
new_rect.size.x = Math::min(p_rect_end.x, end.x) - new_rect.position.x;
107-
new_rect.size.y = Math::min(p_rect_end.y, end.y) - new_rect.position.y;
105+
new_rect.size = p_rect_end.min(end) - new_rect.position;
108106

109107
return new_rect;
110108
}
@@ -117,11 +115,9 @@ struct _NO_DISCARD_ Rect2i {
117115
#endif
118116
Rect2i new_rect;
119117

120-
new_rect.position.x = Math::min(p_rect.position.x, position.x);
121-
new_rect.position.y = Math::min(p_rect.position.y, position.y);
118+
new_rect.position = p_rect.position.min(position);
122119

123-
new_rect.size.x = Math::max(p_rect.position.x + p_rect.size.x, position.x + size.x);
124-
new_rect.size.y = Math::max(p_rect.position.y + p_rect.size.y, position.y + size.y);
120+
new_rect.size = (p_rect.position + p_rect.size).max(position + size);
125121

126122
new_rect.size = new_rect.size - new_rect.position; // Make relative again.
127123

@@ -219,7 +215,7 @@ struct _NO_DISCARD_ Rect2i {
219215
}
220216

221217
_FORCE_INLINE_ Rect2i abs() const {
222-
return Rect2i(Point2i(position.x + Math::min(size.x, 0), position.y + Math::min(size.y, 0)), size.abs());
218+
return Rect2i(position + size.mini(0), size.abs());
223219
}
224220

225221
_FORCE_INLINE_ void set_end(const Vector2i &p_end) {

include/godot_cpp/variant/vector2.hpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,18 @@ struct _NO_DISCARD_ Vector2 {
9191
return Vector2(MIN(x, p_vector2.x), MIN(y, p_vector2.y));
9292
}
9393

94+
Vector2 minf(real_t p_scalar) const {
95+
return Vector2(MIN(x, p_scalar), MIN(y, p_scalar));
96+
}
97+
9498
Vector2 max(const Vector2 &p_vector2) const {
9599
return Vector2(MAX(x, p_vector2.x), MAX(y, p_vector2.y));
96100
}
97101

102+
Vector2 maxf(real_t p_scalar) const {
103+
return Vector2(MAX(x, p_scalar), MAX(y, p_scalar));
104+
}
105+
98106
real_t distance_to(const Vector2 &p_vector2) const;
99107
real_t distance_squared_to(const Vector2 &p_vector2) const;
100108
real_t angle_to(const Vector2 &p_vector2) const;
@@ -169,7 +177,9 @@ struct _NO_DISCARD_ Vector2 {
169177
Vector2 ceil() const;
170178
Vector2 round() const;
171179
Vector2 snapped(const Vector2 &p_by) const;
180+
Vector2 snappedf(real_t p_by) const;
172181
Vector2 clamp(const Vector2 &p_min, const Vector2 &p_max) const;
182+
Vector2 clampf(real_t p_min, real_t p_max) const;
173183
real_t aspect() const { return width / height; }
174184

175185
operator String() const;

include/godot_cpp/variant/vector2i.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,18 @@ struct _NO_DISCARD_ Vector2i {
8383
return Vector2i(MIN(x, p_vector2i.x), MIN(y, p_vector2i.y));
8484
}
8585

86+
Vector2i mini(int32_t p_scalar) const {
87+
return Vector2i(MIN(x, p_scalar), MIN(y, p_scalar));
88+
}
89+
8690
Vector2i max(const Vector2i &p_vector2i) const {
8791
return Vector2i(MAX(x, p_vector2i.x), MAX(y, p_vector2i.y));
8892
}
8993

94+
Vector2i maxi(int32_t p_scalar) const {
95+
return Vector2i(MAX(x, p_scalar), MAX(y, p_scalar));
96+
}
97+
9098
Vector2i operator+(const Vector2i &p_v) const;
9199
void operator+=(const Vector2i &p_v);
92100
Vector2i operator-(const Vector2i &p_v) const;
@@ -123,7 +131,10 @@ struct _NO_DISCARD_ Vector2i {
123131
real_t aspect() const { return width / (real_t)height; }
124132
Vector2i sign() const { return Vector2i(SIGN(x), SIGN(y)); }
125133
Vector2i abs() const { return Vector2i(Math::abs(x), Math::abs(y)); }
134+
Vector2i snapped(const Vector2i &p_step) const;
135+
Vector2i snappedi(int32_t p_step) const;
126136
Vector2i clamp(const Vector2i &p_min, const Vector2i &p_max) const;
137+
Vector2i clampi(int32_t p_min, int32_t p_max) const;
127138

128139
operator String() const;
129140
operator Vector2() const;

include/godot_cpp/variant/vector3.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,18 @@ struct _NO_DISCARD_ Vector3 {
8282
return Vector3(MIN(x, p_vector3.x), MIN(y, p_vector3.y), MIN(z, p_vector3.z));
8383
}
8484

85+
Vector3 minf(real_t p_scalar) const {
86+
return Vector3(MIN(x, p_scalar), MIN(y, p_scalar), MIN(z, p_scalar));
87+
}
88+
8589
Vector3 max(const Vector3 &p_vector3) const {
8690
return Vector3(MAX(x, p_vector3.x), MAX(y, p_vector3.y), MAX(z, p_vector3.z));
8791
}
8892

93+
Vector3 maxf(real_t p_scalar) const {
94+
return Vector3(MAX(x, p_scalar), MAX(y, p_scalar), MAX(z, p_scalar));
95+
}
96+
8997
_FORCE_INLINE_ real_t length() const;
9098
_FORCE_INLINE_ real_t length_squared() const;
9199

@@ -98,7 +106,9 @@ struct _NO_DISCARD_ Vector3 {
98106
_FORCE_INLINE_ void zero();
99107

100108
void snap(const Vector3 p_val);
109+
void snapf(real_t p_val);
101110
Vector3 snapped(const Vector3 p_val) const;
111+
Vector3 snappedf(real_t p_val) const;
102112

103113
void rotate(const Vector3 &p_axis, const real_t p_angle);
104114
Vector3 rotated(const Vector3 &p_axis, const real_t p_angle) const;
@@ -128,6 +138,7 @@ struct _NO_DISCARD_ Vector3 {
128138
_FORCE_INLINE_ Vector3 ceil() const;
129139
_FORCE_INLINE_ Vector3 round() const;
130140
Vector3 clamp(const Vector3 &p_min, const Vector3 &p_max) const;
141+
Vector3 clampf(real_t p_min, real_t p_max) const;
131142

132143
_FORCE_INLINE_ real_t distance_to(const Vector3 &p_to) const;
133144
_FORCE_INLINE_ real_t distance_squared_to(const Vector3 &p_to) const;

include/godot_cpp/variant/vector3i.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,18 @@ struct _NO_DISCARD_ Vector3i {
7575
return Vector3i(MIN(x, p_vector3i.x), MIN(y, p_vector3i.y), MIN(z, p_vector3i.z));
7676
}
7777

78+
Vector3i mini(int32_t p_scalar) const {
79+
return Vector3i(MIN(x, p_scalar), MIN(y, p_scalar), MIN(z, p_scalar));
80+
}
81+
7882
Vector3i max(const Vector3i &p_vector3i) const {
7983
return Vector3i(MAX(x, p_vector3i.x), MAX(y, p_vector3i.y), MAX(z, p_vector3i.z));
8084
}
8185

86+
Vector3i maxi(int32_t p_scalar) const {
87+
return Vector3i(MAX(x, p_scalar), MAX(y, p_scalar), MAX(z, p_scalar));
88+
}
89+
8290
_FORCE_INLINE_ int64_t length_squared() const;
8391
_FORCE_INLINE_ double length() const;
8492

@@ -89,7 +97,10 @@ struct _NO_DISCARD_ Vector3i {
8997

9098
_FORCE_INLINE_ Vector3i abs() const;
9199
_FORCE_INLINE_ Vector3i sign() const;
100+
Vector3i snapped(const Vector3i &p_step) const;
101+
Vector3i snappedi(int32_t p_step) const;
92102
Vector3i clamp(const Vector3i &p_min, const Vector3i &p_max) const;
103+
Vector3i clampi(int32_t p_min, int32_t p_max) const;
93104

94105
/* Operators */
95106

include/godot_cpp/variant/vector4.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,18 @@ struct _NO_DISCARD_ Vector4 {
7474
return Vector4(MIN(x, p_vector4.x), MIN(y, p_vector4.y), MIN(z, p_vector4.z), MIN(w, p_vector4.w));
7575
}
7676

77+
Vector4 minf(real_t p_scalar) const {
78+
return Vector4(MIN(x, p_scalar), MIN(y, p_scalar), MIN(z, p_scalar), MIN(w, p_scalar));
79+
}
80+
7781
Vector4 max(const Vector4 &p_vector4) const {
7882
return Vector4(MAX(x, p_vector4.x), MAX(y, p_vector4.y), MAX(z, p_vector4.z), MAX(w, p_vector4.w));
7983
}
8084

85+
Vector4 maxf(real_t p_scalar) const {
86+
return Vector4(MAX(x, p_scalar), MAX(y, p_scalar), MAX(z, p_scalar), MAX(w, p_scalar));
87+
}
88+
8189
_FORCE_INLINE_ real_t length_squared() const;
8290
bool is_equal_approx(const Vector4 &p_vec4) const;
8391
bool is_zero_approx() const;
@@ -103,8 +111,11 @@ struct _NO_DISCARD_ Vector4 {
103111
Vector4 posmod(const real_t p_mod) const;
104112
Vector4 posmodv(const Vector4 &p_modv) const;
105113
void snap(const Vector4 &p_step);
114+
void snapf(real_t p_step);
106115
Vector4 snapped(const Vector4 &p_step) const;
116+
Vector4 snappedf(real_t p_step) const;
107117
Vector4 clamp(const Vector4 &p_min, const Vector4 &p_max) const;
118+
Vector4 clampf(real_t p_min, real_t p_max) const;
108119

109120
Vector4 inverse() const;
110121
_FORCE_INLINE_ real_t dot(const Vector4 &p_vec4) const;

include/godot_cpp/variant/vector4i.hpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,18 @@ struct _NO_DISCARD_ Vector4i {
7777
return Vector4i(MIN(x, p_vector4i.x), MIN(y, p_vector4i.y), MIN(z, p_vector4i.z), MIN(w, p_vector4i.w));
7878
}
7979

80+
Vector4i mini(int32_t p_scalar) const {
81+
return Vector4i(MIN(x, p_scalar), MIN(y, p_scalar), MIN(z, p_scalar), MIN(w, p_scalar));
82+
}
83+
8084
Vector4i max(const Vector4i &p_vector4i) const {
8185
return Vector4i(MAX(x, p_vector4i.x), MAX(y, p_vector4i.y), MAX(z, p_vector4i.z), MAX(w, p_vector4i.w));
8286
}
8387

88+
Vector4i maxi(int32_t p_scalar) const {
89+
return Vector4i(MAX(x, p_scalar), MAX(y, p_scalar), MAX(z, p_scalar), MAX(w, p_scalar));
90+
}
91+
8492
_FORCE_INLINE_ int64_t length_squared() const;
8593
_FORCE_INLINE_ double length() const;
8694

@@ -91,7 +99,10 @@ struct _NO_DISCARD_ Vector4i {
9199

92100
_FORCE_INLINE_ Vector4i abs() const;
93101
_FORCE_INLINE_ Vector4i sign() const;
102+
Vector4i snapped(const Vector4i &p_step) const;
103+
Vector4i snappedi(int32_t p_step) const;
94104
Vector4i clamp(const Vector4i &p_min, const Vector4i &p_max) const;
105+
Vector4i clampi(int32_t p_min, int32_t p_max) const;
95106

96107
/* Operators */
97108

src/variant/vector2.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,24 @@ Vector2 Vector2::clamp(const Vector2 &p_min, const Vector2 &p_max) const {
137137
CLAMP(y, p_min.y, p_max.y));
138138
}
139139

140+
Vector2 Vector2::clampf(real_t p_min, real_t p_max) const {
141+
return Vector2(
142+
CLAMP(x, p_min, p_max),
143+
CLAMP(y, p_min, p_max));
144+
}
145+
140146
Vector2 Vector2::snapped(const Vector2 &p_step) const {
141147
return Vector2(
142148
Math::snapped(x, p_step.x),
143149
Math::snapped(y, p_step.y));
144150
}
145151

152+
Vector2 Vector2::snappedf(real_t p_step) const {
153+
return Vector2(
154+
Math::snapped(x, p_step),
155+
Math::snapped(y, p_step));
156+
}
157+
146158
Vector2 Vector2::limit_length(const real_t p_len) const {
147159
const real_t l = length();
148160
Vector2 v = *this;

src/variant/vector2i.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,30 @@
3535

3636
namespace godot {
3737

38+
Vector2i Vector2i::snapped(const Vector2i &p_step) const {
39+
return Vector2i(
40+
Math::snapped(x, p_step.x),
41+
Math::snapped(y, p_step.y));
42+
}
43+
44+
Vector2i Vector2i::snappedi(int32_t p_step) const {
45+
return Vector2i(
46+
Math::snapped(x, p_step),
47+
Math::snapped(y, p_step));
48+
}
49+
3850
Vector2i Vector2i::clamp(const Vector2i &p_min, const Vector2i &p_max) const {
3951
return Vector2i(
4052
CLAMP(x, p_min.x, p_max.x),
4153
CLAMP(y, p_min.y, p_max.y));
4254
}
4355

56+
Vector2i Vector2i::clampi(int32_t p_min, int32_t p_max) const {
57+
return Vector2i(
58+
CLAMP(x, p_min, p_max),
59+
CLAMP(y, p_min, p_max));
60+
}
61+
4462
int64_t Vector2i::length_squared() const {
4563
return x * (int64_t)x + y * (int64_t)y;
4664
}

src/variant/vector3.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,37 @@ Vector3 Vector3::clamp(const Vector3 &p_min, const Vector3 &p_max) const {
5454
CLAMP(z, p_min.z, p_max.z));
5555
}
5656

57+
Vector3 Vector3::clampf(real_t p_min, real_t p_max) const {
58+
return Vector3(
59+
CLAMP(x, p_min, p_max),
60+
CLAMP(y, p_min, p_max),
61+
CLAMP(z, p_min, p_max));
62+
}
63+
5764
void Vector3::snap(const Vector3 p_step) {
5865
x = Math::snapped(x, p_step.x);
5966
y = Math::snapped(y, p_step.y);
6067
z = Math::snapped(z, p_step.z);
6168
}
6269

70+
void Vector3::snapf(real_t p_step) {
71+
x = Math::snapped(x, p_step);
72+
y = Math::snapped(y, p_step);
73+
z = Math::snapped(z, p_step);
74+
}
75+
6376
Vector3 Vector3::snapped(const Vector3 p_step) const {
6477
Vector3 v = *this;
6578
v.snap(p_step);
6679
return v;
6780
}
6881

82+
Vector3 Vector3::snappedf(real_t p_step) const {
83+
Vector3 v = *this;
84+
v.snapf(p_step);
85+
return v;
86+
}
87+
6988
Vector3 Vector3::limit_length(const real_t p_len) const {
7089
const real_t l = length();
7190
Vector3 v = *this;

0 commit comments

Comments
 (0)