Merge pull request #401 from jmousseau/animation-channel-node-optionality

Fix animation channel target node optionality
This commit is contained in:
Syoyo Fujita 2023-01-16 05:33:40 +09:00 committed by GitHub
commit 98adbb3fb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -547,9 +547,10 @@ typedef std::map<std::string, Value> ExtensionMap;
struct AnimationChannel { struct AnimationChannel {
int sampler; // required int sampler; // required
int target_node; // required (index of the node to target) int target_node; // optional index of the node to target (alternative
std::string target_path; // required in ["translation", "rotation", "scale", // target should be provided by extension)
// "weights"] std::string target_path; // required with standard values of ["translation",
// "rotation", "scale", "weights"]
Value extras; Value extras;
ExtensionMap extensions; ExtensionMap extensions;
ExtensionMap target_extensions; ExtensionMap target_extensions;
@ -5103,12 +5104,7 @@ static bool ParseAnimationChannel(
if (FindMember(o, "target", targetIt) && IsObject(GetValue(targetIt))) { if (FindMember(o, "target", targetIt) && IsObject(GetValue(targetIt))) {
const json &target_object = GetValue(targetIt); const json &target_object = GetValue(targetIt);
if (!ParseIntegerProperty(&targetIndex, err, target_object, "node", true)) { ParseIntegerProperty(&targetIndex, err, target_object, "node", false);
if (err) {
(*err) += "`node` field is missing in animation.channels.target\n";
}
return false;
}
if (!ParseStringProperty(&channel->target_path, err, target_object, "path", if (!ParseStringProperty(&channel->target_path, err, target_object, "path",
true)) { true)) {
@ -6968,7 +6964,11 @@ static void SerializeGltfAnimationChannel(const AnimationChannel &channel,
SerializeNumberProperty("sampler", channel.sampler, o); SerializeNumberProperty("sampler", channel.sampler, o);
{ {
json target; json target;
if (channel.target_node > 0) {
SerializeNumberProperty("node", channel.target_node, target); SerializeNumberProperty("node", channel.target_node, target);
}
SerializeStringProperty("path", channel.target_path, target); SerializeStringProperty("path", channel.target_path, target);
SerializeExtensionMap(channel.target_extensions, target); SerializeExtensionMap(channel.target_extensions, target);