/////////////////////////////////////////////////////////////////////////////// // // FILE: TimeCycle.cpp // BY : Mark Nicholson // FOR : Rockstar North // ON : 19 Aug 2008 // WHAT: // /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////// #include "TimeCycle.h" #include "TimeCycleDebug.h" // Rage headers #include "grcore/debugdraw.h" #include "math/vecmath.h" #include "spatialdata/sphere.h" #include "system/nelem.h" #include "system/threadtype.h" // Framework headers #include "timecycle/tccycle.h" #include "timecycle/tcinstbox.h" #include "timecycle/tcmanager.h" #include "timecycle/optimisations.h" // Game headers #include "debug/Rendering/DebugLighting.h" #include "debug/MarketingTools.h" #include "debug/LightProbe.h" #include "camera/cutscene/CutsceneDirector.h" #include "camera/scripted/ScriptDirector.h" #include "camera/viewports/ViewportManager.h" #include "camera/cinematic/camera/mounted/CinematicMountedCamera.h" #include "Cutscene/CutSceneManagerNew.h" #include "control/gamelogic.h" #include "Core/Game.h" #include "Cutscene/CutSceneManagerNew.h" #include "Cutscene/CutSceneCameraEntity.h" #include "frontend/NewHud.h" #include "frontend/PauseMenu.h" #include "game/Clock.h" #include "game/weather.h" #include "PathServer/ExportCollision.h" #include "Peds/ped.h" #include "Peds/PlayerSpecialAbility.h" #include "Peds/rendering/PedVariationStream.h" #include "Renderer/Renderer.h" #include "renderer/PostProcessFX.h" #include "renderer/PostProcessFXHelper.h" #include "renderer/Water.h" #include "renderer/Deferred/DeferredLighting.h" #include "Scene/DataFileMgr.h" #include "scene/playerswitch/PlayerSwitchInterface.h" #include "Scene/Portals/Portal.h" #include "Scene/Portals/PortalTracker.h" #include "scene/world/GameWorld.h" #include "Scene/world/GameWorldWaterHeight.h" #include "scene/lod/LodScale.h" #include "script/script.h" #include "streaming/streamingrequestlist.h" #include "timecycle/TimeCycleConfig.h" #include "Vfx/VfxHelper.h" #include "vfx/sky/SkySettings.h" #include "vfx/sky/Sky.h" #include "vfx/misc/LinearPiecewiseFog.h" #include "camera/viewports/ViewportManager.h" #include "camera/viewports/viewport.h" #include "camera/CamInterface.h" #include "camera/base/BaseCamera.h" #include "camera/replay/ReplayRecordedCamera.h" #include "control/replay/ReplayRecording.h" #include "camera/CamInterface.h" #include "camera/replay/ReplayDirector.h" #if GTA_REPLAY //To track down a bug where it looks as though the TC data isnt recording. PARAM(replayTCrecordOutput,"TTY output for replay TC recording"); #endif //GTA_REPLAY #ifndef NAVMESH_EXPORT #define NAVMESH_EXPORT 0 #endif CompileTimeAssert(TCVAR_NUM == TIMECYCLE_VAR_COUNT); // might as well catch this early // optimisations TIMECYCLE_OPTIMISATIONS() /////////////////////////////////////////////////////////////////////////////// // DEFINES /////////////////////////////////////////////////////////////////////////////// // constants const Vec3V SUN_LIGHT_UNDERWATER (0.0f, 0.0f, 1.0f); const float SUN_RISE_TIME = 6.0f; const float SUN_SET_TIME = 20.0f; const float SUN_MOON_TIME = SUN_SET_TIME + 1.5f; const float MOON_SUN_TIME = SUN_RISE_TIME - 1.5f; const float SUN_RISE_TO_SET_TIME = SUN_SET_TIME-SUN_RISE_TIME; const float SUN_SET_TO_MIDNIGHT_TIME = 24.0f-SUN_SET_TIME; // tweakables dev_float INTERIOR_BLEND_SCALE = 10.0f; dev_float INTERIOR_BLEND_OFFSET = 0.9f; dev_float INTERIOR_BLEND_EXP = 1.0f; dev_float INTERIOR_BLEND_FOG_MAX = 0.1f; dev_bool INTERIOR_BLEND_FOG_FADE = false; dev_bool INTERIOR_BLEND_MATCH_SKY_TO_FAR_CLIP = false; extern bool g_cheapmodeHogEnabled; /////////////////////////////////////////////////////////////////////////////// // GLOBAL VARIABLES /////////////////////////////////////////////////////////////////////////////// CTimeCycle g_timeCycle; #if __BANK const char* g_debugGroupNames[] = { "Lights", "Post Fx", "Night Vision", "Heat Haze", "Lens Distortion", "Lens Artefacts", "Blur Vignetting", "Screen Blur", "Sky - Colour", "Sky - Sun", "Sky - Stars / Moon", "Sky - Cloud Gen", "Sky - Main Clouds", "Sky - Filler Clouds", "Cloud Shadows", "Directional Shadows", "Sprites", "Water", "Mirror", "Fog", "Reflection", "Misc", "LOD" }; #define TIMECYCLE_NUM_DEBUG_GROUPS (NELEM(g_debugGroupNames)) const char* g_userFlagNames[] = { "Underwater Only", "Interior Only", "Expand Ambient Light Box", "Interpolate Ambient Mult", "Reset Interior Ambient Cache" }; #define TIMECYCLE_NUM_USER_FLAGS (NELEM(g_userFlagNames)) #define BANK_ONLY_PARAM6(param0,param1,param2,param3,param4,param5) ,param0,param1,param2,param3,param4,param5 #else #define BANK_ONLY_PARAM6(param0,param1,param2,param3,param4,param5) #endif //__BANK enum { tcflag_underwateronly, tcflag_interioronly, tcflag_expandAmbientLightBox, tcflag_interpolateAmbient, tcflag_resetInteriorAmbCache, tcflag_count }; tcVarInfo g_varInfos[] = { // TCVARID NAME DEFAULT VARTYPE MODTYPE DEBUGMODMENU DEBUGGROUP DEBUGNAME DEBUGMIN DEBUGMAX DEBUGDELTA // light variables {TCVAR_LIGHT_DIR_COL_R, "light_dir_col_r", 0.890f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Directional Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_DIR_COL_G, "light_dir_col_g", 0.675f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_DIR_COL_B, "light_dir_col_b", 0.392f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_DIR_MULT, "light_dir_mult", 14.750f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Directional Intensity", 0.0f, 64.0f, 1.0f)}, {TCVAR_LIGHT_DIRECTIONAL_AMB_COL_R, "light_directional_amb_col_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Directional Ambient - Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_DIRECTIONAL_AMB_COL_G, "light_directional_amb_col_g", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_DIRECTIONAL_AMB_COL_B, "light_directional_amb_col_b", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_DIRECTIONAL_AMB_INTENSITY, "light_directional_amb_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Directional Ambient - Intensity", 0.0f, 255.0f, 1.0f)}, {TCVAR_LIGHT_DIRECTIONAL_AMB_INTENSITY_MULT, "light_directional_amb_intensity_mult", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Directional Ambient - Intensity Mult", 0.0f, 16.0f, 0.01f)}, {TCVAR_LIGHT_DIRECTIONAL_AMB_BOUNCE_ENABLED, "light_directional_amb_bounce_enabled", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Directional Ambient - Enable Bounce", 0.0f, 1.0f, 1.0f)}, {TCVAR_LIGHT_AMB_DOWN_WRAP, "light_amb_down_wrap", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Ambient - Down Wrap", 0.0f, 1.0f, 0.01f)}, {TCVAR_LIGHT_NATURAL_AMB_DOWN_COL_R, "light_natural_amb_down_col_r", 0.541f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Natural Ambient - Down Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_NATURAL_AMB_DOWN_COL_G, "light_natural_amb_down_col_g", 0.655f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_NATURAL_AMB_DOWN_COL_B, "light_natural_amb_down_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_NATURAL_AMB_DOWN_INTENSITY, "light_natural_amb_down_intensity", 6.250f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Natural Ambient - Down Intensity", 0.0f, 16.0f, 1.0f)}, {TCVAR_LIGHT_NATURAL_AMB_BASE_COL_R, "light_natural_amb_up_col_r", 1.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Natural Ambient - Base Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_NATURAL_AMB_BASE_COL_G, "light_natural_amb_up_col_g", 0.847f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_NATURAL_AMB_BASE_COL_B, "light_natural_amb_up_col_b", 0.459f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_NATURAL_AMB_BASE_INTENSITY, "light_natural_amb_up_intensity", 8.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Natural Ambient - Base Intensity", 0.0f, 16.0f, 1.0f)}, {TCVAR_LIGHT_NATURAL_AMB_BASE_INTENSITY_MULT, "light_natural_amb_up_intensity_mult", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Natural Ambient - Base Intensity Mult", 0.0f, 16.0f, 0.01f)}, {TCVAR_LIGHT_NATURAL_PUSH, "light_natural_push", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Natural Ambient Push", 0.0f, 1.0f, 0.01f)}, {TCVAR_LIGHT_AMBIENT_BAKE_RAMP, "light_ambient_bake_ramp", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Natural/Artificial Ambient Ramp", 0.0f, 1.0f, 0.1f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R, "light_artificial_int_down_col_r", 0.541f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Interior Ambient - Down Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G, "light_artificial_int_down_col_g", 0.655f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B, "light_artificial_int_down_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY, "light_artificial_int_down_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Interior Ambient - Down Intensity", 0.0f, 255.0f, 1.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R, "light_artificial_int_up_col_r", 1.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Interior Ambient - Base Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G, "light_artificial_int_up_col_g", 0.847f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B, "light_artificial_int_up_col_b", 0.459f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY, "light_artificial_int_up_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Interior Ambient - Base Intensity", 0.0f, 255.0f, 1.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_COL_R, "light_artificial_ext_down_col_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Exterior Ambient - Down Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_COL_G, "light_artificial_ext_down_col_g", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_COL_B, "light_artificial_ext_down_col_b", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_INTENSITY, "light_artificial_ext_down_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Exterior Ambient - Down Intensity", 0.0f, 255.0f, 1.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_COL_R, "light_artificial_ext_up_col_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Exterior Ambient - Base Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_COL_G, "light_artificial_ext_up_col_g", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_COL_B, "light_artificial_ext_up_col_b", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_INTENSITY, "light_artificial_ext_up_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Artificial Exterior Ambient - Base Intensity", 0.0f, 255.0f, 1.0f)}, {TCVAR_PED_LIGHT_COL_R, "ped_light_col_r", 0.500f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Ped Light Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_PED_LIGHT_COL_G, "ped_light_col_g", 0.682f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_PED_LIGHT_COL_B, "ped_light_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_PED_LIGHT_MULT, "ped_light_mult", 0.400f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Ped Light Intensity", 0.0f, 64.0f, 1.0f)}, {TCVAR_PED_LIGHT_DIRECTION_X, "ped_light_direction_x", -0.825f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Ped Light Direction X", -1.0f, 1.0f, 0.1f)}, {TCVAR_PED_LIGHT_DIRECTION_Y, "ped_light_direction_y", 0.565f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Ped Light Direction Y", -1.0f, 1.0f, 0.1f)}, {TCVAR_PED_LIGHT_DIRECTION_Z, "ped_light_direction_z", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Ped Light Direction Z", -1.0f, 1.0f, 0.1f)}, {TCVAR_LIGHT_AMB_OCC_MULT, "light_amb_occ_mult", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Ambient Occlusion Multiplier", 0.0f, 4.0f, 0.1f)}, {TCVAR_LIGHT_AMB_OCC_MULT_PED, "light_amb_occ_mult_ped", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Ped AO Multiplier", 0.0f, 1.0f, 0.1f)}, {TCVAR_LIGHT_AMB_OCC_MULT_VEH, "light_amb_occ_mult_veh", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Vehicle AO Multiplier", 0.0f, 1.0f, 0.1f)}, {TCVAR_LIGHT_AMB_OCC_MULT_PROP, "light_amb_occ_mult_prop", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Prop AO Multiplier", 0.0f, 1.0f, 0.1f)}, {TCVAR_LIGHT_AMB_VOLUMES_IN_DIFFUSE, "light_amb_volumes_in_diffuse", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "Ambient volumes in diffuse", 0.0f, 1.0f, 0.1f)}, {TCVAR_LIGHT_SSAO_INTEN, "ssao_inten", 3.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "SSAO Intensity", 0.0f, 16.0f, 0.1f)}, {TCVAR_LIGHT_SSAO_TYPE, "ssao_type", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "SSAO Type", 0.0f, 1.0f, 1.0f)}, {TCVAR_LIGHT_SSAO_CP_STRENGTH, "ssao_cp_strength", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "SSAO cp strength", 0.0f, 1.0f, 0.01f)}, {TCVAR_LIGHT_SSAO_QS_STRENGTH, "ssao_qs_strength", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Lights", "SSAO qs strength", 0.0f, 1.0f, 0.01f)}, {TCVAR_LIGHT_PED_RIM_MULT, "light_ped_rim_mult", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Ped Rim Multiplier", 0.0f, 1.0f, 0.01f)}, {TCVAR_LIGHT_DYNAMIC_BAKE_TWEAK, "light_dynamic_bake_tweak", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Dynamic Bake Tweak", -2.0f, 2.0f, 0.01f)}, {TCVAR_LIGHT_VEHICLE_SECOND_SPEC_OVERRIDE, "light_vehicle_second_spec_override", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Vehicle 2nd Spec override", 0.0f, 1.0f, 0.01f)}, {TCVAR_LIGHT_VEHICLE_INTENSITY_SCALE, "light_vehicle_intenity_scale", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Vehicle Intensity Scale", 0.0f, 1.0f, 0.01f)}, // Sun pos override {TCVAR_LIGHT_DIRECTION_OVERRIDE, "light_direction_override", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Light Position Override", 0.0f, 1.0f, 1.0f)}, {TCVAR_LIGHT_DIRECTION_OVERRIDE_OVERRIDES_SUN, "light_direction_override_overrides_sun", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Light Position Override Override Sun", 0.0f, 1.0f, 1.0f)}, {TCVAR_SUN_DIRECTION_X, "sun_direction_x", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Sun Position X", -1.0f, 1.0f, 0.1f)}, {TCVAR_SUN_DIRECTION_Y, "sun_direction_y", -1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Sun Position Y", -1.0f, 1.0f, 0.1f)}, {TCVAR_SUN_DIRECTION_Z, "sun_direction_z", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Sun Position Z", -1.0f, 1.0f, 0.1f)}, {TCVAR_MOON_DIRECTION_X, "moon_direction_x", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Moon Position X", -1.0f, 1.0f, 0.1f)}, {TCVAR_MOON_DIRECTION_Y, "moon_direction_y", -1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Moon Position Y", -1.0f, 1.0f, 0.1f)}, {TCVAR_MOON_DIRECTION_Z, "moon_direction_z", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Moon Position Z", -1.0f, 1.0f, 0.1f)}, // light ray variables {TCVAR_LIGHT_RAY_COL_R, "light_ray_col_r", 0.5f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightrays Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_RAY_COL_G, "light_ray_col_g", 0.5f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_RAY_COL_B, "light_ray_col_b", 0.5f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_LIGHT_RAY_MULT, "light_ray_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightrays Intensity", 0.0f, 32.0f, 1.0f)}, {TCVAR_LIGHT_RAY_UNDERWATER_MULT, "light_ray_underwater_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Underwater Lightrays Intensity", 0.0f, 32.0f, 1.0f)}, {TCVAR_LIGHT_RAY_DIST, "light_ray_dist", 100.0f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightrays Distance", 1.0f, 4000.0f, 1.0f)}, {TCVAR_LIGHT_RAY_HEIGHTFALLOFF, "light_ray_heightfalloff", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightrays HeightFallOff", 0.0f, 1000.0f, 0.10f)}, {TCVAR_LIGHT_RAY_HEIGHTFALLOFFSTART, "light_ray_height_falloff_start", 500.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightrays Height FallOffStart", 0.0f, 1000.0f, 0.010f)}, // Screen Space Light rays data {TCVAR_LIGHT_RAY_ADD_REDUCER, "light_ray_add_reducer", 4.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightray Addative Reducer", 1.0f, 8.0f, 0.1f)}, {TCVAR_LIGHT_RAY_BLIT_SIZE, "light_ray_blit_size", 10.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightray Blit Size", 0.1f, 10.0f, 0.1f)}, {TCVAR_LIGHT_RAY_RAY_LENGTH, "light_ray_length", 8.5f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lights", "Lightray Ray Length", 0.1f, 20.0f, 0.1f)}, // post fx variables {TCVAR_POSTFX_EXPOSURE, "postfx_exposure", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Exposure Tweak", -32.0f, 32.0f, 0.01f)}, {TCVAR_POSTFX_EXPOSURE_MIN, "postfx_exposure_min", -3.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Exposure Min", -32.0f, 32.0f, 0.01f)}, {TCVAR_POSTFX_EXPOSURE_MAX, "postfx_exposure_max", 3.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Exposure Max", -32.0f, 32.0f, 0.01f)}, {TCVAR_POSTFX_BRIGHT_PASS_THRESH_WIDTH, "postfx_bright_pass_thresh_width", 0.000f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Bright Pass Threshold (Width)", 0.0f, 10.0f, 0.01f)}, {TCVAR_POSTFX_BRIGHT_PASS_THRESH, "postfx_bright_pass_thresh", 0.000f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Bright Pass Threshold (Max)", 0.0f, 10.0f, 0.01f)}, {TCVAR_POSTFX_INTENSITY_BLOOM, "postfx_intensity_bloom", 2.880f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Intensity Bloom", 0.0f, 16.0f, 0.1f)}, {TCVAR_POSTFX_CORRECT_COL_R, "postfx_correct_col_r", 0.451f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Color Correction", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_CORRECT_COL_G, "postfx_correct_col_g", 0.478f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_CORRECT_COL_B, "postfx_correct_col_b", 0.443f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_CORRECT_CUTOFF, "postfx_correct_cutoff", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Color Correction Upper Cutoff", 0.0f, 16.0f, 0.001f)}, {TCVAR_POSTFX_SHIFT_COL_R, "postfx_shift_col_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Color Shift", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_SHIFT_COL_G, "postfx_shift_col_g", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_SHIFT_COL_B, "postfx_shift_col_b", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_SHIFT_CUTOFF, "postfx_shift_cutoff", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Color Shift Upper Cutoff", 0.0f, 16.0f, 0.001f)}, {TCVAR_POSTFX_DESATURATION, "postfx_desaturation", 0.700f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Desaturation", 0.0f, 10.0f, 0.01f)}, {TCVAR_POSTFX_NOISE, "postfx_noise", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Noise", 0.0f, 10.0f, 0.1f)}, {TCVAR_POSTFX_NOISE_SIZE, "postfx_noise_size", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Noise Size", 0.0f, 1.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_DARK, "postfx_tonemap_filmic_override_dark", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Override dark settings", 0.0f, 1.0f, 1.00f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_EXPOSURE_DARK, "postfx_tonemap_filmic_exposure_dark", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap Exposure", -4.0f, 4.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_A_DARK, "postfx_tonemap_filmic_a", 0.22f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap A", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_B_DARK, "postfx_tonemap_filmic_b", 0.3f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap B", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_C_DARK, "postfx_tonemap_filmic_c", 0.1f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap C", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_D_DARK, "postfx_tonemap_filmic_d", 0.2f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap D", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_E_DARK, "postfx_tonemap_filmic_e", 0.01f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap E", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_F_DARK, "postfx_tonemap_filmic_f", 0.3f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap F", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_W_DARK, "postfx_tonemap_filmic_w", 4.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Dark Filmic Tonemap W", 0.0f, 32.0f, 0.10f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_BRIGHT, "postfx_tonemap_filmic_override_bright", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Override bright settings", 0.0f, 1.0f, 1.00f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_EXPOSURE_BRIGHT, "postfx_tonemap_filmic_exposure_bright", -2.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap Exposure", -4.0f, 4.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_A_BRIGHT, "postfx_tonemap_filmic_a_bright", 0.22f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap A", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_B_BRIGHT, "postfx_tonemap_filmic_b_bright", 0.3f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap B", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_C_BRIGHT, "postfx_tonemap_filmic_c_bright", 0.1f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap C", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_D_BRIGHT, "postfx_tonemap_filmic_d_bright", 0.2f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap D", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_E_BRIGHT, "postfx_tonemap_filmic_e_bright", 0.01f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap E", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_F_BRIGHT, "postfx_tonemap_filmic_f_bright", 0.3f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap F", -16.0f, 16.0f, 0.01f)}, {TCVAR_POSTFX_TONEMAP_FILMIC_W_BRIGHT, "postfx_tonemap_filmic_w_bright", 4.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_SPECIAL, "Post Fx", "Bright Filmic Tonemap W", 0.0f, 32.0f, 0.10f)}, // vignetting intensity {TCVAR_POSTFX_VIGNETTING_INTENSITY, "postfx_vignetting_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Vignetting Intensity", 0.0f, 1.0f, 0.01f)}, {TCVAR_POSTFX_VIGNETTING_RADIUS, "postfx_vignetting_radius", 10.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Vignetting Radius", 0.0f, 500.0f, 0.01f)}, {TCVAR_POSTFX_VIGNETTING_CONTRAST, "postfx_vignetting_contrast", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Vignetting Contrast", 0.0f, 1.0f, 0.01f)}, {TCVAR_POSTFX_VIGNETTING_COL_R, "postfx_vignetting_col_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Vignetting Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_VIGNETTING_COL_G, "postfx_vignetting_col_g", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_VIGNETTING_COL_B, "postfx_vignetting_col_b", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, // colour gradient variables {TCVAR_POSTFX_GRAD_TOP_COL_R, "postfx_grad_top_col_r", 1.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Gradient Top Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_TOP_COL_G, "postfx_grad_top_col_g", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_TOP_COL_B, "postfx_grad_top_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_MIDDLE_COL_R, "postfx_grad_middle_col_r", 1.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Gradient Middle Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_MIDDLE_COL_G, "postfx_grad_middle_col_g", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_MIDDLE_COL_B, "postfx_grad_middle_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_BOTTOM_COL_R, "postfx_grad_bottom_col_r", 1.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Gradient Bottom Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_BOTTOM_COL_G, "postfx_grad_bottom_col_g", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_BOTTOM_COL_B, "postfx_grad_bottom_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_POSTFX_GRAD_MIDPOINT, "postfx_grad_midpoint", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Gradient Midpoint", 0.0f, 1.0f, 0.01f)}, {TCVAR_POSTFX_GRAD_TOP_MIDDLE_MIDPOINT, "postfx_grad_top_middle_midpoint", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Gradient Top-Middle Midpoint", 0.0f, 1.0f, 0.01f)}, {TCVAR_POSTFX_GRAD_MIDDLE_BOTTOM_MIDPOINT, "postfx_grad_middle_bottom_midpoint", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Gradient Middle-Bottom Midpoint", 0.0f, 1.0f, 0.01f)}, {TCVAR_POSTFX_SCANLINEINTENSITY, "postfx_scanlineintensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Scanline Intensity", 0.0f, 1.0f, 0.1f)}, {TCVAR_POSTFX_SCANLINE_FREQUENCY_0, "postfx_scanline_frequency_0", 800.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Scanline Frequency 0", 0.0f, 4000.0f, 0.1f)}, {TCVAR_POSTFX_SCANLINE_FREQUENCY_1, "postfx_scanline_frequency_1", 800.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Scanline Frequency 1", 0.0f, 4000.0f, 0.1f)}, {TCVAR_POSTFX_SCANLINE_SPEED, "postfx_scanline_speed", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Scanline Speed", 0.0f, 1.0f, 0.1f)}, {TCVAR_POSTFX_MOTIONBLUR_LENGTH, "postfx_motionblurlength", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Post Fx", "Motion Blur Length", 0.0f, 1.0f, 0.1f)}, // depth of field variables {TCVAR_DOF_FAR, "dof_far", 130.750f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "DOF Far", 0, 5000, 1)}, {TCVAR_DOF_BLUR_MID, "dof_blur_mid", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "DOF Mid Blur", 0.0f, 1.0f, 0.1f)}, {TCVAR_DOF_BLUR_FAR, "dof_blur_far", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "DOF Far Blur", 0.0f, 1.0f, 0.1f)}, {TCVAR_DOF_ENABLE_HQDOF, "dof_enable_hq", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Enable HQ DOF", 0.0f, 1.0f, 1.0f)}, {TCVAR_DOF_HQDOF_SMALLBLUR, "dof_hq_smallblur", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "HQ DOF uses Small Blur", 0.0f, 1.0f, 1.0f)}, {TCVAR_DOF_HQDOF_SHALLOWDOF, "dof_hq_shallowdof", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "HQ DOF uses Shallow DOF", 0.0f, 1.0f, 1.0f)}, {TCVAR_DOF_HQDOF_NEARPLANE_OUT, "dof_hq_nearplane_out", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Near start of focus plane", -20.0f, 25000.0f, 1.0f)}, {TCVAR_DOF_HQDOF_NEARPLANE_IN, "dof_hq_nearplane_in", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Near end focus plane", -20.0f, 25000.0f, 1.0f)}, {TCVAR_DOF_HQDOF_FARPLANE_OUT, "dof_hq_farplane_out", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Far start of focus plane", -20.0f, 25000.0f, 1.0f)}, {TCVAR_DOF_HQDOF_FARPLANE_IN, "dof_hq_farplane_in", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Near end focus plane", -20.0f, 25000.0f, 1.0f)}, {TCVAR_ENV_BLUR_IN, "environmental_blur_in", 10000.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Environmental Blur In", -20.0f, 25000.0f, 0.001f)}, {TCVAR_ENV_BLUR_OUT, "environmental_blur_out", 10000.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Environmental Blur Out", -20.0f, 25000.0f, 0.001f)}, {TCVAR_ENV_BLUR_SIZE, "environmental_blur_size", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Environmental Blur Size", 0.0f, 32.0f, 1.0f)}, {TCVAR_BOKEH_BRIGHTNESS_MIN, "bokeh_brightness_min", 4.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Bokeh Brightness Threshold Min", 0.0f, 10.0f, 0.01f)}, {TCVAR_BOKEH_BRIGHTNESS_MAX, "bokeh_brightness_max", 3.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Bokeh Brightness Threshold Max", 0.0f, 10.0f, 0.01f)}, {TCVAR_BOKEH_FADE_MIN, "bokeh_fade_min", 1.320f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Bokeh Brightness Threshold Fade Min", 0.0f, 10.0f, 0.01f)}, {TCVAR_BOKEH_FADE_MAX, "bokeh_fade_max", 0.060f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Post Fx", "Bokeh Brightness Threshold Fade Max", 0.0f, 10.0f, 0.01f)}, // night vision variables {TCVAR_NV_LIGHT_DIR_MULT, "nv_light_dir_mult", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Directional Multiplier", 0.0f, 255.0f, 1.0f)}, {TCVAR_NV_LIGHT_AMB_DOWN_MULT, "nv_light_amb_down_mult", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Ambient Down Multiplier", 0.0f, 255.0f, 1.0f)}, {TCVAR_NV_LIGHT_AMB_BASE_MULT, "nv_light_amb_up_mult", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Ambient Base Multiplier", 0.0f, 255.0f, 1.0f)}, {TCVAR_NV_LOWLUM, "nv_lowLum", 0.050f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Low Lum", 0.0f, 2.0f, 0.01f)}, {TCVAR_NV_HIGHLUM, "nv_highLum", 0.600f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "High Lum", 0.0f, 2.0f, 0.01f)}, {TCVAR_NV_TOPLUM, "nv_topLum", 0.750f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Top Lum", 0.0f, 2.0f, 0.01f)}, {TCVAR_NV_SCALERLUM, "nv_scalerLum", 10.00f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Scaler Lum", 0.0f, 256.0f, 0.01f)}, {TCVAR_NV_OFFSETLUM, "nv_offsetLum", 0.200f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Offset", -2.0f, 2.0f, 0.01f)}, {TCVAR_NV_OFFSETLOWLUM, "nv_offsetLowLum", 0.180f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Offset Low Lum", -2.0f, 2.0f, 0.01f)}, {TCVAR_NV_OFFSETHIGHLUM, "nv_offsetHighLum", 0.200f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Offset High Lum", -2.0f, 2.0f, 0.01f)}, {TCVAR_NV_NOISELUM, "nv_noiseLum", 0.050f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Noise", 0.0f, 1.0f, 0.01f)}, {TCVAR_NV_NOISELOWLUM, "nv_noiseLowLum", 0.050f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Noise Low Lum", 0.0f, 1.0f, 0.01f)}, {TCVAR_NV_NOISEHIGHLUM, "nv_noiseHighLum", 0.300f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Noise High Lum", 0.0f, 1.0f, 0.01f)}, {TCVAR_NV_BLOOMLUM, "nv_bloomLum", 0.010f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Bloom", 0.0f, 4.0f, 0.01f)}, {TCVAR_NV_COLORLUM_R, "nv_colorLum_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORLUM_G, "nv_colorLum_g", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORLUM_B, "nv_colorLum_b", 0.220f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORLOWLUM_R, "nv_colorLowLum_r", 0.000f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "Low Lum Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORLOWLUM_G, "nv_colorLowLum_g", 0.500f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORLOWLUM_B, "nv_colorLowLum_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORHIGHLUM_R, "nv_colorHighLum_r", 0.670f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "High Lum Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORHIGHLUM_G, "nv_colorHighLum_g", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_NV_COLORHIGHLUM_B, "nv_colorHighLum_b", 0.340f, VARTYPE_NONE, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Night Vision", "", 0.0f, 0.0f, 0.0f)}, // heat haze variables {TCVAR_HH_RANGESTART, "hh_startRange", 180.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Start range", 0.0f, 5000.0f, 0.5f)}, {TCVAR_HH_RANGEEND, "hh_farRange", 500.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Far range", 0.0f, 5000.0f, 0.5f)}, {TCVAR_HH_MININTENSITY, "hh_minIntensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Min Intensity", 0.0f, 2.0f, 0.01f)}, {TCVAR_HH_MAXINTENSITY, "hh_maxIntensity", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Max Intensity", 0.0f, 2.0f, 0.01f)}, {TCVAR_HH_DISPU, "hh_displacementU", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Displacement Scale U", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_DISPV, "hh_displacementV", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Displacement Scale V", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX1_USCALE, "hh_tex1UScale", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 U scale", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX1_VSCALE, "hh_tex1VScale", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 V scale", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX1_UOFFSET, "hh_tex1UOffset", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 U offset", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX1_VOFFSET, "hh_tex1VOffset", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 V offset", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX2_USCALE, "hh_tex2UScale", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 U scale", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX2_VSCALE, "hh_tex2VScale", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 V scale", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX2_UOFFSET, "hh_tex2UOffset", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 U offset", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX2_VOFFSET, "hh_tex2VOffset", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 V offset", -128.0f, 128.0f, 0.01f)}, {TCVAR_HH_TEX1_OFFSET, "hh_tex1UFrequencyOffset", PI/2.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 U Frequency offset", -10.0f*PI, 10.0f*PI, PI/10.0f)}, {TCVAR_HH_TEX1_FREQUENCY, "hh_tex1UFrequency", PI/2.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 U Frequency", -10.0f*PI, 10.0f*PI, PI/10.0f)}, {TCVAR_HH_TEX1_AMPLITUDE, "hh_tex1UAmplitude", 3.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 U Amplitude", -64.0f, 64.0f, 0.1f)}, {TCVAR_HH_TEX1_SCROLLING, "hh_tex1VScrollingSpeed", 20.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex1 V Scrolling speed", -64.0f, 64.0f, 0.1f)}, {TCVAR_HH_TEX2_OFFSET, "hh_tex2UFrequencyOffset", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 U Frequency offset", -10.0f*PI, 10.0f*PI, PI/10.0f)}, {TCVAR_HH_TEX2_FREQUENCY, "hh_tex2UFrequency", PI/5.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 U Frequency", -10.0f*PI, 10.0f*PI, PI/10.0f)}, {TCVAR_HH_TEX2_AMPLITUDE, "hh_tex2UAmplitude", 0.500f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 U Amplitude", -64.0f, 64.0f, 0.1f)}, {TCVAR_HH_TEX2_SCROLLING, "hh_tex2VScrollingSpeed", 3.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Heat Haze", "Tex2 V Scrolling speed", -64.0f, 64.0f, 0.1f)}, // lens distortion {TCVAR_LENS_DISTORTION_COEFF, "lens_dist_coeff", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Distortion", "Distortion Coefficient 1", -1.0f, 1.0f, 0.01f)}, {TCVAR_LENS_DISTORTION_CUBE_COEFF, "lens_dist_cube_coeff", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Distortion", "Distortion Coefficient 2", -1.0f, 1.0f, 0.01f)}, {TCVAR_LENS_CHROMATIC_ABERRATION_COEFF, "chrom_aberration_coeff", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Distortion", "Chrom Aberration Coefficient 1", -1.0f, 1.0f, 0.01f)}, {TCVAR_LENS_CHROMATIC_ABERRATION_CUBE_COEFF, "chrom_aberration_coeff2", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Distortion", "Chrom Aberration Coefficient 2", -1.0f, 1.0f, 0.01f)}, {TCVAR_LENS_ARTEFACTS_INTENSITY, "lens_artefacts_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Artefacts", "Lens Artefacts Global Multiplier", 0.0f, 1.0f, 0.01f)}, {TCVAR_LENS_ARTEFACTS_INTENSITY_MIN_EXP, "lens_artefacts_min_exp_intensity", 2.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Artefacts", "Lens Artefacts Min Exposure Fade Mult", 0.0f, 10.0f, 0.01f)}, {TCVAR_LENS_ARTEFACTS_INTENSITY_MAX_EXP, "lens_artefacts_max_exp_intensity", 0.200f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Lens Artefacts", "Lens Artefacts Max Exposure Fade Mult", 0.0f, 10.0f, 0.01f)}, // blur vignetting {TCVAR_BLUR_VIGNETTING_RADIUS, "blur_vignetting_radius", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Blur Vignetting", "Radius", 0.0f, 500.0f, 0.01f)}, {TCVAR_BLUR_VIGNETTING_INTENSITY, "blur_vignetting_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Blur Vignetting", "Intensity", 0.0f, 1.0f, 0.01f)}, // screen blur {TCVAR_SCREEN_BLUR_INTENSITY, "screen_blur_intensity", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Screen Blur", "Intensity", 0.0f, 1.0f, 0.01f)}, // sky variables // Sky colouring {TCVAR_SKY_ZENITH_TRANSITION_POSITION, "sky_zenith_transition_position", 0.500f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Transition (Vertical)", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_ZENITH_TRANSITION_EAST_BLEND, "sky_zenith_transition_east_blend", 0.500f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Transition East Blend", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_ZENITH_TRANSITION_WEST_BLEND, "sky_zenith_transition_west_blend", 0.500f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Transition West Blend", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_ZENITH_BLEND_START, "sky_zenith_blend_start", 0.000f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Blend Start", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_ZENITH_COL_R, "sky_zenith_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_ZENITH_COL_G, "sky_zenith_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_ZENITH_COL_B, "sky_zenith_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_ZENITH_COL_INTEN, "sky_zenith_col_inten", 1.000f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Color Intensity", 0.0f, 64.0f, 0.01f)}, {TCVAR_SKY_ZENITH_TRANSITION_COL_R, "sky_zenith_transition_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Transition Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_ZENITH_TRANSITION_COL_G, "sky_zenith_transition_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_ZENITH_TRANSITION_COL_B, "sky_zenith_transition_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_ZENITH_TRANSITION_COL_INTEN, "sky_zenith_transition_col_inten", 1.000f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Zenith Transition Intensity", 0.0f, 64.0f, 0.01f)}, {TCVAR_SKY_AZIMUTH_TRANSITION_POSITION, "sky_azimuth_transition_position", 0.500f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth Transition (Horizontal)", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_AZIMUTH_EAST_COL_R, "sky_azimuth_east_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth East Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_EAST_COL_G, "sky_azimuth_east_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_EAST_COL_B, "sky_azimuth_east_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_EAST_COL_INTEN, "sky_azimuth_east_col_inten", 1.000f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth East Intensity", 0.0f, 64.0f, 0.01f)}, {TCVAR_SKY_AZIMUTH_TRANSITION_COL_R, "sky_azimuth_transition_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth Transition Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_TRANSITION_COL_G, "sky_azimuth_transition_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_TRANSITION_COL_B, "sky_azimuth_transition_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_TRANSITION_COL_INTEN, "sky_azimuth_transition_col_inten", 1.000f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth Transition Intensity", 0.0f, 64.0f, 0.01f)}, {TCVAR_SKY_AZIMUTH_WEST_COL_R, "sky_azimuth_west_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth West Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_WEST_COL_G, "sky_azimuth_west_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_WEST_COL_B, "sky_azimuth_west_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_AZIMUTH_WEST_COL_INTEN, "sky_azimuth_west_col_inten", 1.000f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Azimuth West Intensity", 0.0f, 64.0f, 0.01f)}, {TCVAR_SKY_HDR, "sky_hdr", 7.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "HDR Intensity", 0.0f, 255.0f, 0.1f)}, {TCVAR_SKY_PLANE_COL_R, "sky_plane_r", 0.000f, VARTYPE_COL3, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Plane Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_PLANE_COL_G, "sky_plane_g", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_PLANE_COL_B, "sky_plane_b", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_PLANE_INTEN, "sky_plane_inten", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Colour", "Plane Intensity", 0.0f, 32.0f, 0.01f)}, // Sun variables {TCVAR_SKY_SUN_COL_R, "sky_sun_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Sun Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SUN_COL_G, "sky_sun_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SUN_COL_B, "sky_sun_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SUN_DISC_COL_R, "sky_sun_disc_col_r", 0.000f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Sun Disc Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SUN_DISC_COL_G, "sky_sun_disc_col_g", 0.000f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SUN_DISC_COL_B, "sky_sun_disc_col_b", 0.000f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SUN_DISC_SIZE, "sky_sun_disc_size", 2.5f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Disc Size", 0.0f, 16.0f, 0.1f)}, {TCVAR_SKY_SUN_HDR, "sky_sun_hdr", 10.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "HDR Intensity", 0.0f, 255.0f, 0.1f)}, {TCVAR_SKY_SUN_MIEPHASE, "sky_sun_miephase", 1.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Mie Phase", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_SUN_MIESCATTER, "sky_sun_miescatter", 1.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Mie Scatter", 1.0f, 1024.0f, 1.00f)}, {TCVAR_SKY_SUN_MIE_INTENSITY_MULT, "sky_sun_mie_intensity_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Mie Intensity Mult", 0.0f, 32.0f, 0.01f)}, {TCVAR_SKY_SUN_INFLUENCE_RADIUS, "sky_sun_influence_radius", 5.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Influence Radius", 0.0f, 128.0f, 0.01f)}, {TCVAR_SKY_SUN_SCATTER_INTEN, "sky_sun_scatter_inten", 2.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Sun", "Scatter Intensity", 0.0f, 128.0f, 0.01f)}, // Stars / Moon variables {TCVAR_SKY_MOON_COL_R, "sky_moon_col_r", 1.000f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "Moon Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_MOON_COL_G, "sky_moon_col_g", 1.000f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_MOON_COL_B, "sky_moon_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_MOON_DISC_SIZE, "sky_moon_disc_size", 2.5f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "Disc Size", 0.0f, 16.0f, 0.01f)}, {TCVAR_SKY_MOON_ITEN, "sky_moon_iten", 1.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "Moon Intensity", 0.0f, 16.0f, 0.01f)}, {TCVAR_SKY_STARS_ITEN, "sky_stars_iten", 1.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "Starfield Intensity", 0.0f, 16.0f, 0.01f)}, {TCVAR_SKY_MOON_INFLUENCE_RADIUS, "sky_moon_influence_radius", 5.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "Moon Influence Radius", 0.0f, 128.0f, 0.01f)}, {TCVAR_SKY_MOON_SCATTER_INTEN, "sky_moon_scatter_inten", 2.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Stars / Moon", "Moon Scatter Intensity", 0.0f, 64.0f, 0.01f)}, // Cloud variables // Cloud generation {TCVAR_SKY_CLOUD_GEN_FREQUENCY, "sky_cloud_gen_frequency", 2.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Cloud Gen", "Frequency", 0.0f, 16.0f, 0.01f)}, {TCVAR_SKY_CLOUD_GEN_SCALE, "sky_cloud_gen_scale", 64.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Cloud Gen", "Scale", 1.0f, 256.0f, 0.01f)}, {TCVAR_SKY_CLOUD_GEN_THRESHOLD, "sky_cloud_gen_threshold", 0.65f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Cloud Gen", "Threshold", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_GEN_SOFTNESS, "sky_cloud_gen_softness", 0.2f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Cloud Gen", "Softness", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_DENSITY_MULT, "sky_cloud_density_mult", 2.24f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Cloud Gen", "Density Multiplier", 0.0f, 6.0f, 0.01f)}, {TCVAR_SKY_CLOUD_DENSITY_BIAS, "sky_cloud_density_bias", 0.66f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Cloud Gen", "Density Bias", 0.0f, 1.0f, 0.01f)}, // Main clouds {TCVAR_SKY_CLOUD_MID_COL_R, "sky_cloud_mid_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Mid Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_MID_COL_G, "sky_cloud_mid_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_MID_COL_B, "sky_cloud_mid_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_BASE_COL_R, "sky_cloud_base_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Base Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_BASE_COL_G, "sky_cloud_base_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_BASE_COL_B, "sky_cloud_base_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_BASE_STRENGTH, "sky_cloud_base_strength", 0.9f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Base Strength", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_SHADOW_COL_R, "sky_cloud_shadow_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Shadow Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_SHADOW_COL_G, "sky_cloud_shadow_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_SHADOW_COL_B, "sky_cloud_shadow_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_CLOUD_SHADOW_STRENGTH, "sky_cloud_shadow_strength", 0.2f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Shadow Strength", -1.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_GEN_DENSITY_OFFSET, "sky_cloud_gen_density_offset", 0.15f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Shadow Threshold", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_OFFSET, "sky_cloud_offset", 0.1f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Color / Shadow Offset", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_OVERALL_STRENGTH, "sky_cloud_overall_strength", 0.5f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Detail Overlay", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_OVERALL_COLOR, "sky_cloud_overall_color", 0.5f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Detail Overlay Color", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_EDGE_STRENGTH, "sky_cloud_edge_strength", 0.5f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Edge Detail", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_FADEOUT, "sky_cloud_fadeout", 0.3f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Fadeout", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_CLOUD_HDR, "sky_cloud_hdr", 0.8f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "HDR Intensity", 0.0f, 256.0f, 0.01f)}, {TCVAR_SKY_CLOUD_DITHER_STRENGTH, "sky_cloud_dither_strength", 50.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Main Clouds", "Dither Strength", 0.0f, 2048.0f, 0.1f)}, {TCVAR_SKY_SMALL_CLOUD_COL_R, "sky_small_cloud_col_r", 0.500f, VARTYPE_COL3, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "Cloud Color", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SMALL_CLOUD_COL_G, "sky_small_cloud_col_g", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SMALL_CLOUD_COL_B, "sky_small_cloud_col_b", 0.500f, VARTYPE_NONE, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_SKY_SMALL_CLOUD_DETAIL_STRENGTH, "sky_small_cloud_detail_strength", 0.5f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "Strength", 0.0f, 1.0f, 0.01f)}, {TCVAR_SKY_SMALL_CLOUD_DETAIL_SCALE, "sky_small_cloud_detail_scale", 3.6f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "Scale", 0.0f, 256.0f, 0.01f)}, {TCVAR_SKY_SMALL_CLOUD_DENSITY_MULT, "sky_small_cloud_density_mult", 1.7f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "Density Multiplier", 0.0f, 6.0f, 0.01f)}, {TCVAR_SKY_SMALL_CLOUD_DENSITY_BIAS, "sky_small_cloud_density_bias", 0.558f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sky - Filler Clouds", "Density Bias", 0.0f, 6.0f, 0.01f)}, // cloud shadows {TCVAR_CLOUD_SHADOW_DENSITY, "cloud_shadow_density", 0.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Cloud Shadows", "Density", 0.0f, 1.0f, 0.01f)}, {TCVAR_CLOUD_SHADOW_SOFTNESS, "cloud_shadow_softness", 0.1f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Cloud Shadows", "Softness", 0.0f, 1.0f, 0.01f)}, {TCVAR_CLOUD_SHADOW_OPACITY, "cloud_shadow_opacity", 1.0f, VARTYPE_FLOAT, true, MODTYPE_NONE BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Cloud Shadows", "Opacity", 0.0f, 1.0f, 0.01f)}, // directional (cascade) shadows {TCVAR_DIRECTIONAL_SHADOW_NUM_CASCADES, "dir_shadow_num_cascades", 4.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Directional Shadows", "Num Cascades", 1.0f, 4.0f, 1.0f)}, {TCVAR_DIRECTIONAL_SHADOW_DISTANCE_MULTIPLIER, "dir_shadow_distance_multiplier", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Directional Shadows", "Distance Multiplier", 0.01f, 10.0f, 0.01f)}, {TCVAR_DIRECTIONAL_SHADOW_SOFTNESS, "dir_shadow_softness", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Directional Shadows", "Softness", -1.00f, 1.0f, 0.1f)}, {TCVAR_DIRECTIONAL_SHADOW_CASCADE0_SCALE, "dir_shadow_cascade0_scale", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Directional Shadows", "Cascade0 Scale", 0.01f, 3.0f, 0.1f)}, // sprite (corona and distant lights) variables {TCVAR_SPRITE_BRIGHTNESS, "sprite_brightness", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sprites", "Brightness", 0.0f, 100.0f, 1.0f)}, {TCVAR_SPRITE_SIZE, "sprite_size", 1.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sprites", "Scale", 0.0f, 100.0f, 1.0f)}, {TCVAR_SPRITE_CORONA_SCREENSPACE_EXPANSION, "sprite_corona_screenspace_expansion", 0.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sprites", "Corona Screenspace Expansion", 0.0f, 100.0f, 0.1f)}, {TCVAR_LENSFLARE_VISIBILITY, "Lensflare_visibility", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sprites", "Lensflare Visibility Mult", 0.0f, 10.0f, 0.1f)}, {TCVAR_SPRITE_DISTANT_LIGHT_TWINKLE, "sprite_distant_light_twinkle", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Sprites", "Distant Lights Twinkle Mult", 0.0f, 1.0f, 0.1f)}, // water variables {TCVAR_WATER_REFLECTION, "water_reflection", 0.25f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection", 0.0f, 3.0f, 0.05f)}, {TCVAR_WATER_REFLECTION_FAR_CLIP, "water_reflection_far_clip", 7000.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Far Clip", 0.0f, 7000.0f, 0.05f)}, {TCVAR_WATER_REFLECTION_LOD, "water_reflection_lod", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD", 0.0f, 5.0f, 1.00f)}, {TCVAR_WATER_REFLECTION_SKY_FLOD_RANGE, "water_reflection_sky_flod_range", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Sky FLOD Range", 0.0f, 1.0f, 0.01f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_ENABLED, "water_reflection_lod_range_enabled", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range Enabled", 0.0f, 1.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_HD_START, "water_reflection_lod_range_hd_start", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range HD Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_HD_END, "water_reflection_lod_range_hd_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range HD End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_ORPHANHD_START,"water_reflection_lod_range_orphanhd_start",-1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range Orphan HD Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_ORPHANHD_END, "water_reflection_lod_range_orphanhd_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range Orphan HD End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_LOD_START, "water_reflection_lod_range_lod_start", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range LOD Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_LOD_END, "water_reflection_lod_range_lod_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range LOD End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD1_START, "water_reflection_lod_range_slod1_start", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD1 Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD1_END, "water_reflection_lod_range_slod1_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD1 End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD2_START, "water_reflection_lod_range_slod2_start", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD2 Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD2_END, "water_reflection_lod_range_slod2_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD2 End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD3_START, "water_reflection_lod_range_slod3_start", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD3 Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD3_END, "water_reflection_lod_range_slod3_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD3 End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD4_START, "water_reflection_lod_range_slod4_start", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD4 Start", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_LOD_RANGE_SLOD4_END, "water_reflection_lod_range_slod4_end", -1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection LOD Range SLOD4 End", -1.0f, 16000.0f, 0.25f)}, {TCVAR_WATER_REFLECTION_HEIGHT_OFFSET, "water_reflection_height_offset", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Height Offset", -1000.0f, 1000.0f, 0.01f)}, {TCVAR_WATER_REFLECTION_HEIGHT_OVERRIDE, "water_reflection_height_override", 0.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Height Override", -1000.0f, 1000.0f, 0.01f)}, {TCVAR_WATER_REFLECTION_HEIGHT_OVERRIDE_AMOUNT, "water_reflection_height_override_amount", 0.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Height Override Amount", 0.0f, 1.0f, 0.01f)}, {TCVAR_WATER_REFLECTION_DISTANT_LIGHT_INTENSITY,"water_reflection_distant_light_intensity", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Distant Light Intensity", 0.0f, 5.0f, 0.01f)}, {TCVAR_WATER_REFLECTION_CORONA_INTENSITY, "water_reflection_corona_intensity", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Reflection Corona Intensity", 0.0f, 5.0f, 0.01f)}, {TCVAR_WATER_FOGLIGHT, "water_foglight", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Fog Light", 0.0f, 5.0f, 0.05f)}, {TCVAR_WATER_INTERIOR, "water_interior", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Fog Interior", 0.0f, 1.0f, 0.1f)}, {TCVAR_WATER_ENABLEFOGSTREAMING, "water_fogstreaming", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Enable Fog Streaming", 0.0f, 1.0f, 0.1f)}, {TCVAR_WATER_FOAM_INTENSITY_MULT, "water_foam_intensity_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Foam Intensity Mult", 0.0f, 10.0f, 0.1f)}, {TCVAR_WATER_DRYING_SPEED_MULT, "water_drying_speed_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Drying Speed Mult", 0.01f, 2.0f, 0.01f)}, {TCVAR_WATER_SPECULAR_INTENSITY, "water_specular_intensity", 3.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Water", "Specular Intensity", 0.0f, 400.0f, 0.1f)}, // mirror variables {TCVAR_MIRROR_REFLECTION_LOCAL_LIGHT_INTENSITY, "mirror_reflection_local_light_intensity", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Mirror", "Reflection Local Light Intensity", 0.0f, 2.0f, 0.01f)}, // fog variables {TCVAR_FOG_START, "fog_start", 73.000f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Start", -1000.0f, 5000.0f, 1.0f)}, {TCVAR_FOG_NEAR_COL_R, "fog_near_col_r", 0.012f, VARTYPE_COL4_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Near Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_NEAR_COL_G, "fog_near_col_g", 0.604f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_NEAR_COL_B, "fog_near_col_b", 1.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_NEAR_COL_A, "fog_near_col_a", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_SUN_COL_R, "fog_col_r", 0.412f, VARTYPE_COL4_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Sun Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_SUN_COL_G, "fog_col_g", 0.584f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_SUN_COL_B, "fog_col_b", 0.780f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_SUN_COL_A, "fog_col_a", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_SUN_LIGHTING_CALC_POW, "fog_sun_lighting_calc_pow", 8.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Sun lighting calc power", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_MOON_COL_R, "fog_moon_col_r", 0.5f, VARTYPE_COL4_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Moon Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_MOON_COL_G, "fog_moon_col_g", 0.5f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_MOON_COL_B, "fog_moon_col_b", 0.5f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_MOON_COL_A, "fog_moon_col_a", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_MOON_LIGHTING_CALC_POW, "fog_moon_lighting_calc_pow", 18.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Moon ligting calc power", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_FAR_COL_R, "fog_east_col_r", 0.412f, VARTYPE_COL4_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Far Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_FAR_COL_G, "fog_east_col_g", 0.584f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_FAR_COL_B, "fog_east_col_b", 0.780f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_FAR_COL_A, "fog_east_col_a", 0.000f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_DENSITY, "fog_density", 1.0f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Density", 0.0f, 10000.0f, 0.001f)}, {TCVAR_FOG_HEIGHT_FALLOFF, "fog_falloff", 0.5f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Height Falloff", 0.0f, 1000.0f, 0.001f)}, {TCVAR_FOG_BASE_HEIGHT, "fog_base_height", 0.0f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Base Height", -1000.0f, 1000.0f, 1.0f)}, {TCVAR_FOG_ALPHA, "fog_alpha", 1.0f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Alpha", 0.0f, 1.0f, 0.001f)}, {TCVAR_FOG_HORIZON_TINT_SCALE, "fog_horizon_tint_scale", 4.0f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Horizon Tint Scale", 0.0f, 100.0f, 0.01f)}, {TCVAR_FOG_HDR, "fog_hdr", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog HDR Intensity", 0.0f, 255.0f, 0.1f)}, {TCVAR_FOG_HAZE_COL_R, "fog_haze_col_r", 0.412f, VARTYPE_COL3_LIN, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Haze Colour", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_HAZE_COL_G, "fog_haze_col_g", 0.584f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_HAZE_COL_B, "fog_haze_col_b", 0.780f, VARTYPE_NONE, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "", 0.0f, 0.0f, 0.0f)}, {TCVAR_FOG_HAZE_DENSITY, "fog_haze_density", 0.5f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Haze Density", 0.0f, 1000.0f, 0.001f)}, {TCVAR_FOG_HAZE_ALPHA, "fog_haze_alpha", 1.0f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Haze Alpha", 0.0f, 1.0f, 0.010f)}, {TCVAR_FOG_HAZE_HDR, "fog_haze_hdr", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Haze HDR Intensity", 0.0f, 255.0f, 0.1f)}, {TCVAR_FOG_HAZE_START, "fog_haze_start", 0.000f, VARTYPE_FLOAT, true, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Haze Start", -0.0f, 5000.0f, 1.0f)}, // Linear piecewise fog. {TCVAR_FOG_SHAPE_LOW, "fog_shape_bottom", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog shape bottom", -1000.0f, 10000.0f, 1.0f)}, {TCVAR_FOG_SHAPE_HIGH, "fog_shape_top", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog shape top", -1000.0f, 10000.0f, 1.0f)}, {TCVAR_FOG_LOG_10_MIN_VISIBILIY, "fog_shape_log_10_of_visibility", 5.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog log10(visibility)", 0.0f, 5.0f, 0.001f)}, {TCVAR_FOG_SHAPE_WEIGHT_0, "fog_shape_weight_0", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "weight 0", 0.0f, 1.0f, 0.001f)}, {TCVAR_FOG_SHAPE_WEIGHT_1, "fog_shape_weight_1", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "weight 0", 0.0f, 1.0f, 0.001f)}, {TCVAR_FOG_SHAPE_WEIGHT_2, "fog_shape_weight_2", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "weight 0", 0.0f, 1.0f, 0.001f)}, {TCVAR_FOG_SHAPE_WEIGHT_3, "fog_shape_weight_3", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "weight 0", 0.0f, 1.0f, 0.001f)}, // fog shadows {TCVAR_FOG_SHADOW_AMOUNT, "fog_shadow_amount", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Shadow Amount", 0.0f, 1.0f, 0.010f)}, {TCVAR_FOG_SHADOW_FALLOFF, "fog_shadow_falloff", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Shadow Falloff", 0.0f, 1024.0f, 0.010f)}, {TCVAR_FOG_SHADOW_BASE_HEIGHT, "fog_shadow_base_height", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Shadow Base Height", -1024.0f, 1024.0f, 0.010f)}, // volumetric lights, {TCVAR_FOG_VOLUME_RANGE, "fog_volume_light_range", 50.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Volumetric Lights Range", 0.0f, 3000.0f, 0.1f)}, {TCVAR_FOG_VOLUME_FADE_RANGE, "fog_volume_light_fade", 50.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Volumetric Lights Fade Range", 0.0f, 3000.0f, 0.1f)}, {TCVAR_FOG_VOLUME_INTENSITY_SCALE, "fog_volume_light_intensity", 0.025f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Volumetric Lights Intensity Scale", 0.0f, 2.0f, 0.010f)}, {TCVAR_FOG_VOLUME_SIZE_SCALE, "fog_volume_light_size", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Volumetric Lights Size Scale", 0.0f, 2.0f, 0.010f)}, // fog ray {TCVAR_FOG_FOGRAY_CONTRAST, "fogray_contrast", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Ray Contrast", 0.0f, 10.0f, 0.010f)}, {TCVAR_FOG_FOGRAY_INTENSITY, "fogray_intensity", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Ray Intensity", 0.0f, 1.0f, 0.010f)}, {TCVAR_FOG_FOGRAY_DENSITY, "fogray_density", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Ray Density", 0.0f, 20.0f, 0.010f)}, {TCVAR_FOG_FOGRAY_NEARFADE, "fogray_nearfade", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Ray NearFade", 0.0f, 20.0f, 0.010f)}, {TCVAR_FOG_FOGRAY_FARFADE, "fogray_farfade", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Fog", "Fog Ray FarFade", 0.0f, 200.0f, 0.010f)}, // refection variables {TCVAR_REFLECTION_LOD_RANGE_START, "reflection_lod_range_start", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection LOD range - start", -1.0f, 4096.0f, 1.0f)}, {TCVAR_REFLECTION_LOD_RANGE_END, "reflection_lod_range_end", 50.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection LOD range - end", -1.0f, 4096.0f, 1.0f)}, {TCVAR_REFLECTION_SLOD_RANGE_START, "reflection_slod_range_start", 150.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection SLOD range - start", -1.0f, 4096.0f, 1.0f)}, {TCVAR_REFLECTION_SLOD_RANGE_END, "reflection_slod_range_end", 3000.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection SLOD range - end", -1.0f, 4096.0f, 1.0f)}, {TCVAR_REFLECTION_INTERIOR_RANGE, "reflection_interior_range", 10.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection Interior range", -1.0f, 4096.0f, 1.0f)}, {TCVAR_REFLECTION_TWEAK_INTERIOR_AMB, "reflection_tweak_interior_amb", 2.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection Interior Ambient Boost", 0.0f, 64.0f, 1.0f)}, {TCVAR_REFLECTION_TWEAK_EXTERIOR_AMB, "reflection_tweak_exterior_amb", 2.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection Exterior Ambient Boost", 0.0f, 64.0f, 1.0f)}, {TCVAR_REFLECTION_TWEAK_EMISSIVE, "reflection_tweak_emissive", 12.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection Emissive Boost", 0.0f, 64.0f, 1.0f)}, {TCVAR_REFLECTION_TWEAK_DIRECTIONAL, "reflection_tweak_directional", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection Directional Multiplier", 0.0f, 1.0f, 0.01f)}, {TCVAR_REFLECTION_HDR_MULT, "reflection_hdr_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Reflection", "Reflection HDR Mult", 0.0f, 1.0f, 0.1f)}, // misc variables {TCVAR_FAR_CLIP, "far_clip", 1500.000f, VARTYPE_FLOAT, false, MODTYPE_CLAMP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Far Clip", 0.0f, 10000.0f, 1.0f)}, {TCVAR_TEMPERATURE, "temperature", 10.000f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "Temperature", -40.0f, 50.0f, 1.0f)}, {TCVAR_PTFX_EMISSIVE_INTENSITY_MULT, "particle_emissive_intensity_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Particle Emissive Intensity Mult", 0.0f, 10.0f, 0.1f)}, {TCVAR_VFXLIGHTNING_INTENSITY_MULT, "vfxlightning_intensity_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Vfx Lightning Intensity Mult", 0.0f, 50.0f, 0.1f)}, {TCVAR_VFXLIGHTNING_VISIBILITY, "vfxlightning_visibility", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Vfx Lightning Visibility", 0.0f, 1.0f, 0.1f)}, {TCVAR_GPUPTFX_LIGHT_INTENSITY_MULT, "particle_light_intensity_mult", 0.800f, VARTYPE_FLOAT, true, MODTYPE_INTERP_MULT BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "GPU Particle Light Intensity Mult", 0.0f, 64.0f, 0.05f)}, {TCVAR_NATURAL_AMBIENT_MULTIPLIER, "natural_ambient_multiplier", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "Natural Ambient Multiplier", 0.0f, 1.0f, 0.1f)}, {TCVAR_ARTIFICIAL_INT_AMBIENT_MULTIPLIER, "artificial_int_ambient_multiplier", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "Artifical Ambient Multiplier", 0.0f, 1.0f, 0.1f)}, {TCVAR_FOG_CUT_OFF, "fog_cut_off", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Fog Cut Off", 0.0f, 1.0f, 0.1f)}, {TCVAR_NO_WEATHER_FX, "no_weather_fx", 0.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "No Weather Fx", 0.0f, 1.0f, 1.0f)}, {TCVAR_NO_GPU_FX, "no_gpu_fx", 0.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "No GPU Fx", 0.0f, 1.0f, 1.0f)}, {TCVAR_NO_RAIN, "no_rain", 0.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "No Rain", 0.0f, 1.0f, 1.0f)}, {TCVAR_NO_RAIN_RIPPLES, "no_rain_ripples", 0.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "No Rain Ripple", 0.0f, 1.0f, 1.0f)}, {TCVAR_FOGVOLUME_DENSITY_SCALAR, "fogvolume_density_scalar", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "FogVolume Density Scalar", 0.0f, 10.0f, 0.01f)}, {TCVAR_FOGVOLUME_DENSITY_SCALAR_INTERIOR, "fogvolume_density_scalar_interior", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "FogVolume Density Scalar Interior", 0.0f, 10.0f, 0.01f)}, {TCVAR_FOGVOLUME_FOG_SCALER, "fogvolume_fog_scaler", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "FogVolume Fog Scaler", 0.0f, 10.0f, 0.01f)}, {TCVAR_TIME_OFFSET, "time_offset", 0.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "Time Offset", -120.0f, 120.0f, 1.0f)}, {TCVAR_VEHICLE_DIRT_MOD, "vehicle_dirt_mod", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_BASIC, "Misc", "Vehicle Dirt Mod", 0.0f, 1.0f, 0.05f)}, {TCVAR_WIND_SPEED_MULT, "wind_speed_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Wind Speed Mult", 0.0f, 1.0f, 0.01f)}, {TCVAR_ENTITY_REJECT, "entity_reject", 16000.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Entity reject", 1.0f, 16000.0f, 1.0f)}, {TCVAR_LOD_MULT, "lod_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult (Global)", 0.1f, 2.0f, 0.1f)}, {TCVAR_ENABLE_OCCLUSION, "enable_occlusion", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Enable Occlusion", 0.0f, 1.0f, 1.0f)}, {TCVAR_ENABLE_SHADOW_OCCLUSION, "enable_shadow_occlusion", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Enable Shadow Occlusion", 0.0f, 1.0f, 1.0f)}, {TCVAR_ENABLE_EXTERIOR, "render_exterior", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Enable Exterior", 0.0f, 1.0f, 1.0f)}, {TCVAR_PORTAL_WEIGHT, "portal_weight", 1.0f, VARTYPE_FLOAT, true, MODTYPE_MAX BANK_ONLY_PARAM6( MODMENU_DEFAULT, "Misc", "Portal Weight", 1.0f, 10.0f, 0.1f)}, {TCVAR_LIGHT_FALLOFF_MULT, "light_falloff_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Light FallOff Mult", 0.001f, 1.0f, 0.01f)}, {TCVAR_LODLIGHT_RANGE_MULT, "lodlight_range_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "LOD Light Range Mult", 0.001f, 1.0f, 0.01f)}, {TCVAR_SHADOW_DISTANCE_MULT, "shadow_distance_mult", 1.0f, VARTYPE_FLOAT, true, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Shadow Distance Mult", 0.0f, 1.0f, 0.1f)}, {TCVAR_LOD_MULT_HD, "lod_mult_hd", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult HD", 0.1f, 10.0f, 0.1f)}, {TCVAR_LOD_MULT_ORPHANHD, "lod_mult_orphanhd", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult orphan HD", 0.1f, 10.0f, 0.1f)}, {TCVAR_LOD_MULT_LOD, "lod_mult_lod", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult LOD", 0.1f, 10.0f, 0.1f)}, {TCVAR_LOD_MULT_SLOD1, "lod_mult_slod1", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult SLOD1", 0.1f, 10.0f, 0.1f)}, {TCVAR_LOD_MULT_SLOD2, "lod_mult_slod2", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult SLOD2", 0.1f, 10.0f, 0.1f)}, {TCVAR_LOD_MULT_SLOD3, "lod_mult_slod3", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult SLOD3", 0.1f, 10.0f, 0.1f)}, {TCVAR_LOD_MULT_SLOD4, "lod_mult_slod4", 1.0f, VARTYPE_FLOAT, false, MODTYPE_INTERP BANK_ONLY_PARAM6( MODMENU_DEFAULT, "LOD", "Lod Mult SLOD4", 0.1f, 10.0f, 0.1f)}, }; CompileTimeAssert(NELEM(g_varInfos) == TCVAR_NUM); #if GTA_REPLAY //interior modifiers that we want to disable CTimeCycle::EffectTableEntry CTimeCycle::m_InteriorReplayLookupTable[] = { { ATSTRINGHASH("v_strip3", 0x4e55a04e) } }; //Script modifiers that we want to disable in free cam CTimeCycle::EffectTableEntry CTimeCycle::m_ScriptEffectFreeCamRemovalReplayLookupTable[] = { { ATSTRINGHASH("DRUNK",0x3fdba102) }, { ATSTRINGHASH("STONED",0x1c70c68d) }, { ATSTRINGHASH("scanline_cam",0x340c3607) }, { ATSTRINGHASH("CAMERA_secuirity",0x5f4cf7dd) }, { ATSTRINGHASH("CAMERA_secuirity_FUZZ",0x93787e89) }, { ATSTRINGHASH("Drug_deadman",0xbd6b639) } }; //Script modifiers that we want to disable in game cam CTimeCycle::EffectTableEntry CTimeCycle::m_ScriptEffectAllCamsRemovalReplayLookupTable[] = { { ATSTRINGHASH("TrevorColorCodeBasic",0xafe3459c) }, { ATSTRINGHASH("MP_Arena_theme_hell", 0xf602e42a) }, { ATSTRINGHASH("MP_Arena_theme_atlantis", 0xa3b56c8b) }, { ATSTRINGHASH("FixerShortTrip",0x529EA9DB) }, }; #endif // GTA_REPLAY /////////////////////////////////////////////////////////////////////////////// // CODE /////////////////////////////////////////////////////////////////////////////// CTimeCycle::frameInfo *CTimeCycle::m_currFrameInfo = NULL; class dlCmdSetupTimeCycleFrameInfo : public dlCmdBase { public: enum { INSTRUCTION_ID = DC_SetupTimeCycleFrameInfo, }; dlCmdSetupTimeCycleFrameInfo(); s32 GetCommandSize() { return(sizeof(*this)); } static void ExecuteStatic(dlCmdBase &cmd) { ((dlCmdSetupTimeCycleFrameInfo &) cmd).Execute(); } void Execute(); private: CTimeCycle::frameInfo* newFrameInfo; }; class dlCmdClearTimeCycleFrameInfo : public dlCmdBase { public: enum { INSTRUCTION_ID = DC_ClearTimeCycleFrameInfo, REQUIRED_ALIGNMENT = 0, }; s32 GetCommandSize() { return(sizeof(*this)); } static void ExecuteStatic(dlCmdBase &cmd) { ((dlCmdClearTimeCycleFrameInfo &) cmd).Execute(); } void Execute(); }; dlCmdSetupTimeCycleFrameInfo::dlCmdSetupTimeCycleFrameInfo() { newFrameInfo = gDCBuffer->AllocateObjectFromPagedMemory(DPT_LIFETIME_RENDER_THREAD, sizeof(CTimeCycle::frameInfo)); sysMemCpy(newFrameInfo, &g_timeCycle.m_frameInfo, sizeof(CTimeCycle::frameInfo)); newFrameInfo->m_GlobalLodScale = g_LodScale.GetGlobalScale(); newFrameInfo->m_GrassLodScale = ( g_LodScale.GetGrassBatchScale() * g_LodScale.GetGlobalScale() ); } void dlCmdSetupTimeCycleFrameInfo::Execute() { CTimeCycle::m_currFrameInfo = newFrameInfo; g_LodScale.SetGlobalScaleForRenderthread(newFrameInfo->m_GlobalLodScale); g_LodScale.SetGrassScaleForRenderthread(newFrameInfo->m_GrassLodScale); } void dlCmdClearTimeCycleFrameInfo::Execute() { CTimeCycle::m_currFrameInfo = NULL; } /////////////////////////////////////////////////////////////////////////////// // CLASS ShadowFreezing /////////////////////////////////////////////////////////////////////////////// PARAM(NoShadowFreezer,""); float DistXY( const Vector3& a, const Vector3& b) { Vector3 v = b-a; return v.XYMag(); } ShadowFreezing::ShadowFreezing(){ m_MaxAngleOffset =0.06f;// rdr2 was 0.05 m_CameraMovementCatcupScale =0.1f; m_CameraRotationCatchupScale =0.0f; m_CameraTranslationCatchupScale =1.0f; m_AngleMovementAcceleration =0.05f; m_PrevAngleMovement =0.0f; m_PlayerActive=true; m_firstFrame=true; m_prevHeading=0.f; m_inited=false; m_isEnabled=true; BANK_ONLY(m_isCurrentlyFrozen=false;) } Vec3V_Out ShadowFreezing::Update(const Vector3& trueLightDir, const Vector3& camPos, bool isCut, float heading, const Vector3& playerP, bool playerActive, bool iscutscene ){ if (!m_inited) { m_inited = true; BANK_ONLY(m_isEnabled = !PARAM_NoShadowFreezer.Get();) } Vector3 lightDir =m_PrimaryShadowLightDir; Vector3 playerPos; if(playerActive) { playerPos=playerP; playerPos.y=0.0f; } else playerPos=m_PrevPlayerPos; float angleThreshhold=m_MaxAngleOffset; float angleMovementScale=m_CameraMovementCatcupScale; float angleMovement=0; bool cameraMoved = (m_PrevCamPos - camPos).Mag() > 0.1f || Abs(heading - m_prevHeading) > 0.1f; if((isCut && cameraMoved) || m_firstFrame || !IsEnabled()) { lightDir=trueLightDir; m_firstFrame=false; } else { float bearing = heading-m_prevHeading; angleMovement+=Min( DistXY(m_PrevCamPos,camPos), DistXY(m_PrevPlayerPos,playerPos))*m_CameraTranslationCatchupScale; angleMovement+=bearing*m_CameraRotationCatchupScale; float angle=acos(Saturate(lightDir.Dot(trueLightDir))); angleMovement*=angle; angleMovement=Min(angleMovement, Lerp(m_AngleMovementAcceleration, m_PrevAngleMovement, angleMovement)); angle=Min(Saturate(angle-angleMovement*angleMovementScale), angleThreshhold); BANK_ONLY( m_isCurrentlyFrozen=true; ) if(( angleMovement>0.0001f || angle>=angleThreshhold )&&( !iscutscene )) { Matrix34 rotMat; // perform camera update. rotMat.Identity(); Vector3 rotAxis; rotAxis.Cross(trueLightDir, lightDir); Vector3 up(0.f,0.f,1.f); rotAxis.NormalizeSafe(up); rotMat.MakeRotateUnitAxis(rotAxis, angle); lightDir.Dot(trueLightDir, rotMat); lightDir.Normalize(); BANK_ONLY(m_isCurrentlyFrozen=false;) } } m_PrevCamPos =camPos; m_PrevPlayerPos =playerPos; m_PrimaryShadowLightDir =lightDir; m_PrevAngleMovement =angleMovement; m_prevHeading=heading; return VECTOR3_TO_VEC3V(m_PrimaryShadowLightDir); } #if __BANK void ShadowFreezing::AddWidgets(bkBank & bank) { bank.PushGroup("Shadow Freezing"); bank.AddToggle("Enabled", &m_isEnabled); bank.AddSlider("Camera Movement Catchup Scale", &m_CameraMovementCatcupScale, 0.0f, 0.1f, 0.001f); bank.AddSlider("Camera Translation Catchup Scale", &m_CameraTranslationCatchupScale, 0.0f, 10.0f, 0.5f); bank.AddSlider("Camera Rotation Catchup Scale", &m_CameraRotationCatchupScale, 0.0f, 10.0f, 0.5f); bank.AddSlider("Angle Movement Acceleration", &m_AngleMovementAcceleration, 0.0f, 1.0f, 0.1f); bank.AddSlider("Max Angle Offset", &m_MaxAngleOffset, 0.0f, PI/4.0f, PI/64.0f); bank.AddText("Prev Angle Movement", &m_PrevAngleMovement); bank.AddText("Is Frozen", &m_isCurrentlyFrozen); bank.PopGroup(); } #endif // __BANK ShadowFreezing ShadowFreezer; //This needs to set the default value here before the settings get initialised on pc. bool CTimeCycle::m_longShadowsEnabled = false; /////////////////////////////////////////////////////////////////////////////// // CLASS CTimeCycle /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::InitDLCCommands() { DLC_REGISTER_EXTERNAL(dlCmdSetupTimeCycleFrameInfo); DLC_REGISTER_EXTERNAL(dlCmdClearTimeCycleFrameInfo); } class TimeCycleFileMounter : public CDataFileMountInterface { virtual bool LoadDataFile(const CDataFileMgr::DataFile & file) { switch(file.m_fileType) { case CDataFileMgr::TIMECYCLEMOD_FILE: g_timeCycle.AppendModifierFile(file.m_filename); break; default: break; } return true; } virtual void UnloadDataFile(const CDataFileMgr::DataFile & file) { switch(file.m_fileType) { case CDataFileMgr::TIMECYCLEMOD_FILE: g_timeCycle.RevertModifierFile(file.m_filename); break; default: break; } } } g_TimeCycleFileMounter; /////////////////////////////////////////////////////////////////////////////// // Init /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::Init(unsigned initMode) { // Moved this to the top because we call m_gameDebug.Init() in the INIT_AFTER_MAP_LOADED block, and it would assert that CTimeCycle has not been initialised yet. #if __ASSERT m_IsTimeCycleValid = true; #endif // __ASSERT if (initMode == INIT_CORE) { #if __BANK for (s32 i=0; im_filename); numCycles++; pData = DATAFILEMGR.GetNextFile(pData); } tcManager::InitMap(numCycles, cycleInfo, m_numRegions, m_regionInfo, CClock::GetNumTimeSamples(), timeSampleInfo #if __BANK , TIMECYCLE_NUM_DEBUG_GROUPS , g_debugGroupNames , TIMECYCLE_NUM_USER_FLAGS , g_userFlagNames #else , 0 , NULL , 0 , NULL #endif ); // test adding a region box (the tools are set up to do this yet) { Vec3V BBMin(-1747.178f, -3506.0f, 0.0f); Vec3V BBMax(1264.279f, 619.43f, 500.0f); spdAABB bBox(BBMin, BBMax); AddRegionBox(bBox,ATSTRINGHASH("URBAN",0x7d7b904f), 100.0f, 750.0f, 0, 0, -1, "CTimeCycle::Init"); } { Vec3V BBMin(-2517.747f, -3347.342f, 0.0f); Vec3V BBMax(-1713.271f, -133.549f, 271.342f); spdAABB bBox(BBMin, BBMax); AddRegionBox(bBox,ATSTRINGHASH("URBAN",0x7d7b904f), 100.0f, 750.0f, 0, 0, -1, "CTimeCycle::Init"); } { Vec3V BBMin(-2017.02f, -282.304f, 0.0f); Vec3V BBMax(417.0f, 1085.0f, 271.342f); spdAABB bBox(BBMin, BBMax); AddRegionBox(bBox,ATSTRINGHASH("URBAN",0x7d7b904f), 100.0f, 750.0f, 0, 0, -1, "CTimeCycle::Init"); } { Vec3V BBMin(1254.0f, -2489.396f, 0.0f); Vec3V BBMax(1444.0f, -197.25f, 267.59f); spdAABB bBox(BBMin, BBMax); AddRegionBox(bBox,ATSTRINGHASH("URBAN",0x7d7b904f), 100.0f, 750.0f, 0, 0, -1, "CTimeCycle::Init"); } { Vec3V BBMin(1254.0f, -196.606f, 0.0f); Vec3V BBMax(1756.208f, 112.971f, 267.59f); spdAABB bBox(BBMin, BBMax); AddRegionBox(bBox,ATSTRINGHASH("URBAN",0x7d7b904f), 100.0f, 750.0f, 0, 0, -1, "CTimeCycle::Init"); } // debug init #if TC_DEBUG m_gameDebug.Init(); #endif g_tcInstBoxMgr.Init(); tcInstBoxTypeLoader &typeStore = g_tcInstBoxMgr.GetTypeStore(); int typeCount = typeStore.GetTypeCount(); for(int i=0;iGetModifier(), "tcInstBoxTypeLoader::PostLoad"); const tcModifier *mod = GetModifier(n); bool validNat = false; bool validArt = false; Vec2V result = GetModifierAmbientScale(mod, validNat, validArt); boxType->SetIsValidNaturalAmbient(validNat); boxType->SetNaturalAmbient(result.GetXf()); boxType->SetIsValidArtificialAmbient(validArt); boxType->SetArtificialAmbient(result.GetYf()); } } else if (initMode == INIT_SESSION) { // scripted tc mods m_scriptModifierIndex = -1; m_transitionScriptModifierIndex = -1; m_scriptModifierStrength = 1.0f; m_transitionStrength = 0.0f; m_transitionSpeed = 0.0f; m_transitionOut = false; m_pushedScriptModifierIndex = -1; m_pushedTransitionScriptModifierIndex = -1; m_pushedTransitionStrength = 0.0f; m_pushedTransitionSpeed = 0.0f; m_pushedTransitionOut = false; m_pushedScriptModifier = false; m_extraModifierIndex = -1; // Player tc mods m_playerModifierIndexCurrent = -1; m_playerModifierIndexNext = -1; m_playerModifierStrength = 0.0f; m_cutsceneModifierIndex = -1; m_interiorBlendStrength = 1.0f; m_useDefaultKeyframe = false; m_regionOverride = -1; m_interiorInitialised = false; m_interiorApply = false; m_interiorReset = false; m_frameInfo.m_moonCycleOverride = -1.0f; m_interior_main_idx = -1; m_interior_secondary_idx = -1; m_scriptModifierIndex = -1; m_cutsceneModifierIndex = -1; m_playerModifierIndexCurrent = -1; m_playerModifierIndexNext = -1; m_playerModifierStrength = 0.0f; #if PLAYERSWITCH_FORCES_LIGHTDIR // Code side directional light override m_codeOverrideDirLightOrientation = Vec3V(V_Z_AXIS_WZERO); m_codeOverrideDirLightOrientationStrength = 0.0f; #endif // PLAYERSWITCH_FORCES_LIGHTDIR } #if GTA_REPLAY m_ReplayModifierHash = 0; m_ReplayModifierIntensity = 0.f; m_ReplayTCFrame.SetDefault(); m_ReplayDefaultTCFrame.SetDefault(); m_bUsingDefaultTCData = false; m_bReplayEnableExtraFX = false; m_ReplaySaturationIntensity = 0.0f; m_ReplayVignetteIntensity = 0.0f; m_ReplayContrastIntensity = 0.0f; m_ReplayBrightnessIntensity = 0.0f; #endif //GTA_REPLAY } void CTimeCycle::LoadModifierFiles() { const CDataFileMgr::DataFile* pData = DATAFILEMGR.GetFirstFile(CDataFileMgr::TIMECYCLEMOD_FILE); while(DATAFILEMGR.IsValid(pData)) { LoadModifierFile(pData->m_filename); pData = DATAFILEMGR.GetNextFile(pData); } FinishModifierLoad(); } void CTimeCycle::AppendModifierFile(const char* filename) { if(Verifyf(ASSET.Exists(filename,""),"Timecycle modifier file was not found in path %s",filename)) { LoadModifierFile(filename); } FinishModifierLoad(); #if TC_DEBUG tcDebug::RefreshTCWidgets(); #endif } void CTimeCycle::RevertModifierFile(const char* filename) { if(Verifyf(ASSET.Exists(filename,""),"Timecycle modifier file was not found in path %s",filename)) { UnloadModifierFile(filename); } FinishModifierLoad(); #if TC_DEBUG tcDebug::RefreshTCWidgets(); #endif } /////////////////////////////////////////////////////////////////////////////// // Shutdown /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::Shutdown(unsigned shutdownMode) { #if GTA_REPLAY if( shutdownMode == SHUTDOWN_CORE) { // Reset the map m_EffectsMap.Reset(); } else #endif //GTA_REPLAY if (shutdownMode == SHUTDOWN_WITH_MAP_LOADED) { tcManager::ShutdownMap(); } } /////////////////////////////////////////////////////////////////////////////// // Update /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::Update (bool finalUpdate) { PF_AUTO_PUSH_TIMEBAR("TimeCycle Update"); if( finalUpdate ) ANIMPOSTFXMGR.Update(); Vec3V_In vCameraPos = RCC_VEC3V(camInterface::GetPos()); // set any cutscene modifier //TF **REPLACE WITH NEW CUTSCENE** //if (CCutsceneManager::IsTimeCycleSafe()) //{ // m_cutsceneModifierIndex = FindModifierCS(CCutsceneManager::GetNameHash()); //} //else { m_cutsceneModifierIndex = -1; } // update the debug info #if TC_DEBUG m_gameDebug.Update(); #endif // get the current time to use s32 currHour = CClock::GetHour(); s32 currMinute = CClock::GetMinute(); s32 currSecond = CClock::GetSecond(); // update the base class if( CPauseMenu::GetPauseRenderPhasesStatus() == false ) tcManager::Update(vCameraPos, currHour, currMinute, currSecond); u32 prevHash = 0, nextHash = 0; float cycleInterp = 0.0f; // somewhat fudge the net transition if (g_weather.IsInNetTransition()) { // work out where we are coming from if(g_weather.GetNetTransitionPrevInterp() < 0.5f) { prevHash = g_weather.GetNetTransitionPrevType().m_hashName; } else { prevHash = g_weather.GetNetTransitionNextType().m_hashName; } // and where we're going to (use static next interp so this doesn't tip mid-transition) if(g_weather.GetNetTransitionNextInterp() < 0.5f) { nextHash = g_weather.GetPrevType().m_hashName; } else { nextHash = g_weather.GetNextType().m_hashName; } // use fast interp cycleInterp = g_weather.GetNetTransitionInterp(); } else { prevHash = g_weather.GetPrevType().m_hashName; nextHash = g_weather.GetNextType().m_hashName; cycleInterp = g_weather.GetInterp(); } // calc the base keyframe tcKeyframeUncompressed baseKeyframe; #if GTA_REPLAY tcKeyframeUncompressed replayKeyFrame; if( ShouldUseReplayTCData() ) { replayKeyFrame = m_ReplayTCFrame; ApplyCutsceneCameraOverrides(replayKeyFrame); } bool twoPhaseDiabled = false; #if TC_DEBUG twoPhaseDiabled = m_gameDebug.GetDisableReplayTwoPhaseSystem(); // Is actually 3 phase now, (1) game, (2) replay in normal cam, (3) replay in freecam #endif // TC_DEBUG //if we should be using two phase recording, set our start phase to be TIME_CYCLE_PHASE_REPLAY. eTimeCyclePhase startTimeCyclePhase = !twoPhaseDiabled && !CReplayMgr::IsEditModeActive() && finalUpdate ? (eTimeCyclePhase)0 : TIME_CYCLE_PHASE_GAME; //Loop through all the phases //Phase TIME_CYCLE_PHASE_REPLAY: Calculate the time cycle data without any script FX enabled, then offload this data into m_ReplayDefaultTCFrame //Phase TIME_CYCLE_PHASE_DEFAULT: Calculate the time cycle data as normal for(u32 i = startTimeCyclePhase; i < TIME_CYCLE_PHASE_MAX; ++i) { eTimeCyclePhase currentPhase = (eTimeCyclePhase)i; #endif // GTA_REPLAY CalcBaseKeyframe(baseKeyframe, currHour, currMinute, currSecond, prevHash, nextHash, cycleInterp); // get the current update buffer id // calc the base (un-modified) keyframe - using time and weather data if (m_useDefaultKeyframe) { m_frameInfo.m_keyframe.SetDefault(); } else { m_frameInfo.m_keyframe = baseKeyframe; } // Cycle time Date d1(1, Date::JANUARY, 2000); Date d2(CClock::GetDay(), Date::Month(CClock::GetMonth()), CClock::GetYear()); const double daysBetween = (double)Date::GetDaysBetween(d1, d2); const double dayRatio = (double)CClock::GetDayRatio(); const double cycleTime = daysBetween + dayRatio; SetCycleTime(cycleTime); // Turn off directional light in LastGen mode #if __BANK extern bool gLastGenMode; if (gLastGenMode) { m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_DIR_MULT, 0.0); } if (DebugLighting::OverrideDirectional()) // Overwrite { m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_DIR_MULT, 0.01f); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_DIR_COL_R, 0.01f); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_DIR_COL_G, 0.01f); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_DIR_COL_B, 0.01f); } #endif const float dirLightMult = PostFX::GetUseNightVision() ? (m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_MULT) * m_frameInfo.m_keyframe.GetVar(TCVAR_NV_LIGHT_DIR_MULT) ) : m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_MULT) * m_frameInfo.m_directionalLightIntensity; // save the unmodified directional light data - for use with daylight fillers and light shafts m_frameInfo.m_vBaseDirectionalLight = Vec4V(m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_R), m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_G), m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_B), dirLightMult); //Reset Lightning info m_frameInfo.m_LightningOverride = false; m_frameInfo.m_LightningDirection = m_frameInfo.m_vBaseDirectionalLight.GetXYZ(); m_frameInfo.m_LightningColor = Color32(0,0,0,0); m_frameInfo.m_LightningFogColor = Color32(0,0,0,0); if(m_useDefaultKeyframe REPLAY_ONLY( && !ShouldUseReplayTCData() ) ) { m_frameInfo.m_vDirectionalLightDir = Normalize(Vec3V(V_ONE)); } else { //Now override it bool suppressLightning = false; bool processInteriorLighting = true; #if GTA_REPLAY // Only apply interior modifier if we are in the normal phase or in an interior that we don't apply ourselves. processInteriorLighting = currentPhase == TIME_CYCLE_PHASE_GAME || currentPhase == TIME_CYCLE_PHASE_REPLAY_NORMAL || !ShouldApplyInteriorModifier(); #endif // GTA_REPLAY if (m_cutsceneModifierIndex!=-1) { ApplyCutsceneModifiers(m_frameInfo.m_keyframe); } else { bool isUnderWater = Water::IsCameraUnderwater(); if( isUnderWater ) { #if GTA_REPLAY //Only apply under water modifier if we're currently in the TIME_CYCLE_PHASE_DEFAULT phase if( currentPhase == TIME_CYCLE_PHASE_GAME ) #endif { UpdateUnderWater(m_frameInfo.m_keyframe, currHour, currMinute, currSecond); // apply any underwater weather type } } else { // calc the modified keyframe - based on the camera pos - skip underwater and interior boxes. ApplyBoxModifiers(m_frameInfo.m_keyframe,1.0f,false,false); } // apply any interior modifiers bool inInterior = false; if( processInteriorLighting ) { inInterior = ApplyInteriorModifiers(m_frameInfo.m_keyframe,isUnderWater,finalUpdate); } if( inInterior ) { // we're using interior modifiers - suppress any lightning effects suppressLightning = true; } } // Only disable directional lighting if we are in the normal phase or in an interior that we don't apply ourselves. if( processInteriorLighting ) { if (CPortal::GetNoDirectionalLight()==true) { // don't touch the base directional light since it might be useed for shafts and fillers. m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_DIR_MULT, 0.0f); } } // calc the sun light data CalcSunLightDir(); // Now override directional Light with lightning info if we have a lightning burst if (!suppressLightning && m_frameInfo.m_keyframe.GetVar(TCVAR_NO_WEATHER_FX)<1.0f) { float alpha = 1.0f; const bool isUnderWater = Water::IsCameraUnderwater(); if( isUnderWater ) { const CMainWaterTune& waterTunings = Water::GetMainWaterTunings(); const float start = waterTunings.m_WaterLightningDepth; const float end = start + waterTunings.m_WaterLightningFade; const float underWaterDepth = Water::GetWaterLevel() - camInterface::GetPos().z; alpha = 1.0f - CVfxHelper::GetInterpValue(underWaterDepth, start, end); } if( alpha > 0.0f ) { g_vfxLightningManager.PerformTimeCycleOverride(m_frameInfo, alpha); } } } // Setup reflection tweaks const grcViewport *currentViewport = gVpMan.GetCurrentGameGrcViewport(); const Vector3 camDir = VEC3V_TO_VECTOR3(currentViewport->GetCameraMtx().c()); CShaderLib::SetGlobalReflectionCamDirAndEmissiveMult( camDir, m_frameInfo.m_keyframe.GetVar(TCVAR_REFLECTION_TWEAK_EMISSIVE)); // apply any global modifiers if(true TC_DEBUG_ONLY(&& !m_debug.GetModifierEditApply())) { // Always make sure the values for tonemapping are the default ones m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_DARK, false); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_A_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_A_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_B_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_B_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_C_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_C_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_D_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_D_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_E_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_E_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_F_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_F_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_W_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_W_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_EXPOSURE_DARK, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_EXPOSURE_DARK)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_BRIGHT, false); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_A_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_A_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_B_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_B_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_C_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_C_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_D_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_D_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_E_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_E_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_F_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_F_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_W_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_W_BRIGHT)); m_frameInfo.m_keyframe.SetVar(TCVAR_POSTFX_TONEMAP_FILMIC_EXPOSURE_BRIGHT, PostFX::GetTonemapParam(PostFX::TONEMAP_FILMIC_EXPOSURE_BRIGHT)); ApplyGlobalModifiers(m_frameInfo.m_keyframe, finalUpdate REPLAY_ONLY(, currentPhase)); } // Apply cutscene camera override ApplyCutsceneCameraOverrides(m_frameInfo.m_keyframe); if( CRenderer::GetDisableArtificialLights() ) { m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY,CShaderLib::GetOverridesArtIntAmbDown()); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY,CShaderLib::GetOverridesArtIntAmbBase()); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_DOWN_INTENSITY,CShaderLib::GetOverridesArtExtAmbDown()); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_EXT_AMB_BASE_INTENSITY,CShaderLib::GetOverridesArtExtAmbBase()); } #if __BANK // output info to screen if ( dirLightMult==0.0f || m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_MULT) == 0.0f || (m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_R) == 0.0f && m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_G) == 0.0f && m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_B) == 0.0f)) { grcDebugDraw::AddDebugOutput("WARNING: directional light and shadow is OFF"); } const bool darkChanged = (m_frameInfo.m_keyframe.GetVar(TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_DARK) > 0.0f); const bool brightChanged = (m_frameInfo.m_keyframe.GetVar(TCVAR_POSTFX_TONEMAP_FILMIC_OVERRIDE_BRIGHT) > 0.0f); if ( darkChanged ) { grcDebugDraw::AddDebugOutput("WARNING: using custom dark tone-map values"); } if ( brightChanged ) { grcDebugDraw::AddDebugOutput("WARNING: using custom bright tone-map values"); } const float hdrMultiplier = LightProbe::GetSkyHDRMultiplier(); // additional sky/fog HDR multiplier if (hdrMultiplier != 1.0f) { m_frameInfo.m_keyframe.MultVar(TCVAR_SKY_HDR, hdrMultiplier); m_frameInfo.m_keyframe.MultVar(TCVAR_SKY_SUN_HDR, hdrMultiplier); m_frameInfo.m_keyframe.MultVar(TCVAR_SKY_CLOUD_HDR, hdrMultiplier); m_frameInfo.m_keyframe.MultVar(TCVAR_FOG_HDR, hdrMultiplier); m_frameInfo.m_keyframe.MultVar(TCVAR_FOG_HAZE_HDR, hdrMultiplier); } #endif // check if we're paused // NOTE: We update and apply time cycle even when the game is paused if the marketing tools or replay editor is active. if ((fwTimer::IsGamePaused()) && !CMarketingTools::IsActive() REPLAY_ONLY( && !CReplayMgr::IsEditModeActive() ) ) { // always last ApplyLodScaleModifiers(WIN32PC_ONLY(m_frameInfo.m_keyframe)); #if __ASSERT m_IsTimeCycleValid = true; #endif // __ASSERT #if GTA_REPLAY //if we're processing anything other than TIME_CYCLE_PHASE_GAME we need to continue //so we can process to the normal game pass. if( currentPhase < TIME_CYCLE_PHASE_GAME ) { continue; } else { return; } #else return; #endif // GTA_REPLAY } // apply the visual settings to the keyframe ApplyVisualSettings(m_frameInfo.m_keyframe, vCameraPos); #if __BANK if (g_cheapmodeHogEnabled) m_frameInfo.m_keyframe.SetVar(TCVAR_FAR_CLIP, 1500.f); #endif // __BANK #if GTA_REPLAY if(ShouldUseReplayTCData()) { // overwrite final with replay values for(int varIdx = 0; varIdx < TCVAR_NUM; ++varIdx) { if(g_varInfos[varIdx].replayOverride) { m_frameInfo.m_keyframe.SetVar(varIdx, replayKeyFrame.GetVar(varIdx)); } } //reapply the underwater effect if we're underwater as this isn't //stored during a replay because it can change if the camera is moved about bool isUnderWater = Water::IsCameraUnderwater(); if(isUnderWater && m_bUsingDefaultTCData) { UpdateUnderWater(m_frameInfo.m_keyframe, currHour, currMinute, currSecond); } //don't apply any modifiers if they are already part of the TC data. if( ShouldApplyInteriorModifier() ) { // apply any interior modifiers ApplyInteriorModifiers(m_frameInfo.m_keyframe,isUnderWater,finalUpdate); } ApplyReplayEditorModifiers(m_frameInfo.m_keyframe); } // Apply replay extra effects (saturation, contrast, vignetting) if (AreReplayExtraEffectsEnabled()) { ApplyReplayExtraEffects(m_frameInfo.m_keyframe); } //cache the frame so if we are jumping we can use the cached values to make the post effects //consistent until we get to the point where we want to allow them to be updated again if(CReplayMgr::IsReplayInControlOfWorld()) { if(CPauseMenu::GetPauseRenderPhasesStatus()) { m_frameInfo.m_keyframe = g_KeyframeCachedForReplayJump; } else { g_KeyframeCachedForReplayJump = m_frameInfo.m_keyframe; } } RecordTimeCycleDataForReplay(currentPhase); #endif //GTA_REPLAY // always last ApplyLodScaleModifiers(WIN32PC_ONLY(m_frameInfo.m_keyframe)); #if GTA_REPLAY } #endif // GTA_REPLAY #if __ASSERT m_IsTimeCycleValid = true; #endif // __ASSERT // Update day night mix const float dayNightBalance = CalculateDayNightBalance(); SetDayNightBalance(dayNightBalance); } /////////////////////////////////////////////////////////////////////////////// // CalcBaseKeyframe /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::CalcBaseKeyframe(tcKeyframeUncompressed& baseKeyframe, const u32 hours, const u32 minutes, const u32 seconds, const u32 prevCycleHashName, const u32 nextCycleHashName, const float cycleInterp) { // get the time sample data u32 timeSampleIndex1; u32 timeSampleIndex2; float timeInterp; #if TC_DEBUG if (m_debug.GetKeyframeEditActive() && m_debug.GetKeyframeEditOverrideTimeSample()) { timeSampleIndex1 = m_debug.GetKeyframeEditTimeSampleIndex(); timeSampleIndex2 = timeSampleIndex1; timeInterp = 0.0f; CClock::SetTime((s32)tcConfig::GetTimeSampleInfo(timeSampleIndex1).hour,0,0); } else #endif { CalcTimeSampleInfo(hours, minutes, seconds, timeSampleIndex1, timeSampleIndex2, timeInterp); } // get the cycle data int cycleIndex1 = GetCycleIndex(prevCycleHashName); int cycleIndex2 = GetCycleIndex(nextCycleHashName); #if TC_DEBUG if (m_debug.GetKeyframeEditActive() && m_debug.GetKeyframeEditOverrideCycle()) { cycleIndex1 = m_debug.GetKeyframeEditCycleIndex(); cycleIndex2 = cycleIndex1; } #endif int baseRegionId = 0; // calc the base keyframe if (tcVerifyf(cycleIndex1>-1 && cycleIndex2>-1, "invalid cycle indices - cannot update the base keyframe (cycle 1: %d %d, cycle 2: %d %d ", prevCycleHashName, cycleIndex1, nextCycleHashName, cycleIndex2)) { // calc the base keyframe in the global region tcCycle& cycle1 = GetCycle(cycleIndex1); tcCycle& cycle2 = GetCycle(cycleIndex2); int regionOverride = m_regionOverride; #if TC_DEBUG if (m_debug.GetKeyframeEditActive() && m_debug.GetKeyframeEditOverrideRegion()) regionOverride = m_debug.GetKeyframeEditRegionIndex(); #endif if (regionOverride != -1) { if( cycleIndex1 == cycleIndex2 ) { baseKeyframe.InterpolateKeyframe( cycle1.GetKeyframe(regionOverride, timeSampleIndex1), cycle1.GetKeyframe(regionOverride, timeSampleIndex2), timeInterp ); } else { baseKeyframe.InterpolateKeyframe( cycle1.GetKeyframe(regionOverride, timeSampleIndex1), cycle2.GetKeyframe(regionOverride, timeSampleIndex1), cycle1.GetKeyframe(regionOverride, timeSampleIndex2), cycle2.GetKeyframe(regionOverride, timeSampleIndex2), cycleInterp, timeInterp ); } } else { if (TIMECYCLE_MAX_REGIONS > 1 && m_regionStrengths[1] == 1.0f) { baseRegionId = 1; // special-case for 2-region interpolation where the second region is 100%, e.g. within the city } if( cycleIndex1 == cycleIndex2 ) { baseKeyframe.InterpolateKeyframe( cycle1.GetKeyframe(baseRegionId, timeSampleIndex1), cycle1.GetKeyframe(baseRegionId, timeSampleIndex2), timeInterp ); } else { baseKeyframe.InterpolateKeyframe( cycle1.GetKeyframe(baseRegionId, timeSampleIndex1), cycle2.GetKeyframe(baseRegionId, timeSampleIndex1), cycle1.GetKeyframe(baseRegionId, timeSampleIndex2), cycle2.GetKeyframe(baseRegionId, timeSampleIndex2), cycleInterp, timeInterp ); } for (int regionId = baseRegionId + 1; regionId < TIMECYCLE_MAX_REGIONS; regionId++) // apply other regions { #if __BANK grcDebugDraw::AddDebugOutput("Region Id %d - %.3f", regionId, m_regionStrengths[regionId]); #endif if (m_regionStrengths[regionId] > 0.0f) { tcKeyframeUncompressed regionKeyframeRes; if( cycleIndex1 == cycleIndex2 ) { regionKeyframeRes.InterpolateKeyframe( cycle1.GetKeyframe(regionId, timeSampleIndex1), cycle1.GetKeyframe(regionId, timeSampleIndex2), timeInterp ); } else { regionKeyframeRes.InterpolateKeyframe( cycle1.GetKeyframe(regionId, timeSampleIndex1), cycle2.GetKeyframe(regionId, timeSampleIndex1), cycle1.GetKeyframe(regionId, timeSampleIndex2), cycle2.GetKeyframe(regionId, timeSampleIndex2), cycleInterp, timeInterp ); } baseKeyframe.InterpolateKeyframeBlend( regionKeyframeRes, m_regionStrengths[regionId] ); } } } } u32 overTimeIdx = g_weather.GetOverTimeType(); if( overTimeIdx != 0xffffffff ) { tcCycle& cycle = GetCycle(overTimeIdx); tcKeyframeUncompressed baseOverTimeKeyFrame; baseOverTimeKeyFrame.InterpolateKeyframe( cycle.GetKeyframe(baseRegionId, timeSampleIndex1), cycle.GetKeyframe(baseRegionId, timeSampleIndex2), timeInterp ); for (int regionId = baseRegionId + 1; regionId < TIMECYCLE_MAX_REGIONS; regionId++) // apply other regions { if (m_regionStrengths[regionId] > 0.0f) { tcKeyframeUncompressed regionKeyframeRes; regionKeyframeRes.InterpolateKeyframe( cycle.GetKeyframe(regionId, timeSampleIndex1), cycle.GetKeyframe(regionId, timeSampleIndex2), timeInterp ); baseOverTimeKeyFrame.InterpolateKeyframeBlend( regionKeyframeRes, m_regionStrengths[regionId] ); } } if( !fwTimer::IsGamePaused() ) { // Yeah, we're doing the update here, a bit later // but if not, we get a nasty flash due to update ordering. g_weather.UpdateOverTimeTransition(); } float overTimeDelta = g_weather.GetOverTimeInterp(); baseKeyframe.InterpolateKeyframeBlend(baseOverTimeKeyFrame,overTimeDelta); } } /////////////////////////////////////////////////////////////////////////////// // UpdateUnderWater /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::UpdateUnderWater(tcKeyframeUncompressed& keyframe, const u32 hours, const u32 minutes, const u32 seconds) { float underWaterDepth = Water::GetWaterLevel() - camInterface::GetPos().z; // get the time sample info (this is also done in CalcBaseKeyframe so could be done once in Update and passed through to both functions instead) u32 timeSample1; u32 timeSample2; float timeInterp; CalcTimeSampleInfo(hours, minutes, seconds, timeSample1, timeSample2, timeInterp); // apply the underwater modifier to the current keyframe #if TC_DEBUG if (!g_timeCycle.GetGameDebug().GetDisableBaseUnderWaterModifier()) #endif { // apply global underwater modifier first const tcModifier *modifier = FindModifier(TC_ATSTRINGHASH("underwater", 0xA2663418),"underwater"); modifier->Apply(keyframe,1.0f); #if __BANK grcDebugDraw::AddDebugOutput("UnderWater Modifier: %.3f", 1.0f); #endif } // check if there is an underwater cycle #if TC_DEBUG if (!g_timeCycle.GetGameDebug().GetDisableUnderWaterCycle()) #endif { // blend in the shallow cycle between the start and mid depths s32 waterCycleIndex = GetCycleIndex(ATSTRINGHASH("underwater_deep", 0x8eb53546)); if (waterCycleIndex>-1) { const CMainWaterTune& waterTunings = Water::GetMainWaterTunings(); float start = waterTunings.m_WaterCycleDepth; float end = start + waterTunings.m_WaterCycleFade; if (underWaterDepth > start) { float interp = CVfxHelper::GetInterpValue(underWaterDepth, start, end); tcCycle& shallowCycle = GetCycle(waterCycleIndex); tcKeyframeUncompressed waterKeyframe; // calc the underwater keyframe between the two time samples waterKeyframe.InterpolateKeyframe( shallowCycle.GetKeyframe(0, timeSample1), shallowCycle.GetKeyframe(0, timeSample2), timeInterp ); // calc the keyframe between the weather and underwater keyframes keyframe.InterpolateKeyframeBlend( waterKeyframe, interp ); #if TC_DEBUG grcDebugDraw::AddDebugOutput("Underwater Shallow Cycle: %.3f", interp); #endif start = waterTunings.m_DeepWaterModDepth; if(underWaterDepth > start) { end = start + waterTunings.m_DeepWaterModFade; interp = CVfxHelper::GetInterpValue(underWaterDepth, start, end); const tcModifier *modifier = FindModifier(TC_ATSTRINGHASH("underwater_deep", 0x8eb53546),"underwater_deep"); modifier->Apply(keyframe, interp); #if TC_DEBUG grcDebugDraw::AddDebugOutput("Underwater Deep modifier: %.3f", interp); #endif } } } } // Recalculate unmoddifed directional light, since we modified it heavily for underwater const float dirLightMult = PostFX::GetUseNightVision() ? (m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_MULT) * m_frameInfo.m_keyframe.GetVar(TCVAR_NV_LIGHT_DIR_MULT) ) : m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_MULT) * m_frameInfo.m_directionalLightIntensity; // save the unmodified directional light data - for use with daylight fillers and light shafts m_frameInfo.m_vBaseDirectionalLight = Vec4V(m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_R), m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_G), m_frameInfo.m_keyframe.GetVar(TCVAR_LIGHT_DIR_COL_B), dirLightMult); // apply the underwater modifier boxes to the current keyframe #if TC_DEBUG if (!g_timeCycle.GetGameDebug().GetDisableUnderWaterModifiers()) #endif { ApplyUnderwaterModifiers(keyframe); } } /////////////////////////////////////////////////////////////////////////////// // InitLevelWidgets /////////////////////////////////////////////////////////////////////////////// #if TC_DEBUG PARAM(noshowtcmodifierinfo,""); void CTimeCycle::InitLevelWidgets () { if (PARAM_noshowtcmodifierinfo.Get()) { m_gameDebug.SetDisplayModifierInfo(false); } m_gameDebug.InitLevelWidgets(); bkBank* bk=BANKMGR.FindBank("TimeCycle"); ShadowFreezer.AddWidgets(*bk); } #endif /////////////////////////////////////////////////////////////////////////////// // ShutdownLevelWidgets /////////////////////////////////////////////////////////////////////////////// #if TC_DEBUG void CTimeCycle::ShutdownLevelWidgets () { m_gameDebug.ShutdownLevelWidgets(); } #endif /////////////////////////////////////////////////////////////////////////////// // Render /////////////////////////////////////////////////////////////////////////////// #if TC_DEBUG void CTimeCycle::Render () { // render any debug tcManager::Render(); } #endif /////////////////////////////////////////////////////////////////////////////// // SetShaderParams /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::SetShaderParams() { g_timeCycle.SetShaderData(); } /////////////////////////////////////////////////////////////////////////////// // SetShaderData /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::SetShaderData(CVisualEffects::eRenderMode mode) { tcAssertf(CSystem::IsThisThreadId(SYS_THREAD_RENDER), "not called from render thread"); const tcKeyframeUncompressed& currRenderKeyframe = GetCurrRenderKeyframe(); Vec4V vAmbOccEffectScale; vAmbOccEffectScale.SetXf(currRenderKeyframe.GetVar(TCVAR_LIGHT_AMB_OCC_MULT)); vAmbOccEffectScale.SetYf(currRenderKeyframe.GetVar(TCVAR_LIGHT_AMB_OCC_MULT) * currRenderKeyframe.GetVar(TCVAR_LIGHT_AMB_OCC_MULT_PED)); vAmbOccEffectScale.SetZf(currRenderKeyframe.GetVar(TCVAR_LIGHT_AMB_OCC_MULT) * currRenderKeyframe.GetVar(TCVAR_LIGHT_AMB_OCC_MULT_VEH)); vAmbOccEffectScale.SetWf(currRenderKeyframe.GetVar(TCVAR_LIGHT_AMB_OCC_MULT_PROP)); CShaderLib::SetGlobalAmbientOcclusionEffect(RCC_VECTOR4(vAmbOccEffectScale)); float rimScale = currRenderKeyframe.GetVar(TCVAR_LIGHT_PED_RIM_MULT); CShaderLib::SetGlobalPedRimLightScale(rimScale); float wetness=rage::Clamp(g_weather.GetWetness(), 0.0f, 1.0f); if (wetness>0.1f) { CShaderLib::SetDeferredWetBlendEnable(true); } else { CShaderLib::SetDeferredWetBlendEnable(false); } #if TC_DEBUG if (m_gameDebug.GetDisableFogAndHaze()) { CShaderLib::CFogParams vFogParams; CShaderLib::SetGlobalFogParams( vFogParams ); CShaderLib::SetGlobalFogColors( Vec3V(V_ZERO), Vec3V(V_ZERO), Vec3V(V_ZERO), Vec3V(V_ZERO), Vec3V(V_ZERO) ); #if LINEAR_PIECEWISE_FOG LinearPiecewiseFog_ShaderParams linearParams; // Default to off. CShaderLib::SetLinearPiecewiseFogParams(linearParams); #endif // LINEAR_PIECEWISE_FOG } else #endif // TC_DEBUG { const grcViewport *viewport = gVpMan.GetRenderGameGrcViewport(); const float cameraHeight = viewport->GetCameraMtx().GetM23f() ; const float fs = currRenderKeyframe.GetVar(TCVAR_FOG_START); const ScalarV fogStart(fs); const ScalarV fogEnd(Max(currRenderKeyframe.GetVar(TCVAR_FAR_CLIP), fs)); // for the fog plane blit, we will use a z value that is the same as the closest fog start value. // that way the fog is skipped for close objects (and frequently interiors) Vec3V edge = fogStart*Normalize(Vec3V(viewport->GetTanHFOV(), viewport->GetTanVFOV(), -1.0f)); // the ray along the edge of the view frustum. ScalarV fogStartDepth = edge.GetZ(); fogStartDepth = SelectFT(IsLessThan(fogStartDepth,ScalarV(-viewport->GetNearClip())), ScalarV(V_ZERO),(fogStartDepth*viewport->GetProjection().c().GetZ() + viewport->GetProjection().d().GetZ())/-fogStartDepth); // calc depth in screen space. float fogNearDensity = currRenderKeyframe.GetVar(TCVAR_FOG_DENSITY) / 10000.0f; float fogNearHeightFalloff = currRenderKeyframe.GetVar(TCVAR_FOG_HEIGHT_FALLOFF) / 1000.0f; float fogNearAlpha = currRenderKeyframe.GetVar(TCVAR_FOG_ALPHA) ; float fogGroundHeight = currRenderKeyframe.GetVar(TCVAR_FOG_BASE_HEIGHT); float fogHeightDensityAtViewer = expf( Min(-fogNearHeightFalloff * (cameraHeight-fogGroundHeight), 20.0f) ); // limit the value when going below the fog ground height so exp does not explode float fogFarDensity = currRenderKeyframe.GetVar(TCVAR_FOG_HAZE_DENSITY) / 10000.0f; float fogFarAlpha = currRenderKeyframe.GetVar(TCVAR_FOG_HAZE_ALPHA) ; float fogHorizonTintScale = currRenderKeyframe.GetVar(TCVAR_FOG_HORIZON_TINT_SCALE); float fogHazeStart = currRenderKeyframe.GetVar(TCVAR_FOG_HAZE_START); CShaderLib::CFogParams vFogParams; // note we pre-negate fogFarDensity and pre-multiply fogHeightDensityAtViewer by -fogNearDensity, to save shader instructions vFogParams.vFogParams[0] = VEC4V_TO_VECTOR4(Vec4V(fogStart, fogEnd, fogStartDepth, ScalarV(V_ZERO))); vFogParams.vFogParams[1] = VEC4V_TO_VECTOR4(Vec4V(-fogFarDensity, fogFarAlpha, fogHorizonTintScale / fogEnd.Getf(),-Min(1.0f,fogHeightDensityAtViewer*fogNearDensity))); vFogParams.vFogParams[2] = VEC4V_TO_VECTOR4(Vec4V(fogHazeStart, fogNearAlpha, fogNearHeightFalloff, Clamp(1.0f-exp(fogFarDensity*fogEnd.Getf()),0.0f, 1.0f)*fogFarAlpha)); vFogParams.vSunDirAndPower = VEC4V_TO_VECTOR4(Vec4V((GetLightningOverrideRender()?GetLightningDirectionRender():GetCurrSunSpriteDirection()), ScalarV(currRenderKeyframe.GetVar(TCVAR_FOG_SUN_LIGHTING_CALC_POW)))); vFogParams.vMoonDirAndPower = VEC4V_TO_VECTOR4(Vec4V((GetLightningOverrideRender()?GetLightningDirectionRender():GetCurrMoonSpriteDirection()), ScalarV(currRenderKeyframe.GetVar(TCVAR_FOG_MOON_LIGHTING_CALC_POW)))); CShaderLib::SetGlobalFogParams( vFogParams ); CShaderLib::SetFogRayIntensity(currRenderKeyframe.GetVar(TCVAR_FOG_FOGRAY_INTENSITY)); const float hdrMult = (mode == CVisualEffects::RM_CUBE_REFLECTION) ? currRenderKeyframe.GetVar(TCVAR_REFLECTION_HDR_MULT) : 1.0f; // get fog colours and pre-blend near fog to east and west far fog const ScalarV hdrMultiplier = ScalarVFromF32(currRenderKeyframe.GetVar(TCVAR_FOG_HDR) * hdrMult); Vec3V vFogColorSun = (GetLightningOverrideRender()? GetLightningFogColorRender().GetRGB():currRenderKeyframe.GetVarV3(TCVAR_FOG_SUN_COL_R)) * hdrMultiplier; Vec3V vFogColorMoon = (GetLightningOverrideRender()? GetLightningFogColorRender().GetRGB():currRenderKeyframe.GetVarV3(TCVAR_FOG_MOON_COL_R)) * hdrMultiplier; Vec3V vFogColorAtmosphere = currRenderKeyframe.GetVarV3(TCVAR_FOG_FAR_COL_R) * hdrMultiplier; Vec3V vFogColorGround = currRenderKeyframe.GetVarV3(TCVAR_FOG_NEAR_COL_R) * hdrMultiplier; Vec3V vFogColorHaze = currRenderKeyframe.GetVarV3(TCVAR_FOG_HAZE_COL_R) * ScalarVFromF32(currRenderKeyframe.GetVar(TCVAR_FOG_HAZE_HDR) * hdrMult); // lerp the far and sky colors to the near color based on our fog density at the eye point ScalarV fogColorLerp = ScalarV(powf(Clamp(fogHeightDensityAtViewer,0.0f,1.0f),0.3f)); vFogColorAtmosphere = Lerp(fogColorLerp, vFogColorAtmosphere, vFogColorGround); float fade = Max(m_frameInfo.m_moonFade,m_frameInfo.m_sunFade); CShaderLib::SetGlobalFogColors(Lerp(ScalarV(fade),vFogColorAtmosphere,vFogColorSun), vFogColorAtmosphere, vFogColorGround, vFogColorHaze, vFogColorMoon); #if LINEAR_PIECEWISE_FOG LinearPiecewiseFog_ShaderParams linearParams; // TODO:- Get from time cycle. Just use the values tweaked by RAG for now. LinearPiecewiseFog::FogKeyframe fogKeyFrame; fogKeyFrame.m_minHeight = currRenderKeyframe.GetVar(TCVAR_FOG_SHAPE_LOW); fogKeyFrame.m_maxHeight = currRenderKeyframe.GetVar(TCVAR_FOG_SHAPE_HIGH); fogKeyFrame.m_log10MinVisibility = currRenderKeyframe.GetVar(TCVAR_FOG_LOG_10_MIN_VISIBILIY); fogKeyFrame.m_shapeWeights = currRenderKeyframe.GetVarV4(TCVAR_FOG_SHAPE_WEIGHT_0); LinearPiecewiseFog::ComputeShaderParams(linearParams, cameraHeight, fogKeyFrame); CShaderLib::SetLinearPiecewiseFogParams(linearParams); #endif // LINEAR_PIECEWISE_FOG } } /////////////////////////////////////////////////////////////////////////////// // LoadVisualSettings /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::LoadVisualSettings () { // check the visual settings are loaded tcAssertf(g_visualSettings.GetIsLoaded(), "visual settings aren't loaded"); // read in the visual settings from the data file // hd/sd multipliers if (GRCDEVICE.GetHiDef()) { m_vsDOFblurScale = g_visualSettings.Get("misc.DOFBlurMultiplier.HD", 1.0f); } else { m_vsDOFblurScale = g_visualSettings.Get("misc.DOFBlurMultiplier.SD", 0.5f); } // altitude base far clip multiplier float heightStart = g_visualSettings.Get("misc.Multiplier.heightStart", 100.0f); float heightEnd = g_visualSettings.Get("misc.Multiplier.heightEnd", 250.0f); float clipMultiplier = g_visualSettings.Get("misc.Multiplier.farClipMultiplier", 2.0f); float fogMultiplier = g_visualSettings.Get("misc.Multiplier.nearFogMultiplier", 0.5f); m_vsFarClipMultiplier = clipMultiplier; m_vsNearFogMultiplier = fogMultiplier; m_vsMultiplierHeightStart = heightStart; m_vsOoMultiplierRange = 1.0f / (heightEnd-heightStart); m_vsRimLight = g_visualSettings.Get("misc.CrossPMultiplier.RimLight", 1.0f); m_vsGlobalEnvironmentReflection = g_visualSettings.Get("misc.CrossPMultiplier.GlobalEnvironmentReflection", 1.0f); m_vsGamma = g_visualSettings.Get("misc.CrossPMultiplier.Gamma", 1.0f); m_vsMidBlur = g_visualSettings.Get("misc.CrossPMultiplier.MidBlur", 1.0f); m_vsFarBlur = g_visualSettings.Get("misc.CrossPMultiplier.Farblur", 1.0f); m_vsSkyMultiplier = g_visualSettings.Get("misc.CrossPMultiplier.SkyMultiplier", 1.0f); m_vsDesaturation = g_visualSettings.Get("misc.CrossPMultiplier.Desaturation", 1.0f); // cutscene near blur factor m_vsCutsceneNearBlurMin = g_visualSettings.Get("misc.cutscene.nearBlurMin", 0.2f); // hi dof blur factor m_vsSpecularOffset = g_visualSettings.Get("raincollision", "specularoffset", 1.0f); // Moon dimming due to lunar cycle m_vsMoonDimMult = g_visualSettings.Get("misc.MoonDimMult", 1.0f); m_vsNextGenModifer = g_visualSettings.Get("misc.NextGenModifier", 1.0f); } /////////////////////////////////////////////////////////////////////////////// // ApplyVisualSettings /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::ApplyVisualSettings(tcKeyframeUncompressed& keyframe, Vec3V_In vCameraPos) const { tcAssert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)); // calc the far clip and near fog multipliers (can these be done in UpdateFinalize where they are used?) const float scaler = Clamp((vCameraPos.GetZf() - m_vsMultiplierHeightStart)*(m_vsOoMultiplierRange), 0.0f, 1.0f); float farClipMult = 1.0f + (m_vsFarClipMultiplier - 1.0f) * scaler; float nearFogMult = 1.0f + (m_vsNearFogMultiplier - 1.0f) * scaler; // apply scalers keyframe.MultVar(TCVAR_FOG_NEAR_COL_A, nearFogMult); keyframe.MultVar(TCVAR_FAR_CLIP, farClipMult); //TF **REPLACE WITH NEW CUTSCENE** // if (CCutsceneManager::IsTimeCycleSafe()) // { // keyframe.SetVar(TCVAR_DOF_BLUR_MID, Max(keyframe.GetVar(TCVAR_DOF_BLUR_MID), m_vsCutsceneNearBlurMin)); // } keyframe.MultVar(TCVAR_DOF_BLUR_MID, m_vsDOFblurScale); keyframe.MultVar(TCVAR_DOF_BLUR_FAR, m_vsDOFblurScale); keyframe.MultVar(TCVAR_LIGHT_PED_RIM_MULT, m_vsRimLight); keyframe.MultVar(TCVAR_DOF_BLUR_MID, m_vsMidBlur); keyframe.MultVar(TCVAR_DOF_BLUR_FAR, m_vsFarBlur); keyframe.MultVar(TCVAR_SKY_HDR, m_vsSkyMultiplier); keyframe.MultVar(TCVAR_POSTFX_DESATURATION, m_vsDesaturation); #if TC_DEBUG if (!g_timeCycle.GetGameDebug().GetDisableHighAltitudeModifier()) #endif { const tcModifier *modifier = FindModifier(atHashString("highaltitude",0x8CF23FD5),"ApplyVisualSettings",true); if( modifier ) modifier->Apply(keyframe, scaler); } } /////////////////////////////////////////////////////////////////////////////// // ApplyCutsceneModifiers /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::ApplyCutsceneModifiers(tcKeyframeUncompressed& keyframe) { tcAssert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)); #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisableCutsceneModifiers()) { return; } #endif // override the cutscene modifier if we are currently editing a modifier const tcModifier *cutsceneModifier = GetModifier(m_cutsceneModifierIndex); #if TC_DEBUG if (m_debug.GetModifierEditApply()) { cutsceneModifier = GetModifier(m_debug.GetModifierEditId()); } // output info to screen if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { grcDebugDraw::AddDebugOutput("Cutscene Modifier: %s(%d) - 1.0", GetModifierName(m_cutsceneModifierIndex),FindModifierRecordIndex(m_cutsceneModifierIndex)); } #endif // TC_DEBUG // modify the keyframe using this modifier cutsceneModifier->Apply(keyframe, 1.0f); // set the interior blend strength to be full m_interiorBlendStrength = 1.0f; } #define SetCSOverride(varIdx, value)\ if( value != -1.0f )\ {\ keyframe.SetVar(varIdx,value);\ } #define MinCSOverride(varIdx, value)\ if( value != -1.0f )\ {\ float var = keyframe.GetVar(varIdx);\ keyframe.SetVar(varIdx,Min(var,value));\ } #define MulCSOverride(varIdx, value)\ if( value != -1.0f )\ {\ float var = keyframe.GetVar(varIdx);\ keyframe.SetVar(varIdx,var*value);\ } void CTimeCycle::ApplyCutsceneCameraOverrides(tcKeyframeUncompressed& keyframe) { #if TC_DEBUG if( g_timeCycle.GetGameDebug().GetDisableCutsceneModifiers()) return; #endif CutSceneManager* csMgr = CutSceneManager::GetInstance(); Assert(csMgr); #if GTA_REPLAY if(CReplayMgr::IsEditModeActive()) { const cutfCameraCutEventArgs* replayArgs = csMgr->GetReplayCutsceneCameraArgs(); if(replayArgs) { SetCSOverride(TCVAR_LOD_MULT,replayArgs->GetMapLodScale()); SetCSOverride(TCVAR_REFLECTION_LOD_RANGE_START, replayArgs->GetReflectionLodRangeStart()); SetCSOverride(TCVAR_REFLECTION_LOD_RANGE_END, replayArgs->GetReflectionLodRangeEnd()); SetCSOverride(TCVAR_REFLECTION_SLOD_RANGE_START, replayArgs->GetReflectionSLodRangeStart()); SetCSOverride(TCVAR_REFLECTION_SLOD_RANGE_END, replayArgs->GetReflectionSLodRangeEnd()); SetCSOverride(TCVAR_LOD_MULT_HD, replayArgs->GetLodMultHD()); SetCSOverride(TCVAR_LOD_MULT_ORPHANHD, replayArgs->GetLodMultOrphanHD()); SetCSOverride(TCVAR_LOD_MULT_LOD, replayArgs->GetLodMultLod()); SetCSOverride(TCVAR_LOD_MULT_SLOD1, replayArgs->GetLodMultSlod1()); SetCSOverride(TCVAR_LOD_MULT_SLOD2, replayArgs->GetLodMultSlod2()); SetCSOverride(TCVAR_LOD_MULT_SLOD3, replayArgs->GetLodMultSlod3()); SetCSOverride(TCVAR_LOD_MULT_SLOD4, replayArgs->GetLodMultSlod4()); SetCSOverride(TCVAR_WATER_REFLECTION_FAR_CLIP, replayArgs->GetWaterReflectionFarClip()); SetCSOverride(TCVAR_LIGHT_SSAO_INTEN, replayArgs->GetLightSSAOInten()); MulCSOverride(TCVAR_LIGHT_DIR_MULT, replayArgs->GetDirectionalLightMultiplier()); MulCSOverride(TCVAR_LENS_ARTEFACTS_INTENSITY, replayArgs->GetLensArtefactMultiplier()); MinCSOverride(TCVAR_POSTFX_INTENSITY_BLOOM,replayArgs->GetBloomMax()); } return; } #endif if( csMgr->IsCutscenePlayingBack() ) { const CCutSceneCameraEntity* cam = csMgr->GetCamEntity(); if( cam ) { SetCSOverride(TCVAR_LOD_MULT,cam->GetMapLodScale()); SetCSOverride(TCVAR_REFLECTION_LOD_RANGE_START, cam->GetReflectionLodRangeStart()); SetCSOverride(TCVAR_REFLECTION_LOD_RANGE_END, cam->GetReflectionLodRangeEnd()); SetCSOverride(TCVAR_REFLECTION_SLOD_RANGE_START, cam->GetReflectionSLodRangeStart()); SetCSOverride(TCVAR_REFLECTION_SLOD_RANGE_END, cam->GetReflectionSLodRangeEnd()); SetCSOverride(TCVAR_LOD_MULT_HD, cam->GetLodMultHD()); SetCSOverride(TCVAR_LOD_MULT_ORPHANHD, cam->GetLodMultOrphanHD()); SetCSOverride(TCVAR_LOD_MULT_LOD, cam->GetLodMultLod()); SetCSOverride(TCVAR_LOD_MULT_SLOD1, cam->GetLodMultSlod1()); SetCSOverride(TCVAR_LOD_MULT_SLOD2, cam->GetLodMultSlod2()); SetCSOverride(TCVAR_LOD_MULT_SLOD3, cam->GetLodMultSlod3()); SetCSOverride(TCVAR_LOD_MULT_SLOD4, cam->GetLodMultSlod4()); SetCSOverride(TCVAR_WATER_REFLECTION_FAR_CLIP, cam->GetWaterReflectionFarClip()); SetCSOverride(TCVAR_LIGHT_SSAO_INTEN, cam->GetLightSSAOInten()); MulCSOverride(TCVAR_LIGHT_DIR_MULT, cam->GetDirectionalLightMultiplier()); MulCSOverride(TCVAR_LENS_ARTEFACTS_INTENSITY, cam->GetLensArtefactMultiplier()); MinCSOverride(TCVAR_POSTFX_INTENSITY_BLOOM,cam->GetBloomMax()); } } } /////////////////////////////////////////////////////////////////////////////// // ApplyBoxModifiers /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::ApplyBoxModifiers(tcKeyframeUncompressed& keyframe, float alpha, bool interiorOnly, bool underWaterOnly) { tcAssert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)); #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisableBoxModifiers()) { return; } #endif // set water height override to current water height, so modifiers can interpolate it properly keyframe.SetVar(TCVAR_WATER_REFLECTION_HEIGHT_OVERRIDE, CGameWorldWaterHeight::GetWaterHeight()); m_interiorReset = false; // modify the keyframe with the active modifiers for (s32 n=0; n 0.0f) { const tcModifier *modifier = GetModifier(n); // do the modify if(modifier->GetUserFlag(tcflag_underwateronly) == !underWaterOnly) //skip underwater continue; if(modifier->GetUserFlag(tcflag_interioronly) == !interiorOnly) //skip interior continue; m_interiorReset |= modifier->GetUserFlag(tcflag_resetInteriorAmbCache); // output info to screen #if TC_DEBUG // Gate this with a check for GetDisplayDebugText() - even if its off and won't render, doing the GetModifierName(), // FindModifierRecordIndex() and some of the code in AddDebugOutput() before it kicks out for every modifier adds up. if (grcDebugDraw::GetDisplayDebugText() && g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { grcDebugDraw::AddDebugOutput("Box Modifier: %s(%d) - %.3f", GetModifierName(n), FindModifierRecordIndex(n), m_modifierStrengths[n]); } #endif modifier->Apply(keyframe, m_modifierStrengths[n] * alpha); } } } void CTimeCycle::ApplyUnderwaterModifiers(tcKeyframeUncompressed& keyframe) { tcAssert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)); #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisableBoxModifiers()) { return; } #endif // modify the keyframe with the active modifiers for (s32 n=0; n 0.0f) { const tcModifier *mod = GetModifier(n); if(!mod->GetUserFlag(tcflag_underwateronly))//skip non underwater modifiers, might need an enum rather than magic numbers continue; if(mod->GetUserFlag(tcflag_interioronly))//skip non underwater modifiers, might need an enum rather than magic numbers continue; #if TC_DEBUG // output info to screen if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { grcDebugDraw::AddDebugOutput("Underwater Box Modifier: %s(%d) - %.3f", GetModifierName(n), FindModifierRecordIndex(n), m_modifierStrengths[n]); } #endif // do the modify mod->Apply(keyframe, m_modifierStrengths[n]); } } } /////////////////////////////////////////////////////////////////////////////// // ApplyInteriorModifiers /////////////////////////////////////////////////////////////////////////////// bool CTimeCycle::ApplyInteriorModifiers(tcKeyframeUncompressed& keyframe, bool isUnderWater, bool finalUpdate) { tcAssert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)); #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisableInteriorModifiers()) { return false; } #endif // // 1. GET INFO ABOUT ANY INTERIOR WE SHOULD BE USING // // Reset portal lists const Vec3V camPos = VECTOR3_TO_VEC3V(camInterface::GetPos()); for(int i=0;iGetPortalVisTracker() ) { CViewport *cvp = g_SceneToGBufferPhaseNew->GetViewport(); CPortalVisTracker *portalTracker = g_SceneToGBufferPhaseNew->GetPortalVisTracker(); Vector3 cameraPosition = camInterface::GetPos(); const CEntity* pAttachEntity = cvp->GetAttachEntity(); bool bFirstPerson = pAttachEntity && pAttachEntity->GetIsTypePed() && static_cast(pAttachEntity)->IsFirstPersonShooterModeEnabledForPlayer(false); entitySelectID targetEntityID = pAttachEntity? CEntityIDHelper::ComputeEntityID(pAttachEntity) : 0; if (cvp->GetAttachEntity() && (!bFirstPerson || portalTracker->ForceUpdateUsingTarget() || targetEntityID != portalTracker->GetLastTargetEntityId())) { portalTracker->UpdateUsingTarget(cvp->GetAttachEntity(), cameraPosition); } else { portalTracker->Update(cameraPosition); } portalTracker->SetLastTargetEntityId(targetEntityID); pInteriorProxy = portalTracker->m_pInteriorProxy; pInteriorInst = pInteriorProxy ? pInteriorProxy->GetInteriorInst() : NULL; roomIdx = portalTracker->m_roomIdx; CPortalVisTracker::StorePrimaryData(portalTracker->m_pInteriorProxy, portalTracker->m_roomIdx); } // override this info based on which interiors we are 'looking at' const grcViewport &viewPort = CRenderer::FixupScannedVisiblePortalViewport(*gVpMan.GetUpdateGameGrcViewport()); if( finalUpdate ) { CRenderer::ResetScannedVisiblePortal(); } if (pInteriorInst==NULL || roomIdx<= 0) { // we are outside - check if we are looking close enough at one if (scannedInteriorProxyId>=0) { pInteriorProxy = CInteriorProxy::GetPool()->GetSlot(scannedInteriorProxyId); pInteriorInst = pInteriorProxy->GetInteriorInst(); } roomIdx = 0; } else { // we are inside an interior CRenderer::SetScannedVisiblePortalInteriorProxyID(CInteriorProxy::GetPool()->GetJustIndex(pInteriorProxy)); } // check that any interior that we have chosen to use it valid if (pInteriorInst!=NULL) { // validate the interior instance - is it ready to be used? if (pInteriorInst->m_bInUse==false || pInteriorInst->m_bIsPopulated==false) { pInteriorInst = NULL; roomIdx = 0; } } // 1.1 WORK OUT THE INTERIOR AMBIENT COLORS AND SCREAM WHILE DOING IT BECAUSE WE LIKE SCREAMING if( roomIdx == 0 ) { s32 mainTcIdx = CRenderer::GetScannedVisiblePortalInteriorProxyMainTCModifier(); s32 secondaryTcIdx = CRenderer::GetScannedVisiblePortalInteriorProxySecondaryTCModifier(); m_interiorApply = true; if( mainTcIdx != -1 && m_interior_main_idx != mainTcIdx ) { SetInteriorCache(mainTcIdx, secondaryTcIdx); CRenderer::SetScannedVisiblePortalInteriorProxyMainTCModifier(-1); CRenderer::SetScannedVisiblePortalInteriorProxySecondaryTCModifier(-1); } } else { m_interiorApply = false; } // // 1.8. SCREAM SOME MORE // if( m_interiorReset ) { m_interior_main_idx = -1; m_interior_secondary_idx = -1; m_interiorInitialised = false; m_interiorReset = false; } // // 2. GET MODIFIER INFO ABOUT THE INTERIOR // // get information about the modifiers in this interior static CPortal::modifierQueryResults modifiers; if( CPauseMenu::GetPauseRenderPhasesStatus() == false ) { modifiers.Reset(); if (pInteriorInst!=NULL) { // valid interior CPortal::FindModifiersForInteriors(viewPort, pInteriorInst, roomIdx, &modifiers); } } // return early if that are no interior modifers if (modifiers.GetCount() == 0) { m_interiorBlendStrength = 0.0f; return false; } // // 3. CALC THE INTERIOR KEYFRAME THAT SHOULD BE BLENDED INTO THE CURRENT KEYFRAME // // Take the first modifier's portal weight float modifierWeightScale = 1.0f; if (modifiers[0].mainModifier != -1) { const tcModifier* currModifier = GetModifier(modifiers[0].mainModifier); currModifier->CreateAndLockVarMap(); // Get portal's weight modifierWeightScale = currModifier->GetModDataValAUnsafe(TCVAR_PORTAL_WEIGHT); // Punch in interior ambient values if( roomIdx != 0 ) { float punch_int_down_col_r = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R); float punch_int_down_col_g = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G); float punch_int_down_col_b = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B); float punch_int_down_intensity = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY); float punch_int_up_col_r = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R); float punch_int_up_col_g = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G); float punch_int_up_col_b = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B); float punch_int_up_intensity = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R, punch_int_down_col_r); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G, punch_int_down_col_g); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B, punch_int_down_col_b); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY, punch_int_down_intensity); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R, punch_int_up_col_r); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G, punch_int_up_col_g); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B, punch_int_up_col_b); keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY, punch_int_up_intensity); } currModifier->UnlockVarMap(); } // create a final interior modifier and initialise it to the keyframe that was passed in static tcModifier finalInteriorModifier; finalInteriorModifier.Init(keyframe); // go through the interior modifiers float exteriorStrength = 0.0f; float interiorStrength = 0.0f; float exteriorFxStrength = 0.0f; bool noExteriorFog = false; for (s32 i=0; iGetUserFlag(tcflag_underwateronly) == isUnderWater) { currModifier->CreateAndLockVarMap(); const tcModifier* secondaryModifier = NULL; if( current.secondaryModifier>=0 TC_DEBUG_ONLY(&& g_timeCycle.GetGameDebug().GetDisableSecondaryInteriorModifiers() == false) ) { secondaryModifier = GetModifier(current.secondaryModifier); if( secondaryModifier ) { Assert(secondaryModifier == FindModifier(current.secondaryModifierName,"interior")); secondaryModifier->CreateAndLockVarMap(); } } // blend the current modifier into the passed in keyframe with the correct strength static tcModifier tempModifier; tempModifier.Init(keyframe); if (secondaryModifier) { tempModifier.Blend(*currModifier, *secondaryModifier, current.strength); } else { tempModifier.Blend(*currModifier, current.strength); } // blend this into the final interior modifier using the blend weight finalInteriorModifier.Blend(tempModifier, blendWeight); // check if we don't want any exterior fog if (currModifier->GetModDataValAUnsafe(TCVAR_FOG_NEAR_COL_A)==0.0f) { if (currModifier->GetModDataValAUnsafe(TCVAR_FOG_CUT_OFF)==0.0f) { noExteriorFog = true; } } if (secondaryModifier) { // check if we don't want any exterior fog if (secondaryModifier->GetModDataValAUnsafe(TCVAR_FOG_NEAR_COL_A)==0.0f) { if (secondaryModifier->GetModDataValAUnsafe(TCVAR_FOG_CUT_OFF)==0.0f) { noExteriorFog = true; } } } currModifier->UnlockVarMap(); if (secondaryModifier) { secondaryModifier->UnlockVarMap(); } // output info to screen #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { int modifierIndex = GetModifierIndex((tcModifier*)currModifier); if( secondaryModifier ) { int secondaryModifierIndex = GetModifierIndex((tcModifier*)secondaryModifier); grcDebugDraw::AddDebugOutput("Portal Modifier: %s(%d) (ovr %s(%d)) - %.3fx%.3f = %.3f", GetModifierName(modifierIndex), FindModifierRecordIndex(modifierIndex), GetModifierName(secondaryModifierIndex), FindModifierRecordIndex(secondaryModifierIndex), current.strength, blendWeight, interiorStrength ); } else { grcDebugDraw::AddDebugOutput("Portal Modifier: %s(%d) - %.3fx%.3f = %.3f", GetModifierName(modifierIndex), FindModifierRecordIndex(modifierIndex), current.strength, blendWeight, interiorStrength ); } } #endif } } } // output info to screen #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { grcDebugDraw::AddDebugOutput("Blend Int %.3f Ext %.3f == %.3f", interiorStrength, exteriorStrength, interiorStrength * (1.0f-exteriorStrength)); } #endif // // BLEND THE INTERIOR KEYFRAME INTO THE CURRENT KEYFRAME // // store some exterior data before we blend so it can be re-applied after the blend if necessary float extNearFogStart = Max(keyframe.GetVar(TCVAR_FOG_START), 1.0f); Vector4 extNearFog(keyframe.GetVar(TCVAR_FOG_NEAR_COL_R), keyframe.GetVar(TCVAR_FOG_NEAR_COL_G), keyframe.GetVar(TCVAR_FOG_NEAR_COL_B), keyframe.GetVar(TCVAR_FOG_NEAR_COL_A)); float extFarClip = keyframe.GetVar(TCVAR_FAR_CLIP); Vec3V vExtFog(keyframe.GetVar(TCVAR_FOG_SUN_COL_R), keyframe.GetVar(TCVAR_FOG_SUN_COL_G), keyframe.GetVar(TCVAR_FOG_SUN_COL_B)); float extSkyMult = keyframe.GetVar(TCVAR_SKY_HDR); float extFogMult = keyframe.GetVar(TCVAR_FOG_HDR); // blend the final interior modifier into the passed in keyframe m_interiorBlendStrength = interiorStrength * (1.0f-exteriorStrength); finalInteriorModifier.Apply(keyframe, m_interiorBlendStrength); // Apply Box modifiers ApplyBoxModifiers(keyframe,m_interiorBlendStrength,true,isUnderWater); // recalc some data using the exterior settings #if TC_DEBUG if (m_gameDebug.GetDisableModifierFog()==false) #endif { m_interiorBlendStrength = exteriorFxStrength * (1.0f-exteriorStrength); // recalc the far clip and sky mult, if required if (m_interiorBlendStrength<0.99f && keyframe.GetVar(TCVAR_FAR_CLIP)0.01f) { float interiorFogDist = (pInteriorInst->GetBoundCentre()-RCC_MATRIX34(viewPort.GetCameraMtx()).d).Mag()+pInteriorInst->GetBoundRadius(); if (m_interiorBlendStrength<0.99f && roomIdx!=0) { ScalarV portalFogDist=ScalarV(V_ZERO); float portalFogStrength=0.0f; for (s32 i=0; i0.01f) { interiorFogDist = Min(interiorFogDist, portalFogDist.Getf()/portalFogStrength); } } float fogNum = (extNearFog.w*(interiorFogDist/extNearFogStart)); if (fogNum>INTERIOR_BLEND_FOG_MAX) { interiorFogFade += (INTERIOR_BLEND_FOG_MAX/fogNum) * m_interiorBlendStrength; } } keyframe.SetVar(TCVAR_FOG_START, extNearFogStart); keyframe.SetVar(TCVAR_FOG_NEAR_COL_A, extNearFog.w*interiorFogFade); keyframe.SetVar(TCVAR_FOG_NEAR_COL_R, extNearFog.x); keyframe.SetVar(TCVAR_FOG_NEAR_COL_G, extNearFog.y); keyframe.SetVar(TCVAR_FOG_NEAR_COL_B, extNearFog.z); } } if( m_interiorInitialised && m_interiorApply) { // Apply interior ambient light, always. m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R,m_interior_down_color_r); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G,m_interior_down_color_g); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B,m_interior_down_color_b); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY,m_interior_down_intensity); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R,m_interior_up_color_r); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G,m_interior_up_color_g); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B,m_interior_up_color_b); m_frameInfo.m_keyframe.SetVar(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY,m_interior_up_intensity); } // return the number of interior modifiers that were applied return true; } void CTimeCycle::ApplyLodScaleModifiers (WIN32PC_ONLY(tcKeyframeUncompressed& keyframe)) { #if RSG_PC // don't apply scale modifiers if there's a cutscene or SRL running CutSceneManager* csMgr = CutSceneManager::GetInstance(); if ( (csMgr && csMgr->IsCutscenePlayingBack()) || gStreamingRequestList.IsPlaybackActive()) { return; } if (CSettingsManager::GetInstance().GetSettings().m_graphics.m_LodScale < 1.0f) { const tcModifier* pLodScaler = FindModifier( atHashString("lodscaler", 0xd16586ab), "Lod Scale Modifier" ); if( pLodScaler ) { const float alpha = 1.0f - CSettingsManager::GetInstance().GetSettings().m_graphics.m_LodScale; pLodScaler->Apply(keyframe, alpha); } } if (CSettingsManager::GetInstance().GetSettings().m_graphics.m_MaxLodScale > 0.0f) { const tcModifier* pMaxLodScaler = FindModifier( atHashString("maxlodscaler", 0x65c477df), "Max Lod Scale Modifier" ); if( pMaxLodScaler ) { const float alpha = CSettingsManager::GetInstance().GetSettings().m_graphics.m_MaxLodScale; pMaxLodScaler->Apply(keyframe, alpha); } } #endif // RSG_PC } /////////////////////////////////////////////////////////////////////////////// // ApplyGlobalModifiers /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::ApplyGlobalModifiers (tcKeyframeUncompressed& keyframe, const bool finalUpdate REPLAY_ONLY(, const eTimeCyclePhase timeCyclePhase)) { tcAssert(CSystem::IsThisThreadId(SYS_THREAD_UPDATE)); #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisableGlobalModifiers()) { return; } #endif // initialise the data const tcModifier* modifier = NULL; float modStrength = 0.0f; CPed* playerPed = FindPlayerPed(); CPlayerSpecialAbility *specAbility = playerPed ? playerPed->GetSpecialAbility() : NULL; if (specAbility) { specAbility->ApplyFx(); } #if GTA_REPLAY atHashString modifierScriptHash = m_scriptModifierIndex != -1 ? GetModifierKey(m_scriptModifierIndex) : ""; atHashString modifierTransistionHash = m_transitionScriptModifierIndex != -1 ? GetModifierKey(m_transitionScriptModifierIndex) : ""; bool bShouldDoScriptEffect = true; if( timeCyclePhase == TIME_CYCLE_PHASE_REPLAY_FREECAM && ShouldDisableScripFxForFreeCam(modifierScriptHash.GetHash(), modifierTransistionHash.GetHash()) ) { bShouldDoScriptEffect = false; } else if( timeCyclePhase == TIME_CYCLE_PHASE_REPLAY_NORMAL && ShouldDisableScripFxForGameCam(modifierScriptHash.GetHash(), modifierTransistionHash.GetHash()) ) { bShouldDoScriptEffect = false; } //Only apply script post fx if the effect isn't disabled in this phase if( bShouldDoScriptEffect ) #endif { // script modifier if (m_transitionScriptModifierIndex>=0 ) { if( !fwTimer::IsGamePaused() ) m_transitionStrength += fwTimer::GetTimeStep() * m_transitionSpeed; if( m_transitionStrength >= m_scriptModifierStrength ) { // We're done. m_scriptModifierIndex = m_transitionScriptModifierIndex; m_transitionScriptModifierIndex = -1; modifier = GetModifier(m_scriptModifierIndex); modStrength = m_scriptModifierStrength; #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { grcDebugDraw::AddDebugOutput("Global Modifier: script - %s(%d) - %.3f",GetModifierName(m_scriptModifierIndex),FindModifierRecordIndex(m_scriptModifierIndex),modStrength); } #endif } else { if (m_scriptModifierIndex>=0) { // We're transitioning to another tc, so blend it in first. GetModifier(m_scriptModifierIndex)->Apply(keyframe, m_scriptModifierStrength - m_transitionStrength); } modifier = GetModifier(m_transitionScriptModifierIndex); modStrength = m_transitionStrength; #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { if( m_scriptModifierIndex > -1 && m_transitionScriptModifierIndex > -1 ) { grcDebugDraw::AddDebugOutput("Global Modifier: script - %s(%d) - %s(%d) - %.3f",GetModifierName(m_scriptModifierIndex),FindModifierRecordIndex(m_scriptModifierIndex),GetModifierName(m_transitionScriptModifierIndex),FindModifierRecordIndex(m_transitionScriptModifierIndex),modStrength); } else if( m_scriptModifierIndex > -1 ) { grcDebugDraw::AddDebugOutput("Global Modifier: script - %s(%d) - %s(%d) - %.3f",GetModifierName(m_scriptModifierIndex),FindModifierRecordIndex(m_scriptModifierIndex),"N/A",-1,modStrength); } else if( m_transitionScriptModifierIndex > -1 ) { grcDebugDraw::AddDebugOutput("Global Modifier: script - %s(%d) - %s(%d) - %.3f","N/A",-1,GetModifierName(m_transitionScriptModifierIndex),FindModifierRecordIndex(m_transitionScriptModifierIndex),modStrength); } } #endif } } else if (m_scriptModifierIndex>=0) { modifier = GetModifier(m_scriptModifierIndex); if( m_transitionOut ) { if( !fwTimer::IsGamePaused() ) m_transitionStrength -= fwTimer::GetTimeStep() * m_transitionSpeed; if( m_transitionStrength <= 0.0f ) { m_transitionOut = false; m_transitionStrength = 0.0f; m_scriptModifierIndex = -1; } modStrength = m_transitionStrength; } else { modStrength = m_scriptModifierStrength; } #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo() && m_scriptModifierIndex != -1) { grcDebugDraw::AddDebugOutput("Global Modifier: script - %s(%d) - %.3f",GetModifierName(m_scriptModifierIndex),FindModifierRecordIndex(m_scriptModifierIndex),modStrength); } #endif } else if(m_playerModifierIndexCurrent>=0) { if(m_playerModifierStrength >= 1.0f) { m_playerModifierIndexCurrent = m_playerModifierIndexNext; m_playerModifierStrength = 1.0f; if( m_playerModifierIndexCurrent>=0) // it has changed, so need a retest. modifier = GetModifier(m_playerModifierIndexCurrent); modStrength = m_playerModifierStrength; } else if( m_playerModifierStrength == 0.0f ) { modifier = GetModifier(m_playerModifierIndexCurrent); modStrength = 1.0f; } else { GetModifier(m_playerModifierIndexCurrent)->Apply(keyframe, 1.0f - m_playerModifierStrength); if(m_playerModifierIndexNext>=0) { modifier = GetModifier(m_playerModifierIndexNext); modStrength = m_playerModifierStrength; } } #if TC_DEBUG if (g_timeCycle.GetGameDebug().GetDisplayModifierInfo()) { if (m_playerModifierIndexCurrent > -1 && m_playerModifierIndexNext > -1) grcDebugDraw::AddDebugOutput("Global Modifier: player transition - %s(%d) - %s(%d) %.3f",GetModifierName(m_playerModifierIndexCurrent),FindModifierRecordIndex(m_playerModifierIndexCurrent), GetModifierName(m_playerModifierIndexNext), FindModifierRecordIndex(m_playerModifierIndexNext), m_playerModifierStrength); else if (m_playerModifierIndexCurrent > -1) grcDebugDraw::AddDebugOutput("Global Modifier: player transition - %s(%d) - %s(%d) %.3f",GetModifierName(m_playerModifierIndexCurrent),FindModifierRecordIndex(m_playerModifierIndexCurrent), "N/A", -1, m_playerModifierStrength); else if (m_playerModifierIndexNext > -1) grcDebugDraw::AddDebugOutput("Global Modifier: player transition - %s(%d) - %s(%d) %.3f","N/A", -1, GetModifierName(m_playerModifierIndexNext), FindModifierRecordIndex(m_playerModifierIndexNext), m_playerModifierStrength); } #endif } // apply any modifier if (modifier) { tcAssertf((modStrength >= 0.0f) && (modStrength <= 1.0f), "Applying %s with an outof bound strength of %f",GetModifierName(GetModifierIndex((tcModifier*)modifier)),modStrength); modifier->Apply(keyframe, modStrength); } } #if (RSG_PC || RSG_DURANGO || RSG_ORBIS) bool bFirstPerson = camInterface::IsRenderingFirstPersonShooterCamera(); if(!bFirstPerson) { // First person vehicle cam? const camBaseCamera* pDominantRenderedCamera = camInterface::GetDominantRenderedCamera(); if(pDominantRenderedCamera && pDominantRenderedCamera->GetIsClassId(camCinematicMountedCamera::GetStaticClassId())) { const camCinematicMountedCamera* pMountedCamera = static_cast(pDominantRenderedCamera); bFirstPerson = pMountedCamera->IsFirstPersonCamera(); } } if( bFirstPerson ) { const tcModifier* pNextGenModifier = FindModifier( atHashString("NG_first",0x3cbf7ebf), "NG_first" ); if (pNextGenModifier) { pNextGenModifier->Apply( keyframe, m_vsNextGenModifer ); } } else { const tcModifier* pNextGenModifier = FindModifier( atHashString("nextgen",0x254E1B2C), "NextGen" ); if (pNextGenModifier) { pNextGenModifier->Apply( keyframe, m_vsNextGenModifer ); } } ////////////////////////////////////////////////////////////////////////// // inside submarine CVehicle * vehicle = CGameWorld::FindLocalPlayerVehicle(); bool bPlayeIsLeavingVehicle = CGameWorld::FindLocalPlayer() && CGameWorld::FindLocalPlayer()->GetPedResetFlag(CPED_RESET_FLAG_IsExitingVehicle); if(bFirstPerson && vehicle && vehicle->InheritsFromSubmarine() && bPlayeIsLeavingVehicle == false) { const tcModifier* subModifier = FindModifier( atHashString("vehicle_subint",0xa675f3bf), "vehicle_subint" ); if(subModifier) { subModifier->Apply(keyframe, 1.0f); } } #endif ////////////////////////////////////////////////////////////////////////// // first person eyewear mod #if FPS_MODE_SUPPORTED if (CPedVariationStream::HasFirstPersonTimeCycleModifier()) { const tcModifier* pModifier = FindModifier(CPedVariationStream::GetFirstPersonTimeCycleModifierName(), "FirstPersonEyewear"); if (pModifier) { pModifier->Apply( keyframe, CPedVariationStream::GetFirstPersonTimeCycleModifierIntensity() ); } } #endif // FPS_MODE_SUPPORTED ////////////////////////////////////////////////////////////////////////// // sniper sight REPLAY_ONLY( if( timeCyclePhase != TIME_CYCLE_PHASE_REPLAY_FREECAM ) ) { if (CNewHud::IsSniperSightActive()) { const tcModifier* pSniperSightModifier = FindModifier( atHashString("sniper",0x94638209), "SniperSight" ); if (pSniperSightModifier) { pSniperSightModifier->Apply( keyframe, PostFX::GetSniperScopeOverrideStrength() ); } } else if (CVfxHelper::IsPlayerInAccurateModeWithScope()) { const tcModifier* pScopeZoomInModifier = FindModifier( atHashString("scope_zoom_in",0x3B8158DA), "ScopeZoomIn" ); if (pScopeZoomInModifier) { pScopeZoomInModifier->Apply( keyframe, 1.0f ); } } } REPLAY_ONLY( if( timeCyclePhase != TIME_CYCLE_PHASE_REPLAY_FREECAM ) ) { #if __BANK if (PostFX::GetGlobalUseNightVision() != PostFX::GetGlobalOverrideNightVision()) #else if (PostFX::GetGlobalUseNightVision()) #endif { const tcModifier* pNVModifier = FindModifier( atHashString("v_dark",0x50E7A950), "v_dark" ); if (pNVModifier) { pNVModifier->Apply( keyframe, 1.0f ); } } } ////////////////////////////////////////////////////////////////////////// // inside vehicle mode if (CVehicle::IsInsideSpecificVehicleModeEnabled(MI_PLANE_CARGOPLANE.GetName().GetHash()) && finalUpdate) { const tcModifier* pInsidePlaneModifier = FindModifier( atHashString("plane_inside_mode", 0x2c70810f), "Inside Plane Mode" ); if (pInsidePlaneModifier) { pInsidePlaneModifier->Apply( keyframe, 1.0f); } } ////////////////////////////////////////////////////////////////////////// // default flash effect triggered by camera code const float fDefaultFlashEffectLevel = PostFX::GetFlashEffectFadeLevel(); if (fDefaultFlashEffectLevel != 0.0f) { atHashString flashEffectModName = PostFX::GetFlashEffectModName(); const tcModifier* pFlashEffectModifier = FindModifier( flashEffectModName, "DefaultFlash" ); if (pFlashEffectModifier) { pFlashEffectModifier->Apply( keyframe, fDefaultFlashEffectLevel ); } } ////////////////////////////////////////////////////////////////////////// // pause menu modifiers REPLAY_ONLY( if( timeCyclePhase == TIME_CYCLE_PHASE_GAME ) ) { PAUSEMENUPOSTFXMGR.ApplyModifiers(keyframe); } ////////////////////////////////////////////////////////////////////////// // ANIMPOSTFXMGR.ApplyModifiers(keyframe REPLAY_ONLY(, timeCyclePhase )); ////////////////////////////////////////////////////////////////////////// // bonus modifiers: overrides all the things. if( m_extraModifierIndex != -1 ) { const tcModifier* extraModifier = GetModifier(m_extraModifierIndex); extraModifier->Apply( keyframe, 1.0f); #if __BANK grcDebugDraw::AddDebugOutput("Extra Modifier: %s(%d) %.3f",GetModifierName(m_extraModifierIndex),FindModifierRecordIndex(m_extraModifierIndex), 1.0f); #endif } } #if GTA_REPLAY // There are some TC vars we don't want to interpolate, just have them as constant values. static void PatchReplayFilterConstantTCVars(const tcModifier* pModifier, tcKeyframeUncompressed& keyframe, float intensity) { if (pModifier == NULL || intensity < SMALL_FLOAT) return; for (int j = 0; j < pModifier->GetModDataCount(); j++) { const int varId = pModifier->GetModDataArray()[j].varId; const float valA = (pModifier->GetModDataArray()[j].valA); if (varId == TCVAR_POSTFX_SCANLINE_FREQUENCY_0) { keyframe.SetVar(TCVAR_POSTFX_SCANLINE_FREQUENCY_0, valA); } else if (varId == TCVAR_POSTFX_SCANLINE_FREQUENCY_1) { keyframe.SetVar(TCVAR_POSTFX_SCANLINE_FREQUENCY_1, valA); } else if (varId == TCVAR_POSTFX_SCANLINE_SPEED) { keyframe.SetVar(TCVAR_POSTFX_SCANLINE_SPEED, valA); } else if (varId == TCVAR_POSTFX_NOISE_SIZE) { keyframe.SetVar(TCVAR_POSTFX_NOISE_SIZE, valA); } } } void CTimeCycle::ApplyReplayEditorModifiers(tcKeyframeUncompressed& keyframe) { ////////////////////////////////////////////////////////////////////////// // Replay modifiers: overrides all the things, should appear last if (m_ReplayModifierHash > 0) { s32 replayModId = FindModifierIndex(m_ReplayModifierHash,"ReplayModifierHash"); tcAssertf( replayModId >= 0 && replayModId < m_modifiersArray.GetCount(), "CTimeCycle::CalcAmbientScale - Unknown modifier %u", m_ReplayModifierHash ); const tcModifier* pModifier = GetModifier(replayModId); pModifier->Apply( keyframe, m_ReplayModifierIntensity); PatchReplayFilterConstantTCVars(pModifier, keyframe, m_ReplayModifierIntensity); #if __BANK grcDebugDraw::AddDebugOutput("Replay Modifier: %s(%d) %.3f",GetModifierName(replayModId),FindModifierRecordIndex(replayModId), 1.0f); #endif } } #endif //GTA_REPLAY #if GTA_REPLAY void CTimeCycle::ApplyModifierWithNegativeRange(tcKeyframeUncompressed& keyframe, const tcModifier *negMod, const tcModifier *posMod, float alpha, bool linearize) { float rawValue = alpha; float value = linearize ? sqrtf(abs(rawValue)) : abs(rawValue); if( rawValue < 0.0f ) { negMod->Apply(keyframe, value); } else if( rawValue > 0.0f ) { posMod->Apply(keyframe, value); } } void CTimeCycle::ApplyReplayExtraEffects(tcKeyframeUncompressed& keyframe) { const tcModifier* pReplaySaturationModNeg = FindModifier( atHashString("rply_saturation_neg", 0x53e8448c), "Replay Extra Effects" ); const tcModifier* pReplaySaturationModPos = FindModifier( atHashString("rply_saturation", 0x85bf028a), "Replay Extra Effects" ); const tcModifier* pReplayContrastModNeg = FindModifier( atHashString("rply_contrast_neg", 0xddd00563), "Replay Extra Effects" ); const tcModifier* pReplayContrastModPos = FindModifier( atHashString("rply_contrast", 0xaffd7204), "Replay Extra Effects" ); const tcModifier* pReplayVignetteModNeg = FindModifier( atHashString("rply_vignette_neg", 0x8813365e), "Replay Extra Effects" ); const tcModifier* pReplayVignetteModPos = FindModifier( atHashString("rply_vignette", 0x4f6992f5), "Replay Extra Effects" ); const tcModifier* pReplayBrightnessModNeg = FindModifier( atHashString("rply_brightness_neg", 0x33ede908), "Replay Extra Effects" ); const tcModifier* pReplayBrightnessModPos = FindModifier( atHashString("rply_brightness", 0x4685f55f), "Replay Extra Effects" ); if (pReplaySaturationModNeg && pReplaySaturationModPos) { ApplyModifierWithNegativeRange(keyframe, pReplaySaturationModNeg, pReplaySaturationModPos, GetReplaySaturationIntensity(), false); } if (pReplayContrastModNeg && pReplayContrastModPos) { ApplyModifierWithNegativeRange(keyframe, pReplayContrastModNeg, pReplayContrastModPos, GetReplayContrastIntensity(), true); } if (pReplayVignetteModNeg && pReplayVignetteModPos) { ApplyModifierWithNegativeRange(keyframe, pReplayVignetteModNeg, pReplayVignetteModPos, GetReplayVignetteIntensity(), false); } if( pReplayBrightnessModNeg && pReplayBrightnessModPos ) { float brightness = GetReplayBrightnessIntensity(); static float prevBrightness = 0.0f; bool valueChanged = prevBrightness != brightness; prevBrightness = brightness; ApplyModifierWithNegativeRange(keyframe, pReplayBrightnessModNeg, pReplayBrightnessModPos, brightness, true); if( valueChanged ) { PostFX::ResetAdaptedLuminance(); } } } #endif //GTA_REPLAY /////////////////////////////////////////////////////////////////////////////// // CalcDirectionalLightandPos /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::CalcDirectionalLightandPos (Vec3V_InOut vDirectionalDir, float &directionalInten, Vec3V_InOut vSunDir, Vec3V_InOut vMoonDir, float hours, float sunSlope, float moonSlope, float sunYaw, float &sunFade, float &moonFade) { // scale angle so that sun rises at 06:00 and sets at 20:00 float angle; if (hours < SUN_RISE_TIME) { // blend between 0.0 and 0.5*PI angle = 0.5f*PI * (hours/SUN_RISE_TIME); } else if (hours < SUN_SET_TIME) { // blend between 0.5*PI and 1.5*PI float timeSinceSunRise = hours-SUN_RISE_TIME; angle = (0.5f*PI) + (PI*(timeSinceSunRise/SUN_RISE_TO_SET_TIME)); } else { // blend between 1.5*PI and 2.0*PI float timeSinceSunSet = hours-SUN_SET_TIME; angle = (1.5f*PI) + (0.5f*PI * (timeSinceSunSet/SUN_SET_TO_MIDNIGHT_TIME)); } const double cycleTime = m_frameInfo.m_cycleTime; const tcKeyframeUncompressed &keyframe = m_frameInfo.m_keyframe; const float lightDirOverride = keyframe.GetVar(TCVAR_LIGHT_DIRECTION_OVERRIDE); const float sunPosOverride = keyframe.GetVar(TCVAR_LIGHT_DIRECTION_OVERRIDE_OVERRIDES_SUN); // Calculate slopes const Vec3V vSunSlopVec(0.0f, rage::Cosf(sunSlope), rage::Sinf(sunSlope)); const Vec3V vMoonSlopVec(0.0f, rage::Cosf(moonSlope), rage::Sinf(moonSlope)); // Adjust moon angle so that it rotates faster than the sun float moonAngle = angle + PI * float((fmod(cycleTime, 55.0) - 27.0) / 27.0); const Vec3V vMoonAxisAdjust = Vec3V(V_X_AXIS_WZERO); // Main axis Vec3V vActualMoonDir = (vMoonSlopVec * ScalarVFromF32(-rage::Cosf(moonAngle))) + (vMoonAxisAdjust * ScalarVFromF32( rage::Sinf(moonAngle))); // Extra adjust for moon const float moonCyclePos = (float)fmod(cycleTime, 27.0); const float adjustAmount = m_frameInfo.m_moonWobbleOffset + rage::Sinf(moonCyclePos * 2.0f * PI * m_frameInfo.m_moonWobbleFrequency) * m_frameInfo.m_moonWobbleAmplitude; const Vec3V testAxis = Cross(vMoonAxisAdjust, vMoonSlopVec); vActualMoonDir += (testAxis * ScalarVFromF32(adjustAmount)); vActualMoonDir = Normalize(vActualMoonDir); const Vec3V vOverMoonDir(keyframe.GetVar(TCVAR_MOON_DIRECTION_X), keyframe.GetVar(TCVAR_MOON_DIRECTION_Y), keyframe.GetVar(TCVAR_MOON_DIRECTION_Z)); // Adjust for yaw for sun const float cosYaw = rage::Cosf(sunYaw); const float sinYaw = rage::Sinf(sunYaw); vSunDir = (vSunSlopVec * ScalarVFromF32(-rage::Cosf(angle))) + Vec3V(V_X_AXIS_WZERO) * ScalarVFromF32(rage::Sinf(angle)), vSunDir = Normalize(vSunDir); Vec3V vActualSunDir = vSunDir * Vec3V(cosYaw, cosYaw, 1.0f); vActualSunDir += Vec3V(vSunDir.GetY(), vSunDir.GetX(), ScalarV(V_ZERO)) * Vec3V(-sinYaw, sinYaw, 0.0f); const Vec3V vOverSunDir(keyframe.GetVar(TCVAR_SUN_DIRECTION_X), keyframe.GetVar(TCVAR_SUN_DIRECTION_Y), keyframe.GetVar(TCVAR_SUN_DIRECTION_Z)); // Set directional light (moon or sun) and intensity directionalInten = 1.0f; sunFade = 1.0f; moonFade = 0.0f; if (hours > SUN_SET_TIME) { sunFade = 1.0f - Saturate((hours - SUN_MOON_TIME) * 4.0f); moonFade = Saturate((hours - SUN_MOON_TIME - 0.25f) * 4.0f); } else if (hours < SUN_RISE_TIME) { sunFade = Saturate((hours - MOON_SUN_TIME - 0.25f) * 4.0f); moonFade = 1.0f - Saturate((hours - MOON_SUN_TIME) * 4.0f); } moonFade *= Saturate(vMoonDir.GetZf() / 0.1f); if (Water::IsCameraUnderwater()) { // override when underwater - blend towards the underwater light direction float underwaterDepth = Water::GetWaterLevel() - camInterface::GetPos().z; float start = Water::GetMainWaterTunings().m_GodRaysLerpStart; float end = Water::GetMainWaterTunings().m_GodRaysLerpEnd; if (underwaterDepth > start) { float underWaterRatio = CVfxHelper::GetInterpValue(underwaterDepth, start, end); vActualMoonDir = vActualMoonDir + ScalarVFromF32(underWaterRatio) * (SUN_LIGHT_UNDERWATER - vActualMoonDir); vActualMoonDir = Normalize(vActualMoonDir); vActualSunDir = vActualSunDir + ScalarVFromF32(underWaterRatio) * (SUN_LIGHT_UNDERWATER - vActualSunDir); vActualSunDir = Normalize(vActualSunDir); } } float totalFade = 0.0f; // Blend sun and moon direction totalFade = (sunFade * 100.0f) + moonFade; vMoonDir = Normalize(Lerp(ScalarVFromF32(lightDirOverride * sunPosOverride), vActualMoonDir, vOverMoonDir)); vSunDir = Normalize(Lerp(ScalarVFromF32(lightDirOverride * sunPosOverride), vActualSunDir, vOverSunDir)); // Keep numbers stable if ( totalFade > FLT_EPSILON ) { ScalarV scSunFade = ScalarVFromF32(sunFade * 100.0f / totalFade); ScalarV scMoonFade = ScalarVFromF32(moonFade / totalFade); Vec3V vActualDirectionalDir = vActualSunDir * scSunFade + vActualMoonDir * scMoonFade; Vec3V vOverDirectionalDir = vOverSunDir * scSunFade + vOverMoonDir * scMoonFade; vDirectionalDir = Lerp(ScalarVFromF32(lightDirOverride), vActualDirectionalDir, vOverDirectionalDir); vDirectionalDir = Normalize(vDirectionalDir); } else { // Zero the vector, it'll get tweaked below vDirectionalDir.ZeroComponents(); } // Set intensity- directionalInten = Max(sunFade, moonFade); // Moon adjust based on phase float normalisedLunearCycle = moonCyclePos / 26.0f; float cycleOverride = m_frameInfo.m_moonCycleOverride; if (cycleOverride >= 0.0f) { normalisedLunearCycle = cycleOverride; } float dimAmount = (abs(normalisedLunearCycle - 0.5f) * 2.0f) * moonFade; directionalInten = Lerp(dimAmount, directionalInten, directionalInten * m_vsMoonDimMult); // clamp to prevent big shadows float directionClamp = m_longShadowsEnabled ? 0.4f : 0.33f; vDirectionalDir.SetZf(Max(directionClamp, vDirectionalDir.GetZf()));// clamp to around 5pm time vDirectionalDir = Normalize(vDirectionalDir); // apply shadow freezing rdr2 tech const camBaseCamera* activeCamera = camInterface::GetDominantRenderedCamera(); if (activeCamera) { const grcViewport *viewport = gVpMan.GetUpdateGameGrcViewport(); Vec3V camPos = viewport->GetCameraMtx().d(); Vector3 playerPos = CGameWorld::FindLocalPlayerCoors(); float heading= activeCamera->GetFrame().ComputeHeading(); bool cameraCut=((camInterface::GetFrame().GetFlags() & (camFrame::Flag_HasCutPosition | camFrame::Flag_HasCutOrientation)) > 0); bool playerActive = activeCamera->GetAttachParent() != NULL; bool cutScenePlaying = camInterface::GetCutsceneDirector().IsCutScenePlaying() BANK_ONLY( && !CutSceneManager::GetInstance()->IsPaused() ); if (!cutScenePlaying) { if ( camInterface::GetScriptDirector().IsRendering() ) cutScenePlaying = true; } bool isCutscene = cutScenePlaying || (CTheScripts::GetNumberOfMiniGamesInProgress() >0); isCutscene = isCutscene || CPauseMenu::IsActive( PM_EssentialAssets );// so shadows don't move in pause menu cameraCut = cameraCut || (lightDirOverride > 0.0f); // disable shadow freezor if light override is active. Vec3V frozenDir = ShadowFreezer.Update( VEC3V_TO_VECTOR3(vDirectionalDir), VEC3V_TO_VECTOR3(camPos), cameraCut, heading, playerPos, playerActive, isCutscene ); vDirectionalDir = Lerp(ScalarVFromF32(lightDirOverride), frozenDir, vDirectionalDir); } #if PLAYERSWITCH_FORCES_LIGHTDIR // Apply code dir light override; vDirectionalDir = Normalize(Lerp(ScalarVFromF32(m_codeOverrideDirLightOrientationStrength), vDirectionalDir, m_codeOverrideDirLightOrientation)); #endif // PLAYERSWITCH_FORCES_LIGHTDIR } /////////////////////////////////////////////////////////////////////////////// // CalcSunLightDir /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::CalcSunLightDir () { #if TC_DEBUG if( m_gameDebug.GetRenderSunPosition() || m_gameDebug.GetDumpSunMoonPosition()) { Vector3 playerPos = CGameWorld::FindLocalPlayerCoors(); Vec3V vPlayerPos = RCC_VEC3V(playerPos); int mult = m_gameDebug.GetHourDivider(); if ((m_gameDebug.GetDumpSunMoonPosition())) { Displayf("Hour (h/24.0) : Sun Dir X : Sun Dir Y : Sun Dir Z : Intensity Mult"); } for(int i=0;i<24*mult;i++) { Vec3V vSunLightDir; Vec3V vSunSpritePos; Vec3V vMoonSpritePos; const int minutes = i % mult; const float hours = ((i - minutes) / mult) + (minutes / float(mult)); const float sunSlope = m_frameInfo.m_sunRollAngle; const float moonSlope = m_frameInfo.m_sunRollAngle + m_frameInfo.m_moonRollOffset; const float sunYaw = m_frameInfo.m_sunYawAngle; float inten; float sunFade , moonFade; CalcDirectionalLightandPos( vSunLightDir, inten, vSunSpritePos, vMoonSpritePos, hours, sunSlope, moonSlope, sunYaw, sunFade, moonFade); if (m_gameDebug.GetRenderSunPosition()) { // blend in the moon light Vec3V vStartPos, vEndPos; vStartPos = vPlayerPos; vEndPos = vPlayerPos+vMoonSpritePos * ScalarVFromF32(20.0f); grcDebugDraw::Line(RCC_VECTOR3(vStartPos), RCC_VECTOR3(vEndPos), Color32(0x00,0x00,0x00), Color32(0x00,0xff,0xff)); vStartPos = vPlayerPos; vEndPos = vPlayerPos+vSunSpritePos * ScalarVFromF32(20.0f); grcDebugDraw::Line(RCC_VECTOR3(vStartPos), RCC_VECTOR3(vEndPos), Color32(0x00,0x00,0x00), Color32(0xff,0xff,0x00)); } if (m_gameDebug.GetDumpSunMoonPosition()) { Displayf("%.6f : %.6f : %.6f : %.6f : %.6f", hours, vSunLightDir.GetXf(), vSunLightDir.GetYf(), vSunLightDir.GetZf(), inten ); } } if (m_gameDebug.GetDumpSunMoonPosition()) { m_gameDebug.SetDumpSunMoonPosition(false); } } #endif // __BANK // get the time to use Time timeCycleTime(CClock::GetHour(), CClock::GetMinute(), CClock::GetSecond()); #if TC_DEBUG if (m_debug.GetKeyframeEditActive() && m_debug.GetKeyframeEditOverrideLightDirection()) { const TimeSample_s& timeSample = CClock::GetTimeSampleInfo(m_debug.GetKeyframeEditTimeSampleIndex()); timeCycleTime.Set(timeSample.hour, 0, 0); } #endif if (CClock::GetMode()==CLOCK_MODE_FIXED) { // in fixed mode we may want to offset the time a little so that the sun position can change timeCycleTime.Add(0, static_cast(m_frameInfo.m_keyframe.GetVar(TCVAR_TIME_OFFSET)), 0); } // scale angle so that sun rises at 06:00 and sets at 20:00 const float hours = CClock::GetDayRatio(timeCycleTime) * 24.0f; const float sunSlope = m_frameInfo.m_sunRollAngle; const float moonSlope = m_frameInfo.m_sunRollAngle + m_frameInfo.m_moonRollOffset; const float sunYaw = m_frameInfo.m_sunYawAngle; CalcDirectionalLightandPos(m_frameInfo.m_vDirectionalLightDir, m_frameInfo.m_directionalLightIntensity, m_frameInfo.m_vSunSpriteDir, m_frameInfo.m_vMoonSpriteDir, hours, sunSlope, moonSlope, sunYaw, m_frameInfo.m_sunFade, m_frameInfo.m_moonFade); } /////////////////////////////////////////////////////////////////////////////// // CalcModifierAmbientScale /////////////////////////////////////////////////////////////////////////////// bool CTimeCycle::CalcModifierAmbientScale(const int timeCycleIndex, const int secondaryTimeCycleIndex, float blend, float &natAmbientScale, float &artAmbientScale ASSERT_ONLY(, const atHashString /*timeCycleName*/, const atHashString secondaryTimeCycleName)) { const tcModifier *pMod = GetModifier(timeCycleIndex); const tcModifier *pModSecondary = NULL; if( secondaryTimeCycleIndex >=0 ) { pModSecondary = GetModifier(secondaryTimeCycleIndex); } #if __ASSERT // commented out due to false positives with TC mods added by script with ADD_TCMODIFIER_OVERRIDE(); // see: B*3666677 - Error: pMod == FindModifier(timeCycleName,"AmbScale"): was looking for modifier mp_gr_int01_black, found mp_gr_int01_black //Assertf(pMod == FindModifier(timeCycleName,"AmbScale"),"was looking for modifier %s, found %s (%p,%d)",timeCycleName.GetCStr(),GetModifierName(timeCycleIndex),pMod,timeCycleIndex); Assert(pModSecondary == NULL || pModSecondary == FindModifier(secondaryTimeCycleName,"AmbScale")); #endif bool validNatAmb = true; bool validArtAmb = true; Vec2V vModifierAmbientScale = GetModifierAmbientScale(pMod,validNatAmb,validArtAmb); float natAmbient = vModifierAmbientScale.GetXf(); float artAmbient = vModifierAmbientScale.GetYf(); if( pModSecondary ) { bool secValidNatAmb = true; bool secValidArtAmb = true; Vec2V vSecondaryAmbientScale = GetModifierAmbientScale(pModSecondary,secValidNatAmb,secValidArtAmb); if( secValidNatAmb ) { natAmbient = vSecondaryAmbientScale.GetXf(); validNatAmb = secValidNatAmb; } if( secValidArtAmb ) { artAmbient = vSecondaryAmbientScale.GetYf(); validArtAmb = secValidArtAmb; } } if( validNatAmb ) { natAmbientScale=(1.0f-blend)+natAmbient*blend; } if( validArtAmb ) { artAmbientScale=(1.0f-blend)+artAmbient*blend; } return pMod->GetUserFlag(tcflag_expandAmbientLightBox) || (pModSecondary && pModSecondary->GetUserFlag(tcflag_expandAmbientLightBox)); } Vec2V_Out CTimeCycle::GetModifierAmbientScale(const tcModifier *mod, bool &validNat, bool &validArt) { Vec2V result; mod->CreateAndLockVarMap(); // Natural Ambient float natAmb; const tcModData* natAmbModData = mod->GetModDataUnsafe(TCVAR_NATURAL_AMBIENT_MULTIPLIER); validNat = (natAmbModData != NULL); if( natAmbModData ) { natAmb = natAmbModData->valA; } // Artificial Ambient float artAmb; const tcModData* artAmbModData = mod->GetModDataUnsafe(TCVAR_ARTIFICIAL_INT_AMBIENT_MULTIPLIER); validArt = (artAmbModData != NULL); if( artAmbModData ) { artAmb = artAmbModData->valA; } result = Vec2V(natAmb,artAmb); mod->UnlockVarMap(); return result; } Vec2V_Out CTimeCycle::GetModifierAmbientScaleWithDefault (const tcModifier *mod) { bool validNat = false; bool validArt = false; Vec2V result = GetModifierAmbientScale(mod, validNat, validArt); if( validNat == false ) { result.SetXf(m_frameInfo.m_keyframe.GetVar(TCVAR_NATURAL_AMBIENT_MULTIPLIER)); } if( validArt == false ) { result.SetYf(m_frameInfo.m_keyframe.GetVar(TCVAR_ARTIFICIAL_INT_AMBIENT_MULTIPLIER)); } return result; } void CTimeCycle::SetInteriorCache(int mainTcIdx, int secondaryTcIdx) { const tcModifier* currModifier = GetModifier(mainTcIdx); currModifier->CreateAndLockVarMap(); float int_down_col_r = 0.0f; float int_down_col_g = 0.0f; float int_down_col_b = 0.0f; float int_down_intensity = 0.0f; float int_up_col_r = 0.0f; float int_up_col_g = 0.0f; float int_up_col_b = 0.0f; float int_up_intensity = 0.0f; int_down_col_r = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R); int_down_col_g = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G); int_down_col_b = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B); int_down_intensity = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY); int_up_col_r = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R); int_up_col_g = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G); int_up_col_b = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B); int_up_intensity = currModifier->GetModDataValAUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY); currModifier->UnlockVarMap(); if(secondaryTcIdx > -1) { const tcModifier* secondaryModifier = GetModifier(secondaryTcIdx); secondaryModifier->CreateAndLockVarMap(); const tcModData* pModData; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_R); if( pModData ) int_down_col_r = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_G); if( pModData ) int_down_col_g = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_COL_B); if( pModData ) int_down_col_b = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_DOWN_INTENSITY); if( pModData ) int_down_intensity = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_R); if( pModData ) int_up_col_r = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_G); if( pModData ) int_up_col_g = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_COL_B); if( pModData ) int_up_col_b = pModData->valA; pModData = secondaryModifier->GetModDataUnsafe(TCVAR_LIGHT_ARTIFICIAL_INT_AMB_BASE_INTENSITY); if( pModData ) int_up_intensity = pModData->valA; secondaryModifier->UnlockVarMap(); } m_interiorInitialised = true; m_interior_down_color_r = int_down_col_r; m_interior_down_color_g = int_down_col_g; m_interior_down_color_b = int_down_col_b; m_interior_down_intensity = int_down_intensity; m_interior_up_color_r = int_up_col_r; m_interior_up_color_g = int_up_col_g; m_interior_up_color_b = int_up_col_b; m_interior_up_intensity = int_up_intensity; m_interior_main_idx = mainTcIdx; m_interior_secondary_idx = secondaryTcIdx; } void CTimeCycle::AddLocalPortal(const fwPortalCorners &corners, float area, float doorOcclusion, int mainModifierIdx, int secondaryModifierIdx) { for(int i=0;iGetUserFlag(tcflag_expandAmbientLightBox)); #endif return; } } } portalData *portal = NULL; if( !m_frameInfo.m_LocalPortalCache.IsFull() ) { portalData &newP = m_frameInfo.m_LocalPortalCache.Append(); portal = &newP; } else { // We're full, let's find another one. for(int i=0;iSetCorners(corners); portal->SetScreenArea(area); portal->SetDoorOcclusion(doorOcclusion); portal->SetMainModifierIdx(mainModifierIdx); portal->SetSecondaryModifierIdx(secondaryModifierIdx); portal->SetInUse(true); portal->SetExpandBox(currModifier->GetUserFlag(tcflag_expandAmbientLightBox)); } } void CTimeCycle::PreSetInteriorAmbientCache(const atHashString name) { int modIdx = FindModifierIndex(name,"PreSetInteriorAmbientCache"); if( modIdx > -1 ) { m_interiorApply = true; SetInteriorCache(modIdx,-1); } } /////////////////////////////////////////////////////////////////////////////// // SetTransitionToScriptModifierId /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::PushScriptModifier() { tcAssertf(m_pushedScriptModifier == false,"trying to push a script modifier state while another has already been pushed"); m_pushedScriptModifierIndex = m_scriptModifierIndex; m_pushedTransitionScriptModifierIndex = m_transitionScriptModifierIndex; m_pushedTransitionStrength = m_transitionStrength; m_pushedTransitionSpeed = m_transitionSpeed; m_pushedTransitionOut = m_transitionOut; m_pushedScriptModifier = true; } void CTimeCycle::ClearPushedScriptModifier() { m_pushedScriptModifierIndex = -1; m_pushedTransitionScriptModifierIndex = -1; m_pushedTransitionStrength = 1.0f; m_pushedTransitionSpeed = 0.0f; m_pushedTransitionOut = false; } /////////////////////////////////////////////////////////////////////////////// // SetTransitionToScriptModifierId /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::PopScriptModifier() { tcAssertf(m_pushedScriptModifier == true,"trying to pop a script modifier state while none has been pushed"); m_scriptModifierIndex = m_pushedScriptModifierIndex; m_transitionScriptModifierIndex = m_pushedTransitionScriptModifierIndex; m_transitionStrength = m_pushedTransitionStrength; m_transitionSpeed = m_pushedTransitionSpeed; m_transitionOut = m_pushedTransitionOut; m_pushedScriptModifier = false; } /////////////////////////////////////////////////////////////////////////////// // SetTransitionToScriptModifierId /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::SetTransitionToScriptModifierId(const atHashString name, float time) { tcAssertf(m_transitionOut == false,"trying to transition to a script modifier while transitioning out"); m_transitionScriptModifierIndex = FindModifierIndex(name,"SetTransitionToScriptModifierId"); m_transitionStrength = 0.0f; m_transitionSpeed = m_scriptModifierStrength / time; } /////////////////////////////////////////////////////////////////////////////// // SetTransitionToScriptModifierId /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::SetTransitionToScriptModifierId(int index, float time) { tcAssertf(m_transitionOut == false,"trying to transition to a script modifier while transitioning out"); m_transitionScriptModifierIndex = index; m_transitionStrength = 0.0f; m_transitionSpeed = m_scriptModifierStrength / time; } /////////////////////////////////////////////////////////////////////////////// // SetTransitionOutOfScriptModifierId /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::SetTransitionOutOfScriptModifierId(float time) { tcAssertf(m_scriptModifierIndex >= 0,"trying to transition out of a script modifier while none is set"); m_transitionOut = true; m_transitionStrength = m_scriptModifierStrength; m_transitionSpeed = m_scriptModifierStrength / time; } /////////////////////////////////////////////////////////////////////////////// // CalcAmbientScale /////////////////////////////////////////////////////////////////////////////// Vec2V_Out CTimeCycle::CalcAmbientScale (Vec3V_In vPos, fwInteriorLocation intLoc) { #if NAVMESH_EXPORT if(CNavMeshDataExporter::IsExportingCollision()) { return Vec2V(V_ONE); } #endif // if we're using a cutscene modifier then return its ambient scale if (m_cutsceneModifierIndex != -1) { const tcModifier *mod = GetModifier(m_cutsceneModifierIndex); Vec2V result = GetModifierAmbientScaleWithDefault(mod); if( CRenderer::GetDisableArtificialLights() ) { result.SetYf(CShaderLib::GetOverridesArtAmbScale()); } return result; } // initialise the ambient scale float naturalAmbientScale = 1.0f; float artificialAmbientScale = 0.0f; // query the modifier box tree to get a list of boxes that we are potentially inside bool inInterior = intLoc.IsValid(); bool isUnderWater = Water::IsCameraUnderwater(); int numBoxes = 0; int boxIndices[TIMECYCLE_MAX_MODIFIER_BOX_QUERY]; const int hours = CClock::GetHour(); const int minutes = CClock::GetMinute(); const int seconds = CClock::GetSecond(); // if room idx is invalid then it's most likely attached to a portal on the outside of the building #if TC_DEBUG if( !m_gameDebug.GetDisableBoxModifierAmbientScale() ) #endif { QueryModifierBoxTree(vPos, boxIndices, TIMECYCLE_MAX_MODIFIER_BOX_QUERY, numBoxes); } // Apply Exterior modifier boxes, if required if (numBoxes > 0 && inInterior == false) { bool needLerp = false; float finalNaturalAmbientScale = 1.0f; float finalArtificialAmbientScale = 0.0f; fwPool* pPool = tcBox::GetPool(); Assert(pPool); for (s32 b=0; bGetSlot(boxIndices[b]); Assert(pBox); float strengthMult = pBox? pBox->CalcStrengthMult(vPos, hours, minutes, seconds) : 0.0f; if (strengthMult > 0.0f) { float boxStrength = pBox->GetStrength(); int n = pBox->GetIndex(); const tcModifier *mod = GetModifier(n); needLerp |= mod->GetUserFlag(tcflag_interpolateAmbient); if( !mod->GetUserFlag(tcflag_interpolateAmbient) && !mod->GetUserFlag(tcflag_interioronly) && mod->GetUserFlag(tcflag_underwateronly) == isUnderWater) { // return the modifier ambient scale bool validNat = false; bool validArt = false; Vec2V result = GetModifierAmbientScale(mod, validNat, validArt); strengthMult *= boxStrength; const float invStrengthMult = 1.0f - strengthMult; if( validNat ) { const float natural = (naturalAmbientScale * invStrengthMult) + result.GetXf() * strengthMult; finalNaturalAmbientScale = (natural < finalNaturalAmbientScale) ? natural : finalNaturalAmbientScale; } if( validArt ) { const float artificial = (artificialAmbientScale * invStrengthMult) + result.GetYf() * strengthMult; finalArtificialAmbientScale = (artificial > finalArtificialAmbientScale) ? artificial : finalArtificialAmbientScale; } } } } spdSphere tempSphere(vPos, ScalarV(0.1f)); tcInstBoxSearchResult* rawTcInstBoxSearchResult = Alloca(tcInstBoxSearchResult, TCINSTBOX_MAX_SEARCH_RESULTS); atUserArray tcInstBoxSearchResults(rawTcInstBoxSearchResult, TCINSTBOX_MAX_SEARCH_RESULTS); g_tcInstBoxMgr.Search( spdAABB(tempSphere), tcInstBoxSearchResults); for (s32 i=0; i 0.0f) { float boxStrength = result.m_pType->GetPercentage(); if( !isUnderWater) { // return the modifier ambient scale bool validNat = result.m_pType->GetIsValidNaturalAmbient(); bool validArt = result.m_pType->GetIsValidArtificialAmbient(); float natAmb = result.m_pType->GetNaturalAmbient(); float artAmb = result.m_pType->GetArtificialAmbient(); strengthMult *= boxStrength; const float invStrengthMult = 1.0f - strengthMult; if( validNat ) { const float natural = (naturalAmbientScale * invStrengthMult) + natAmb * strengthMult; finalNaturalAmbientScale = (natural < finalNaturalAmbientScale) ? natural : finalNaturalAmbientScale; } if( validArt ) { const float artificial = (artificialAmbientScale * invStrengthMult) + artAmb * strengthMult; finalArtificialAmbientScale = (artificial > finalArtificialAmbientScale) ? artificial : finalArtificialAmbientScale; } } } } if( needLerp ) { for (s32 b=0; bGetSlot(boxIndices[b]); Assert(pBox); float strengthMult = pBox ? pBox->CalcStrengthMult(vPos, hours, minutes, seconds) : 0.0f; if (strengthMult > 0.0f) { float boxStrength = pBox->GetStrength(); int n = pBox->GetIndex(); const tcModifier *mod = GetModifier(n); if( mod->GetUserFlag(tcflag_interpolateAmbient) && !mod->GetUserFlag(tcflag_interioronly) && mod->GetUserFlag(tcflag_underwateronly) == isUnderWater) { // return the modifier ambient scale bool validNat = false; bool validArt = false; Vec2V result = GetModifierAmbientScale(mod, validNat, validArt); strengthMult *= boxStrength; if( validNat ) { const float natural = result.GetXf(); finalNaturalAmbientScale = Lerp(strengthMult, finalNaturalAmbientScale, natural); } if( validArt ) { const float artificial = result.GetYf(); finalArtificialAmbientScale = Lerp(strengthMult, finalArtificialAmbientScale, artificial); } } } } } naturalAmbientScale = finalNaturalAmbientScale; artificialAmbientScale = finalArtificialAmbientScale; } #if TC_DEBUG if( m_gameDebug.GetDisableIntModifierAmbientScale() == false ) #endif { if (inInterior) { Vec3V basePortalAmbientScales; Vec3V bleedPortalAmbientScales; CPortal::CalcAmbientScale(vPos, basePortalAmbientScales, bleedPortalAmbientScales, intLoc); // apply base modifier const float bleeding = bleedPortalAmbientScales.GetZf(); if( bleeding > -1.0f ) { // Apply bleeding modifier const float bleedDelta = Clamp(bleeding,0.0f,1.0f); const float bleedPortalAmbient = bleedPortalAmbientScales.GetXf(); const float bleedPortalArtificialAmbient = bleedPortalAmbientScales.GetYf(); naturalAmbientScale = Lerp(bleedDelta, bleedPortalAmbient, naturalAmbientScale); artificialAmbientScale = bleedPortalArtificialAmbient; } else { // the blendout is additive accross all portals, so can get out of range const float baseDelta = Clamp(basePortalAmbientScales.GetZf(),0.0f,1.0f); const float basePortalNaturalAmbient = basePortalAmbientScales.GetXf(); const float basePortalArtificialAmbient = basePortalAmbientScales.GetYf(); naturalAmbientScale = Lerp(baseDelta, basePortalNaturalAmbient, naturalAmbientScale); artificialAmbientScale = Lerp(baseDelta, basePortalArtificialAmbient, artificialAmbientScale); } // Apply interior modifiers // Notice that it's not using a weird pushUp/pushDown but a more classic lerp. if (numBoxes > 0) { float finalNaturalAmbientScale = naturalAmbientScale; float finalArtificialAmbientScale = artificialAmbientScale; fwPool* pPool = tcBox::GetPool(); Assert(pPool); for (s32 b=0; bGetSlot(boxIndices[b]); Assert(pBox); float strengthMult = pBox ? pBox->CalcStrengthMult(vPos, hours, minutes, seconds) : 0.0f; if (strengthMult > 0.0f) { float boxStrength = pBox->GetStrength(); int n = pBox->GetIndex(); const tcModifier *mod = GetModifier(n); if( mod->GetUserFlag(tcflag_interioronly) && mod->GetUserFlag(tcflag_underwateronly) == isUnderWater ) { bool validNat = false; bool validArt = false; Vec2V result = GetModifierAmbientScale(mod, validNat, validArt); strengthMult *= boxStrength; if( validNat ) { finalNaturalAmbientScale = Lerp(strengthMult, finalNaturalAmbientScale, result.GetXf()); } if( validArt ) { finalArtificialAmbientScale = Lerp(strengthMult, finalArtificialAmbientScale, result.GetYf()); } } } } naturalAmbientScale = finalNaturalAmbientScale; artificialAmbientScale = finalArtificialAmbientScale; } } else { for(int i=0;iIsPaused() ); float doorOcclusion = cutScenePlaying ? 1.0f : m_frameInfo.m_LocalPortalCache[i].GetDoorOcclusion(); float natAmb = 1.0f; float artAmb = 0.0f; bool expand = CalcModifierAmbientScale(mainModIdx, secondaryModIdx, 1.0f, natAmb, artAmb ASSERT_ONLY(, mainModIdx != -1 ? GetModifierName(mainModIdx) : "N/A", secondaryModIdx != -1 ? GetModifierName(secondaryModIdx) : "N/A")); float blend = expand ? m_frameInfo.m_LocalPortalCache[i].GetCorners().CalcExpandedAmbientScaleFeather(vPos) : m_frameInfo.m_LocalPortalCache[i].GetCorners().CalcAmbientScaleFeather(vPos); // Blend in artifical ambient scale artificialAmbientScale = Lerp(blend*doorOcclusion, artificialAmbientScale, artAmb); } } } #if TC_DEBUG if( m_debug.GetModifierEditApply() ) { s32 editModId = m_debug.GetModifierEditId(); float strength = m_debug.GetModifierEditStrength(); const float invStrength = 1.0f - strength; const tcModifier *mod = GetModifier(editModId); bool validNat = false; bool validArt = false; Vec2V result = GetModifierAmbientScale(mod, validNat, validArt); if( validNat ) { const float natural = (naturalAmbientScale * invStrength) + result.GetXf() * strength; naturalAmbientScale = natural; } if( validArt ) { const float artificial = (artificialAmbientScale * invStrength) + result.GetYf() * strength; artificialAmbientScale = artificial; } } #endif if( CRenderer::GetDisableArtificialLights() ) { artificialAmbientScale = CShaderLib::GetOverridesArtAmbScale(); } return Vec2V(naturalAmbientScale, artificialAmbientScale); } /////////////////////////////////////////////////////////////////////////////// // GetSkySettings /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::GetSkySettings (CSkySettings* pSkySettings) { Assert(sysThreadType::IsRenderThread()); #define GET_COL(COL) Vec3V(currKeyframe.GetVar(COL##_R), currKeyframe.GetVar(COL##_G), currKeyframe.GetVar(COL##_B)) #define GET_FLOAT(COL) float(currKeyframe.GetVar(COL)) const tcKeyframeUncompressed& currKeyframe = GetCurrRenderKeyframe(); // Sky colouring pSkySettings->m_azimuthEastColor.m_value = GET_COL(TCVAR_SKY_AZIMUTH_EAST_COL); pSkySettings->m_azimuthEastColorIntensity = GET_FLOAT(TCVAR_SKY_AZIMUTH_EAST_COL_INTEN); pSkySettings->m_azimuthWestColor.m_value = GET_COL(TCVAR_SKY_AZIMUTH_WEST_COL); pSkySettings->m_azimuthWestColorIntensity = GET_FLOAT(TCVAR_SKY_AZIMUTH_WEST_COL_INTEN); pSkySettings->m_azimuthTransitionColor.m_value = GET_COL(TCVAR_SKY_AZIMUTH_TRANSITION_COL); pSkySettings->m_azimuthTransitionColorIntensity = GET_FLOAT(TCVAR_SKY_AZIMUTH_TRANSITION_COL_INTEN); pSkySettings->m_azimuthTransitionPosition.m_value = GET_FLOAT(TCVAR_SKY_AZIMUTH_TRANSITION_POSITION); pSkySettings->m_zenithColor.m_value = GET_COL(TCVAR_SKY_ZENITH_COL); pSkySettings->m_zenithColorIntensity = GET_FLOAT(TCVAR_SKY_ZENITH_COL_INTEN); pSkySettings->m_zenithTransitionColor.m_value = GET_COL(TCVAR_SKY_ZENITH_TRANSITION_COL); pSkySettings->m_zenithTransitionColorIntensity = GET_FLOAT(TCVAR_SKY_ZENITH_TRANSITION_COL_INTEN); pSkySettings->m_zenithTransitionPosition = GET_FLOAT(TCVAR_SKY_ZENITH_TRANSITION_POSITION); pSkySettings->m_zenithTransitionEastBlend = GET_FLOAT(TCVAR_SKY_ZENITH_TRANSITION_EAST_BLEND); pSkySettings->m_zenithTransitionWestBlend = GET_FLOAT(TCVAR_SKY_ZENITH_TRANSITION_WEST_BLEND); pSkySettings->m_zenithBlendStart = GET_FLOAT(TCVAR_SKY_ZENITH_BLEND_START); pSkySettings->m_hdrIntensity.m_value = GET_FLOAT(TCVAR_SKY_HDR); float lastLum = pSkySettings->m_skyPlaneColor.m_value.GetWf(); pSkySettings->m_skyPlaneColor.m_value = Vec4V(GET_COL(TCVAR_SKY_PLANE_COL)); float lum = PostFX::GetRenderLuminance(); if (!FPIsFinite(lum)) lum = lastLum; // reuse last lum value, in the new one is invalid BANK_ONLY(lum = (camInterface::GetDebugDirector().IsFreeCamActive()) ? 0.01f : lum); pSkySettings->m_skyPlaneColor.m_value.SetW(GET_FLOAT(TCVAR_SKY_PLANE_INTEN) * lum); // Sun variables pSkySettings->m_sunColor.m_value = (GetLightningOverrideRender()?GetLightningColorRender().GetRGB():GET_COL(TCVAR_SKY_SUN_COL)); pSkySettings->m_sunDiscColor = GET_COL(TCVAR_SKY_SUN_DISC_COL); pSkySettings->m_sunDiscSize = GET_FLOAT(TCVAR_SKY_SUN_DISC_SIZE); pSkySettings->m_sunHdrIntensity = GET_FLOAT(TCVAR_SKY_SUN_HDR); pSkySettings->m_reflectionHdrIntensityMult = GET_FLOAT(TCVAR_REFLECTION_HDR_MULT); pSkySettings->m_miePhase = GET_FLOAT(TCVAR_SKY_SUN_MIEPHASE); pSkySettings->m_mieScatter = GET_FLOAT(TCVAR_SKY_SUN_MIESCATTER); pSkySettings->m_mieIntensityMult = GET_FLOAT(TCVAR_SKY_SUN_MIE_INTENSITY_MULT); pSkySettings->m_sunInfluenceRadius = GET_FLOAT(TCVAR_SKY_SUN_INFLUENCE_RADIUS); pSkySettings->m_sunScatterIntensity = GET_FLOAT(TCVAR_SKY_SUN_SCATTER_INTEN); // Stars / Moon pSkySettings->m_moonColor.m_value = (GetLightningOverrideRender()?GetLightningColorRender().GetRGB():GET_COL(TCVAR_SKY_MOON_COL)); pSkySettings->m_moonDiscSize = GET_FLOAT(TCVAR_SKY_MOON_DISC_SIZE); pSkySettings->m_moonIntensity.m_value = GET_FLOAT(TCVAR_SKY_MOON_ITEN); pSkySettings->m_starfieldIntensity.m_value = GET_FLOAT(TCVAR_SKY_STARS_ITEN); pSkySettings->m_moonInfluenceRadius = GET_FLOAT(TCVAR_SKY_MOON_INFLUENCE_RADIUS); pSkySettings->m_moonScatterIntensity = GET_FLOAT(TCVAR_SKY_MOON_SCATTER_INTEN); // Cloud variables pSkySettings->m_vCloudBaseColour = GET_COL(TCVAR_SKY_CLOUD_BASE_COL); pSkySettings->m_cloudFadeOut = GET_FLOAT(TCVAR_SKY_CLOUD_FADEOUT); pSkySettings->m_cloudHdrIntensity = GET_FLOAT(TCVAR_SKY_CLOUD_HDR); pSkySettings->m_cloudShadowStrength = GET_FLOAT(TCVAR_SKY_CLOUD_SHADOW_STRENGTH); pSkySettings->m_cloudOffset = GET_FLOAT(TCVAR_SKY_CLOUD_OFFSET); pSkySettings->m_vCloudShadowColour = GET_COL(TCVAR_SKY_CLOUD_SHADOW_COL); pSkySettings->m_cloudMidColour.m_value = GET_COL(TCVAR_SKY_CLOUD_MID_COL); pSkySettings->m_cloudBaseStrength = GET_FLOAT(TCVAR_SKY_CLOUD_BASE_STRENGTH); pSkySettings->m_cloudDensityMultiplier = GET_FLOAT(TCVAR_SKY_CLOUD_DENSITY_MULT); pSkySettings->m_cloudDensityBias = GET_FLOAT(TCVAR_SKY_CLOUD_DENSITY_BIAS); pSkySettings->m_cloudEdgeDetailStrength = GET_FLOAT(TCVAR_SKY_CLOUD_EDGE_STRENGTH); pSkySettings->m_cloudOverallDetailStrength = GET_FLOAT(TCVAR_SKY_CLOUD_OVERALL_STRENGTH); pSkySettings->m_cloudOverallDetailColor = GET_FLOAT(TCVAR_SKY_CLOUD_OVERALL_COLOR); pSkySettings->m_cloudDitherStrength = GET_FLOAT(TCVAR_SKY_CLOUD_DITHER_STRENGTH); pSkySettings->m_vSmallCloudColor = GET_COL(TCVAR_SKY_SMALL_CLOUD_COL); pSkySettings->m_smallCloudDetailStrength = GET_FLOAT(TCVAR_SKY_SMALL_CLOUD_DETAIL_STRENGTH); pSkySettings->m_smallCloudDetailScale = GET_FLOAT(TCVAR_SKY_SMALL_CLOUD_DETAIL_SCALE); pSkySettings->m_smallCloudDensityMultiplier = GET_FLOAT(TCVAR_SKY_SMALL_CLOUD_DENSITY_MULT); pSkySettings->m_smallCloudDensityBias = GET_FLOAT(TCVAR_SKY_SMALL_CLOUD_DENSITY_BIAS); pSkySettings->m_lightningDirection = GetLightningDirectionRender(); pSkySettings->m_sunDirection = m_currFrameInfo->m_vSunSpriteDir; pSkySettings->m_moonDirection = m_currFrameInfo->m_vMoonSpriteDir; } /////////////////////////////////////////////////////////////////////////////// // GetMinimalSkySettings /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::GetMinimalSkySettings (CSkySettings* pSkySettings) { Assert(sysThreadType::IsRenderThread()); pSkySettings->m_lightningDirection = GetLightningDirectionRender(); pSkySettings->m_sunDirection = m_currFrameInfo->m_vSunSpriteDir; pSkySettings->m_moonDirection = m_currFrameInfo->m_vMoonSpriteDir; } /////////////////////////////////////////////////////////////////////////////// // GetNoiseSkySettings /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::GetNoiseSkySettings (CSkySettings* pSkySettings) { tcKeyframeUncompressed& currKeyframe = m_currFrameInfo->m_keyframe; pSkySettings->m_noiseFrequency.m_value = GET_FLOAT(TCVAR_SKY_CLOUD_GEN_FREQUENCY); pSkySettings->m_noiseScale.m_value = GET_FLOAT(TCVAR_SKY_CLOUD_GEN_SCALE); pSkySettings->m_noiseThreshold.m_value = GET_FLOAT(TCVAR_SKY_CLOUD_GEN_THRESHOLD); pSkySettings->m_noiseSoftness.m_value = GET_FLOAT(TCVAR_SKY_CLOUD_GEN_SOFTNESS); pSkySettings->m_noiseDensityOffset.m_value = GET_FLOAT(TCVAR_SKY_CLOUD_GEN_DENSITY_OFFSET); } /////////////////////////////////////////////////////////////////////////////// // SetupRenderThreadFrameInfo /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::SetupRenderThreadFrameInfo() { DLC(dlCmdSetupTimeCycleFrameInfo, ()); } /////////////////////////////////////////////////////////////////////////////// // ClearRenderFrameInfo /////////////////////////////////////////////////////////////////////////////// void CTimeCycle::ClearRenderFrameInfo() { DLC(dlCmdClearTimeCycleFrameInfo, ()); } /////////////////////////////////////////////////////////////////////////////// // CalculateDayNightBalance /////////////////////////////////////////////////////////////////////////////// float CTimeCycle::CalculateDayNightBalance() const { // 0.0 = full day // 1.0 = full night const u32 emissiveOn = (u32)g_visualSettings.Get("emissive.night.start.time", 20.0f); const u32 emissiveOff = (u32)g_visualSettings.Get("emissive.night.end.time", 7.0f); const u32 emissiveOnToMidnight = 24 - emissiveOn; u32 timeFlags = 0; for (int i = 0; i < emissiveOnToMidnight + emissiveOff; i++) { timeFlags |= (1 << ((i + emissiveOn) % 24)); } const u32 hour = CClock::GetHour(); const u32 nextHour = (CClock::GetHour() + 1) % 24; const float fade = (float)CClock::GetMinute() + ((float)CClock::GetSecond() / 60.0f); // Night emissives about to turn on if ((timeFlags & (1 << hour)) == 0 && (timeFlags & (1 << (nextHour))) != 0) { return Saturate(fade / 60.0f); } // Night emissive about to turn off if ((timeFlags & (1 << hour)) != 0 && (timeFlags & (1 << (nextHour))) == 0) { return 1.0f - Saturate(fade / 60.0f); } // They are on, keep them on if (timeFlags & (1 << hour)) { return 1.0f; } return 0.0f; } #if GTA_REPLAY // Returns number of keys added u32 CTimeCycle::GetTimeCycleKeyframeData(TCNameAndValue *pData, bool getDefaultData) { u32 storedCount = 0; for(int i=0;iGetProxy(); if(pProxy) { u32 proxyHash = pProxy->GetNameHash(); int count = sizeof(m_InteriorReplayLookupTable) / sizeof(EffectTableEntry); for( int i = 0; i < count; ++i) { if( m_InteriorReplayLookupTable[i] == proxyHash ) { shouldApplyMod = true; } } } } if( CReplayMgr::IsEditModeActive() ) { bool bgameCameraActive = camInterface::GetReplayDirector().IsRecordedCamera(); if( bgameCameraActive && !m_bUsingDefaultTCData ) { shouldApplyMod = false; } } return shouldApplyMod; } bool CTimeCycle::ShouldDisableScripFxForFreeCam(u32 scriptFx, u32 transistionFx) const { // If we're disabled for game cam, then we should also be for free cam. if( ShouldDisableScripFxForGameCam(scriptFx, transistionFx ) ) { return true; } int count = sizeof(m_ScriptEffectFreeCamRemovalReplayLookupTable) / sizeof(EffectTableEntry); for(int i = 0; i < count; ++i) { if( m_ScriptEffectFreeCamRemovalReplayLookupTable[i] == scriptFx || m_ScriptEffectFreeCamRemovalReplayLookupTable[i] == transistionFx ) { return true; } } return false; } bool CTimeCycle::ShouldDisableScripFxForGameCam(u32 scriptFx, u32 transistionFx) const { int count = sizeof(m_ScriptEffectAllCamsRemovalReplayLookupTable) / sizeof(EffectTableEntry); for(int i = 0; i < count; ++i) { if( m_ScriptEffectAllCamsRemovalReplayLookupTable[i] == scriptFx || m_ScriptEffectAllCamsRemovalReplayLookupTable[i] == transistionFx ) { return true; } } return false; } bool CTimeCycle::ShouldUseReplayTCData() { if( CReplayMgr::IsEditModeActive() ) { // We're in replay, use recorded data return true; } return false; // Not in replay, don't use data } #endif //GTA_REPLAY