74 const glm::vec3& offset)
77 std::string meshNodeName = model->
name();
78 auto slashPos = meshNodeName.rfind(
'/');
79 if (slashPos != std::string::npos)
80 meshNodeName = meshNodeName.substr(slashPos + 1);
81 FbxNode* meshNode = FbxNode::Create(l_manager, meshNodeName.c_str());
84 const auto m = glm::scale(glm::vec3(matrix[0][0], matrix[1][1], matrix[2][2]));
88 FbxMesh* mesh = FbxMesh::Create(
89 l_manager, meshNodeName.c_str());
90 mesh->InitControlPoints(
static_cast<int>(num_of_vertices));
91 FbxVector4* vertices = mesh->GetControlPoints();
94 auto layer = mesh->GetLayer(0);
98 layer = mesh->GetLayer(0);
103 FbxLayerElementNormal* layer_normal = FbxLayerElementNormal::Create(mesh,
"");
104 layer_normal->SetMappingMode(FbxLayerElement::eByControlPoint);
105 layer_normal->SetReferenceMode(FbxLayerElement::eDirect);
108 FbxLayerElementUV* layer_texcoord = FbxLayerElementUV::Create(mesh,
"DiffuseUV");
109 layer_texcoord->SetMappingMode(FbxLayerElement::eByControlPoint);
110 layer_texcoord->SetReferenceMode(FbxLayerElement::eDirect);
111 layer->SetUVs(layer_texcoord, FbxLayerElement::eTextureDiffuse);
114 LOG_INFO <<
"Adding main mesh Verts...";
115 for (
size_t i = 0; i < num_of_vertices; i++)
118 const glm::vec3 Position = glm::vec3(m * glm::vec4((v.
pos + offset), 1.0f));
120 const glm::vec3 vn = glm::normalize(v.
normal);
121 layer_normal->GetDirectArray().Add(FbxVector4(vn.x, vn.y, vn.z));
126 const size_t num_of_passes = model->
passes.size();
127 FbxLayerElementMaterial* layer_material = FbxLayerElementMaterial::Create(mesh,
"");
128 layer_material->SetMappingMode(FbxLayerElement::eByPolygon);
129 layer_material->SetReferenceMode(FbxLayerElement::eIndexToDirect);
130 layer->SetMaterials(layer_material);
133 LOG_INFO <<
"Setting main mesh Polys...";
134 for (
size_t i = 0; i < num_of_passes; i++)
140 FbxString mtrl_name =
"testToChange";
141 mtrl_name.Append(
"_", 1);
143 _itoa(
static_cast<int>(i), tmp, 10);
144 mtrl_name.Append(tmp, strlen(tmp));
145 FbxSurfaceMaterial* material = l_scene->GetMaterial(mtrl_name.Buffer());
146 meshNode->AddMaterial(material);
149 const size_t num_of_faces = g->
icount / 3;
150 for (
size_t j = 0; j < num_of_faces; j++)
152 mesh->BeginPolygon(mtrl_index);
163 layer->SetNormals(layer_normal);
165 const FbxGeometryConverter lGeometryConverter(l_manager);
166 lGeometryConverter.ComputeEdgeSmoothingFromNormals(mesh);
168 lGeometryConverter.ComputePolygonSmoothingFromEdgeSmoothing(mesh);
171 meshNode->SetNodeAttribute(mesh);
174 meshNode->SetShadingMode(FbxNode::eTextureShading);
180 std::map<int, FbxNode*>& l_boneNodes)
182 std::string skelName = l_model->
name();
183 auto skelSlashPos = skelName.rfind(
'/');
184 if (skelSlashPos != std::string::npos)
185 skelName = skelName.substr(skelSlashPos + 1);
187 l_skeletonNode = FbxNode::Create(
188 l_scene, skelName.c_str());
189 FbxSkeleton* bone_group_skeleton_attribute = FbxSkeleton::Create(l_scene,
"");
190 bone_group_skeleton_attribute->SetSkeletonType(FbxSkeleton::eRoot);
191 bone_group_skeleton_attribute->Size.Set(10.0 *
SCALE_FACTOR);
192 l_skeletonNode->SetNodeAttribute(bone_group_skeleton_attribute);
194 std::vector<FbxSkeleton::EType> bone_types;
195 const size_t num_of_bones = l_model->
bones.size();
198 std::vector<bool> has_children;
199 has_children.resize(num_of_bones);
200 for (
size_t i = 0; i < num_of_bones; ++i)
204 has_children[bone.
parent] =
true;
207 bone_types.resize(num_of_bones);
208 for (
size_t i = 0; i < num_of_bones; ++i)
214 bone_types[i] = FbxSkeleton::eRoot;
216 else if (has_children[i])
218 bone_types[i] = FbxSkeleton::eLimb;
222 bone_types[i] = FbxSkeleton::eLimbNode;
227 for (
size_t i = 0; i < num_of_bones; ++i)
230 glm::vec3 trans = bone.
pivot;
234 trans -= l_model->
bones[pid].pivot;
236 FbxString bone_name(
"bone_");
237 bone_name +=
static_cast<int>(i);
239 FbxNode* skeleton_node = FbxNode::Create(l_scene, bone_name);
240 l_boneNodes[i] = skeleton_node;
244 FbxSkeleton* skeleton_attribute = FbxSkeleton::Create(l_scene, bone_name);
245 skeleton_attribute->SetSkeletonType(bone_types[i]);
247 if (bone_types[i] == FbxSkeleton::eRoot)
250 l_skeletonNode->AddChild(skeleton_node);
252 else if (bone_types[i] == FbxSkeleton::eLimb)
254 skeleton_attribute->LimbLength.Set(
255 5.0 *
SCALE_FACTOR * (sqrtf(trans.x * trans.x + trans.y * trans.y + trans.z * trans.z)));
256 l_boneNodes[pid]->AddChild(skeleton_node);
261 l_boneNodes[pid]->AddChild(skeleton_node);
264 skeleton_node->SetNodeAttribute(skeleton_attribute);
337 std::map<int, FbxNode*>& skeleton)
339 if (skeleton.empty())
341 LOG_ERROR <<
"No bones in skeleton, so animation will not be exported";
346 FbxAnimStack* anim_stack = FbxAnimStack::Create(l_scene, animName.c_str());
347 FbxAnimLayer* anim_layer = FbxAnimLayer::Create(l_scene, animName.c_str());
348 anim_stack->AddMember(anim_layer);
351 float timeInc =
static_cast<float>(cur_anim.
length) / 60.0f;
354 timeInc =
static_cast<float>(cur_anim.
length);
356 FbxTime::SetGlobalTimeMode(FbxTime::eFrames60);
364 time.SetSecondDouble(
static_cast<float>(t) / 1000.0);
366 for (
auto& it : skeleton)
375 if (!rot && !scale && !trans)
380 FbxAnimCurve* t_curve_x = skeleton[b]->LclTranslation.GetCurve(
381 anim_layer, FBXSDK_CURVENODE_COMPONENT_X,
true);
382 FbxAnimCurve* t_curve_y = skeleton[b]->LclTranslation.GetCurve(
383 anim_layer, FBXSDK_CURVENODE_COMPONENT_Y,
true);
384 FbxAnimCurve* t_curve_z = skeleton[b]->LclTranslation.GetCurve(
385 anim_layer, FBXSDK_CURVENODE_COMPONENT_Z,
true);
395 t_curve_x->KeyModifyBegin();
396 int key_index = t_curve_x->KeyAdd(time);
399 ? FbxAnimCurveDef::eInterpolationLinear
400 : FbxAnimCurveDef::eInterpolationCubic);
401 t_curve_x->KeyModifyEnd();
403 t_curve_y->KeyModifyBegin();
404 key_index = t_curve_y->KeyAdd(time);
407 ? FbxAnimCurveDef::eInterpolationLinear
408 : FbxAnimCurveDef::eInterpolationCubic);
409 t_curve_y->KeyModifyEnd();
411 t_curve_z->KeyModifyBegin();
412 key_index = t_curve_z->KeyAdd(time);
415 ? FbxAnimCurveDef::eInterpolationLinear
416 : FbxAnimCurveDef::eInterpolationCubic);
417 t_curve_z->KeyModifyEnd();
422 FbxAnimCurve* r_curve_x = skeleton[b]->LclRotation.GetCurve(
423 anim_layer, FBXSDK_CURVENODE_COMPONENT_X,
true);
424 FbxAnimCurve* r_curve_y = skeleton[b]->LclRotation.GetCurve(
425 anim_layer, FBXSDK_CURVENODE_COMPONENT_Y,
true);
426 FbxAnimCurve* r_curve_z = skeleton[b]->LclRotation.GetCurve(
427 anim_layer, FBXSDK_CURVENODE_COMPONENT_Z,
true);
431 auto x = glm::degrees(r.x);
432 auto y = glm::degrees(r.y);
433 auto z = glm::degrees(r.z);
435 r_curve_x->KeyModifyBegin();
436 int key_index = r_curve_x->KeyAdd(time);
437 r_curve_x->KeySetValue(key_index, x);
439 ? FbxAnimCurveDef::eInterpolationLinear
440 : FbxAnimCurveDef::eInterpolationCubic);
441 r_curve_x->KeyModifyEnd();
443 r_curve_y->KeyModifyBegin();
444 key_index = r_curve_y->KeyAdd(time);
445 r_curve_y->KeySetValue(key_index, y);
447 ? FbxAnimCurveDef::eInterpolationLinear
448 : FbxAnimCurveDef::eInterpolationCubic);
449 r_curve_y->KeyModifyEnd();
451 r_curve_z->KeyModifyBegin();
452 key_index = r_curve_z->KeyAdd(time);
453 r_curve_z->KeySetValue(key_index, z);
455 ? FbxAnimCurveDef::eInterpolationLinear
456 : FbxAnimCurveDef::eInterpolationCubic);
457 r_curve_z->KeyModifyEnd();
462 FbxAnimCurve* s_curve_x = skeleton[b]->LclScaling.GetCurve(
463 anim_layer, FBXSDK_CURVENODE_COMPONENT_X,
true);
464 FbxAnimCurve* s_curve_y = skeleton[b]->LclScaling.GetCurve(
465 anim_layer, FBXSDK_CURVENODE_COMPONENT_Y,
true);
466 FbxAnimCurve* s_curve_z = skeleton[b]->LclScaling.GetCurve(
467 anim_layer, FBXSDK_CURVENODE_COMPONENT_Z,
true);
471 s_curve_x->KeyModifyBegin();
472 int key_index = s_curve_x->KeyAdd(time);
473 s_curve_x->KeySetValue(key_index, v.x);
475 ? FbxAnimCurveDef::eInterpolationLinear
476 : FbxAnimCurveDef::eInterpolationCubic);
477 s_curve_x->KeyModifyEnd();
479 s_curve_y->KeyModifyBegin();
480 key_index = s_curve_y->KeyAdd(time);
481 s_curve_y->KeySetValue(key_index, v.y);
483 ? FbxAnimCurveDef::eInterpolationLinear
484 : FbxAnimCurveDef::eInterpolationCubic);
485 s_curve_y->KeyModifyEnd();
487 s_curve_z->KeyModifyBegin();
488 key_index = s_curve_z->KeyAdd(time);
489 s_curve_z->KeySetValue(key_index, v.z);
491 ? FbxAnimCurveDef::eInterpolationLinear
492 : FbxAnimCurveDef::eInterpolationCubic);
493 s_curve_z->KeyModifyEnd();