Skip to content

Commit 871c2e7

Browse files
committed
toolset add root node name setting
1 parent eee85bd commit 871c2e7

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

toolset/README.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,17 @@ Supports animation and skeleton data.
138138

139139
**Default value:** false
140140

141-
Force create root node named after skeleton. (Separates root motion)
141+
Force create root node named after `root-node-name` setting. This node is automatically generated when there is multiple root nodes inside skeleton.(Separates root motion)
142+
143+
- **root-node-name**
144+
145+
**CLI Long:** ***--root-node-name***\
146+
**CLI Short:** ***-A***
147+
148+
**Default value:** {SKELETON_NAME}
149+
150+
When create-root-node is active, generate root node name from specified pattern.
151+
`{SKELETON_NAME}` will be substitued by actual skeleton name. For example `root_{SKELETON_NAME}_bone` will generate `root_Refernce_bone` (skeleton name is Reference)
142152

143153
- **scene**
144154

@@ -192,3 +202,10 @@ Supports animation and skeleton data.
192202
**Default value:** true
193203

194204
Input scene uses right handed coordiante system. (Finicky with root motion rotations)
205+
206+
## License
207+
208+
This toolset is available under GPL v3 license. (See LICENSE)\
209+
This toolset uses following libraries:
210+
211+
- HavokLib, Copyright (c) 2017-2025 Lukas Cone

toolset/gltf/hk_to_gltf.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ struct SkeletonSettings {
8181
bool visualize = true;
8282
bool createRootNode = false;
8383
std::string generateControlBones;
84+
std::string rootNodeName = "{SKELETON_NAME}";
8485
void ReflectorTag();
8586
};
8687

@@ -119,7 +120,7 @@ struct Havok2GLTF : ReflectorBase<Havok2GLTF> {
119120
float sceneScale = 0.f;
120121
es::Matrix44 corMat;
121122
} settings;
122-
// bpnrsuBCFGNRSUV
123+
// bpnrsuABCFGNRSUV
123124
REFLECT(
124125
CLASS(AnimationSettings),
125126
MEMBERNAME(blendOverride, "blend-override", "b",
@@ -129,9 +130,9 @@ REFLECT(
129130
MEMBERNAME(scaleType, "scale-type", "S",
130131
ReflDesc{
131132
"Select desired processing mode for node scale tracks."}),
132-
MEMBERNAME(unnamedAnimsAsFile, "filename-anims", "f",
133-
ReflDesc{
134-
"Use filename for unnamed animations instead of Motion[]"}), )
133+
MEMBERNAME(
134+
unnamedAnimsAsFile, "filename-anims", "f",
135+
ReflDesc{"Use filename for unnamed animations instead of Motion[]"}), )
135136

136137
REFLECT(CLASS(SkeletonSettings),
137138
MEMBERNAME(path, "skeleton-path", "s",
@@ -145,8 +146,18 @@ REFLECT(CLASS(SkeletonSettings),
145146
ReflDesc{"Create visualization mesh for skeletons. (Enforces "
146147
"armature object for Blender)"}),
147148
MEMBERNAME(createRootNode, "create-root-node", "N",
148-
ReflDesc{"Force create root node named after skeleton. "
149-
"(Separates root motion)"}), )
149+
ReflDesc{"Force create root node named after "
150+
"`root-node-name` setting. This "
151+
"node is automatically generated when there is "
152+
"multiple root nodes inside skeleton."
153+
"(Separates root motion)"}),
154+
MEMBERNAME(
155+
rootNodeName, "root-node-name", "A",
156+
ReflDesc{"When create-root-node is active, generate root node name "
157+
"from specified pattern.\n`{SKELETON_NAME}` will be "
158+
"substitued by actual skeleton name. For example "
159+
"`root_{SKELETON_NAME}_bone` will generate "
160+
"`root_Refernce_bone` (skeleton name is Reference)"}), )
150161

151162
REFLECT(CLASS(Scene), MEMBER(units, "u", ReflDesc{"Input scene units."}),
152163
MEMBERNAME(customScale, "custom-scale", "C",
@@ -434,7 +445,11 @@ struct GLTFHK : GLTF {
434445

435446
if (rootIndices.size() > 1 || settings.skeleton.createRootNode) {
436447
gltf::Node rootNode;
437-
rootNode.name = skel.Name();
448+
rootNode.name = settings.skeleton.rootNodeName;
449+
const size_t found = rootNode.name.find("{SKELETON_NAME}");
450+
if (found != rootNode.name.npos) {
451+
rootNode.name.replace(found, 15, skel.Name());
452+
}
438453

439454
for (auto i : rootIndices) {
440455
rootNode.children.push_back(i);

0 commit comments

Comments
 (0)