Browse Source

Merge pull request #47226 from fabriceci/improve-rayshape-2D

Bring the Raycast2D improvements to Rayshape2D
Rémi Verschelde 4 năm trước cách đây
mục cha
commit
e0f19287f7
1 tập tin đã thay đổi với 22 bổ sung6 xóa
  1. 22 6
      scene/resources/ray_shape_2d.cpp

+ 22 - 6
scene/resources/ray_shape_2d.cpp

@@ -42,17 +42,33 @@ void RayShape2D::_update_shape() {
 }
 
 void RayShape2D::draw(const RID &p_to_rid, const Color &p_color) {
-	Vector2 tip = Vector2(0, get_length());
-	RS::get_singleton()->canvas_item_add_line(p_to_rid, Vector2(), tip, p_color, 3);
+	const Vector2 target_position = Vector2(0, get_length());
+
+	const float max_arrow_size = 6;
+	const float line_width = 1.4;
+	bool no_line = target_position.length() < line_width;
+	float arrow_size = CLAMP(target_position.length() * 2 / 3, line_width, max_arrow_size);
+
+	if (no_line) {
+		arrow_size = target_position.length();
+	} else {
+		RS::get_singleton()->canvas_item_add_line(p_to_rid, Vector2(), target_position - target_position.normalized() * arrow_size, p_color, line_width);
+	}
+
+	Transform2D xf;
+	xf.rotate(target_position.angle());
+	xf.translate(Vector2(no_line ? 0 : target_position.length() - arrow_size, 0));
+
 	Vector<Vector2> pts;
-	float tsize = 4.0;
-	pts.push_back(tip + Vector2(0, tsize));
-	pts.push_back(tip + Vector2(Math_SQRT12 * tsize, 0));
-	pts.push_back(tip + Vector2(-Math_SQRT12 * tsize, 0));
+	pts.push_back(xf.xform(Vector2(arrow_size, 0)));
+	pts.push_back(xf.xform(Vector2(0, 0.5 * arrow_size)));
+	pts.push_back(xf.xform(Vector2(0, -0.5 * arrow_size)));
+
 	Vector<Color> cols;
 	for (int i = 0; i < 3; i++) {
 		cols.push_back(p_color);
 	}
+
 	RS::get_singleton()->canvas_item_add_primitive(p_to_rid, pts, cols, Vector<Point2>(), RID());
 }