| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2019-02-12 17:18:13 +01:00
										 |  |  | /*  gradient.cpp                                                         */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							|  |  |  | /*                       This file is part of:                           */ | 
					
						
							|  |  |  | /*                           GODOT ENGINE                                */ | 
					
						
							| 
									
										
										
										
											2017-08-27 14:16:55 +02:00
										 |  |  | /*                      https://godotengine.org                          */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2020-01-01 11:16:22 +01:00
										 |  |  | /* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur.                 */ | 
					
						
							|  |  |  | /* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md).   */ | 
					
						
							| 
									
										
										
										
											2016-06-18 14:46:12 +02:00
										 |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the       */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including   */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,   */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to    */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to */ | 
					
						
							|  |  |  | /* the following conditions:                                             */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be        */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.       */ | 
					
						
							|  |  |  | /*                                                                       */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */ | 
					
						
							|  |  |  | /*************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-12 17:18:13 +01:00
										 |  |  | #include "gradient.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/core_string_names.h"
 | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | Gradient::Gradient() { | 
					
						
							| 
									
										
										
										
											2020-10-25 18:32:44 +02:00
										 |  |  | 	//Set initial gradient transition from black to white
 | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	points.resize(2); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 	points.write[0].color = Color(0, 0, 0, 1); | 
					
						
							|  |  |  | 	points.write[0].offset = 0; | 
					
						
							|  |  |  | 	points.write[1].color = Color(1, 1, 1, 1); | 
					
						
							|  |  |  | 	points.write[1].offset = 1; | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 	is_sorted = true; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | Gradient::~Gradient() { | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::_bind_methods() { | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("add_point", "offset", "color"), &Gradient::add_point); | 
					
						
							| 
									
										
										
										
											2020-12-28 17:57:55 +01:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("remove_point", "point"), &Gradient::remove_point); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_offset", "point", "offset"), &Gradient::set_offset); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_offset", "point"), &Gradient::get_offset); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_color", "point", "color"), &Gradient::set_color); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_color", "point"), &Gradient::get_color); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("interpolate", "offset"), &Gradient::get_color_at_offset); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("get_point_count"), &Gradient::get_points_count); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-25 18:32:44 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_offsets", "offsets"), &Gradient::set_offsets); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_offsets"), &Gradient::get_offsets); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-25 18:32:44 +02:00
										 |  |  | 	ClassDB::bind_method(D_METHOD("set_colors", "colors"), &Gradient::set_colors); | 
					
						
							|  |  |  | 	ClassDB::bind_method(D_METHOD("get_colors"), &Gradient::get_colors); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-25 18:32:44 +02:00
										 |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::PACKED_FLOAT32_ARRAY, "offsets"), "set_offsets", "get_offsets"); | 
					
						
							|  |  |  | 	ADD_PROPERTY(PropertyInfo(Variant::PACKED_COLOR_ARRAY, "colors"), "set_colors", "get_colors"); | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | Vector<float> Gradient::get_offsets() const { | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	Vector<float> offsets; | 
					
						
							|  |  |  | 	offsets.resize(points.size()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < points.size(); i++) { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		offsets.write[i] = points[i].offset; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return offsets; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | Vector<Color> Gradient::get_colors() const { | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	Vector<Color> colors; | 
					
						
							|  |  |  | 	colors.resize(points.size()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < points.size(); i++) { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		colors.write[i] = points[i].color; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	return colors; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::set_offsets(const Vector<float> &p_offsets) { | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 	points.resize(p_offsets.size()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < points.size(); i++) { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		points.write[i].offset = p_offsets[i]; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 	is_sorted = false; | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::set_colors(const Vector<Color> &p_colors) { | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	if (points.size() < p_colors.size()) { | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 		is_sorted = false; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 	points.resize(p_colors.size()); | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	for (int i = 0; i < points.size(); i++) { | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 		points.write[i].color = p_colors[i]; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | Vector<Gradient::Point> &Gradient::get_points() { | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	return points; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::add_point(float p_offset, const Color &p_color) { | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 	Point p; | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	p.offset = p_offset; | 
					
						
							|  |  |  | 	p.color = p_color; | 
					
						
							|  |  |  | 	is_sorted = false; | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 	points.push_back(p); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::remove_point(int p_index) { | 
					
						
							| 
									
										
										
										
											2017-03-05 16:44:50 +01:00
										 |  |  | 	ERR_FAIL_INDEX(p_index, points.size()); | 
					
						
							| 
									
										
										
										
											2020-02-05 14:20:15 +04:00
										 |  |  | 	ERR_FAIL_COND(points.size() <= 1); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | 	points.remove(p_index); | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-12-12 09:45:17 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::set_points(Vector<Gradient::Point> &p_points) { | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	points = p_points; | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 	is_sorted = false; | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::set_offset(int pos, const float offset) { | 
					
						
							| 
									
										
										
										
											2020-08-10 04:23:12 -04:00
										 |  |  | 	ERR_FAIL_INDEX(pos, points.size()); | 
					
						
							|  |  |  | 	_update_sorting(); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 	points.write[pos].offset = offset; | 
					
						
							| 
									
										
										
										
											2015-05-26 22:17:54 +03:00
										 |  |  | 	is_sorted = false; | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-10 04:23:12 -04:00
										 |  |  | float Gradient::get_offset(int pos) { | 
					
						
							| 
									
										
										
										
											2019-06-21 11:34:32 +02:00
										 |  |  | 	ERR_FAIL_INDEX_V(pos, points.size(), 0.0); | 
					
						
							| 
									
										
										
										
											2020-08-10 04:23:12 -04:00
										 |  |  | 	_update_sorting(); | 
					
						
							| 
									
										
										
										
											2019-06-21 11:34:32 +02:00
										 |  |  | 	return points[pos].offset; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | void Gradient::set_color(int pos, const Color &color) { | 
					
						
							| 
									
										
										
										
											2020-08-10 04:23:12 -04:00
										 |  |  | 	ERR_FAIL_INDEX(pos, points.size()); | 
					
						
							|  |  |  | 	_update_sorting(); | 
					
						
							| 
									
										
										
										
											2018-07-25 03:11:03 +02:00
										 |  |  | 	points.write[pos].color = color; | 
					
						
							| 
									
										
										
										
											2016-12-09 02:52:40 +01:00
										 |  |  | 	emit_signal(CoreStringNames::get_singleton()->changed); | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-10 04:23:12 -04:00
										 |  |  | Color Gradient::get_color(int pos) { | 
					
						
							| 
									
										
										
										
											2019-06-21 11:34:32 +02:00
										 |  |  | 	ERR_FAIL_INDEX_V(pos, points.size(), Color()); | 
					
						
							| 
									
										
										
										
											2020-08-10 04:23:12 -04:00
										 |  |  | 	_update_sorting(); | 
					
						
							| 
									
										
										
										
											2019-06-21 11:34:32 +02:00
										 |  |  | 	return points[pos].color; | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-28 21:46:48 -03:00
										 |  |  | int Gradient::get_points_count() const { | 
					
						
							| 
									
										
										
										
											2015-05-24 21:18:52 +03:00
										 |  |  | 	return points.size(); | 
					
						
							|  |  |  | } |