|
@@ -40,6 +40,7 @@
|
|
|
#include "scene/3d/camera.h"
|
|
|
#include "scene/3d/mesh_instance.h"
|
|
|
#include "scene/animation/animation_player.h"
|
|
|
+#include "scene/main/node.h"
|
|
|
#include "scene/resources/surface_tool.h"
|
|
|
|
|
|
uint32_t EditorSceneImporterGLTF::get_import_flags() const {
|
|
@@ -155,15 +156,9 @@ static Transform _arr_to_xform(const Array &p_array) {
|
|
|
return xform;
|
|
|
}
|
|
|
|
|
|
-String EditorSceneImporterGLTF::_sanitize_scene_name(const String &name) {
|
|
|
- RegEx regex("([^a-zA-Z0-9_ -]+)");
|
|
|
- String p_name = regex.sub(name, "", true);
|
|
|
- return p_name;
|
|
|
-}
|
|
|
-
|
|
|
String EditorSceneImporterGLTF::_gen_unique_name(GLTFState &state, const String &p_name) {
|
|
|
|
|
|
- const String s_name = _sanitize_scene_name(p_name);
|
|
|
+ const String s_name = p_name.validate_node_name();
|
|
|
|
|
|
String name;
|
|
|
int index = 1;
|
|
@@ -171,7 +166,7 @@ String EditorSceneImporterGLTF::_gen_unique_name(GLTFState &state, const String
|
|
|
name = s_name;
|
|
|
|
|
|
if (index > 1) {
|
|
|
- name += " " + itos(index);
|
|
|
+ name += itos(index);
|
|
|
}
|
|
|
if (!state.unique_names.has(name)) {
|
|
|
break;
|
|
@@ -184,6 +179,40 @@ String EditorSceneImporterGLTF::_gen_unique_name(GLTFState &state, const String
|
|
|
return name;
|
|
|
}
|
|
|
|
|
|
+String EditorSceneImporterGLTF::_sanitize_animation_name(const String &p_name) {
|
|
|
+ // Animations disallow the normal node invalid characters as well as "," and "["
|
|
|
+ // (See animation/animation_player.cpp::add_animation)
|
|
|
+
|
|
|
+ // TODO: Consider adding invalid_characters or a _validate_animation_name to animation_player to mirror Node.
|
|
|
+ String name = p_name.validate_node_name();
|
|
|
+ name = name.replace(",", "");
|
|
|
+ name = name.replace("[", "");
|
|
|
+ return name;
|
|
|
+}
|
|
|
+
|
|
|
+String EditorSceneImporterGLTF::_gen_unique_animation_name(GLTFState &state, const String &p_name) {
|
|
|
+
|
|
|
+ const String s_name = _sanitize_animation_name(p_name);
|
|
|
+
|
|
|
+ String name;
|
|
|
+ int index = 1;
|
|
|
+ while (true) {
|
|
|
+ name = s_name;
|
|
|
+
|
|
|
+ if (index > 1) {
|
|
|
+ name += itos(index);
|
|
|
+ }
|
|
|
+ if (!state.unique_animation_names.has(name)) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ index++;
|
|
|
+ }
|
|
|
+
|
|
|
+ state.unique_animation_names.insert(name);
|
|
|
+
|
|
|
+ return name;
|
|
|
+}
|
|
|
+
|
|
|
String EditorSceneImporterGLTF::_sanitize_bone_name(const String &name) {
|
|
|
String p_name = name.camelcase_to_underscore(true);
|
|
|
|
|
@@ -2473,7 +2502,7 @@ Error EditorSceneImporterGLTF::_parse_animations(GLTFState &state) {
|
|
|
if (name.begins_with("loop") || name.ends_with("loop") || name.begins_with("cycle") || name.ends_with("cycle")) {
|
|
|
animation.loop = true;
|
|
|
}
|
|
|
- animation.name = _sanitize_scene_name(name);
|
|
|
+ animation.name = _gen_unique_animation_name(state, name);
|
|
|
}
|
|
|
|
|
|
for (int j = 0; j < channels.size(); j++) {
|