diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/cowdata.h | 20 | ||||
| -rw-r--r-- | core/math/geometry.cpp | 2 | ||||
| -rw-r--r-- | core/math/geometry.h | 32 | ||||
| -rw-r--r-- | core/math/random_pcg.h | 4 | ||||
| -rw-r--r-- | core/ustring.cpp | 8 | ||||
| -rw-r--r-- | core/ustring.h | 3 | ||||
| -rw-r--r-- | core/vector.h | 17 |
7 files changed, 64 insertions, 22 deletions
diff --git a/core/cowdata.h b/core/cowdata.h index 319e61d261..3e40ad0f4b 100644 --- a/core/cowdata.h +++ b/core/cowdata.h @@ -179,6 +179,8 @@ public: return OK; }; + int find(const T &p_val, int p_from = 0) const; + _FORCE_INLINE_ CowData(); _FORCE_INLINE_ ~CowData(); _FORCE_INLINE_ CowData(CowData<T> &p_from) { _ref(p_from); }; @@ -316,6 +318,24 @@ Error CowData<T>::resize(int p_size) { } template <class T> +int CowData<T>::find(const T &p_val, int p_from) const { + int ret = -1; + + if (p_from < 0 || size() == 0) { + return ret; + } + + for (int i = p_from; i < size(); i++) { + if (get(i) == p_val) { + ret = i; + break; + } + } + + return ret; +} + +template <class T> void CowData<T>::_ref(const CowData *p_from) { _ref(*p_from); } diff --git a/core/math/geometry.cpp b/core/math/geometry.cpp index c51ffd7b0a..12c88f43b3 100644 --- a/core/math/geometry.cpp +++ b/core/math/geometry.cpp @@ -32,6 +32,7 @@ #include "core/print_string.h" +/* this implementation is very inefficient, commenting unless bugs happen. See the other one. bool Geometry::is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon) { Vector<int> indices = Geometry::triangulate_polygon(p_polygon); @@ -42,6 +43,7 @@ bool Geometry::is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> } return false; } +*/ void Geometry::MeshData::optimize_vertices() { diff --git a/core/math/geometry.h b/core/math/geometry.h index 67805dd6c9..29493516b8 100644 --- a/core/math/geometry.h +++ b/core/math/geometry.h @@ -514,7 +514,7 @@ public: return (cn.cross(an) > 0) == orientation; } - static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon); + //static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon); static Vector2 get_closest_point_to_segment_uncapped_2d(const Vector2 &p_point, const Vector2 *p_segment) { @@ -815,6 +815,36 @@ public: return sum > 0.0f; } + /* alternate implementation that should be faster */ + static bool is_point_in_polygon(const Vector2 &p_point, const Vector<Vector2> &p_polygon) { + int c = p_polygon.size(); + if (c < 3) + return false; + const Vector2 *p = p_polygon.ptr(); + Vector2 further_away(-1e20, -1e20); + Vector2 further_away_opposite(1e20, 1e20); + + for (int i = 0; i < c; i++) { + further_away.x = MAX(p[i].x, further_away.x); + further_away.y = MAX(p[i].y, further_away.y); + further_away_opposite.x = MIN(p[i].x, further_away_opposite.x); + further_away_opposite.y = MIN(p[i].y, further_away_opposite.y); + } + + further_away += (further_away - further_away_opposite) * Vector2(1.221313, 1.512312); // make point outside that wont intersect with points in segment from p_point + + int intersections = 0; + for (int i = 0; i < c; i++) { + const Vector2 &v1 = p[i]; + const Vector2 &v2 = p[(i + 1) % c]; + if (segment_intersects_segment_2d(v1, v2, p_point, further_away, NULL)) { + intersections++; + } + } + + return (intersections & 1); + } + static PoolVector<PoolVector<Face3> > separate_objects(PoolVector<Face3> p_array); static PoolVector<Face3> wrap_geometry(PoolVector<Face3> p_array, real_t *p_error = NULL); ///< create a "wrap" that encloses the given geometry diff --git a/core/math/random_pcg.h b/core/math/random_pcg.h index 91340a568e..d594d16b98 100644 --- a/core/math/random_pcg.h +++ b/core/math/random_pcg.h @@ -50,8 +50,8 @@ public: void randomize(); _FORCE_INLINE_ uint32_t rand() { return pcg32_random_r(&pcg); } - _FORCE_INLINE_ double randf() { return (double)rand() / (double)RANDOM_MAX; } - _FORCE_INLINE_ float randd() { return (float)rand() / (float)RANDOM_MAX; } + _FORCE_INLINE_ double randd() { return (double)rand() / (double)RANDOM_MAX; } + _FORCE_INLINE_ float randf() { return (float)rand() / (float)RANDOM_MAX; } double random(double from, double to); float random(float from, float to); diff --git a/core/ustring.cpp b/core/ustring.cpp index 311aa52d40..c1888c87a7 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -2393,6 +2393,10 @@ int String::find(const char *p_str, int p_from) const { return -1; } +int String::find_char(CharType p_char, int p_from) const { + return _cowdata.find(p_char, p_from); +} + int String::findmk(const Vector<String> &p_keys, int p_from, int *r_key) const { if (p_from < 0) @@ -3063,7 +3067,7 @@ String String::lstrip(const String &p_chars) const { for (beg = 0; beg < len; beg++) { - if (p_chars.find(&ptr()[beg]) == -1) + if (p_chars.find_char(get(beg)) == -1) break; } @@ -3080,7 +3084,7 @@ String String::rstrip(const String &p_chars) const { for (end = len - 1; end >= 0; end--) { - if (p_chars.find(&ptr()[end]) == -1) + if (p_chars.find_char(get(end)) == -1) break; } diff --git a/core/ustring.h b/core/ustring.h index 1773e94b0e..5ec5c79e2d 100644 --- a/core/ustring.h +++ b/core/ustring.h @@ -196,7 +196,8 @@ public: /* complex helpers */ String substr(int p_from, int p_chars) const; int find(const String &p_str, int p_from = 0) const; ///< return <0 if failed - int find(const char *p_str, int p_from) const; ///< return <0 if failed + int find(const char *p_str, int p_from = 0) const; ///< return <0 if failed + int find_char(CharType p_char, int p_from = 0) const; ///< return <0 if failed int find_last(const String &p_str) const; ///< return <0 if failed int findn(const String &p_str, int p_from = 0) const; ///< return <0 if failed, case insensitive int rfind(const String &p_str, int p_from = -1) const; ///< return <0 if failed diff --git a/core/vector.h b/core/vector.h index 74dc9191d8..90b3d90826 100644 --- a/core/vector.h +++ b/core/vector.h @@ -84,6 +84,7 @@ public: Error resize(int p_size) { return _cowdata.resize(p_size); } _FORCE_INLINE_ const T &operator[](int p_index) const { return _cowdata.get(p_index); } Error insert(int p_pos, const T &p_val) { return _cowdata.insert(p_pos, p_val); } + int find(const T &p_val, int p_from = 0) const { return _cowdata.find(p_val, p_from); } void append_array(const Vector<T> &p_other); @@ -115,22 +116,6 @@ public: insert(i, p_val); } - int find(const T &p_val, int p_from = 0) const { - int ret = -1; - if (p_from < 0 || size() == 0) - return ret; - - for (int i = p_from; i < size(); i++) { - - if (ptr()[i] == p_val) { - ret = i; - break; - }; - }; - - return ret; - } - _FORCE_INLINE_ Vector() {} _FORCE_INLINE_ Vector(const Vector &p_from) { _cowdata._ref(p_from._cowdata); } inline Vector &operator=(const Vector &p_from) { |