void* vHavokBehaviorAssetLoader::loadFile( const hkStringBuf& fullPath, hkStreamReader* stream, void*& storingData ) { if( stream == HK_NULL ) { // Load the stream IVFileInStream *pIn = m_resourceManager->CreateFileInStream( fullPath.cString(), HK_NULL ); if (!pIn) { return HK_NULL; } // Wrap in a Havok stream reader vHavokStreamReader havokStreamReader(pIn); if (!havokStreamReader.isOk()) { return HK_NULL; } hkBufferedStreamReader bufferedStreamReader(&havokStreamReader); if (!bufferedStreamReader.isOk()) { return HK_NULL; } return hkbOnHeapAssetLoader::loadFile( fullPath, &bufferedStreamReader, storingData ); } // The stream reader here must be of type hkBufferedStreamReader to go through Vision's file interface return hkbOnHeapAssetLoader::loadFile( fullPath, stream, storingData ); }
bool vHavokAiNavMeshResource::LoadNavMesh(IVFileInStream* inStream, hkRefPtr<hkaiNavMesh>& navMeshOut, hkRefPtr<hkaiNavMeshQueryMediator>& mediatorOut) { vHavokStreamReader havokStreamReader(inStream); if (!havokStreamReader.isOk()) { return false; } hkBufferedStreamReader bufferedStreamReader(&havokStreamReader); if (!bufferedStreamReader.isOk()) { return false; } hkObjectResource* res = hkSerializeUtil::loadOnHeap(&bufferedStreamReader); if (!res) { return false; } hkRootLevelContainer* container = res->getContents<hkRootLevelContainer>(); hkRefPtr<hkaiNavMesh> navMesh; hkRefPtr<hkaiNavMeshQueryMediator> mediator; if (container) { navMesh = container->findObject<hkaiNavMesh>(); mediator = container->findObject<hkaiStaticTreeNavMeshQueryMediator>(); } else { // dkw.note: loading legacy asset that didn't use a hkRootLevelContainer navMesh = res->getContents<hkaiNavMesh>(); } // remove reference here since everything in the stream should have an extra reference count res->removeReference(); if (navMesh == HK_NULL) { return false; } #if defined(HK_DEBUG_SLOW) hkaiNavMeshUtils::validate(*navMesh); #endif // create mediators if they don't exist if (mediator == HK_NULL) { mediator.setAndDontIncrementRefCount(hkaiNavMeshUtils::setupQueryMediator(*navMesh)); } navMeshOut = navMesh; mediatorOut = mediator; return true; }
bool vHavokAiModule::LoadNavMeshDeprecated(const char* filename, VArray<vHavokAiNavMeshInstance*>* navMeshInstancesOut) { if (!Vision::File.Exists(filename)) { return false; } vHavokStreamReader havokStreamReader(filename); if (!havokStreamReader.isOk()) { return false; } hkBufferedStreamReader bufferedStreamReader(&havokStreamReader); if (!bufferedStreamReader.isOk()) { return false; } VArray<vHavokAiNavMeshResource*> navMeshResources; { hkArray< hkRefPtr<hkaiNavMesh> > navMeshes; hkArray< hkRefPtr<hkaiNavMeshQueryMediator> > mediators; hkObjectResource* res = hkSerializeUtil::loadOnHeap(&bufferedStreamReader); hkRootLevelContainer* container = res->getContents<hkRootLevelContainer>(); if (container) { hkaiNavMesh* navMesh = container->findObject<hkaiNavMesh>(); hkaiNavMeshQueryMediator* mediator = container->findObject<hkaiStaticTreeNavMeshQueryMediator>(); while(navMesh) { navMeshes.pushBack(navMesh); mediators.pushBack(mediator); navMesh = container->findObject<hkaiNavMesh>(navMesh); mediator = container->findObject<hkaiStaticTreeNavMeshQueryMediator>(mediator); } } else { // dkw.note: loading legacy asset that didn't use a hkRootLevelContainer hkaiNavMesh* navMesh = res->getContents<hkaiNavMesh>(); if (navMesh == HK_NULL) { return false; } navMeshes.pushBack(navMesh); mediators.pushBack(HK_NULL); } res->removeReference(); if (navMeshes.getSize() == 0) { return false; } for (int i = 0; i < navMeshes.getSize(); i++) { if (mediators[i] == HK_NULL) { VASSERT(navMeshes[i]->getReferenceCount() == 1); mediators[i].setAndDontIncrementRefCount(hkaiNavMeshUtils::setupQueryMediator( *navMeshes[i] )); } else { VASSERT(navMeshes[i]->getReferenceCount() == 2); } VASSERT(mediators[i]->getReferenceCount() == 1); vHavokAiNavMeshResource* resource = new vHavokAiNavMeshResource(navMeshes[i], mediators[i]); VASSERT(navMeshes[i]->getReferenceCount() == 3); VASSERT(mediators[i]->getReferenceCount() == 2); navMeshResources.Add(resource); } } VArray<vHavokAiNavMeshInstance*> navMeshInstancesLocal; VArray<vHavokAiNavMeshInstance*>* navMeshInstancesPtr; if (navMeshInstancesOut != HK_NULL) { navMeshInstancesPtr = navMeshInstancesOut; } else { navMeshInstancesPtr = &navMeshInstancesLocal; } hkaiWorld* aiWorld = GetAiWorld(); for (int i = 0; i < navMeshResources.GetLength(); i++) { VASSERT(navMeshResources[i]->GetNavMesh()->getReferenceCount() == 2); VASSERT(navMeshResources[i]->GetNavMeshQueryMediator()->getReferenceCount() == 1); vHavokAiNavMeshInstance* navMeshInstance = new vHavokAiNavMeshInstance(navMeshResources[i], i); VASSERT(navMeshResources[i]->GetNavMesh()->getReferenceCount() == 3); VASSERT(navMeshResources[i]->GetNavMeshQueryMediator()->getReferenceCount() == 1); navMeshInstance->AddNavMeshToWorld(aiWorld); navMeshInstancesPtr->Add(navMeshInstance); } return true; }