Skip to content

Commit 47aefbb

Browse files
committed
Add support for AtlasTexture in draw_polygon()
1 parent cff016d commit 47aefbb

File tree

1 file changed

+19
-8
lines changed

1 file changed

+19
-8
lines changed

scene/main/canvas_item.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "scene/2d/canvas_group.h"
3535
#include "scene/main/canvas_layer.h"
3636
#include "scene/main/window.h"
37+
#include "scene/resources/atlas_texture.h"
3738
#include "scene/resources/canvas_item_material.h"
3839
#include "scene/resources/font.h"
3940
#include "scene/resources/multimesh.h"
@@ -851,18 +852,28 @@ void CanvasItem::draw_polygon(const Vector<Point2> &p_points, const Vector<Color
851852
ERR_THREAD_GUARD;
852853
ERR_DRAW_GUARD;
853854

854-
RID rid = p_texture.is_valid() ? p_texture->get_rid() : RID();
855+
const Ref<AtlasTexture> atlas = p_texture;
856+
if (atlas.is_valid() && atlas->get_atlas().is_valid()) {
857+
const Ref<Texture2D> &texture = atlas->get_atlas();
858+
const Vector2 atlas_size = texture->get_size();
859+
860+
const Vector2 remap_min = atlas->get_region().position / atlas_size;
861+
const Vector2 remap_max = atlas->get_region().get_end() / atlas_size;
855862

856-
RenderingServer::get_singleton()->canvas_item_add_polygon(canvas_item, p_points, p_colors, p_uvs, rid);
863+
PackedVector2Array uvs = p_uvs;
864+
for (Vector2 &p : uvs) {
865+
p.x = Math::remap(p.x, 0, 1, remap_min.x, remap_max.x);
866+
p.y = Math::remap(p.y, 0, 1, remap_min.y, remap_max.y);
867+
}
868+
RenderingServer::get_singleton()->canvas_item_add_polygon(canvas_item, p_points, p_colors, uvs, texture->get_rid());
869+
} else {
870+
RID texture_rid = p_texture.is_valid() ? p_texture->get_rid() : RID();
871+
RenderingServer::get_singleton()->canvas_item_add_polygon(canvas_item, p_points, p_colors, p_uvs, texture_rid);
872+
}
857873
}
858874

859875
void CanvasItem::draw_colored_polygon(const Vector<Point2> &p_points, const Color &p_color, const Vector<Point2> &p_uvs, Ref<Texture2D> p_texture) {
860-
ERR_THREAD_GUARD;
861-
ERR_DRAW_GUARD;
862-
863-
Vector<Color> colors = { p_color };
864-
RID rid = p_texture.is_valid() ? p_texture->get_rid() : RID();
865-
RenderingServer::get_singleton()->canvas_item_add_polygon(canvas_item, p_points, colors, p_uvs, rid);
876+
draw_polygon(p_points, { p_color }, p_uvs, p_texture);
866877
}
867878

868879
void CanvasItem::draw_mesh(const Ref<Mesh> &p_mesh, const Ref<Texture2D> &p_texture, const Transform2D &p_transform, const Color &p_modulate) {

0 commit comments

Comments
 (0)