#pragma once #include #pragma warning (push) #include #include #include #include #include #pragma warning (pop) class gos_DBCS; extern __int64 tHUDTime,tHUDTextureTime,tHUDTextTime,tHUDFrameTime,tHUDLineTime,tHUDRectTime; extern bool hsh_initialized; void my_DrawRect( int x1, int y1, int x2, int y2, DWORD Color ); namespace MechWarrior4 { class Vehicle; inline void LDrawRect (const Stuff::Point3D& loc, int x1, int y1, int x2, int y2, DWORD color ) { my_DrawRect ((int) (x1+loc.x),(int) (y1+loc.y),(int) (x2+loc.x),(int) (y2+loc.y),color); } inline void DrawRect (const Stuff::Point3D& loc,Point3D size, DWORD color ) { my_DrawRect ((int) loc.x,(int) loc.y,(int) (loc.x+size.x),(int) (loc.y+size.y),color); } void DrawFrame (int x1,int y1,int x2,int y2,DWORD color); inline void LDrawFrame (const Stuff::Point3D& loc, int x1, int y1, int x2, int y2, DWORD color ) { DrawFrame ((int) (x1+loc.x),(int) (y1+loc.y),(int) (x2+loc.x),(int) (y2+loc.y),color); } inline void DrawFrame (const Stuff::Point3D& loc,const Stuff::Point3D& size, DWORD color ) { DrawFrame ((int) loc.x,(int) loc.y,(int) (loc.x+size.x),(int) (loc.y+size.y),color); } void DrawSpecFrame (int x1,int y1,int x2,int y2,DWORD color); inline void LDrawSpecFrame (const Stuff::Point3D& loc, int x1, int y1, int x2, int y2, DWORD color ) { DrawSpecFrame ((int) (x1+loc.x),(int) (y1+loc.y),(int) (x2+loc.x),(int) (y2+loc.y),color); } inline void DrawSpecFrame (const Stuff::Point3D& loc,const Stuff::Point3D& size, DWORD color ) { DrawSpecFrame ((int) loc.x,(int) loc.y,(int) (loc.x+size.x),(int) (loc.y+size.y),color); } void DrawLine (int x1,int y1,int x2,int y2,DWORD color); inline void LDrawLine (const Stuff::Point3D& loc, int x1, int y1, int x2, int y2, DWORD color ) { DrawLine ((int) (x1+loc.x),(int) (y1+loc.y),(int) (x2+loc.x),(int) (y2+loc.y),color); } inline DWORD MakeColor (DWORD red,DWORD green,DWORD blue,DWORD alpha) { return (alpha<<24) + (red<<16) + (green<<8) + (blue); } inline DWORD BrighterColor (DWORD color) { DWORD red,green,blue,alpha; red = (color>>16) & 0xff; green = (color>>8) & 0xff; blue = (color) & 0xff; alpha = (color>>24) & 0xff; if ((red <<1) > 255) red = 255; else red = red<<1; if ((green <<1) > 255) green = 255; else green = green<<1; if ((blue <<1) > 255) blue = 255; else blue = blue<<1; return (alpha<<24) + ((red)<<16) + (green<<8) + (blue); } inline DWORD DarkerColor (DWORD color) { DWORD red,green,blue,alpha; red = (color>>16) & 0xff; green = (color>>8) & 0xff; blue = (color) & 0xff; alpha = (color>>24) & 0xff; red = (int) (red * 0.75f); green = (int) (green * 0.75f); blue = (int) (blue * 0.75f); return (alpha<<24) + ((red)<<16) + (green<<8) + (blue); } const int MAX_HUD_TEXT = 255; struct HUDRectData { int x1,y1,x2,y2; DWORD color; HUDRectData (int p1,int p2,int p3,int p4,int p5) { x1 = p1; y1 = p2; x2 = p3; y2 = p4; color = p5; } }; inline bool operator< (const HUDRectData& p1,const HUDRectData& p2) { return (p1.color&0xff000000) < (p2.color&0xff000000); } extern stlport::vector *g_HUDRectRender; extern Stuff::Scalar g_AdjustMultX,g_AdjustMultY; extern Scalar g_HUDHeatLevel; extern Scalar g_HUDPPCLevel; void AdjustCoords (int& left, int& top,int& right, int& bottom); void AdjustCoords (Scalar& left, Scalar& top,Scalar& right, Scalar& bottom); void AdjustCoords (Scalar& left, Scalar& top); void AdjustCoords (int& left, int& top); class HUDTexture { public: enum FLIP { NO_FLIP, XFLIP, YFLIP, XYFLIP }; struct RenderData { Stuff::Point3D loc; Stuff::Point3D size; DWORD color; FLIP flip; HUDTexture *texture; RenderData (HUDTexture *p1,const Stuff::Point3D& p2,const Stuff::Point3D& p3,DWORD p4,FLIP p5) { texture = p1; loc = p2; size = p3; color = p4; flip = p5; } }; protected: static stlport::vector *g_TextureRender; static float TOffset; MidLevelRenderer::MLRTexture *m_Texture; Stuff::Scalar m_TopLeft[2],m_BottomRight[2]; // normalized uv's for texture static int m_LastTextureHandle; Stuff::Scalar m_Width,m_Height; Stuff::Scalar m_Rotation; Stuff::Scalar m_CosRot,m_SinRot; Stuff::Scalar m_OriginX,m_OriginY; Stuff::Scalar m_ScaleX,m_ScaleY; int m_BlendMode; int m_AlphaMode; bool m_Clip; void DrawImplementation (const Stuff::Point3D& loc,const Stuff::Point3D& size,DWORD argb,FLIP flip = NO_FLIP,bool drawnow=false); public: static void StartTexturePass (void); static void EndTexturePass (void); HUDTexture (const char *name,Stuff::Scalar left=0,Stuff::Scalar top=0,Stuff::Scalar right=1.0f,Stuff::Scalar bottom=1.0f,Stuff::Scalar width=256.0f,Stuff::Scalar height=256.0f); ~HUDTexture (); void TopLeft (Stuff::Scalar x,Stuff::Scalar y); void BottomRight (Stuff::Scalar x,Stuff::Scalar y); void Origin (Stuff::Scalar x,Stuff::Scalar y) { m_OriginX = x; m_OriginY = y; } void Scale (Stuff::Scalar x,Stuff::Scalar y) { m_ScaleX = x; m_ScaleY = y; } int TextureID (void) const; void Rotate (Stuff::Scalar value); void Clip (bool value) { m_Clip = value; } void BlendMode (int value) { m_BlendMode = value; } void AlphaMode (int value) { m_AlphaMode = value; } Stuff::Scalar Left (void) const { return m_TopLeft[0]; } Stuff::Scalar Top (void) const { return m_TopLeft[1]; } Stuff::Scalar Right (void) const { return m_BottomRight[0]; } Stuff::Scalar Bottom (void) const { return m_BottomRight[1]; } MidLevelRenderer::MLRTexture *Texture (void) { return m_Texture; } Stuff::Point3D Size (void) { Stuff::Point3D toret; toret.x = (Right () - Left ()) * m_Width; toret.y = (Bottom () - Top ()) * m_Height; toret.z = 0.0f; return toret; } void Draw (const Stuff::Point3D& loc,const Stuff::Point3D& size,DWORD argb,FLIP flip = NO_FLIP,bool drawnow=false); }; class ReviewTexture { public: enum FLIP { NO_FLIP, XFLIP, YFLIP, XYFLIP }; protected: DWORD m_TextureHandle; Stuff::Scalar m_TopLeft[2],m_BottomRight[2]; // normalized uv's for texture Stuff::Scalar m_Width,m_Height; Stuff::Scalar m_Rotation; Stuff::Scalar m_CosRot,m_SinRot; Stuff::Scalar m_OriginX,m_OriginY; Stuff::Scalar m_ScaleX,m_ScaleY; int m_BlendMode; int m_AlphaMode; bool m_Clip; void DrawImplementation (const Stuff::Point3D& loc,const Stuff::Point3D& size,DWORD argb,FLIP flip = NO_FLIP); public: ReviewTexture (const char *name,Stuff::Scalar left=0,Stuff::Scalar top=0,Stuff::Scalar right=1.0f,Stuff::Scalar bottom=1.0f,Stuff::Scalar width=256.0f,Stuff::Scalar height=256.0f,bool alpha = true); ~ReviewTexture (); void TopLeft (Stuff::Scalar x,Stuff::Scalar y); void BottomRight (Stuff::Scalar x,Stuff::Scalar y); void Origin (Stuff::Scalar x,Stuff::Scalar y) { m_OriginX = x; m_OriginY = y; } void Scale (Stuff::Scalar x,Stuff::Scalar y) { m_ScaleX = x; m_ScaleY = y; } int TextureID (void) const; void Rotate (Stuff::Scalar value); void Clip (bool value) { m_Clip = value; } void BlendMode (int value) { m_BlendMode = value; } void AlphaMode (int value) { m_AlphaMode = value; } Stuff::Scalar Left (void) const { return m_TopLeft[0]; } Stuff::Scalar Top (void) const { return m_TopLeft[1]; } Stuff::Scalar Right (void) const { return m_BottomRight[0]; } Stuff::Scalar Bottom (void) const { return m_BottomRight[1]; } Stuff::Point3D Size (void) { Stuff::Point3D toret; toret.x = (Right () - Left ()) * m_Width; toret.y = (Bottom () - Top ()) * m_Height; toret.z = 0.0f; return toret; } void Draw (const Stuff::Point3D& loc,const Stuff::Point3D& size,DWORD argb,FLIP flip = NO_FLIP); }; inline bool operator< (const HUDTexture::RenderData& p1,const HUDTexture::RenderData& p2) { return p1.texture->TextureID() < p2.texture->TextureID(); } class HUDText { protected: char m_Text[MAX_HUD_TEXT]; DWORD m_Color; HGOSFONT3D m_Font; int m_Justification; bool m_Wrap; int m_Size; gos_DBCS *m_GosObject; Stuff::Scalar m_TopLeft[2],m_BottomRight[2]; // margins DWORD m_Width,m_Height; bool m_BoundsValid; bool m_UseOldText; static HGOSFONT3D defaultFontHandle; static HGOSFONT3D altFontHandle; static int defaultFontRefCount; static int altFontRefCount; static int defaultSmallFontSize,defaultMediumFontSize,defaultLargeFontSize,defaultLarge2FontSize,defaultLarge3FontSize; static int deltaSmallSize,deltaMediumSize,deltaLargeSize,deltaLarge2Size,deltaLarge3Size; public: enum JUSTIFICATION { LEFT_ALIGN, RIGHT_ALIGN, CENTER_ALIGN, CENTERREGION_ALIGN }; enum { SMALL_SIZE, MEDIUM_SIZE, LARGE_SIZE, LARGE2_SIZE, LARGE3_SIZE }; static void LoadFontSizeDelta (NotationFile *startup_ini); HUDText (bool oldtext=false); virtual ~HUDText (void); void TopLeft (Stuff::Scalar x,Stuff::Scalar y); void BottomRight (Stuff::Scalar x,Stuff::Scalar y); Stuff::Scalar Left (void) const { return m_TopLeft[0]; } Stuff::Scalar Top (void) const { return m_TopLeft[1]; } Stuff::Scalar Right (void) const { return m_BottomRight[0]; } Stuff::Scalar Bottom (void) const { return m_BottomRight[1]; } void Color (DWORD value) { m_Color = value; } void Color (DWORD red,DWORD green,DWORD blue,DWORD alpha) { m_Color = MakeColor (red,green,blue,alpha); } void Font (HGOSFONT3D value) { m_Font = value; } void Justification (JUSTIFICATION value) { m_Justification = value; } void Wrap (bool value) { m_Wrap = value; } //»óÈÆ void SetAsAlt(){ m_Font=altFontHandle; } void SetAsDefault(){ m_Font=defaultFontHandle; } virtual void SetSize (int value) { switch (value) { case SMALL_SIZE: m_Size = defaultSmallFontSize + deltaSmallSize; break; case MEDIUM_SIZE: m_Size = defaultMediumFontSize + deltaMediumSize; break; case LARGE_SIZE: m_Size = defaultLargeFontSize + deltaLargeSize; break; case LARGE2_SIZE: m_Size = defaultLarge2FontSize + deltaLarge2Size; break; case LARGE3_SIZE: m_Size = defaultLarge3FontSize + deltaLarge3Size; break; default: STOP (("bad size for string in hud")); break; } #if 0 if (value) m_Size = value-1; // to correct for some funky math in gos else m_Size = defaultFontSize-1; // to correct for some funky math in gos #endif } virtual int Size (void) const { return m_Size; } virtual void DrawSize (DWORD& x,DWORD& y); void UpdateText (const char *text,bool force=false,bool extrareturn=false); virtual void Draw (Stuff::Point3D loc, bool bTextSetPos = true); virtual void Draw (void); virtual void EndPos (DWORD& x,DWORD& y, bool bAdjust = true); bool Empty (void) { return (m_Text[0] == 0); } //»óÈÆ ¾Õ char *hsh_get_m_Text(){return m_Text;} //»óÈÆ µÚ }; class HUDNumberText : public HUDText { protected: static HUDTexture *numTexture; static int numTextureRefCount; static int HUDNumberText::fontdata[14][11][4]; int GetIndex (int size); public: HUDNumberText (void); virtual ~HUDNumberText (void); virtual void DrawSize (DWORD& x,DWORD& y); virtual void SetSize (int value) { switch (value) { case SMALL_SIZE: m_Size = -8; break; case MEDIUM_SIZE: m_Size = -10; break; case LARGE_SIZE: m_Size = defaultLarge2FontSize + deltaLarge2Size; break; case LARGE2_SIZE: case LARGE3_SIZE: m_Size = -12; break; default: STOP (("bad size for string in hud")); break; } #if 0 if (value) m_Size = value; else m_Size = defaultFontSize; #endif } virtual int Size (void) const { return m_Size; } virtual void Draw (void) { STOP (("Should not call HUDNumberText::Draw")); } virtual void Draw (Stuff::Point3D loc); }; typedef GUIObject__ClassData HUDComponent__ClassData; typedef GUIObject__Message HUDComponent__Message; class HUDComponent { //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Inheritance Support // public: typedef HUDComponent__ClassData ClassData; typedef HUDComponent__Message Message; public: static void InitializeClass(); static void TerminateClass(); HUDComponent(ClassData *class_data,Stuff::Page *instance_page); HUDComponent(ClassData *class_data,Stuff::MemoryStream *stream); HUDComponent(ClassData *class_data = DefaultData); void Save(Stuff::MemoryStream *stream); ~HUDComponent(); void TestInstance(); //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Execution support // public: enum ALIGNMENT { LEFT_ALIGN, CENTER_ALIGNX, CENTER_ALIGNY, CENTER_ALIGNBOTH, RIGHT_ALIGN }; protected: bool m_Visible; ALIGNMENT m_Alignment; mutable Stuff::SlotOf m_Vehicle; Stuff::Point3D m_Location; // normalized Stuff::Point3D m_Size; Stuff::Time m_LastUpdateTime; DWORD m_Color; stlport::map m_Textures; stlport::map m_ReviewTextures; virtual void DrawImplementation (void); HUDTexture *AddTexture (const char *name,int id,Stuff::Scalar left=0,Stuff::Scalar top=0,Stuff::Scalar right=1.0f,Stuff::Scalar bottom=1.0f,Stuff::Scalar width=256.0f,Stuff::Scalar height=256.0f); ReviewTexture *AddReviewTexture (const char *name,int id,Stuff::Scalar left=0,Stuff::Scalar top=0,Stuff::Scalar right=1.0f,Stuff::Scalar bottom=1.0f,Stuff::Scalar width=256.0f,Stuff::Scalar height=256.0f,bool alpha=true); public: virtual void SetVehicle (Vehicle *veh); Vehicle *GetVehicle (void) { return m_Vehicle.GetCurrent (); } void Draw(bool vehoverride=false) { if (!m_Visible) return; if ((!vehoverride) && (!m_Vehicle.GetCurrent ())) return; DrawImplementation (); } virtual void Update (Stuff::Time till) { m_LastUpdateTime = till; } virtual void Reset (void) { } virtual void Show (void) { m_Visible = true; } virtual void Hide (void) { m_Visible = false; } bool Visible (void) { return m_Visible; } void Color (DWORD value) { m_Color = value; } void Color (DWORD red,DWORD green,DWORD blue,DWORD alpha) { m_Color = MakeColor (red,green,blue,alpha); } DWORD Color (void) const { return m_Color; } void Red (DWORD value) { m_Color = (m_Color&0xFF00FFFF) + (value << 16); } void Green (DWORD value) { m_Color = (m_Color&0xFFFF00FF) + (value << 8); } void Blue (DWORD value) { m_Color = (m_Color&0xFFFFFF00) + (value); } void Alpha (DWORD value) { m_Color = (m_Color&0x00FFFFFF) + (value << 24); } DWORD Red (void) const { return ((m_Color>>16) & 0xff); } DWORD Green (void) const { return ((m_Color>>8) & 0xff); } DWORD Blue (void) const { return ((m_Color) & 0xff); } DWORD Alpha (void) const { return ((m_Color>>24) & 0xff); } ALIGNMENT Alignment (void) const { return m_Alignment; } void Alignment (ALIGNMENT newalign) { m_Alignment = newalign; } void Location (const Stuff::Point3D& newpt) { m_Location = newpt; } Stuff::Point3D LocationRaw (void) const { return m_Location; } Stuff::Point3D Location (void) const { Stuff::Point3D toret; toret = m_Location; if (toret.x <= 1.0f) toret.x *= 800; if (toret.y <= 1.0f) toret.y *= 600; return toret; } void Size (const Stuff::Point3D& newpt) { m_Size = newpt;} Stuff::Point3D SizeRaw (void) const { return m_Size; } Stuff::Point3D Size (void) const { Stuff::Point3D toret; toret = m_Size; if (toret.x <= 1.0f) toret.x *= 800; if (toret.y <= 1.0f) toret.y *= 600; return toret; } Stuff::Point3D TopLeft (void) const; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Class Data support // public: static ClassData *DefaultData; }; }