void Model::processMeshTextCoords(FbxMesh *mesh, Vertex *verts, int numVerts) { int matCount = mesh->GetElementMaterialCount(); FbxLayerElementMaterial *matElem = NULL; if (matCount) //only supporting 1 material layer max matElem = mesh->GetElementMaterial(0); int polCount = mesh->GetPolygonCount(); for (int polInd = 0; polInd < polCount; polInd++) { int textureId = 0; if (matElem) { textureId = matElem->GetIndexArray().GetAt(polInd); } for (unsigned polVert = 0; polVert < 3; polVert++) { int cornerIndex = mesh->GetPolygonVertex(polInd, polVert); FbxVector2 UV = FbxVector2(0, 0); FbxLayer *layer = mesh->GetLayer(0); FbxLayerElementUV *layerUV = layer->GetUVs(); FbxLayerElementTexture *layerTexture = layer->GetTextures(FbxLayerElement::eTextureDiffuse); if (layerUV) { int UVindex = 0; switch (layerUV->GetMappingMode()) { case FbxLayerElement::eByControlPoint: UVindex = cornerIndex; break; case FbxLayerElement::eByPolygonVertex: UVindex = mesh->GetTextureUVIndex(polInd, polVert, FbxLayerElement::eTextureDiffuse); break; case FbxLayerElement::eByPolygon: UVindex = polInd; break; } UV = layerUV->GetDirectArray().GetAt(UVindex); verts[cornerIndex].color.x = textureId; verts[cornerIndex].texture.x = UV[0]; verts[cornerIndex].texture.y = 1.f - UV[1]; } } } }
BTHFBX_VEC2 FBXScene::GetTexCoord(FbxMesh* pFBXMesh, int nLayerIndex, int nPolygonIndex, int nPolygonVertexIndex, int nVertexIndex) { int nLayerCount = pFBXMesh->GetLayerCount(); if( nLayerIndex < nLayerCount )//for( int i = 0; i < nLayerCount; ++i ) { FbxLayer* pFBXLayer = pFBXMesh->GetLayer(nLayerIndex); if( pFBXLayer ) { FbxLayerElementUV* pUVs = pFBXLayer->GetUVs(FbxLayerElement::EType::eTextureDiffuse); if( pUVs ) { FbxLayerElement::EMappingMode mappingMode = pUVs->GetMappingMode(); FbxLayerElement::EReferenceMode referenceMode = pUVs->GetReferenceMode(); const FbxLayerElementArrayTemplate<FbxVector2>& pUVArray = pUVs->GetDirectArray(); const FbxLayerElementArrayTemplate<int>& pUVIndexArray = pUVs->GetIndexArray(); switch(mappingMode) { case FbxLayerElement::eByControlPoint: { int nMappingIndex = nVertexIndex; switch(referenceMode) { case FbxLayerElement::eDirect: if( nMappingIndex < pUVArray.GetCount() ) { return FBXTexCoordToD3DTexCoord( KFbxVector2ToBTHFBX_VEC2( pUVArray.GetAt(nMappingIndex) ) ); } break; case FbxLayerElement::eIndexToDirect: if( nMappingIndex < pUVIndexArray.GetCount() ) { int nIndex = pUVIndexArray.GetAt(nMappingIndex); if( nIndex < pUVArray.GetCount() ) { return FBXTexCoordToD3DTexCoord( KFbxVector2ToBTHFBX_VEC2( pUVArray.GetAt(nIndex) ) ); } } break; }; } break; case FbxLayerElement::eByPolygonVertex: { int nMappingIndex = pFBXMesh->GetTextureUVIndex(nPolygonIndex, nPolygonVertexIndex, FbxLayerElement::eTextureDiffuse); switch(referenceMode) { case FbxLayerElement::EReferenceMode::eDirect: case FbxLayerElement::EReferenceMode::eIndexToDirect: //I have no idea why the index array is not used in this case. if( nMappingIndex < pUVArray.GetCount() ) { return FBXTexCoordToD3DTexCoord( KFbxVector2ToBTHFBX_VEC2( pUVArray.GetAt(nMappingIndex) ) ); } break; }; } break; }; } } } return BTHFBX_VEC2(); }
void FbxLoader::LoadAttribute(FbxNodeAttribute* pAttribute) { if (pAttribute->GetAttributeType() == FbxNodeAttribute::eMesh) { FbxMesh* pMesh = (FbxMesh*)pAttribute; FbxVector4* IControlPoints = pMesh->GetControlPoints(); m_vertexCount = pMesh->GetControlPointsCount(); m_vertexBuffer = new float[m_vertexCount * 4]; for (int i = 0; i < m_vertexCount * 4; i+=4) { m_vertexBuffer[i] = (float)IControlPoints[i / 4].mData[0]; m_vertexBuffer[i + 1] = (float)IControlPoints[i / 4].mData[1]; m_vertexBuffer[i + 2] = (float)IControlPoints[i / 4].mData[2]; m_vertexBuffer[i + 3] = 1.0f;// IControlPoints[i / 4].mData[3]; } int* pIndices = pMesh->GetPolygonVertices(); m_indexCount = pMesh->GetPolygonVertexCount(); m_indexBuffer = new uint32[m_indexCount]; for (int i = 0; i < m_indexCount; ++i) { m_indexBuffer[i] = pIndices[i]; } FbxLayer* pLayer = pMesh->GetLayer(0); if (pLayer != NULL) { FbxLayerElementNormal* pNormal = pLayer->GetNormals(); m_normalCount = pNormal->mDirectArray->GetCount(); m_normalBuffer = new float[m_normalCount * 3]; for (int i = 0; i < m_normalCount * 3; i+=3) { m_normalBuffer[i] = (float)(*pNormal->mDirectArray)[i / 3][0]; m_normalBuffer[i + 1] = (float)(*pNormal->mDirectArray)[i / 3][1]; m_normalBuffer[i + 2] = (float)(*pNormal->mDirectArray)[i / 3][2]; //m_normalBuffer[i + 3] = (*pNormal->mDirectArray)[i / 4][3]; } FbxLayerElementUV* pUV = pLayer->GetUVs(); if (pUV->GetMappingMode() == FbxLayerElement::eByPolygonVertex) { if (pUV->GetReferenceMode() == FbxLayerElement::eIndexToDirect) { m_uvCount = pUV->mIndexArray->GetCount(); m_uvBuffer = new float[m_uvCount * 2]; for (int i = 0; i < m_uvCount * 2; i+=2) { m_uvBuffer[i] = (float)(*pUV->mDirectArray)[(*pUV->mIndexArray)[i / 2]][0]; m_uvBuffer[i + 1] = (float)(*pUV->mDirectArray)[(*pUV->mIndexArray)[i / 2]][1]; } } else { m_uvCount = pUV->mDirectArray->GetCount(); m_uvBuffer = new float[m_uvCount * 2]; for (int i = 0; i < m_uvCount * 2; i += 2) { m_uvBuffer[i] = (float)(*pUV->mDirectArray)[i / 2][0]; m_uvBuffer[i + 1] = (float)(*pUV->mDirectArray)[i / 2][1]; } } } else { if (pUV->GetReferenceMode() == FbxLayerElement::eIndexToDirect) { m_uvCount = pUV->mIndexArray->GetCount(); m_uvBuffer = new float[m_uvCount * 2]; for (int i = 0; i < m_uvCount * 2; i+=2) { m_uvBuffer[i] = (float)(*pUV->mDirectArray)[(*pUV->mIndexArray)[i / 2]][0]; m_uvBuffer[i + 1] = (float)(*pUV->mDirectArray)[(*pUV->mIndexArray)[i / 2]][1]; } } else { m_uvCount = pUV->mDirectArray->GetCount(); m_uvBuffer = new float[m_uvCount * 2]; for (int i = 0; i < m_uvCount * 2; i+=2) { m_uvBuffer[i] = (float)(*pUV->mDirectArray)[i / 2][0]; m_uvBuffer[i + 1] = (float)(*pUV->mDirectArray)[i / 2][1]; } } } } } }