void vHavokAiModule::HandleResourceFile(vHavokResourceCallbackData &data) { // handle the physics side in this function: hkRootLevelContainer* root = data.m_pResource->getContents<hkRootLevelContainer>(); if (root==NULL || data.m_Action==vHavokResourceCallbackData::HRA_NONE) return; hkaiWorld* aiWorld = GetAiWorld(); // TODO }
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; }