//----------------------------------------------------------------------------- // Torque Game Engine // // Copyright (c) 2001 GarageGames.Com //----------------------------------------------------------------------------- #include "dgl/dgl.h" #include "gui/core/guiControl.h" #include "console/consoleTypes.h" #include "game/gameConnection.h" #include "game/shapeBase.h" //----------------------------------------------------------------------------- /** A basic health bar control. This gui displays the damage value of the current PlayerObjectType control object. The gui can be set to pulse if the health value drops below a set value. This control only works if a server connection exists and it's control object is a PlayerObjectType. If either of these requirements is false, the control is not rendered. */ class GuiVehicleHealthBar : public GuiControl { typedef GuiControl Parent; bool mShowFrame; bool mShowFill; bool mDisplayEnergy; ColorF mFillColor; ColorF mFrameColor; ColorF mDamageFillColor; S32 mPulseRate; F32 mPulseThreshold; F32 mValue; public: GuiVehicleHealthBar(); void onRender( Point2I, const RectI &); static void initPersistFields(); DECLARE_CONOBJECT( GuiVehicleHealthBar ); }; //----------------------------------------------------------------------------- IMPLEMENT_CONOBJECT( GuiVehicleHealthBar ); GuiVehicleHealthBar::GuiVehicleHealthBar() { mShowFrame = mShowFill = true; mDisplayEnergy = false; mFillColor.set(0, 0, 0, 0.5); mFrameColor.set(0, 1, 0, 1); mDamageFillColor.set(1, 0, 1, 1); mPulseRate = 0; mPulseThreshold = 0.3f; mValue = 0.0f; } void GuiVehicleHealthBar::initPersistFields() { Parent::initPersistFields(); addField( "showFill", TypeBool, Offset( mShowFill, GuiVehicleHealthBar ) ); addField( "displayEnergy", TypeBool, Offset( mDisplayEnergy, GuiVehicleHealthBar ) ); addField( "showFrame", TypeBool, Offset( mShowFrame, GuiVehicleHealthBar ) ); addField( "fillColor", TypeColorF, Offset( mFillColor, GuiVehicleHealthBar ) ); addField( "frameColor", TypeColorF, Offset( mFrameColor, GuiVehicleHealthBar ) ); addField( "damageFillColor", TypeColorF, Offset( mDamageFillColor, GuiVehicleHealthBar ) ); addField( "pulseRate", TypeS32, Offset( mPulseRate, GuiVehicleHealthBar ) ); addField( "pulseThreshold", TypeF32, Offset( mPulseThreshold, GuiVehicleHealthBar ) ); } //----------------------------------------------------------------------------- /** Gui onRender method. Renders a vehicle health bar with filled background and border. */ void GuiVehicleHealthBar::onRender(Point2I offset, const RectI &updateRect) { // Must have a connection and player control object and vehicle GameConnection* conn = GameConnection::getConnectionToServer(); if (!conn) return; ShapeBase* vehicle = conn->getControlObject(); if (!vehicle || !(vehicle->getType() & VehicleObjectType)) return; if(mDisplayEnergy) { mValue = vehicle->getEnergyValue(); } else { // We'll just grab the damage right off the control object. // Damage value 0 = no damage. mValue = 1 - vehicle->getDamageValue(); } // Background first if (mShowFill) dglDrawRectFill(updateRect, mFillColor); // Pulse the damage fill if it's below the threshold if (mPulseRate != 0) if (mValue < mPulseThreshold) { F32 time = Platform::getVirtualMilliseconds(); F32 alpha = mFmod(time,mPulseRate) / (mPulseRate / 2.0); mDamageFillColor.alpha = (alpha > 1.0)? 2.0 - alpha: alpha; } else mDamageFillColor.alpha = 1; // Render damage fill % RectI rect(updateRect); if(mBounds.extent.x > mBounds.extent.y) rect.extent.x *= mValue; else { S32 bottomY = rect.point.y + rect.extent.y; rect.extent.y *= mValue; rect.point.y = bottomY - rect.extent.y; } dglDrawRectFill(rect, mDamageFillColor); // Border last if (mShowFrame) dglDrawRect(updateRect, mFrameColor); }