mirror of https://github.com/OpenRCT2/OpenRCT2.git
Introduced optional light effects for vehicles at night. (#10970)
This commit is contained in:
parent
ba8a4e6183
commit
828eef7411
|
@ -3674,6 +3674,8 @@ STR_6357 :{SMALLFONT}{BLACK}Removes all ducks from the map
|
|||
STR_6358 :Page {UINT16}
|
||||
STR_6359 :{POP16}{POP16}Page {UINT16}
|
||||
STR_6360 :{SMALLFONT}{BLACK}{COMMA32}
|
||||
STR_6361 :Enable lighting effects on rides (experimental)
|
||||
STR_6362 :{SMALLFONT}{BLACK}If enabled, vehicles for tracked rides will be lit up at night.
|
||||
|
||||
#############
|
||||
# Scenarios #
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
- Improved: [#682] The staff patrol area is now drawn on the water, instead of on the surface under water.
|
||||
- Improved: [#10858] Added horizontal grid lines to finance charts.
|
||||
- Improved: [#10884] Added y-axes and labels to park window charts.
|
||||
- Improved: [#10970] Introduced optional light effects for vehicles at night.
|
||||
- Removed: [#6898] LOADMM and LOADRCT1 title sequence commands (use LOADSC instead).
|
||||
|
||||
0.2.4 (2019-10-28)
|
||||
|
|
|
@ -105,6 +105,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX {
|
|||
WIDX_EFFECTS_GROUP,
|
||||
WIDX_DAY_NIGHT_CHECKBOX,
|
||||
WIDX_ENABLE_LIGHT_FX_CHECKBOX,
|
||||
WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX,
|
||||
WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX,
|
||||
WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX,
|
||||
|
||||
|
@ -259,11 +260,12 @@ static rct_widget window_options_rendering_widgets[] = {
|
|||
{ WWT_BUTTON, 1, 288, 298, FRAME_RENDERING_START + 91, FRAME_RENDERING_START + 100, STR_DROPDOWN_GLYPH, STR_VIRTUAL_FLOOR_STYLE_TIP }, // Virtual floor dropdown
|
||||
#undef FRAME_RENDERING_START
|
||||
#define FRAME_EFFECTS_START 163
|
||||
{ WWT_GROUPBOX, 1, 5, 304, FRAME_EFFECTS_START + 0, FRAME_EFFECTS_START + 78, STR_EFFECTS_GROUP, STR_NONE }, // Rendering group
|
||||
{ WWT_GROUPBOX, 1, 5, 304, FRAME_EFFECTS_START + 0, FRAME_EFFECTS_START + 93, STR_EFFECTS_GROUP, STR_NONE }, // Rendering group
|
||||
{ WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 15, FRAME_EFFECTS_START + 26, STR_CYCLE_DAY_NIGHT, STR_CYCLE_DAY_NIGHT_TIP }, // Cycle day-night
|
||||
{ WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 30, FRAME_EFFECTS_START + 41, STR_ENABLE_LIGHTING_EFFECTS, STR_ENABLE_LIGHTING_EFFECTS_TIP }, // Enable light fx
|
||||
{ WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 45, FRAME_EFFECTS_START + 56, STR_RENDER_WEATHER_EFFECTS, STR_RENDER_WEATHER_EFFECTS_TIP }, // Render weather effects
|
||||
{ WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 60, FRAME_EFFECTS_START + 71, STR_DISABLE_LIGHTNING_EFFECT, STR_DISABLE_LIGHTNING_EFFECT_TIP }, // Disable lightning effect
|
||||
{ WWT_CHECKBOX, 1, 40, 290, FRAME_EFFECTS_START + 45, FRAME_EFFECTS_START + 56, STR_ENABLE_LIGHTING_VEHICLES, STR_ENABLE_LIGHTING_VEHICLES_TIP }, // Enable light fx for vehicles
|
||||
{ WWT_CHECKBOX, 1, 10, 290, FRAME_EFFECTS_START + 60, FRAME_EFFECTS_START + 71, STR_RENDER_WEATHER_EFFECTS, STR_RENDER_WEATHER_EFFECTS_TIP }, // Render weather effects
|
||||
{ WWT_CHECKBOX, 1, 25, 290, FRAME_EFFECTS_START + 75, FRAME_EFFECTS_START + 86, STR_DISABLE_LIGHTNING_EFFECT, STR_DISABLE_LIGHTNING_EFFECT_TIP }, // Disable lightning effect
|
||||
#undef FRAME_EFFECTS_START
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
@ -546,6 +548,7 @@ static uint64_t window_options_page_enabled_widgets[] = {
|
|||
(1 << WIDX_VIRTUAL_FLOOR_DROPDOWN) |
|
||||
(1 << WIDX_DAY_NIGHT_CHECKBOX) |
|
||||
(1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX) |
|
||||
(1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX) |
|
||||
(1 << WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX) |
|
||||
(1 << WIDX_DISABLE_LIGHTNING_EFFECT_CHECKBOX),
|
||||
|
||||
|
@ -749,6 +752,11 @@ static void window_options_mouseup(rct_window* w, rct_widgetindex widgetIndex)
|
|||
config_save_default();
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX:
|
||||
gConfigGeneral.enable_light_fx_for_vehicles ^= 1;
|
||||
config_save_default();
|
||||
w->Invalidate();
|
||||
break;
|
||||
case WIDX_UPPER_CASE_BANNERS_CHECKBOX:
|
||||
gConfigGeneral.upper_case_banners ^= 1;
|
||||
config_save_default();
|
||||
|
@ -1770,6 +1778,18 @@ static void window_options_invalidate(rct_window* w)
|
|||
w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_CHECKBOX);
|
||||
}
|
||||
|
||||
widget_set_checkbox_value(
|
||||
w, WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX, gConfigGeneral.enable_light_fx_for_vehicles);
|
||||
if (gConfigGeneral.day_night_cycle && gConfigGeneral.drawing_engine == DRAWING_ENGINE_SOFTWARE_WITH_HARDWARE_DISPLAY
|
||||
&& gConfigGeneral.enable_light_fx)
|
||||
{
|
||||
w->disabled_widgets &= ~(1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX);
|
||||
}
|
||||
else
|
||||
{
|
||||
w->disabled_widgets |= (1 << WIDX_ENABLE_LIGHT_FX_FOR_VEHICLES_CHECKBOX);
|
||||
}
|
||||
|
||||
widget_set_checkbox_value(
|
||||
w, WIDX_RENDER_WEATHER_EFFECTS_CHECKBOX,
|
||||
gConfigGeneral.render_weather_effects || gConfigGeneral.render_weather_gloom);
|
||||
|
|
|
@ -183,6 +183,7 @@ namespace Config
|
|||
model->day_night_cycle = reader->GetBoolean("day_night_cycle", false);
|
||||
|
||||
model->enable_light_fx = reader->GetBoolean("enable_light_fx", false);
|
||||
model->enable_light_fx_for_vehicles = reader->GetBoolean("enable_light_fx_for_vehicles", false);
|
||||
model->upper_case_banners = reader->GetBoolean("upper_case_banners", false);
|
||||
model->disable_lightning_effect = reader->GetBoolean("disable_lightning_effect", false);
|
||||
model->allow_loading_with_incorrect_checksum = reader->GetBoolean("allow_loading_with_incorrect_checksum", true);
|
||||
|
@ -256,6 +257,7 @@ namespace Config
|
|||
writer->WriteBoolean("minimize_fullscreen_focus_loss", model->minimize_fullscreen_focus_loss);
|
||||
writer->WriteBoolean("day_night_cycle", model->day_night_cycle);
|
||||
writer->WriteBoolean("enable_light_fx", model->enable_light_fx);
|
||||
writer->WriteBoolean("enable_light_fx_for_vehicles", model->enable_light_fx_for_vehicles);
|
||||
writer->WriteBoolean("upper_case_banners", model->upper_case_banners);
|
||||
writer->WriteBoolean("disable_lightning_effect", model->disable_lightning_effect);
|
||||
writer->WriteBoolean("allow_loading_with_incorrect_checksum", model->allow_loading_with_incorrect_checksum);
|
||||
|
|
|
@ -41,6 +41,7 @@ struct GeneralConfiguration
|
|||
int32_t virtual_floor_style;
|
||||
bool day_night_cycle;
|
||||
bool enable_light_fx;
|
||||
bool enable_light_fx_for_vehicles;
|
||||
bool upper_case_banners;
|
||||
bool render_weather_effects;
|
||||
bool render_weather_gloom;
|
||||
|
|
|
@ -128,6 +128,11 @@ bool lightfx_is_available()
|
|||
return _lightfxAvailable && gConfigGeneral.enable_light_fx != 0;
|
||||
}
|
||||
|
||||
bool lightfx_for_vehicles_is_available()
|
||||
{
|
||||
return lightfx_is_available() && gConfigGeneral.enable_light_fx_for_vehicles != 0;
|
||||
}
|
||||
|
||||
void lightfx_init()
|
||||
{
|
||||
_LightListBack = _LightListA;
|
||||
|
@ -685,165 +690,136 @@ uint32_t lightfx_get_light_polution()
|
|||
return _lightPolution_front;
|
||||
}
|
||||
|
||||
void lightfx_add_lights_magic_vehicles()
|
||||
void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle)
|
||||
{
|
||||
uint16_t spriteIndex = gSpriteListHead[SPRITE_LIST_VEHICLE_HEAD];
|
||||
while (spriteIndex != SPRITE_INDEX_NULL)
|
||||
uint16_t vehicleID = vehicle->sprite_index;
|
||||
|
||||
int16_t place_x, place_y, place_z;
|
||||
|
||||
place_x = vehicle->x;
|
||||
place_y = vehicle->y;
|
||||
place_z = vehicle->z;
|
||||
|
||||
static constexpr const int16_t offsetLookup[] = {
|
||||
10, 10, 9, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -9, -10, -10, -10, -9, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 9, 10,
|
||||
};
|
||||
|
||||
auto ride = get_ride(vehicle->ride);
|
||||
|
||||
switch (ride->type)
|
||||
{
|
||||
Vehicle* vehicle = &(get_sprite(spriteIndex)->vehicle);
|
||||
uint16_t vehicleID = spriteIndex;
|
||||
spriteIndex = vehicle->next;
|
||||
|
||||
Vehicle* mother_vehicle = vehicle;
|
||||
|
||||
if (mother_vehicle->ride_subtype == RIDE_ENTRY_INDEX_NULL)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (uint16_t q = vehicleID; q != SPRITE_INDEX_NULL;)
|
||||
{
|
||||
vehicle = GET_VEHICLE(q);
|
||||
|
||||
vehicleID = q;
|
||||
if (vehicle->next_vehicle_on_train == q)
|
||||
break;
|
||||
q = vehicle->next_vehicle_on_train;
|
||||
|
||||
int16_t place_x, place_y, place_z;
|
||||
|
||||
place_x = vehicle->x;
|
||||
place_y = vehicle->y;
|
||||
place_z = vehicle->z;
|
||||
|
||||
static constexpr const int16_t offsetLookup[] = {
|
||||
10, 10, 9, 8, 7, 6, 4, 2, 0, -2, -4, -6, -7, -8, -9, -10,
|
||||
-10, -10, -9, -8, -7, -6, -4, -2, 0, 2, 4, 6, 7, 8, 9, 10,
|
||||
};
|
||||
|
||||
auto ride = get_ride(vehicle->ride);
|
||||
if (ride == nullptr)
|
||||
continue;
|
||||
|
||||
switch (ride->type)
|
||||
case RIDE_TYPE_OBSERVATION_TOWER:
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y + 16, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x + 16, vehicle->y, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x - 16, vehicle->y, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y - 16, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
break;
|
||||
case RIDE_TYPE_MINE_TRAIN_COASTER:
|
||||
case RIDE_TYPE_GHOST_TRAIN:
|
||||
if (vehicle == vehicle_get_head(vehicle))
|
||||
{
|
||||
case RIDE_TYPE_OBSERVATION_TOWER:
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y + 16, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x + 16, vehicle->y, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x - 16, vehicle->y, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y - 16, vehicle->z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
break;
|
||||
case RIDE_TYPE_MINE_TRAIN_COASTER:
|
||||
case RIDE_TYPE_GHOST_TRAIN:
|
||||
if (vehicle == vehicle_get_head(vehicle))
|
||||
{
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
}
|
||||
break;
|
||||
case RIDE_TYPE_CHAIRLIFT:
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z - 16,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_2);
|
||||
break;
|
||||
case RIDE_TYPE_BOAT_HIRE:
|
||||
case RIDE_TYPE_CAR_RIDE:
|
||||
case RIDE_TYPE_GO_KARTS:
|
||||
case RIDE_TYPE_DODGEMS:
|
||||
case RIDE_TYPE_MINI_HELICOPTERS:
|
||||
case RIDE_TYPE_MONORAIL_CYCLES:
|
||||
case RIDE_TYPE_SUBMARINE_RIDE:
|
||||
case RIDE_TYPE_SPLASH_BOATS:
|
||||
case RIDE_TYPE_WATER_COASTER:
|
||||
{
|
||||
Vehicle* vehicle_draw = vehicle_get_head(vehicle);
|
||||
if (vehicle_draw->next_vehicle_on_train != SPRITE_INDEX_NULL)
|
||||
{
|
||||
vehicle_draw = GET_VEHICLE(vehicle_draw->next_vehicle_on_train);
|
||||
}
|
||||
place_x = vehicle_draw->x;
|
||||
place_y = vehicle_draw->y;
|
||||
place_z = vehicle_draw->z;
|
||||
place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
|
||||
place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_2);
|
||||
place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
|
||||
place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_2);
|
||||
break;
|
||||
}
|
||||
case RIDE_TYPE_MONORAIL:
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y, vehicle->z + 12,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_2);
|
||||
if (vehicle == vehicle_get_head(vehicle))
|
||||
{
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 3;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 3;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
if (vehicle == vehicle_get_tail(vehicle))
|
||||
{
|
||||
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0400 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
break;
|
||||
case RIDE_TYPE_MINIATURE_RAILWAY:
|
||||
if (vehicle == vehicle_get_head(vehicle))
|
||||
{
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
else
|
||||
{
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, LIGHTFX_LIGHT_TYPE_SPOT_3);
|
||||
}
|
||||
break;
|
||||
case RIDE_TYPE_CHAIRLIFT:
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z - 16,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_2);
|
||||
break;
|
||||
case RIDE_TYPE_BOAT_HIRE:
|
||||
case RIDE_TYPE_CAR_RIDE:
|
||||
case RIDE_TYPE_GO_KARTS:
|
||||
case RIDE_TYPE_DODGEMS:
|
||||
case RIDE_TYPE_MINI_HELICOPTERS:
|
||||
case RIDE_TYPE_MONORAIL_CYCLES:
|
||||
case RIDE_TYPE_SUBMARINE_RIDE:
|
||||
case RIDE_TYPE_SPLASH_BOATS:
|
||||
case RIDE_TYPE_WATER_COASTER:
|
||||
{
|
||||
Vehicle* vehicle_draw = vehicle_get_head(vehicle);
|
||||
if (vehicle_draw->next_vehicle_on_train != SPRITE_INDEX_NULL)
|
||||
{
|
||||
vehicle_draw = GET_VEHICLE(vehicle_draw->next_vehicle_on_train);
|
||||
}
|
||||
place_x = vehicle_draw->x;
|
||||
place_y = vehicle_draw->y;
|
||||
place_z = vehicle_draw->z;
|
||||
place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
|
||||
place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, LIGHTFX_LIGHT_TYPE_SPOT_2);
|
||||
place_x -= offsetLookup[(vehicle_draw->sprite_direction + 0) % 32];
|
||||
place_y -= offsetLookup[(vehicle_draw->sprite_direction + 8) % 32];
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z, LIGHTFX_LIGHT_TYPE_SPOT_2);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case RIDE_TYPE_MONORAIL:
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, vehicle->x, vehicle->y, vehicle->z + 12,
|
||||
LIGHTFX_LIGHT_TYPE_SPOT_2);
|
||||
if (vehicle == vehicle_get_head(vehicle))
|
||||
{
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 3;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 3;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
if (vehicle == vehicle_get_tail(vehicle))
|
||||
{
|
||||
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0300 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
place_x += offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y += offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0400 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
break;
|
||||
case RIDE_TYPE_MINIATURE_RAILWAY:
|
||||
if (vehicle == vehicle_get_head(vehicle))
|
||||
{
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0100 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
place_x -= offsetLookup[(vehicle->sprite_direction + 0) % 32] * 2;
|
||||
place_y -= offsetLookup[(vehicle->sprite_direction + 8) % 32] * 2;
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0200 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 2,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
else
|
||||
{
|
||||
lightfx_add_3d_light(
|
||||
vehicleID, 0x0000 | LIGHTFX_LIGHT_QUALIFIER_SPRITE, place_x, place_y, place_z + 10,
|
||||
LIGHTFX_LIGHT_TYPE_LANTERN_3);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
}
|
||||
|
||||
void lightfx_apply_palette_filter(uint8_t i, uint8_t* r, uint8_t* g, uint8_t* b)
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
# include "../common.h"
|
||||
|
||||
struct CoordsXY;
|
||||
struct Vehicle;
|
||||
struct rct_drawpixelinfo;
|
||||
struct rct_palette;
|
||||
|
||||
|
@ -44,6 +45,7 @@ enum LIGHTFX_LIGHT_QUALIFIER
|
|||
|
||||
void lightfx_set_available(bool available);
|
||||
bool lightfx_is_available();
|
||||
bool lightfx_for_vehicles_is_available();
|
||||
|
||||
void lightfx_init();
|
||||
|
||||
|
@ -62,7 +64,7 @@ void lightfx_add_3d_light(uint32_t lightID, uint16_t lightIDqualifier, int16_t x
|
|||
void lightfx_add_3d_light_magic_from_drawing_tile(
|
||||
const CoordsXY& mapPosition, int16_t offsetX, int16_t offsetY, int16_t offsetZ, uint8_t lightType);
|
||||
|
||||
void lightfx_add_lights_magic_vehicles();
|
||||
void lightfx_add_lights_magic_vehicle(const Vehicle* vehicle);
|
||||
|
||||
uint32_t lightfx_get_light_polution();
|
||||
|
||||
|
|
|
@ -3906,6 +3906,9 @@ enum
|
|||
|
||||
STR_GRAPH_AXIS_LABEL = 6360,
|
||||
|
||||
STR_ENABLE_LIGHTING_VEHICLES = 6361,
|
||||
STR_ENABLE_LIGHTING_VEHICLES_TIP = 6362,
|
||||
|
||||
// Have to include resource strings (from scenarios and objects) for the time being now that language is partially working
|
||||
STR_COUNT = 32768
|
||||
};
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include "Paint.Sprite.h"
|
||||
|
||||
#include "../../drawing/Drawing.h"
|
||||
#include "../../drawing/LightFX.h"
|
||||
#include "../../interface/Viewport.h"
|
||||
#include "../../peep/Staff.h"
|
||||
#include "../../ride/RideData.h"
|
||||
|
@ -111,6 +112,12 @@ void sprite_paint_setup(paint_session* session, const uint16_t x, const uint16_t
|
|||
{
|
||||
case SPRITE_IDENTIFIER_VEHICLE:
|
||||
vehicle_paint(session, (Vehicle*)spr, image_direction);
|
||||
#ifdef __ENABLE_LIGHTFX__
|
||||
if (lightfx_for_vehicles_is_available())
|
||||
{
|
||||
lightfx_add_lights_magic_vehicle(reinterpret_cast<Vehicle*>(const_cast<rct_sprite*>(spr)));
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
case SPRITE_IDENTIFIER_PEEP:
|
||||
peep_paint(session, (Peep*)spr, image_direction);
|
||||
|
|
Loading…
Reference in New Issue