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(); } } }
BOOL VPrefab::Reload() { if (IsMissing()) return FALSE; IVFileInStream *pIn; if (GetParentManager()!=NULL) pIn = GetParentManager()->CreateFileInStream(GetFilename(),this); else pIn = Vision::File.Open(GetFilename()); if (pIn==NULL) { FlagAsMissing(); return FALSE; } // must match saving code by vForge pIn->Read(&m_Header,sizeof(m_Header),"6i"); m_iSize = pIn->GetSize() - sizeof(m_Header); // header validation: if (m_iSize<0 || m_Header.m_iArchiveVersion<0 || m_Header.m_iArchiveVersion>Vision::GetArchiveVersion() || m_Header.m_iLocalVersion<0 || m_Header.m_iLocalVersion>VPREFAB_BINARY_VERSION_CURRENT) { pIn->Close(); hkvLog::Warning("Cannot load VPrefab '%s': Invalid version or broken file", GetFilename()); FlagAsMissing(); return FALSE; } m_BinaryBlock.EnsureCapacity(m_iSize); pIn->Read(m_BinaryBlock.GetBuffer(),m_iSize); pIn->Close(); return TRUE; }
void vHavokShapeFactory::GetHktDependencies(VResourceSnapshot &snapshot, VTerrainSector *pSector) { VASSERT(pSector != NULL); // Return when no physics representation vHavokTerrain *pHavokTerrain = (vHavokTerrain*) pSector->GetPhysicsUserData(); if (pHavokTerrain == NULL) return; const VTerrainSector::VPhysicsType_e ePhysicsType = pSector->GetPhysicsType(); const bool bHasHoles = pSector->HasHoles(); // First get filename by specifying extension (hmap) to be able to retrieve the absolute path. // Afterwards remove extension. char szFilename[FS_MAX_PATH]; pSector->m_Config.GetSectorFilename(szFilename, pSector->m_iIndexX, pSector->m_iIndexY, "hmap", true); char szPath[FS_MAX_PATH]; bool bSuccess = VFileHelper::GetAbsolutePath(szFilename, szPath, Vision::File.GetManager()); VASSERT_MSG(bSuccess, "vHavokShapeFactory::GetHktDependencies: Failed to make the path to the sector hmap absolute, the file may not exist!"); VFileHelper::GetFilenameNoExt(szPath, szFilename); // Build the cached shape filename VStaticString<FS_MAX_PATH> szCachedShapeName(szPath); vHavokCachedShape::GetTerrainSectorShapePath(szCachedShapeName, ePhysicsType, bHasHoles); IVFileInStream *pIn = Vision::File.Open(szCachedShapeName); if (pIn) { snapshot.AddFileDependency(pSector, szCachedShapeName, pIn->GetSize() ); pIn->Close(); } }
void vHavokAiNavMeshResource::GetDependencies(VResourceSnapshot &snapshot) { IVFileInStream* pIn = Vision::File.Open(GetFilename()); if (pIn != NULL) { snapshot.AddFileDependency(this, GetFilename(), pIn->GetSize()); pIn->Close(); } VManagedResource::GetDependencies(snapshot); }
// -------------------------------------------------------------------------- // // Fmod file callbacks // -------------------------------------------------------------------------- // FMOD_RESULT F_CALLBACK VisionFM_Open(const char *name, int unicode, unsigned int *filesize, void **handle, void **userdata) { IVFileInStream *pStream = Vision::File.Open(name); if (!pStream) return FMOD_ERR_FILE_NOTFOUND; *filesize = pStream->GetSize(); *handle = pStream; return FMOD_OK; }
void vHavokShapeFactory::GetHktDependencies(VResourceSnapshot &snapshot, VisStaticMeshInstance_cl *pMeshInstance) { VASSERT(pMeshInstance != NULL); // Get scale hkvVec3 vScale(hkvNoInitialization); ExtractScaling(pMeshInstance->GetTransform(), vScale); // There is no real way to figure out if a convex or mesh shape is required and the filename is based on that. // So try them both. // Convex version { VStaticString<FS_MAX_PATH> szCachedShapeName(pMeshInstance->GetMesh()->GetFilename()); bool shrinkToFit = false; //how do if true / can it be true for static mesh? vHavokCachedShape::GetConvexShapePath(szCachedShapeName, vScale, shrinkToFit); IVFileInStream *pIn = Vision::File.Open(szCachedShapeName); if (pIn) { snapshot.AddFileDependency(pMeshInstance->GetMesh(), szCachedShapeName, pIn->GetSize() ); pIn->Close(); return; } } // Mesh version { VStaticString<FS_MAX_PATH> szCachedShapeName(pMeshInstance->GetMesh()->GetFilename()); vHavokCachedShape::GetMeshShapePath(szCachedShapeName, vScale, pMeshInstance->GetCollisionBehavior(), pMeshInstance->GetWeldingType()); IVFileInStream *pIn = Vision::File.Open(szCachedShapeName); if (pIn) { snapshot.AddFileDependency(pMeshInstance->GetMesh(), szCachedShapeName, pIn->GetSize() ); pIn->Close(); return; } } }
void vHavokBehaviorScriptAssetLoader::loadScript(char const *filePath, bool forceLoad) { hkStorageStringMap<ScriptEntry*>& scriptEntries = accessScriptEntries(); // Check for cached script ScriptEntry* cachedEntry = HK_NULL; if(scriptEntries.hasKey(filePath)) { if( !forceLoad ) { //Already loaded. return; } // Want to force load the script asset scriptEntries.get(filePath, &cachedEntry); } // Load the stream IVFileInStream *pIn = m_resourceManager->CreateFileInStream(filePath, HK_NULL); if(!pIn) { return; } LONG const size = pIn->GetSize(); if(forceLoad && cachedEntry != HK_NULL) { // Clear out current cached entry cachedEntry->m_content.clearAndDeallocate(); // Set new entry cachedEntry->m_content.setSize(size); pIn->Read(cachedEntry->m_content.begin(), size); } else { // Create new script entry ScriptEntry* entry = new ScriptEntry(filePath, size); pIn->Read(entry->m_content.begin(), size); // Add to map scriptEntries.insert(filePath, entry); } pIn->Close(); }
void VFmodSoundResource::GetDependencies(VResourceSnapshot &snapshot) { if (!IsStreaming()) { VManagedResource::GetDependencies(snapshot); IVFileInStream *pFile = Vision::File.Open(GetFilename()); if (pFile) { // patch the file size afterwards VResourceSnapshotEntry *pEntry = snapshot.FindResourceEntry(this); VASSERT(pEntry!=NULL) if (pEntry) { pEntry->m_iFileSize = pFile->GetSize(); pEntry->SetCustomIntValue(0,m_iSoundFlags); } pFile->Close(); } }
static bool LoadScript(lua_State *L, const char * szFileName) { IVFileInStream *pIn = Vision::File.Open(szFileName); if (!pIn) return false; int iScriptLen = pIn->GetSize(); VMemoryTempBuffer<16*1024> buffer(iScriptLen+1); char *szBuffer = (char *)buffer.GetBuffer(); pIn->Read(szBuffer,iScriptLen); szBuffer[iScriptLen] = 0; pIn->Close(); if (!VScriptResourceManager::LuaErrorCheck(L, luaL_loadbuffer(L, szBuffer, iScriptLen, szFileName))) return false; if (!VScriptResourceManager::LuaErrorCheck(L, lua_pcall (L, 0, LUA_MULTRET, 0))) return false; return true; }
// ReadPlacesFile: Reads in the PLACES_FILE and sets up all the WorldPlace_t // objects. void WorldLanguages_cl::ReadPlacesFile() { IVFileInStream* pIn = Vision::File.Open(PLACES_FILE); char *buffer = NULL; if (pIn) { int fsize= pIn->GetSize(); buffer = new char[fsize+1]; pIn->Read(buffer, fsize); buffer[fsize] = 0; pIn->Close(); } // if we couldn't read anything, return here! if (!buffer) return; static const char Newline[] = "\r\n"; // tokenize buffer line-wise char *line = strtok(buffer, Newline); // skip first character, it only marks the UTF8 file (Byte Order Mark) line += 3; // read number of places sscanf(line, "%d", &m_iNumPlaces); // no places -> return without doing anything if (m_iNumPlaces < 1) { V_SAFE_DELETE_ARRAY(buffer); return; } // create m_iNumPlaces WorldPlace_t structs m_pPlaces = new WorldPlace_t[m_iNumPlaces]; m_iCurrentPlace = 0; // get all places while (m_iCurrentPlace < m_iNumPlaces) { WorldPlace_t &pThisPlace = m_pPlaces[m_iCurrentPlace]; // get next line line = strtok(NULL, Newline); if (line == NULL) { V_SAFE_DELETE_ARRAY(buffer); return; } // skip comments if (line[0] == ';') continue; // skip empty lines if (line[0] == '\0') continue; // find [ if (line[0] == '[') { // the next line contains the name of the place line = strtok(NULL, Newline); pThisPlace.m_PlaceName = line; //is it Arabic? bool bArabic = strcmp(line, "UAE - Arabic") == 0; // the next line contains the font type line = strtok(NULL, Newline); // load font type with resource manager pThisPlace.m_spFont = Vision::Fonts.LoadFont(line); //left to right or right to left? line = strtok(line + strlen(line) + 1, Newline); // LoadFont() seems to use strtok too -> reinitialize bool bIsRightToLeft = strcmp(line,"RTL") == 0; // the next line contains the alphabet index, x position and y position // read alphabet, x_pos, y_pos; line = strtok(NULL, Newline); float x,y; sscanf(line, "%f,%f", &x, &y); // fix up angles (convert from long/lat to yaw/pitch) pThisPlace.m_angleY = -x; pThisPlace.m_angleZ = -y-90; // the next line(s) contain(s) the text // read text line = strtok(NULL, Newline); pThisPlace.m_Text.Reset(); // until text is ] while (line[0] != ']') { pThisPlace.m_Text += line; pThisPlace.m_Text += "\n"; line = strtok(NULL, Newline); } // Init Arabic support helper and set text which gets transformed from uniform to contextual Arabic if(bArabic) { pThisPlace.m_pRTLSupport = new VArabicSupport_cl(pThisPlace.m_spFont, pThisPlace.m_Text); } else if(bIsRightToLeft) { pThisPlace.m_pRTLSupport = new VRTLSupport_cl(pThisPlace.m_spFont, pThisPlace.m_Text); } } m_iCurrentPlace++; } V_SAFE_DELETE_ARRAY(buffer); }