Преглед изворни кода

resolve numerical error when comparing instancing an inheritance to avoid saving changed properties when they didn't, closes 4759

Juan Linietsky пре 9 година
родитељ
комит
f0abda999e
2 измењених фајлова са 21 додато и 3 уклоњено
  1. 13 3
      scene/resources/packed_scene.cpp
  2. 8 0
      tools/editor/property_editor.cpp

+ 13 - 3
scene/resources/packed_scene.cpp

@@ -545,9 +545,19 @@ https://github.com/godotengine/godot/issues/3127
 			}
 
 #endif
-			if (exists && bool(Variant::evaluate(Variant::OP_EQUAL,value,original))) {
-				//exists and did not change
-				continue;
+			if (exists) {
+
+				//check if already exists and did not change
+				if (value.get_type()==Variant::REAL && original.get_type()==Variant::REAL) {
+					//this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error
+					float a = value;
+					float b = original;
+
+					if (Math::abs(a-b)<CMP_EPSILON)
+						continue;
+				} else if (bool(Variant::evaluate(Variant::OP_EQUAL,value,original))) {
+					continue;
+				}
 			}
 
 			if (!exists && isdefault) {

+ 8 - 0
tools/editor/property_editor.cpp

@@ -1963,6 +1963,13 @@ bool PropertyEditor::_is_property_different(const Variant& p_current, const Vari
 			return false;
 	}
 
+	if (p_current.get_type()==Variant::REAL && p_orig.get_type()==Variant::REAL) {
+		float a = p_current;
+		float b = p_orig;
+
+		return Math::abs(a-b)>CMP_EPSILON; //this must be done because, as some scenes save as text, there might be a tiny difference in floats due to numerical error
+	}
+
 	return bool(Variant::evaluate(Variant::OP_NOT_EQUAL,p_current,p_orig));
 }
 
@@ -2232,6 +2239,7 @@ void PropertyEditor::_check_reload_status(const String&p_name, TreeItem* item) {
 		if (_get_instanced_node_original_property(p_name,vorig) || usage) {
 			Variant v = obj->get(p_name);
 
+
 			bool changed = _is_property_different(v,vorig,usage);
 
 			//if ((found!=-1 && !is_disabled)!=changed) {