diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/Display.h b/GeneralsMD/Code/GameEngine/Include/GameClient/Display.h index 7b889b9c0b..a738047292 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/Display.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/Display.h @@ -96,6 +96,11 @@ class Display : public SubsystemInterface virtual void dumpAssetUsage(const char* mapname) = 0; #endif + //--------------------------------------------------------------------------------------- + // Display scaling methods + Real getWidthScale(); + Real getHeightScale(); + //--------------------------------------------------------------------------------------- // View management virtual void attachView( View *view ); ///< Attach the given view to the world diff --git a/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h b/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h index 631f371fc5..cdfca9432c 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h +++ b/GeneralsMD/Code/GameEngine/Include/GameClient/InGameUI.h @@ -584,6 +584,15 @@ friend class Drawable; // for selection/deselection transactions void setDrawRMBScrollAnchor(Bool b) { m_drawRMBScrollAnchor = b; } void setMoveRMBScrollAnchor(Bool b) { m_moveRMBScrollAnchor = b; } + // UI scaling function methods + Real m_unitInfoResolutionScaleFactor; + Real m_healthResolutionScaleFactor; + + void calcUnitInfoScaleFactor(); + + Real getUnitInfoScaleFactor(); + Real getUnitHealthbarScaleFactor(); + private: virtual Int getIdleWorkerCount( void ); virtual Object *findIdleWorker( Object *obj); diff --git a/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h b/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h index 70714d8f37..8403b5bae2 100644 --- a/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h +++ b/GeneralsMD/Code/GameEngine/Include/GameLogic/Object.h @@ -155,6 +155,7 @@ enum CrushSquishTestType CPP_11(: Int) TEST_CRUSH_OR_SQUISH }; +const Real defaultHealthBoxHeight = 3.0f; // --------------------------------------------------- /** diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Display.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Display.cpp index 7e29edcd79..ba55f74d34 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Display.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Display.cpp @@ -202,6 +202,18 @@ void Display::setHeight( UnsignedInt height ) } +// Return the ratio of the current display width relative to the default resolution +Real Display::getWidthScale(void) +{ + return (Real)m_width / DEFAULT_DISPLAY_WIDTH; +} + +// Return the ratio of the current display height relative to the default resolution +Real Display::getHeightScale(void) +{ + return (Real)m_height / DEFAULT_DISPLAY_HEIGHT; +} + //============================================================================ // Display::playLogoMovie // minMovieLength is in milliseconds diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp index 46d261a6c0..414e066ba2 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/Drawable.cpp @@ -2687,22 +2687,17 @@ static Bool computeHealthRegion( const Drawable *draw, IRegion2D& region ) if (!obj->getHealthBoxDimensions(healthBoxHeight, healthBoxWidth)) return FALSE; - // scale the health bars according to the zoom - Real zoom = TheTacticalView->getZoom(); - //Real widthScale = 1.3f / zoom; - Real widthScale = 1.0f / zoom; - //Real heightScale = 0.8f / zoom; - Real heightScale = 1.0f; + // scale the health bars according to the zoom and resolution + Real zoomScale = 1.0f / TheTacticalView->getZoom(); - healthBoxWidth *= widthScale; - healthBoxHeight *= heightScale; + healthBoxWidth *= zoomScale * TheInGameUI->getUnitInfoScaleFactor(); + healthBoxHeight *= TheInGameUI->getUnitHealthbarScaleFactor(); - // do this so health bar doesn't get too skinny or fat after scaling - //healthBoxHeight = max(3.0f, healthBoxHeight); - healthBoxHeight = 3.0f; + // do this so health bar doesn't get too skinny after scaling + healthBoxHeight = max(defaultHealthBoxHeight, healthBoxHeight); // figure out the final region for the health box - region.lo.x = screenCenter.x - healthBoxWidth * 0.45f; + region.lo.x = screenCenter.x - healthBoxWidth * 0.5f; region.lo.y = screenCenter.y - healthBoxHeight * 0.5f; region.hi.x = region.lo.x + healthBoxWidth; region.hi.y = region.lo.y + healthBoxHeight; @@ -2839,10 +2834,10 @@ void Drawable::drawEmoticon( const IRegion2D *healthBarRegion ) if( healthBarRegion && getIconInfo()->m_keepTillFrame[ ICON_EMOTICON ] >= now ) { //Draw the emoticon. - Int barWidth = healthBarRegion->hi.x - healthBarRegion->lo.x; + Int barWidth = healthBarRegion->width(); //Int barHeight = healthBarRegion.hi.y - healthBarRegion.lo.y; - Int frameWidth = getIconInfo()->m_icon[ ICON_EMOTICON ]->getCurrentFrameWidth(); - Int frameHeight = getIconInfo()->m_icon[ ICON_EMOTICON ]->getCurrentFrameHeight(); + Int frameWidth = getIconInfo()->m_icon[ ICON_EMOTICON ]->getCurrentFrameWidth() * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ ICON_EMOTICON ]->getCurrentFrameHeight() * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -2893,9 +2888,9 @@ void Drawable::drawAmmo( const IRegion2D *healthBarRegion ) Real scale = 1.0f; #endif - Int boxWidth = REAL_TO_INT(s_emptyAmmo->getImageWidth() * scale); - Int boxHeight = REAL_TO_INT(s_emptyAmmo->getImageHeight() * scale); - const Int SPACING = 1; + Int boxWidth = s_emptyAmmo->getImageWidth() * scale * TheInGameUI->getUnitInfoScaleFactor(); + Int boxHeight = s_emptyAmmo->getImageHeight() * scale * TheInGameUI->getUnitInfoScaleFactor(); + const Real SPACING = 1.0f * TheInGameUI->getUnitInfoScaleFactor(); //Int totalWidth = (boxWidth+SPACING)*numTotal; ICoord2D screenCenter; @@ -2960,9 +2955,9 @@ void Drawable::drawContained( const IRegion2D *healthBarRegion ) #else Real scale = 1.0f; #endif - Int boxWidth = REAL_TO_INT(s_emptyContainer->getImageWidth() * scale); - Int boxHeight = REAL_TO_INT(s_emptyContainer->getImageHeight() * scale); - const Int SPACING = 1; + Int boxWidth = s_emptyContainer->getImageWidth() * scale * TheInGameUI->getUnitInfoScaleFactor(); + Int boxHeight = s_emptyContainer->getImageHeight() * scale * TheInGameUI->getUnitInfoScaleFactor(); + const Real SPACING = 1.0f * TheInGameUI->getUnitInfoScaleFactor(); //Int totalWidth = (boxWidth+SPACING)*numTotal; ICoord2D screenCenter; @@ -3013,8 +3008,8 @@ void Drawable::drawBattlePlans( const IRegion2D *healthBarRegion ) getIconInfo()->m_icon[ ICON_BATTLEPLAN_BOMBARD ] = newInstance(Anim2D)( s_animationTemplates[ ICON_BATTLEPLAN_BOMBARD ], TheAnim2DCollection ); } //Int barHeight = healthBarRegion.hi.y - healthBarRegion.lo.y; - Int frameWidth = getIconInfo()->m_icon[ ICON_BATTLEPLAN_BOMBARD ]->getCurrentFrameWidth(); - Int frameHeight = getIconInfo()->m_icon[ ICON_BATTLEPLAN_BOMBARD ]->getCurrentFrameHeight(); + Int frameWidth = getIconInfo()->m_icon[ ICON_BATTLEPLAN_BOMBARD ]->getCurrentFrameWidth() * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ ICON_BATTLEPLAN_BOMBARD ]->getCurrentFrameHeight() * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -3041,8 +3036,8 @@ void Drawable::drawBattlePlans( const IRegion2D *healthBarRegion ) getIconInfo()->m_icon[ ICON_BATTLEPLAN_HOLDTHELINE ] = newInstance(Anim2D)( s_animationTemplates[ ICON_BATTLEPLAN_HOLDTHELINE ], TheAnim2DCollection ); } // draw the icon - Int frameWidth = getIconInfo()->m_icon[ ICON_BATTLEPLAN_HOLDTHELINE ]->getCurrentFrameWidth(); - Int frameHeight = getIconInfo()->m_icon[ ICON_BATTLEPLAN_HOLDTHELINE ]->getCurrentFrameHeight(); + Int frameWidth = getIconInfo()->m_icon[ ICON_BATTLEPLAN_HOLDTHELINE ]->getCurrentFrameWidth() * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ ICON_BATTLEPLAN_HOLDTHELINE ]->getCurrentFrameHeight() * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -3069,8 +3064,8 @@ void Drawable::drawBattlePlans( const IRegion2D *healthBarRegion ) getIconInfo()->m_icon[ ICON_BATTLEPLAN_SEARCHANDDESTROY ] = newInstance(Anim2D)( s_animationTemplates[ ICON_BATTLEPLAN_SEARCHANDDESTROY ], TheAnim2DCollection ); } // draw the icon - Int frameWidth = getIconInfo()->m_icon[ ICON_BATTLEPLAN_SEARCHANDDESTROY ]->getCurrentFrameWidth(); - Int frameHeight = getIconInfo()->m_icon[ ICON_BATTLEPLAN_SEARCHANDDESTROY ]->getCurrentFrameHeight(); + Int frameWidth = getIconInfo()->m_icon[ ICON_BATTLEPLAN_SEARCHANDDESTROY ]->getCurrentFrameWidth() * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ ICON_BATTLEPLAN_SEARCHANDDESTROY ]->getCurrentFrameHeight() * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -3281,10 +3276,10 @@ void Drawable::drawHealing(const IRegion2D* healthBarRegion) // we are going to draw the healing icon relative to the size of the health bar region // since that region takes into account hit point size and zoom factor of the camera too // - Int barWidth = healthBarRegion->hi.x - healthBarRegion->lo.x; + Int barWidth = healthBarRegion->width(); - Int frameWidth = getIconInfo()->m_icon[ typeIndex ]->getCurrentFrameWidth(); - Int frameHeight = getIconInfo()->m_icon[ typeIndex ]->getCurrentFrameHeight(); + Int frameWidth = getIconInfo()->m_icon[ typeIndex ]->getCurrentFrameWidth() * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ typeIndex ]->getCurrentFrameHeight() * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -3344,7 +3339,7 @@ void Drawable::drawEnthusiastic(const IRegion2D* healthBarRegion) // we are going to draw the healing icon relative to the size of the health bar region // since that region takes into account hit point size and zoom factor of the camera too // - Int barWidth = healthBarRegion->hi.x - healthBarRegion->lo.x;// used for position + Int barWidth = healthBarRegion->width();// used for position // based on our own kind of we have certain icons to display at a size scale Real scale; @@ -3355,8 +3350,8 @@ void Drawable::drawEnthusiastic(const IRegion2D* healthBarRegion) else scale = 0.5f; - Int frameWidth = getIconInfo()->m_icon[ iconIndex ]->getCurrentFrameWidth() * scale; - Int frameHeight = getIconInfo()->m_icon[ iconIndex ]->getCurrentFrameHeight() * scale; + Int frameWidth = getIconInfo()->m_icon[ iconIndex ]->getCurrentFrameWidth() * scale * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ iconIndex ]->getCurrentFrameHeight() * scale * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -3645,10 +3640,10 @@ void Drawable::drawDisabled(const IRegion2D* healthBarRegion) // draw the icon if( healthBarRegion ) { - Int barHeight = healthBarRegion->hi.y - healthBarRegion->lo.y; + Int barHeight = healthBarRegion->height(); - Int frameWidth = getIconInfo()->m_icon[ ICON_DISABLED ]->getCurrentFrameWidth(); - Int frameHeight = getIconInfo()->m_icon[ ICON_DISABLED ]->getCurrentFrameHeight(); + Int frameWidth = getIconInfo()->m_icon[ ICON_DISABLED ]->getCurrentFrameWidth() * TheInGameUI->getUnitInfoScaleFactor(); + Int frameHeight = getIconInfo()->m_icon[ ICON_DISABLED ]->getCurrentFrameHeight() * TheInGameUI->getUnitInfoScaleFactor(); #ifdef SCALE_ICONS_WITH_ZOOM_ML // adjust the width to be a % of the health bar region size @@ -3794,19 +3789,19 @@ void Drawable::drawVeterancy( const IRegion2D *healthBarRegion ) if (!image) return; - Real scale = 1.3f/CLAMP_ICON_ZOOM_FACTOR( TheTacticalView->getZoom() ); #ifdef SCALE_ICONS_WITH_ZOOM_ML + Real scale = 1.3f/CLAMP_ICON_ZOOM_FACTOR( TheTacticalView->getZoom() ); Real objScale = scale * 1.55f; #else Real objScale = 1.0f; #endif - Real vetBoxWidth = image->getImageWidth()*objScale; - Real vetBoxHeight = image->getImageHeight()*objScale; + Real vetBoxWidth = image->getImageWidth() * objScale * TheInGameUI->getUnitInfoScaleFactor(); + Real vetBoxHeight = image->getImageHeight() * objScale * TheInGameUI->getUnitInfoScaleFactor(); // - // take the center position of the object, go down to it's bottom extent, and project + // take the center position of the health region, go down to it's bottom extent, and project // that point to the screen, that will be the "center" of our veterancy box // @@ -3816,11 +3811,7 @@ void Drawable::drawVeterancy( const IRegion2D *healthBarRegion ) if( !TheTacticalView->worldToScreen( &p, &screenCenter ) ) return; - Real healthBoxWidth, healthBoxHeight; - if (!obj->getHealthBoxDimensions(healthBoxHeight, healthBoxWidth)) - return; - - screenCenter.x += healthBoxWidth * scale * 0.5f; + screenCenter.x += healthBarRegion->width() * 0.65f; // draw the image TheDisplay->drawImage(image, screenCenter.x + 1, screenCenter.y + 1, screenCenter.x + 1 + vetBoxWidth, screenCenter.y + 1 + vetBoxHeight); @@ -3925,23 +3916,32 @@ void Drawable::drawHealthBar(const IRegion2D* healthBarRegion) } + Real healthBoxWidth = healthBarRegion->width(); + Real healthBoxHeight = max((Int)defaultHealthBoxHeight, healthBarRegion->height()); + Real healthBoxOutlineSize = floorf(1.0f * TheInGameUI->getUnitHealthbarScaleFactor()); + // draw a filled bar for the health + // TheSuperHackers @info this takes up the whole size of the health rect area, the border is drawn over the top + // This simplifies the handling of the health bar + TheDisplay->drawFillRect( healthBarRegion->lo.x, healthBarRegion->lo.y, + healthBoxWidth * healthRatio, healthBoxHeight, + color ); - -/// Real scale = 1.3f / TheTacticalView->getZoom(); - Real healthBoxWidth = healthBarRegion->hi.x - healthBarRegion->lo.x; - - Real healthBoxHeight = max(3, healthBarRegion->hi.y - healthBarRegion->lo.y); - Real healthBoxOutlineSize = 1.0f; + // draw the health blend line but only for intermediate resolutions + // TheSuperHackers @info we adjust the line down by the thickness of the border to keep it with one line of exposed pixels + if (fmod(healthBoxHeight, defaultHealthBoxHeight) > 0.0f) { + Color outlineBlendColor = outlineColor - 0x77000000; + TheDisplay->drawLine( healthBarRegion->lo.x, healthBarRegion->lo.y + healthBoxOutlineSize, + healthBarRegion->lo.x + healthBoxWidth * healthRatio, healthBarRegion->lo.y + healthBoxOutlineSize, + healthBoxOutlineSize + 1.0f, outlineBlendColor); + } // draw the health box outline - TheDisplay->drawOpenRect( healthBarRegion->lo.x, healthBarRegion->lo.y, healthBoxWidth, healthBoxHeight, + // TheSuperHackers @info when drawing the outline, the underlying function grows the outline towards the center of the region + TheDisplay->drawOpenRect( healthBarRegion->lo.x, healthBarRegion->lo.y, + healthBoxWidth, healthBoxHeight, healthBoxOutlineSize, outlineColor ); - // draw a filled bar for the health - TheDisplay->drawFillRect( healthBarRegion->lo.x + 1, healthBarRegion->lo.y + 1, - (healthBoxWidth - 2) * healthRatio, healthBoxHeight - 2, - color ); } } diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp index 2d274d5bfb..49125bf317 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/MainMenu.cpp @@ -765,6 +765,8 @@ void DeclineResolution() TheShell->recreateWindowLayouts(); TheInGameUI->recreateControlBar(); + TheInGameUI->refreshCustomUiResources(); + TheInGameUI->calcUnitInfoScaleFactor(); } } diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp index 85952fe57b..2ae79ee7bd 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/OptionsMenu.cpp @@ -1506,6 +1506,7 @@ static void saveOptions( void ) TheInGameUI->recreateControlBar(); TheInGameUI->refreshCustomUiResources(); + TheInGameUI->calcUnitInfoScaleFactor(); } } } diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp index 8915cb3edf..0fdf49c531 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/InGameUI.cpp @@ -1086,6 +1086,9 @@ InGameUI::InGameUI() m_soloNexusSelectedDrawableID = INVALID_DRAWABLE_ID; + m_unitInfoResolutionScaleFactor = 1.0f; + m_healthResolutionScaleFactor = 1.0f; + } //------------------------------------------------------------------------------------------------- @@ -1219,6 +1222,9 @@ void InGameUI::init( void ) setDrawRMBScrollAnchor(TheGlobalData->m_drawScrollAnchor); setMoveRMBScrollAnchor(TheGlobalData->m_moveScrollAnchor); + // TheSuperHackers @todo implement option to retrieve user based scaling options + calcUnitInfoScaleFactor(); + } //------------------------------------------------------------------------------------------------- @@ -5909,3 +5915,19 @@ void InGameUI::drawGameTime() m_gameTimeString->draw(horizontalTimerOffset, m_gameTimePosition.y, m_gameTimeColor, m_gameTimeDropColor); m_gameTimeFrameString->draw(horizontalFrameOffset, m_gameTimePosition.y, GameMakeColor(180,180,180,255), m_gameTimeDropColor); } + +void InGameUI::calcUnitInfoScaleFactor() +{ + m_unitInfoResolutionScaleFactor = max(TheDisplay->getWidthScale(), TheDisplay->getHeightScale()); + m_healthResolutionScaleFactor = max(TheDisplay->getWidthScale(), TheDisplay->getHeightScale()); +} + +Real InGameUI::getUnitInfoScaleFactor() +{ + return m_unitInfoResolutionScaleFactor; +} + +Real InGameUI::getUnitHealthbarScaleFactor() +{ + return m_healthResolutionScaleFactor; +} diff --git a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp index f48cd78ec0..bc8fb5bdf6 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameLogic/Object/Object.cpp @@ -3379,7 +3379,7 @@ Bool Object::getHealthBoxDimensions(Real &healthBoxHeight, Real &healthBoxWidth) if( isKindOf( KINDOF_STRUCTURE ) ) { //enforce healthBoxHeightMinimum/Maximum - healthBoxHeight = min(3.0f, max(5.0f, maxHP/50)); + healthBoxHeight = min(defaultHealthBoxHeight, max(5.0f, maxHP/50)); //enforce healthBoxWidthMinimum/Maximum healthBoxWidth = min(150.0f, max(100.0f, maxHP/10)); return true; @@ -3387,7 +3387,7 @@ Bool Object::getHealthBoxDimensions(Real &healthBoxHeight, Real &healthBoxWidth) else if ( isKindOf(KINDOF_MOB_NEXUS) ) { //enforce healthBoxHeightMinimum/Maximum - healthBoxHeight = min(3.0f, max(5.0f, maxHP/50)); + healthBoxHeight = min(defaultHealthBoxHeight, max(5.0f, maxHP/50)); //enforce healthBoxWidthMinimum/Maximum healthBoxWidth = min(100.0f, max(66.0f, maxHP/10)); return true; @@ -3401,7 +3401,7 @@ Bool Object::getHealthBoxDimensions(Real &healthBoxHeight, Real &healthBoxWidth) else { //enforce healthBoxHeightMinimum/Maximum - healthBoxHeight = min(3.0f, max(5.0f, maxHP/50)); + healthBoxHeight = min(defaultHealthBoxHeight, max(5.0f, maxHP/50)); //enforce healthBoxWidthMinimum/Maximum healthBoxWidth = min(150.0f, max(35.0f, maxHP/10)); return true; @@ -3417,7 +3417,7 @@ Bool Object::getHealthBoxDimensions(Real &healthBoxHeight, Real &healthBoxWidth) //just add the major and minor axes Real size = MAX(20.0f, MIN(150.0f, (getGeometryInfo().getMajorRadius() + getGeometryInfo().getMinorRadius())) ); - healthBoxHeight = 3.0f; + healthBoxHeight = defaultHealthBoxHeight; healthBoxWidth = MAX(20.0f, size * 2.0f); return TRUE; diff --git a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp index 51a8cb7fac..01e03e3b25 100644 --- a/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp +++ b/GeneralsMD/Code/Libraries/Source/WWVegas/WW3D2/render2d.cpp @@ -590,15 +590,20 @@ void Render2DClass::Add_Outline( const RectClass & rect, float width, unsigned l void Render2DClass::Add_Outline( const RectClass & rect, float width, const RectClass & uv, unsigned long color ) { - // - // Pretty straight forward, simply add the four side of the rectangle as lines. - // - /** @todo colin, I had to tweak these to get precise line drawing, as we want - the UV bias on, but it just isn't lining up */ - Add_Line (Vector2 (rect.Left + 1, rect.Bottom), Vector2 (rect.Left + 1, rect.Top + 1), width, color); - Add_Line (Vector2 (rect.Left, rect.Top + 1), Vector2 (rect.Right - 1, rect.Top + 1), width, color); - Add_Line (Vector2 (rect.Right, rect.Top), Vector2 (rect.Right, rect.Bottom - 1), width, color); - Add_Line (Vector2 (rect.Right, rect.Bottom), Vector2 (rect.Left + 1, rect.Bottom), width, color); + // Pretty straight forward, add the four side of the rectangle as lines. + float lineWidthOffset = (width / 2); + + // TheSuperHackers @bugfix fixed the lines so they overlap eachother in the corners making a full rectangle + // Also offset the lines by half of their thickness so the border grows into the center of the rectangle + + // Draw left + Add_Line (Vector2 (rect.Left + lineWidthOffset, rect.Bottom), Vector2 (rect.Left + lineWidthOffset, rect.Top), width, color); + // Draw top + Add_Line (Vector2 (rect.Left, rect.Top + lineWidthOffset), Vector2 (rect.Right, rect.Top + lineWidthOffset), width, color); + // Draw right + Add_Line (Vector2 (rect.Right - lineWidthOffset, rect.Top), Vector2 (rect.Right - lineWidthOffset, rect.Bottom), width, color); + // Draw bottom + Add_Line (Vector2 (rect.Right, rect.Bottom - lineWidthOffset), Vector2 (rect.Left, rect.Bottom - lineWidthOffset), width, color); } void Render2DClass::Render(void)