From 213b7020a3c94d6708489875fd467330e4f9dd7b Mon Sep 17 00:00:00 2001 From: yourarcade Date: Sun, 25 Sep 2016 16:53:00 -0700 Subject: [PATCH 1/2] Allow the gui to render for both vehicles and vehicle-mounted players. --- Engine/source/T3D/vehicles/guiSpeedometer.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/Engine/source/T3D/vehicles/guiSpeedometer.cpp b/Engine/source/T3D/vehicles/guiSpeedometer.cpp index efd30ef278..79f3f8bdb1 100644 --- a/Engine/source/T3D/vehicles/guiSpeedometer.cpp +++ b/Engine/source/T3D/vehicles/guiSpeedometer.cpp @@ -147,22 +147,29 @@ void GuiSpeedometerHud::initPersistFields() //----------------------------------------------------------------------------- /** Gui onRender method. - Renders a health bar with filled background and border. + Renders an analog speedometer needle over a specified bitmap background. */ void GuiSpeedometerHud::onRender(Point2I offset, const RectI &updateRect) { - // Must have a connection and player control object + // Must have a connection GameConnection* conn = GameConnection::getConnectionToServer(); if (!conn) return; - Vehicle* control = dynamic_cast(conn->getControlObject()); - if (!control) - return; + + // Requires either a vehicle control object or a vehicle-mounted player + Vehicle* vehicle = dynamic_cast(conn->getControlObject()); + if(!vehicle){ + Player * player = dynamic_cast(conn->getControlObject()); + if(!player) return; + if (!player->isMounted()) return; + vehicle = dynamic_cast(player->getObjectMount()); + if(!vehicle) return; + } Parent::onRender(offset,updateRect); // Use the vehicle's velocity as its speed... - mSpeed = control->getVelocity().len(); + mSpeed = vehicle->getVelocity().len(); if (mSpeed > mMaxSpeed) mSpeed = mMaxSpeed; From 8d610787a2054ec18b4a745e391abdeef6070261 Mon Sep 17 00:00:00 2001 From: yourarcade Date: Sun, 25 Sep 2016 17:48:27 -0700 Subject: [PATCH 2/2] Fix push/pop mismatch bug;add code to properly rotate, translate and render needle. --- Engine/source/T3D/vehicles/guiSpeedometer.cpp | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/Engine/source/T3D/vehicles/guiSpeedometer.cpp b/Engine/source/T3D/vehicles/guiSpeedometer.cpp index 79f3f8bdb1..b43f659510 100644 --- a/Engine/source/T3D/vehicles/guiSpeedometer.cpp +++ b/Engine/source/T3D/vehicles/guiSpeedometer.cpp @@ -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" //----------------------------------------------------------------------------- @@ -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; @@ -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(); } -