1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-26 00:04:43 +01:00

Cleanup vehicle drawing code part 4 (#17105)

* Refactor VehiclePaint to take into account NumRotationFrames

* Reduce copied code
This commit is contained in:
spacek531
2022-04-30 03:26:55 -07:00
committed by GitHub
parent cc519c2520
commit 22c44fac71
10 changed files with 120 additions and 191 deletions

View File

@@ -18,27 +18,35 @@ namespace OpenRCT2::Entity::Yaw
// smallest precision is 4 frames
constexpr const uint8_t PrecisionOffset[] = { 3, 2, 1, 0, 0, 0, 0, 0 };
constexpr int32_t YawTo4(int32_t yaw)
[[nodiscard]] constexpr int32_t Add(int32_t yaw1, int32_t yaw2)
{
return (yaw1 + yaw2) & 0x1F;
}
[[nodiscard]] constexpr uint8_t YawFrom4(int32_t rotation)
{
return rotation << 3;
}
[[nodiscard]] constexpr int32_t YawTo4(int32_t yaw)
{
return yaw >> 3;
}
constexpr int32_t YawTo8(int32_t yaw)
[[nodiscard]] constexpr int32_t YawTo8(int32_t yaw)
{
return yaw >> 2;
}
constexpr int32_t YawTo16(int32_t yaw)
[[nodiscard]] constexpr int32_t YawTo16(int32_t yaw)
{
return yaw >> 1;
}
constexpr int32_t YawTo32(int32_t yaw)
[[nodiscard]] constexpr int32_t YawTo32(int32_t yaw)
{
return yaw;
}
constexpr int32_t YawToPrecision(int32_t yaw, uint8_t precision)
[[nodiscard]] constexpr int32_t YawToPrecision(int32_t yaw, uint8_t precision)
{
return yaw >> PrecisionOffset[precision];
}
constexpr uint8_t NumSpritesPrecision(uint8_t precision)
[[nodiscard]] constexpr uint8_t NumSpritesPrecision(uint8_t precision)
{
return 4 << precision;
}

View File

@@ -699,7 +699,7 @@ void RideObject::ReadJsonVehicleInfo([[maybe_unused]] IReadObjectContext* contex
_legacyType.third_vehicle = Json::GetNumber<uint8_t>(headCars[2], 0xFF);
_legacyType.rear_vehicle = Json::GetNumber<uint8_t>(tailCars[0], 0xFF);
auto cars = ReadJsonCars(properties["cars"]);
auto cars = ReadJsonCars(context, properties["cars"]);
auto numCars = std::min(std::size(_legacyType.vehicles), cars.size());
for (size_t i = 0; i < numCars; i++)
{
@@ -707,7 +707,7 @@ void RideObject::ReadJsonVehicleInfo([[maybe_unused]] IReadObjectContext* contex
}
}
std::vector<rct_ride_entry_vehicle> RideObject::ReadJsonCars(json_t& jCars)
std::vector<rct_ride_entry_vehicle> RideObject::ReadJsonCars([[maybe_unused]] IReadObjectContext* context, json_t& jCars)
{
std::vector<rct_ride_entry_vehicle> cars;
@@ -717,19 +717,19 @@ std::vector<rct_ride_entry_vehicle> RideObject::ReadJsonCars(json_t& jCars)
{
if (jCar.is_object())
{
cars.push_back(ReadJsonCar(jCar));
cars.push_back(ReadJsonCar(context, jCar));
}
}
}
else if (jCars.is_object())
{
cars.push_back(ReadJsonCar(jCars));
cars.push_back(ReadJsonCar(context, jCars));
}
return cars;
}
rct_ride_entry_vehicle RideObject::ReadJsonCar(json_t& jCar)
rct_ride_entry_vehicle RideObject::ReadJsonCar([[maybe_unused]] IReadObjectContext* context, json_t& jCar)
{
Guard::Assert(jCar.is_object(), "RideObject::ReadJsonCar expects parameter jCar to be object");

View File

@@ -50,8 +50,8 @@ private:
void ReadLegacyVehicle(IReadObjectContext* context, OpenRCT2::IStream* stream, rct_ride_entry_vehicle* vehicle);
void ReadJsonVehicleInfo(IReadObjectContext* context, json_t& properties);
std::vector<rct_ride_entry_vehicle> ReadJsonCars(json_t& jCars);
rct_ride_entry_vehicle ReadJsonCar(json_t& jCar);
std::vector<rct_ride_entry_vehicle> ReadJsonCars([[maybe_unused]] IReadObjectContext* context, json_t& jCars);
rct_ride_entry_vehicle ReadJsonCar([[maybe_unused]] IReadObjectContext* context, json_t& jCar);
vehicle_colour_preset_list ReadJsonCarColours(json_t& jCarColours);
std::vector<VehicleColour> ReadJsonColourConfiguration(json_t& jColourConfig);

View File

@@ -1016,18 +1016,6 @@ static void VehicleSpritePaintWithSwinging(
vehicleEntry);
}
// 6D51EB
static void vehicle_sprite_paint_6D51EB(
paint_session& session, const Vehicle* vehicle, int32_t imageDirection, int32_t z,
const rct_ride_entry_vehicle* vehicleEntry)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
imageDirection = vehicleEntry->SpriteByYaw(imageDirection);
auto spriteNum = (imageDirection * vehicleEntry->base_num_frames) + vehicle->SwingSprite + vehicleEntry->base_image_id;
vehicle_sprite_paint(
session, vehicle, spriteNum, VehicleBoundboxes[vehicleEntry->draw_order][boundingBoxNum], z, vehicleEntry);
}
static void VehicleSpritePaintRestraints(
paint_session& session, const Vehicle* vehicle, int32_t imageDirection, int32_t z,
const rct_ride_entry_vehicle* vehicleEntry)
@@ -1058,7 +1046,9 @@ static void VehicleSpriteFlatUnbanked(
VehicleSpritePaintRestraints(session, vehicle, imageDirection, z, vehicleEntry);
return;
}
vehicle_sprite_paint_6D51EB(session, vehicle, imageDirection, z, vehicleEntry);
int32_t boundingBoxNum = YawTo16(imageDirection);
auto spriteNum = (vehicleEntry->SpriteByYaw(imageDirection) * vehicleEntry->base_num_frames) + vehicleEntry->base_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
// 6D4EE7
@@ -1086,7 +1076,8 @@ static void vehicle_sprite_0_2(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED)
{
int32_t boundingBoxNum = YawTo16(imageDirection) + 108;
int32_t spriteNum = ((imageDirection + 16) * vehicleEntry->base_num_frames) + vehicleEntry->banked_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 16) * vehicleEntry->base_num_frames)
+ vehicleEntry->banked_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -1120,7 +1111,9 @@ static void vehicle_sprite_0_4(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED)
{
int32_t boundingBoxNum = (YawTo16(imageDirection) ^ 8) + 108;
int32_t spriteNum = ((imageDirection + 48) * vehicleEntry->base_num_frames) + vehicleEntry->banked_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 16 + vehicleEntry->NumRotationFrames())
* vehicleEntry->base_num_frames)
+ vehicleEntry->banked_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -1354,16 +1347,7 @@ static void vehicle_sprite_0_16(
const rct_ride_entry_vehicle* vehicleEntry)
{
vehicleEntry--;
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
int32_t spriteNum = ((YawTo8(imageDirection)) * vehicleEntry->base_num_frames) + vehicleEntry->banked_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
VehicleSpriteFlatUnbanked(session, vehicle, imageDirection, z, vehicleEntry);
}
vehicle_sprite_0_1(session, vehicle, imageDirection, z, vehicleEntry);
}
// 6D4F31
@@ -1372,16 +1356,7 @@ static void vehicle_sprite_0_17(
const rct_ride_entry_vehicle* vehicleEntry)
{
vehicleEntry--;
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED)
{
int32_t boundingBoxNum = YawTo16(imageDirection) + 108;
int32_t spriteNum = ((imageDirection + 16) * vehicleEntry->base_num_frames) + vehicleEntry->banked_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
VehicleSpriteFlatUnbanked(session, vehicle, imageDirection, z, vehicleEntry);
}
vehicle_sprite_0_2(session, vehicle, imageDirection, z, vehicleEntry);
}
// 6D4F09
@@ -1390,16 +1365,7 @@ static void vehicle_sprite_0_18(
const rct_ride_entry_vehicle* vehicleEntry)
{
vehicleEntry--;
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
int32_t spriteNum = (((YawTo8(imageDirection)) + 8) * vehicleEntry->base_num_frames) + vehicleEntry->banked_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
VehicleSpriteFlatUnbanked(session, vehicle, imageDirection, z, vehicleEntry);
}
vehicle_sprite_0_3(session, vehicle, imageDirection, z, vehicleEntry);
}
// 6D4F59
@@ -1408,16 +1374,7 @@ static void vehicle_sprite_0_19(
const rct_ride_entry_vehicle* vehicleEntry)
{
vehicleEntry--;
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_BANKED)
{
int32_t boundingBoxNum = (YawTo16(imageDirection) ^ 8) + 108;
int32_t spriteNum = ((imageDirection + 48) * vehicleEntry->base_num_frames) + vehicleEntry->banked_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
VehicleSpriteFlatUnbanked(session, vehicle, imageDirection, z, vehicleEntry);
}
vehicle_sprite_0_4(session, vehicle, imageDirection, z, vehicleEntry);
}
// 6D51D7
@@ -1523,7 +1480,8 @@ static void vehicle_sprite_1_1(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
int32_t spriteNum = (imageDirection * vehicleEntry->base_num_frames) + vehicleEntry->flat_to_gentle_bank_image_id;
int32_t spriteNum = (vehicleEntry->SpriteByYaw(imageDirection) * vehicleEntry->base_num_frames)
+ vehicleEntry->flat_to_gentle_bank_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -1558,7 +1516,8 @@ static void vehicle_sprite_1_3(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
int32_t spriteNum = ((imageDirection + 32) * vehicleEntry->base_num_frames)
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + vehicleEntry->NumRotationFrames())
* vehicleEntry->base_num_frames)
+ vehicleEntry->flat_to_gentle_bank_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -1609,39 +1568,6 @@ static void VehiclePitchUp12(
case 4:
vehicle_sprite_1_4(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 5:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 6:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 7:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 8:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 9:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 10:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 11:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 12:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 13:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 14:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 15:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
break;
case 16:
vehicle_sprite_1_1(session, vehicle, imageDirection, z, vehicleEntry);
break;
@@ -1654,8 +1580,13 @@ static void VehiclePitchUp12(
case 19:
vehicle_sprite_1_4(session, vehicle, imageDirection, z, vehicleEntry);
break;
default:
vehicle_sprite_1_0(session, vehicle, imageDirection, z, vehicleEntry);
}
}
#pragma endregion
#pragma region Up25
#pragma endregion
@@ -1678,7 +1609,8 @@ static void vehicle_sprite_2_0(
else
{
int32_t boundingBoxNum = (YawTo16(imageDirection)) + 16;
int32_t spriteNum = ((imageDirection + 8) * vehicleEntry->base_num_frames) + vehicleEntry->gentle_slope_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 8) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
}
@@ -1715,19 +1647,13 @@ static void vehicle_sprite_2_2(
{
int32_t boundingBoxNum = YawTo16(imageDirection);
if (vehicleEntry->draw_order < 5)
{
boundingBoxNum += 108;
int32_t spriteNum = (imageDirection * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
boundingBoxNum += 16;
int32_t spriteNum = (imageDirection * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
int32_t spriteNum = (vehicleEntry->SpriteByYaw(imageDirection) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
@@ -1762,19 +1688,13 @@ static void vehicle_sprite_2_4(
{
int32_t boundingBoxNum = YawTo16(imageDirection);
if (vehicleEntry->draw_order < 5)
{
boundingBoxNum = (boundingBoxNum ^ 8) + 108;
int32_t spriteNum = ((imageDirection + 32) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
boundingBoxNum += 16;
int32_t spriteNum = ((imageDirection + 32) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + vehicleEntry->NumRotationFrames())
* vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
@@ -1888,7 +1808,8 @@ static void VehiclePitchUp60(
else
{
int32_t boundingBoxNum = (YawTo16(imageDirection)) + 40;
int32_t spriteNum = ((imageDirection + 16) * vehicleEntry->base_num_frames) + vehicleEntry->steep_slope_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 16) * vehicleEntry->base_num_frames)
+ vehicleEntry->steep_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
}
@@ -1925,7 +1846,8 @@ static void vehicle_sprite_5_1(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
int32_t spriteNum = ((imageDirection + 64) * vehicleEntry->base_num_frames)
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->flat_to_gentle_bank_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -1961,7 +1883,8 @@ static void vehicle_sprite_5_3(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_FLAT_TO_GENTLE_SLOPE_BANKED_TRANSITIONS)
{
int32_t boundingBoxNum = YawTo16(imageDirection);
int32_t spriteNum = ((imageDirection + 96) * vehicleEntry->base_num_frames)
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + vehicleEntry->NumRotationFrames() * 3)
* vehicleEntry->base_num_frames)
+ vehicleEntry->flat_to_gentle_bank_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2059,6 +1982,9 @@ static void VehiclePitchDown12(
break;
}
}
#pragma endregion
#pragma region Down25
#pragma endregion
@@ -2081,7 +2007,9 @@ static void vehicle_sprite_6_0(
else
{
int32_t boundingBoxNum = ((YawTo16(imageDirection)) ^ 8) + 16;
int32_t spriteNum = ((imageDirection + 40) * vehicleEntry->base_num_frames) + vehicleEntry->gentle_slope_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 8 + vehicleEntry->NumRotationFrames())
* vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
}
@@ -2118,19 +2046,14 @@ static void vehicle_sprite_6_2(
{
int32_t boundingBoxNum = YawTo16(imageDirection);
if (vehicleEntry->draw_order < 5)
{
boundingBoxNum += 108;
int32_t spriteNum = ((imageDirection + 64) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
boundingBoxNum = (boundingBoxNum ^ 8) + 16;
int32_t spriteNum = ((imageDirection + 64) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
@@ -2165,19 +2088,13 @@ static void vehicle_sprite_6_4(
{
int32_t boundingBoxNum = YawTo16(imageDirection);
if (vehicleEntry->draw_order < 5)
{
boundingBoxNum = (boundingBoxNum ^ 8) + 108;
int32_t spriteNum = ((imageDirection + 96) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
boundingBoxNum = (boundingBoxNum ^ 8) + 16;
int32_t spriteNum = ((imageDirection + 96) * vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + vehicleEntry->NumRotationFrames() * 3)
* vehicleEntry->base_num_frames)
+ vehicleEntry->gentle_slope_bank_turn_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
@@ -2288,7 +2205,9 @@ static void VehiclePitchDown60(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_STEEP_SLOPES)
{
int32_t boundingBoxNum = ((YawTo16(imageDirection)) ^ 8) + 40;
int32_t spriteNum = ((imageDirection + 48) * vehicleEntry->base_num_frames) + vehicleEntry->steep_slope_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 16 + vehicleEntry->NumRotationFrames())
* vehicleEntry->base_num_frames)
+ vehicleEntry->steep_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -2326,7 +2245,8 @@ static void VehiclePitchUp90(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo16(imageDirection)) + 60;
int32_t spriteNum = ((imageDirection + 8) * vehicleEntry->base_num_frames) + vehicleEntry->vertical_slope_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 8) * vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -2347,7 +2267,8 @@ static void VehiclePitchUp105(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo4(imageDirection)) + 76;
int32_t spriteNum = (((YawTo4(imageDirection)) + 72) * vehicleEntry->base_num_frames)
int32_t spriteNum = ((YawTo4(imageDirection) + 8 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2365,7 +2286,8 @@ static void VehiclePitchUp120(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo4(imageDirection)) + 80;
int32_t spriteNum = (((YawTo4(imageDirection)) + 80) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 16 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2383,7 +2305,8 @@ static void VehiclePitchUp135(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo4(imageDirection)) + 84;
int32_t spriteNum = (((YawTo4(imageDirection)) + 88) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 24 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2401,7 +2324,8 @@ static void VehiclePitchUp150(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo4(imageDirection)) + 88;
int32_t spriteNum = (((YawTo4(imageDirection)) + 96) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 32 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2419,7 +2343,8 @@ static void VehiclePitchUp165(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo4(imageDirection)) + 92;
int32_t spriteNum = (((YawTo4(imageDirection)) + 104) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 40 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2441,7 +2366,8 @@ static void VehiclePitchInverted(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = (YawTo4(imageDirection)) + 96;
int32_t spriteNum = (((YawTo4(imageDirection)) + 112) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 48 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2497,7 +2423,9 @@ static void VehiclePitchDown90(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = ((YawTo16(imageDirection)) ^ 8) + 60;
int32_t spriteNum = ((imageDirection + 40) * vehicleEntry->base_num_frames) + vehicleEntry->vertical_slope_image_id;
int32_t spriteNum = ((vehicleEntry->SpriteByYaw(imageDirection) + 8 + vehicleEntry->NumRotationFrames())
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -2522,7 +2450,8 @@ static void VehiclePitchDown105(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = ((YawTo4(imageDirection)) ^ 2) + 76;
int32_t spriteNum = (((YawTo4(imageDirection)) + 76) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 12 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2544,7 +2473,8 @@ static void VehiclePitchDown120(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = ((YawTo4(imageDirection)) ^ 2) + 80;
int32_t spriteNum = (((YawTo4(imageDirection)) + 84) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 20 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2566,7 +2496,8 @@ static void VehiclePitchDown135(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = ((YawTo4(imageDirection)) ^ 2) + 84;
int32_t spriteNum = (((YawTo4(imageDirection)) + 92) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 28 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2588,7 +2519,8 @@ static void VehiclePitchDown150(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = ((YawTo4(imageDirection)) ^ 2) + 88;
int32_t spriteNum = (((YawTo4(imageDirection)) + 100) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 36 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -2610,7 +2542,8 @@ static void VehiclePitchDown165(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_VERTICAL_SLOPES)
{
int32_t boundingBoxNum = ((YawTo4(imageDirection)) ^ 2) + 92;
int32_t spriteNum = (((YawTo4(imageDirection)) + 108) * vehicleEntry->base_num_frames)
int32_t spriteNum = (((YawTo4(imageDirection)) + 44 + vehicleEntry->NumRotationFrames() * 2)
* vehicleEntry->base_num_frames)
+ vehicleEntry->vertical_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
@@ -3005,7 +2938,7 @@ static void VehiclePitchDiagDown60(
#pragma region InvertingSlopesDown
// 6D47DA
static void VehiclePitchInvertingDown60(
static void VehiclePitchInvertingDown25(
paint_session& session, const Vehicle* vehicle, int32_t imageDirection, int32_t z,
const rct_ride_entry_vehicle* vehicleEntry)
{
@@ -3019,35 +2952,16 @@ static void VehiclePitchInvertingDown42(
const rct_ride_entry_vehicle* vehicleEntry)
{
vehicleEntry--;
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_STEEP_SLOPES)
{
int32_t boundingBoxNum = ((YawTo8(imageDirection)) ^ 4) + 32;
int32_t spriteNum = (((YawTo8(imageDirection)) + 8) * vehicleEntry->base_num_frames)
+ vehicleEntry->steep_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
VehiclePitchDown25(session, vehicle, imageDirection, z, vehicleEntry);
}
VehiclePitchDown42(session, vehicle, imageDirection, z, vehicleEntry);
}
// 6D4A56
static void VehiclePitchInvertingDown25(
static void VehiclePitchInvertingDown60(
paint_session& session, const Vehicle* vehicle, int32_t imageDirection, int32_t z,
const rct_ride_entry_vehicle* vehicleEntry)
{
vehicleEntry--;
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_STEEP_SLOPES)
{
int32_t boundingBoxNum = ((YawTo16(imageDirection)) ^ 8) + 40;
int32_t spriteNum = ((imageDirection + 48) * vehicleEntry->base_num_frames) + vehicleEntry->steep_slope_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
{
VehiclePitchDown25(session, vehicle, imageDirection, z, vehicleEntry);
}
VehiclePitchDown60(session, vehicle, imageDirection, z, vehicleEntry);
}
#pragma endregion
@@ -3062,7 +2976,8 @@ static void VehiclePitchSpiralLift(
if (vehicleEntry->sprite_flags & VEHICLE_SPRITE_FLAG_CURVED_LIFT_HILL)
{
int32_t boundingBoxNum = (YawTo16(imageDirection)) + 16;
int32_t spriteNum = (imageDirection * vehicleEntry->base_num_frames) + vehicleEntry->curved_lift_hill_image_id;
int32_t spriteNum = (vehicleEntry->SpriteByYaw(imageDirection) * vehicleEntry->base_num_frames)
+ vehicleEntry->curved_lift_hill_image_id;
VehicleSpritePaintWithSwinging(session, vehicle, spriteNum, boundingBoxNum, z, vehicleEntry);
}
else
@@ -3136,9 +3051,9 @@ static constexpr const vehicle_sprite_func PaintFunctionsByPitch[] = {
VehiclePitchDiagDown12,
VehiclePitchDiagDown25,
VehiclePitchDiagDown60,
VehiclePitchInvertingDown60,
VehiclePitchInvertingDown42,
VehiclePitchInvertingDown25,
VehiclePitchInvertingDown42,
VehiclePitchInvertingDown60,
VehiclePitchSpiralLift,
};
// clang-format on

View File

@@ -167,6 +167,7 @@ void vehicle_visual_virginia_reel(
paint_session& session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle,
const rct_ride_entry_vehicle* vehicleEntry)
{
imageDirection = OpenRCT2::Entity::Yaw::YawTo32(imageDirection);
const uint8_t rotation = session.CurrentRotation;
int32_t ecx = ((vehicle->spin_sprite / 8) + (rotation * 8)) & 31;
int32_t baseImage_id = [&] {

View File

@@ -1226,7 +1226,7 @@ void vehicle_visual_mini_golf_player(
return;
uint8_t frame = mini_golf_peep_animation_frames[EnumValue(vehicle->mini_golf_current_animation)][vehicle->animation_frame];
uint32_t ebx = (frame << 2) + (imageDirection >> 3);
uint32_t ebx = (frame << 2) + OpenRCT2::Entity::Yaw::YawTo4(imageDirection);
uint32_t image_id = rideEntry->vehicles[0].base_image_id + 1 + ebx;
uint32_t peep_palette = peep->TshirtColour << 19 | peep->TrousersColour << 24 | 0x0A0000000;

View File

@@ -56,7 +56,7 @@ void vehicle_visual_launched_freefall(
{
baseImage_id += 2; // Draw peeps sitting without transparent area between them for restraints
}
auto directionOffset = imageDirection / 8;
auto directionOffset = OpenRCT2::Entity::Yaw::YawTo4(imageDirection);
image_id = (baseImage_id + (((directionOffset + 0) & 3) * 3))
| SPRITE_ID_PALETTE_COLOUR_2(vehicle->peep_tshirt_colours[0], vehicle->peep_tshirt_colours[1]);
PaintAddImageAsChild(session, image_id, { 0, 0, z }, { 16, 16, 41 }, { -5, -5, z + 1 });

View File

@@ -37,6 +37,8 @@ void vehicle_visual_roto_drop(
paint_session& session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle,
const rct_ride_entry_vehicle* vehicleEntry)
{
imageDirection = OpenRCT2::Entity::Yaw::YawTo32(imageDirection);
auto imageFlags = SPRITE_ID_PALETTE_COLOUR_2(vehicle->colours.body_colour, vehicle->colours.trim_colour);
if (vehicle->IsGhost())
{

View File

@@ -181,6 +181,8 @@ void vehicle_visual_river_rapids(
paint_session& session, int32_t x, int32_t imageDirection, int32_t y, int32_t z, const Vehicle* vehicle,
const rct_ride_entry_vehicle* vehicleEntry)
{
imageDirection = OpenRCT2::Entity::Yaw::YawTo32(imageDirection);
int32_t image_id;
int32_t baseImage_id = imageDirection;
uint32_t rotation = session.CurrentRotation;

View File

@@ -1276,7 +1276,8 @@ void vehicle_visual_splash_boats_or_water_coaster(
}
session.CurrentlyDrawnEntity = vehicleToPaint;
imageDirection = ((session.CurrentRotation * 8) + vehicleToPaint->sprite_direction) & 0x1F;
imageDirection = OpenRCT2::Entity::Yaw::Add(
OpenRCT2::Entity::Yaw::YawFrom4(session.CurrentRotation), vehicleToPaint->sprite_direction);
session.SpritePosition.x = vehicleToPaint->x;
session.SpritePosition.y = vehicleToPaint->y;
vehicleToPaint->Paint(session, imageDirection);