|
8 | 8 | #include "momentum/io/character_io.h" |
9 | 9 |
|
10 | 10 | #include "momentum/character/character.h" |
| 11 | +#include "momentum/character/skeleton_state.h" |
11 | 12 | #include "momentum/io/fbx/fbx_io.h" |
12 | 13 | #include "momentum/io/gltf/gltf_io.h" |
13 | 14 | #include "momentum/io/shape/pose_shape_io.h" |
@@ -139,4 +140,76 @@ Character loadFullCharacterFromBuffer( |
139 | 140 | return character.value(); |
140 | 141 | } |
141 | 142 |
|
| 143 | +void saveCharacter( |
| 144 | + const filesystem::path& filename, |
| 145 | + const Character& character, |
| 146 | + const MatrixXf& motion, |
| 147 | + const VectorXf& offsets, |
| 148 | + const std::vector<std::vector<Marker>>& markerSequence, |
| 149 | + float fps) { |
| 150 | + // Parse format from file extension |
| 151 | + const auto format = parseCharacterFormat(filename); |
| 152 | + MT_THROW_IF( |
| 153 | + format == CharacterFormat::Unknown, |
| 154 | + "Unknown character format for path: {}. Supported formats: .fbx, .glb, .gltf", |
| 155 | + filename.string()); |
| 156 | + |
| 157 | + if (format == CharacterFormat::Gltf) { |
| 158 | + saveGltfCharacter( |
| 159 | + filename, |
| 160 | + character, |
| 161 | + fps, |
| 162 | + {character.parameterTransform.name, motion}, |
| 163 | + {character.skeleton.getJointNames(), offsets}, |
| 164 | + markerSequence); |
| 165 | + } else if (format == CharacterFormat::Fbx) { |
| 166 | + // Save as FBX |
| 167 | + saveFbx( |
| 168 | + filename, |
| 169 | + character, |
| 170 | + motion, |
| 171 | + offsets, |
| 172 | + static_cast<double>(fps), |
| 173 | + true, // saveMesh |
| 174 | + FBXCoordSystemInfo(), |
| 175 | + false, // permissive |
| 176 | + markerSequence); |
| 177 | + } else { |
| 178 | + MT_THROW( |
| 179 | + "{} is not a supported format. Supported formats: .fbx, .glb, .gltf", filename.string()); |
| 180 | + } |
| 181 | +} |
| 182 | + |
| 183 | +void saveCharacter( |
| 184 | + const filesystem::path& filename, |
| 185 | + const Character& character, |
| 186 | + std::span<const SkeletonState> skeletonStates, |
| 187 | + const std::vector<std::vector<Marker>>& markerSequence, |
| 188 | + float fps) { |
| 189 | + // Parse format from file extension |
| 190 | + const auto format = parseCharacterFormat(filename); |
| 191 | + MT_THROW_IF( |
| 192 | + format == CharacterFormat::Unknown, |
| 193 | + "Unknown character format for path: {}. Supported formats: .fbx, .glb, .gltf", |
| 194 | + filename.string()); |
| 195 | + |
| 196 | + if (format == CharacterFormat::Gltf) { |
| 197 | + saveGltfCharacter(filename, character, fps, skeletonStates, markerSequence); |
| 198 | + } else if (format == CharacterFormat::Fbx) { |
| 199 | + // Save as FBX |
| 200 | + saveFbxWithSkelState( |
| 201 | + filename, |
| 202 | + character, |
| 203 | + skeletonStates, |
| 204 | + static_cast<double>(fps), |
| 205 | + true, // saveMesh |
| 206 | + FBXCoordSystemInfo(), |
| 207 | + false, // permissive |
| 208 | + markerSequence); |
| 209 | + } else { |
| 210 | + MT_THROW( |
| 211 | + "{} is not a supported format. Supported formats: .fbx, .glb, .gltf", filename.string()); |
| 212 | + } |
| 213 | +} |
| 214 | + |
142 | 215 | } // namespace momentum |
0 commit comments