//------------------------------------------------------ void MaterialService::addWorldMaterialTemplate(unsigned int idx, const Ogre::MaterialPtr& material) { assert(!material.isNull()); mTemplateMaterials.insert(make_pair(idx, material)); TextureDimensions2D dimensions; dimensions.first = 64; dimensions.second = 64; if (material->getNumTechniques() > 0) { Pass *shadPass = material->getTechnique(0)->getPass(0); if (shadPass->getNumTextureUnitStates() > 0) { TextureUnitState* tus = shadPass->getTextureUnitState(0); try { // ensure the material is loaded before getting the dimensions material->escalateLoading(); // This is stupid, but can happen - the getTextureDimensions seems buggy in this regard if (tus->getNumFrames() <= 0) { LOG_ERROR("MaterialService: Error getting texture dimensions (Mat. %s) : Zero frame count!", material->getName().c_str()); } else { dimensions = tus->getTextureDimensions(); // register the scale std::pair<float, float> tscale; tscale.first = tus->getTextureUScale(); tscale.second = tus->getTextureVScale(); // register the texture scale... setWRTextureScale(idx, tscale); // reset the scale back, it is canceled out by the fact we UV map with different txt dimensions tus->setTextureUScale(1.0f); tus->setTextureVScale(1.0f); dimensions.first = static_cast<unsigned int> (tscale.first * dimensions.first); dimensions.second = static_cast<unsigned int> (tscale.second * dimensions.second); } } catch (Ogre::Exception &e) { // Nothing, just log it could not be done LOG_ERROR("MaterialService: Error getting texture dimensions : %s", e.getFullDescription().c_str()); } } } LOG_INFO("MaterialService: Registered a WR template material %u - %s", idx, material->getName().c_str()); // insert mTextureDimensionMap.insert(make_pair(idx, dimensions)); }