void ModelDisplayState::PrepareStaticModels(ModelManager& modelManager, const ModelBlueprint& blueprint)
{
   const std::vector<CompositeModel3d::StaticModelData>& vecStaticModels =
      m_spModel->StaticList();

   // blueprint must contain same number of statics as composite models
   ATLASSERT(blueprint.m_vecStaticBlueprints.size() == vecStaticModels.size());

   m_vecStaticModelTextures.resize(vecStaticModels.size());

   for (size_t i=0, iMax=vecStaticModels.size(); i<iMax; i++)
   {
      // static model must contain only one material; get texture name of it
      CString cszTexture = vecStaticModels[i].m_spStatic->SingleMaterialTextureName();
      cszTexture.Replace(_T(".\\"), _T(""));

      // add texture name prefix, if any
      const ModelBlueprint::StaticModelBlueprint& staticBlueprint =
         blueprint.m_vecStaticBlueprints[i];

      if (!staticBlueprint.m_cszStaticTexturePrefix.IsEmpty())
         cszTexture = staticBlueprint.m_cszStaticTexturePrefix + cszTexture;

      m_vecStaticModelTextures[i] = modelManager.LoadTexture(cszTexture);
   }
}
void ModelDisplayState::PrepareAnimatedModelTextures(ModelManager& modelManager, const ModelBlueprint& blueprint)
{
   AnimatedModel3d& model = *m_spModel->GetAnimated();
   Data& data = model.GetData();

   // prepare textures for each material
   m_vecMaterialTextureData.resize(data.m_vecMaterials.size());
   ATLASSERT(blueprint.m_vecAnimatedMaterialTextures.size() == data.m_vecMaterials.size());

   for (size_t i=0, iMax=m_vecMaterialTextureData.size(); i<iMax; i++)
   {
      const Material& material = data.m_vecMaterials[i];

      CString cszTexture = material.cszTexture;
      cszTexture.Replace(_T(".\\"), _T(""));

      // use blueprint texture name, if set
      if (!blueprint.m_vecAnimatedMaterialTextures[i].IsEmpty())
         cszTexture = blueprint.m_vecAnimatedMaterialTextures[i];

      m_vecMaterialTextureData[i].m_spTexture = modelManager.LoadTexture(cszTexture);
   }
}