#include "LBBCBillboardCloudTextureViewMode.h" #include "LBBCLeaves.h" #include "LBBCManager.h" namespace LBBC { BillboardCloudTextureViewMode::BillboardCloudTextureViewMode(Ogre::RenderWindow* win, unsigned int ogreFrameListenerModeHandle, bool useBufferedInputKeys, bool useBufferedInputMouse) :OBA::OgreFrameListenerMode(win, ogreFrameListenerModeHandle, useBufferedInputKeys, useBufferedInputMouse) { mFrame = 0; mDebugOverlay->setScale(0.0, 0.0); } BillboardCloudTextureViewMode::~BillboardCloudTextureViewMode() { } bool BillboardCloudTextureViewMode::frameStarted(const Ogre::FrameEvent& evt, Ogre::InputReader *inputReader) { if (mFrame == 1) { for (unsigned int iSubEntity = 0; iSubEntity < mClusterizedEntities->getNumSubEntities(); iSubEntity++) { mClusterizedEntities->getSubEntity(iSubEntity)->setVisible(false); } } if (mFrame > 1) { mClusterizedEntities->getSubEntity((mCurrentTexture-1) % mClusterizedEntities->getNumSubEntities())->setVisible(false); } if (mFrame == 1) { mTextureAtlas->update(); } if (mFrame > 1) { mClusterizedEntities->getSubEntity(mCurrentTexture % mClusterizedEntities->getNumSubEntities())->setVisible(true); mClusterTextureListener.setSubEntityVisible(mCurrentTexture% mClusterizedEntities->getNumSubEntities()); mClusterTexture->update(); //if (mCurrentTexture <= mNumTextures) { mClusterizedEntities->getSubEntity(mCurrentTexture)->setVisible(false); mClusterTexture->getMaterial()->getTechnique(0)->getPass(0)->setAmbient( Ogre::Math::RangeRandom(0.0,1.0), Ogre::Math::RangeRandom(0.0,1.0), Ogre::Math::RangeRandom(0.0,1.0) ); mClusterTexture->getRectangle2D()->setVisible(true); mTextureAtlas->getRectangle2D()->setVisible(true); Ogre::Vector2 uvMapMax = ((LBBC::LBBCManager*)LBBC::LBBCManager::getSingletonPtr())->getLeaves()->getBillboardCloud()->getBillboard(mCurrentTexture)->getBillboardClusterData()->getBillboardUVMapMax(0); Ogre::Vector2 uvMapMin = ((LBBC::LBBCManager*)LBBC::LBBCManager::getSingletonPtr())->getLeaves()->getBillboardCloud()->getBillboard(mCurrentTexture)->getBillboardClusterData()->getBillboardUVMapMin(0); mClusterTexture->setCorners(uvMapMin[0], uvMapMax[1], uvMapMax[0], uvMapMin[1]); mClusterTexture->getMaterial()->getTechnique(0)->getPass(0)->setAmbient(uvMapMax[0], uvMapMax[1], 0.0); mTextureAtlas->update(); //mTextureAtlas->debug(); mClusterTexture->getRectangle2D()->setVisible(false); Ogre::LogManager::getSingleton().logMessage("Billboard(" + Ogre::StringConverter::toString(mCurrentTexture) + ") uvMapMin(" + Ogre::StringConverter::toString(uvMapMin[0]) + "," + Ogre::StringConverter::toString(uvMapMin[1]) + ") uvMapMax(" + Ogre::StringConverter::toString(uvMapMax[0]) + "," + Ogre::StringConverter::toString(uvMapMax[1]) + ")"); Ogre::LogManager::getSingleton().logMessage( "USize(" + Ogre::StringConverter::toString(Ogre::Math::Abs(uvMapMax[0]-uvMapMin[0])) + "," + Ogre::StringConverter::toString(Ogre::Math::Abs(uvMapMax[1]-uvMapMin[1])) + ")"); mCurrentTexture++; if (mCurrentTexture == mNumTextures) { if (mBitRange == 32) { mDestPixelFormat = Ogre::PF_FLOAT32_RGBA; } else if (mBitRange == 16) { mDestPixelFormat = Ogre::PF_FLOAT16_RGBA; } else // mBitRange == 8 { mDestPixelFormat = Ogre::PF_BYTE_RGBA; } mTextureAtlas->save(mTextureAtlasFolder, mTextureAtlasName, mDestPixelFormat); } mCurrentTexture = mCurrentTexture % mNumTextures; } } mFrame++; return OgreFrameListenerMode::frameStarted(evt, inputReader); } void BillboardCloudTextureViewMode::setTextureAtlasSize(unsigned int size) { mTextureAtlasSize = size; } void BillboardCloudTextureViewMode::setEntityName(Ogre::String entityName) { mEntityName = entityName; } void BillboardCloudTextureViewMode::setTextureAtlasBitRange(unsigned int bitRange) { mBitRange = bitRange; } void BillboardCloudTextureViewMode::setTextureSize(unsigned int size) { mTextureSize = size; } void BillboardCloudTextureViewMode::setTextureAtlasFolder(Ogre::String textureAtlasFolder) { mTextureAtlasFolder = textureAtlasFolder; } void BillboardCloudTextureViewMode::setTextureAtlasName(Ogre::String textureAtlasName) { mTextureAtlasName = textureAtlasName; } void BillboardCloudTextureViewMode::createScene() { if (mBitRange == 32) { mSrcPixelFormat = Ogre::PF_FLOAT32_RGBA; } else if (mBitRange == 16) { mSrcPixelFormat = Ogre::PF_FLOAT16_RGBA; } else // mBitRange == 8 { mSrcPixelFormat = Ogre::PF_A8R8G8B8; } LBBC::Leaves *mLeaves = ((LBBC::LBBCManager*)LBBC::LBBCManager::getSingletonPtr())->getLeaves(); Ogre::LogManager::getSingleton().logMessage("Num.Billboards:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getNumBillboards())); Ogre::LogManager::getSingleton().logMessage("Num.BillboardGroups:" + Ogre::StringConverter::toString(mLeaves->getBillboardCloud()->getNumBillboardGroups())); Ogre::Vector2 uvMapMax = mLeaves->getBillboardCloud()->getBillboard(0)->getBillboardClusterData()->getBillboardUVMapMax(0); Ogre::Vector2 uvMapMin = mLeaves->getBillboardCloud()->getBillboard(0)->getBillboardClusterData()->getBillboardUVMapMin(0); Ogre::LogManager::getSingleton().logMessage("BillboardUVMapMax:" + Ogre::StringConverter::toString( Ogre::Vector3(uvMapMax[0], uvMapMax[1], 0.0) )); Ogre::LogManager::getSingleton().logMessage("BillboardUVMapMin:" + Ogre::StringConverter::toString( Ogre::Vector3(uvMapMin[0], uvMapMin[1], 0.0) )); mClusterizedEntitiesMergedSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode(); Ogre::LogManager::getSingleton().logMessage("Mesh:" + mEntityName); std::cin.get(); mClusterizedEntities = mSceneMgr->createEntity(mEntityName, mEntityName); //mClusterizedEntities = mSceneMgr->createEntity("mapleLeavesClusterizedEntitiesMerged.mesh", "mapleLeavesClusterizedEntitiesMerged.mesh"); mClusterizedEntitiesMergedSceneNode->attachObject(mClusterizedEntities); mTextureAtlas = IMG::TextureAtlasPtr( new IMG::TextureAtlas() ); mTextureAtlas->create("TextureAtlas", mTextureAtlasSize, mTextureAtlasSize, mSrcPixelFormat, mCamera); mTextureAtlas->setRenderTargetListener(&mTextureAtlasListener); mTextureAtlas->setTextureAtlasSceneNode(mClusterizedEntitiesMergedSceneNode); Ogre::MaterialPtr materialPtr1 = Ogre::MaterialManager::getSingleton().create("textureAtlasMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); materialPtr1->getTechnique(0)->getPass(0)->setDiffuse( 1.0, 1.0, 1.0, 1.0); materialPtr1->getTechnique(0)->getPass(0)->setAlphaRejectSettings(Ogre::CMPF_GREATER_EQUAL, 10); materialPtr1->getTechnique(0)->getPass(0)->createTextureUnitState("transparent.png"); materialPtr1->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureFiltering(Ogre::FO_NONE, Ogre::FO_NONE, Ogre::FO_NONE); materialPtr1->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP); mTextureAtlas->setMaterial(materialPtr1.getPointer()); mTextureAtlas->setCorners(-1.0, 1.0, 1.0, -1.0); mClusterTexture = IMG::TexturePtr( new IMG::Texture() ); mClusterTexture->create("clusterTexture", mTextureSize, mTextureSize, mSrcPixelFormat, mCamera); mClusterTexture->setRenderTargetListener(&mClusterTextureListener); Ogre::MaterialPtr materialPtr = Ogre::MaterialManager::getSingleton().create("textureMaterial", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); materialPtr->getTechnique(0)->getPass(0)->setAmbient( 1.0, Ogre::Math::RangeRandom(0.5,1.0), 1.0 ); materialPtr->getTechnique(0)->getPass(0)->setDiffuse( 1.0, 1.0, 1.0, 1.0 ); //materialPtr->getTechnique(0)->getPass(0)->setAlphaRejectSettings(Ogre::CMPF_GREATER_EQUAL, 10); //materialPtr->getTechnique(0)->getPass(0)->createTextureUnitState("clusterTexture", 0); mClusterTexture->setMaterial(materialPtr.getPointer()); mTextureAtlas->addTexture(mClusterTexture); mClusterTextureListener.setNumTextures(mClusterizedEntities->getNumSubEntities()); mClusterTextureListener.setTextureAtlas(mTextureAtlas); mClusterTextureListener.setTexture(mClusterTexture); mClusterTextureListener.setEntity(mClusterizedEntities); mNumTextures = mClusterizedEntities->getNumSubEntities(); mCurrentTexture = 0; } void BillboardCloudTextureViewMode::destroyScene() { } }