//----------------------------------------------------------------------------------------- bool CBillboardSetEditor::load(bool async) { if(mLoaded->get()) return true; if(CNodeEditor::load()) { mBillboardSetHandle = mOgitorsRoot->GetSceneManager()->createBillboardSet(mName->get()); mHandle->attachObject(mBillboardSetHandle); mBillboardSetHandle->setBillboardType((Ogre::BillboardType)mBillboardType->get()); mBillboardSetHandle->setSortingEnabled(mSorting->get()); mBillboardSetHandle->setBillboardOrigin((Ogre::BillboardOrigin)mOrigin->get()); mBillboardSetHandle->setBillboardRotationType((Ogre::BillboardRotationType)mRotation->get()); mBillboardSetHandle->setDefaultWidth(mDefaultWidth->get()); mBillboardSetHandle->setDefaultHeight(mDefaultHeight->get()); mBillboardSetHandle->setVisibilityFlags(1 << mLayer->get()); if(mMaterial->get() != "") mBillboardSetHandle->setMaterialName(mMaterial->get()); mBillboardSetHandle->setPointRenderingEnabled(mPointRendering->get()); mBillboardSetHandle->setRenderingDistance(mRenderDistance->get()); Ogre::Vector2 v2val; Ogre::Vector3 v3val; Ogre::Vector4 v4val; Ogre::ColourValue cval; Ogre::Real rval; int ival; Ogre::String propname; int count = mBillboardCount->get(); for(int ix = 0;ix < count;ix++) { propname = "billboard" + Ogre::StringConverter::toString(ix); Ogre::Billboard *pBillboard = mBillboardSetHandle->createBillboard(Ogre::Vector3::ZERO); mProperties.getValue(propname + "::position", v3val); pBillboard->setPosition(v3val); mProperties.getValue(propname + "::colour", cval); pBillboard->setColour(cval); mProperties.getValue(propname + "::dimensions", v2val); pBillboard->setDimensions(v2val.x, v2val.y); mProperties.getValue(propname + "::rotation", rval); pBillboard->setRotation(Ogre::Degree(rval)); mProperties.getValue(propname + "::texcoordindex", ival); pBillboard->setTexcoordIndex(ival); mProperties.getValue(propname + "::texrect", v4val); pBillboard->setTexcoordRect(v4val.x, v4val.y, v4val.z, v4val.w); } } else return false; return true; }
/** * Get a new Billboard. If have no more billboard then 0 is returned */ Ogre::Billboard *BillboardManager::getNewBillboard(int atlasNumber) { ASSERT(mBillboardSet); if(mBillboards.empty()){ return 0; } // check if we have to attach to the scene node if(mBillboards.size() == mBillboardSet->getPoolSize()){ // this is the first that we will remove mNode->attachObject(mBillboardSet); } Ogre::Billboard *result = mBillboards.front(); mBillboards.pop_front(); // configure the atlas if needed if(atlasNumber >= 0){ Ogre::Real x1 = (mAtlasSize * atlasNumber); ASSERT(x1 + mAtlasSize <= 1.0f); result->setTexcoordRect(x1, 0.0f, x1+mAtlasSize, 1.0f); } return result; }