// create any zone-specific data necessary for all zones for the given node void PCZSceneManager::createZoneSpecificNodeData(PCZSceneNode * node) { ZoneMap::iterator i; PCZone * zone; for (i = mZones.begin(); i != mZones.end(); i++) { zone = i->second; if (zone->requiresZoneSpecificNodeData()) { zone->createNodeZoneData(node); } } }
// update zone-specific data for any zone that the node is touching void PCZSceneNode::updateZoneData(void) { ZoneData* zoneData; PCZone * zone; // make sure home zone data is updated zone = mHomeZone; if (zone->requiresZoneSpecificNodeData()) { zoneData = getZoneData(zone); zoneData->update(); } // update zone data for any zones visited ZoneMap::iterator it = mVisitingZones.begin(); while ( it != mVisitingZones.end() ) { zone = it->second; if (zone->requiresZoneSpecificNodeData()) { zoneData = getZoneData(zone); zoneData->update(); } ++it; } }
/* Create a zone with the given name and parent zone */ PCZone * PCZSceneManager::createZone(const String& zoneType, const String& instanceName) { if (mZones.find(instanceName) != mZones.end()) { OGRE_EXCEPT( Exception::ERR_DUPLICATE_ITEM, "A zone with the name " + instanceName + " already exists", "PCZSceneManager::createZone" ); } PCZone * newZone = mZoneFactoryManager->createPCZone(this, zoneType, instanceName); if (newZone) { // add to the global list of zones mZones[instanceName] = newZone; } if (newZone->requiresZoneSpecificNodeData()) { createZoneSpecificNodeData(newZone); } return newZone; }