reMaterial* reFBXAsset::getMaterial( FbxMesh* fmesh, int i, reMaterialSet& set) { reMaterial* mat = NULL; for (int l = 0; l < fmesh->GetElementMaterialCount(); l++) { FbxGeometryElementMaterial* lMaterialElement = fmesh->GetElementMaterial(l); int lMatId = lMaterialElement->GetIndexArray().GetAt(i); if(lMatId >= 0) { if (mat = set.materialById(lMatId)) return mat; mat = new reMaterial; mat->id = lMatId; set.addMetarial(mat); FbxSurfaceMaterial* lMaterial = fmesh->GetNode()->GetMaterial(lMaterialElement->GetIndexArray().GetAt(i)); if (!lMaterial) { continue; } ////////////////////////////////////////////////////////////////////////// FbxProperty lProperty = lMaterial->FindProperty(FbxSurfaceMaterial::sDiffuse); if (lMaterial->GetClassId().Is(FbxSurfacePhong::ClassId)) { FbxDouble3 lFbxDouble3; lFbxDouble3 =((FbxSurfacePhong *)lMaterial)->Diffuse; mat->diffuseColor = reColor4(lFbxDouble3[0], lFbxDouble3[1], lFbxDouble3[2], 1); } if (lMaterial->GetClassId().Is(FbxSurfaceLambert::ClassId)) { FbxDouble3 lFbxDouble3; lFbxDouble3 =((FbxSurfaceLambert *)lMaterial)->Diffuse; mat->diffuseColor = reColor4(lFbxDouble3[0], lFbxDouble3[1], lFbxDouble3[2], 1); } ////////////////////////////////////////////////////////////////////////// read texture int lNbTextures = lProperty.GetSrcObjectCount(FbxTexture::ClassId); if (lNbTextures) { mat->diffuseTexture = new reTexture; FbxTexture* lTexture = FbxCast <FbxTexture> (lProperty.GetSrcObject(FbxTexture::ClassId,0)); qDebug() << "map: " << lTexture->GetName(); FbxFileTexture *lFileTexture = FbxCast<FbxFileTexture>(lTexture); if (lFileTexture) { mat->diffuseTexture->fileName(lFileTexture->GetFileName()); } } ////////////////////////////////////////////////////////////////////////// } } return mat; }
//------------------------------------------------------------------------- // //------------------------------------------------------------------------- bool UnFbx::FFbxImporter::CreateAndLinkExpressionForMaterialProperty( FbxSurfaceMaterial& FbxMaterial, UMaterial* UnrealMaterial, const char* MaterialProperty , FExpressionInput& MaterialInput, bool bSetupAsNormalMap, TArray<FString>& UVSet ) { bool bCreated = false; FbxProperty FbxProperty = FbxMaterial.FindProperty( MaterialProperty ); if( FbxProperty.IsValid() ) { int32 LayeredTextureCount = FbxProperty.GetSrcObjectCount(FbxLayeredTexture::ClassId); if (LayeredTextureCount>0) { UE_LOG(LogFbxMaterialImport, Warning,TEXT("Layered TEXTures are not supported (material %s)"),ANSI_TO_TCHAR(FbxMaterial.GetName())); } else { int32 TextureCount = FbxProperty.GetSrcObjectCount(FbxTexture::ClassId); if (TextureCount>0) { for(int32 TextureIndex =0; TextureIndex<TextureCount; ++TextureIndex) { FbxFileTexture* FbxTexture = FbxProperty.GetSrcObject(FBX_TYPE(FbxFileTexture), TextureIndex); // create an unreal texture asset UTexture* UnrealTexture = ImportTexture(FbxTexture, bSetupAsNormalMap); if (UnrealTexture) { // and link it to the material UMaterialExpressionTextureSample* UnrealTextureExpression = ConstructObject<UMaterialExpressionTextureSample>( UMaterialExpressionTextureSample::StaticClass(), UnrealMaterial ); UnrealMaterial->Expressions.Add( UnrealTextureExpression ); MaterialInput.Expression = UnrealTextureExpression; UnrealTextureExpression->Texture = UnrealTexture; UnrealTextureExpression->SamplerType = bSetupAsNormalMap ? SAMPLERTYPE_Normal : SAMPLERTYPE_Color; // add/find UVSet and set it to the texture FbxString UVSetName = FbxTexture->UVSet.Get(); FString LocalUVSetName = ANSI_TO_TCHAR(UVSetName.Buffer()); int32 SetIndex = UVSet.Find(LocalUVSetName); UMaterialExpressionTextureCoordinate* MyCoordExpression = ConstructObject<UMaterialExpressionTextureCoordinate>( UMaterialExpressionTextureCoordinate::StaticClass(), UnrealMaterial ); UnrealMaterial->Expressions.Add( MyCoordExpression ); MyCoordExpression->CoordinateIndex = (SetIndex >= 0)? SetIndex: 0; UnrealTextureExpression->Coordinates.Expression = MyCoordExpression; if ( !bSetupAsNormalMap ) { UnrealMaterial->BaseColor.Expression = UnrealTextureExpression; } else { UnrealMaterial->Normal.Expression = UnrealTextureExpression; } bCreated = true; } } } if (MaterialInput.Expression) { TArray<FExpressionOutput> Outputs = MaterialInput.Expression->GetOutputs(); FExpressionOutput* Output = Outputs.GetTypedData(); MaterialInput.Mask = Output->Mask; MaterialInput.MaskR = Output->MaskR; MaterialInput.MaskG = Output->MaskG; MaterialInput.MaskB = Output->MaskB; MaterialInput.MaskA = Output->MaskA; } } } return bCreated; }
void UnFbx::FFbxImporter::ImportTexturesFromNode(FbxNode* Node) { FbxProperty Property; int32 NbMat = Node->GetMaterialCount(); // visit all materials int32 MaterialIndex; for (MaterialIndex = 0; MaterialIndex < NbMat; MaterialIndex++) { FbxSurfaceMaterial *Material = Node->GetMaterial(MaterialIndex); //go through all the possible textures if(Material) { int32 TextureIndex; FBXSDK_FOR_EACH_TEXTURE(TextureIndex) { Property = Material->FindProperty(FbxLayerElement::sTextureChannelNames[TextureIndex]); if( Property.IsValid() ) { FbxTexture * lTexture= NULL; //Here we have to check if it's layered textures, or just textures: int32 LayeredTextureCount = Property.GetSrcObjectCount(FbxLayeredTexture::ClassId); FbxString PropertyName = Property.GetName(); if(LayeredTextureCount > 0) { for(int32 LayerIndex=0; LayerIndex<LayeredTextureCount; ++LayerIndex) { FbxLayeredTexture *lLayeredTexture = FbxCast <FbxLayeredTexture>(Property.GetSrcObject(FbxLayeredTexture::ClassId, LayerIndex)); int32 NbTextures = lLayeredTexture->GetSrcObjectCount(FbxTexture::ClassId); for(int32 TexIndex =0; TexIndex<NbTextures; ++TexIndex) { FbxFileTexture* Texture = FbxCast <FbxFileTexture> (lLayeredTexture->GetSrcObject(FbxFileTexture::ClassId,TexIndex)); if(Texture) { ImportTexture(Texture, PropertyName == FbxSurfaceMaterial::sNormalMap || PropertyName == FbxSurfaceMaterial::sBump); } } } } else { //no layered texture simply get on the property int32 NbTextures = Property.GetSrcObjectCount(FbxTexture::ClassId); for(int32 TexIndex =0; TexIndex<NbTextures; ++TexIndex) { FbxFileTexture* Texture = FbxCast <FbxFileTexture> (Property.GetSrcObject(FbxFileTexture::ClassId,TexIndex)); if(Texture) { ImportTexture(Texture, PropertyName == FbxSurfaceMaterial::sNormalMap || PropertyName == FbxSurfaceMaterial::sBump); } } } } } }//end if(Material) }// end for MaterialIndex }