animation framerate option

This commit is contained in:
Simon 2019-04-12 15:08:23 +01:00 committed by Pär Winzell
parent 4ed510ca8e
commit 4bb4bdbac1
5 changed files with 50 additions and 5 deletions

View File

@ -55,6 +55,8 @@ Usage:
(never|auto|always). (never|auto|always).
--compute-normals arg When to compute normals for vertices --compute-normals arg When to compute normals for vertices
(never|broken|missing|always). (never|broken|missing|always).
--anim-framerate arg Select baked animation framerate
(bake24|bake30|bake60).
-k, --keep-attribute arg Used repeatedly to build a limiting set of -k, --keep-attribute arg Used repeatedly to build a limiting set of
vertex attributes to keep. vertex attributes to keep.
-v, --verbose Enable verbose output. -v, --verbose Enable verbose output.

View File

@ -103,6 +103,26 @@ int main(int argc, char* argv[]) {
"When to compute vertex normals from mesh geometry.") "When to compute vertex normals from mesh geometry.")
->type_name("(never|broken|missing|always)"); ->type_name("(never|broken|missing|always)");
app.add_option(
"--anim-framerate",
[&](std::vector<std::string> choices) -> bool {
for (const std::string choice : choices) {
if (choice == "bake24") {
gltfOptions.animationFramerate = AnimationFramerateOptions::BAKE24;
} else if (choice == "bake30") {
gltfOptions.animationFramerate = AnimationFramerateOptions::BAKE30;
} else if (choice == "bake60") {
gltfOptions.animationFramerate = AnimationFramerateOptions::BAKE60;
} else {
fmt::printf("Unknown --anim-framerate: %s\n", choice);
throw CLI::RuntimeError(1);
}
}
return true;
},
"Select baked animation framerate.")
->type_name("(bake24|bake30|bake60)");
const auto opt_flip_u = app.add_flag("--flip-u", "Flip all U texture coordinates."); const auto opt_flip_u = app.add_flag("--flip-u", "Flip all U texture coordinates.");
const auto opt_no_flip_u = app.add_flag("--no-flip-u", "Don't flip U texture coordinates."); const auto opt_no_flip_u = app.add_flag("--no-flip-u", "Don't flip U texture coordinates.");
const auto opt_flip_v = app.add_flag("--flip-v", "Flip all V texture coordinates."); const auto opt_flip_v = app.add_flag("--flip-v", "Flip all V texture coordinates.");
@ -302,7 +322,7 @@ int main(int argc, char* argv[]) {
if (verboseOutput) { if (verboseOutput) {
fmt::printf("Loading FBX File: %s\n", inputPath); fmt::printf("Loading FBX File: %s\n", inputPath);
} }
if (!LoadFBXFile(raw, inputPath.c_str(), "png;jpg;jpeg")) { if (!LoadFBXFile(raw, inputPath.c_str(), "png;jpg;jpeg", gltfOptions)) {
fmt::fprintf(stderr, "ERROR:: Failed to parse FBX: %s\n", inputPath); fmt::fprintf(stderr, "ERROR:: Failed to parse FBX: %s\n", inputPath);
return 1; return 1;
} }

View File

@ -56,6 +56,12 @@ enum class UseLongIndicesOptions {
ALWAYS, // only ever use 32-bit indices ALWAYS, // only ever use 32-bit indices
}; };
enum class AnimationFramerateOptions {
BAKE24, // bake animations at 24 fps
BAKE30, // bake animations at 30 fps
BAKE60, // bake animations at 60 fps
};
/** /**
* User-supplied options that dictate the nature of the glTF being generated. * User-supplied options that dictate the nature of the glTF being generated.
*/ */
@ -103,4 +109,6 @@ struct GltfOptions
ComputeNormalsOption computeNormals = ComputeNormalsOption::BROKEN; ComputeNormalsOption computeNormals = ComputeNormalsOption::BROKEN;
/** When to use 32-bit indices. */ /** When to use 32-bit indices. */
UseLongIndicesOptions useLongIndices = UseLongIndicesOptions::AUTO; UseLongIndicesOptions useLongIndices = UseLongIndicesOptions::AUTO;
/** Select baked animation framerate. */
AnimationFramerateOptions animationFramerate = AnimationFramerateOptions::BAKE24;
}; };

View File

@ -721,8 +721,19 @@ static void ReadNodeHierarchy(
} }
} }
static void ReadAnimations(RawModel& raw, FbxScene* pScene) { static void ReadAnimations(RawModel& raw, FbxScene* pScene, const GltfOptions& options) {
FbxTime::EMode eMode = FbxTime::eFrames24; FbxTime::EMode eMode = FbxTime::eFrames24;
switch (options.animationFramerate) {
case AnimationFramerateOptions::BAKE24:
eMode = FbxTime::eFrames24;
break;
case AnimationFramerateOptions::BAKE30:
eMode = FbxTime::eFrames30;
break;
case AnimationFramerateOptions::BAKE60:
eMode = FbxTime::eFrames60;
break;
}
const double epsilon = 1e-5f; const double epsilon = 1e-5f;
const int animationCount = pScene->GetSrcObjectCount<FbxAnimStack>(); const int animationCount = pScene->GetSrcObjectCount<FbxAnimStack>();
@ -996,7 +1007,11 @@ static void FindFbxTextures(
} }
} }
bool LoadFBXFile(RawModel& raw, const char* fbxFileName, const char* textureExtensions) { bool LoadFBXFile(
RawModel& raw,
const char* fbxFileName,
const char* textureExtensions,
const GltfOptions& options) {
FbxManager* pManager = FbxManager::Create(); FbxManager* pManager = FbxManager::Create();
FbxIOSettings* pIoSettings = FbxIOSettings::Create(pManager, IOSROOT); FbxIOSettings* pIoSettings = FbxIOSettings::Create(pManager, IOSROOT);
pManager->SetIOSettings(pIoSettings); pManager->SetIOSettings(pIoSettings);
@ -1042,7 +1057,7 @@ bool LoadFBXFile(RawModel& raw, const char* fbxFileName, const char* textureExte
ReadNodeHierarchy(raw, pScene, pScene->GetRootNode(), 0, ""); ReadNodeHierarchy(raw, pScene, pScene->GetRootNode(), 0, "");
ReadNodeAttributes(raw, pScene, pScene->GetRootNode(), textureLocations); ReadNodeAttributes(raw, pScene, pScene->GetRootNode(), textureLocations);
ReadAnimations(raw, pScene); ReadAnimations(raw, pScene, options);
pScene->Destroy(); pScene->Destroy();
pManager->Destroy(); pManager->Destroy();

View File

@ -11,6 +11,6 @@
#include "raw/RawModel.hpp" #include "raw/RawModel.hpp"
bool LoadFBXFile(RawModel& raw, const char* fbxFileName, const char* textureExtensions); bool LoadFBXFile(RawModel& raw, const char* fbxFileName, const char* textureExtensions, const GltfOptions& options);
json TranscribeProperty(FbxProperty& prop); json TranscribeProperty(FbxProperty& prop);