Add clamping logic (#6149)

Co-authored-by: Kim Kulling <kimkulling@users.noreply.github.com>
This commit is contained in:
Martin Mirchev
2025-05-26 16:16:10 +08:00
committed by GitHub
parent d2aed87f5e
commit 18465fbb24

View File

@@ -1043,14 +1043,40 @@ aiMatrix4x4 get_world_transform(const aiNode* node, const aiScene* scene) {
}
inline int64_t to_ktime(double ticks, const aiAnimation* anim) {
if (FP_ZERO == std::fpclassify(anim->mTicksPerSecond)) {
return static_cast<int64_t>(ticks) * FBX::SECOND;
// Defensive: handle zero or near-zero mTicksPerSecond
double tps = anim->mTicksPerSecond;
double timeVal;
if (FP_ZERO == std::fpclassify(tps)) {
timeVal = ticks;
} else {
timeVal = ticks / tps;
}
return (static_cast<int64_t>(ticks / anim->mTicksPerSecond)) * FBX::SECOND;
// Clamp to prevent overflow
const double kMax = static_cast<double>(INT64_MAX) / static_cast<double>(FBX::SECOND);
const double kMin = static_cast<double>(INT64_MIN) / static_cast<double>(FBX::SECOND);
if (timeVal > kMax) {
return INT64_MAX;
}
if (timeVal < kMin) {
return INT64_MIN;
}
return static_cast<int64_t>(timeVal * FBX::SECOND);
}
inline int64_t to_ktime(double time) {
return (static_cast<int64_t>(time * FBX::SECOND));
// Clamp to prevent overflow
const double kMax = static_cast<double>(INT64_MAX) / static_cast<double>(FBX::SECOND);
const double kMin = static_cast<double>(INT64_MIN) / static_cast<double>(FBX::SECOND);
if (time > kMax) {
return INT64_MAX;
}
if (time < kMin) {
return INT64_MIN;
}
return static_cast<int64_t>(time * FBX::SECOND);
}
void FBXExporter::WriteObjects () {