HUDElement2D.cpp

Go to the documentation of this file.
00001 #if 0  // OBSOLETE FILE
00002 #include "prefix.h"
00003 #include "client.h"
00004 #include "object.h"
00005 #include "timer.h"
00006 #include <math.h>
00007 #include "HUDElement2D.h"
00008 #include "input.h"
00009 #include "scripting.h"
00010 #include "ogrewrapper.h"
00011 #include <Ogre.h>
00012 
00013 #define kHUDOverlayZOrder 400
00014 
00015 #ifndef fmax
00016     #define fmax(a,b) (a<b?b:a)
00017 #endif
00018 
00019 #ifndef fmin
00020     #define fmin(a,b) (a>b?b:a)
00021 #endif
00022 
00023 using namespace Ogre;
00024 
00025 Ogre::Overlay*      cHUDElement2D::mpHUDOverlay; // one global overlay
00026 
00027 enum {
00028     kListenerBinding_EveryFrame,
00029     kListenerBinding_EveryHalfSecond,
00030     kListenerBinding_ObjectDeath,
00031 };
00032 
00033 cHUDElement2D::cHUDElement2D() : 
00034         mbVisible(false), mbObjHasBeenKilled(false), mbPosModeObject_UpdateSize(false), mbWatchMouse(false), mbMouseIsOver(false),
00035         mvBase(0,0), mvParam(0,0), mvParam2(0,0), mvSizeParam(1.0,1.0), mfCurRotate(0),
00036         mpGfx2D(0) { PROFILE
00037     miPosMode = kPosMode_None;
00038     miTurnMode = kTurnMode_None;
00039     miTextMode = kTextMode_None;
00040     static size_t miLastUID = 0;
00041     miUID = ++miLastUID;
00042     // warning ! avoid side effects here, use Init() instead, one instance is used as prototype for scripting
00043 }
00044 
00045 cHUDElement2D::~cHUDElement2D() { PROFILE
00046     if (mpGfx2D) { delete mpGfx2D; mpGfx2D = 0; }
00047 }
00048 
00050 void cHUDElement2D::Init () {
00051     // init the static mpHUDOverlay (one overlay for all hudelements)
00052     if (!mpHUDOverlay) mpHUDOverlay = cGfx2D::CreateOverlay("HUDOverlay",kHUDOverlayZOrder);
00053         
00054     mpGfx2D = new cGfx2D(mpHUDOverlay);
00055     
00056     // register listeners
00057     mpObj1.RegisterListener(this,(int)kListenerBinding_ObjectDeath);
00058     cTimer::GetSingletonPtr()->RegisterFrameIntervalListener(   this,0,  (int)kListenerBinding_EveryFrame);
00059     cTimer::GetSingletonPtr()->RegisterIntervalListener(        this,500,(int)kListenerBinding_EveryHalfSecond);    
00060 }
00061 
00062 
00063 void cHUDElement2D::Listener_Notify (cListenable* pTarget,const size_t eventcode,void* param,void* userdata) { PROFILE
00064     static char textbuf[255];
00065     switch (userdata) {
00066         case kListenerBinding_ObjectDeath: {
00067             // die when the target dies
00068             mbVisible = false;
00069             VarUpdate();
00070             mbObjHasBeenKilled = true; // don't delete directly, as this would destroy the smartpointer during iteration
00071         } break;
00072         case kListenerBinding_EveryHalfSecond: {
00073             if (!mbVisible) break;
00074             switch (miTextMode) {
00075                 case kTextMode_AbsSpeed: {
00076                         cObject* pObj1 = *mpObj1;
00077                         if(!pObj1) pObj1 = *cClient::mpPlayerShip;
00078                         if (pObj1) {
00079                                 Real dist = (pObj1->mvVel).length();
00080                                 if (dist < 10000) // output in m/s
00081                                         sprintf(textbuf,"%0.0fm/s",dist);
00082                                 else    sprintf(textbuf,"%0.0fkm/s",dist/1000);
00083                                 mpGfx2D->SetText(textbuf);
00084                         } else {
00085                                 mpGfx2D->SetText("");
00086                         }
00087                 } break;
00088                 case kTextMode_Dist: {
00089                     cObject* pObj1 = *mpObj1;
00090                     cObject* pObj2 = *cClient::mpPlayerShip;
00091                     if (pObj1 && pObj2) {
00092                         Real dist = (pObj1->mvPos - pObj2->mvPos).length();
00093                         if (dist < 10000) // output in m
00094                                 sprintf(textbuf,"%0.0fm",dist);
00095                         else    sprintf(textbuf,"%0.0fkm",dist/1000);
00096                         mpGfx2D->SetText(textbuf);
00097                     } else {
00098                         mpGfx2D->SetText("");
00099                     }
00100                 } break;
00101                 case kTextMode_FPS: {
00102                     static size_t iLastFPS_Frames = 0;
00103                     static float fLastFPS = 0;
00104                     size_t curframes = cTimer::miCurFrameNum;
00105                     if (iLastFPS_Frames != curframes) {
00106                         fLastFPS = (curframes - iLastFPS_Frames) * 2.0;
00107                         iLastFPS_Frames = curframes;
00108                     }
00109                     sprintf(textbuf,"%3.0f FPS",fLastFPS);
00110                     mpGfx2D->SetText(textbuf);
00111                 } break;
00112                 case kTextMode_RelSpeed:
00113                     // TODO...
00114                 break;
00115             }
00116         } break;
00117         case kListenerBinding_EveryFrame: {
00118             
00119             if (mbObjHasBeenKilled) {
00120                 delete this;
00121                 return;
00122             }
00123             
00124             if (mbWatchMouse) {
00125                 bool bNewMouseIsOver = mpGfx2D->IsPointWithin(cInput::iMouse[0],cInput::iMouse[1]);
00126                 if (bNewMouseIsOver && !mbMouseIsOver) cScripting::GetSingletonPtr()->LuaCall("MouseEnterHUDElement","i",(int)miUID);
00127                 if (!bNewMouseIsOver && mbMouseIsOver) cScripting::GetSingletonPtr()->LuaCall("MouseLeaveHUDElement","i",(int)miUID);
00128                 mbMouseIsOver = bNewMouseIsOver;
00129             }
00130             
00131             TrackingStep();
00132         } break;
00133     }
00134 }
00135 
00137 void    cHUDElement2D::VarUpdate        () { PROFILE
00138     mpGfx2D->SetRotate(mfCurRotate);
00139     TrackingStep();
00140 }
00141 
00143 void    cHUDElement2D::TrackingStep     () { PROFILE
00144     bool bShow = mbVisible;
00145     if (!(miPosMode == kPosMode_None && miTurnMode == kTurnMode_None) && bShow) {
00146         
00147         cObject* pObj1 = *mpObj1;
00148         cObject* pObj2 = *cClient::mpPlayerShip;
00149         static Real x,y,cx,cy,sw,sh;
00150         sw = Real(cGfx2D::GetViewportWidth());
00151         sh = Real(cGfx2D::GetViewportHeight());
00152         bool bIsOnSreen = false;
00153 
00154         switch (miPosMode) {
00155             case kPosMode_Object:
00156                 if (pObj1 && pObj1->IsInScene()) {
00157                     bIsOnSreen = GetScreenPos(pObj1->mvPos,x,y,pObj1->mfRad,cx,cy);
00158                     mpGfx2D->SetPos(mvBase.x + (x + 1.0 + mvParam.x * cx)*0.5*sw,mvBase.y + (-y + 1.0 + mvParam.y * cy)*0.5*sh);
00159                     if (mbPosModeObject_UpdateSize) mpGfx2D->SetDimensions(cx*sw+mvSizeParam.x,cy*sh+mvSizeParam.y);
00160                     if (!bIsOnSreen) bShow = false;
00161                 } else { bShow = false; }
00162             break;
00163             case kPosMode_Aim:
00164                 if (pObj1 && pObj2 && pObj1->IsInScene()) {
00165                     Real dist = (pObj1->mvPos - pObj2->mvPos).length();
00166                     Real fVorhaltTime = (mfParam > 0.0) ? (dist / mfParam) : 0.0;
00167                     bIsOnSreen = GetScreenPos(pObj1->mvPos + (pObj1->mvVel - pObj2->mvVel)*fVorhaltTime,x,y,pObj1->mfRad,cx,cy);
00168                     mpGfx2D->SetPos(mvBase.x + (x + 1.0 + mvParam.x * cx)*0.5*sw,mvBase.y + (-y + 1.0 + mvParam.y * cy)*0.5*sh);
00169                     if (mbPosModeObject_UpdateSize) mpGfx2D->SetDimensions(cx*sw+mvSizeParam.x,cy*sh+mvSizeParam.y);
00170                     if (!bIsOnSreen) bShow = false;
00171                 } else { bShow = false; }
00172             break; 
00173             case kPosMode_ObjectDir:
00174                 if (pObj1 && pObj1->IsInScene()) {
00175                     bIsOnSreen = GetScreenPos(pObj1->mvPos,x,y,pObj1->mfRad,cx,cy);
00176                     bShow = !bIsOnSreen;
00177                     if (bShow) {
00179                         if (mvParam2.x <= 0.0) mvParam2.x = sw-mvParam2.x;
00180                         if (mvParam2.y <= 0.0) mvParam2.y = sh-mvParam2.y;
00181                         mpGfx2D->SetPos(    fmax(mvParam.x,fmin(mvParam2.x,mvBase.x + 0.5*(x+1.0)*sw)),
00182                                             fmax(mvParam.y,fmin(mvParam2.y,mvBase.y + 0.5*(-y+1.0)*sh)) );
00183                     }
00184                 } else { bShow = false; }
00185             break; 
00186         }
00187         switch (miTurnMode) {
00188             case kTurnMode_Constant:    mpGfx2D->SetRotate(mfCurRotate + mfTurnBase); break;
00189             case kTurnMode_ObjectDist:  {
00190                 Real dist = (pObj1 && pObj2) ? ((pObj1->mvPos - pObj2->mvPos).length()) : 0.0;
00192                 mpGfx2D->SetRotate(mfCurRotate + fmax(mfTurnMin,fmin(mfTurnMax,mfTurnBase + mfTurnParam*dist + mfTurnParam2*dist*dist)));
00193             } break;
00194             case kTurnMode_ObjectDir:
00195                 if (miPosMode == kPosMode_ObjectDir) {
00196                     if (pObj1) {
00197                         mpGfx2D->SetRotate(atan2(y-0.5,x-0.5));
00198                     }
00199                 }
00200             break;
00201         }
00202     }
00203     mpGfx2D->SetVisible(bShow);
00204 }
00205 
00206 
00209 bool    cHUDElement2D::GetScreenPos (const Vector3& pos,Real& x,Real& y,const Real rad,Real& cx,Real& cy) { PROFILE
00210     Camera* cam = cOgreWrapper::GetSingleton().mCamera;
00211     Vector3 eyeSpacePos = cam->getViewMatrix(true) * pos;
00212     // z < 0 means in front of cam
00213     if (eyeSpacePos.z < 0) {
00214         Vector3 screenSpacePos = cam->getProjectionMatrix() * eyeSpacePos;
00215         x = screenSpacePos.x;
00216         y = screenSpacePos.y;
00217         bool bIsOnSreen = true;
00218         if (x < -1.0) { x = -1.0; bIsOnSreen = false; } if (x > 1.0) { x = 1.0; bIsOnSreen = false; }
00219         if (y < -1.0) { y = -1.0; bIsOnSreen = false; } if (y > 1.0) { y = 1.0; bIsOnSreen = false; }
00220         if (bIsOnSreen) {
00221             Vector3 spheresize(rad, rad, eyeSpacePos.z);
00222             spheresize = cam->getProjectionMatrix() * spheresize;
00223             cx = spheresize.x;
00224             cy = spheresize.y;
00225         } else {
00226             cx = 0;
00227             cy = 0;
00228         }
00229         return bIsOnSreen;
00230     } else {
00231         cx = 0;
00232         cy = 0;
00233         x = (-eyeSpacePos.x > 0) ? -1 : 1;
00234         y = (-eyeSpacePos.y > 0) ? -1 : 1;
00235         return false;
00236     }
00237 }
00238 #endif

Generated on Tue May 22 06:00:14 2012 for cpp by  doxygen 1.5.6