Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include "OgreViewportOverlay.h"
00037 using namespace Ogre;
00038
00039 OgreViewportOverlay::OgreViewportOverlay(const std::string& name, Viewport* _viewport, int _width, int _height, const Hikari::Position& pos, const std::string& matName, unsigned short zOrder)
00040 {
00041 width = _width;
00042 height = _height;
00043 position = pos;
00044 isVisible = true;
00045
00046 viewport=0;
00047 panel=0;
00048 overlay=0;
00049
00050 OverlayManager& overlayManager = OverlayManager::getSingleton();
00051 viewport = _viewport;
00052
00053 panel = static_cast<PanelOverlayElement*>(overlayManager.createOverlayElement("Panel", name + "Panel"));
00054 getPanel()->setMetricsMode((Ogre::GMM_PIXELS));
00055 getPanel()->setMaterialName(matName);
00056 getPanel()->setDimensions(width, height);
00057
00058 overlay = overlayManager.create(name + "Overlay");
00059 getOverlay()->add2D(panel);
00060 getOverlay()->setZOrder(zOrder);
00061
00062 resetPosition();
00063
00064 getOverlay()->show();
00065 }
00066
00067 OgreViewportOverlay::~OgreViewportOverlay()
00068 {
00069 if(overlay)
00070 {
00071 getOverlay()->remove2D(panel);
00072 OverlayManager::getSingletonPtr()->destroyOverlayElement(getPanel());
00073 OverlayManager::getSingletonPtr()->destroy(getOverlay());
00074 }
00075 }
00076
00077 void OgreViewportOverlay::move(int deltaX, int deltaY)
00078 {
00079 getPanel()->setPosition(getPanel()->getLeft()+deltaX, getPanel()->getTop()+deltaY);
00080 }
00081
00082 void OgreViewportOverlay::setPosition(const Hikari::Position& position)
00083 {
00084 this->position = position;
00085 resetPosition();
00086 }
00087
00088 void OgreViewportOverlay::resetPosition()
00089 {
00090 int viewWidth = getViewport()->getActualWidth();
00091 int viewHeight = getViewport()->getActualHeight();
00092
00093 if(position.usingRelative)
00094 {
00095 int left = 0 + position.data.rel.x;
00096 int center = (viewWidth/2)-(width/2) + position.data.rel.x;
00097 int right = viewWidth - width + position.data.rel.x;
00098
00099 int top = 0 + position.data.rel.y;
00100 int middle = (viewHeight/2)-(height/2) + position.data.rel.y;
00101 int bottom = viewHeight-height + position.data.rel.y;
00102
00103 switch(position.data.rel.position)
00104 {
00105 case Hikari::Left:
00106 getPanel()->setPosition(left, middle);
00107 break;
00108 case Hikari::TopLeft:
00109 getPanel()->setPosition(left, top);
00110 break;
00111 case Hikari::TopCenter:
00112 getPanel()->setPosition(center, top);
00113 break;
00114 case Hikari::TopRight:
00115 getPanel()->setPosition(right, top);
00116 break;
00117 case Hikari::Right:
00118 getPanel()->setPosition(right, middle);
00119 break;
00120 case Hikari::BottomRight:
00121 getPanel()->setPosition(right, bottom);
00122 break;
00123 case Hikari::BottomCenter:
00124 getPanel()->setPosition(center, bottom);
00125 break;
00126 case Hikari::BottomLeft:
00127 getPanel()->setPosition(left, bottom);
00128 break;
00129 case Hikari::Center:
00130 getPanel()->setPosition(center, middle);
00131 break;
00132 default:
00133 getPanel()->setPosition(position.data.rel.x, position.data.rel.y);
00134 break;
00135 }
00136 }
00137 else
00138 getPanel()->setPosition(position.data.abs.left, position.data.abs.top);
00139 }
00140
00141 void OgreViewportOverlay::resize(int width, int height)
00142 {
00143 this->width = width;
00144 this->height = height;
00145 getPanel()->setDimensions(width, height);
00146 }
00147
00148 void OgreViewportOverlay::hide()
00149 {
00150 isVisible = false;
00151 this->getOverlay()->hide();
00152 }
00153
00154 void OgreViewportOverlay::show()
00155 {
00156 isVisible = true;
00157 this->getOverlay()->show();
00158 }
00159
00160 int OgreViewportOverlay::getRelativeX(int absX)
00161 {
00162 return absX - getViewport()->getActualLeft() - getPanel()->getLeft();
00163 }
00164
00165 int OgreViewportOverlay::getRelativeY(int absY)
00166 {
00167 return absY - getViewport()->getActualTop() - getPanel()->getTop();
00168 }
00169
00170 bool OgreViewportOverlay::isWithinBounds(int absX, int absY)
00171 {
00172 int localX = getRelativeX(absX);
00173 int localY = getRelativeY(absY);
00174
00175 if(localX > 0 && localX < width)
00176 if(localY > 0 && localY < height)
00177 return true;
00178
00179 return false;
00180 }