void vHavokShapeFactory::GetHktDependencies(VResourceSnapshot &snapshot, VisBaseEntity_cl *pEntity) { VASSERT(pEntity != NULL); // Get wrapped rigid body vHavokRigidBody *pWrappedRigidBody = pEntity->Components().GetComponentOfType<vHavokRigidBody>(); if (pWrappedRigidBody == NULL) return; // Get shape vHavokPhysicsModule *pModule = vHavokPhysicsModule::GetInstance(); VASSERT(pModule != NULL); pModule->MarkForRead(); const hkpRigidBody *pRigidBody = pWrappedRigidBody->GetHkRigidBody(); if (pRigidBody == NULL) { pModule->UnmarkForRead(); return; } const hkpShape *pShape = pRigidBody->getCollidable()->getShape(); pModule->UnmarkForRead(); // Only convex/ mesh rigid bodies have a cached HKT file const hkClass* loadedClassType = hkVtableClassRegistry::getInstance().getClassFromVirtualInstance(pShape); if (loadedClassType!=&hkvConvexVerticesShapeClass && loadedClassType!=&hkvBvCompressedMeshShapeClass) return; // Get mesh VDynamicMesh *pMesh = pEntity->GetMesh(); if (pMesh == NULL) return; // Get scale hkvVec3 vScale = pEntity->GetScaling(); bool shrinkToFit = pWrappedRigidBody->Havok_TightFit; // Get HKT file dependency for convex/ mesh rigid body if (loadedClassType == &hkvConvexVerticesShapeClass) { VStaticString<FS_MAX_PATH> szCachedShapeName(pMesh->GetFilename()); vHavokCachedShape::GetConvexShapePath(szCachedShapeName, vScale, shrinkToFit); IVFileInStream *pIn = Vision::File.Open(szCachedShapeName); if (pIn) { snapshot.AddFileDependency(pMesh, szCachedShapeName, pIn->GetSize() ); pIn->Close(); } } else if(loadedClassType == &hkvBvCompressedMeshShapeClass) { VStaticString<FS_MAX_PATH> szCachedShapeName(pMesh->GetFilename()); vHavokCachedShape::GetMeshShapePath(szCachedShapeName, vScale, VisStaticMeshInstance_cl::VIS_COLLISION_BEHAVIOR_CUSTOM, (VisWeldingType_e)pWrappedRigidBody->Havok_WeldingType); IVFileInStream *pIn = Vision::File.Open(szCachedShapeName); if (pIn) { snapshot.AddFileDependency(pMesh, szCachedShapeName, pIn->GetSize() ); pIn->Close(); } } }
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; }