----------------------------------------------------------------------------- Gui onRender method. Renders an analog speedometer needle over a specified bitmap background. */
| 151 | Renders an analog speedometer needle over a specified bitmap background. |
| 152 | */ |
| 153 | void GuiSpeedometerHud::onRender(Point2I offset, const RectI &updateRect) |
| 154 | { |
| 155 | // Must have a connection |
| 156 | GameConnection* conn = GameConnection::getConnectionToServer(); |
| 157 | if (!conn) |
| 158 | return; |
| 159 | |
| 160 | // Requires either a vehicle control object or a vehicle-mounted player |
| 161 | Vehicle* vehicle = dynamic_cast<Vehicle*>(conn->getControlObject()); |
| 162 | if(!vehicle){ |
| 163 | Player * player = dynamic_cast<Player*>(conn->getControlObject()); |
| 164 | if(!player) return; |
| 165 | if (!player->isMounted()) return; |
| 166 | vehicle = dynamic_cast<Vehicle*>(player->getObjectMount()); |
| 167 | if(!vehicle) return; |
| 168 | } |
| 169 | |
| 170 | Parent::onRender(offset,updateRect); |
| 171 | |
| 172 | // Use the vehicle's velocity as its speed... |
| 173 | mSpeed = vehicle->getVelocity().len(); |
| 174 | if (mSpeed > mMaxSpeed) |
| 175 | mSpeed = mMaxSpeed; |
| 176 | |
| 177 | // Calculate center point if necessary and roll in offsets |
| 178 | Point2F center = mCenter; |
| 179 | if (mIsZero(center.x) && mIsZero(center.y)) |
| 180 | { |
| 181 | center.x = getExtent().x / 2.0f; |
| 182 | center.y = getExtent().y / 2.0f; |
| 183 | } |
| 184 | F32 fillOffset = GFX->getFillConventionOffset(); // Find the fill offset |
| 185 | Point2F viewCenter(offset.x + fillOffset + center.x, offset.y + fillOffset + center.y); |
| 186 | |
| 187 | // Handle rotation calculations |
| 188 | F32 rotation, spinAngle; |
| 189 | rotation = mMinAngle + (mMaxAngle - mMinAngle) * (mSpeed / mMaxSpeed); |
| 190 | spinAngle = mDegToRad(rotation); |
| 191 | MatrixF rotMatrix(EulerF(0.0, 0.0, spinAngle)); |
| 192 | |
| 193 | // Set up the needle vertex list |
| 194 | Point3F vertList[5]; |
| 195 | vertList[0].set(+mNeedleLength,-mNeedleWidth,0); |
| 196 | vertList[1].set(+mNeedleLength,+mNeedleWidth,0); |
| 197 | vertList[2].set(-mTailLength ,+mNeedleWidth,0); |
| 198 | vertList[3].set(-mTailLength ,-mNeedleWidth,0); |
| 199 | vertList[4].set(+mNeedleLength,-mNeedleWidth,0); //// Get back to the start! |
| 200 | |
| 201 | // Create a GFXStateBlock description if one has not been set. |
| 202 | if (mBlendSB.isNull()) |
| 203 | { |
| 204 | GFXStateBlockDesc desc; |
| 205 | desc.setBlend(true, GFXBlendSrcAlpha, GFXBlendInvSrcAlpha); |
| 206 | desc.samplersDefined = true; |
| 207 | mBlendSB = GFX->createStateBlock(desc); |
| 208 | } |
| 209 | GFX->setStateBlock(mBlendSB); |
| 210 | GFX->setTexture(0, NULL); |
nothing calls this directly
no test coverage detected