void EClassManager::resolveModelInheritance(const std::string& name, const Doom3ModelDefPtr& model) { if (model->resolved == true) { return; // inheritance already resolved } model->resolved = true; if (!model->parent.empty()) { Models::iterator i = _models.find(model->parent); if (i == _models.end()) { globalErrorStream() << "model " << name << " inherits unknown model " << model->parent << std::endl; } else { resolveModelInheritance(i->first, i->second); // greebo: Only inherit the "mesh" of the parent if the current declaration doesn't have one if (model->mesh.empty()) { model->mesh = i->second->mesh; } // Only inherit the "skin" of the parent if the current declaration doesn't have one if (model->skin.empty()) { model->skin = i->second->skin; } } } }
void EClassManager::resolveInheritance() { // Resolve inheritance on the model classes for (Models::iterator i = _models.begin(); i != _models.end(); ++i) { resolveModelInheritance(i->first, i->second); } // Resolve inheritance for the entities. At this stage the classes // will have the name of their parent, but not an actual pointer to // it for (EntityClasses::iterator i = _entityClasses.begin(); i != _entityClasses.end(); ++i) { // Tell the class to resolve its own inheritance using the given // map as a source for parent lookup i->second->resolveInheritance(_entityClasses); // If the entity has a model path ("model" key), lookup the actual // model and apply its mesh and skin to this entity. if (i->second->getModelPath().size() > 0) { Models::iterator j = _models.find(i->second->getModelPath()); if (j != _models.end()) { i->second->setModelPath(j->second->mesh); i->second->setSkin(j->second->skin); } } } // greebo: Override the eclass colours of two special entityclasses Vector3 worlspawnColour = ColourSchemes().getColour("default_brush"); Vector3 lightColour = ColourSchemes().getColour("light_volumes"); Doom3EntityClassPtr light = findInternal("light"); if (light) { light->setColour(lightColour); } Doom3EntityClassPtr worldspawn = findInternal("worldspawn"); if (worldspawn) { worldspawn->setColour(worlspawnColour); } }