Ejemplo n.º 1
0
		void FbxLoader::ComputeNodeMatrix(FbxNode* node, Node& meshNode, bool local)
		{
			if(!node)
				return;
			FbxAnimEvaluator* evaluator = scene->GetAnimationEvaluator();
			FbxAMatrix global;
			global.SetIdentity();

			FbxTime time;
			time.SetSecondDouble(0.0);
			
			if(node != scene->GetRootNode()) {
				if(local) {
					global = evaluator->GetNodeLocalTransform(node, time);
				}
				else {
					global = evaluator->GetNodeGlobalTransform(node, time);
				}
			}
			auto T = global.GetT() * factor;
			
			if(axismode == eLeftHanded) {
				auto R = global.GetR();
				R[1] *= -1; R[2] *= -1;
				T[0] *= -1;
				global.SetR(R);
			}
			global.SetT(T);

			meshNode.matrix = Matrix(
				(float)global[0][0], (float)global[0][1], (float)global[0][2], (float)global[0][3],
				(float)global[1][0], (float)global[1][1], (float)global[1][2], (float)global[1][3],
				(float)global[2][0], (float)global[2][1], (float)global[2][2], (float)global[2][3],
				(float)global[3][0], (float)global[3][1], (float)global[3][2], (float)global[3][3]);
		}
Ejemplo n.º 2
0
void FBXSceneEncoder::loadAnimations(FbxScene* fbxScene, const EncoderArguments& arguments)
{
    FbxAnimEvaluator* evaluator = fbxScene->GetEvaluator();
    if (!evaluator)
        return;
    FbxAnimStack* animStack = evaluator->GetContext();
    if (!animStack)
        return;

    for (int i = 0; i < fbxScene->GetSrcObjectCount<FbxAnimStack>(); ++i)
    {
        FbxAnimStack* animStack = FbxCast<FbxAnimStack>(fbxScene->GetSrcObject<FbxAnimStack>(i));
        int nbAnimLayers = animStack->GetMemberCount<FbxAnimLayer>();
        for (int l = 0; l < nbAnimLayers; ++l)
        {
            FbxAnimLayer* animLayer = animStack->GetMember<FbxAnimLayer>(l);
            loadAnimationLayer(animLayer, fbxScene->GetRootNode(), arguments);
        }
    }
}
Ejemplo n.º 3
0
void CFBXLoader::ComputeNodeMatrix(FbxNode* pNode, FBX_MESH_NODE* meshNode)
{
	if(!pNode || !meshNode)
	{
		return ;
	}

	FbxAnimEvaluator* lEvaluator = mScene->GetAnimationEvaluator();
	FbxMatrix lGlobal;
	lGlobal.SetIdentity();

	if(pNode != mScene->GetRootNode())
	{
		lGlobal= lEvaluator->GetNodeGlobalTransform(pNode);

		FBXMatrixToFloat16( &lGlobal, meshNode->mat4x4 );
	}
	else
	{
		FBXMatrixToFloat16( &lGlobal, meshNode->mat4x4 );
	}
}
Ejemplo n.º 4
0
void FbxParser::ProcessLight(FbxNode* pNode, std::vector<GS::Light*>& lights)
{
   FbxLight* llight = (FbxLight*) pNode->GetNodeAttribute();
   if (!llight)
      return  ;

    // Get the light color.
   FbxDouble3 c = llight->Color.Get();
   GS::float4 lcolor( c[0], c[1], c[2], 1.0 );
   float intensity = llight->Intensity.Get();
   if (intensity)
     lcolor= lcolor*(intensity/100);
  
    // to do so far, we only process directional light
    if (llight->LightType.Get() == FbxLight::eDirectional)
	{
		//FbxDouble3 dir = pNode->LclRotation.Get(); 
		FbxAnimEvaluator* lEvaluator = mpFbxScene->GetAnimationEvaluator();

        FbxAMatrix lGlobal;
        lGlobal= lEvaluator->GetNodeGlobalTransform( pNode);

		FbxVector4 rotation = lGlobal.GetR();

		 FbxVector4 tran = lGlobal.GetT();
		 FbxQuaternion quaternion = lGlobal.GetQ();
		 GS::float4 q(quaternion[0], quaternion[1], quaternion[2],quaternion[3]);
		 GS::float4x4 rotMat = GS::quat_rotation_matrix(q);
		 GS::float4 dir(mul(rotMat, GS::float4(0, 0, -1, 1)));
    /* dir(0,0,-1);
   FbxQuaternion quaternion = lGlobal.GetQ();
   quaternion.
   LcLRotation3f quaternion3f(quaternion[0], quaternion[1], quaternion[2], quaternion[3]);
   LcLTransform3f rot3f(quaternion3f);
   LcLVec3f rot_dir = dir * rot3f;*/
	}
}