瀏覽代碼

Fix Line2D tile mode for non-square textures

Marc Gilleron 7 年之前
父節點
當前提交
d2fae5c9a6
共有 3 個文件被更改,包括 15 次插入7 次删除
  1. 6 3
      scene/2d/line_2d.cpp
  2. 8 4
      scene/2d/line_builder.cpp
  3. 1 0
      scene/2d/line_builder.h

+ 6 - 3
scene/2d/line_2d.cpp

@@ -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,

+ 8 - 4
scene/2d/line_builder.cpp

@@ -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;
-			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);
 		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);

+ 1 - 0
scene/2d/line_builder.h

@@ -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