bool ColladaMeshFactory::LoadModelWithFilePath( RevModel** aModel, const char* aFilePath ) { FCDocument* colladDoc; colladDoc=FCollada::NewTopDocument(); bool sucess=FCollada::LoadDocumentFromFile(colladDoc, aFilePath ); if(sucess==false) return(false); if(colladDoc==NULL) return(false); FCDGeometryLibrary* geometryLibrary=colladDoc->GetGeometryLibrary(); unsigned int numberOfMeshes=0; for (unsigned int i=0; i< geometryLibrary->GetEntityCount(); i++) { if (geometryLibrary->GetEntity(i)->IsMesh()==true) { numberOfMeshes++; } } BuildHierarchy(colladDoc,aModel, colladDoc->GetVisualSceneInstance()); CU::Matrix44f mayaAdapter,temp; mayaAdapter.myMatrix[0][0]=-1; (*aModel)->SetBaseModelMatrix( mayaAdapter ); //aModelNode->myTransformationNode->SetOrientation(temp); return(true); }
void ColladaMeshFactory::LoadRoomFromFilePath( const char* aFilePath, std::vector< RevRoom* >& aRefContainer ) { FCDocument* colladDoc; colladDoc=FCollada::NewTopDocument(); bool sucess=FCollada::LoadDocumentFromFile(colladDoc, aFilePath ); if(sucess==false) return; if(colladDoc==NULL) return; FCDGeometryLibrary* geometryLibrary=colladDoc->GetGeometryLibrary(); unsigned int numberOfMeshes=0; for (unsigned int i=0; i< geometryLibrary->GetEntityCount(); i++) { if (geometryLibrary->GetEntity(i)->IsMesh()==true) { numberOfMeshes++; } } BuildHierachyRoom(colladDoc,aRefContainer, colladDoc->GetVisualSceneInstance()); //aModelNode->myTransformationNode->SetOrientation(temp); }
/* * Save an Asset as a Collada document */ bool SaveAssetAsCollada(IAsset* pAsset, std::wstring filename) { FCDocument fcDoc; FCDGeometry* pGeo; FCDGeometryLibrary* pGeoLib; FCDGeometryMesh* pGeoMesh; unsigned int count = 0; float* pData = 0; pGeoLib = fcDoc.GetGeometryLibrary(); pGeo = pGeoLib->AddEntity(); /* Add geometry data for each mesh to the DOM tree */ for(int i = 0; i < pAsset->GetMeshCount(); ++i) { pGeoMesh = pGeo->CreateMesh(); pData = pAsset->GetVertexPositions(i, count); AddGeometryData(pGeoMesh, pData, count, POSITION); pData = pAsset->GetVertexIndices(i, count); AddGeometryData(pGeoMesh, pData, count, VERTEX); pData = pAsset->GetTextureCoords(i, count); AddGeometryData(pGeoMesh, pData, count, TEXCOORD); } if ( !FCollada::SaveDocument(&fcDoc, filename.c_str()) ) printf("Save unsuccessful.\n"); else printf("Saved asset as %ls\n", filename.c_str()); }
void SaveTest() { FCDocument* pDoc; pDoc = FCollada::NewDocument(); FCDVersion ver = pDoc->GetVersion(); printf("FCollada Version: %u\n", FCollada::GetVersion()); printf("FCDocument Version: %d.%d r%d\n", ver.major, ver.minor, ver.revision); wchar_t* filename = L"test.dae"; if ( !FCollada::SaveDocument(pDoc, filename) ) printf("Unsuccessful save.\n"); else printf("Saved %ls\n", filename); }
int main(int argc, const char* argv[], char* envp[]) { #ifdef WIN32 _environ = envp; #else //LINUX environ = envp; #endif //WIN32 and LINUX if (argc != 3) { std::cout << "Expecting two arguments:" << std::endl; std::cout << "FCProcessImages.exe <input_filename> <output_filename>" <<std::endl; exit(-1); } fstring inputFilename = TO_FSTRING(argv[1]); fstring outputFilename = TO_FSTRING(argv[2]); // Create an empty COLLADA document and import the given file. FCollada::Initialize(); FUErrorSimpleHandler errorHandler; FCDocument* document = FCollada::NewTopDocument(); FCollada::LoadDocumentFromFile(document, inputFilename.c_str()); std::cout << argv[1] << std::endl; if (errorHandler.IsSuccessful()) { std::cout << "Import: Done." << std::endl; // Initialize DevIL. ilInit(); iluInit(); // Process the image library ProcessImageLibrary(document->GetImageLibrary()); // Shutdown DevIL ilShutDown(); // It is common practice for tools to add a new contributor to identify that they were run // on a COLLADA document. FCDAssetContributor* contributor = document->GetAsset()->AddContributor(); const char* userName = getenv("USER"); if (userName == NULL) userName = getenv("USERNAME"); if (userName != NULL) contributor->SetAuthor(TO_FSTRING(userName)); contributor->SetSourceData(inputFilename); char authoringTool[1024]; snprintf(authoringTool, 1024, "FCProcessImages sample for FCollada v%d.%02d", FCOLLADA_VERSION >> 16, FCOLLADA_VERSION & 0xFFFF); authoringTool[1023] = 0; contributor->SetAuthoringTool(TO_FSTRING((const char*)authoringTool)); // Write out the processed COLLADA document. FCollada::SaveDocument(document, outputFilename.c_str()); if (errorHandler.IsSuccessful()) { std::cout << "Export: Done." << std::endl; } else { std::cout << errorHandler.GetErrorString(); std::cout << std::endl << std::endl; } }
bool CModelConverter::ReadDAE(const tstring& sFilename) { if (m_pWorkListener) m_pWorkListener->BeginProgress(); FCollada::Initialize(); FCDocument* pDoc = FCollada::NewTopDocument(); if (m_pWorkListener) m_pWorkListener->SetAction("Reading file", 0); if (FCollada::LoadDocumentFromFile(pDoc, convert_to_fstring(sFilename))) { size_t i; FCDocumentTools::StandardizeUpAxisAndLength(pDoc, FMVector3(0, 1, 0)); FCDMaterialLibrary* pMatLib = pDoc->GetMaterialLibrary(); size_t iEntities = pMatLib->GetEntityCount(); if (m_pWorkListener) m_pWorkListener->SetAction("Reading materials", iEntities); for (i = 0; i < iEntities; ++i) { FCDMaterial* pColladaMaterial = pMatLib->GetEntity(i); FCDEffect* pEffect = pColladaMaterial->GetEffect(); size_t iMaterial = m_pScene->AddMaterial(convert_from_fstring(pColladaMaterial->GetName())); CConversionMaterial* pMaterial = m_pScene->GetMaterial(iMaterial); if (pEffect->GetProfileCount() < 1) continue; FCDEffectProfile* pEffectProfile = pEffect->GetProfile(0); FUDaeProfileType::Type eProfileType = pEffectProfile->GetType(); if (eProfileType == FUDaeProfileType::COMMON) { FCDEffectStandard* pStandardProfile = dynamic_cast<FCDEffectStandard*>(pEffectProfile); if (pStandardProfile) { pMaterial->m_vecAmbient = Vector((float*)pStandardProfile->GetAmbientColor()); pMaterial->m_vecDiffuse = Vector((float*)pStandardProfile->GetDiffuseColor()); pMaterial->m_vecSpecular = Vector((float*)pStandardProfile->GetSpecularColor()); pMaterial->m_vecEmissive = Vector((float*)pStandardProfile->GetEmissionColor()); pMaterial->m_flShininess = pStandardProfile->GetShininess(); } } for (size_t j = 0; j < pEffectProfile->GetEffectParameterCount(); j++) { FCDEffectParameter* pEffectParameter = pEffectProfile->GetEffectParameter(j); FCDEffectParameter::Type eType = pEffectParameter->GetType(); if (eType == FCDEffectParameter::SAMPLER) { FCDEffectParameterSampler* pSampler = dynamic_cast<FCDEffectParameterSampler*>(pEffectParameter); if (pSampler) { FCDEffectParameterSurface* pSurface = pSampler->GetSurface(); if (pSurface) { if (pSurface->GetImageCount()) { // Christ Collada why do you have to make things so damn complicated? FCDImage* pImage = pSurface->GetImage(0); pMaterial->m_sDiffuseTexture = convert_from_fstring(pImage->GetFilename()); // Fix up a bug in the Max Collada exporter if (pMaterial->m_sDiffuseTexture.startswith("\\\\C\\")) pMaterial->m_sDiffuseTexture = "C:\\" + pMaterial->m_sDiffuseTexture.substr(4); else if (pMaterial->m_sDiffuseTexture.startswith("\\\\D\\")) pMaterial->m_sDiffuseTexture = "D:\\" + pMaterial->m_sDiffuseTexture.substr(4); } } } } } if (m_pWorkListener) m_pWorkListener->WorkProgress(i+1); } FCDGeometryLibrary* pGeoLib = pDoc->GetGeometryLibrary(); iEntities = pGeoLib->GetEntityCount(); if (m_pWorkListener) m_pWorkListener->SetAction("Loading entities", iEntities); for (i = 0; i < iEntities; ++i) { FCDGeometry* pGeometry = pGeoLib->GetEntity(i); if (pGeometry->IsMesh()) { size_t j; size_t iMesh = m_pScene->AddMesh(convert_from_fstring(pGeometry->GetName())); CConversionMesh* pMesh = m_pScene->GetMesh(iMesh); pMesh->AddBone(convert_from_fstring(pGeometry->GetName())); FCDGeometryMesh* pGeoMesh = pGeometry->GetMesh(); FCDGeometrySource* pPositionSource = pGeoMesh->GetPositionSource(); size_t iVertexCount = pPositionSource->GetValueCount(); for (j = 0; j < iVertexCount; j++) { const float* pflValues = pPositionSource->GetValue(j); pMesh->AddVertex(pflValues[0], pflValues[1], pflValues[2]); } FCDGeometrySource* pNormalSource = pGeoMesh->FindSourceByType(FUDaeGeometryInput::NORMAL); if (pNormalSource) { iVertexCount = pNormalSource->GetValueCount(); for (j = 0; j < iVertexCount; j++) { const float* pflValues = pNormalSource->GetValue(j); pMesh->AddNormal(pflValues[0], pflValues[1], pflValues[2]); } } FCDGeometrySource* pUVSource = pGeoMesh->FindSourceByType(FUDaeGeometryInput::TEXCOORD); if (pUVSource) { iVertexCount = pUVSource->GetValueCount(); for (j = 0; j < iVertexCount; j++) { const float* pflValues = pUVSource->GetValue(j); pMesh->AddUV(pflValues[0], pflValues[1]); } } for (j = 0; j < pGeoMesh->GetPolygonsCount(); j++) { FCDGeometryPolygons* pPolygons = pGeoMesh->GetPolygons(j); FCDGeometryPolygonsInput* pPositionInput = pPolygons->FindInput(FUDaeGeometryInput::POSITION); FCDGeometryPolygonsInput* pNormalInput = pPolygons->FindInput(FUDaeGeometryInput::NORMAL); FCDGeometryPolygonsInput* pUVInput = pPolygons->FindInput(FUDaeGeometryInput::TEXCOORD); size_t iPositionCount = pPositionInput->GetIndexCount(); uint32* pPositions = pPositionInput->GetIndices(); size_t iNormalCount = 0; uint32* pNormals = NULL; if (pNormalInput) { iNormalCount = pNormalInput->GetIndexCount(); pNormals = pNormalInput->GetIndices(); } size_t iUVCount = 0; uint32* pUVs = NULL; if (pUVInput) { iUVCount = pUVInput->GetIndexCount(); pUVs = pUVInput->GetIndices(); } fm::stringT<fchar> sMaterial = pPolygons->GetMaterialSemantic(); size_t iCurrentMaterial = pMesh->AddMaterialStub(convert_from_fstring(sMaterial)); if (pPolygons->TestPolyType() == 3) { // All triangles! for (size_t k = 0; k < iPositionCount; k+=3) { size_t iFace = pMesh->AddFace(iCurrentMaterial); pMesh->AddVertexToFace(iFace, pPositions[k+0], pUVs?pUVs[k+0]:~0, pNormals?pNormals[k+0]:~0); pMesh->AddVertexToFace(iFace, pPositions[k+1], pUVs?pUVs[k+1]:~0, pNormals?pNormals[k+1]:~0); pMesh->AddVertexToFace(iFace, pPositions[k+2], pUVs?pUVs[k+2]:~0, pNormals?pNormals[k+2]:~0); } } else if (pPolygons->TestPolyType() == 4) { // All quads! for (size_t k = 0; k < iPositionCount; k+=4) { size_t iFace = pMesh->AddFace(iCurrentMaterial); pMesh->AddVertexToFace(iFace, pPositions[k+0], pUVs?pUVs[k+0]:~0, pNormals?pNormals[k+0]:~0); pMesh->AddVertexToFace(iFace, pPositions[k+1], pUVs?pUVs[k+1]:~0, pNormals?pNormals[k+1]:~0); pMesh->AddVertexToFace(iFace, pPositions[k+2], pUVs?pUVs[k+2]:~0, pNormals?pNormals[k+2]:~0); pMesh->AddVertexToFace(iFace, pPositions[k+3], pUVs?pUVs[k+3]:~0, pNormals?pNormals[k+3]:~0); } } else { size_t iFaces = pPolygons->GetFaceCount(); for (size_t k = 0; k < iFaces; k++) { size_t iFace = pMesh->AddFace(iCurrentMaterial); size_t o = pPolygons->GetFaceVertexOffset(k); size_t iFaceVertexCount = pPolygons->GetFaceVertexCount(k); for (size_t v = 0; v < iFaceVertexCount; v++) pMesh->AddVertexToFace(iFace, pPositions[o+v], pUVs?pUVs[o+v]:~0, pNormals?pNormals[o+v]:~0); } } } } if (m_pWorkListener) m_pWorkListener->WorkProgress(i+1); } FCDVisualSceneNodeLibrary* pVisualScenes = pDoc->GetVisualSceneLibrary(); iEntities = pVisualScenes->GetEntityCount(); for (i = 0; i < iEntities; ++i) { FCDSceneNode* pNode = pVisualScenes->GetEntity(i); size_t iScene = m_pScene->AddScene(convert_from_fstring(pNode->GetName())); ReadDAESceneTree(pNode, m_pScene->GetScene(iScene)); } } else { printf("Oops! Some kind of error happened!\n"); return false; } m_pScene->SetWorkListener(m_pWorkListener); m_pScene->CalculateExtends(); for (size_t i = 0; i < m_pScene->GetNumMeshes(); i++) { if (m_bWantEdges) m_pScene->GetMesh(i)->CalculateEdgeData(); if (m_pScene->GetMesh(i)->GetNumNormals() == 0) m_pScene->GetMesh(i)->CalculateVertexNormals(); m_pScene->GetMesh(i)->CalculateVertexTangents(); } pDoc->Release(); FCollada::Release(); if (m_pWorkListener) m_pWorkListener->EndProgress(); return true; }
void CModelConverter::SaveDAE(const tstring& sFilename) { if (m_pWorkListener) m_pWorkListener->BeginProgress(); FCollada::Initialize(); FCDocument* pDoc = FCollada::NewTopDocument(); FCDocumentTools::StandardizeUpAxisAndLength(pDoc, FMVector3(0, 1, 0)); FCDAsset* pAsset = pDoc->GetAsset(); FCDAssetContributor* pContributor = pAsset->AddContributor(); pContributor->SetAuthoringTool(fstring_literal("Created by SMAK using FCollada")); FCDMaterialLibrary* pMatLib = pDoc->GetMaterialLibrary(); if (m_pWorkListener) m_pWorkListener->SetAction("Saving materials", m_pScene->GetNumMaterials()); for (size_t iMaterial = 0; iMaterial < m_pScene->GetNumMaterials(); iMaterial++) { CConversionMaterial* pConversionMaterial = m_pScene->GetMaterial(iMaterial); FCDMaterial* pColladaMaterial = pMatLib->AddEntity(); pColladaMaterial->SetName(convert_to_fstring(pConversionMaterial->GetName())); FCDEffect* pEffect = pMatLib->GetDocument()->GetEffectLibrary()->AddEntity(); pColladaMaterial->SetEffect(pEffect); FCDEffectProfile* pEffectProfile = pEffect->AddProfile(FUDaeProfileType::COMMON); pEffect->SetName(convert_to_fstring(pConversionMaterial->GetName())); FCDEffectStandard* pStandardProfile = dynamic_cast<FCDEffectStandard*>(pEffectProfile); if (pStandardProfile) { pStandardProfile->SetLightingType(FCDEffectStandard::PHONG); pStandardProfile->SetAmbientColor(FMVector4(FMVector3((float*)pConversionMaterial->m_vecAmbient), 1)); pStandardProfile->SetDiffuseColor(FMVector4(FMVector3((float*)pConversionMaterial->m_vecDiffuse), 1)); pStandardProfile->SetSpecularColor(FMVector4(FMVector3((float*)pConversionMaterial->m_vecSpecular), 1)); pStandardProfile->SetEmissionColor(FMVector4(FMVector3((float*)pConversionMaterial->m_vecEmissive), 1)); pStandardProfile->SetShininess(pConversionMaterial->m_flShininess); } if (pConversionMaterial->GetDiffuseTexture().length()) { FCDEffectParameter* pEffectParameterSampler = pEffectProfile->AddEffectParameter(FCDEffectParameter::SAMPLER); FCDEffectParameter* pEffectParameterSurface = pEffectProfile->AddEffectParameter(FCDEffectParameter::SURFACE); FCDEffectParameterSampler* pSampler = dynamic_cast<FCDEffectParameterSampler*>(pEffectParameterSampler); FCDEffectParameterSurface* pSurface = dynamic_cast<FCDEffectParameterSurface*>(pEffectParameterSurface); FCDImage* pSurfaceImage = pMatLib->GetDocument()->GetImageLibrary()->AddEntity(); pSurfaceImage->SetFilename(convert_to_fstring(pConversionMaterial->GetDiffuseTexture())); pSurface->SetInitMethod(new FCDEffectParameterSurfaceInitFrom()); pSurface->AddImage(pSurfaceImage); pSurface->SetReference((pConversionMaterial->GetName() + "-surface").c_str()); pSampler->SetSurface(pSurface); } if (m_pWorkListener) m_pWorkListener->WorkProgress(iMaterial); } if (m_pWorkListener) m_pWorkListener->SetAction("Saving geometry", m_pScene->GetNumMeshes()); FCDGeometryLibrary* pGeoLib = pDoc->GetGeometryLibrary(); for (size_t i = 0; i < m_pScene->GetNumMeshes(); ++i) { CConversionMesh* pConversionMesh = m_pScene->GetMesh(i); FCDGeometry* pGeometry = pGeoLib->AddEntity(); pGeometry->SetName(convert_to_fstring(pConversionMesh->GetName())); pGeometry->CreateMesh(); FCDGeometryMesh* pMesh = pGeometry->GetMesh(); FCDGeometrySource* pPositionSource = pMesh->AddSource(FUDaeGeometryInput::POSITION); pPositionSource->SetName(convert_to_fstring(pConversionMesh->GetName() + "-position")); pPositionSource->SetStride(3); pPositionSource->SetValueCount(pConversionMesh->GetNumVertices()); for (size_t j = 0; j < pConversionMesh->GetNumVertices(); j++) pPositionSource->SetValue(j, pConversionMesh->GetVertex(j)); pMesh->AddVertexSource(pPositionSource); FCDGeometrySource* pNormalSource = pMesh->AddSource(FUDaeGeometryInput::NORMAL); pNormalSource->SetName(convert_to_fstring(pConversionMesh->GetName() + "-normal")); pNormalSource->SetStride(3); pNormalSource->SetValueCount(pConversionMesh->GetNumNormals()); for (size_t j = 0; j < pConversionMesh->GetNumNormals(); j++) pNormalSource->SetValue(j, pConversionMesh->GetNormal(j)); FCDGeometrySource* pUVSource = NULL; if (pConversionMesh->GetNumUVs()) { pUVSource = pMesh->AddSource(FUDaeGeometryInput::TEXCOORD); pUVSource->SetName(convert_to_fstring(pConversionMesh->GetName() + "-texcoord")); pUVSource->SetStride(2); pUVSource->SetValueCount(pConversionMesh->GetNumUVs()); for (size_t j = 0; j < pConversionMesh->GetNumUVs(); j++) pUVSource->SetValue(j, pConversionMesh->GetUV(j)); } for (size_t iMaterials = 0; iMaterials < pConversionMesh->GetNumMaterialStubs(); iMaterials++) { CConversionMaterialStub* pStub = pConversionMesh->GetMaterialStub(iMaterials); FCDGeometryPolygons* pPolygons = pMesh->AddPolygons(); pPolygons->SetMaterialSemantic(convert_to_fstring(pStub->GetName())); pPolygons->AddInput(pPositionSource, 0); pPolygons->AddInput(pNormalSource, 1); if (pConversionMesh->GetNumUVs()) pPolygons->AddInput(pUVSource, 2); FCDGeometryPolygonsInput* pPositionInput = pPolygons->FindInput(pPositionSource); FCDGeometryPolygonsInput* pNormalInput = pPolygons->FindInput(pNormalSource); FCDGeometryPolygonsInput* pUVInput = pPolygons->FindInput(pUVSource); for (size_t iFace = 0; iFace < pConversionMesh->GetNumFaces(); iFace++) { CConversionFace* pFace = pConversionMesh->GetFace(iFace); if (pFace->m != iMaterials) continue; pPolygons->AddFaceVertexCount(pFace->GetNumVertices()); for (size_t iVertex = 0; iVertex < pFace->GetNumVertices(); iVertex++) { pPositionInput->AddIndex(pFace->GetVertex(iVertex)->v); pNormalInput->AddIndex(pFace->GetVertex(iVertex)->vn); if (pConversionMesh->GetNumUVs()) pUVInput->AddIndex(pFace->GetVertex(iVertex)->vu); } } } if (m_pWorkListener) m_pWorkListener->WorkProgress(i); } if (m_pWorkListener) m_pWorkListener->SetAction("Saving scenes", m_pScene->GetNumScenes()); FCDVisualSceneNodeLibrary* pVisualScenes = pDoc->GetVisualSceneLibrary(); for (size_t i = 0; i < m_pScene->GetNumScenes(); ++i) { FCDSceneNode* pNode = pVisualScenes->AddEntity(); SaveDAEScene(pNode, m_pScene->GetScene(i)); if (m_pWorkListener) m_pWorkListener->WorkProgress(i); } if (m_pWorkListener) m_pWorkListener->SetAction("Writing to disk...", 0); FCollada::SaveDocument(pDoc, convert_to_fstring(sFilename)); pDoc->Release(); FCollada::Release(); if (m_pWorkListener) m_pWorkListener->EndProgress(); }