Initial commit
This commit is contained in:
123
Torque/SDK/engine/game/vehicles/guiSpeedometer.cc
Normal file
123
Torque/SDK/engine/game/vehicles/guiSpeedometer.cc
Normal file
@@ -0,0 +1,123 @@
|
||||
//-----------------------------------------------------------------------------
|
||||
// Torque Game Engine
|
||||
// Copyright (C) GarageGames.com, Inc.
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#include "dgl/dgl.h"
|
||||
#include "gui/controls/guiBitmapCtrl.h"
|
||||
#include "console/consoleTypes.h"
|
||||
#include "game/gameConnection.h"
|
||||
#include "game/vehicles/vehicle.h"
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/// A Speedometer control.
|
||||
/// This gui displays the speed of the current Vehicle based
|
||||
/// control object. This control only works if a server
|
||||
/// connection exists and it's control object is a vehicle. If
|
||||
/// either of these requirements is false, the control is not rendered.
|
||||
class GuiSpeedometerHud : public GuiBitmapCtrl
|
||||
{
|
||||
typedef GuiBitmapCtrl Parent;
|
||||
|
||||
F32 mSpeed; ///< Current speed
|
||||
F32 mMaxSpeed; ///< Max speed at max need pos
|
||||
F32 mMaxAngle; ///< Max pos of needle
|
||||
F32 mMinAngle; ///< Min pos of needle
|
||||
Point2F mCenter; ///< Center of needle rotation
|
||||
ColorF mColor; ///< Needle Color
|
||||
F32 mNeedleLength;
|
||||
F32 mNeedleWidth;
|
||||
F32 mTailLength;
|
||||
|
||||
public:
|
||||
GuiSpeedometerHud();
|
||||
|
||||
void onRender( Point2I, const RectI &);
|
||||
static void initPersistFields();
|
||||
DECLARE_CONOBJECT( GuiSpeedometerHud );
|
||||
};
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_CONOBJECT( GuiSpeedometerHud );
|
||||
|
||||
GuiSpeedometerHud::GuiSpeedometerHud()
|
||||
{
|
||||
mSpeed = 0;
|
||||
mMaxSpeed = 100;
|
||||
mMaxAngle = 0;
|
||||
mMinAngle = 200;
|
||||
mCenter.set(0,0);
|
||||
mNeedleWidth = 3;
|
||||
mNeedleLength = 10;
|
||||
mTailLength = 5;
|
||||
mColor.set(1,0,0,1);
|
||||
}
|
||||
|
||||
void GuiSpeedometerHud::initPersistFields()
|
||||
{
|
||||
Parent::initPersistFields();
|
||||
|
||||
addGroup("Needle");
|
||||
addField("maxSpeed", TypeF32, Offset( mMaxSpeed, GuiSpeedometerHud ) );
|
||||
addField("minAngle", TypeF32, Offset( mMinAngle, GuiSpeedometerHud ) );
|
||||
addField("maxAngle", TypeF32, Offset( mMaxAngle, GuiSpeedometerHud ) );
|
||||
addField("color", TypeColorF, Offset( mColor, GuiSpeedometerHud ) );
|
||||
addField("center", TypePoint2F, Offset( mCenter, GuiSpeedometerHud ) );
|
||||
addField("length", TypeF32, Offset( mNeedleLength, GuiSpeedometerHud ) );
|
||||
addField("width", TypeF32, Offset( mNeedleWidth, GuiSpeedometerHud ) );
|
||||
addField("tail", TypeF32, Offset( mTailLength, GuiSpeedometerHud ) );
|
||||
endGroup("Needle");
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
/**
|
||||
Gui onRender method.
|
||||
Renders a health bar with filled background and border.
|
||||
*/
|
||||
void GuiSpeedometerHud::onRender(Point2I offset, const RectI &updateRect)
|
||||
{
|
||||
// Must have a connection and player control object
|
||||
GameConnection* conn = GameConnection::getConnectionToServer();
|
||||
if (!conn)
|
||||
return;
|
||||
Vehicle* control = dynamic_cast<Vehicle*>(conn->getControlObject());
|
||||
if (!control)
|
||||
return;
|
||||
|
||||
Parent::onRender(offset,updateRect);
|
||||
|
||||
// Use the vehicle's velocity as it's speed...
|
||||
mSpeed = control->getVelocity().len();
|
||||
if (mSpeed > mMaxSpeed)
|
||||
mSpeed = mMaxSpeed;
|
||||
|
||||
// Render the needle
|
||||
glPushMatrix();
|
||||
Point2F center = mCenter;
|
||||
if (center.x == F32(0) && center.y == F32(0)) {
|
||||
center.x = mBounds.extent.x / 2;
|
||||
center.y = mBounds.extent.y / 2;
|
||||
}
|
||||
glTranslatef(mBounds.point.x + center.x,mBounds.point.y + center.y,0);
|
||||
|
||||
F32 rotation = mMinAngle + (mMaxAngle - mMinAngle) * (mSpeed / mMaxSpeed);
|
||||
glRotatef(rotation,0.0f,0.0f,-1.0f);
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
glColor4f(mColor.red, mColor.green, mColor.blue, mColor.alpha);
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2f(+mNeedleLength,-mNeedleWidth);
|
||||
glVertex2f(+mNeedleLength,+mNeedleWidth);
|
||||
glVertex2f(-mTailLength ,+mNeedleWidth);
|
||||
glVertex2f(-mTailLength ,-mNeedleWidth);
|
||||
glEnd();
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user