From 11b8b8ad2715d8770e03fab7fd4ae63040154001 Mon Sep 17 00:00:00 2001 From: Lyuma Date: Thu, 15 Oct 2020 07:53:18 -0700 Subject: [PATCH] Allow renaming bones and blendshapes. (cherry picked from commit d13568a8d1290713bbdab5a32a99e03d762cefc9) --- doc/classes/ArrayMesh.xml | 10 ++++++++++ doc/classes/Skeleton.xml | 10 ++++++++++ scene/3d/skeleton.cpp | 13 +++++++++++++ scene/3d/skeleton.h | 1 + scene/resources/mesh.cpp | 18 ++++++++++++++++++ scene/resources/mesh.h | 2 ++ scene/resources/primitive_meshes.cpp | 3 +++ scene/resources/primitive_meshes.h | 1 + 8 files changed, 58 insertions(+) diff --git a/doc/classes/ArrayMesh.xml b/doc/classes/ArrayMesh.xml index de47261ad1..a270389616 100644 --- a/doc/classes/ArrayMesh.xml +++ b/doc/classes/ArrayMesh.xml @@ -97,6 +97,16 @@ Will regenerate normal maps for the [ArrayMesh]. + + + + + + + + + + diff --git a/doc/classes/Skeleton.xml b/doc/classes/Skeleton.xml index 11b9ead4c6..244cb29b7b 100644 --- a/doc/classes/Skeleton.xml +++ b/doc/classes/Skeleton.xml @@ -212,6 +212,16 @@ + + + + + + + + + + diff --git a/scene/3d/skeleton.cpp b/scene/3d/skeleton.cpp index 5a44cdac23..3f266e163a 100644 --- a/scene/3d/skeleton.cpp +++ b/scene/3d/skeleton.cpp @@ -440,6 +440,18 @@ String Skeleton::get_bone_name(int p_bone) const { return bones[p_bone].name; } +void Skeleton::set_bone_name(int p_bone, const String &p_name) { + ERR_FAIL_INDEX(p_bone, bones.size()); + + for (int i = 0; i < bones.size(); i++) { + if (i != p_bone) { + ERR_FAIL_COND(bones[i].name == p_name); + } + } + + bones.write[p_bone].name = p_name; +} + bool Skeleton::is_bone_parent_of(int p_bone, int p_parent_bone_id) const { int parent_of_bone = get_bone_parent(p_bone); @@ -855,6 +867,7 @@ void Skeleton::_bind_methods() { ClassDB::bind_method(D_METHOD("add_bone", "name"), &Skeleton::add_bone); ClassDB::bind_method(D_METHOD("find_bone", "name"), &Skeleton::find_bone); ClassDB::bind_method(D_METHOD("get_bone_name", "bone_idx"), &Skeleton::get_bone_name); + ClassDB::bind_method(D_METHOD("set_bone_name", "bone_idx", "name"), &Skeleton::set_bone_name); ClassDB::bind_method(D_METHOD("get_bone_parent", "bone_idx"), &Skeleton::get_bone_parent); ClassDB::bind_method(D_METHOD("set_bone_parent", "bone_idx", "parent_idx"), &Skeleton::set_bone_parent); diff --git a/scene/3d/skeleton.h b/scene/3d/skeleton.h index fb5d1367d4..5713e40f00 100644 --- a/scene/3d/skeleton.h +++ b/scene/3d/skeleton.h @@ -161,6 +161,7 @@ public: void add_bone(const String &p_name); int find_bone(const String &p_name) const; String get_bone_name(int p_bone) const; + void set_bone_name(int p_bone, const String &p_name); bool is_bone_parent_of(int p_bone_id, int p_parent_bone_id) const; diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index f997929ed3..992958e4c4 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -918,6 +918,23 @@ StringName ArrayMesh::get_blend_shape_name(int p_index) const { ERR_FAIL_INDEX_V(p_index, blend_shapes.size(), StringName()); return blend_shapes[p_index]; } + +void ArrayMesh::set_blend_shape_name(int p_index, const StringName &p_name) { + ERR_FAIL_INDEX(p_index, blend_shapes.size()); + + StringName name = p_name; + int found = blend_shapes.find(name); + if (found != -1 && found != p_index) { + int count = 2; + do { + name = String(p_name) + " " + itos(count); + count++; + } while (blend_shapes.find(name) != -1); + } + + blend_shapes.write[p_index] = name; +} + void ArrayMesh::clear_blend_shapes() { ERR_FAIL_COND_MSG(surfaces.size(), "Can't set shape key count if surfaces are already created."); @@ -1439,6 +1456,7 @@ void ArrayMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("add_blend_shape", "name"), &ArrayMesh::add_blend_shape); ClassDB::bind_method(D_METHOD("get_blend_shape_count"), &ArrayMesh::get_blend_shape_count); ClassDB::bind_method(D_METHOD("get_blend_shape_name", "index"), &ArrayMesh::get_blend_shape_name); + ClassDB::bind_method(D_METHOD("set_blend_shape_name", "index", "name"), &ArrayMesh::set_blend_shape_name); ClassDB::bind_method(D_METHOD("clear_blend_shapes"), &ArrayMesh::clear_blend_shapes); ClassDB::bind_method(D_METHOD("set_blend_shape_mode", "mode"), &ArrayMesh::set_blend_shape_mode); ClassDB::bind_method(D_METHOD("get_blend_shape_mode"), &ArrayMesh::get_blend_shape_mode); diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h index 3c4cbb570e..0e3911156f 100644 --- a/scene/resources/mesh.h +++ b/scene/resources/mesh.h @@ -129,6 +129,7 @@ public: virtual Ref surface_get_material(int p_idx) const = 0; virtual int get_blend_shape_count() const = 0; virtual StringName get_blend_shape_name(int p_index) const = 0; + virtual void set_blend_shape_name(int p_index, const StringName &p_name) = 0; PoolVector get_faces() const; Ref generate_triangle_mesh() const; @@ -195,6 +196,7 @@ public: void add_blend_shape(const StringName &p_name); int get_blend_shape_count() const; StringName get_blend_shape_name(int p_index) const; + void set_blend_shape_name(int p_index, const StringName &p_name); void clear_blend_shapes(); void set_blend_shape_mode(BlendShapeMode p_mode); diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index fe5bc09f7c..a562d75f07 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -177,6 +177,9 @@ StringName PrimitiveMesh::get_blend_shape_name(int p_index) const { return StringName(); } +void PrimitiveMesh::set_blend_shape_name(int p_index, const StringName &p_name) { +} + AABB PrimitiveMesh::get_aabb() const { if (pending_request) { _update(); diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 8d9847cd96..209facf030 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -76,6 +76,7 @@ public: virtual Ref surface_get_material(int p_idx) const; virtual int get_blend_shape_count() const; virtual StringName get_blend_shape_name(int p_index) const; + virtual void set_blend_shape_name(int p_index, const StringName &p_name); virtual AABB get_aabb() const; virtual RID get_rid() const;