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;
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
00043 }
00044
00045 cHUDElement2D::~cHUDElement2D() { PROFILE
00046 if (mpGfx2D) { delete mpGfx2D; mpGfx2D = 0; }
00047 }
00048
00050 void cHUDElement2D::Init () {
00051
00052 if (!mpHUDOverlay) mpHUDOverlay = cGfx2D::CreateOverlay("HUDOverlay",kHUDOverlayZOrder);
00053
00054 mpGfx2D = new cGfx2D(mpHUDOverlay);
00055
00056
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
00068 mbVisible = false;
00069 VarUpdate();
00070 mbObjHasBeenKilled = true;
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)
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)
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
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
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