Browse Source

Merge pull request #25934 from mrcdk/pool_int_real_color_interpolate

Added PoolIntArray, PoolRealArray and PoolColorArray interpolate
Rémi Verschelde 6 years ago
parent
commit
dd5376f9df
1 changed files with 67 additions and 3 deletions
  1. 67 3
      core/variant_op.cpp

+ 67 - 3
core/variant_op.cpp

@@ -3656,11 +3656,55 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
 		}
 		}
 			return;
 			return;
 		case POOL_INT_ARRAY: {
 		case POOL_INT_ARRAY: {
-			r_dst = a;
+			const PoolVector<int> *arr_a = reinterpret_cast<const PoolVector<int> *>(a._data._mem);
+			const PoolVector<int> *arr_b = reinterpret_cast<const PoolVector<int> *>(b._data._mem);
+			int sz = arr_a->size();
+			if (sz == 0 || arr_b->size() != sz) {
+
+				r_dst = a;
+			} else {
+
+				PoolVector<int> v;
+				v.resize(sz);
+				{
+					PoolVector<int>::Write vw = v.write();
+					PoolVector<int>::Read ar = arr_a->read();
+					PoolVector<int>::Read br = arr_b->read();
+
+					Variant va;
+					for (int i = 0; i < sz; i++) {
+						Variant::interpolate(ar[i], br[i], c, va);
+						vw[i] = va;
+					}
+				}
+				r_dst = v;
+			}
 		}
 		}
 			return;
 			return;
 		case POOL_REAL_ARRAY: {
 		case POOL_REAL_ARRAY: {
-			r_dst = a;
+			const PoolVector<real_t> *arr_a = reinterpret_cast<const PoolVector<real_t> *>(a._data._mem);
+			const PoolVector<real_t> *arr_b = reinterpret_cast<const PoolVector<real_t> *>(b._data._mem);
+			int sz = arr_a->size();
+			if (sz == 0 || arr_b->size() != sz) {
+
+				r_dst = a;
+			} else {
+
+				PoolVector<real_t> v;
+				v.resize(sz);
+				{
+					PoolVector<real_t>::Write vw = v.write();
+					PoolVector<real_t>::Read ar = arr_a->read();
+					PoolVector<real_t>::Read br = arr_b->read();
+
+					Variant va;
+					for (int i = 0; i < sz; i++) {
+						Variant::interpolate(ar[i], br[i], c, va);
+						vw[i] = va;
+					}
+				}
+				r_dst = v;
+			}
 		}
 		}
 			return;
 			return;
 		case POOL_STRING_ARRAY: {
 		case POOL_STRING_ARRAY: {
@@ -3717,7 +3761,27 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &
 		}
 		}
 			return;
 			return;
 		case POOL_COLOR_ARRAY: {
 		case POOL_COLOR_ARRAY: {
-			r_dst = a;
+			const PoolVector<Color> *arr_a = reinterpret_cast<const PoolVector<Color> *>(a._data._mem);
+			const PoolVector<Color> *arr_b = reinterpret_cast<const PoolVector<Color> *>(b._data._mem);
+			int sz = arr_a->size();
+			if (sz == 0 || arr_b->size() != sz) {
+
+				r_dst = a;
+			} else {
+
+				PoolVector<Color> v;
+				v.resize(sz);
+				{
+					PoolVector<Color>::Write vw = v.write();
+					PoolVector<Color>::Read ar = arr_a->read();
+					PoolVector<Color>::Read br = arr_b->read();
+
+					for (int i = 0; i < sz; i++) {
+						vw[i] = ar[i].linear_interpolate(br[i], c);
+					}
+				}
+				r_dst = v;
+			}
 		}
 		}
 			return;
 			return;
 		default: {
 		default: {