summaryrefslogtreecommitdiff
path: root/scene/resources
diff options
context:
space:
mode:
authorMarc Gilleron <marc.gilleron@gmail.com>2017-06-28 02:42:38 +0200
committerMarc Gilleron <marc.gilleron@gmail.com>2017-06-28 02:43:30 +0200
commit6c1ab2098f5f399cc1ef09c7759604c5c671b4e7 (patch)
tree11a6233a484268ec7b7b2cd061a174bb6a857d87 /scene/resources
parent6fd4311c27625a5c725fcf525bbbf04fbbf9c56f (diff)
Fix curve saving, refined undo/redo
Diffstat (limited to 'scene/resources')
-rw-r--r--scene/resources/curve.cpp46
-rw-r--r--scene/resources/curve.h30
2 files changed, 44 insertions, 32 deletions
diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp
index 0cd41f557a..7e30bdb634 100644
--- a/scene/resources/curve.cpp
+++ b/scene/resources/curve.cpp
@@ -387,12 +387,9 @@ Curve::Curve() {
_baked_cache_dirty = false;
_min_value = 0;
_max_value = 1;
-#ifdef TOOLS_ENABLED
- _disable_set_data = false;
-#endif
}
-int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent) {
+int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent, TangentMode left_mode, TangentMode right_mode) {
// Add a point and preserve order
// Curve bounds is in 0..1
@@ -404,7 +401,7 @@ int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent) {
int ret = -1;
if (_points.size() == 0) {
- _points.push_back(Point(p_pos, left_tangent, right_tangent));
+ _points.push_back(Point(p_pos, left_tangent, right_tangent, left_mode, right_mode));
ret = 0;
} else if (_points.size() == 1) {
@@ -413,10 +410,10 @@ int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent) {
real_t diff = p_pos.x - _points[0].pos.x;
if (diff > 0) {
- _points.push_back(Point(p_pos, left_tangent, right_tangent));
+ _points.push_back(Point(p_pos, left_tangent, right_tangent, left_mode, right_mode));
ret = 1;
} else {
- _points.insert(0, Point(p_pos, left_tangent, right_tangent));
+ _points.insert(0, Point(p_pos, left_tangent, right_tangent, left_mode, right_mode));
ret = 0;
}
@@ -435,16 +432,18 @@ int Curve::add_point(Vector2 p_pos, real_t left_tangent, real_t right_tangent) {
if (i == 0 && p_pos.x < _points[0].pos.x) {
// Insert before anything else
- _points.insert(0, Point(p_pos, left_tangent, right_tangent));
+ _points.insert(0, Point(p_pos, left_tangent, right_tangent, left_mode, right_mode));
ret = 0;
} else {
// Insert between i and i+1
++i;
- _points.insert(i, Point(p_pos, left_tangent, right_tangent));
+ _points.insert(i, Point(p_pos, left_tangent, right_tangent, left_mode, right_mode));
ret = i;
}
}
+ update_auto_tangents(i);
+
mark_dirty();
return ret;
@@ -593,6 +592,11 @@ Vector2 Curve::get_point_pos(int p_index) const {
return _points[p_index].pos;
}
+Curve::Point Curve::get_point(int p_index) const {
+ ERR_FAIL_INDEX_V(p_index, _points.size(), Point());
+ return _points[p_index];
+}
+
void Curve::update_auto_tangents(int i) {
Point &p = _points[i];
@@ -699,33 +703,32 @@ void Curve::mark_dirty() {
Array Curve::get_data() const {
Array output;
- output.resize(_points.size() * 3);
+ const unsigned int ELEMS = 5;
+ output.resize(_points.size() * ELEMS);
for (int j = 0; j < _points.size(); ++j) {
const Point p = _points[j];
- int i = j * 3;
+ int i = j * ELEMS;
output[i] = p.pos;
output[i + 1] = p.left_tangent;
output[i + 2] = p.right_tangent;
+ output[i + 3] = p.left_mode;
+ output[i + 4] = p.right_mode;
}
return output;
}
void Curve::set_data(Array input) {
- ERR_FAIL_COND(input.size() % 3 != 0);
-
-#ifdef TOOLS_ENABLED
- if (_disable_set_data)
- return;
-#endif
+ const unsigned int ELEMS = 5;
+ ERR_FAIL_COND(input.size() % ELEMS != 0);
_points.clear();
// Validate input
- for (int i = 0; i < input.size(); i += 3) {
+ for (int i = 0; i < input.size(); i += ELEMS) {
ERR_FAIL_COND(input[i].get_type() != Variant::VECTOR2);
ERR_FAIL_COND(input[i + 1].get_type() != Variant::REAL);
ERR_FAIL_COND(input[i + 2].get_type() != Variant::REAL);
@@ -739,12 +742,12 @@ void Curve::set_data(Array input) {
ERR_FAIL_COND(right_mode < 0 || right_mode >= TANGENT_MODE_COUNT);
}
- _points.resize(input.size() / 3);
+ _points.resize(input.size() / ELEMS);
for (int j = 0; j < _points.size(); ++j) {
Point &p = _points[j];
- int i = j * 3;
+ int i = j * ELEMS;
p.pos = input[i];
p.left_tangent = input[i + 1];
@@ -822,7 +825,8 @@ real_t Curve::interpolate_baked(real_t offset) {
void Curve::_bind_methods() {
- ClassDB::bind_method(D_METHOD("add_point", "pos", "left_tangent", "right_tangent"), &Curve::add_point, DEFVAL(0), DEFVAL(0));
+ ClassDB::bind_method(D_METHOD("add_point", "pos", "left_tangent", "right_tangent", "left_mode", "right_mode"),
+ &Curve::add_point, DEFVAL(0), DEFVAL(0), DEFVAL(TANGENT_FREE), DEFVAL(TANGENT_FREE));
ClassDB::bind_method(D_METHOD("remove_point", "index"), &Curve::remove_point);
ClassDB::bind_method(D_METHOD("clear_points"), &Curve::clear_points);
ClassDB::bind_method(D_METHOD("get_point_pos", "index"), &Curve::get_point_pos);
diff --git a/scene/resources/curve.h b/scene/resources/curve.h
index d45f9e202f..83a4357bfb 100644
--- a/scene/resources/curve.h
+++ b/scene/resources/curve.h
@@ -91,10 +91,6 @@ public:
static const char *SIGNAL_RANGE_CHANGED;
-#ifdef TOOLS_ENABLED
- bool _disable_set_data;
-#endif
-
enum TangentMode {
TANGENT_FREE = 0,
TANGENT_LINEAR,
@@ -115,12 +111,17 @@ public:
right_mode = TANGENT_FREE;
}
- Point(Vector2 p, real_t left = 0, real_t right = 0) {
- pos = p;
- left_tangent = left;
- right_tangent = right;
- left_mode = TANGENT_FREE;
- right_mode = TANGENT_FREE;
+ Point(Vector2 p_pos,
+ real_t p_left = 0,
+ real_t p_right = 0,
+ TangentMode p_left_mode = TANGENT_FREE,
+ TangentMode p_right_mode = TANGENT_FREE) {
+
+ pos = p_pos;
+ left_tangent = p_left;
+ right_tangent = p_right;
+ left_mode = p_left_mode;
+ right_mode = p_right_mode;
}
};
@@ -128,7 +129,12 @@ public:
int get_point_count() const { return _points.size(); }
- int add_point(Vector2 p_pos, real_t left_tangent = 0, real_t right_tangent = 0);
+ int add_point(Vector2 p_pos,
+ real_t left_tangent = 0,
+ real_t right_tangent = 0,
+ TangentMode left_mode = TANGENT_FREE,
+ TangentMode right_mode = TANGENT_FREE);
+
void remove_point(int p_index);
void clear_points();
@@ -138,6 +144,8 @@ public:
int set_point_offset(int p_index, float offset);
Vector2 get_point_pos(int p_index) const;
+ Point get_point(int p_index) const;
+
float get_min_value() const { return _min_value; }
void set_min_value(float p_min);