Skip to content

Commit

Permalink
Fix Line2D tile mode for non-square textures
Browse files Browse the repository at this point in the history
  • Loading branch information
Zylann committed Feb 25, 2018
1 parent 71602c7 commit d2fae5c
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 7 deletions.
9 changes: 6 additions & 3 deletions scene/2d/line_2d.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -252,12 +252,15 @@ void Line2D::_draw() {
lb.sharp_limit = _sharp_limit;
lb.width = _width;

lb.build();

RID texture_rid;
if (_texture.is_valid())
if (_texture.is_valid()) {
texture_rid = (**_texture).get_rid();

lb.tile_aspect = _texture->get_size().aspect();
}

lb.build();

VS::get_singleton()->canvas_item_add_triangle_array(
get_canvas_item(),
lb.indices,
Expand Down
12 changes: 8 additions & 4 deletions scene/2d/line_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ LineBuilder::LineBuilder() {
round_precision = 8;
begin_cap_mode = Line2D::LINE_CAP_NONE;
end_cap_mode = Line2D::LINE_CAP_NONE;
tile_aspect = 1.f;

_interpolate_color = false;
_last_index[0] = 0;
Expand All @@ -111,6 +112,7 @@ void LineBuilder::clear_output() {
vertices.clear();
colors.clear();
indices.clear();
uvs.clear();
}

void LineBuilder::build() {
Expand All @@ -121,6 +123,8 @@ void LineBuilder::build() {
return;
}

ERR_FAIL_COND(tile_aspect <= 0.f);

const float hw = width / 2.f;
const float hw_sq = hw * hw;
const float sharp_limit_sq = sharp_limit * sharp_limit;
Expand Down Expand Up @@ -164,7 +168,7 @@ void LineBuilder::build() {
current_distance1 = current_distance0;
} else if (begin_cap_mode == Line2D::LINE_CAP_ROUND) {
if (texture_mode == Line2D::LINE_TEXTURE_TILE) {
uvx0 = 0.5f;
uvx0 = 0.5f / tile_aspect;
}
new_arc(pos0, pos_up0 - pos0, -Math_PI, color0, Rect2(0.f, 0.f, 1.f, 1.f));
total_distance += width;
Expand Down Expand Up @@ -286,8 +290,8 @@ void LineBuilder::build() {
color1 = gradient->get_color_at_offset(current_distance1 / total_distance);
}
if (texture_mode == Line2D::LINE_TEXTURE_TILE) {
uvx0 = current_distance0 / width;
uvx1 = current_distance1 / width;
uvx0 = current_distance0 / (width * tile_aspect);
uvx1 = current_distance1 / (width * tile_aspect);
}

strip_add_quad(pos_up1, pos_down1, color1, uvx1);
Expand Down Expand Up @@ -373,7 +377,7 @@ void LineBuilder::build() {
color1 = gradient->get_color(gradient->get_points_count() - 1);
}
if (texture_mode == Line2D::LINE_TEXTURE_TILE) {
uvx1 = current_distance1 / width;
uvx1 = current_distance1 / (width * tile_aspect);
}

strip_add_quad(pos_up1, pos_down1, color1, uvx1);
Expand Down
1 change: 1 addition & 0 deletions scene/2d/line_builder.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class LineBuilder {
Line2D::LineTextureMode texture_mode;
float sharp_limit;
int round_precision;
float tile_aspect; // w/h
// TODO offset_joints option (offers alternative implementation of round joints)

// TODO Move in a struct and reference it
Expand Down

0 comments on commit d2fae5c

Please sign in to comment.