Relaxes Node naming constraints in glTF documents to match the Editor.
This commit is contained in:
parent
e5bb89cdd5
commit
61cc1c8624
12 changed files with 99 additions and 34 deletions
|
|
@ -72,6 +72,7 @@
|
|||
#include "scene/3d/node_3d.h"
|
||||
#include "scene/3d/skeleton_3d.h"
|
||||
#include "scene/animation/animation_player.h"
|
||||
#include "scene/main/node.h"
|
||||
#include "scene/resources/surface_tool.h"
|
||||
#include <limits>
|
||||
|
||||
|
|
@ -449,14 +450,8 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) {
|
|||
return OK;
|
||||
}
|
||||
|
||||
String GLTFDocument::_sanitize_scene_name(const String &name) {
|
||||
RegEx regex("([^a-zA-Z0-9_ -]+)");
|
||||
String p_name = regex.sub(name, "", true);
|
||||
return p_name;
|
||||
}
|
||||
|
||||
String GLTFDocument::_gen_unique_name(Ref<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;
|
||||
|
|
@ -464,7 +459,7 @@ String GLTFDocument::_gen_unique_name(Ref<GLTFState> state, const String &p_name
|
|||
name = s_name;
|
||||
|
||||
if (index > 1) {
|
||||
name += " " + itos(index);
|
||||
name += itos(index);
|
||||
}
|
||||
if (!state->unique_names.has(name)) {
|
||||
break;
|
||||
|
|
@ -477,6 +472,39 @@ String GLTFDocument::_gen_unique_name(Ref<GLTFState> state, const String &p_name
|
|||
return name;
|
||||
}
|
||||
|
||||
String GLTFDocument::_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 GLTFDocument::_gen_unique_animation_name(Ref<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 GLTFDocument::_sanitize_bone_name(const String &name) {
|
||||
String p_name = name.camelcase_to_underscore(true);
|
||||
|
||||
|
|
@ -4729,7 +4757,7 @@ Error GLTFDocument::_parse_animations(Ref<GLTFState> state) {
|
|||
if (name.begins_with("loop") || name.ends_with("loop") || name.begins_with("cycle") || name.ends_with("cycle")) {
|
||||
animation->set_loop(true);
|
||||
}
|
||||
animation->set_name(_sanitize_scene_name(name));
|
||||
animation->set_name(_gen_unique_animation_name(state, name));
|
||||
}
|
||||
|
||||
for (int j = 0; j < channels.size(); j++) {
|
||||
|
|
|
|||
|
|
@ -162,8 +162,9 @@ private:
|
|||
Error _parse_nodes(Ref<GLTFState> state);
|
||||
String _get_type_name(const GLTFType p_component);
|
||||
String _get_accessor_type_name(const GLTFDocument::GLTFType p_type);
|
||||
String _sanitize_scene_name(const String &name);
|
||||
String _gen_unique_name(Ref<GLTFState> state, const String &p_name);
|
||||
String _sanitize_animation_name(const String &name);
|
||||
String _gen_unique_animation_name(Ref<GLTFState> state, const String &p_name);
|
||||
String _sanitize_bone_name(const String &name);
|
||||
String _gen_unique_bone_name(Ref<GLTFState> state,
|
||||
const GLTFSkeletonIndex skel_i,
|
||||
|
|
|
|||
|
|
@ -71,6 +71,8 @@ void GLTFState::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_lights", "lights"), &GLTFState::set_lights);
|
||||
ClassDB::bind_method(D_METHOD("get_unique_names"), &GLTFState::get_unique_names);
|
||||
ClassDB::bind_method(D_METHOD("set_unique_names", "unique_names"), &GLTFState::set_unique_names);
|
||||
ClassDB::bind_method(D_METHOD("get_unique_animation_names"), &GLTFState::get_unique_animation_names);
|
||||
ClassDB::bind_method(D_METHOD("set_unique_animation_names", "unique_animation_names"), &GLTFState::set_unique_animation_names);
|
||||
ClassDB::bind_method(D_METHOD("get_skeletons"), &GLTFState::get_skeletons);
|
||||
ClassDB::bind_method(D_METHOD("set_skeletons", "skeletons"), &GLTFState::set_skeletons);
|
||||
ClassDB::bind_method(D_METHOD("get_skeleton_to_node"), &GLTFState::get_skeleton_to_node);
|
||||
|
|
@ -98,6 +100,7 @@ void GLTFState::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "cameras", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_cameras", "get_cameras"); // Vector<Ref<GLTFCamera>>
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "lights", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_lights", "get_lights"); // Vector<Ref<GLTFLight>>
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "unique_names", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_unique_names", "get_unique_names"); // Set<String>
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "unique_animation_names", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_unique_animation_names", "get_unique_animation_names"); // Set<String>
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "skeletons", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_skeletons", "get_skeletons"); // Vector<Ref<GLTFSkeleton>>
|
||||
ADD_PROPERTY(PropertyInfo(Variant::DICTIONARY, "skeleton_to_node", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_skeleton_to_node", "get_skeleton_to_node"); // Map<GLTFSkeletonIndex,
|
||||
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animations", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_INTERNAL | PROPERTY_USAGE_EDITOR), "set_animations", "get_animations"); // Vector<Ref<GLTFAnimation>>
|
||||
|
|
@ -255,6 +258,14 @@ void GLTFState::set_unique_names(Array p_unique_names) {
|
|||
GLTFDocument::set_from_array(unique_names, p_unique_names);
|
||||
}
|
||||
|
||||
Array GLTFState::get_unique_animation_names() {
|
||||
return GLTFDocument::to_array(unique_animation_names);
|
||||
}
|
||||
|
||||
void GLTFState::set_unique_animation_names(Array p_unique_animation_names) {
|
||||
GLTFDocument::set_from_array(unique_animation_names, p_unique_animation_names);
|
||||
}
|
||||
|
||||
Array GLTFState::get_skeletons() {
|
||||
return GLTFDocument::to_array(skeletons);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -80,6 +80,7 @@ class GLTFState : public Resource {
|
|||
Vector<Ref<GLTFCamera>> cameras;
|
||||
Vector<Ref<GLTFLight>> lights;
|
||||
Set<String> unique_names;
|
||||
Set<String> unique_animation_names;
|
||||
|
||||
Vector<Ref<GLTFSkeleton>> skeletons;
|
||||
Map<GLTFSkeletonIndex, GLTFNodeIndex> skeleton_to_node;
|
||||
|
|
@ -147,6 +148,9 @@ public:
|
|||
Array get_unique_names();
|
||||
void set_unique_names(Array p_unique_names);
|
||||
|
||||
Array get_unique_animation_names();
|
||||
void set_unique_animation_names(Array p_unique_names);
|
||||
|
||||
Array get_skeletons();
|
||||
void set_skeletons(Array p_skeletons);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue