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;
}
Пример #3
0
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;
}