void CEntity::deserializeFromRepXFile(const std::string &file, int group, const std::vector<int>& groupList, const Logic::IPhysics* component) { // Obtenemos el puntero al servidor de fisicas Physics::CServer* physicsServer = Physics::CServer::getSingletonPtr(); PxScene* scene = physicsServer->getActiveScene(); PxPhysics* physics = physicsServer->getPhysxSDK(); PxCooking* cooking = physicsServer->getCooking(); assert(scene); // Preparar parámetros para deserializar PxDefaultFileInputData data(file.c_str()); PxCollection* bufferCollection = physics->createCollection(); PxCollection* sceneCollection = physics->createCollection(); PxStringTable* stringTable = &PxStringTableExt::createStringTable( CServer::getSingletonPtr()->getFoundation()->getAllocatorCallback() ); PxUserReferences* externalRefs = NULL; PxUserReferences* userRefs = NULL; // Deserializar a partir del fichero RepX repx::deserializeFromRepX(data, *physics, *cooking, stringTable, externalRefs, *bufferCollection, *sceneCollection, userRefs); // Añadir entidades físicas a la escena physics->addCollection(*sceneCollection, *scene); // Buscar una entidad de tipo PxRigidActor. Asumimos que hay exactamente 1 en el fichero. _actor = NULL; for (unsigned int i = 0; i < sceneCollection->getNbObjects() && !_actor; ++i) { PxSerializable* p = sceneCollection->getObject(i); _actor = p->is<PxRigidActor>(); } assert(_actor); // Anotar el componente lógico asociado a la entidad física _actor->userData = (void*)component; // Establecer el grupo de colisión PxSetGroup(*_actor, group); // Establecer los filtros de colisión Physics::CServer::getSingletonPtr()->setupFiltering(_actor, group, groupList); // Liberar recursos bufferCollection->release(); sceneCollection->release(); }