bool hkvPrefabAsset::GenerateThumbnail(const char* libraryPath, const char* assetPath, const char* thumbnailPath) { hkStringBuf sFilename(libraryPath); sFilename.pathAppend(assetPath); TiXmlDocument doc; if (!doc.LoadFile(sFilename.cString())) { return true; } if (doc.RootElement() == NULL) return true; // Proceed if any only if there is actually a thumbnail node TiXmlElement* pThumbnailNode = doc.RootElement()->FirstChildElement("thumbnail"); if (pThumbnailNode == NULL) return true; IVFileOutStream* pFile = VFileAccessManager::GetInstance()->Create(thumbnailPath); if (pFile == NULL) return true; int iSize = 0; pThumbnailNode->QueryIntAttribute("size", &iSize); // Convert base64 encoded data back to binary form char* imageData = new char[iSize]; hkXmlObjectReader::base64read(hkIstream(pThumbnailNode->GetText(), (int)strlen(pThumbnailNode->GetText())).getStreamReader(), imageData, iSize); // Write image to disk pFile->Write(imageData, iSize); pFile->Close(); delete[] imageData; return true; }
VBool SaveGame(int iNum) { if ( (iNum < 1) || (iNum > 4) ) { // we just allow 4 save games return FALSE; } int i; char pszSaveFileName[FS_MAX_PATH]; sprintf(pszSaveFileName,SAVEGAME_NAME, iNum); IVFileOutStream* pOut = Vision::File.Create(pszSaveFileName); // creating the file didn't work! if (!pOut) { return FALSE; } VArchive ar( pszSaveFileName, pOut, Vision::GetTypeManager() ); // serialize global game data ar << ARCHIVE_START_TAG; // magic number int iSavingVersion = Vision::GetArchiveVersion(); ar << iSavingVersion; // archive class version ar << g_iCurrentMap; // current map number ar << Vision::GetTimer()->GetTime(); // current time // count entities SerializeBaseEntity_cl *pSerEnt = NULL; VisBaseEntity_cl *pEnt = NULL; int iFullCtr = 0; int iReCreateCtr = 0; int iNumOfAllEntities = VisBaseEntity_cl::ElementManagerGetSize(); for (i = 0; i < iNumOfAllEntities; i++) { pEnt = VisBaseEntity_cl::ElementManagerGet(i); if ( pEnt ) { if ( pEnt->IsOfType(SerializeBaseEntity_cl::GetClassTypeId()) ) { pSerEnt = static_cast<SerializeBaseEntity_cl*>(pEnt); if ( pSerEnt->GetSerializeType() == SERIALIZE_FULL ) iFullCtr++; else iReCreateCtr++; } } } // serialize number of entities ar << iReCreateCtr; ar << iFullCtr; hkvVec3 vTemp; // do ReCreate serialization of entities for (i = 0; i < iNumOfAllEntities; i++) { pEnt = VisBaseEntity_cl::ElementManagerGet(i); if ( pEnt ) { if ( pEnt->IsOfType(SerializeBaseEntity_cl::GetClassTypeId()) ) { pSerEnt = (SerializeBaseEntity_cl *) pEnt; if ( pSerEnt->GetSerializeType() == SERIALIZE_RECREATE ) { char pszEntityParams[4000]; GetEntityParameters( pSerEnt, pszEntityParams ); VDynamicMesh* pMesh = pSerEnt->GetMesh(); ar << pSerEnt->GetClassFullName() << pSerEnt->GetEntityKey(); vTemp = pSerEnt->GetPosition(); vTemp.SerializeAsVisVector (ar); vTemp = pSerEnt->GetOrientation(); vTemp.SerializeAsVisVector (ar); const char *szFilename = pMesh ? pMesh->GetFilename() : NULL; ar << szFilename << pszEntityParams; } } } } // do full serialization of entities for (i = 0; i < iNumOfAllEntities; i++) { pEnt = VisBaseEntity_cl::ElementManagerGet(i); if ( pEnt ) { if ( pEnt->IsOfType(SerializeBaseEntity_cl::GetClassTypeId()) ) { pSerEnt = (SerializeBaseEntity_cl *) pEnt; if ( pSerEnt->GetSerializeType() == SERIALIZE_FULL ) { ar << pSerEnt; } } } } // store end tag - useful to verify a valid archive ar << ARCHIVE_END_TAG; ar.Close(); pOut->Close(); g_SaveSlot[iNum-1].SaveScreenShotPreview(); return TRUE; }