#include "..\include\ogrerenderable.h" OgreRenderable::OgreRenderable(SubEntity* sube, Entity* parentEntity) { renderableType = OGRE_RENDERABLETYPE_SUBENTITY; subEntityRenderable = sube; this->parentEntity = parentEntity; int subEntityNum = 0; updateBounds(); for(unsigned int i = 0; i < parentEntity->getNumSubEntities(); i++) { if(parentEntity->getSubEntity(i) == sube) { subEntityNum = i; break; } } name = parentEntity->getName() + "_SE_" + StringConverter::toString(subEntityNum); } OgreRenderable::OgreRenderable(Entity* parentEntity, int subEntityNum) { SubEntity* sube = parentEntity->getSubEntity(subEntityNum); renderableType = OGRE_RENDERABLETYPE_SUBENTITY; subEntityRenderable = sube; this->parentEntity = parentEntity; updateBounds(); name = parentEntity->getName() + "_SE_" + StringConverter::toString(subEntityNum); } OgreRenderable::OgreRenderable(BillboardSet* billboardset, ParticleSystem* sys) { renderableType = OGRE_RENDERABLETYPE_BILLBOARDSET; billboardSetRenderable = billboardset; parentParticleSystem = sys; updateBounds(); name = sys->getName(); } OgreRenderable::~OgreRenderable(void) { } void OgreRenderable::setVisible(bool visible) { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: // subEntityRenderable->setVisible(visible); parentEntity->setVisible(visible); break; case OGRE_RENDERABLETYPE_BILLBOARDSET: if(parentParticleSystem != 0) parentParticleSystem->setVisible(visible); else billboardSetRenderable->setVisible(visible); break; default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::setVisible"); } } void OgreRenderable::setMaterialName(String& name) { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: subEntityRenderable->setMaterialName(name); break; case OGRE_RENDERABLETYPE_BILLBOARDSET: billboardSetRenderable->setMaterialName(name); break; default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::setMaterialName"); } } const MaterialPtr& OgreRenderable::getMaterialPtr() { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: return subEntityRenderable->getMaterial(); case OGRE_RENDERABLETYPE_BILLBOARDSET: return billboardSetRenderable->getMaterial(); default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type, can't return material pointer! Check RenderTechnique initializations!", "OgreRenderable::getMaterialPtr"); } } void OgreRenderable::setRenderGroup(unsigned char groupID) { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: parentEntity->setRenderQueueGroup(groupID); case OGRE_RENDERABLETYPE_BILLBOARDSET: billboardSetRenderable->setRenderQueueGroup(groupID); default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::setRenderGroup"); } } bool OgreRenderable::isVisible() { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: return subEntityRenderable->isVisible(); case OGRE_RENDERABLETYPE_BILLBOARDSET: return billboardSetRenderable->isVisible(); default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::isVisible"); } } void OgreRenderable::updateBounds() { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: parentEntity->getParentSceneNode()->_updateBounds(); boundingBox = parentEntity->getWorldBoundingBox(true); boundingSphere = parentEntity->getWorldBoundingSphere(true); break; case OGRE_RENDERABLETYPE_BILLBOARDSET: /* billboardSetRenderable->getParentSceneNode()->_updateBounds(); boundingBox = billboardSetRenderable->getWorldBoundingBox(true); boundingSphere = billboardSetRenderable->getWorldBoundingSphere(true);*/ parentParticleSystem->getParentSceneNode()->_updateBounds(); boundingBox = parentParticleSystem->getWorldBoundingBox(true); boundingSphere = parentParticleSystem->getWorldBoundingSphere(true); break; default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::updateBounds"); } } Renderable* OgreRenderable::getRenderable() { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: return subEntityRenderable; break; case OGRE_RENDERABLETYPE_BILLBOARDSET: return billboardSetRenderable; break; default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::getRenderable"); } } void OgreRenderable::notifyCamera(Camera* cam) { switch(renderableType) { case OGRE_RENDERABLETYPE_SUBENTITY: parentEntity->_notifyCurrentCamera(cam); break; case OGRE_RENDERABLETYPE_BILLBOARDSET: billboardSetRenderable->_notifyCurrentCamera(cam); break; default: OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, "Unknown renderable type! Check RenderTechnique initializations!", "OgreRenderable::notifyCamera"); } }