Fix Line2D tile mode for non-square textures

(cherry picked from commit d2fae5c9a6)
This commit is contained in:
Marc Gilleron 2018-02-25 01:48:37 +01:00 committed by Hein-Pieter van Braam
parent f7efa9d43a
commit cf2e30b30c
3 changed files with 15 additions and 7 deletions

View File

@ -252,12 +252,15 @@ void Line2D::_draw() {
lb.sharp_limit = _sharp_limit; lb.sharp_limit = _sharp_limit;
lb.width = _width; lb.width = _width;
lb.build();
RID texture_rid; RID texture_rid;
if (_texture.is_valid()) if (_texture.is_valid()) {
texture_rid = (**_texture).get_rid(); texture_rid = (**_texture).get_rid();
lb.tile_aspect = _texture->get_size().aspect();
}
lb.build();
VS::get_singleton()->canvas_item_add_triangle_array( VS::get_singleton()->canvas_item_add_triangle_array(
get_canvas_item(), get_canvas_item(),
lb.indices, lb.indices,

View File

@ -101,6 +101,7 @@ LineBuilder::LineBuilder() {
round_precision = 8; round_precision = 8;
begin_cap_mode = Line2D::LINE_CAP_NONE; begin_cap_mode = Line2D::LINE_CAP_NONE;
end_cap_mode = Line2D::LINE_CAP_NONE; end_cap_mode = Line2D::LINE_CAP_NONE;
tile_aspect = 1.f;
_interpolate_color = false; _interpolate_color = false;
_last_index[0] = 0; _last_index[0] = 0;
@ -111,6 +112,7 @@ void LineBuilder::clear_output() {
vertices.clear(); vertices.clear();
colors.clear(); colors.clear();
indices.clear(); indices.clear();
uvs.clear();
} }
void LineBuilder::build() { void LineBuilder::build() {
@ -121,6 +123,8 @@ void LineBuilder::build() {
return; return;
} }
ERR_FAIL_COND(tile_aspect <= 0.f);
const float hw = width / 2.f; const float hw = width / 2.f;
const float hw_sq = hw * hw; const float hw_sq = hw * hw;
const float sharp_limit_sq = sharp_limit * sharp_limit; const float sharp_limit_sq = sharp_limit * sharp_limit;
@ -164,7 +168,7 @@ void LineBuilder::build() {
current_distance1 = current_distance0; current_distance1 = current_distance0;
} else if (begin_cap_mode == Line2D::LINE_CAP_ROUND) { } else if (begin_cap_mode == Line2D::LINE_CAP_ROUND) {
if (texture_mode == Line2D::LINE_TEXTURE_TILE) { 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)); new_arc(pos0, pos_up0 - pos0, -Math_PI, color0, Rect2(0.f, 0.f, 1.f, 1.f));
total_distance += width; total_distance += width;
@ -286,8 +290,8 @@ void LineBuilder::build() {
color1 = gradient->get_color_at_offset(current_distance1 / total_distance); color1 = gradient->get_color_at_offset(current_distance1 / total_distance);
} }
if (texture_mode == Line2D::LINE_TEXTURE_TILE) { if (texture_mode == Line2D::LINE_TEXTURE_TILE) {
uvx0 = current_distance0 / width; uvx0 = current_distance0 / (width * tile_aspect);
uvx1 = current_distance1 / width; uvx1 = current_distance1 / (width * tile_aspect);
} }
strip_add_quad(pos_up1, pos_down1, color1, uvx1); strip_add_quad(pos_up1, pos_down1, color1, uvx1);
@ -373,7 +377,7 @@ void LineBuilder::build() {
color1 = gradient->get_color(gradient->get_points_count() - 1); color1 = gradient->get_color(gradient->get_points_count() - 1);
} }
if (texture_mode == Line2D::LINE_TEXTURE_TILE) { 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); strip_add_quad(pos_up1, pos_down1, color1, uvx1);

View File

@ -50,6 +50,7 @@ public:
Line2D::LineTextureMode texture_mode; Line2D::LineTextureMode texture_mode;
float sharp_limit; float sharp_limit;
int round_precision; int round_precision;
float tile_aspect; // w/h
// TODO offset_joints option (offers alternative implementation of round joints) // TODO offset_joints option (offers alternative implementation of round joints)
// TODO Move in a struct and reference it // TODO Move in a struct and reference it