Skip to content

Commit 8f78e75

Browse files
committed
Merge pull request #105785 from actually-reb/billboard_aabb
Gave billboarded sprites and labels more fitting AABBs
2 parents bd619b8 + f7439a4 commit 8f78e75

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

scene/3d/label_3d.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,24 @@ void Label3D::_shape() {
620620
offset.y -= (TS->shaped_text_get_descent(lines_rid[i]) + line_spacing) * pixel_size;
621621
}
622622

623+
switch (get_billboard_mode()) {
624+
case StandardMaterial3D::BILLBOARD_ENABLED: {
625+
real_t size_new = MAX(Math::abs(aabb.position.x), (aabb.position.x + aabb.size.x));
626+
size_new = MAX(size_new, MAX(Math::abs(aabb.position.y), (aabb.position.y + aabb.size.y)));
627+
aabb.position = Vector3(-size_new, -size_new, -size_new);
628+
aabb.size = Vector3(size_new * 2.0, size_new * 2.0, size_new * 2.0);
629+
} break;
630+
case StandardMaterial3D::BILLBOARD_FIXED_Y: {
631+
real_t size_new = MAX(Math::abs(aabb.position.x), (aabb.position.x + aabb.size.x));
632+
aabb.position.x = -size_new;
633+
aabb.position.z = -size_new;
634+
aabb.size.x = size_new * 2.0;
635+
aabb.size.z = size_new * 2.0;
636+
} break;
637+
default:
638+
break;
639+
}
640+
623641
for (const KeyValue<SurfaceKey, SurfaceData> &E : surfaces) {
624642
Array mesh_array;
625643
mesh_array.resize(RS::ARRAY_MAX);

scene/3d/sprite_3d.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,27 @@ void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect,
243243
memcpy(&attribute_write_buffer[i * attrib_stride + mesh_surface_offsets[RS::ARRAY_COLOR]], v_color, 4);
244244
}
245245

246+
switch (get_billboard_mode()) {
247+
case StandardMaterial3D::BILLBOARD_ENABLED: {
248+
real_t size_new = MAX(Math::abs(final_rect.position.x) * px_size, (final_rect.position.x + final_rect.size.x) * px_size);
249+
size_new = MAX(size_new, MAX(Math::abs(final_rect.position.y) * px_size, (final_rect.position.y + final_rect.size.y) * px_size));
250+
aabb_new.position = Vector3(-size_new, -size_new, -size_new);
251+
aabb_new.size = Vector3(size_new * 2.0, size_new * 2.0, size_new * 2.0);
252+
} break;
253+
case StandardMaterial3D::BILLBOARD_FIXED_Y: {
254+
real_t size_new = MAX(Math::abs(final_rect.position.x) * px_size, (final_rect.position.x + final_rect.size.x) * px_size);
255+
if (ax == Vector3::AXIS_Y) {
256+
size_new = MAX(size_new, MAX(Math::abs(final_rect.position.y) * px_size, (final_rect.position.y + final_rect.size.y) * px_size));
257+
}
258+
aabb_new.position.x = -size_new;
259+
aabb_new.position.z = -size_new;
260+
aabb_new.size.x = size_new * 2.0;
261+
aabb_new.size.z = size_new * 2.0;
262+
} break;
263+
default:
264+
break;
265+
}
266+
246267
RID mesh_new = get_mesh();
247268
RS::get_singleton()->mesh_surface_update_vertex_region(mesh_new, 0, 0, vertex_buffer);
248269
RS::get_singleton()->mesh_surface_update_attribute_region(mesh_new, 0, 0, attribute_buffer);

0 commit comments

Comments
 (0)