Go to the documentation of this file.00001 #include "OverlayHelper.h"
00002 #include "OgreTextAreaOverlayElement.h"
00003 #include "OgrePanelOverlayElement.h"
00004 #include "OgreOverlayManager.h"
00005 #include "OgreOverlayElementFactory.h"
00006
00007
00008 using namespace Ogre;
00009
00010 OverlayHelper::TimedOverlay::TimedOverlay()
00011 {
00012 }
00013 OverlayHelper::TimedOverlay::~TimedOverlay()
00014 {
00015 }
00016 OverlayHelper::TimedOverlay::TimedOverlay(OverlayElement *overlayElement, unsigned int totalTime, unsigned int fadeTimeMS, float finalAlpha, bool deleteAfterFade)
00017 {
00018 startFadeAlpha=-1.0f;
00019 this->overlayElement=overlayElement;
00020 this->remainingTimeMS=totalTime;
00021 this->fadeTimeMS=fadeTimeMS;
00022 this->finalAlpha=finalAlpha;
00023 this->deleteAfterFade=deleteAfterFade;
00024 }
00025 OverlayHelper::OverlayHelper()
00026 {
00027 globalOverlay=0;
00028 }
00029 OverlayHelper::~OverlayHelper()
00030 {
00031
00032 }
00033 void OverlayHelper::Startup(void)
00034 {
00035 globalOverlay = OverlayManager::getSingleton().create("OverlayHelperRoot");
00036 globalOverlay->show();
00037 }
00038 void OverlayHelper::Shutdown(void)
00039 {
00040 timedOverlays.Clear(false, __FILE__, __LINE__ );
00041 if (globalOverlay)
00042 OverlayManager::getSingleton().destroy(globalOverlay);
00043 }
00044 void OverlayHelper::Update(unsigned int elapsedTimeMS)
00045 {
00046 unsigned i;
00047 i=0;
00048 while (i < timedOverlays.Size())
00049 {
00050 if (timedOverlays[i].remainingTimeMS < elapsedTimeMS)
00051 {
00052 if (timedOverlays[i].deleteAfterFade)
00053 {
00054 SafeDestroyOverlayElement(timedOverlays[i].overlayElement);
00055 }
00056 else
00057 {
00058 const ColourValue &color = timedOverlays[i].overlayElement->getColour();
00059 ColourValue newColor = color;
00060 newColor.a=timedOverlays[i].finalAlpha;
00061 timedOverlays[i].overlayElement->setColour(newColor);
00062 timedOverlays.RemoveAtIndex(i);
00063 }
00064 }
00065 else
00066 {
00067 timedOverlays[i].remainingTimeMS-=elapsedTimeMS;
00068 if (timedOverlays[i].remainingTimeMS < timedOverlays[i].fadeTimeMS)
00069 {
00070 const ColourValue &color = timedOverlays[i].overlayElement->getColour();
00071 if (timedOverlays[i].startFadeAlpha==-1.0f)
00072 timedOverlays[i].startFadeAlpha=color.a;
00073 ColourValue newColor = color;
00074 newColor.a=timedOverlays[i].finalAlpha - (timedOverlays[i].finalAlpha-timedOverlays[i].startFadeAlpha) * (float) timedOverlays[i].remainingTimeMS / (float) timedOverlays[i].fadeTimeMS;
00075 timedOverlays[i].overlayElement->setColour(newColor);
00076 }
00077 i++;
00078 }
00079 }
00080 }
00081 Overlay* OverlayHelper::GetGlobalOverlay(void) const
00082 {
00083 return globalOverlay;
00084 }
00085 void OverlayHelper::FadeOverlayElement(OverlayElement* element, unsigned int totalTime, unsigned int fadeTimeMS, float finalAlpha, bool deleteAfterFade)
00086 {
00087 timedOverlays.Insert(TimedOverlay(element, totalTime, fadeTimeMS, finalAlpha,deleteAfterFade), __FILE__, __LINE__ );
00088 }
00089 OverlayContainer* OverlayHelper::CreatePanel(const char *instanceName, bool addToGlobalOverlay)
00090 {
00091 OverlayContainer* element = (OverlayContainer*) OverlayManager::getSingleton().createOverlayElement("Panel", instanceName);
00092 if (addToGlobalOverlay)
00093 globalOverlay->add2D(element);
00094 return element;
00095 }
00096 TextAreaOverlayElement *OverlayHelper::CreateTextArea(const char *instanceName, const char *fontName, OverlayContainer* parent)
00097 {
00098 TextAreaOverlayElement *element = (TextAreaOverlayElement *) OverlayManager::getSingleton().createOverlayElement("TextArea", instanceName);
00099 if (parent)
00100 parent->addChild(element);
00101 element->setFontName(fontName);
00102 return element;
00103 }
00104 BorderPanelOverlayElement *OverlayHelper::CreateBorderPanel(const char *instanceName, OverlayContainer* parent)
00105 {
00106 BorderPanelOverlayElement *element = (BorderPanelOverlayElement *) OverlayManager::getSingleton().createOverlayElement("BorderPanel", instanceName);
00107 if (parent)
00108 parent->addChild(element);
00109 return element;
00110 }
00111 void OverlayHelper::SafeDestroyOverlayElement(OverlayElement *item)
00112 {
00113 if (item->isContainer())
00114 {
00115 OverlayContainer *container = (OverlayContainer*) item;
00116
00117
00118
00119 OverlayManager::OverlayMapIterator iter1 = OverlayManager::getSingleton().getOverlayIterator();
00120 while (iter1.hasMoreElements())
00121 {
00122 iter1.getNext()->remove2D(container);
00123 }
00124
00125 OverlayContainer::ChildIterator iter2 = container->getChildIterator();
00126 while (iter2.hasMoreElements())
00127 {
00128 iter2.getNext()->_setParent(0);
00129 }
00130
00131 OverlayContainer::ChildContainerIterator iter3 = container->getChildContainerIterator();
00132 while (iter3.hasMoreElements())
00133 {
00134 iter3.getNext()->_setParent(0);
00135 }
00136 }
00137
00138 if (item->getParent())
00139 item->getParent()->removeChild(item->getName());
00140 OverlayManager::getSingleton().destroyOverlayElement(item);
00141 unsigned i;
00142 i=0;
00143 while (i < timedOverlays.Size())
00144 {
00145 if (timedOverlays[i].overlayElement==item)
00146 timedOverlays.RemoveAtIndex(i);
00147 else
00148 i++;
00149 }
00150 }