Skip to content

Commit

Permalink
Fix push/pop mismatch bug;add code to properly rotate, translate and …
Browse files Browse the repository at this point in the history
…render needle.
  • Loading branch information
yourarcade committed Sep 26, 2016
1 parent 213b702 commit 8d61078
Showing 1 changed file with 26 additions and 25 deletions.
51 changes: 26 additions & 25 deletions Engine/source/T3D/vehicles/guiSpeedometer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
// IN THE SOFTWARE.
//-----------------------------------------------------------------------------

#include "gui/controls/guiBitmapCtrl.h"
#include "console/consoleTypes.h"
#include "T3D/gameBase/gameConnection.h"
#include "T3D/vehicles/vehicle.h"
#include "T3D/player.h"
#include "gfx/primBuilder.h"

//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -173,23 +173,31 @@ void GuiSpeedometerHud::onRender(Point2I offset, const RectI &updateRect)
if (mSpeed > mMaxSpeed)
mSpeed = mMaxSpeed;

// Render the needle
GFX->pushWorldMatrix();
// Calculate center point if necessary and roll in offsets
Point2F center = mCenter;
if (mIsZero(center.x) && mIsZero(center.y))
{
center.x = getExtent().x / 2.0f;
center.y = getExtent().y / 2.0f;
}
MatrixF newMat(1);

newMat.setPosition(Point3F(getLeft() + center.x, getTop() + center.y, 0.0f));

F32 rotation = mMinAngle + (mMaxAngle - mMinAngle) * (mSpeed / mMaxSpeed);
AngAxisF newRot(Point3F(0.0f,0.0f,-1.0f), rotation);

newRot.setMatrix(&newMat);

F32 fillOffset = GFX->getFillConventionOffset(); // Find the fill offset
Point2F viewCenter(offset.x + fillOffset + center.x, offset.y + fillOffset + center.y);

// Handle rotation calculations
F32 rotation, spinAngle;
rotation = mMinAngle + (mMaxAngle - mMinAngle) * (mSpeed / mMaxSpeed);
spinAngle = mDegToRad(rotation);
MatrixF rotMatrix(EulerF(0.0, 0.0, spinAngle));

// Set up the needle vertex list
Point3F vertList[5];
vertList[0].set(+mNeedleLength,-mNeedleWidth,0);
vertList[1].set(+mNeedleLength,+mNeedleWidth,0);
vertList[2].set(-mTailLength ,+mNeedleWidth,0);
vertList[3].set(-mTailLength ,-mNeedleWidth,0);
vertList[4].set(+mNeedleLength,-mNeedleWidth,0); //// Get back to the start!

// Create a GFXStateBlock description if one has not been set.
if (mBlendSB.isNull())
{
GFXStateBlockDesc desc;
Expand All @@ -198,22 +206,15 @@ void GuiSpeedometerHud::onRender(Point2I offset, const RectI &updateRect)
desc.samplers[0].textureColorOp = GFXTOPDisable;
mBlendSB = GFX->createStateBlock(desc);
}

GFX->setStateBlock(mBlendSB);

GFX->setTexture(0, NULL);

PrimBuild::begin(GFXLineStrip, 5);
// Render the needle
PrimBuild::color4f(mColor.red, mColor.green, mColor.blue, mColor.alpha);

PrimBuild::vertex2f(+mNeedleLength,-mNeedleWidth);
PrimBuild::vertex2f(+mNeedleLength,+mNeedleWidth);
PrimBuild::vertex2f(-mTailLength ,+mNeedleWidth);
PrimBuild::vertex2f(-mTailLength ,-mNeedleWidth);

//// Get back to the start!
PrimBuild::vertex2f(+mNeedleLength,-mNeedleWidth);

PrimBuild::begin(GFXLineStrip, 5);
for(int k=0; k<5; k++){
rotMatrix.mulP(vertList[k]);
PrimBuild::vertex2f(vertList[k].x + viewCenter.x, vertList[k].y + viewCenter.y);
}
PrimBuild::end();
}

0 comments on commit 8d61078

Please sign in to comment.