//Do not use this constructor yourself - instead, call getTexture() //to get/create an ImpostorTexture for an Entity. ImpostorTexture::ImpostorTexture(ImpostorPage *group, Entity *entity) : loader(0) { //Store scene manager and entity ImpostorTexture::sceneMgr = group->sceneMgr; ImpostorTexture::entity = entity; ImpostorTexture::group = group; //Add self to list of ImpostorTexture's entityKey = ImpostorBatch::generateEntityKey(entity); typedef std::pair<String, ImpostorTexture *> ListItem; selfList.insert(ListItem(entityKey, this)); //Calculate the entity's bounding box and it's diameter boundingBox = entity->getBoundingBox(); //Note - this radius calculation assumes the object is somewhat rounded (like trees/rocks/etc.) Real tmp; entityRadius = boundingBox.getMaximum().x - boundingBox.getCenter().x; tmp = boundingBox.getMaximum().y - boundingBox.getCenter().y; if (tmp > entityRadius) entityRadius = tmp; tmp = boundingBox.getMaximum().z - boundingBox.getCenter().z; if (tmp > entityRadius) entityRadius = tmp; entityDiameter = 2.0f * entityRadius; entityCenter = boundingBox.getCenter(); //Render impostor textures renderTextures(false); //Set up materials for (int o = 0; o < IMPOSTOR_YAW_ANGLES; ++o){ for (int i = 0; i < IMPOSTOR_PITCH_ANGLES; ++i){ material[i][o] = MaterialManager::getSingleton().create(getUniqueID("ImpostorMaterial"), "Impostors"); Material *m = material[i][o].getPointer(); Pass *p = m->getTechnique(0)->getPass(0); TextureUnitState *t = p->createTextureUnitState(texture->getName()); t->setTextureUScroll((float)o / IMPOSTOR_YAW_ANGLES); t->setTextureVScroll((float)i / IMPOSTOR_PITCH_ANGLES); p->setLightingEnabled(false); m->setReceiveShadows(false); if (group->getBlendMode() == ALPHA_REJECT_IMPOSTOR){ p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 128); //p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 64); } else if (group->getBlendMode() == ALPHA_BLEND_IMPOSTOR){ p->setSceneBlending(SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA); p->setDepthWriteEnabled(false); } } } }
//Do not use this constructor yourself - instead, call getTexture() //to get/create an ImpostorTexture for an Entity. ImpostorTexture::ImpostorTexture(ImpostorPage *group, Entity *entity) : loader(0) { //Store scene manager and entity ImpostorTexture::sceneMgr = group->getParentPagedGeometry()->getSceneManager(); ImpostorTexture::entity = entity; ImpostorTexture::group = group; //Add self to list of ImpostorTexture's entityKey = ImpostorBatch::generateEntityKey(entity); typedef std::pair<String, ImpostorTexture *> ListItem; selfList.insert(ListItem(entityKey, this)); //Calculate the entity's bounding box and it's diameter boundingBox = entity->getBoundingBox(); entityRadius = Math::boundingRadiusFromAABB(boundingBox); entityDiameter = 2.0f * entityRadius; entityCenter = boundingBox.getCenter(); //Render impostor textures renderTextures(false); //Set up materials for (int o = 0; o < IMPOSTOR_YAW_ANGLES; ++o){ for (int i = 0; i < IMPOSTOR_PITCH_ANGLES; ++i){ #if OGRE_VERSION_MAJOR <= 1 #if OGRE_VERSION_MINOR <= 8 material[i][o] = MaterialManager::getSingleton().create(getUniqueID("ImpostorMaterial"), "Impostors"); #else material[i][o] = MaterialManager::getSingleton().create(getUniqueID("ImpostorMaterial"), "Impostors").staticCast<Ogre::Material>(); #endif #endif Material *m = material[i][o].getPointer(); Pass *p = m->getTechnique(0)->getPass(0); TextureUnitState *t = p->createTextureUnitState(texture->getName()); t->setTextureUScroll((float)o / IMPOSTOR_YAW_ANGLES); t->setTextureVScroll((float)i / IMPOSTOR_PITCH_ANGLES); p->setLightingEnabled(false); m->setReceiveShadows(false); if (group->getBlendMode() == ALPHA_REJECT_IMPOSTOR){ p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 128); //p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 64); } else if (group->getBlendMode() == ALPHA_BLEND_IMPOSTOR){ p->setSceneBlending(SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA); p->setDepthWriteEnabled(false); } } } }